Skip to content

Commit 563fcee

Browse files
fix: approve slides link for all pending submissions (#8692)
* test: slide approval links shown for all sessions * fix: suggest pending slides for all sessions * refactor: flatten logic * refactor: avoid extra exists() query * test: update test comment * test: only pending slides suggested for approval * style: Black * test: temp path override for SessionDetailsTests
1 parent 8af0dc4 commit 563fcee

File tree

3 files changed

+104
-24
lines changed

3 files changed

+104
-24
lines changed

ietf/meeting/tests_views.py

+80
Original file line numberDiff line numberDiff line change
@@ -4527,6 +4527,7 @@ def test_persistent_enabled_timeslot_types(self):
45274527

45284528

45294529
class SessionDetailsTests(TestCase):
4530+
settings_temp_path_overrides = TestCase.settings_temp_path_overrides + ['SLIDE_STAGING_PATH']
45304531

45314532
def test_session_details(self):
45324533

@@ -4659,6 +4660,85 @@ def test_add_session_drafts(self):
46594660
q = PyQuery(r.content)
46604661
self.assertEqual(1,len(q(".alert-warning:contains('may affect published proceedings')")))
46614662

4663+
def test_proposed_slides_for_approval(self):
4664+
# This test overlaps somewhat with MaterialsTests of proposed slides handling. The focus
4665+
# here is on the display of slides, not the approval action.
4666+
group = GroupFactory()
4667+
meeting = MeetingFactory(
4668+
type_id="ietf", date=date_today() + datetime.timedelta(days=10)
4669+
)
4670+
sessions = SessionFactory.create_batch(
4671+
2,
4672+
group=group,
4673+
meeting=meeting,
4674+
)
4675+
4676+
# slides submission _not_ in the `pending` state
4677+
do_not_show = [
4678+
SlideSubmissionFactory(
4679+
session=sessions[0],
4680+
title="already approved",
4681+
status_id="approved",
4682+
),
4683+
SlideSubmissionFactory(
4684+
session=sessions[1],
4685+
title="already rejected",
4686+
status_id="rejected",
4687+
),
4688+
]
4689+
4690+
# pending submissions
4691+
first_session_pending = SlideSubmissionFactory(
4692+
session=sessions[0], title="first session title"
4693+
)
4694+
second_session_pending = SlideSubmissionFactory(
4695+
session=sessions[1], title="second session title"
4696+
)
4697+
4698+
# and their approval URLs
4699+
def _approval_url(slidesub):
4700+
return urlreverse(
4701+
"ietf.meeting.views.approve_proposed_slides",
4702+
kwargs={"slidesubmission_id": slidesub.pk, "num": meeting.number},
4703+
)
4704+
4705+
first_approval_url = _approval_url(first_session_pending)
4706+
second_approval_url = _approval_url(second_session_pending)
4707+
do_not_show_urls = [_approval_url(ss) for ss in do_not_show]
4708+
4709+
# Retrieve the URL as a group chair
4710+
url = urlreverse(
4711+
"ietf.meeting.views.session_details",
4712+
kwargs={
4713+
"num": meeting.number,
4714+
"acronym": group.acronym,
4715+
},
4716+
)
4717+
chair = RoleFactory(group=group, name_id="chair").person
4718+
self.client.login(
4719+
username=chair.user.username, password=f"{chair.user.username}+password"
4720+
)
4721+
r = self.client.get(url)
4722+
self.assertEqual(r.status_code, 200)
4723+
pq = PyQuery(r.content)
4724+
self.assertEqual(
4725+
len(pq(f'a[href="{first_approval_url}"]')),
4726+
1,
4727+
"first session proposed slides should be linked for approval",
4728+
)
4729+
self.assertEqual(
4730+
len(pq(f'a[href="{second_approval_url}"]')),
4731+
1,
4732+
"second session proposed slides should be linked for approval",
4733+
)
4734+
for no_show_url in do_not_show_urls:
4735+
self.assertEqual(
4736+
len(pq(f'a[href="{no_show_url}"]')),
4737+
0,
4738+
"second session proposed slides should be linked for approval",
4739+
)
4740+
4741+
46624742
class EditScheduleListTests(TestCase):
46634743
def setUp(self):
46644744
super().setUp()

ietf/meeting/views.py

+8-6
Original file line numberDiff line numberDiff line change
@@ -2509,12 +2509,14 @@ def session_details(request, num, acronym):
25092509
scheduled_sessions = [s for s in sessions if s.current_status == 'sched']
25102510
unscheduled_sessions = [s for s in sessions if s.current_status != 'sched']
25112511

2512-
pending_suggestions = None
2513-
if request.user.is_authenticated:
2514-
if can_manage:
2515-
pending_suggestions = session.slidesubmission_set.filter(status__slug='pending')
2516-
else:
2517-
pending_suggestions = session.slidesubmission_set.filter(status__slug='pending', submitter=request.user.person)
2512+
# Start with all the pending suggestions for all the group's sessions
2513+
pending_suggestions = SlideSubmission.objects.filter(session__in=sessions, status__slug='pending')
2514+
if can_manage:
2515+
pass # keep the full set
2516+
elif hasattr(request.user, "person"):
2517+
pending_suggestions = pending_suggestions.filter(submitter=request.user.person)
2518+
else:
2519+
pending_suggestions = SlideSubmission.objects.none()
25182520

25192521
return render(request, "meeting/session_details.html",
25202522
{ 'scheduled_sessions':scheduled_sessions ,

ietf/templates/meeting/session_details.html

+16-18
Original file line numberDiff line numberDiff line change
@@ -31,30 +31,28 @@ <h2 class="mt-3">Scheduled Sessions</h2>
3131
{% include 'meeting/session_details_panel.html' with sessions=scheduled_sessions %}
3232
<h2 class="mt-3">Unscheduled Sessions</h2>
3333
{% include 'meeting/session_details_panel.html' with sessions=unscheduled_sessions %}
34-
{% if pending_suggestions %}
35-
<h2 class="mt-3">
34+
{% for s in pending_suggestions %}
35+
{% if forloop.first %}<h2 class="mt-3">
3636
{% if can_manage_materials %}
3737
Proposed slides awaiting your approval
3838
{% else %}
3939
Your proposed slides awaiting chair approval
4040
{% endif %}
4141
</h2>
42-
<div class="proposedslidelist">
43-
{% for s in pending_suggestions %}
44-
{% if can_manage_materials %}
45-
<p>
46-
<a href="{% url "ietf.meeting.views.approve_proposed_slides" slidesubmission_id=s.pk num=s.session.meeting.number %}">
47-
{{ s.submitter }} - {{ s.title }} ({{ s.time }})
48-
</a>
49-
</p>
50-
{% else %}
51-
<p>
52-
{{ s.title }} ({{ s.time }})
53-
</p>
54-
{% endif %}
55-
{% endfor %}
56-
</div>
57-
{% endif %}
42+
<div class="proposedslidelist">{% endif %}
43+
{% if can_manage_materials %}
44+
<p>
45+
<a href="{% url "ietf.meeting.views.approve_proposed_slides" slidesubmission_id=s.pk num=s.session.meeting.number %}">
46+
{{ s.submitter }} - {{ s.title }} ({{ s.time }})
47+
</a>
48+
</p>
49+
{% else %}
50+
<p>
51+
{{ s.title }} ({{ s.time }})
52+
</p>
53+
{% endif %}
54+
{% if forloop.last %}</div>{% endif %}
55+
{% endfor %}
5856
{% endblock %}
5957
{% block js %}
6058
<script src="{% static 'ietf/js/list.js' %}"></script>

0 commit comments

Comments
 (0)