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
This commit is contained in:
parent
1a7aa2129d
commit
b0eeaecca0
|
@ -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'):
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue