From b0eeaecca05ea442a379da12c52b15d76bd2818c Mon Sep 17 00:00:00 2001 From: Robert Sparks Date: Fri, 9 Oct 2020 20:19:16 +0000 Subject: [PATCH] Allow anyone to see the pending and awaiting announcement tabs on the upcoming meeting view. Fixes #2929. Partially addresses #3016. Commit ready for merge. - Legacy-Id: 18589 --- ietf/meeting/helpers.py | 3 + ietf/meeting/tests_views.py | 113 +++++------------------------------- ietf/meeting/views.py | 14 +---- 3 files changed, 22 insertions(+), 108 deletions(-) diff --git a/ietf/meeting/helpers.py b/ietf/meeting/helpers.py index 04a3db3da..564336e0d 100644 --- a/ietf/meeting/helpers.py +++ b/ietf/meeting/helpers.py @@ -12,6 +12,7 @@ from tempfile import mkstemp from django.http import HttpRequest, Http404 from django.db.models import F, Max, Q, Prefetch from django.conf import settings +from django.contrib.auth.models import AnonymousUser from django.core.cache import cache from django.urls import reverse from django.utils.cache import get_cache_key @@ -341,6 +342,8 @@ def session_constraint_expire(request,session): def can_approve_interim_request(meeting, user): '''Returns True if the user has permissions to approve an interim meeting request''' + if not user or isinstance(user,AnonymousUser): + return False if meeting.type.slug != 'interim': return False if has_role(user, 'Secretariat'): diff --git a/ietf/meeting/tests_views.py b/ietf/meeting/tests_views.py index a3b6060bc..d89ba6d09 100644 --- a/ietf/meeting/tests_views.py +++ b/ietf/meeting/tests_views.py @@ -2095,49 +2095,7 @@ class InterimTests(TestCase): settings.AGENDA_PATH = self.saved_agenda_path shutil.rmtree(self.materials_dir) - def check_interim_tabs(self, url): - '''Helper function to check interim meeting list tabs''' - # no logged in - no tabs - r = self.client.get(url) - q = PyQuery(r.content) - self.assertEqual(len(q("ul.nav-tabs")), 0) - # plain user - no tabs - username = "plain" - self.client.login(username=username, password=username + "+password") - r = self.client.get(url) - q = PyQuery(r.content) - self.assertEqual(len(q("ul.nav-tabs")), 0) - self.client.logout() - # privileged user - username = "ad" - self.client.login(username=username, password=username + "+password") - r = self.client.get(url) - q = PyQuery(r.content) - self.assertEqual(len(q("a:contains('Pending')")), 1) - self.assertEqual(len(q("a:contains('Announce')")), 0) - self.client.logout() - # secretariat - username = "secretary" - self.client.login(username=username, password=username + "+password") - r = self.client.get(url) - q = PyQuery(r.content) - self.assertEqual(len(q("a:contains('Pending')")), 1) - self.assertEqual(len(q("a:contains('Announce')")), 1) - self.client.logout() - - def test_interim_announce(self): - make_interim_test_data() - url = urlreverse("ietf.meeting.views.interim_announce") - meeting = Meeting.objects.filter(type='interim', session__group__acronym='mars').first() - session = meeting.session_set.first() - SchedulingEvent.objects.create( - session=session, - status=SessionStatusName.objects.get(slug='scheda'), - by=Person.objects.get(name='(System)') - ) - login_testing_unauthorized(self, "secretary", url) - r = self.client.get(url) - self.assertContains(r, meeting.number) + # test_interim_announce subsumed by test_appears_on_announce def test_interim_skip_announcement(self): make_meeting_test_data() @@ -2226,7 +2184,6 @@ class InterimTests(TestCase): mars=add_event_info_to_session_qs(Session.objects.filter(meeting__type='interim', meeting__date__gt=today, group__acronym='mars')).filter(current_status='sched').first().meeting, ames=add_event_info_to_session_qs(Session.objects.filter(meeting__type='interim', meeting__date__gt=today, group__acronym='ames')).filter(current_status='canceled').first().meeting, ) - self.check_interim_tabs(url) return self.client.get(url), interims def test_upcoming(self): @@ -2238,22 +2195,7 @@ class InterimTests(TestCase): q = PyQuery(r.content) self.assertIn('CANCELLED', q('tr>td.text-right>span').text()) - def test_upcoming_filters_ignored(self): - """The upcoming view should ignore filter querystrings""" - r, interims = self.do_upcoming_test() - self.assertContains(r, interims['mars'].number) - self.assertContains(r, interims['ames'].number) - self.assertContains(r, 'IETF 72') - - r, interims = self.do_upcoming_test('show=ames', create_meeting=False) - self.assertContains(r, interims['mars'].number) - self.assertContains(r, interims['ames'].number) - self.assertContains(r, 'IETF 72') - - r, interims = self.do_upcoming_test('show=ames&hide=ames,mars', create_meeting=False) - self.assertContains(r, interims['mars'].number) - self.assertContains(r, interims['ames'].number) - self.assertContains(r, 'IETF 72') + # test_upcoming_filters_ignored removed - we _don't_ want to ignore filters now, and the test passed because it wasn't testing the filtering anyhow (which requires testing the js). def do_upcoming_ical_test(self, querystring=None, create_meeting=True): if create_meeting: @@ -2806,23 +2748,7 @@ class InterimTests(TestCase): self.assertEqual(session.agenda_note,agenda_note) - def test_interim_pending(self): - make_interim_test_data() - url = urlreverse('ietf.meeting.views.interim_pending') - count = len(set(s.meeting_id for s in add_event_info_to_session_qs(Session.objects.filter(meeting__type='interim')).filter(current_status='apprw'))) - - # unpriviledged user - login_testing_unauthorized(self,"plain",url) - r = self.client.get(url) - self.assertEqual(r.status_code, 403) - - # secretariat - login_testing_unauthorized(self,"secretary",url) - r = self.client.get(url) - self.assertEqual(r.status_code, 200) - q = PyQuery(r.content) - self.assertEqual(len(q("#pending-interim-meetings-table tr"))-1, count) - self.client.logout() + # test_interim_pending subsumed by test_appears_on_pending def test_can_approve_interim_request(self): @@ -3885,6 +3811,7 @@ class HasMeetingsTests(TestCase): def test_appears_on_upcoming(self): url = urlreverse('ietf.meeting.views.upcoming') + sessions=[] for gf in GroupFeatures.objects.filter(has_meetings=True): session = SessionFactory( group__type_id = gf.type_id, @@ -3892,14 +3819,17 @@ class HasMeetingsTests(TestCase): meeting__date = datetime.datetime.today()+datetime.timedelta(days=30), status_id='sched', ) - r = self.client.get(url) - self.assertEqual(r.status_code, 200) - q = PyQuery(r.content) + sessions.append(session) + r = self.client.get(url) + self.assertEqual(r.status_code, 200) + q = PyQuery(r.content) + for session in sessions: self.assertIn(session.meeting.number, q('.interim-meeting-link').text()) def test_appears_on_pending(self): url = urlreverse('ietf.meeting.views.interim_pending') + sessions=[] for gf in GroupFeatures.objects.filter(has_meetings=True): group = GroupFactory(type_id=gf.type_id) meeting_date = datetime.datetime.today() + datetime.timedelta(days=30) @@ -3910,27 +3840,16 @@ class HasMeetingsTests(TestCase): meeting__number = 'interim-%d-%s-00'%(meeting_date.year,group.acronym), status_id='apprw', ) - for role_name in gf.groupman_roles: - role = RoleFactory(group=group, name_id=role_name) - self.client.login(username=role.person.user.username, password=role.person.user.username+'+password') - r = self.client.get(url) - self.assertEqual(r.status_code, 200) - q = PyQuery(r.content) - self.assertIn(session.meeting.number, q('.interim-meeting-link').text()) - self.client.logout() - for authrole in gf.groupman_authroles: - role = self.create_role_for_authrole(authrole) - self.client.login(username=role.person.user.username, password=role.person.user.username+'+password') - r = self.client.get(url) - self.assertEqual(r.status_code, 200) - q = PyQuery(r.content) - self.assertIn(session.meeting.number, q('.interim-meeting-link').text()) - self.client.logout() + sessions.append(session) + r = self.client.get(url) + self.assertEqual(r.status_code, 200) + q = PyQuery(r.content) + for session in sessions: + self.assertIn(session.meeting.number, q('.interim-meeting-link').text()) def test_appears_on_announce(self): url = urlreverse('ietf.meeting.views.interim_announce') - login_testing_unauthorized(self,"secretary",url) sessions=[] for gf in GroupFeatures.objects.filter(has_meetings=True): group = GroupFactory(type_id=gf.type_id) diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py index 75bbf84f8..9870f552d 100644 --- a/ietf/meeting/views.py +++ b/ietf/meeting/views.py @@ -107,11 +107,9 @@ from .forms import (InterimMeetingModelForm, InterimAnnounceForm, InterimSession def get_interim_menu_entries(request): '''Setup menu entries for interim meeting view tabs''' entries = [] - if can_manage_some_groups(request.user): - entries.append(("Upcoming", reverse("ietf.meeting.views.upcoming"))) - entries.append(("Pending", reverse("ietf.meeting.views.interim_pending"))) - if has_role(request.user, "Secretariat"): - entries.append(("Announce", reverse("ietf.meeting.views.interim_announce"))) + entries.append(("Upcoming", reverse("ietf.meeting.views.upcoming"))) + entries.append(("Pending", reverse("ietf.meeting.views.interim_pending"))) + entries.append(("Announce", reverse("ietf.meeting.views.interim_announce"))) return entries def send_interim_change_notice(request, meeting): @@ -2905,7 +2903,6 @@ def ajax_get_utc(request): content_type='application/json') -@role_required('Secretariat',) def interim_announce(request): '''View which shows interim meeting requests awaiting announcement''' meetings = data_for_meetings_overview(Meeting.objects.filter(type='interim').order_by('date'), interim_status='scheda') @@ -2968,19 +2965,14 @@ def interim_skip_announcement(request, number): 'meeting': meeting}) -@login_required def interim_pending(request): - if not can_manage_some_groups(request.user): - permission_denied(request, "You are not authorized to access this view") - '''View which shows interim meeting requests pending approval''' meetings = data_for_meetings_overview(Meeting.objects.filter(type='interim').order_by('date'), interim_status='apprw') menu_entries = get_interim_menu_entries(request) selected_menu_entry = 'pending' - meetings = [m for m in meetings if can_view_interim_request(m, request.user)] for meeting in meetings: if can_approve_interim_request(meeting, request.user): meeting.can_approve = True