~msapiro/mailman/topics

« back to all changes in this revision

Viewing changes to Mailman/Cgi/admindb.py

  • Committer: Mark Sapiro
  • Date: 2013-07-12 22:47:18 UTC
  • mfrom: (1006.4.1 2.2)
  • mto: This revision was merged to the branch mainline in revision 1022.
  • Revision ID: mark@msapiro.net-20130712224718-4kwab1w29j331onr
- The admindb summary of held messages now has a set of radio buttons to
  select how the held messages are sorted and grouped for display.

Show diffs side-by-side

added added

removed removed

Lines of Context:
50
50
 
51
51
EXCERPT_HEIGHT = 10
52
52
EXCERPT_WIDTH = 76
 
53
SSENDER = 0
 
54
SSENDERTIME = 1
 
55
STIME = 2
 
56
ssort = SSENDER
53
57
 
54
58
 
55
59
 
56
 
def helds_by_sender(mlist):
 
60
def helds_by_skey(mlist, ssort=SSENDER):
57
61
    heldmsgs = mlist.GetHeldMessageIds()
58
 
    bysender = {}
 
62
    byskey = {}
59
63
    for id in heldmsgs:
 
64
        ptime = mlist.GetRecord(id)[0]
60
65
        sender = mlist.GetRecord(id)[1]
61
 
        bysender.setdefault(sender, []).append(id)
62
 
    return bysender
 
66
        if ssort in (SSENDER, SSENDERTIME):
 
67
            skey = (0, sender)
 
68
        else:
 
69
            skey = (ptime, sender)
 
70
        byskey.setdefault(skey, []).append((ptime, id))
 
71
    # Sort groups by time
 
72
    for k, v in byskey.items():
 
73
        if len(v) > 1:
 
74
            v.sort()
 
75
            byskey[k] = v
 
76
        if ssort == SSENDERTIME:
 
77
            # Rekey with time
 
78
            newkey = (v[0][0], k[1])
 
79
            del byskey[k]
 
80
            byskey[newkey] = v
 
81
    return byskey
63
82
 
64
83
 
65
84
def hacky_radio_buttons(btnname, labels, values, defaults, spacing=3):
76
95
 
77
96
 
78
97
def main():
 
98
    global ssort
79
99
    # Figure out which list is being requested
80
100
    parts = Utils.GetPathPieces()
81
101
    if not parts:
253
273
                                       raw=1, mlist=mlist))
254
274
            num = show_pending_subs(mlist, form)
255
275
            num += show_pending_unsubs(mlist, form)
256
 
            num += show_helds_overview(mlist, form)
 
276
            num += show_helds_overview(mlist, form, ssort)
257
277
            addform = num > 0
258
278
        # Finish up the document, adding buttons to the form
259
279
        if addform:
402
422
 
403
423
 
404
424
 
405
 
def show_helds_overview(mlist, form):
406
 
    # Sort the held messages by sender
407
 
    bysender = helds_by_sender(mlist)
408
 
    if not bysender:
 
425
def show_helds_overview(mlist, form, ssort=SSENDER):
 
426
    # Sort the held messages.
 
427
    byskey = helds_by_skey(mlist, ssort)
 
428
    if not byskey:
409
429
        return 0
410
430
    form.AddItem('<hr>')
411
431
    form.AddItem(Center(Header(2, _('Held Messages'))))
 
432
    # Add the sort sequence choices
 
433
    form.AddItem(Center(_('Show this list grouped/sorted by')))
 
434
    form.AddItem(Center(hacky_radio_buttons(
 
435
            'summary_sort',
 
436
            (_('sender/sender'), _('sender/time'), _('ungrouped/time')),
 
437
            (SSENDER, SSENDERTIME, STIME),
 
438
            (ssort == SSENDER, ssort == SSENDERTIME, ssort == STIME))))
412
439
    # Add the by-sender overview tables
413
440
    admindburl = mlist.GetScriptURL('admindb', absolute=1)
414
441
    table = Table(border=0)
415
442
    form.AddItem(table)
416
 
    senders = bysender.keys()
417
 
    senders.sort()
418
 
    for sender in senders:
 
443
    skeys = byskey.keys()
 
444
    skeys.sort()
 
445
    for skey in skeys:
 
446
        sender = skey[1]
419
447
        qsender = quote_plus(sender)
420
448
        esender = Utils.websafe(sender)
421
449
        senderurl = admindburl + '?sender=' + qsender
499
527
        right.AddCellInfo(right.GetCurrentRowIndex(), 0, colspan=2)
500
528
        right.AddRow(['&nbsp;', '&nbsp;'])
501
529
        counter = 1
502
 
        for id in bysender[sender]:
 
530
        for ptime, id in byskey[skey]:
503
531
            info = mlist.GetRecord(id)
504
532
            ptime, sender, subject, reason, filename, msgdata = info
505
533
            # BAW: This is really the size of the message pickle, which should
540
568
 
541
569
 
542
570
def show_sender_requests(mlist, form, sender):
543
 
    bysender = helds_by_sender(mlist)
544
 
    if not bysender:
 
571
    byskey = helds_by_skey(mlist, SSENDER)
 
572
    if not byskey:
545
573
        return
546
 
    sender_ids = bysender.get(sender)
 
574
    sender_ids = byskey.get((0, sender))
547
575
    if sender_ids is None:
548
576
        # BAW: should we print an error message?
549
577
        return
 
578
    sender_ids = [x[1] for x in sender_ids]
550
579
    total = len(sender_ids)
551
580
    count = 1
552
581
    for id in sender_ids:
709
738
 
710
739
 
711
740
def process_form(mlist, doc, cgidata):
 
741
    global ssort
712
742
    senderactions = {}
713
743
    badaddrs = []
714
744
    # Sender-centric actions
730
760
        discardalldefersp = cgidata.getvalue('discardalldefersp', 0)
731
761
    except ValueError:
732
762
        discardalldefersp = 0
 
763
    # Get the summary sequence
 
764
    ssort = int(cgidata.getvalue('summary_sort', SSENDER))
733
765
    for sender in senderactions.keys():
734
766
        actions = senderactions[sender]
735
767
        # Handle what to do about all this sender's held messages
744
776
            preserve = actions.get('senderpreserve', 0)
745
777
            forward = actions.get('senderforward', 0)
746
778
            forwardaddr = actions.get('senderforwardto', '')
747
 
            bysender = helds_by_sender(mlist)
748
 
            for id in bysender.get(sender, []):
 
779
            byskey = helds_by_skey(mlist, SSENDER)
 
780
            for ptime, id in byskey.get((0, sender), []):
749
781
                if id not in senderactions[sender]['message_ids']:
750
782
                    # It arrived after the page was displayed. Skip it.
751
783
                    continue