From adf28c922f3b1a17717ef6d2f014caf2f983ebb1 Mon Sep 17 00:00:00 2001 From: Ryan Cross Date: Tue, 4 Oct 2016 23:42:18 +0000 Subject: [PATCH] Fix issue where interim meeting request form didn't list research groups when user was a working group chair and a research group chair. Commit ready for merge. - Legacy-Id: 12082 --- ietf/meeting/forms.py | 18 +++++++++++------- ietf/meeting/tests_views.py | 21 ++++++++++++++++++++- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/ietf/meeting/forms.py b/ietf/meeting/forms.py index ce5d303be..52ad6816d 100644 --- a/ietf/meeting/forms.py +++ b/ietf/meeting/forms.py @@ -5,6 +5,7 @@ import codecs from django import forms from django.core.validators import ValidationError +from django.db.models import Q from django.forms.fields import Field from django.utils.encoding import force_text from django.utils import six @@ -190,14 +191,17 @@ class InterimMeetingModelForm(forms.ModelForm): '''Set group options based on user accessing the form''' if has_role(self.user, "Secretariat"): return # don't reduce group options + q_objects = Q() if has_role(self.user, "Area Director"): - queryset = Group.objects.filter(type="wg", state__in=("active", "proposed", "bof")).order_by('acronym') - elif has_role(self.user, "IRTF Chair"): - queryset = Group.objects.filter(type="rg", state__in=("active", "proposed")).order_by('acronym') - elif has_role(self.user, "WG Chair"): - queryset = Group.objects.filter(type="wg", state__in=("active", "proposed", "bof"), role__person=self.person, role__name="chair").distinct().order_by('acronym') - elif has_role(self.user, "RG Chair"): - queryset = Group.objects.filter(type="rg", state__in=("active", "proposed"), role__person=self.person, role__name="chair").distinct().order_by('acronym') + q_objects.add(Q(type="wg", state__in=("active", "proposed", "bof")), Q.OR) + if has_role(self.user, "IRTF Chair"): + q_objects.add(Q(type="rg", state__in=("active", "proposed")), Q.OR) + if has_role(self.user, "WG Chair"): + q_objects.add(Q(type="wg", state__in=("active", "proposed", "bof"), role__person=self.person, role__name="chair"), Q.OR) + if has_role(self.user, "RG Chair"): + q_objects.add(Q(type="rg", state__in=("active", "proposed"), role__person=self.person, role__name="chair"), Q.OR) + + queryset = Group.objects.filter(q_objects).distinct().order_by('acronym') self.fields['group'].queryset = queryset # if there's only one possibility make it the default diff --git a/ietf/meeting/tests_views.py b/ietf/meeting/tests_views.py index 3811f2dd4..634294a98 100644 --- a/ietf/meeting/tests_views.py +++ b/ietf/meeting/tests_views.py @@ -15,7 +15,7 @@ from pyquery import PyQuery from StringIO import StringIO from ietf.doc.models import Document -from ietf.group.models import Group +from ietf.group.models import Group, Role from ietf.meeting.helpers import can_approve_interim_request, can_view_interim_request from ietf.meeting.helpers import send_interim_approval_request from ietf.meeting.helpers import send_interim_cancellation_notice @@ -709,7 +709,26 @@ class InterimTests(TestCase): q = PyQuery(r.content) self.assertEqual(Group.objects.filter(type__in=('wg', 'rg'), state__in=('active', 'proposed')).count(), len(q("#id_group option")) - 1) # -1 for options placeholder + self.client.logout() + # wg chair + self.client.login(username="marschairman", password="marschairman+password") + r = self.client.get("/meeting/interim/request/") + self.assertEqual(r.status_code, 200) + q = PyQuery(r.content) + user = User.objects.get(username='marschairman') + person = user.person + count = person.role_set.filter(name='chair',group__type__in=('wg', 'rg'), group__state__in=('active', 'proposed')).count() + self.assertEqual(count, len(q("#id_group option")) - 1) # -1 for options placeholder + + # wg AND rg chair + group = Group.objects.get(acronym='irg') + Role.objects.create(name_id='chair',group=group,person=person,email=person.email()) + r = self.client.get("/meeting/interim/request/") + self.assertEqual(r.status_code, 200) + q = PyQuery(r.content) + count = person.role_set.filter(name='chair',group__type__in=('wg', 'rg'), group__state__in=('active', 'proposed')).count() + self.assertEqual(count, len(q("#id_group option")) - 1) # -1 for options placeholder def test_interim_request_single_virtual(self): make_meeting_test_data()