summaryrefslogtreecommitdiff
path: root/Mailman/Cgi/admin.py
diff options
context:
space:
mode:
authorcotton1998-11-19 13:15:09 +0000
committercotton1998-11-19 13:15:09 +0000
commitf54c2fd02ba71dabf16739806fa8f7bb6a2e2d55 (patch)
tree34f50499b9c48145fa17c70bfa474e4eede3ece2 /Mailman/Cgi/admin.py
parentf5210e33e5929228a4f24e818e24f15c2dcde0a7 (diff)
downloadmailman-f54c2fd02ba71dabf16739806fa8f7bb6a2e2d55.tar.gz
mailman-f54c2fd02ba71dabf16739806fa8f7bb6a2e2d55.tar.zst
mailman-f54c2fd02ba71dabf16739806fa8f7bb6a2e2d55.zip
This change implements storing list members and digest members as
dicts instead of lists, which optimizes Utils.FindMatchingAddresses and general membership management, especially for large lists. MailList.py now supplies .GetMembers() and .GetDigestMembers() to supply the data in list form to anything that needs it that way. An new install showed this worked fine with some cursory testing of the cgi's and interactive poking around. A detailed listing of the changes follows: Mailman/Defaults.py.in: change data version to 11 Mailman/Digester.py: initvars now instantiates digest_members as {} instead of [] lines 113-114 and 121-122 now use del This change implements storing list members and digest members as dicts instead of lists, which optimizes Utils.FindMatchingAddresses and general membership management, especially for large lists. MailList.py now supplies .GetMembers() and .GetDigestMembers() to supply the data in list form to anything that needs it that way. Though INSTALL shows up on the changed files section, a diff a few seconds ago didn't show any differences in that file, so I hope nobody changed it in the interim. An new install showed this worked fine with some cursory testing of the cgi's and interactive poking around. A detailed listing of the changes follows: Mailman/Defaults.py.in: change data version to 11 Mailman/Digester.py: initvars now instantiates digest_members as {} instead of [] lines 113-114 and 121-122 now use del list.[digest_]member instead of list.[digest_]members.remove when figuring who to actually send digests to, use list.GetDigestMembers() instead of list.digest_members. Mailman/HTMLFormatter: now uses list.Get[Digest]Members to get subscribers, and length of digested subscribers and regular members MailCommandHandler, SecurityManager,Cgi/handle_opts, Cgi/options: all simple replacements of list.[digest_]members with list.Get[Digest]Members(). Mailman/Cgi/admin.py: mostly simple replacements of list.[digest_]members with the Get..() methods, however, the membership management section now works much quicker and changes digest->nodigest subscriptions via dictionary manipulations. Mailman/versions.py: updates lists to use dicts and changed list.[digest_]members to use the list.Get[Digest]Members() methods. Mailman/Utils.py: added a function "GetPossibleMatchingAddresses" which when fed an address, returns the list of addresses that "smart" address matching would match. changed FindMatchingAddresses(name, list) to use a new signature: FindMatchingAddresses(name, *dicts), where dicts is a list of dictionaries keyed by addresses. Just realized that this would better be FindMatchingAddresses(name, dict, *dicts) so that it enforces atleast 2 args... I'll make that change in a sec. All uses of FindMatchingAddresses have been changed to fit the new arguments. scott ----:**-F1 cvs30458aaa 1:12PM 0.98 Mail (Text Fill)--L59--32%------------------------------------------- ?
Diffstat (limited to 'Mailman/Cgi/admin.py')
-rw-r--r--Mailman/Cgi/admin.py30
1 files changed, 12 insertions, 18 deletions
diff --git a/Mailman/Cgi/admin.py b/Mailman/Cgi/admin.py
index 410edb0e9..0ebf2bc93 100644
--- a/Mailman/Cgi/admin.py
+++ b/Mailman/Cgi/admin.py
@@ -144,12 +144,12 @@ def main():
' (does it have the colon?)<ul> %s </ul>',
line)
- if not lst.digestable and len(lst.digest_members):
+ if not lst.digestable and len(lst.GetDigestMembers()):
AddErrorMessage(doc,
'Warning: you have digest members,'
' but digests are turned off.'
' Those people will not receive mail.')
- if not lst.nondigestable and len(lst.members):
+ if not lst.nondigestable and len(lst.GetMembers()):
AddErrorMessage(doc,
'Warning: you have lst members,'
' but non-digestified mail is turned'
@@ -487,13 +487,7 @@ def FormatMembershipOptions(lst):
user_table.GetCurrentCellIndex(),
bgcolor="#cccccc", colspan=8)
- members = {}
- digests = {}
- for member in lst.members:
- members[member] = 1
- for member in lst.digest_members:
- digests[member] = 1
- all = lst.members + lst.digest_members
+ all = lst.GetMembers() + lst.GetDigestMembers()
if len(all) > lst.admin_member_chunksize:
chunks = Utils.chunkify(all, lst.admin_member_chunksize)
if not cgi_data.has_key("chunk"):
@@ -520,7 +514,7 @@ def FormatMembershipOptions(lst):
cells = [member + "<input type=hidden name=user value=%s>" % (member),
"subscribed " +CheckBox(member + "_subscribed", "on", 1).Format(),
]
- if members.get(member):
+ if lst.members.get(member):
cells.append("digest " + CheckBox(member + "_digest", "off", 0).Format())
else:
cells.append("digest " + CheckBox(member + "_digest", "on", 1).Format())
@@ -772,18 +766,18 @@ def ChangeOptions(lst, category, cgi_info, document):
dirty = 1
continue
if not cgi_info.has_key("%s_digest" % (user)):
- if user in lst.digest_members:
- lst.digest_members.remove(user)
+ if lst.digest_members.has_key(user):
+ del lst.digest_members[user]
dirty = 1
- if user not in lst.members:
- lst.members.append(user)
+ if not lst.members.has_key(user):
+ lst.members[user] = 1
dirty = 1
else:
- if user not in lst.digest_members:
- lst.digest_members.append(user)
+ if not lst.digest_members.has_key(user):
+ lst.digest_members[user] = 1
dirty = 1
- if user in lst.members:
- lst.members.remove(user)
+ if lst.members.has_key(user):
+ del lst.members[user]
dirty = 1
for opt in ("hide", "nomail", "ack", "norcv", "plain"):