[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