From b667f47b4f9448d4f96b3d1fa8229ce74e8ca08a Mon Sep 17 00:00:00 2001
From: Henrik Levkowetz <henrik@levkowetz.com>
Date: Fri, 17 Jun 2016 13:06:39 +0000
Subject: [PATCH] Let the import_mailman_listinfo management command not only
 add, but also remove subcriptions to match mailman's info.  Pay attention
 only to addresses with delivery enabled.  - Legacy-Id: 11394

---
 .../commands/import_mailman_listinfo.py          | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/ietf/mailinglists/management/commands/import_mailman_listinfo.py b/ietf/mailinglists/management/commands/import_mailman_listinfo.py
index fe218d578..02c5b03e9 100644
--- a/ietf/mailinglists/management/commands/import_mailman_listinfo.py
+++ b/ietf/mailinglists/management/commands/import_mailman_listinfo.py
@@ -12,6 +12,7 @@ sys.path.append(settings.MAILMAN_LIB_DIR)
 
 from Mailman import Utils
 from Mailman import MailList
+from Mailman import MemberAdaptor
 
 from ietf.mailinglists.models import List, Subscribed
 
@@ -28,13 +29,22 @@ def import_mailman_listinfo(verbosity=0):
             list, created = List.objects.get_or_create(name=mlist.real_name, description=mlist.description, advertised=mlist.advertised)
             # The following calls return lowercased addresses
             members = mlist.getRegularMemberKeys() + mlist.getDigestMemberKeys()
-            known = [ s.email for s in Subscribed.objects.filter(lists__name=name) ]
+            members = [ m for m in members if mlist.getDeliveryStatus(m) == MemberAdaptor.ENABLED ]
+            known = Subscribed.objects.filter(lists__name=name).values_list('email', flat=True)
+            for addr in known:
+                if not addr in members:
+                    note("  Removing subscription: %s" % (addr))
+                    old = Subscribed.objects.get(email=addr)
+                    old.lists.remove(list)
+                    if old.lists.count() == 0:
+                        note("    Removing address with no subscriptions: %s" % (addr))
+                        old.delete()
             for addr in members:
                 if not addr in known:
-                    note("  Adding subscribed: %s" % (addr))
+                    note("  Adding subscription: %s" % (addr))
                     new, created = Subscribed.objects.get_or_create(email=addr)
                     new.lists.add(list)
-
+    
 
 class Command(BaseCommand):
     """