summaryrefslogtreecommitdiff
path: root/Mailman/database
diff options
context:
space:
mode:
authorBarry Warsaw2007-08-05 22:49:04 -0500
committerBarry Warsaw2007-08-05 22:49:04 -0500
commit89bdaec5c735ffb2b27cc29620cb01b451b72550 (patch)
tree61c6fa40eb1d3e267475430005b50ecf44b46512 /Mailman/database
parente0abca9fbdde530f7517396677c87f19c86bc0c6 (diff)
downloadmailman-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.py12
-rw-r--r--Mailman/database/model/mailinglist.py1
-rw-r--r--Mailman/database/model/roster.py12
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