Skip to content

Commit

Permalink
Allow anyone to see the pending and awaiting announcement tabs on the…
Browse files Browse the repository at this point in the history
… upcoming meeting view. Fixes #2929. Partially addresses #3016. Commit ready for merge.

 - Legacy-Id: 18589
  • Loading branch information
rjsparks committed Oct 9, 2020
1 parent 1a7aa21 commit b0eeaec
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 108 deletions.
3 changes: 3 additions & 0 deletions ietf/meeting/helpers.py
Expand Up @@ -12,6 +12,7 @@
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
Expand Down Expand Up @@ -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'):
Expand Down
113 changes: 16 additions & 97 deletions ietf/meeting/tests_views.py
Expand Up @@ -2095,49 +2095,7 @@ def tearDown(self):
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()
Expand Down Expand Up @@ -2226,7 +2184,6 @@ def do_upcoming_test(self, querystring=None, create_meeting=True):
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):
Expand All @@ -2238,22 +2195,7 @@ def test_upcoming(self):
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:
Expand Down Expand Up @@ -2806,23 +2748,7 @@ def test_interim_request_series(self):
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):
Expand Down Expand Up @@ -3885,21 +3811,25 @@ def test_cannot_request_interim(self):

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,
meeting__type_id='interim',
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)
Expand All @@ -3910,27 +3840,16 @@ def test_appears_on_pending(self):
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)
Expand Down
14 changes: 3 additions & 11 deletions ietf/meeting/views.py
Expand Up @@ -107,11 +107,9 @@
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):
Expand Down Expand Up @@ -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')
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit b0eeaec

Please sign in to comment.