From 6628c65e88f74903c3a3f3a9f981997cb72d393c Mon Sep 17 00:00:00 2001
From: bwarsaw
Date: Wed, 2 Jan 2002 04:31:21 +0000
Subject: main(): Refactor calculation of QUERY_STRING values.
membership_options(): Refactor calculation of adminurl. Also, add a
hack to hide or display the table legend (normally hidden) using
QUERY_STRING extensions. This may not yet play nicely with all the
member chunking extensions.
Add Dan Mick idea to include an indication of the reason for
`nomail'. Use an abbreviation, described in the legend.
---
Mailman/Cgi/admin.py | 68 ++++++++++++++++++++++++++++++++++++++++++----------
1 file changed, 56 insertions(+), 12 deletions(-)
(limited to 'Mailman/Cgi/admin.py')
diff --git a/Mailman/Cgi/admin.py b/Mailman/Cgi/admin.py
index 4f7a2767c..b8f0085dc 100644
--- a/Mailman/Cgi/admin.py
+++ b/Mailman/Cgi/admin.py
@@ -1,4 +1,4 @@
-# Copyright (C) 1998,1999,2000,2001 by the Free Software Foundation, Inc.
+# Copyright (C) 1998,1999,2000,2001,2002 by the Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -108,13 +108,16 @@ def main():
# Is the request for variable details?
varhelp = None
+ qsenviron = os.environ.get('QUERY_STRING')
+ if qsenviron:
+ parsedqs = cgi.parse_qs(qsenviron)
if cgidata.has_key('VARHELP'):
varhelp = cgidata['VARHELP'].value
- elif cgidata.has_key('request_login') and os.environ.get('QUERY_STRING'):
+ elif cgidata.has_key('request_login') and parsedqs:
# POST methods, even if their actions have a query string, don't get
# put into FieldStorage's keys :-(
- qs = cgi.parse_qs(os.environ['QUERY_STRING']).get('VARHELP')
- if qs and type(qs) == ListType:
+ qs = parsedqs.get('VARHELP')
+ if qs and isinstance(qs, ListType):
varhelp = qs[0]
if varhelp:
option_help(mlist, varhelp)
@@ -746,6 +749,7 @@ def get_item_gui_description(mlist, category, subcat,
def membership_options(mlist, subcat, cgidata, doc, form):
# Show the main stuff
+ adminurl = mlist.GetScriptURL('admin', absolute=1)
container = Container()
header = Table(width="100%")
# If we're in the list subcategory, show the membership list
@@ -809,7 +813,7 @@ def membership_options(mlist, subcat, cgidata, doc, form):
keys.sort()
bucket = keys[0]
members = buckets[bucket]
- action = mlist.GetScriptURL('admin') + '/members?letter=%s' % bucket
+ action = adminurl + '/members?letter=%s' % bucket
if len(members) <= chunksz:
form.set_action(action)
else:
@@ -845,7 +849,7 @@ def membership_options(mlist, subcat, cgidata, doc, form):
for letter in digits + lowercase:
if not buckets.get(letter):
continue
- url = mlist.GetScriptURL('admin') + '/members?letter=%s' % letter
+ url = adminurl + '/members?letter=%s' % letter
if letter == bucket:
show = Bold('[%s]' % letter.upper()).Format()
else:
@@ -859,7 +863,8 @@ def membership_options(mlist, subcat, cgidata, doc, form):
bgcolor=mm_cfg.WEB_ADMINITEM_COLOR)
usertable.AddRow([Center(h) for h in (_('unsub'),
_('member address
member name'),
- _('mod'), _('hide'), _('nomail'),
+ _('mod'), _('hide'),
+ _('nomail
[reason]'),
_('ack'), _('not metoo'),
_('digest'), _('plain'),
_('language'))])
@@ -872,6 +877,12 @@ def membership_options(mlist, subcat, cgidata, doc, form):
names = filter(None, [mlist.getMemberName(s) for s in members])
# Make the name field at least as long as the longest email address
longest = max([len(s) for s in names + members])
+ # Abbreviations for delivery status details
+ ds_abbrevs = {MemberAdaptor.UNKNOWN : _('?'),
+ MemberAdaptor.BYUSER : _('U'),
+ MemberAdaptor.BYADMIN : _('A'),
+ MemberAdaptor.BYBOUNCE: _('B'),
+ }
# Now populate the rows
for addr in members:
link = Link(mlist.GetOptionsURL(addr, obscure=1),
@@ -895,13 +906,16 @@ def membership_options(mlist, subcat, cgidata, doc, form):
box = CheckBox('%s_mod' % addr, value, checked)
cells.append(Center(box).Format())
for opt in ('hide', 'nomail', 'ack', 'notmetoo'):
+ extra = ''
if opt == 'nomail':
- if mlist.getDeliveryStatus(addr) == MemberAdaptor.ENABLED:
+ status = mlist.getDeliveryStatus(addr)
+ if status == MemberAdaptor.ENABLED:
value = 'off'
checked = 0
else:
value = 'on'
checked = 1
+ extra = '[%s]' % ds_abbrevs[status]
elif mlist.getMemberOption(addr, option_info[opt]):
value = 'on'
checked = 1
@@ -909,7 +923,7 @@ def membership_options(mlist, subcat, cgidata, doc, form):
value = 'off'
checked = 0
box = CheckBox('%s_%s' % (addr, opt), value, checked)
- cells.append(Center(box).Format())
+ cells.append(Center(box.Format() + extra))
# This code is less efficient than the original which did a has_key on
# the underlying dictionary attribute. This version is slower and
# less memory efficient. It points to a new MemberAdaptor interface
@@ -947,7 +961,20 @@ def membership_options(mlist, subcat, cgidata, doc, form):
legend.AddItem(
_("""hide -- Is the member's address concealed on
the list of subscribers?"""))
- legend.AddItem(_('nomail -- Is delivery to the member disabled?'))
+ legend.AddItem(_(
+ """nomail -- Is delivery to the member disabled? If so, an
+ abbreviation will be given describing the reason for the disabled
+ delivery:
+
') + container.AddItem( + Link(adminurl + '/members/list', + _('Click here to hide the legend for this table.'))) + else: + container.AddItem( + Link(adminurl + '/members/list?legend=yes', + _('Click here to include the legend for this table.'))) container.AddItem(Center(usertable)) # There may be additional chunks if chunkindex is not None: buttons = [] - url = mlist.GetScriptURL('admin') + '/members?letter=%s&' % bucket + url = adminurl + '/members?%sletter=%s&' % (addlegend, bucket) footer = _('''
To view more members, click on the appropriate range listed below:''') chunkmembers = buckets[bucket] -- cgit v1.2.3-70-g09d2