diff --git a/ietf/meeting/tests_views.py b/ietf/meeting/tests_views.py index 4f7654d28..b7f68da50 100644 --- a/ietf/meeting/tests_views.py +++ b/ietf/meeting/tests_views.py @@ -658,6 +658,50 @@ class MeetingTests(BaseMeetingTestCase): r = self.client.get(url) self.assertEqual(unicontent(r), doc.text()) + def test_materials_has_edit_links(self): + meeting = make_meeting_test_data() + url = urlreverse("ietf.meeting.views.materials", kwargs=dict(num=meeting.number)) + r = self.client.get(url) + self.assertNotContains(r, 'Edit materials', status_code=200) + + # mars chairman can edit materials for mars group + self.client.login(username='marschairman', password='marschairman+password') + r = self.client.get(url) + self.assertEqual(r.status_code, 200) + q = PyQuery(r.content.decode()) + edit_url = urlreverse( + 'ietf.meeting.views.session_details', + kwargs={'num': meeting.number, 'acronym': 'mars'}, + ) + self.assertEqual(len(q(f'a[href^="{edit_url}"]')), 1, 'Link to mars session_details for mars chairman') + for acro in ['ietf', 'ames']: # other groups with materials + edit_url = urlreverse( + 'ietf.meeting.views.session_details', + kwargs={'num': meeting.number, 'acronym': acro}, + ) + self.assertEqual(len(q(f'a[href^="{edit_url}"]')), 0, f'No link to {acro} session_details for mars chairman') + + # secretary can edit all groups + self.client.login(username='secretary', password='secretary+password') + r = self.client.get(url) + self.assertEqual(r.status_code, 200) + q = PyQuery(r.content.decode()) + for acro in ['mars', 'ames']: # wgs + edit_url = urlreverse( + 'ietf.meeting.views.session_details', + kwargs={'num': meeting.number, 'acronym': acro}, + ) + self.assertEqual(len(q(f'a[href^="{edit_url}"]')), 1, f'Link to session_details page for {acro}') + # The IETF Plenary has a "#sessionX" tacked on to the edit url to differentiate from other sessions, + # so test it separately. Not bothering to check the exact session pk in detail. + edit_url = urlreverse( + 'ietf.meeting.views.session_details', + kwargs={'num': meeting.number, 'acronym': 'ietf'}, + ) + self.assertEqual(len(q(f'a[href^="{edit_url}#session"]')), 1, f'Link to session_details page for {acro}') + + + def test_materials_editable_groups(self): meeting = make_meeting_test_data() @@ -3854,6 +3898,7 @@ class EditTests(TestCase): self.assertTrue(mars_slot.slot_to_the_right) self.assertTrue(mars_scheduled.slot_to_the_right) + class SessionDetailsTests(TestCase): def test_session_details(self): @@ -3876,6 +3921,63 @@ class SessionDetailsTests(TestCase): self.assertFalse(q('div#session-buttons-%s span.bi-arrows-fullscreen' % session.id), 'The session detail page is incorrectly showing the "Show meeting materials" button') + def test_session_details_has_import_minutes_buttons(self): + group = GroupFactory.create( + type_id='wg', + state_id='active', + ) + session = SessionFactory.create( + meeting__type_id='ietf', + group=group, + meeting__date=datetime.date.today() + datetime.timedelta(days=90), + ) + session_details_url = urlreverse( + 'ietf.meeting.views.session_details', + kwargs={'num': session.meeting.number, 'acronym': group.acronym}, + ) + import_minutes_url = urlreverse( + 'ietf.meeting.views.import_session_minutes', + kwargs={'num': session.meeting.number, 'session_id': session.pk}, + ) + + # test without existing minutes + with patch('ietf.meeting.views.can_manage_session_materials', return_value=False): + r = self.client.get(session_details_url) + self.assertEqual(r.status_code, 200) + q = PyQuery(r.content) + self.assertEqual( + len(q(f'a[href="{import_minutes_url}"]')), 0, + 'Do not show import new minutes buttons to non-materials manager', + ) + with patch('ietf.meeting.views.can_manage_session_materials', return_value=True): + r = self.client.get(session_details_url) + self.assertEqual(r.status_code, 200) + q = PyQuery(r.content) + self.assertGreater( + len(q(f'a[href="{import_minutes_url}"]')), 0, + 'Show import new minutes buttons to materials manager', + ) + + # now create minutes and test that we can still have the import button + SessionPresentationFactory.create(session=session,document__type_id='minutes') + with patch('ietf.meeting.views.can_manage_session_materials', return_value=False): + r = self.client.get(session_details_url) + self.assertEqual(r.status_code, 200) + q = PyQuery(r.content) + self.assertEqual( + len(q(f'a[href="{import_minutes_url}"]')), 0, + 'Do not show import revised minutes buttons to non-materials manager', + ) + + with patch('ietf.meeting.views.can_manage_session_materials', return_value=True): + r = self.client.get(session_details_url) + self.assertEqual(r.status_code, 200) + q = PyQuery(r.content) + self.assertGreater( + len(q(f'a[href="{import_minutes_url}"]')), 0, + 'Show import revised minutes buttons to materials manager', + ) + def test_session_details_past_interim(self): group = GroupFactory.create(type_id='wg',state_id='active') chair = RoleFactory(name_id='chair',group=group) diff --git a/ietf/templates/meeting/group_materials.html b/ietf/templates/meeting/group_materials.html index c657a62fd..294d1185b 100644 --- a/ietf/templates/meeting/group_materials.html +++ b/ietf/templates/meeting/group_materials.html @@ -115,7 +115,7 @@ {% if user|has_role:"Secretariat" or user_groups %} - {% if session.group in user_groups %} + {% if user|has_role:"Secretariat" or session.group in user_groups %}
{% include "meeting/edit_materials_button.html" %}
{% endif %} diff --git a/ietf/templates/meeting/session_details_panel.html b/ietf/templates/meeting/session_details_panel.html index b595f8c26..d3f7c4149 100644 --- a/ietf/templates/meeting/session_details_panel.html +++ b/ietf/templates/meeting/session_details_panel.html @@ -101,6 +101,7 @@ {% endif %} {% if not session.type_counter.minutes %} + Import minutes from notes.ietf.org Upload minutes