From 24754dc3841b1282914184c8d9b3a11897c93997 Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Mon, 17 Mar 2025 18:40:20 +0700 Subject: [PATCH 1/8] test: slide approval links shown for all sessions --- ietf/meeting/tests_views.py | 47 +++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/ietf/meeting/tests_views.py b/ietf/meeting/tests_views.py index 519f5f7c2de..27a4c83d1a8 100644 --- a/ietf/meeting/tests_views.py +++ b/ietf/meeting/tests_views.py @@ -4655,6 +4655,53 @@ def test_add_session_drafts(self): q = PyQuery(r.content) self.assertEqual(1,len(q(".alert-warning:contains('may affect published proceedings')"))) + def test_proposed_slides_for_approval(self): + group = GroupFactory() + meeting = MeetingFactory(type_id="ietf", date=date_today() + datetime.timedelta(days=10)) + sessions = SessionFactory.create_batch( + 2, + group=group, + meeting=meeting, + ) + # Create pending submissions + first_session_pending = SlideSubmissionFactory(session=sessions[0], title="first session title") + second_session_pending = SlideSubmissionFactory(session=sessions[1], title="second session title") + + # and their approval URLs + first_approval_url = urlreverse( + "ietf.meeting.views.approve_proposed_slides", + kwargs={"slidesubmission_id": first_session_pending.pk, "num": meeting.number}, + ) + second_approval_url = urlreverse( + "ietf.meeting.views.approve_proposed_slides", + kwargs={"slidesubmission_id": second_session_pending.pk, "num": meeting.number}, + ) + + # Retrieve the URL as a group chair + url = urlreverse( + "ietf.meeting.views.session_details", + kwargs={ + "num": meeting.number, + "acronym": group.acronym, + }, + ) + chair = RoleFactory(group=group, name_id="chair").person + self.client.login(username=chair.user.username, password=f"{chair.user.username}+password") + r = self.client.get(url) + self.assertEqual(r.status_code, 200) + pq = PyQuery(r.content) + self.assertEqual( + len(pq(f'a[href="{first_approval_url}"]')), + 1, + "first session proposed slides should be linked for approval", + ) + self.assertEqual( + len(pq(f'a[href="{second_approval_url}"]')), + 1, + "second session proposed slides should be linked for approval", + ) + + class EditScheduleListTests(TestCase): def setUp(self): super().setUp() From 8bba00432a12ac0440b566972ad75b6cad96190e Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Mon, 17 Mar 2025 23:14:56 +0700 Subject: [PATCH 2/8] fix: suggest pending slides for all sessions --- ietf/meeting/views.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py index 3fa605ed7e0..bc2c9d0c16b 100644 --- a/ietf/meeting/views.py +++ b/ietf/meeting/views.py @@ -2512,9 +2512,16 @@ def session_details(request, num, acronym): pending_suggestions = None if request.user.is_authenticated: if can_manage: - pending_suggestions = session.slidesubmission_set.filter(status__slug='pending') + pending_suggestions = SlideSubmission.objects.filter( + session__in=sessions, + status__slug='pending', + ) else: - pending_suggestions = session.slidesubmission_set.filter(status__slug='pending', submitter=request.user.person) + pending_suggestions = SlideSubmission.objects.filter( + session__in=sessions, + status__slug='pending', + submitter=request.user.person, + ) return render(request, "meeting/session_details.html", { 'scheduled_sessions':scheduled_sessions , From a012e2c4944d1dcf7b9b5842e4df8d09fdd95573 Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Mon, 17 Mar 2025 23:24:41 +0700 Subject: [PATCH 3/8] refactor: flatten logic --- ietf/meeting/views.py | 21 ++++++++------------- ietf/templates/meeting/session_details.html | 2 +- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py index bc2c9d0c16b..d02ae409021 100644 --- a/ietf/meeting/views.py +++ b/ietf/meeting/views.py @@ -2509,19 +2509,14 @@ def session_details(request, num, acronym): scheduled_sessions = [s for s in sessions if s.current_status == 'sched'] unscheduled_sessions = [s for s in sessions if s.current_status != 'sched'] - pending_suggestions = None - if request.user.is_authenticated: - if can_manage: - pending_suggestions = SlideSubmission.objects.filter( - session__in=sessions, - status__slug='pending', - ) - else: - pending_suggestions = SlideSubmission.objects.filter( - session__in=sessions, - status__slug='pending', - submitter=request.user.person, - ) + # Start with all the pending suggestions for all the group's sessions + pending_suggestions = SlideSubmission.objects.filter(session__in=sessions, status__slug='pending') + if can_manage: + pass # keep the full set + elif hasattr(request.user, "person"): + pending_suggestions = pending_suggestions.filter(submitter=request.user.person) + else: + pending_suggestions = SlideSubmission.objects.none() return render(request, "meeting/session_details.html", { 'scheduled_sessions':scheduled_sessions , diff --git a/ietf/templates/meeting/session_details.html b/ietf/templates/meeting/session_details.html index 571715b4b4d..2af69d8d0eb 100644 --- a/ietf/templates/meeting/session_details.html +++ b/ietf/templates/meeting/session_details.html @@ -31,7 +31,7 @@

Scheduled Sessions

{% include 'meeting/session_details_panel.html' with sessions=scheduled_sessions %}

Unscheduled Sessions

{% include 'meeting/session_details_panel.html' with sessions=unscheduled_sessions %} - {% if pending_suggestions %} + {% if pending_suggestions.exists %}

{% if can_manage_materials %} Proposed slides awaiting your approval From 0527af5261d49bc2beb78d2c931bd88fdf49541d Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Mon, 17 Mar 2025 23:30:40 +0700 Subject: [PATCH 4/8] refactor: avoid extra exists() query --- ietf/templates/meeting/session_details.html | 34 ++++++++++----------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/ietf/templates/meeting/session_details.html b/ietf/templates/meeting/session_details.html index 2af69d8d0eb..55fa3d38571 100644 --- a/ietf/templates/meeting/session_details.html +++ b/ietf/templates/meeting/session_details.html @@ -31,30 +31,28 @@

Scheduled Sessions

{% include 'meeting/session_details_panel.html' with sessions=scheduled_sessions %}

Unscheduled Sessions

{% include 'meeting/session_details_panel.html' with sessions=unscheduled_sessions %} - {% if pending_suggestions.exists %} -

+ {% for s in pending_suggestions %} + {% if forloop.first %}

{% if can_manage_materials %} Proposed slides awaiting your approval {% else %} Your proposed slides awaiting chair approval {% endif %}

-
- {% for s in pending_suggestions %} - {% if can_manage_materials %} -

- - {{ s.submitter }} - {{ s.title }} ({{ s.time }}) - -

- {% else %} -

- {{ s.title }} ({{ s.time }}) -

- {% endif %} - {% endfor %} -
- {% endif %} +
{% endif %} + {% if can_manage_materials %} +

+ + {{ s.submitter }} - {{ s.title }} ({{ s.time }}) + +

+ {% else %} +

+ {{ s.title }} ({{ s.time }}) +

+ {% endif %} + {% if forloop.last %}
{% endif %} + {% endfor %} {% endblock %} {% block js %} From fa79df08ccca39417c87ecf26171f8a22b814a9a Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Mon, 17 Mar 2025 23:35:13 +0700 Subject: [PATCH 5/8] test: update test comment --- ietf/meeting/tests_views.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ietf/meeting/tests_views.py b/ietf/meeting/tests_views.py index 27a4c83d1a8..41183661bde 100644 --- a/ietf/meeting/tests_views.py +++ b/ietf/meeting/tests_views.py @@ -4656,6 +4656,8 @@ def test_add_session_drafts(self): self.assertEqual(1,len(q(".alert-warning:contains('may affect published proceedings')"))) def test_proposed_slides_for_approval(self): + # This test overlaps somewhat with MaterialsTests of proposed slides handling. The focus + # here is on the display of slides, not the approval action. group = GroupFactory() meeting = MeetingFactory(type_id="ietf", date=date_today() + datetime.timedelta(days=10)) sessions = SessionFactory.create_batch( From 1dd4617f5912450c4b00ba81b4556a8ee2fe93dc Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Tue, 18 Mar 2025 09:33:36 +0700 Subject: [PATCH 6/8] test: only pending slides suggested for approval --- ietf/meeting/tests_views.py | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/ietf/meeting/tests_views.py b/ietf/meeting/tests_views.py index 41183661bde..299b9f03267 100644 --- a/ietf/meeting/tests_views.py +++ b/ietf/meeting/tests_views.py @@ -4665,19 +4665,34 @@ def test_proposed_slides_for_approval(self): group=group, meeting=meeting, ) - # Create pending submissions + + # slides submission _not_ in the `pending` state + do_not_show = [ + SlideSubmissionFactory( + session=sessions[0], + title="already approved", + status_id="approved", + ), + SlideSubmissionFactory( + session=sessions[1], + title="already rejected", + status_id="rejected", + ), + ] + + # pending submissions first_session_pending = SlideSubmissionFactory(session=sessions[0], title="first session title") second_session_pending = SlideSubmissionFactory(session=sessions[1], title="second session title") # and their approval URLs - first_approval_url = urlreverse( - "ietf.meeting.views.approve_proposed_slides", - kwargs={"slidesubmission_id": first_session_pending.pk, "num": meeting.number}, - ) - second_approval_url = urlreverse( + def _approval_url(slidesub): + return urlreverse( "ietf.meeting.views.approve_proposed_slides", - kwargs={"slidesubmission_id": second_session_pending.pk, "num": meeting.number}, + kwargs={"slidesubmission_id": slidesub.pk, "num": meeting.number}, ) + first_approval_url = _approval_url(first_session_pending) + second_approval_url = _approval_url(second_session_pending) + do_not_show_urls = [_approval_url(ss) for ss in do_not_show] # Retrieve the URL as a group chair url = urlreverse( @@ -4702,6 +4717,12 @@ def test_proposed_slides_for_approval(self): 1, "second session proposed slides should be linked for approval", ) + for no_show_url in do_not_show_urls: + self.assertEqual( + len(pq(f'a[href="{no_show_url}"]')), + 0, + "second session proposed slides should be linked for approval", + ) class EditScheduleListTests(TestCase): From 429697c10971ab1c48dd444d030fbde3e2ff4112 Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Tue, 18 Mar 2025 10:01:25 +0700 Subject: [PATCH 7/8] style: Black --- ietf/meeting/tests_views.py | 39 +++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/ietf/meeting/tests_views.py b/ietf/meeting/tests_views.py index 299b9f03267..2154cf5c2c0 100644 --- a/ietf/meeting/tests_views.py +++ b/ietf/meeting/tests_views.py @@ -4659,13 +4659,15 @@ def test_proposed_slides_for_approval(self): # This test overlaps somewhat with MaterialsTests of proposed slides handling. The focus # here is on the display of slides, not the approval action. group = GroupFactory() - meeting = MeetingFactory(type_id="ietf", date=date_today() + datetime.timedelta(days=10)) + meeting = MeetingFactory( + type_id="ietf", date=date_today() + datetime.timedelta(days=10) + ) sessions = SessionFactory.create_batch( 2, group=group, meeting=meeting, ) - + # slides submission _not_ in the `pending` state do_not_show = [ SlideSubmissionFactory( @@ -4679,21 +4681,26 @@ def test_proposed_slides_for_approval(self): status_id="rejected", ), ] - + # pending submissions - first_session_pending = SlideSubmissionFactory(session=sessions[0], title="first session title") - second_session_pending = SlideSubmissionFactory(session=sessions[1], title="second session title") - + first_session_pending = SlideSubmissionFactory( + session=sessions[0], title="first session title" + ) + second_session_pending = SlideSubmissionFactory( + session=sessions[1], title="second session title" + ) + # and their approval URLs def _approval_url(slidesub): return urlreverse( - "ietf.meeting.views.approve_proposed_slides", - kwargs={"slidesubmission_id": slidesub.pk, "num": meeting.number}, - ) + "ietf.meeting.views.approve_proposed_slides", + kwargs={"slidesubmission_id": slidesub.pk, "num": meeting.number}, + ) + first_approval_url = _approval_url(first_session_pending) second_approval_url = _approval_url(second_session_pending) do_not_show_urls = [_approval_url(ss) for ss in do_not_show] - + # Retrieve the URL as a group chair url = urlreverse( "ietf.meeting.views.session_details", @@ -4703,24 +4710,26 @@ def _approval_url(slidesub): }, ) chair = RoleFactory(group=group, name_id="chair").person - self.client.login(username=chair.user.username, password=f"{chair.user.username}+password") + self.client.login( + username=chair.user.username, password=f"{chair.user.username}+password" + ) r = self.client.get(url) self.assertEqual(r.status_code, 200) pq = PyQuery(r.content) self.assertEqual( - len(pq(f'a[href="{first_approval_url}"]')), - 1, + len(pq(f'a[href="{first_approval_url}"]')), + 1, "first session proposed slides should be linked for approval", ) self.assertEqual( len(pq(f'a[href="{second_approval_url}"]')), - 1, + 1, "second session proposed slides should be linked for approval", ) for no_show_url in do_not_show_urls: self.assertEqual( len(pq(f'a[href="{no_show_url}"]')), - 0, + 0, "second session proposed slides should be linked for approval", ) From 03dcaf7b3b1e9c6cb7d73d760e2f53dd753c2ad8 Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Tue, 18 Mar 2025 13:22:23 +0700 Subject: [PATCH 8/8] test: temp path override for SessionDetailsTests --- ietf/meeting/tests_views.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ietf/meeting/tests_views.py b/ietf/meeting/tests_views.py index 2154cf5c2c0..a4f715148b4 100644 --- a/ietf/meeting/tests_views.py +++ b/ietf/meeting/tests_views.py @@ -4523,6 +4523,7 @@ def test_persistent_enabled_timeslot_types(self): class SessionDetailsTests(TestCase): + settings_temp_path_overrides = TestCase.settings_temp_path_overrides + ['SLIDE_STAGING_PATH'] def test_session_details(self):