From 1341b9f00d56c806b78298f3dad7350d8fa28c39 Mon Sep 17 00:00:00 2001 From: Abhilash Raj Date: Fri, 5 Sep 2014 10:45:50 +0530 Subject: replace all storm types and relationships with sqlalchemy --- src/mailman/model/address.py | 11 +++++++---- src/mailman/model/autorespond.py | 6 +++++- src/mailman/model/bans.py | 6 ++++-- src/mailman/model/bounce.py | 12 +++++++----- src/mailman/model/digests.py | 12 +++++++----- src/mailman/model/domain.py | 3 ++- src/mailman/model/language.py | 3 ++- src/mailman/model/mailinglist.py | 32 +++++++++++++++----------------- src/mailman/model/member.py | 26 ++++++++++++-------------- src/mailman/model/message.py | 12 +++++++----- src/mailman/model/mime.py | 15 +++++++++------ src/mailman/model/pending.py | 20 ++++++++++---------- src/mailman/model/preferences.py | 20 +++++++++++--------- src/mailman/model/requests.py | 17 ++++++++++------- src/mailman/model/uid.py | 12 ++++++++---- src/mailman/model/user.py | 34 ++++++++++++++++++++-------------- src/mailman/model/version.py | 12 ++++++++---- 17 files changed, 144 insertions(+), 109 deletions(-) (limited to 'src') diff --git a/src/mailman/model/address.py b/src/mailman/model/address.py index 636193547..88e28b919 100644 --- a/src/mailman/model/address.py +++ b/src/mailman/model/address.py @@ -26,9 +26,9 @@ __all__ = [ from email.utils import formataddr -from storm.locals import DateTime, Int, Reference, Unicode from sqlalchemy import (Column, Integer, String, Unicode, ForeignKey, Datetime) +from sqlalchemy.orm import relationship, backref from zope.component import getUtility from zope.event import notify from zope.interface import implementer @@ -44,6 +44,8 @@ from mailman.utilities.datetime import now class Address(Model): """See `IAddress`.""" + __tablename__ = 'address' + id = Column(Integer, primary_key=True) email = Column(Unicode) _original = Column(Unicode) @@ -51,9 +53,10 @@ class Address(Model): _verified_on = Column('verified_on', Datetime) registered_on = Column(DateTime) - user = Column(Integer, ForeignKey('user.id')) - preferences = Column(Integer, ForeignKey('preferences.id')) - + user_id = Column(Integer, ForeignKey('user.id')) + preferences_id = Column(Integer, ForeignKey('preferences.id')) + prefereces = relationship('Preferences', + backref=backref('Address', uselist=False)) def __init__(self, email, display_name): getUtility(IEmailValidator).validate(email) diff --git a/src/mailman/model/autorespond.py b/src/mailman/model/autorespond.py index cc66a3516..4e1f42cca 100644 --- a/src/mailman/model/autorespond.py +++ b/src/mailman/model/autorespond.py @@ -44,13 +44,17 @@ from mailman.utilities.datetime import today class AutoResponseRecord(Model): """See `IAutoResponseRecord`.""" + __tablename__ = 'autorespondrecord' + id = Column(Integer, primary_key=True) address_id = Column(Integer, ForeignKey('address.id')) + address = relationship('Address') mailing_list_id = Column(Integer, ForeignKey('mailinglist.id')) + mailing_list = relationship('MailingList') - response_type = Enum(Response) + response_type = Column(Enum(enum=Response)) date_sent = Column(Date) def __init__(self, mailing_list, address, response_type): diff --git a/src/mailman/model/bans.py b/src/mailman/model/bans.py index 3e0683e8a..57dbdbbd5 100644 --- a/src/mailman/model/bans.py +++ b/src/mailman/model/bans.py @@ -27,9 +27,9 @@ __all__ = [ import re -from storm.locals import Int, Unicode -from zope.interface import implementer from sqlalchemy import Column, Integer, Unicode +from zope.interface import implementer + from mailman.database.model import Model from mailman.database.transaction import dbconnection from mailman.interfaces.bans import IBan, IBanManager @@ -40,6 +40,8 @@ from mailman.interfaces.bans import IBan, IBanManager class Ban(Model): """See `IBan`.""" + __tablename__ = 'ban' + id = Column(Integer, primary_key=True) email = Column(Unicode) list_id = Column(Unicode) diff --git a/src/mailman/model/bounce.py b/src/mailman/model/bounce.py index e852daa1d..a40178837 100644 --- a/src/mailman/model/bounce.py +++ b/src/mailman/model/bounce.py @@ -26,9 +26,9 @@ __all__ = [ ] -from storm.locals import Bool, Int, DateTime, Unicode -from zope.interface import implementer + from sqlalchemy import Column, Integer, Unicode, DateTime, Boolean +from zope.interface import implementer from mailman.database.model import Model from mailman.database.transaction import dbconnection @@ -43,13 +43,15 @@ from mailman.utilities.datetime import now class BounceEvent(Model): """See `IBounceEvent`.""" + __tablename__ = 'bounceevent' + id = Unicode(Integer, primary_key=True) list_id = Column(Unicode) email = Column(Unicode) - timestamp = DateTime() + timestamp = Column(DateTime) message_id = Column(Unicode) - context = Enum(BounceContext) - processed = COlumn(Boolean) + context = Column(Enum(enum=BounceContext)) + processed = Column(Boolean) def __init__(self, list_id, email, msg, context=None): self.list_id = list_id diff --git a/src/mailman/model/digests.py b/src/mailman/model/digests.py index 77e0a0663..0794bfb4f 100644 --- a/src/mailman/model/digests.py +++ b/src/mailman/model/digests.py @@ -25,9 +25,9 @@ __all__ = [ ] -from storm.locals import Int, Reference -from zope.interface import implementer from sqlalchemy import Column, Integer, ForeignKey +from sqlalchemy.orm import relationship +from zope.interface import implementer from mailman.database.model import Model from mailman.database.types import Enum @@ -40,15 +40,17 @@ from mailman.interfaces.member import DeliveryMode class OneLastDigest(Model): """See `IOneLastDigest`.""" + __tablename__ = 'onelastdigest' + id = Column(Integer, primary_key=True) mailing_list_id = Column(Integer, ForeignKey('mailinglist.id')) - #mailing_list = Reference(mailing_list_id, 'MailingList.id') + maling_list = relationship('MailingList') address_id = Columne(Integer, ForeignKey('address.id')) - #address = Reference(address_id, 'Address.id') + address = relationship('Address') - delivery_mode = Enum(DeliveryMode) + delivery_mode = Column(Enum(enum=DeliveryMode)) def __init__(self, mailing_list, address, delivery_mode): self.mailing_list = mailing_list diff --git a/src/mailman/model/domain.py b/src/mailman/model/domain.py index cd974438c..2a5391abc 100644 --- a/src/mailman/model/domain.py +++ b/src/mailman/model/domain.py @@ -28,7 +28,6 @@ __all__ = [ from urlparse import urljoin, urlparse from sqlalchemy import Column, Unicode, Integer -from storm.locals import Int, Unicode from zope.event import notify from zope.interface import implementer @@ -45,6 +44,8 @@ from mailman.model.mailinglist import MailingList class Domain(Model): """Domains.""" + __tablename__ = 'domain' + id = Column(Integer, primary_key=True) mail_host = Column(Unicode) diff --git a/src/mailman/model/language.py b/src/mailman/model/language.py index 5d5e538ab..7b611b6d8 100644 --- a/src/mailman/model/language.py +++ b/src/mailman/model/language.py @@ -25,7 +25,6 @@ __all__ = [ ] -from storm.locals import Int, Unicode from zope.interface import implementer from sqlalchemy import Column, Unicode, Integer @@ -38,5 +37,7 @@ from mailman.interfaces import ILanguage class Language(Model): """See `ILanguage`.""" + __tablename__ = 'language' + id = Column(Integer, primary_key=True) code = Column(Unicode) diff --git a/src/mailman/model/mailinglist.py b/src/mailman/model/mailinglist.py index c6f58b8f2..ff757aa98 100644 --- a/src/mailman/model/mailinglist.py +++ b/src/mailman/model/mailinglist.py @@ -27,12 +27,8 @@ __all__ = [ import os -from storm.locals import ( - And, Bool, DateTime, Float, Int, Pickle, RawStr, Reference, Store, - TimeDelta, Unicode, Enum) from sqlalchemy import ( Boolean, DateTime, Float, Integer, Unicode PickleType, Interval) - from urlparse import urljoin from zope.component import getUtility from zope.event import notify @@ -76,6 +72,8 @@ UNDERSCORE = '_' class MailingList(Model): """See `IMailingList`.""" + __tablename__ = 'mailinglist' + id = Column(Integer, primary_key=True) # XXX denotes attributes that should be part of the public interface but @@ -109,17 +107,17 @@ class MailingList(Model): admin_immed_notify = Column(Boolean) admin_notify_mchanges = Column(Boolean) administrivia = Column(Boolean) - archive_policy = Column(Enum(ArchivePolicy) + archive_policy = Column(Enum(enum=ArchivePolicy)) # Automatic responses. autoresponse_grace_period = Column(Interval) - autorespond_owner = Column(Enum(ResponseAction)) + autorespond_owner = Column(Enum(enum=ResponseAction)) autoresponse_owner_text = Column(Unicode) - autorespond_postings = Column(Enum(ResponseAction)) + autorespond_postings = Column(Enum(enum=ResponseAction)) autoresponse_postings_text = Column(Unicode) - autorespond_requests = Column(Enum(ResponseAction)) + autorespond_requests = Column(Enum(Enum=ResponseAction)) autoresponse_request_text = Column(Unicode) # Content filters. - filter_action = Column(Enum(FilterAction)) + filter_action = Column(Enum(enum=FilterAction)) filter_content = Column(Boolean) collapse_alternatives = Column(Boolean) convert_html_to_plaintext = Column(Boolean) @@ -131,18 +129,18 @@ class MailingList(Model): bounce_score_threshold = Column(Integer) # XXX bounce_you_are_disabled_warnings = Column(Integer) # XXX bounce_you_are_disabled_warnings_interval = Column(Interval) # XXX - forward_unrecognized_bounces_to = Column(Enum(UnrecognizedBounceDisposition)) + forward_unrecognized_bounces_to = Column(Enum(enum=UnrecognizedBounceDisposition)) process_bounces = Column(Boolean) # Miscellaneous - default_member_action = Column(Enum(Action)) - default_nonmember_action = Column(Enum(Action)) + default_member_action = Column(Enum(enum=Action)) + default_nonmember_action = Column(Enum(enum=Action)) description = Column(Unicode) digest_footer_uri = Column(Unicode) digest_header_uri = Column(Unicode) digest_is_default = Column(Boolean) digest_send_periodic = Column(Boolean) digest_size_threshold = Column(Float) - digest_volume_frequency = Column(Enum(DigestFrequency)) + digest_volume_frequency = Column(Enum(enum=DigestFrequency)) digestable = Column(Boolean) discard_these_nonmembers = Column(PickleType) emergency = Column(Boolean) @@ -164,22 +162,22 @@ class MailingList(Model): member_moderation_notice = Column(Unicode) mime_is_default_digest = Column(Boolean) # FIXME: There should be no moderator_password - moderator_password = RawStr() - newsgroup_moderation = Column(Enum(NewsgroupModeration)) + moderator_password = Column(Unicode) # TODO : was RawStr() + newsgroup_moderation = Column(Enum(enum=NewsgroupModeration)) nntp_prefix_subject_too = Column(Boolean) nondigestable = Column(Boolean) nonmember_rejection_notice = Column(Unicode) obscure_addresses = Column(Boolean) owner_chain = Column(Unicode) owner_pipeline = Column(Unicode) - personalize = Column(Enum(Personalization)) + personalize = Column(Enum(enum=Personalization)) post_id = Column(Integer) posting_chain = Column(Unicode) posting_pipeline = Column(Unicode) _preferred_language = Column('preferred_language', Unicode) display_name = Column(Unicode) reject_these_nonmembers = Column(PickleType) - reply_goes_to_list = Column(Enum(ReplyToMunging)) + reply_goes_to_list = Column(Enum(enum=ReplyToMunging)) reply_to_address = Column(Unicode) require_explicit_destination = Column(Boolean) respond_to_post_requests = Column(Boolean) diff --git a/src/mailman/model/member.py b/src/mailman/model/member.py index 438796811..f7da6b012 100644 --- a/src/mailman/model/member.py +++ b/src/mailman/model/member.py @@ -24,8 +24,7 @@ __all__ = [ 'Member', ] -from storm.locals import Int, Reference, Unicode -from storm.properties import UUID +from sqlalchemy import Integer, Unicode, ForeignKey, Column from zope.component import getUtility from zope.event import notify from zope.interface import implementer @@ -33,7 +32,7 @@ from zope.interface import implementer from mailman.core.constants import system_preferences from mailman.database.model import Model from mailman.database.transaction import dbconnection -from mailman.database.types import Enum +from mailman.database.types import Enum, UUID from mailman.interfaces.action import Action from mailman.interfaces.address import IAddress from mailman.interfaces.listmanager import IListManager @@ -52,18 +51,17 @@ uid_factory = UniqueIDFactory(context='members') class Member(Model): """See `IMember`.""" - id = Int(primary=True) + __tablename__ = 'member' + + id = Column(Integer, primary_key=True) _member_id = UUID() - role = Enum(MemberRole) - list_id = Unicode() - moderation_action = Enum(Action) - - address_id = Int() - _address = Reference(address_id, 'Address.id') - preferences_id = Int() - preferences = Reference(preferences_id, 'Preferences.id') - user_id = Int() - _user = Reference(user_id, 'User.id') + role = Column(Enum(enum=MemberRole)) + list_id = Column(Unicode) + moderation_action = Column(Enum(enum=Action)) + + address_id = Column(Integer, ForegignKey('address.id')) + preferences_id = Column(Integer, ForeignKey('preferences.id')) + user_id = Column(Integer, ForiegnKey('user.id')) def __init__(self, role, list_id, subscriber): self._member_id = uid_factory.new_uid() diff --git a/src/mailman/model/message.py b/src/mailman/model/message.py index 2d697c30b..64ee2c84a 100644 --- a/src/mailman/model/message.py +++ b/src/mailman/model/message.py @@ -24,7 +24,7 @@ __all__ = [ 'Message', ] -from storm.locals import AutoReload, Int, RawStr, Unicode +from sqlalchemy import Column, Integer, Unicode from zope.interface import implementer from mailman.database.model import Model @@ -37,10 +37,12 @@ from mailman.interfaces.messages import IMessage class Message(Model): """A message in the message store.""" - id = Int(primary=True, default=AutoReload) - message_id = Unicode() - message_id_hash = RawStr() - path = RawStr() + __tablename__ = 'message' + + id = Column(Integer, primary_key=True, default=AutoReload)) + message_id = Column(Unicode) + message_id_hash = Column(Unicode) + path = Column(Unicode) # TODO : was RawStr() # This is a Messge-ID field representation, not a database row id. @dbconnection diff --git a/src/mailman/model/mime.py b/src/mailman/model/mime.py index 570112a97..3fa051f10 100644 --- a/src/mailman/model/mime.py +++ b/src/mailman/model/mime.py @@ -25,7 +25,8 @@ __all__ = [ ] -from storm.locals import Int, Reference, Unicode +from sqlalchemy import Column, Integer, Unicode, ForeignKey +from sqlalchemy.orm import relationship from zope.interface import implementer from mailman.database.model import Model @@ -38,13 +39,15 @@ from mailman.interfaces.mime import IContentFilter, FilterType class ContentFilter(Model): """A single filter criteria.""" - id = Int(primary=True) + __tablename__ == 'contentfilter' - mailing_list_id = Int() - mailing_list = Reference(mailing_list_id, 'MailingList.id') + id = Column(Integer, primary_key=True) - filter_type = Enum(FilterType) - filter_pattern = Unicode() + mailing_list_id = Column(Integer, ForiegnKey('mailinglist.id')) + mailing_list = relationship('MailingList') + + filter_type = Column(Enum(enum=FilterType)) + filter_pattern = Column(Unicode) def __init__(self, mailing_list, filter_pattern, filter_type): self.mailing_list = mailing_list diff --git a/src/mailman/model/pending.py b/src/mailman/model/pending.py index 17513015c..cc203d270 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 storm.locals import DateTime, Int, RawStr, ReferenceSet, Unicode +from sqlalchemy import Column, Integer, Unicode, ForeignKey, DateTime +from sqlalchemy.orm import relationship from zope.interface import implementer from zope.interface.verify import verifyObject @@ -53,10 +54,10 @@ class PendedKeyValue(Model): self.key = key self.value = value - id = Int(primary=True) - key = Unicode() - value = Unicode() - pended_id = Int() + id = Column(Integer, primary_key=True) + key = Column(Unicode) + value = Column(Unicode) + pended_id = Column(Integer) @@ -69,11 +70,10 @@ class Pended(Model): self.token = token self.expiration_date = expiration_date - id = Int(primary=True) - token = RawStr() - expiration_date = DateTime() - key_values = ReferenceSet(id, PendedKeyValue.pended_id) - + id = Column(Integer. primary_key=True) + token = Column(Unicode) # TODO : was RawStr() + expiration_date = Column(DateTime) + key_values = relationship('PendedKeyValues') @implementer(IPendable) diff --git a/src/mailman/model/preferences.py b/src/mailman/model/preferences.py index 83271d7d6..73bb080a9 100644 --- a/src/mailman/model/preferences.py +++ b/src/mailman/model/preferences.py @@ -25,7 +25,7 @@ __all__ = [ ] -from storm.locals import Bool, Int, Unicode +from sqlalchemy import Column, Integer, Unicode, Boolean from zope.component import getUtility from zope.interface import implementer @@ -41,14 +41,16 @@ from mailman.interfaces.preferences import IPreferences class Preferences(Model): """See `IPreferences`.""" - id = Int(primary=True) - acknowledge_posts = Bool() - hide_address = Bool() - _preferred_language = Unicode(name='preferred_language') - receive_list_copy = Bool() - receive_own_postings = Bool() - delivery_mode = Enum(DeliveryMode) - delivery_status = Enum(DeliveryStatus) + __tablename__ == 'preferences' + + id = Column(Integer, primary_key=True) + acknowledge_posts = Column(Boolean) + hide_address = Column(Boolean) + _preferred_language = Column('preferred_language', Unicode) + receive_list_copy = Column(Boolean) + receive_own_postings = Column(Boolean) + delivery_mode = Column(Enum(enum=DeliveryMode)) + delivery_status = Column(Enum(enum=DeliveryStatus)) def __repr__(self): return ''.format(id(self)) diff --git a/src/mailman/model/requests.py b/src/mailman/model/requests.py index f3ad54797..457341557 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, Unicode, Integer, ForeignKey +from sqlalchemy.orm import relationship from zope.component import getUtility from zope.interface import implementer @@ -142,13 +143,15 @@ class ListRequests: 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' - mailing_list_id = Int() - mailing_list = Reference(mailing_list_id, 'MailingList.id') + 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() + + mailing_list_id = Column(Integer, ForeignKey('mailinglist.id')) + mailing_list = relationship('MailingList') def __init__(self, key, request_type, mailing_list, data_hash): super(_Request, self).__init__() diff --git a/src/mailman/model/uid.py b/src/mailman/model/uid.py index c60d0f1eb..cb248b1fa 100644 --- a/src/mailman/model/uid.py +++ b/src/mailman/model/uid.py @@ -25,10 +25,11 @@ __all__ = [ ] -from storm.locals import Int -from storm.properties import UUID + +from sqlalchemy import Column, Integer from mailman.database.model import Model +from mailman.database.types import UUID from mailman.database.transaction import dbconnection @@ -45,8 +46,11 @@ class UID(Model): There is no interface for this class, because it's purely an internal implementation detail. """ - id = Int(primary=True) - uid = UUID() + + __tablename__ = 'uid' + + id = Column(Integer, primary_key=True) + uid = Column(UUID) @dbconnection def __init__(self, store, uid): diff --git a/src/mailman/model/user.py b/src/mailman/model/user.py index f2c09c626..16e87bbfb 100644 --- a/src/mailman/model/user.py +++ b/src/mailman/model/user.py @@ -24,14 +24,14 @@ __all__ = [ 'User', ] -from storm.locals import ( - DateTime, Int, RawStr, Reference, ReferenceSet, Unicode) -from storm.properties import UUID +from sqlalchemy import Column, Unicode, Integer, DateTime, ForeignKey +from sqlalchemy import relationship, backref from zope.event import notify from zope.interface import implementer from mailman.database.model import Model from mailman.database.transaction import dbconnection +from mailman.database.types import UUID from mailman.interfaces.address import ( AddressAlreadyLinkedError, AddressNotLinkedError) from mailman.interfaces.user import ( @@ -51,17 +51,23 @@ uid_factory = UniqueIDFactory(context='users') class User(Model): """Mailman users.""" - id = Int(primary=True) - display_name = Unicode() - _password = RawStr(name='password') - _user_id = UUID() - _created_on = DateTime() - - addresses = ReferenceSet(id, 'Address.user_id') - _preferred_address_id = Int() - _preferred_address = Reference(_preferred_address_id, 'Address.id') - preferences_id = Int() - preferences = Reference(preferences_id, 'Preferences.id') + __tablename__ = 'user' + + id = Column(Integer, primary_key=True) + display_name = Column(Unicode) + _password = Column('password', Unicode) # TODO : was RawStr() + _user_id = Column(UUID) + _created_on = Column(DateTime) + + addresses = relationship('Address', backref='user') + + _preferred_address_id = Column(Integer, ForeignKey='address.id') + _preferred_address = relationship('Address', + backred=backref('user', uselist=False)) + + preferences_id = Column(Integer, ForeignKey('preferences.id')) + preferences = relationship('Preferences', + backref=backref('user', uselist=False)) @dbconnection def __init__(self, store, display_name=None, preferences=None): diff --git a/src/mailman/model/version.py b/src/mailman/model/version.py index e99fb0d1c..9824e54d4 100644 --- a/src/mailman/model/version.py +++ b/src/mailman/model/version.py @@ -24,15 +24,19 @@ __all__ = [ 'Version', ] -from storm.locals import Int, Unicode +from sqlalchemy import Column, Unicode, Integer + from mailman.database.model import Model class Version(Model): - id = Int(primary=True) - component = Unicode() - version = Unicode() + + __tablename_ = 'version' + + id = Column(Integer, primary_key=True) + component = Column(Unicode) + version = Column(Unicode) # The testing machinery will generally reset all tables, however because # this table tracks schema migrations, we do not want to reset it. -- cgit v1.2.3-70-g09d2