summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAbhilash Raj2014-09-13 22:48:48 +0530
committerAbhilash Raj2014-09-13 22:48:48 +0530
commitf8212e1d9d32f29039b620d8805f1a53f579dd34 (patch)
treee76202f651694fa333d9acf2d8531094851c81c0 /src
parenta9b38e7643ac7dd8d526af22a6e3e9ea73933f59 (diff)
downloadmailman-f8212e1d9d32f29039b620d8805f1a53f579dd34.tar.gz
mailman-f8212e1d9d32f29039b620d8805f1a53f579dd34.tar.zst
mailman-f8212e1d9d32f29039b620d8805f1a53f579dd34.zip
Diffstat (limited to 'src')
-rw-r--r--src/mailman/app/subscriptions.py11
-rw-r--r--src/mailman/database/types.py6
-rw-r--r--src/mailman/model/address.py2
-rw-r--r--src/mailman/model/autorespond.py4
-rw-r--r--src/mailman/model/bans.py2
-rw-r--r--src/mailman/model/bounce.py2
-rw-r--r--src/mailman/model/domain.py3
-rw-r--r--src/mailman/model/listmanager.py2
-rw-r--r--src/mailman/model/mailinglist.py135
-rw-r--r--src/mailman/model/member.py8
-rw-r--r--src/mailman/model/message.py4
-rw-r--r--src/mailman/model/messagestore.py8
-rw-r--r--src/mailman/model/pending.py25
-rw-r--r--src/mailman/model/requests.py21
-rw-r--r--src/mailman/model/roster.py11
-rw-r--r--src/mailman/model/user.py5
16 files changed, 123 insertions, 126 deletions
diff --git a/src/mailman/app/subscriptions.py b/src/mailman/app/subscriptions.py
index d24a9a545..a53d22e72 100644
--- a/src/mailman/app/subscriptions.py
+++ b/src/mailman/app/subscriptions.py
@@ -28,7 +28,7 @@ __all__ = [
from operator import attrgetter
from passlib.utils import generate_password as generate
-#from storm.expr import And, Or
+from sqlalchemy import and_, or_
from uuid import UUID
from zope.component import getUtility
from zope.interface import implementer
@@ -88,8 +88,7 @@ class SubscriptionService:
@dbconnection
def get_member(self, store, member_id):
"""See `ISubscriptionService`."""
- members = store.find(
- Member,
+ members = store.query(Member).filter(
Member._member_id == member_id)
if members.count() == 0:
return None
@@ -117,7 +116,7 @@ class SubscriptionService:
# This probably could be made more efficient.
if address is None or user is None:
return []
- query.append(Or(Member.address_id == address.id,
+ query.append(or_(Member.address_id == address.id,
Member.user_id == user.id))
else:
# subscriber is a user id.
@@ -126,7 +125,7 @@ class SubscriptionService:
if address.id is not None)
if len(address_ids) == 0 or user is None:
return []
- query.append(Or(Member.user_id == user.id,
+ query.append(or_(Member.user_id == user.id,
Member.address_id.is_in(address_ids)))
# Calculate the rest of the query expression, which will get And'd
# with the Or clause above (if there is one).
@@ -134,7 +133,7 @@ class SubscriptionService:
query.append(Member.list_id == list_id)
if role is not None:
query.append(Member.role == role)
- results = store.find(Member, And(*query))
+ results = store.query(Member).filter(and_(*query))
return sorted(results, key=_membership_sort_key)
def __iter__(self):
diff --git a/src/mailman/database/types.py b/src/mailman/database/types.py
index 045065591..81721781d 100644
--- a/src/mailman/database/types.py
+++ b/src/mailman/database/types.py
@@ -47,13 +47,17 @@ class Enum(TypeDecorator):
TypeDecorator.__init__(self, *args, **kw)
def process_bind_param(self, value, dialect):
+ if value is None:
+ return None
if not isinstance(value, self.enum):
raise ValueError("{} must be a value of the {} enum".format(
- self.value, self.enum.__name__))
+ value, self.enum.__name__))
return value.value
def process_result_value(self, value, dialect):
+ if value is None:
+ return None
return self.enum(value)
diff --git a/src/mailman/model/address.py b/src/mailman/model/address.py
index 59d54aab0..7203a31a5 100644
--- a/src/mailman/model/address.py
+++ b/src/mailman/model/address.py
@@ -56,7 +56,7 @@ class Address(Model):
user_id = Column(Integer, ForeignKey('user.id'))
preferences_id = Column(Integer, ForeignKey('preferences.id'))
- prefereces = relationship('Preferences',
+ preferences = relationship('Preferences',
backref=backref('Address', uselist=False))
def __init__(self, email, display_name):
diff --git a/src/mailman/model/autorespond.py b/src/mailman/model/autorespond.py
index 47f15cd54..17fe5fadc 100644
--- a/src/mailman/model/autorespond.py
+++ b/src/mailman/model/autorespond.py
@@ -75,7 +75,7 @@ class AutoResponseSet:
@dbconnection
def todays_count(self, store, address, response_type):
"""See `IAutoResponseSet`."""
- return store.find(AutoResponseRecord).filter_by(
+ return store.query(AutoResponseRecord).filter_by(
address = address,
mailing_list = self._mailing_list,
response_type = response_type,
@@ -91,7 +91,7 @@ class AutoResponseSet:
@dbconnection
def last_response(self, store, address, response_type):
"""See `IAutoResponseSet`."""
- results = store.find(AutoResponseRecord).filter_by(
+ results = store.query(AutoResponseRecord).filter_by(
address = address,
mailing_list = self._mailing_list,
response_type = response_type
diff --git a/src/mailman/model/bans.py b/src/mailman/model/bans.py
index bf02f3127..d0f3b2519 100644
--- a/src/mailman/model/bans.py
+++ b/src/mailman/model/bans.py
@@ -103,7 +103,7 @@ class BanManager:
if bans.count() > 0:
return True
# Now try specific mailing list bans, but with a pattern.
- bans = store.query(Ban).filteR_by(list_id=list_id)
+ bans = store.query(Ban).filter_by(list_id=list_id)
for ban in bans:
if (ban.email.startswith('^') and
re.match(ban.email, email, re.IGNORECASE) is not None):
diff --git a/src/mailman/model/bounce.py b/src/mailman/model/bounce.py
index 7340a4824..1165fee96 100644
--- a/src/mailman/model/bounce.py
+++ b/src/mailman/model/bounce.py
@@ -78,7 +78,7 @@ class BounceProcessor:
@dbconnection
def events(self, store):
"""See `IBounceProcessor`."""
- for event in store.find(BounceEvent):
+ for event in store.query(BounceEvent).all():
yield event
@property
diff --git a/src/mailman/model/domain.py b/src/mailman/model/domain.py
index 860107b15..585eccf3d 100644
--- a/src/mailman/model/domain.py
+++ b/src/mailman/model/domain.py
@@ -94,8 +94,7 @@ class Domain(Model):
@dbconnection
def mailing_lists(self, store):
"""See `IDomain`."""
- mailing_lists = store.find(
- MailingList,
+ mailing_lists = store.query(MailingList).filter(
MailingList.mail_host == self.mail_host)
for mlist in mailing_lists:
yield mlist
diff --git a/src/mailman/model/listmanager.py b/src/mailman/model/listmanager.py
index a67f7b5e1..1279de6cc 100644
--- a/src/mailman/model/listmanager.py
+++ b/src/mailman/model/listmanager.py
@@ -116,7 +116,7 @@ class ListManager:
@dbconnection
def name_components(self, store):
"""See `IListManager`."""
- result_set = store.query(MailingList).all()
+ result_set = store.query(MailingList)
for mail_host, list_name in result_set.values(MailingList.mail_host,
MailingList.list_name):
yield list_name, mail_host
diff --git a/src/mailman/model/mailinglist.py b/src/mailman/model/mailinglist.py
index b1997ef95..ed7ac5553 100644
--- a/src/mailman/model/mailinglist.py
+++ b/src/mailman/model/mailinglist.py
@@ -28,8 +28,8 @@ __all__ = [
import os
from sqlalchemy import (Column, Boolean, DateTime, Float, Integer, Unicode,
- PickleType, Interval, ForeignKey)
-from sqlalchemy.orm import relationship
+ PickleType, Interval, ForeignKey, LargeBinary)
+from sqlalchemy.orm import relationship, sessionmaker
from urlparse import urljoin
from zope.component import getUtility
from zope.event import notify
@@ -67,6 +67,8 @@ from mailman.utilities.string import expand
SPACE = ' '
UNDERSCORE = '_'
+Session = sessionmaker()
+
@implementer(IMailingList)
class MailingList(Model):
@@ -162,7 +164,7 @@ class MailingList(Model):
member_moderation_notice = Column(Unicode)
mime_is_default_digest = Column(Boolean)
# FIXME: There should be no moderator_password
- moderator_password = Column(Unicode) # TODO : was RawStr()
+ moderator_password = Column(LargeBinary) # TODO : was RawStr()
newsgroup_moderation = Column(Enum(enum=NewsgroupModeration))
nntp_prefix_subject_too = Column(Boolean)
nondigestable = Column(Boolean)
@@ -327,26 +329,24 @@ class MailingList(Model):
def send_one_last_digest_to(self, address, delivery_mode):
"""See `IMailingList`."""
digest = OneLastDigest(self, address, delivery_mode)
- Store.of(self).add(digest)
+ Session.object_session(self).add(digest)
@property
def last_digest_recipients(self):
"""See `IMailingList`."""
- results = Store.of(self).find(
- OneLastDigest,
+ results = Session.object_session(self).query(OneLastDigest).filter(
OneLastDigest.mailing_list == self)
recipients = [(digest.address, digest.delivery_mode)
for digest in results]
- results.remove()
+ results.delete()
return recipients
@property
def filter_types(self):
"""See `IMailingList`."""
- results = Store.of(self).find(
- ContentFilter,
- And(ContentFilter.mailing_list == self,
- ContentFilter.filter_type == FilterType.filter_mime))
+ results = Session.object_session(self).query(ContentFilter).filter(
+ ContentFilter.mailing_list == self,
+ ContentFilter.filter_type == FilterType.filter_mime)
for content_filter in results:
yield content_filter.filter_pattern
@@ -354,11 +354,11 @@ class MailingList(Model):
def filter_types(self, sequence):
"""See `IMailingList`."""
# First, delete all existing MIME type filter patterns.
- store = Store.of(self)
+ store = Session.object_session(self)
results = store.query(ContentFilter).filter(
ContentFilter.mailing_list == self,
ContentFilter.filter_type == FilterType.filter_mime)
- results.remove()
+ results.delete()
# Now add all the new filter types.
for mime_type in sequence:
content_filter = ContentFilter(
@@ -368,10 +368,9 @@ class MailingList(Model):
@property
def pass_types(self):
"""See `IMailingList`."""
- results = Store.of(self).find(
- ContentFilter,
- And(ContentFilter.mailing_list == self,
- ContentFilter.filter_type == FilterType.pass_mime))
+ results = Session.object_session(self).query(ContentFilter).filter(
+ ContentFilter.mailing_list == self,
+ ContentFilter.filter_type == FilterType.pass_mime)
for content_filter in results:
yield content_filter.filter_pattern
@@ -379,12 +378,11 @@ class MailingList(Model):
def pass_types(self, sequence):
"""See `IMailingList`."""
# First, delete all existing MIME type pass patterns.
- store = Store.of(self)
- results = store.find(
- ContentFilter,
- And(ContentFilter.mailing_list == self,
- ContentFilter.filter_type == FilterType.pass_mime))
- results.remove()
+ store = Session.object_session(self)
+ results = store.query(ContentFilter).filter(
+ ContentFilter.mailing_list == self,
+ ContentFilter.filter_type == FilterType.pass_mime)
+ results.delete()
# Now add all the new filter types.
for mime_type in sequence:
content_filter = ContentFilter(
@@ -394,10 +392,9 @@ class MailingList(Model):
@property
def filter_extensions(self):
"""See `IMailingList`."""
- results = Store.of(self).find(
- ContentFilter,
- And(ContentFilter.mailing_list == self,
- ContentFilter.filter_type == FilterType.filter_extension))
+ results = Session.object_session(self).query(ContentFilter).filter(
+ ContentFilter.mailing_list == self,
+ ContentFilter.filter_type == FilterType.filter_extension)
for content_filter in results:
yield content_filter.filter_pattern
@@ -405,12 +402,11 @@ class MailingList(Model):
def filter_extensions(self, sequence):
"""See `IMailingList`."""
# First, delete all existing file extensions filter patterns.
- store = Store.of(self)
- results = store.find(
- ContentFilter,
- And(ContentFilter.mailing_list == self,
- ContentFilter.filter_type == FilterType.filter_extension))
- results.remove()
+ store = Session.object_session(self)
+ results = store.query(ContentFilter).filter(
+ ContentFilter.mailing_list == self,
+ ContentFilter.filter_type == FilterType.filter_extension)
+ results.delete()
# Now add all the new filter types.
for mime_type in sequence:
content_filter = ContentFilter(
@@ -420,10 +416,9 @@ class MailingList(Model):
@property
def pass_extensions(self):
"""See `IMailingList`."""
- results = Store.of(self).find(
- ContentFilter,
- And(ContentFilter.mailing_list == self,
- ContentFilter.filter_type == FilterType.pass_extension))
+ results = Session.object_session(self).query(ContentFilter).filter(
+ ContentFilter.mailing_list == self,
+ ContentFilter.filter_type == FilterType.pass_extension)
for content_filter in results:
yield content_filter.pass_pattern
@@ -431,12 +426,11 @@ class MailingList(Model):
def pass_extensions(self, sequence):
"""See `IMailingList`."""
# First, delete all existing file extensions pass patterns.
- store = Store.of(self)
- results = store.find(
- ContentFilter,
- And(ContentFilter.mailing_list == self,
- ContentFilter.filter_type == FilterType.pass_extension))
- results.remove()
+ store = Session.object_session(self)
+ results = store.query(ContentFilter).filter(
+ ContentFilter.mailing_list == self,
+ ContentFilter.filter_type == FilterType.pass_extension)
+ results.delete()
# Now add all the new filter types.
for mime_type in sequence:
content_filter = ContentFilter(
@@ -457,24 +451,22 @@ class MailingList(Model):
def subscribe(self, subscriber, role=MemberRole.member):
"""See `IMailingList`."""
- store = Store.of(self)
+ store = Session.object_session(self)
if IAddress.providedBy(subscriber):
- member = store.find(
- Member,
+ member = store.query(Member).filter(
Member.role == role,
Member.list_id == self._list_id,
- Member._address == subscriber).one()
+ Member._address == subscriber).first()
if member:
raise AlreadySubscribedError(
self.fqdn_listname, subscriber.email, role)
elif IUser.providedBy(subscriber):
if subscriber.preferred_address is None:
raise MissingPreferredAddressError(subscriber)
- member = store.find(
- Member,
+ member = store.query(Member).filter(
Member.role == role,
Member.list_id == self._list_id,
- Member._user == subscriber).one()
+ Member._user == subscriber).first()
if member:
raise AlreadySubscribedError(
self.fqdn_listname, subscriber, role)
@@ -518,27 +510,27 @@ class AcceptableAliasSet:
def clear(self):
"""See `IAcceptableAliasSet`."""
- Store.of(self._mailing_list).find(
- AcceptableAlias,
- AcceptableAlias.mailing_list == self._mailing_list).remove()
+ Session.object_session(self._mailing_list).query(
+ AcceptableAlias).filter(
+ AcceptableAlias.mailing_list == self._mailing_list).delete()
def add(self, alias):
if not (alias.startswith('^') or '@' in alias):
raise ValueError(alias)
alias = AcceptableAlias(self._mailing_list, alias.lower())
- Store.of(self._mailing_list).add(alias)
+ Session.object_session(self._mailing_list).add(alias)
def remove(self, alias):
- Store.of(self._mailing_list).find(
- AcceptableAlias,
- And(AcceptableAlias.mailing_list == self._mailing_list,
- AcceptableAlias.alias == alias.lower())).remove()
+ Session.object_session(self._mailing_list).query(
+ AcceptableAlias).filter(
+ AcceptableAlias.mailing_list == self._mailing_list,
+ AcceptableAlias.alias == alias.lower()).delete()
@property
def aliases(self):
- aliases = Store.of(self._mailing_list).find(
- AcceptableAlias,
- AcceptableAlias.mailing_list == self._mailing_list)
+ aliases = Session.object_session(self._mailing_list).query(
+ AcceptableAlias).filter(
+ AcceptableAlias.mailing_list == self._mailing_list)
for alias in aliases:
yield alias.alias
@@ -587,25 +579,24 @@ class ListArchiverSet:
system_archivers[archiver.name] = archiver
# Add any system enabled archivers which aren't already associated
# with the mailing list.
- store = Store.of(self._mailing_list)
+ store = Session.object_session(self._mailing_list)
for archiver_name in system_archivers:
- exists = store.find(
- ListArchiver,
- And(ListArchiver.mailing_list == mailing_list,
- ListArchiver.name == archiver_name)).one()
+ exists = store.query(ListArchiver).filter(
+ ListArchiver.mailing_list == mailing_list,
+ ListArchiver.name == archiver_name).first()
if exists is None:
store.add(ListArchiver(mailing_list, archiver_name,
system_archivers[archiver_name]))
@property
def archivers(self):
- entries = Store.of(self._mailing_list).find(
- ListArchiver, ListArchiver.mailing_list == self._mailing_list)
+ entries = Session.object_session(self._mailing_list).query(
+ ListArchiver).filter(ListArchiver.mailing_list == self._mailing_list)
for entry in entries:
yield entry
def get(self, archiver_name):
- return Store.of(self._mailing_list).find(
- ListArchiver,
- And(ListArchiver.mailing_list == self._mailing_list,
- ListArchiver.name == archiver_name)).one()
+ return Session.object_session(self._mailing_list).query(
+ ListArchiver).filter(
+ ListArchiver.mailing_list == self._mailing_list,
+ ListArchiver.name == archiver_name).first()
diff --git a/src/mailman/model/member.py b/src/mailman/model/member.py
index 739e35484..f1007c311 100644
--- a/src/mailman/model/member.py
+++ b/src/mailman/model/member.py
@@ -25,6 +25,7 @@ __all__ = [
]
from sqlalchemy import Integer, Unicode, ForeignKey, Column
+from sqlalchemy.orm import relationship
from zope.component import getUtility
from zope.event import notify
from zope.interface import implementer
@@ -60,8 +61,11 @@ class Member(Model):
moderation_action = Column(Enum(enum=Action))
address_id = Column(Integer, ForeignKey('address.id'))
+ _address = relationship('Address')
preferences_id = Column(Integer, ForeignKey('preferences.id'))
+ preferences = relationship('Preferences')
user_id = Column(Integer, ForeignKey('user.id'))
+ _user = relationship('User')
def __init__(self, role, list_id, subscriber):
self._member_id = uid_factory.new_uid()
@@ -196,5 +200,5 @@ class Member(Model):
"""See `IMember`."""
# Yes, this must get triggered before self is deleted.
notify(UnsubscriptionEvent(self.mailing_list, self))
- store.remove(self.preferences)
- store.remove(self)
+ store.delete(self.preferences)
+ store.delete(self)
diff --git a/src/mailman/model/message.py b/src/mailman/model/message.py
index 9d7623d09..b153d4909 100644
--- a/src/mailman/model/message.py
+++ b/src/mailman/model/message.py
@@ -24,7 +24,7 @@ __all__ = [
'Message',
]
-from sqlalchemy import Column, Integer, Unicode
+from sqlalchemy import Column, Integer, Unicode, LargeBinary
from zope.interface import implementer
from mailman.database.model import Model
@@ -42,7 +42,7 @@ class Message(Model):
id = Column(Integer, primary_key=True)
message_id = Column(Unicode)
message_id_hash = Column(Unicode)
- path = Column(Unicode) # TODO : was RawStr()
+ path = Column(LargeBinary) # TODO : was RawStr()
# This is a Messge-ID field representation, not a database row id.
@dbconnection
diff --git a/src/mailman/model/messagestore.py b/src/mailman/model/messagestore.py
index 69860a6a1..f9f224dd6 100644
--- a/src/mailman/model/messagestore.py
+++ b/src/mailman/model/messagestore.py
@@ -59,7 +59,7 @@ class MessageStore:
# Calculate and insert the X-Message-ID-Hash.
message_id = message_ids[0]
# Complain if the Message-ID already exists in the storage.
- existing = store.find(Message, Message.message_id == message_id).one()
+ existing = store.query(Message).filter(Message.message_id == message_id).first()
if existing is not None:
raise ValueError(
'Message ID already exists in message store: {0}'.format(
@@ -107,7 +107,7 @@ class MessageStore:
@dbconnection
def get_message_by_id(self, store, message_id):
- row = store.find(Message, message_id=message_id).one()
+ row = store.query(Message).filter_by(message_id=message_id).first()
if row is None:
return None
return self._get_message(row)
@@ -120,7 +120,7 @@ class MessageStore:
# US-ASCII.
if isinstance(message_id_hash, unicode):
message_id_hash = message_id_hash.encode('ascii')
- row = store.find(Message, message_id_hash=message_id_hash).one()
+ row = store.query(Message).filter_by(message_id_hash=message_id_hash).first()
if row is None:
return None
return self._get_message(row)
@@ -133,7 +133,7 @@ class MessageStore:
@dbconnection
def delete_message(self, store, message_id):
- row = store.query(Message).filter_by(message_id=message_id).one()
+ row = store.query(Message).filter_by(message_id=message_id).first()
if row is None:
raise LookupError(message_id)
path = os.path.join(config.MESSAGES_DIR, row.path)
diff --git a/src/mailman/model/pending.py b/src/mailman/model/pending.py
index 0c41a4ac6..30aae074c 100644
--- a/src/mailman/model/pending.py
+++ b/src/mailman/model/pending.py
@@ -31,7 +31,8 @@ import random
import hashlib
from lazr.config import as_timedelta
-from sqlalchemy import Column, Integer, Unicode, ForeignKey, DateTime
+from sqlalchemy import (
+ Column, Integer, Unicode, ForeignKey, DateTime, LargeBinary)
from sqlalchemy.orm import relationship
from zope.interface import implementer
from zope.interface.verify import verifyObject
@@ -75,7 +76,7 @@ class Pended(Model):
self.expiration_date = expiration_date
id = Column(Integer, primary_key=True)
- token = Column(Unicode) # TODO : was RawStr()
+ token = Column(LargeBinary) # TODO : was RawStr()
expiration_date = Column(DateTime)
key_values = relationship('PendedKeyValue')
@@ -109,7 +110,7 @@ class Pendings:
token = hashlib.sha1(repr(x)).hexdigest()
# In practice, we'll never get a duplicate, but we'll be anal
# about checking anyway.
- if store.find(Pended, token=token).count() == 0:
+ if store.query(Pended).filter_by(token=token).count() == 0:
break
else:
raise AssertionError('Could not find a valid pendings token')
@@ -133,7 +134,7 @@ class Pendings:
value = ('mailman.model.pending.unpack_list\1' +
'\2'.join(value))
keyval = PendedKeyValue(key=key, value=value)
- pending.key_values.add(keyval)
+ pending.key_values.append(keyval)
store.add(pending)
return token
@@ -141,7 +142,7 @@ class Pendings:
def confirm(self, store, token, expunge=True):
# Token can come in as a unicode, but it's stored in the database as
# bytes. They must be ascii.
- pendings = store.find(Pended, token=str(token))
+ pendings = store.query(Pended).filter_by(token=str(token))
if pendings.count() == 0:
return None
assert pendings.count() == 1, (
@@ -150,7 +151,7 @@ class Pendings:
pendable = UnpendedPendable()
# Find all PendedKeyValue entries that are associated with the pending
# object's ID. Watch out for type conversions.
- for keyvalue in store.find(PendedKeyValue,
+ for keyvalue in store.query(PendedKeyValue).filter(
PendedKeyValue.pended_id == pending.id):
if keyvalue.value is not None and '\1' in keyvalue.value:
type_name, value = keyvalue.value.split('\1', 1)
@@ -158,23 +159,23 @@ class Pendings:
else:
pendable[keyvalue.key] = keyvalue.value
if expunge:
- store.remove(keyvalue)
+ store.delete(keyvalue)
if expunge:
- store.remove(pending)
+ store.delete(pending)
return pendable
@dbconnection
def evict(self, store):
right_now = now()
- for pending in store.find(Pended):
+ for pending in store.query(Pended).all():
if pending.expiration_date < right_now:
# Find all PendedKeyValue entries that are associated with the
# pending object's ID.
- q = store.find(PendedKeyValue,
+ q = store.query(PendedKeyValue).filter(
PendedKeyValue.pended_id == pending.id)
for keyvalue in q:
- store.remove(keyvalue)
- store.remove(pending)
+ store.delete(keyvalue)
+ store.delete(pending)
diff --git a/src/mailman/model/requests.py b/src/mailman/model/requests.py
index 850ba6b3b..1b72f78f3 100644
--- a/src/mailman/model/requests.py
+++ b/src/mailman/model/requests.py
@@ -26,7 +26,7 @@ __all__ = [
from cPickle import dumps, loads
from datetime import timedelta
-from sqlalchemy import Column, Unicode, Integer, ForeignKey
+from sqlalchemy import Column, Unicode, Integer, ForeignKey, LargeBinary
from sqlalchemy.orm import relationship
from zope.component import getUtility
from zope.interface import implementer
@@ -69,25 +69,23 @@ class ListRequests:
@property
@dbconnection
def count(self, store):
- return store.find(_Request, mailing_list=self.mailing_list).count()
+ return store.query(_Request).filter_by(mailing_list=self.mailing_list).count()
@dbconnection
def count_of(self, store, request_type):
- return store.find(
- _Request,
+ return store.query(_Request).filter_by(
mailing_list=self.mailing_list, request_type=request_type).count()
@property
@dbconnection
def held_requests(self, store):
- results = store.find(_Request, mailing_list=self.mailing_list)
+ results = store.query(_Request).filter_by(mailing_list=self.mailing_list)
for request in results:
yield request
@dbconnection
def of_type(self, store, request_type):
- results = store.find(
- _Request,
+ results = store.query(_Request).filter_by(
mailing_list=self.mailing_list, request_type=request_type)
for request in results:
yield request
@@ -105,11 +103,12 @@ class ListRequests:
data_hash = token
request = _Request(key, request_type, self.mailing_list, data_hash)
store.add(request)
+ store.flush()
return request.id
@dbconnection
def get_request(self, store, request_id, request_type=None):
- result = store.get(_Request, request_id)
+ result = store.query(_Request).get(request_id)
if result is None:
return None
if request_type is not None and result.request_type != request_type:
@@ -131,12 +130,12 @@ class ListRequests:
@dbconnection
def delete_request(self, store, request_id):
- request = store.get(_Request, request_id)
+ request = store.query(_Request).get(request_id)
if request is None:
raise KeyError(request_id)
# Throw away the pended data.
getUtility(IPendings).confirm(request.data_hash)
- store.remove(request)
+ store.delete(request)
@@ -148,7 +147,7 @@ class _Request(Model):
id = Column(Integer, primary_key=True)# TODO: ???, default=AutoReload)
key = Column(Unicode)
request_type = Column(Enum(enum=RequestType))
- data_hash = Column(Unicode) # TODO : was RawStr()
+ data_hash = Column(LargeBinary)
mailing_list_id = Column(Integer, ForeignKey('mailinglist.id'))
mailing_list = relationship('MailingList')
diff --git a/src/mailman/model/roster.py b/src/mailman/model/roster.py
index c8bfdc582..a9a396523 100644
--- a/src/mailman/model/roster.py
+++ b/src/mailman/model/roster.py
@@ -37,7 +37,6 @@ __all__ = [
]
-#from storm.expr import And, Or
from sqlalchemy import and_, or_
from zope.interface import implementer
@@ -203,9 +202,9 @@ class DeliveryMemberRoster(AbstractRoster):
:return: A generator of members.
:rtype: generator
"""
- results = store.query(Member).filter(
- list_id == self._mlist.list_id,
- role == MemberRole.member)
+ results = store.query(Member).filter_by(
+ list_id = self._mlist.list_id,
+ role = MemberRole.member)
for member in results:
if member.delivery_mode in delivery_modes:
yield member
@@ -263,9 +262,9 @@ class Memberships:
def _query(self, store):
results = store.query(Member).filter(
or_(Member.user_id == self._user.id,
- and_(Member.user_id == self._user.id,
+ and_(Address.user_id == self._user.id,
Member.address_id == Address.id)))
- return results.config(distinct=True)
+ return results.distinct()
@property
def member_count(self):
diff --git a/src/mailman/model/user.py b/src/mailman/model/user.py
index 0ba690805..12f4643f1 100644
--- a/src/mailman/model/user.py
+++ b/src/mailman/model/user.py
@@ -24,7 +24,8 @@ __all__ = [
'User',
]
-from sqlalchemy import Column, Unicode, Integer, DateTime, ForeignKey
+from sqlalchemy import (
+ Column, Unicode, Integer, DateTime, ForeignKey, LargeBinary)
from sqlalchemy.orm import relationship, backref
from zope.event import notify
from zope.interface import implementer
@@ -55,7 +56,7 @@ class User(Model):
id = Column(Integer, primary_key=True)
display_name = Column(Unicode)
- _password = Column('password', Unicode) # TODO : was RawStr()
+ _password = Column('password', LargeBinary) # TODO : was RawStr()
_user_id = Column(UUID)
_created_on = Column(DateTime)