diff options
| author | Barry Warsaw | 2007-08-05 22:49:04 -0500 |
|---|---|---|
| committer | Barry Warsaw | 2007-08-05 22:49:04 -0500 |
| commit | 89bdaec5c735ffb2b27cc29620cb01b451b72550 (patch) | |
| tree | 61c6fa40eb1d3e267475430005b50ecf44b46512 /Mailman/database | |
| parent | e0abca9fbdde530f7517396677c87f19c86bc0c6 (diff) | |
| download | mailman-89bdaec5c735ffb2b27cc29620cb01b451b72550.tar.gz mailman-89bdaec5c735ffb2b27cc29620cb01b451b72550.tar.zst mailman-89bdaec5c735ffb2b27cc29620cb01b451b72550.zip | |
Fixed a problem where members of a deleted mailing list were hanging around.
This would cause duplicate members (e.g. owners) if you created, deleted and
then recreated the mailing list.
Mailman.app.create -> Mailman.app.lifecycle; Mailman/doc/create.txt ->
Mailman/doc/lifecycle.txt; also added a remove_list() function.
Added SubscriptionError base class, made HostileSubscriptionError inherit from
that, and added a new AlreadySubscribedError.
Rewrote bin/rmlist to use the new lifecycle.remove_list() function.
IAddress.subscribe() must now throw an AlreadySubscribedError if the address
is already subscribed to the mailing list with the given role.
Added a Subscribers roster, attached to the IMailingList which gives access to
all subscribers of a mailing list, regardless of their role. Added a new test
for this roster.
Diffstat (limited to 'Mailman/database')
| -rw-r--r-- | Mailman/database/model/address.py | 12 | ||||
| -rw-r--r-- | Mailman/database/model/mailinglist.py | 1 | ||||
| -rw-r--r-- | Mailman/database/model/roster.py | 12 |
3 files changed, 23 insertions, 2 deletions
diff --git a/Mailman/database/model/address.py b/Mailman/database/model/address.py index 9c36d2472..391004413 100644 --- a/Mailman/database/model/address.py +++ b/Mailman/database/model/address.py @@ -19,8 +19,10 @@ from elixir import * from email.utils import formataddr from zope.interface import implements +from Mailman import Errors from Mailman.interfaces import IAddress + MEMBER_KIND = 'Mailman.database.model.member.Member' PREFERENCE_KIND = 'Mailman.database.model.preferences.Preferences' USER_KIND = 'Mailman.database.model.user.User' @@ -62,12 +64,18 @@ class Address(Entity): return '<Address: %s [%s] key: %s at %#x>' % ( address_str, verified, self.address, id(self)) - def subscribe(self, mlist, role): + def subscribe(self, mailing_list, role): from Mailman.database.model import Member from Mailman.database.model import Preferences # This member has no preferences by default. + member = Member.get_by(role=role, + mailing_list=mailing_list.fqdn_listname, + address=self) + if member: + raise Errors.AlreadySubscribedError( + mailing_list.fqdn_listname, self.address, role) member = Member(role=role, - mailing_list=mlist.fqdn_listname, + mailing_list=mailing_list.fqdn_listname, address=self) member.preferences = Preferences() return member diff --git a/Mailman/database/model/mailinglist.py b/Mailman/database/model/mailinglist.py index 11deb28c6..0cb968574 100644 --- a/Mailman/database/model/mailinglist.py +++ b/Mailman/database/model/mailinglist.py @@ -185,6 +185,7 @@ class MailingList(Entity): self.members = roster.MemberRoster(self) self.regular_members = roster.RegularMemberRoster(self) self.digest_members = roster.DigestMemberRoster(self) + self.subscribers = roster.Subscribers(self) @property def fqdn_listname(self): diff --git a/Mailman/database/model/roster.py b/Mailman/database/model/roster.py index 0730d2b4b..8440e0ffc 100644 --- a/Mailman/database/model/roster.py +++ b/Mailman/database/model/roster.py @@ -184,3 +184,15 @@ class DigestMemberRoster(AbstractRoster): role=MemberRole.member): if member.delivery_mode in _digest_modes: yield member + + + +class Subscribers(AbstractRoster): + """Return all subscribed members regardless of their role.""" + + name = 'subscribers' + + @property + def members(self): + for member in Member.select_by(mailing_list=self._mlist.fqdn_listname): + yield member |
