Improved what initial states are offered when the IRTF chair or RG personnel manage adoption of a document. Fixes #2319. Commit ready for merge.

- Legacy-Id: 14055
This commit is contained in:
Robert Sparks 2017-08-14 19:35:48 +00:00
parent 8a4d5aa8ba
commit 09a7d720a1
2 changed files with 61 additions and 10 deletions

View file

@ -10,12 +10,15 @@ from django.conf import settings
import debug # pyflakes:ignore
from ietf.doc.factories import DocumentFactory
from ietf.doc.models import ( Document, DocAlias, DocReminder, DocumentAuthor, DocEvent,
ConsensusDocEvent, LastCallDocEvent, RelatedDocument, State, TelechatDocEvent,
WriteupDocEvent, BallotDocEvent, DocRelationshipName)
from ietf.doc.utils import get_tags_for_stream_id
from ietf.name.models import StreamName, IntendedStdLevelName, DocTagName
from ietf.group.factories import GroupFactory
from ietf.group.models import Group
from ietf.person.factories import PersonFactory
from ietf.person.models import Person, Email
from ietf.meeting.models import Meeting, MeetingTypeName
from ietf.iesg.models import TelechatDate
@ -1197,6 +1200,48 @@ class AdoptDraftTests(TestCase):
self.assertFalse(mars.list_email in draft.notify)
def test_right_state_choices_offered(self):
draft = DocumentFactory()
wg = GroupFactory(type_id='wg',state_id='active')
rg = GroupFactory(type_id='rg',state_id='active')
person = PersonFactory(user__username='person')
self.client.login(username='person',password='person+password')
url = urlreverse('ietf.doc.views_draft.adopt_draft', kwargs=dict(name=draft.name))
person.role_set.create(name_id='chair',group=wg,email=person.email())
r = self.client.get(url)
q = PyQuery(r.content)
self.assertTrue('(IETF)' in q('#id_newstate option').text())
self.assertFalse('(IRTF)' in q('#id_newstate option').text())
person.role_set.create(name_id='chair',group=Group.objects.get(acronym='irtf'),email=person.email())
r = self.client.get(url)
q = PyQuery(r.content)
self.assertTrue('(IETF)' in q('#id_newstate option').text())
self.assertTrue('(IRTF)' in q('#id_newstate option').text())
person.role_set.filter(group__acronym='irtf').delete()
person.role_set.create(name_id='chair',group=rg,email=person.email())
r = self.client.get(url)
q = PyQuery(r.content)
self.assertTrue('(IETF)' in q('#id_newstate option').text())
self.assertTrue('(IRTF)' in q('#id_newstate option').text())
person.role_set.filter(group=wg).delete()
r = self.client.get(url)
q = PyQuery(r.content)
self.assertFalse('(IETF)' in q('#id_newstate option').text())
self.assertTrue('(IRTF)' in q('#id_newstate option').text())
person.role_set.all().delete()
person.role_set.create(name_id='secr',group=Group.objects.get(acronym='secretariat'),email=person.email())
r = self.client.get(url)
q = PyQuery(r.content)
self.assertTrue('(IETF)' in q('#id_newstate option').text())
self.assertTrue('(IRTF)' in q('#id_newstate option').text())
class ChangeStreamStateTests(TestCase):
def test_set_tags(self):
draft = make_test_data()

View file

@ -3,6 +3,7 @@
import datetime
from django import forms
from django.db.models import Q
from django.http import HttpResponseRedirect, HttpResponseForbidden, Http404
from django.shortcuts import render, get_object_or_404, redirect
from django.template.loader import render_to_string
@ -1213,17 +1214,22 @@ class AdoptDraftForm(forms.Form):
super(AdoptDraftForm, self).__init__(*args, **kwargs)
state_types = set()
if has_role(user, "Secretariat"):
state_choices = State.objects.filter(type__in=['draft-stream-ietf','draft-stream-irtf'], used=True).exclude(slug__in=settings.GROUP_STATES_WITH_EXTRA_PROCESSING)
elif has_role(user, "IRTF Chair"):
#The IRTF chair can adopt a draft into any RG
group_ids = list(Group.objects.filter(type="rg", state="active").values_list('id', flat=True))
group_ids.extend(list(Group.objects.filter(type="wg", state="active", role__person__user=user, role__name__in=("chair", "delegate", "secr")).values_list('id', flat=True)))
self.fields["group"].queryset = self.fields["group"].queryset.filter(id__in=group_ids).distinct()
state_choices = State.objects.filter(type='draft-stream-irtf', used=True).exclude(slug__in=settings.GROUP_STATES_WITH_EXTRA_PROCESSING)
else:
self.fields["group"].queryset = self.fields["group"].queryset.filter(role__person__user=user, role__name__in=("chair", "delegate", "secr")).distinct()
state_choices = State.objects.filter(type='draft-stream-ietf', used=True).exclude(slug__in=settings.GROUP_STATES_WITH_EXTRA_PROCESSING)
state_types.update(['draft-stream-ietf','draft-stream-irtf'])
else:
if has_role(user, "IRTF Chair") or Group.objects.filter(type="rg", state="active", role__person__user=user, role__name__in=("chair", "delegate", "secr")).exists():
state_types.add('draft-stream-irtf')
if Group.objects.filter(type="wg", state="active", role__person__user=user, role__name__in=("chair", "delegate", "secr")).exists():
state_types.add('draft-stream-ietf')
state_choices = State.objects.filter(type__in=state_types, used=True).exclude(slug__in=settings.GROUP_STATES_WITH_EXTRA_PROCESSING)
if not has_role(user, "Secretariat"):
if has_role(user, "IRTF Chair"):
group_queryset = self.fields["group"].queryset.filter(Q(role__person__user=user, role__name__in=("chair", "delegate", "secr"))|Q(type="rg", state="active")).distinct()
else:
group_queryset = self.fields["group"].queryset.filter(role__person__user=user, role__name__in=("chair", "delegate", "secr")).distinct()
self.fields["group"].queryset = group_queryset
self.fields['group'].choices = [(g.pk, '%s - %s' % (g.acronym, g.name)) for g in self.fields["group"].queryset]
self.fields['newstate'].choices = [('','-- Pick a state --')]