[Mailman-Users] Ordering of messages in the moderation queue by date?
Mark Sapiro
mark at msapiro.net
Thu Jun 20 23:57:28 CEST 2013
On 06/19/2013 04:56 PM, Mark Sapiro wrote:
> On 06/19/2013 03:02 PM, Mark Sapiro wrote:
>>
>> Attached is a preliminary patch to Mailman/Cgi/admindb.py.
>
>
> Sorry, the patch was removed by content filtering. It should make it
> this time.
It would have been better if I hadn't posted that one. It had some bugs.
This one is a bit more thoroughly tested. It also has a set of radio
buttons to select the sequence which can be 'grouped and sorted by
sender', 'grouped by sender and sorted by time' or 'ungrouped and sorted
by time'.
Feedback on this would be appreciated.
--
Mark Sapiro <mark at msapiro.net> The highway is for gamblers,
San Francisco Bay Area, California better use your sense - B. Dylan
-------------- next part --------------
--- ../2.1/Mailman/Cgi/admindb.py 2013-06-07 13:36:03.000000000 -0700
+++ Mailman/Cgi/admindb.py 2013-06-20 14:06:44.975035475 -0700
@@ -50,16 +50,35 @@
EXCERPT_HEIGHT = 10
EXCERPT_WIDTH = 76
+SSENDER = 0
+SSENDERTIME = 1
+STIME = 2
+ssort = SSENDER
-def helds_by_sender(mlist):
+def helds_by_skey(mlist, ssort=SSENDER):
heldmsgs = mlist.GetHeldMessageIds()
- bysender = {}
+ byskey = {}
for id in heldmsgs:
+ ptime = mlist.GetRecord(id)[0]
sender = mlist.GetRecord(id)[1]
- bysender.setdefault(sender, []).append(id)
- return bysender
+ if ssort in (SSENDER, SSENDERTIME):
+ skey = (0, sender)
+ else:
+ skey = (ptime, sender)
+ byskey.setdefault(skey, []).append((ptime, id))
+ # Sort groups by time
+ for k, v in byskey.items():
+ if len(v) > 1:
+ v.sort()
+ byskey[k] = v
+ if ssort == SSENDERTIME:
+ # Rekey with time
+ newkey = (v[0][0], k[1])
+ del byskey[k]
+ byskey[newkey] = v
+ return byskey
def hacky_radio_buttons(btnname, labels, values, defaults, spacing=3):
@@ -76,6 +95,7 @@
def main():
+ global ssort
# Figure out which list is being requested
parts = Utils.GetPathPieces()
if not parts:
@@ -253,7 +273,7 @@
raw=1, mlist=mlist))
num = show_pending_subs(mlist, form)
num += show_pending_unsubs(mlist, form)
- num += show_helds_overview(mlist, form)
+ num += show_helds_overview(mlist, form, ssort)
addform = num > 0
# Finish up the document, adding buttons to the form
if addform:
@@ -402,20 +422,28 @@
-def show_helds_overview(mlist, form):
- # Sort the held messages by sender
- bysender = helds_by_sender(mlist)
- if not bysender:
+def show_helds_overview(mlist, form, ssort=SSENDER):
+ # Sort the held messages.
+ byskey = helds_by_skey(mlist, ssort)
+ if not byskey:
return 0
form.AddItem('<hr>')
form.AddItem(Center(Header(2, _('Held Messages'))))
+ # Add the sort sequence choices
+ form.AddItem(Center(_('Show this list grouped/sorted by')))
+ form.AddItem(Center(hacky_radio_buttons(
+ 'summary_sort',
+ (_('sender/sender'), _('sender/time'), _('ungrouped/time')),
+ (SSENDER, SSENDERTIME, STIME),
+ (ssort == SSENDER, ssort == SSENDERTIME, ssort == STIME))))
# Add the by-sender overview tables
admindburl = mlist.GetScriptURL('admindb', absolute=1)
table = Table(border=0)
form.AddItem(table)
- senders = bysender.keys()
- senders.sort()
- for sender in senders:
+ skeys = byskey.keys()
+ skeys.sort()
+ for skey in skeys:
+ sender = skey[1]
qsender = quote_plus(sender)
esender = Utils.websafe(sender)
senderurl = admindburl + '?sender=' + qsender
@@ -499,7 +527,7 @@
right.AddCellInfo(right.GetCurrentRowIndex(), 0, colspan=2)
right.AddRow([' ', ' '])
counter = 1
- for id in bysender[sender]:
+ for ptime, id in byskey[skey]:
info = mlist.GetRecord(id)
ptime, sender, subject, reason, filename, msgdata = info
# BAW: This is really the size of the message pickle, which should
@@ -540,10 +568,10 @@
def show_sender_requests(mlist, form, sender):
- bysender = helds_by_sender(mlist)
- if not bysender:
+ byskey = helds_by_skey(mlist, SSENDER)
+ if not byskey:
return
- sender_ids = bysender.get(sender)
+ sender_ids = [x[1] for x in byskey.get((0, sender))]
if sender_ids is None:
# BAW: should we print an error message?
return
@@ -709,6 +737,7 @@
def process_form(mlist, doc, cgidata):
+ global ssort
senderactions = {}
badaddrs = []
# Sender-centric actions
@@ -730,6 +759,8 @@
discardalldefersp = cgidata.getvalue('discardalldefersp', 0)
except ValueError:
discardalldefersp = 0
+ # Get the summary sequence
+ ssort = int(cgidata.getvalue('summary_sort', SSENDER))
for sender in senderactions.keys():
actions = senderactions[sender]
# Handle what to do about all this sender's held messages
@@ -744,8 +775,8 @@
preserve = actions.get('senderpreserve', 0)
forward = actions.get('senderforward', 0)
forwardaddr = actions.get('senderforwardto', '')
- bysender = helds_by_sender(mlist)
- for id in bysender.get(sender, []):
+ byskey = helds_by_skey(mlist, SSENDER)
+ for id in [x[1] for x in byskey.get((0, sender), [])]:
if id not in senderactions[sender]['message_ids']:
# It arrived after the page was displayed. Skip it.
continue
More information about the Mailman-Users
mailing list