summaryrefslogtreecommitdiff
path: root/src/mailman/model/subscriptions.py
diff options
context:
space:
mode:
authorHarshit Bansal2016-04-12 02:58:25 +0530
committerBarry Warsaw2016-04-18 17:13:01 -0400
commit7559ce6dfdf2d569c91fea173968e46d6857d730 (patch)
tree6443ba6deedf2dc315e964e8c9f35bddbd3b2f4b /src/mailman/model/subscriptions.py
parentd95f5d501623896ab239a94bda0954424a9d3127 (diff)
downloadmailman-7559ce6dfdf2d569c91fea173968e46d6857d730.tar.gz
mailman-7559ce6dfdf2d569c91fea173968e46d6857d730.tar.zst
mailman-7559ce6dfdf2d569c91fea173968e46d6857d730.zip
Diffstat (limited to 'src/mailman/model/subscriptions.py')
-rw-r--r--src/mailman/model/subscriptions.py27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/mailman/model/subscriptions.py b/src/mailman/model/subscriptions.py
index 3d2bcbeb0..301bfd7d9 100644
--- a/src/mailman/model/subscriptions.py
+++ b/src/mailman/model/subscriptions.py
@@ -21,6 +21,7 @@ from mailman import public
from mailman.app.membership import delete_member
from mailman.database.transaction import dbconnection
from mailman.interfaces.listmanager import IListManager, NoSuchListError
+from mailman.interfaces.member import MemberRole
from mailman.interfaces.subscriptions import (
ISubscriptionService, TooManyMembersError)
from mailman.interfaces.usermanager import IUserManager
@@ -146,3 +147,29 @@ class SubscriptionService:
raise NoSuchListError(list_id)
# XXX for now, no notification or user acknowledgment.
delete_member(mlist, email, False, False)
+
+ @dbconnection
+ def unsubscribe_members(self, store, list_id, emails):
+ """See 'ISubscriptionService'."""
+ successful = []
+ unsuccessful = []
+ mlist = getUtility(IListManager).get_by_list_id(list_id)
+ if mlist is None:
+ raise NoSuchListError(list_id)
+ q_mem = store.query(Member).filter(
+ Member.list_id == list_id, Member.role == MemberRole.member)
+ for email in emails:
+ unsubscribed = False
+ q_addr = q_mem.join(Member._address).filter(
+ Address.email == email)
+ q_user = q_mem.join(Member._user).join(
+ User._preferred_address).filter(Address.email == email)
+ members = q_addr.union(q_user).all()
+ for member in members:
+ member.unsubscribe()
+ unsubscribed = True
+ if unsubscribed:
+ successful.append(email)
+ else:
+ unsuccessful.append(email)
+ return successful, unsuccessful