~abompard/mailman/bug-1312884

« back to all changes in this revision

Viewing changes to src/mailman/model/member.py

  • Committer: Barry Warsaw
  • Date: 2014-11-01 16:49:15 UTC
  • mfrom: (7251.1.38 abhilash)
  • Revision ID: barry@list.org-20141101164915-06wqfmya6wf47n6n
Database
--------
 * The ORM layer, previously implemented with Storm, has been replaced by
   SQLAlchemy, thanks to the fantastic work by Abhilash Raj and Aurélien
   Bompard.  Alembic is now used for all database schema migrations.
 * The new logger `mailman.database` logs any errors at the database layer.

API
---
 * Several changes to the internal API:
   - `IListManager.mailing_lists` is guaranteed to be sorted in List-ID order.
   - `IDomains.mailing_lists` is guaranteed to be sorted in List-ID order.
   - Iteration over domains via the `IDomainManager` is guaranteed to be sorted
     by `IDomain.mail_host` order.
   - `ITemporaryDatabase` interface and all implementations are removed.

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
    'Member',
25
25
    ]
26
26
 
27
 
from storm.locals import Int, Reference, Unicode
28
 
from storm.properties import UUID
 
27
from sqlalchemy import Column, ForeignKey, Integer, Unicode
 
28
from sqlalchemy.orm import relationship
29
29
from zope.component import getUtility
30
30
from zope.event import notify
31
31
from zope.interface import implementer
33
33
from mailman.core.constants import system_preferences
34
34
from mailman.database.model import Model
35
35
from mailman.database.transaction import dbconnection
36
 
from mailman.database.types import Enum
 
36
from mailman.database.types import Enum, UUID
37
37
from mailman.interfaces.action import Action
38
38
from mailman.interfaces.address import IAddress
39
39
from mailman.interfaces.listmanager import IListManager
52
52
class Member(Model):
53
53
    """See `IMember`."""
54
54
 
55
 
    id = Int(primary=True)
56
 
    _member_id = UUID()
57
 
    role = Enum(MemberRole)
58
 
    list_id = Unicode()
59
 
    moderation_action = Enum(Action)
60
 
 
61
 
    address_id = Int()
62
 
    _address = Reference(address_id, 'Address.id')
63
 
    preferences_id = Int()
64
 
    preferences = Reference(preferences_id, 'Preferences.id')
65
 
    user_id = Int()
66
 
    _user = Reference(user_id, 'User.id')
 
55
    __tablename__ = 'member'
 
56
 
 
57
    id = Column(Integer, primary_key=True)
 
58
    _member_id = Column(UUID)
 
59
    role = Column(Enum(MemberRole))
 
60
    list_id = Column(Unicode)
 
61
    moderation_action = Column(Enum(Action))
 
62
 
 
63
    address_id = Column(Integer, ForeignKey('address.id'))
 
64
    _address = relationship('Address')
 
65
    preferences_id = Column(Integer, ForeignKey('preferences.id'))
 
66
    preferences = relationship('Preferences')
 
67
    user_id = Column(Integer, ForeignKey('user.id'))
 
68
    _user = relationship('User')
67
69
 
68
70
    def __init__(self, role, list_id, subscriber):
69
71
        self._member_id = uid_factory.new_uid()
198
200
        """See `IMember`."""
199
201
        # Yes, this must get triggered before self is deleted.
200
202
        notify(UnsubscriptionEvent(self.mailing_list, self))
201
 
        store.remove(self.preferences)
202
 
        store.remove(self)
 
203
        store.delete(self.preferences)
 
204
        store.delete(self)