diff options
Diffstat (limited to 'src/mailman/model/requests.py')
| -rw-r--r-- | src/mailman/model/requests.py | 41 |
1 files changed, 25 insertions, 16 deletions
diff --git a/src/mailman/model/requests.py b/src/mailman/model/requests.py index f3ad54797..6b130196d 100644 --- a/src/mailman/model/requests.py +++ b/src/mailman/model/requests.py @@ -26,7 +26,8 @@ __all__ = [ from cPickle import dumps, loads from datetime import timedelta -from storm.locals import AutoReload, Int, RawStr, Reference, Unicode +from sqlalchemy import Column, ForeignKey, Integer, LargeBinary, Unicode +from sqlalchemy.orm import relationship from zope.component import getUtility from zope.interface import implementer @@ -68,25 +69,25 @@ 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 @@ -104,11 +105,15 @@ class ListRequests: data_hash = token request = _Request(key, request_type, self.mailing_list, data_hash) store.add(request) + # XXX The caller needs a valid id immediately, so flush the changes + # now to the SA transaction context. Otherwise .id would not be + # valid. Hopefully this has no unintended side-effects. + 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: @@ -117,6 +122,8 @@ class ListRequests: return result.key, None pendable = getUtility(IPendings).confirm( result.data_hash, expunge=False) + if pendable is None: + return None data = dict() # Unpickle any non-Unicode values. for key, value in pendable.items(): @@ -130,25 +137,27 @@ 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) class _Request(Model): """Table for mailing list hold requests.""" - id = Int(primary=True, default=AutoReload) - key = Unicode() - request_type = Enum(RequestType) - data_hash = RawStr() + __tablename__ = '_request' + + id = Column(Integer, primary_key=True) + key = Column(Unicode) + request_type = Column(Enum(RequestType)) + data_hash = Column(LargeBinary) - mailing_list_id = Int() - mailing_list = Reference(mailing_list_id, 'MailingList.id') + mailing_list_id = Column(Integer, ForeignKey('mailinglist.id'), index=True) + mailing_list = relationship('MailingList') def __init__(self, key, request_type, mailing_list, data_hash): super(_Request, self).__init__() |
