From 8de5ff40a955826371acc364266fe1e75a3e4d0d Mon Sep 17 00:00:00 2001 From: nouralmaa Date: Fri, 13 Feb 2026 15:47:16 +0000 Subject: [PATCH 1/5] feat: cancel interim meeting at materials page --- ietf/templates/meeting/interim_request_details.html | 8 -------- ietf/templates/meeting/session_details_panel.html | 6 ++++++ 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/ietf/templates/meeting/interim_request_details.html b/ietf/templates/meeting/interim_request_details.html index 89545d14e56..d0f4b4213c0 100644 --- a/ietf/templates/meeting/interim_request_details.html +++ b/ietf/templates/meeting/interim_request_details.html @@ -126,14 +126,6 @@

Interim Meeting Request Details

Skip announcement {% endif %} - {% if can_edit %} - {% if status_slug == 'apprw' or status_slug == 'scheda' or status_slug == 'sched' %} - - Cancel meeting - - {% endif %} - {% endif %} {% if status_slug == "apprw" %} Back diff --git a/ietf/templates/meeting/session_details_panel.html b/ietf/templates/meeting/session_details_panel.html index 7c52ac0b4ab..1ac741a9e07 100644 --- a/ietf/templates/meeting/session_details_panel.html +++ b/ietf/templates/meeting/session_details_panel.html @@ -38,6 +38,12 @@

Meeting details {% endif %} + {% if user|has_role:"Secretariat" or meeting.type.slug == 'interim' %} + + Cancel meeting + + {% endif %} {% if not session.type_counter.agenda %}
This session does not yet have an agenda.
From d5442e32e0fcf31d60f51098a6a73e253a8e4726 Mon Sep 17 00:00:00 2001 From: nouralmaa Date: Mon, 16 Feb 2026 14:55:11 +0000 Subject: [PATCH 2/5] fix: adjust button view for future interims --- .../templates/meeting/session_details_panel.html | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/ietf/templates/meeting/session_details_panel.html b/ietf/templates/meeting/session_details_panel.html index 1ac741a9e07..cbb3ad054a7 100644 --- a/ietf/templates/meeting/session_details_panel.html +++ b/ietf/templates/meeting/session_details_panel.html @@ -38,12 +38,16 @@

Meeting details {% endif %} - {% if user|has_role:"Secretariat" or meeting.type.slug == 'interim' %} - - Cancel meeting - - {% endif %} + {% with meeting_status.slug as status_slug %} + {% if meeting.type.slug == 'interim' %} + {% if future %} + + Cancel meeting + + {% endif %} + {% endif %} + {% endwith %} {% if not session.type_counter.agenda %}
This session does not yet have an agenda.
From 078174739f4f89ad62c86854d4a0997b91405c2c Mon Sep 17 00:00:00 2001 From: nouralmaa Date: Mon, 16 Feb 2026 14:56:02 +0000 Subject: [PATCH 3/5] tests: add interim tests --- ietf/meeting/tests_views.py | 49 +++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/ietf/meeting/tests_views.py b/ietf/meeting/tests_views.py index b94229d9693..180879acede 100644 --- a/ietf/meeting/tests_views.py +++ b/ietf/meeting/tests_views.py @@ -5889,8 +5889,37 @@ def test_interim_request_details_announcement(self): q = PyQuery(r.content) self.assertEqual(len(q("a.btn:contains('nnounce')")),2) - def test_interim_request_details_cancel(self): - """Test access to cancel meeting / session features""" + def test_interim_meeting_cancel(self): + make_interim_test_data() + mars_sessions = Session.objects.with_current_status( + ).filter( + meeting__type='interim', + group__acronym='mars', + current_status="sched" + ) + meeting = mars_sessions.first().meeting + # All these roles should have access to cancel the request + usernames_and_passwords = ( + ('marschairman', 'marschairman+password'), + ('secretary', 'secretary+password') + ) + url = urlreverse('ietf.meeting.views.session_details', + kwargs={'num': meeting.number, 'acronym': 'mars'}) + + for username, password in usernames_and_passwords: + self.client.login(username=username, password=password) + r = self.client.get(url) + self.assertEqual(r.status_code, 200) + q = PyQuery(r.content) + cancel_meeting_btns = q("a.btn:contains('Cancel meeting')") + self.assertEqual(len(cancel_meeting_btns), 1, + 'Should be exactly one cancel meeting button for user %s' % username) + self.assertEqual(cancel_meeting_btns.eq(0).attr('href'), + urlreverse('ietf.meeting.views.interim_request_cancel', + kwargs={'number': meeting.number}), + 'Cancel meeting points to wrong URL') + + def test_interim_session_cancel(self): make_interim_test_data() mars_sessions = Session.objects.with_current_status( ).filter( @@ -5915,14 +5944,6 @@ def test_interim_request_details_cancel(self): r = self.client.get(url) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) - cancel_meeting_btns = q("a.btn:contains('Cancel meeting')") - self.assertEqual(len(cancel_meeting_btns), 1, - 'Should be exactly one cancel meeting button for user %s' % username) - self.assertEqual(cancel_meeting_btns.eq(0).attr('href'), - urlreverse('ietf.meeting.views.interim_request_cancel', - kwargs={'number': meeting.number}), - 'Cancel meeting points to wrong URL') - self.assertEqual(len(q("a.btn:contains('Cancel Session')")), 0, 'Should be no cancel session buttons for user %s' % username) @@ -5939,14 +5960,6 @@ def test_interim_request_details_cancel(self): r = self.client.get(url) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) - cancel_meeting_btns = q("a.btn:contains('Cancel meeting')") - self.assertEqual(len(cancel_meeting_btns), 1, - 'Should be exactly one cancel meeting button for user %s' % username) - self.assertEqual(cancel_meeting_btns.eq(0).attr('href'), - urlreverse('ietf.meeting.views.interim_request_cancel', - kwargs={'number': meeting.number}), - 'Cancel meeting button points to wrong URL') - cancel_session_btns = q("a.btn:contains('Cancel session')") self.assertEqual(len(cancel_session_btns), 2, 'Should be two cancel session buttons for user %s' % username) From be7938968d2f068fdafc14dbda41d9baeaa89efc Mon Sep 17 00:00:00 2001 From: noralmaani Date: Wed, 1 Jul 2026 12:07:30 +0000 Subject: [PATCH 4/5] test: add button access tests --- ietf/meeting/tests_views.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/ietf/meeting/tests_views.py b/ietf/meeting/tests_views.py index 180879acede..38cf9b90517 100644 --- a/ietf/meeting/tests_views.py +++ b/ietf/meeting/tests_views.py @@ -5905,7 +5905,7 @@ def test_interim_meeting_cancel(self): ) url = urlreverse('ietf.meeting.views.session_details', kwargs={'num': meeting.number, 'acronym': 'mars'}) - + for username, password in usernames_and_passwords: self.client.login(username=username, password=password) r = self.client.get(url) @@ -5918,6 +5918,17 @@ def test_interim_meeting_cancel(self): urlreverse('ietf.meeting.views.interim_request_cancel', kwargs={'number': meeting.number}), 'Cancel meeting points to wrong URL') + + # test unauthorized access to cancellation button + self.client.login(username="ameschairman", password="ameschairman+password") + r = self.client.get(url) + q = PyQuery(r.content) + self.assertEqual(len(q("a.btn:contains('Cancel meeting')")), 0) + self.client.logout() + self.client.login(username="") + r = self.client.get(url) + q = PyQuery(r.content) + self.assertEqual(len(q("a.btn:contains('Cancel meeting')")), 0) def test_interim_session_cancel(self): make_interim_test_data() From 87fb0c83478a70d2e662c1287c6bc4903a79eb29 Mon Sep 17 00:00:00 2001 From: noralmaani Date: Wed, 1 Jul 2026 12:08:42 +0000 Subject: [PATCH 5/5] chore: remove redundant code --- ietf/templates/meeting/session_details_panel.html | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/ietf/templates/meeting/session_details_panel.html b/ietf/templates/meeting/session_details_panel.html index cbb3ad054a7..32a45dff6e0 100644 --- a/ietf/templates/meeting/session_details_panel.html +++ b/ietf/templates/meeting/session_details_panel.html @@ -38,16 +38,14 @@

Meeting details {% endif %} - {% with meeting_status.slug as status_slug %} - {% if meeting.type.slug == 'interim' %} - {% if future %} - Cancel meeting - - {% endif %} + {% endif %} - {% endwith %} + {% endif %} {% if not session.type_counter.agenda %}
This session does not yet have an agenda.