diff options
| author | Mark Sapiro | 2016-10-22 12:24:00 -0700 |
|---|---|---|
| committer | Mark Sapiro | 2016-10-22 12:24:00 -0700 |
| commit | cbb0847d59fb8b77f634a7209b0dc8170023b6f5 (patch) | |
| tree | 2469f7eb074a4ab6d9579133987b7fde503732a4 /src/mailman/model/mailinglist.py | |
| parent | d1954d1705a987524bb25ecb8cdbace6de56fa5b (diff) | |
| parent | 3cf613f56e44bed4bc45f533e6f6263288e66460 (diff) | |
| download | mailman-cbb0847d59fb8b77f634a7209b0dc8170023b6f5.tar.gz mailman-cbb0847d59fb8b77f634a7209b0dc8170023b6f5.tar.zst mailman-cbb0847d59fb8b77f634a7209b0dc8170023b6f5.zip | |
Diffstat (limited to 'src/mailman/model/mailinglist.py')
| -rw-r--r-- | src/mailman/model/mailinglist.py | 42 |
1 files changed, 29 insertions, 13 deletions
diff --git a/src/mailman/model/mailinglist.py b/src/mailman/model/mailinglist.py index 933384797..eec58ad04 100644 --- a/src/mailman/model/mailinglist.py +++ b/src/mailman/model/mailinglist.py @@ -178,6 +178,7 @@ class MailingList(Model): topics = Column(PickleType) topics_bodylines_limit = Column(Integer) topics_enabled = Column(Boolean) + unsubscription_policy = Column(Enum(SubscriptionPolicy)) # ORM relationships. header_matches = relationship( 'HeaderMatch', backref='mailing_list', @@ -440,31 +441,46 @@ class MailingList(Model): else: raise ValueError('Undefined MemberRole: {}'.format(role)) - @dbconnection - def subscribe(self, store, subscriber, role=MemberRole.member): - """See `IMailingList`.""" + def _get_subscriber(self, store, subscriber, role): + """Get some information about a user/address. + + Returns a 2-tuple of (member, email) for the given subscriber. If the + subscriber is is not an ``IAddress`` or ``IUser``, then a 2-tuple of + (None, None) is returned. If the subscriber is not already + subscribed, then (None, email) is returned. If the subscriber is an + ``IUser`` and does not have a preferred address, (member, None) is + returned. + """ + member = None + email = None if IAddress.providedBy(subscriber): member = store.query(Member).filter( Member.role == role, Member.list_id == self._list_id, Member._address == subscriber).first() - if member: - raise AlreadySubscribedError( - self.fqdn_listname, subscriber.email, role) + email = subscriber.email elif IUser.providedBy(subscriber): if subscriber.preferred_address is None: raise MissingPreferredAddressError(subscriber) + email = subscriber.preferred_address.email member = store.query(Member).filter( Member.role == role, Member.list_id == self._list_id, Member._user == subscriber).first() - if member: - raise AlreadySubscribedError( - self.fqdn_listname, - subscriber.preferred_address.email, - role) - else: - raise ValueError('subscriber must be an address or user') + return member, email + + @dbconnection + def is_subscribed(self, store, subscriber, role=MemberRole.member): + """See `IMailingList`.""" + member, email = self._get_subscriber(store, subscriber, role) + return member is not None + + @dbconnection + def subscribe(self, store, subscriber, role=MemberRole.member): + """See `IMailingList`.""" + member, email = self._get_subscriber(store, subscriber, role) + if member is not None: + raise AlreadySubscribedError(self.fqdn_listname, email, role) member = Member(role=role, list_id=self._list_id, subscriber=subscriber) |
