diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/mailman/app/subscriptions.py | 11 | ||||
| -rw-r--r-- | src/mailman/database/types.py | 6 | ||||
| -rw-r--r-- | src/mailman/model/address.py | 2 | ||||
| -rw-r--r-- | src/mailman/model/autorespond.py | 4 | ||||
| -rw-r--r-- | src/mailman/model/bans.py | 2 | ||||
| -rw-r--r-- | src/mailman/model/bounce.py | 2 | ||||
| -rw-r--r-- | src/mailman/model/domain.py | 3 | ||||
| -rw-r--r-- | src/mailman/model/listmanager.py | 2 | ||||
| -rw-r--r-- | src/mailman/model/mailinglist.py | 135 | ||||
| -rw-r--r-- | src/mailman/model/member.py | 8 | ||||
| -rw-r--r-- | src/mailman/model/message.py | 4 | ||||
| -rw-r--r-- | src/mailman/model/messagestore.py | 8 | ||||
| -rw-r--r-- | src/mailman/model/pending.py | 25 | ||||
| -rw-r--r-- | src/mailman/model/requests.py | 21 | ||||
| -rw-r--r-- | src/mailman/model/roster.py | 11 | ||||
| -rw-r--r-- | src/mailman/model/user.py | 5 |
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) |
