Skip to content

Commit 864aec7

Browse files
committed
Modernize HTML generation in Python codebase and templates to use HTML5, semantic tags, and modern CSS
1 parent 175f9e3 commit 864aec7

925 files changed

Lines changed: 98137 additions & 42092 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Mailman/Archiver/HyperArch.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -840,12 +840,12 @@ def html_TOC_entry(self, arch):
840840
if os.path.exists(gzfile):
841841
file = gzfile
842842
url = arch + '.txt.gz'
843-
templ = '<td><A href="%(url)s">[ ' + _('Gzip\'d Text%(sz)s') \
843+
templ = '<td role="cell"><a href="%(url)s" role="link">[ ' + _('Gzip\'d Text%(sz)s') \
844844
+ ']</a></td>'
845845
elif os.path.exists(txtfile):
846846
file = txtfile
847847
url = arch + '.txt'
848-
templ = '<td><A href="%(url)s">[ ' + _('Text%(sz)s') + ']</a></td>'
848+
templ = '<td role="cell"><a href="%(url)s" role="link">[ ' + _('Text%(sz)s') + ']</a></td>'
849849
else:
850850
# neither found?
851851
file = None

Mailman/Cgi/admin.py

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -694,9 +694,11 @@ def add_options_table_item(mlist, category, subcat, table, item, detailsp=1):
694694
val = get_item_gui_value(mlist, category, kind, varname, params, extra)
695695
table.AddRow([descr, val])
696696
table.AddCellInfo(table.GetCurrentRowIndex(), 0,
697-
bgcolor=mm_cfg.WEB_ADMINITEM_COLOR)
697+
style=f'background-color: {mm_cfg.WEB_ADMINITEM_COLOR}',
698+
role='cell')
698699
table.AddCellInfo(table.GetCurrentRowIndex(), 1,
699-
bgcolor=mm_cfg.WEB_ADMINITEM_COLOR)
700+
style=f'background-color: {mm_cfg.WEB_ADMINITEM_COLOR}',
701+
role='cell')
700702

701703
def get_item_characteristics(record):
702704
# Break out the components of an item description from its description
@@ -832,7 +834,7 @@ def makebox(i, name, pattern, desc, empty=False, table=table):
832834
selected=1),
833835
])
834836
table.AddRow(['<hr>'])
835-
table.AddCellInfo(table.GetCurrentRowIndex(), 0, colspan=2)
837+
table.AddCellInfo(table.GetCurrentRowIndex(), 0, colspan=2, role='cell')
836838
# Now for each element in the existing data, create a widget
837839
i = 1
838840
data = getattr(mlist, varname)
@@ -877,32 +879,20 @@ def makebox(i, pattern, action, empty=False, table=table):
877879
rows=4, cols=30, wrap='off')])
878880
values = [mm_cfg.DEFER, mm_cfg.HOLD, mm_cfg.REJECT,
879881
mm_cfg.DISCARD, mm_cfg.ACCEPT]
880-
try:
881-
checked = values.index(action)
882-
except ValueError:
883-
checked = 0
884-
radio = RadioButtonArray(
885-
actiontag,
886-
(_('Defer'), _('Hold'), _('Reject'),
887-
_('Discard'), _('Accept')),
888-
values=values,
889-
checked=checked).Format()
890-
table.AddRow([Label(_('Action:')), radio])
882+
legends = [_('Defer'), _('Hold'), _('Reject'),
883+
_('Discard'), _('Accept')]
884+
table.AddRow([Label(_('Action:')),
885+
SelectOptions(actiontag, values, legends,
886+
selected=values.index(action))])
891887
if not empty:
892-
table.AddRow([SubmitButton(addtag, _('Add new item...')),
888+
table.AddRow([SubmitButton(addtag, _('Add new rule...')),
893889
SelectOptions(wheretag, ('before', 'after'),
894890
(_('...before this one.'),
895891
_('...after this one.')),
896892
selected=1),
897893
])
898-
# BAW: IWBNI we could disable the up and down buttons for the
899-
# first and last item respectively, but it's not easy to know
900-
# which is the last item, so let's not worry about that for
901-
# now.
902-
table.AddRow([SubmitButton(uptag, _('Move rule up')),
903-
SubmitButton(downtag, _('Move rule down'))])
904894
table.AddRow(['<hr>'])
905-
table.AddCellInfo(table.GetCurrentRowIndex(), 0, colspan=2)
895+
table.AddCellInfo(table.GetCurrentRowIndex(), 0, colspan=2, role='cell')
906896
# Now for each element in the existing data, create a widget
907897
i = 1
908898
data = getattr(mlist, varname)

Mailman/Cgi/admindb.py

Lines changed: 52 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -286,11 +286,18 @@ def show_pending_subs(mlist, form):
286286
return 0
287287
form.AddItem('<hr>')
288288
form.AddItem(Center(Header(2, _('Subscription Requests'))))
289-
table = Table(border=2)
289+
table = Table(
290+
role="table",
291+
aria_label=_("Pending Subscription Requests"),
292+
style="border: 1px solid #ccc; border-collapse: collapse; width: 100%;"
293+
)
290294
table.AddRow([Center(Bold(_('Address/name/time'))),
291295
Center(Bold(_('Your decision'))),
292296
Center(Bold(_('Reason for refusal')))
293297
])
298+
table.AddCellInfo(table.GetCurrentRowIndex(), 0, role="columnheader", scope="col")
299+
table.AddCellInfo(table.GetCurrentRowIndex(), 1, role="columnheader", scope="col")
300+
table.AddCellInfo(table.GetCurrentRowIndex(), 2, role="columnheader", scope="col")
294301
# Alphabetical order by email address
295302
byaddrs = {}
296303
for id in pendingsubs:
@@ -349,11 +356,18 @@ def show_pending_unsubs(mlist, form):
349356
pendingunsubs = mlist.GetUnsubscriptionIds()
350357
if not pendingunsubs:
351358
return 0
352-
table = Table(border=2)
359+
table = Table(
360+
role="table",
361+
aria_label=_("Pending Unsubscription Requests"),
362+
style="border: 1px solid #ccc; border-collapse: collapse; width: 100%;"
363+
)
353364
table.AddRow([Center(Bold(_('User address/name'))),
354365
Center(Bold(_('Your decision'))),
355366
Center(Bold(_('Reason for refusal')))
356367
])
368+
table.AddCellInfo(table.GetCurrentRowIndex(), 0, role="columnheader", scope="col")
369+
table.AddCellInfo(table.GetCurrentRowIndex(), 1, role="columnheader", scope="col")
370+
table.AddCellInfo(table.GetCurrentRowIndex(), 2, role="columnheader", scope="col")
357371
# Alphabetical order by email address
358372
byaddrs = {}
359373
for id in pendingunsubs:
@@ -435,7 +449,11 @@ def show_helds_overview(mlist, form, ssort=SSENDER):
435449
(ssort == SSENDER, ssort == SSENDERTIME, ssort == STIME))))
436450
# Add the by-sender overview tables
437451
admindburl = mlist.GetScriptURL('admindb', absolute=1)
438-
table = Table(border=0)
452+
table = Table(
453+
role="table",
454+
aria_label=_("Held Messages Overview"),
455+
border=0
456+
)
439457
form.AddItem(table)
440458
skeys = list(byskey.keys())
441459
skeys.sort()
@@ -445,40 +463,48 @@ def show_helds_overview(mlist, form, ssort=SSENDER):
445463
esender = Utils.websafe(sender)
446464
senderurl = admindburl + '?sender=' + qsender
447465
# The encompassing sender table
448-
stable = Table(border=1)
466+
stable = Table(
467+
role="table",
468+
aria_label=_("Messages from {sender}").format(sender=esender),
469+
border=1
470+
)
449471
stable.AddRow([Center(Bold(_('From:')).Format() + esender)])
450-
stable.AddCellInfo(stable.GetCurrentRowIndex(), 0, colspan=2)
451-
left = Table(border=0)
472+
stable.AddCellInfo(stable.GetCurrentRowIndex(), 0, colspan=2, role="cell")
473+
left = Table(
474+
role="table",
475+
aria_label=_("Actions for messages from {sender}").format(sender=esender),
476+
border=0
477+
)
452478
left.AddRow([_('Action to take on all these held messages:')])
453-
left.AddCellInfo(left.GetCurrentRowIndex(), 0, colspan=2)
479+
left.AddCellInfo(left.GetCurrentRowIndex(), 0, colspan=2, role="cell")
454480
btns = hacky_radio_buttons(
455481
'senderaction-' + qsender,
456482
(_('Defer'), _('Accept'), _('Reject'), _('Discard')),
457483
(mm_cfg.DEFER, mm_cfg.APPROVE, mm_cfg.REJECT, mm_cfg.DISCARD),
458484
(1, 0, 0, 0))
459485
left.AddRow([btns])
460-
left.AddCellInfo(left.GetCurrentRowIndex(), 0, colspan=2)
486+
left.AddCellInfo(left.GetCurrentRowIndex(), 0, colspan=2, role="cell")
461487
left.AddRow([
462488
'<label>' +
463489
CheckBox('senderpreserve-' + qsender, 1).Format() +
464490
'&nbsp;' +
465491
_('Preserve messages for the site administrator') +
466492
'</label>'
467493
])
468-
left.AddCellInfo(left.GetCurrentRowIndex(), 0, colspan=2)
494+
left.AddCellInfo(left.GetCurrentRowIndex(), 0, colspan=2, role="cell")
469495
left.AddRow([
470496
'<label>' +
471497
CheckBox('senderforward-' + qsender, 1).Format() +
472498
'&nbsp;' +
473499
_('Forward messages (individually) to:') +
474500
'</label>'
475501
])
476-
left.AddCellInfo(left.GetCurrentRowIndex(), 0, colspan=2)
502+
left.AddCellInfo(left.GetCurrentRowIndex(), 0, colspan=2, role="cell")
477503
left.AddRow([
478504
TextBox('senderforwardto-' + qsender,
479505
value=mlist.GetOwnerEmail())
480506
])
481-
left.AddCellInfo(left.GetCurrentRowIndex(), 0, colspan=2)
507+
left.AddCellInfo(left.GetCurrentRowIndex(), 0, colspan=2, role="cell")
482508
# If the sender is a member and the message is being held due to a
483509
# moderation bit, give the admin a chance to clear the member's mod
484510
# bit. If this sender is not a member and is not already on one of
@@ -496,7 +522,7 @@ def show_helds_overview(mlist, form, ssort=SSENDER):
496522
else:
497523
left.AddRow(
498524
[_('<em>The sender is now a member of this list</em>')])
499-
left.AddCellInfo(left.GetCurrentRowIndex(), 0, colspan=2)
525+
left.AddCellInfo(left.GetCurrentRowIndex(), 0, colspan=2, role="cell")
500526
elif sender not in (mlist.accept_these_nonmembers +
501527
mlist.hold_these_nonmembers +
502528
mlist.reject_these_nonmembers +
@@ -508,29 +534,33 @@ def show_helds_overview(mlist, form, ssort=SSENDER):
508534
_(f'Add <b>{esender}</b> to one of these sender filters:') +
509535
'</label>'
510536
])
511-
left.AddCellInfo(left.GetCurrentRowIndex(), 0, colspan=2)
537+
left.AddCellInfo(left.GetCurrentRowIndex(), 0, colspan=2, role="cell")
512538
btns = hacky_radio_buttons(
513539
'senderfilter-' + qsender,
514540
(_('Accepts'), _('Holds'), _('Rejects'), _('Discards')),
515541
(mm_cfg.ACCEPT, mm_cfg.HOLD, mm_cfg.REJECT, mm_cfg.DISCARD),
516542
(0, 0, 0, 1))
517543
left.AddRow([btns])
518-
left.AddCellInfo(left.GetCurrentRowIndex(), 0, colspan=2)
544+
left.AddCellInfo(left.GetCurrentRowIndex(), 0, colspan=2, role="cell")
519545
if sender not in mlist.ban_list:
520546
left.AddRow([
521547
'<label>' +
522548
CheckBox('senderbanp-' + qsender, 1).Format() +
523549
'&nbsp;' +
524550
_(f"""Ban <b>{esender}</b> from ever subscribing to this
525551
mailing list""") + '</label>'])
526-
left.AddCellInfo(left.GetCurrentRowIndex(), 0, colspan=2)
527-
right = Table(border=0)
552+
left.AddCellInfo(left.GetCurrentRowIndex(), 0, colspan=2, role="cell")
553+
right = Table(
554+
role="table",
555+
aria_label=_("Actions for messages from {sender}").format(sender=esender),
556+
border=0
557+
)
528558
right.AddRow([
529559
_(f"""Click on the message number to view the individual
530560
message, or you can """) +
531561
Link(senderurl, _(f'view all messages from {esender}')).Format()
532562
])
533-
right.AddCellInfo(right.GetCurrentRowIndex(), 0, colspan=2)
563+
right.AddCellInfo(right.GetCurrentRowIndex(), 0, colspan=2, role="cell")
534564
right.AddRow(['&nbsp;', '&nbsp;'])
535565
counter = 1
536566
for ptime, id in byskey[skey]:
@@ -553,7 +583,11 @@ def show_helds_overview(mlist, form, ssort=SSENDER):
553583
charset = Utils.GetCharSet(mlist.preferred_language)
554584
dispsubj = format_subject(subject, charset)
555585

556-
t = Table(border=0)
586+
t = Table(
587+
role="table",
588+
aria_label=_("Message {counter}").format(counter=counter),
589+
border=0
590+
)
557591
t.AddRow([Link(admindburl + '?msgid=%d' % id, '[%d]' % counter),
558592
Bold(_('Subject:')),
559593
Utils.websafe(dispsubj)

0 commit comments

Comments
 (0)