Skip to content

Commit 0abebf2

Browse files
feat: add 'IETF Meetings' filter to upcoming meetings page (ietf-tools#4826)
* feat: add 'IETF Meetings' filter to upcoming meetings page * feat: apply 'ietf-meetings' filter to upcoming.ics * fix: also filter upcoming IETF meetings in the graphical calendar * test: update tests to match changes Includes fixing an error in test_upcoming_view_filter_hide_type(). Due to a copy/paste error, it claimed to be testing with a type both shown and hidden but was not actually hiding a type at all.
1 parent 562d5cc commit 0abebf2

5 files changed

Lines changed: 73 additions & 63 deletions

File tree

ietf/meeting/helpers.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,10 @@ def __init__(self, *, single_category=False, **kwargs):
256256
self.special_filters = None
257257
if self._use_legacy_keywords():
258258
self.extra_labels += ('Plenary',) # need this when not using session purpose
259+
self.manual_extra_labels = set()
260+
261+
def add_extra_filter(self, kw):
262+
self.manual_extra_labels.add(kw)
259263

260264
def get_non_area_keywords(self):
261265
"""Get list of any 'non-area' (aka 'special') keywords
@@ -436,13 +440,13 @@ def _legacy_non_group_filters(self, sessions):
436440
def _extra_filters(self):
437441
"""Get list of filters corresponding to self.extra_labels"""
438442
item_source = self.assignments or self.sessions or []
439-
candidates = set(self.extra_labels)
443+
candidates = set(self.extra_labels).union(self.manual_extra_labels)
440444
return self._filter_column(
441445
label=None,
442446
keyword=None,
443447
children=[
444448
self._filter_entry(label=label, keyword=xslugify(label), toggled_by=[], is_bof=False)
445-
for label in candidates if any(
449+
for label in candidates if label in self.manual_extra_labels or any(
446450
# Keep only those that will affect at least one session
447451
[label.lower() in item.filter_keywords for item in item_source]
448452
)]

ietf/meeting/tests_js.py

Lines changed: 40 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1076,9 +1076,9 @@ def advance_month():
10761076
unexpected.add(entry.text)
10771077
advance_month()
10781078

1079-
self.assertEqual(seen, visible_meetings, "Expected calendar entries not shown.")
1080-
self.assertEqual(not_visible, set(), "Hidden calendar entries for expected interim meetings.")
1081-
self.assertEqual(unexpected, set(), "Unexpected calendar entries visible")
1079+
self.assertCountEqual(seen, visible_meetings, "Expected calendar entries not shown.")
1080+
self.assertCountEqual(not_visible, set(), "Hidden calendar entries for expected interim meetings.")
1081+
self.assertCountEqual(unexpected, set(), "Unexpected calendar entries visible")
10821082

10831083
def do_upcoming_view_filter_test(self, querystring, visible_meetings=()):
10841084
self.login()
@@ -1152,102 +1152,85 @@ def test_upcoming_view_default(self):
11521152
ietf_meetings = set(self.all_ietf_meetings())
11531153
self.do_upcoming_view_filter_test('', ietf_meetings.union(self.displayed_interims()))
11541154

1155+
def test_upcoming_view_show_ietf_meetings(self):
1156+
self.do_upcoming_view_filter_test('?show=ietf-meetings', self.all_ietf_meetings())
1157+
11551158
def test_upcoming_view_filter_show_group(self):
11561159
# Show none
1157-
ietf_meetings = set(self.all_ietf_meetings())
1158-
self.do_upcoming_view_filter_test('?show=', ietf_meetings)
1160+
self.do_upcoming_view_filter_test('?show=')
11591161

11601162
# Show one
1161-
self.do_upcoming_view_filter_test('?show=mars',
1162-
ietf_meetings.union(
1163-
self.displayed_interims(groups=['mars'])
1164-
))
1163+
self.do_upcoming_view_filter_test('?show=mars', self.displayed_interims(groups=['mars']))
11651164

11661165
# Show two
1167-
self.do_upcoming_view_filter_test('?show=mars,ames',
1168-
ietf_meetings.union(
1169-
self.displayed_interims(groups=['mars', 'ames'])
1170-
))
1166+
self.do_upcoming_view_filter_test('?show=mars,ames',self.displayed_interims(groups=['mars', 'ames']))
1167+
1168+
# Show two plus ietf-meetings
1169+
self.do_upcoming_view_filter_test(
1170+
'?show=ietf-meetings,mars,ames',
1171+
set(self.all_ietf_meetings()).union(self.displayed_interims(groups=['mars', 'ames']))
1172+
)
11711173

11721174
def test_upcoming_view_filter_show_area(self):
11731175
mars = Group.objects.get(acronym='mars')
11741176
area = mars.parent
1175-
ietf_meetings = set(self.all_ietf_meetings())
1176-
self.do_upcoming_view_filter_test('?show=%s' % area.acronym,
1177-
ietf_meetings.union(
1178-
self.displayed_interims(groups=['mars', 'ames'])
1179-
))
1177+
self.do_upcoming_view_filter_test('?show=%s' % area.acronym, self.displayed_interims(groups=['mars', 'ames']))
11801178

11811179
def test_upcoming_view_filter_show_type(self):
1182-
ietf_meetings = set(self.all_ietf_meetings())
1183-
self.do_upcoming_view_filter_test('?show=plenary',
1184-
ietf_meetings.union(
1185-
self.displayed_interims(groups=['sg'])
1186-
))
1180+
self.do_upcoming_view_filter_test('?show=plenary', self.displayed_interims(groups=['sg']))
11871181

11881182
def test_upcoming_view_filter_hide_group(self):
11891183
mars = Group.objects.get(acronym='mars')
11901184
area = mars.parent
11911185

11921186
# Without anything shown, should see only ietf meetings
1193-
ietf_meetings = set(self.all_ietf_meetings())
1194-
self.do_upcoming_view_filter_test('?hide=mars', ietf_meetings)
1187+
self.do_upcoming_view_filter_test('?hide=mars')
11951188

11961189
# With group shown
1197-
self.do_upcoming_view_filter_test('?show=ames,mars&hide=mars',
1198-
ietf_meetings.union(
1199-
self.displayed_interims(groups=['ames'])
1200-
))
1190+
self.do_upcoming_view_filter_test('?show=ames,mars&hide=mars', self.displayed_interims(groups=['ames']))
12011191
# With area shown
1202-
self.do_upcoming_view_filter_test('?show=%s&hide=mars' % area.acronym,
1203-
ietf_meetings.union(
1204-
self.displayed_interims(groups=['ames'])
1205-
))
1206-
1192+
self.do_upcoming_view_filter_test('?show=%s&hide=mars' % area.acronym, self.displayed_interims(groups=['ames']))
12071193
# With type shown
1208-
self.do_upcoming_view_filter_test('?show=plenary&hide=sg',
1209-
ietf_meetings)
1194+
self.do_upcoming_view_filter_test('?show=plenary&hide=sg')
12101195

12111196
def test_upcoming_view_filter_hide_area(self):
12121197
mars = Group.objects.get(acronym='mars')
12131198
area = mars.parent
12141199

1215-
# Without anything shown, should see only ietf meetings
1216-
ietf_meetings = set(self.all_ietf_meetings())
1217-
self.do_upcoming_view_filter_test('?hide=%s' % area.acronym, ietf_meetings)
1200+
# Without anything shown, should see nothing
1201+
self.do_upcoming_view_filter_test('?hide=%s' % area.acronym)
12181202

12191203
# With area shown
1220-
self.do_upcoming_view_filter_test('?show=%s&hide=%s' % (area.acronym, area.acronym),
1221-
ietf_meetings)
1204+
self.do_upcoming_view_filter_test('?show=%s&hide=%s' % (area.acronym, area.acronym))
12221205

12231206
# With group shown
1224-
self.do_upcoming_view_filter_test('?show=mars&hide=%s' % area.acronym, ietf_meetings)
1207+
self.do_upcoming_view_filter_test('?show=mars&hide=%s' % area.acronym)
12251208

12261209
# With type shown
1227-
self.do_upcoming_view_filter_test('?show=regular&hide=%s' % area.acronym, ietf_meetings)
1210+
self.do_upcoming_view_filter_test('?show=regular&hide=%s' % area.acronym)
12281211

1229-
def test_upcoming_view_filter_hide_type(self):
1230-
mars = Group.objects.get(acronym='mars')
1231-
area = mars.parent
1212+
# with IETF meetings shown
1213+
self.do_upcoming_view_filter_test('?show=ietf-meetings,hide=%s' % area.acronym, self.all_ietf_meetings())
12321214

1233-
# Without anything shown, should see only ietf meetings
1234-
ietf_meetings = set(self.all_ietf_meetings())
1235-
self.do_upcoming_view_filter_test('?hide=regular', ietf_meetings)
1215+
def test_upcoming_view_filter_hide_type(self):
1216+
# Without anything shown, should see nothing
1217+
self.do_upcoming_view_filter_test('?hide=regular')
12361218

12371219
# With group shown
1238-
self.do_upcoming_view_filter_test('?show=mars&hide=regular', ietf_meetings)
1220+
self.do_upcoming_view_filter_test('?show=mars&hide=regular')
12391221

12401222
# With type shown
1241-
self.do_upcoming_view_filter_test('?show=plenary,regular&hide=%s' % area.acronym,
1242-
ietf_meetings.union(
1243-
self.displayed_interims(groups=['sg'])
1244-
))
1223+
self.do_upcoming_view_filter_test(
1224+
'?show=plenary,regular&hide=regular',
1225+
self.displayed_interims(groups=['sg'])
1226+
)
1227+
1228+
# With interim-meetings shown
1229+
self.do_upcoming_view_filter_test('?show=plenary,regular&hide=regular', self.displayed_interims(groups=['sg']))
12451230

12461231
def test_upcoming_view_filter_whitespace(self):
12471232
"""Whitespace in filter lists should be ignored"""
1248-
meetings = set(self.all_ietf_meetings())
1249-
meetings.update(self.displayed_interims(groups=['mars']))
1250-
self.do_upcoming_view_filter_test('?show=mars , ames &hide= ames', meetings)
1233+
self.do_upcoming_view_filter_test('?show=mars , ames &hide= ames', self.displayed_interims(groups=['mars']))
12511234

12521235
def test_upcoming_view_time_zone_selection(self):
12531236
def _assert_interim_tz_correct(sessions, tz):

ietf/meeting/tests_views.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4507,8 +4507,16 @@ def test_upcoming_ical_filter(self):
45074507
# Just a quick check of functionality - details tested by test_js.InterimTests
45084508
make_meeting_test_data(create_interims=True)
45094509
url = urlreverse("ietf.meeting.views.upcoming_ical")
4510+
45104511
r = self.client.get(url + '?show=mars')
4512+
self.assertEqual(r.status_code, 200)
4513+
assert_ical_response_is_valid(self, r,
4514+
expected_event_summaries=[
4515+
'mars - Martian Special Interest Group',
4516+
],
4517+
expected_event_count=1)
45114518

4519+
r = self.client.get(url + '?show=mars,ietf-meetings')
45124520
self.assertEqual(r.status_code, 200)
45134521
assert_ical_response_is_valid(self, r,
45144522
expected_event_summaries=[

ietf/meeting/views.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3456,6 +3456,10 @@ def upcoming(request):
34563456
# Set up for agenda filtering - only one filter_category here
34573457
AgendaKeywordTagger(sessions=interim_sessions).apply()
34583458
filter_organizer = AgendaFilterOrganizer(sessions=interim_sessions, single_category=True)
3459+
# Allow filtering to show only IETF Meetings. This adds a button labeled "IETF Meetings" to the
3460+
# "Other" column of the filter UI. When enabled, this adds the keyword "ietf-meetings" to the "show"
3461+
# filter list. The IETF meetings are explicitly labeled with this keyword in upcoming.html.
3462+
filter_organizer.add_extra_filter('IETF Meetings')
34593463

34603464
entries = list(ietf_meetings)
34613465
entries.extend(list(interim_sessions))
@@ -3544,9 +3548,14 @@ def upcoming_ical(request):
35443548
a.session = sessions.get(a.session_id) or a.session
35453549
a.session.ical_status = ical_session_status(a)
35463550

3547-
# handle IETFs separately
3548-
ietfs = [m for m in meetings if m.type_id == 'ietf']
3549-
preprocess_meeting_important_dates(ietfs)
3551+
# Handle IETFs separately. Manually apply the 'ietf-meetings' filter.
3552+
if filter_params is None or (
3553+
'ietf-meetings' in filter_params['show'] and 'ietf-meetings' not in filter_params['hide']
3554+
):
3555+
ietfs = [m for m in meetings if m.type_id == 'ietf']
3556+
preprocess_meeting_important_dates(ietfs)
3557+
else:
3558+
ietfs = []
35503559

35513560
meeting_vtz = {meeting.vtimezone() for meeting in meetings}
35523561
meeting_vtz.discard(None)

ietf/templates/meeting/upcoming.html

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,12 @@ <h1>Upcoming Meetings</h1>
4646
<tbody>
4747
{% for entry in entries %}
4848
<tr class="entry"
49-
{% if entry|classname == 'Session' %}data-filter-keywords="{{ entry.filter_keywords|join:',' }}"{% endif %}>
49+
{% if entry|classname == 'Session' %}
50+
data-filter-keywords="{{ entry.filter_keywords|join:',' }}"
51+
{% elif entry|classname == 'Meeting' %}
52+
data-filter-keywords="ietf-meetings"
53+
{% endif %}
54+
>
5055
{% if entry|classname == 'Meeting' %}
5156
{% with meeting=entry %}
5257
<td class="meeting-time"
@@ -122,6 +127,7 @@ <h3 class="my-3">No upcoming meetings</h3>
122127
{% with meeting=entry %}
123128
{
124129
ietf_meeting_number: '{{ meeting.number }}',
130+
filter_keywords: ['ietf-meetings'],
125131
start_moment: moment.tz('{{meeting.date}}', '{{ meeting.time_zone }}').startOf('day'),
126132
end_moment: moment.tz('{{meeting.end_date}}', '{{ meeting.time_zone }}').endOf('day'),
127133
url: '{% url 'agenda' num=meeting.number %}'

0 commit comments

Comments
 (0)