diff --git a/ietf/iesg/tests.py b/ietf/iesg/tests.py index 53172e645f..ceda918bb2 100644 --- a/ietf/iesg/tests.py +++ b/ietf/iesg/tests.py @@ -20,7 +20,7 @@ from ietf.doc.models import Document, DocAlias, State, RelatedDocument from ietf.doc.factories import WgDraftFactory, IndividualDraftFactory, ConflictReviewFactory, BaseDocumentFactory, CharterFactory, WgRfcFactory, IndividualRfcFactory from ietf.doc.utils import create_ballot_if_not_open -from ietf.group.factories import RoleFactory, GroupFactory +from ietf.group.factories import RoleFactory, GroupFactory, DatedGroupMilestoneFactory, DatelessGroupMilestoneFactory from ietf.group.models import Group, GroupMilestone, Role from ietf.iesg.agenda import get_agenda_date, agenda_data, fill_in_agenda_administrivia, agenda_sections from ietf.iesg.models import TelechatDate, TelechatAgendaContent @@ -71,7 +71,50 @@ def test_milestones_needing_review(self): r = self.client.get(url) self.assertEqual(r.status_code, 200) self.assertNotContains(r, m.desc) + + def test_milestones_needing_review_ordering(self): + dated_group = GroupFactory(uses_milestone_dates=True) + RoleFactory( + name_id='ad', + group=dated_group, + person=Person.objects.get(user__username='ad'), + ) + dated_milestones = DatedGroupMilestoneFactory.create_batch( + 2, group=dated_group, state_id="review" + ) + dated_milestones[0].due -= datetime.timedelta(days=1) # make this one earlier + dated_milestones[0].save() + + dateless_group = GroupFactory(uses_milestone_dates=False) + RoleFactory( + name_id='ad', + group=dateless_group, + person=Person.objects.get(user__username='ad'), + ) + dateless_milestones = DatelessGroupMilestoneFactory.create_batch( + 2, group=dateless_group, state_id="review" + ) + + url = urlreverse("ietf.iesg.views.milestones_needing_review") + self.client.login(username="ad", password="ad+password") + r = self.client.get(url) + self.assertEqual(r.status_code, 200) + pq = PyQuery(r.content) + # check order-by-date + dated_tbody = pq(f'td:contains("{dated_milestones[0].desc}")').closest("tbody") + next_td = dated_tbody.find('td:contains("Next")') + self.assertEqual(next_td.siblings()[0].text.strip(), dated_milestones[0].desc) + last_td = dated_tbody.find('td:contains("Last")') + self.assertEqual(last_td.siblings()[0].text.strip(), dated_milestones[1].desc) + + # check order-by-order + dateless_tbody = pq(f'td:contains("{dateless_milestones[0].desc}")').closest("tbody") + next_td = dateless_tbody.find('td:contains("Next")') + self.assertEqual(next_td.siblings()[0].text.strip(), dateless_milestones[0].desc) + last_td = dateless_tbody.find('td:contains("Last")') + self.assertEqual(last_td.siblings()[0].text.strip(), dateless_milestones[1].desc) + def test_review_decisions(self): draft = WgDraftFactory() diff --git a/ietf/iesg/views.py b/ietf/iesg/views.py index 8c2bd7d0ec..0830db2619 100644 --- a/ietf/iesg/views.py +++ b/ietf/iesg/views.py @@ -526,7 +526,9 @@ def milestones_needing_review(request): ad_list.append(ad) ad.groups_needing_review = sorted(groups, key=lambda g: g.acronym) for g, milestones in groups.items(): - g.milestones_needing_review = sorted(milestones, key=lambda m: m.due) + g.milestones_needing_review = sorted( + milestones, key=lambda m: m.due if m.group.uses_milestone_dates else m.order + ) return render(request, 'iesg/milestones_needing_review.html', dict(ads=sorted(ad_list, key=lambda ad: ad.plain_name()),))