summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mailman/model/address.py11
-rw-r--r--src/mailman/model/autorespond.py6
-rw-r--r--src/mailman/model/bans.py6
-rw-r--r--src/mailman/model/bounce.py12
-rw-r--r--src/mailman/model/digests.py12
-rw-r--r--src/mailman/model/domain.py3
-rw-r--r--src/mailman/model/language.py3
-rw-r--r--src/mailman/model/mailinglist.py32
-rw-r--r--src/mailman/model/member.py24
-rw-r--r--src/mailman/model/message.py12
-rw-r--r--src/mailman/model/mime.py15
-rw-r--r--src/mailman/model/pending.py20
-rw-r--r--src/mailman/model/preferences.py20
-rw-r--r--src/mailman/model/requests.py17
-rw-r--r--src/mailman/model/uid.py12
-rw-r--r--src/mailman/model/user.py32
-rw-r--r--src/mailman/model/version.py12
17 files changed, 142 insertions, 107 deletions
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)
+ role = Column(Enum(enum=MemberRole))
+ list_id = Column(Unicode)
+ moderation_action = Column(Enum(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')
+ 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 '<Preferences object at {0:#x}>'.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()
+ __tablename__ = 'user'
- 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')
+ 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.