From 280cbbd7074b2cdf9e68ecae595344874b133df0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20A=2E=20S=C3=A1nchez=20L=C3=B3pez?= Date: Wed, 30 Mar 2011 15:57:38 +0000 Subject: [PATCH] Handle draft without stream so WG chairs/delegates could raise call for adoptions. Fixes #642 - Legacy-Id: 3007 --- ietf/ietfworkflows/accounts.py | 21 +++++-- ietf/ietfworkflows/constants.py | 13 +++++ ietf/ietfworkflows/forms.py | 57 +++++++++++++++++-- ietf/ietfworkflows/streams.py | 10 +++- ietf/ietfworkflows/utils.py | 1 + ietf/ietfworkflows/views.py | 12 ++-- .../ietfworkflows/noworkflow_state_form.html | 26 +++++++++ 7 files changed, 123 insertions(+), 17 deletions(-) create mode 100644 ietf/ietfworkflows/constants.py create mode 100644 ietf/templates/ietfworkflows/noworkflow_state_form.html diff --git a/ietf/ietfworkflows/accounts.py b/ietf/ietfworkflows/accounts.py index c31b70e3e..da44f475b 100644 --- a/ietf/ietfworkflows/accounts.py +++ b/ietf/ietfworkflows/accounts.py @@ -1,5 +1,4 @@ -from ietf.idrfc.idrfc_wrapper import IdRfcWrapper, IdWrapper -from ietf.ietfworkflows.streams import get_streamed_draft, get_chair_model +from ietf.ietfworkflows.streams import get_streamed_draft def get_person_for_user(user): @@ -15,7 +14,15 @@ def is_secretariat(user): return bool(user.groups.filter(name='Secretariat')) -def is_chair(user, draft): +def is_wgchair(person): + return bool(person.wgchair_set.all()) + + +def is_wgdelegate(person): + return bool(person.wgdelegate_set.all()) + + +def is_chair_of_draft(user, draft): person = get_person_for_user(user) if not person: return False @@ -31,10 +38,12 @@ def is_chair(user, draft): def can_edit_state(user, draft): streamed = get_streamed_draft(draft) if not streamed or not streamed.stream: - return False + person = get_person_for_user(user) + return (is_secretariat(user) or + is_wgchair(person) or + is_wgdelegate(person)) return (is_secretariat(user) or - is_chair(user, draft) - ) + is_chair_of_draft(user, draft)) def can_edit_stream(user, draft): diff --git a/ietf/ietfworkflows/constants.py b/ietf/ietfworkflows/constants.py new file mode 100644 index 000000000..d29a1164f --- /dev/null +++ b/ietf/ietfworkflows/constants.py @@ -0,0 +1,13 @@ +# Required states +CALL_FOR_ADOPTION = 'Call For Adoption By WG Issued' +WG_DOCUMENT = 'WG Document' +SUBMITTED_TO_IESG = 'Submitted to IESG for Publication' + +REQUIRED_STATES = ( + CALL_FOR_ADOPTION, + WG_DOCUMENT, + SUBMITTED_TO_IESG, + ) + +# IETF Stream +IETF_STREAM = 'IETF' diff --git a/ietf/ietfworkflows/forms.py b/ietf/ietfworkflows/forms.py index 4f6138dcb..bc785192d 100644 --- a/ietf/ietfworkflows/forms.py +++ b/ietf/ietfworkflows/forms.py @@ -4,16 +4,19 @@ import datetime from django import forms from django.template.loader import render_to_string from workflows.models import State +from workflows.utils import set_workflow_for_object -from ietf.idtracker.models import PersonOrOrgInfo +from ietf.idtracker.models import PersonOrOrgInfo, IETFWG from ietf.wgchairs.accounts import get_person_for_user from ietf.ietfworkflows.models import Stream -from ietf.ietfworkflows.utils import (get_workflow_for_draft, - get_state_for_draft, +from ietf.ietfworkflows.utils import (get_workflow_for_draft, get_workflow_for_wg, + get_state_for_draft, get_state_by_name, update_state, FOLLOWUP_TAG, get_annotation_tags_for_draft, update_tags, update_stream) -from ietf.ietfworkflows.streams import get_stream_from_draft +from ietf.ietfworkflows.streams import (get_stream_from_draft, get_streamed_draft, + get_stream_by_name, set_stream_for_draft) +from ietf.ietfworkflows.constants import CALL_FOR_ADOPTION, IETF_STREAM class StreamDraftForm(forms.Form): @@ -41,6 +44,52 @@ class StreamDraftForm(forms.Form): return render_to_string(self.template, {'form': self}) +class NoWorkflowStateForm(StreamDraftForm): + comment = forms.CharField(widget=forms.Textarea) + weeks = forms.IntegerField(required=False) + wg = forms.ChoiceField(required=False) + + template = 'ietfworkflows/noworkflow_state_form.html' + + def __init__(self, *args, **kwargs): + super(NoWorkflowStateForm, self).__init__(*args, **kwargs) + self.wgs = None + self.onlywg = None + wgs = set(self.person.wgchair_set.all()).union(set(self.person.wgdelegate_set.all())) + if len(wgs) > 1: + self.wgs = list(wgs) + self.fields['wg'].choices = [(i.group_acronym.pk, i.group_acronym.group_acronym.name) for i in self.wgs] + else: + self.onlywg = wgs[0].group_acronym + + def save(self): + comment = self.cleaned_data.get('comment') + weeks = self.cleaned_data.get('weeks') + if self.onlywg: + wg = self.onlywg + else: + wg = IETFWG.objects.get(pk=self.cleaned_data.get('wg')) + estimated_date = None + if weeks: + now = datetime.date.today() + estimated_date = now + datetime.timedelta(weeks=weeks) + workflow = get_workflow_for_wg(wg) + set_workflow_for_object(self.draft, workflow) + stream = get_stream_by_name(IETF_STREAM) + streamed = get_streamed_draft(self.draft) + if not streamed: + set_stream_for_draft(self.draft, stream) + streamed = get_streamed_draft(self.draft) + streamed.stream = stream + streamed.group = wg + streamed.save() + update_state(obj=self.draft, + comment=comment, + person=self.person, + to_state=get_state_by_name(CALL_FOR_ADOPTION), + estimated_date=estimated_date) + + class DraftTagsStateForm(StreamDraftForm): comment = forms.CharField(widget=forms.Textarea) diff --git a/ietf/ietfworkflows/streams.py b/ietf/ietfworkflows/streams.py index 7eebddffa..7c037b73a 100644 --- a/ietf/ietfworkflows/streams.py +++ b/ietf/ietfworkflows/streams.py @@ -1,7 +1,5 @@ from django.db import models -from workflows.utils import set_workflow_for_object - from ietf.idrfc.idrfc_wrapper import IdRfcWrapper, IdWrapper from ietf.ietfworkflows.models import StreamedID, Stream @@ -22,6 +20,13 @@ def get_stream_from_draft(draft): return False +def get_stream_by_name(stream_name): + try: + return Stream.objects.get(name=stream_name) + except Stream.DoesNotExist: + return None + + def get_stream_from_id(stream_id): try: return Stream.objects.get(id=stream_id) @@ -106,5 +111,4 @@ def set_stream_for_draft(draft, stream): streamed.stream = stream streamed.group = None streamed.save() - set_workflow_for_object(draft, stream.workflow) return streamed.stream diff --git a/ietf/ietfworkflows/utils.py b/ietf/ietfworkflows/utils.py index 940e2a9c8..d9f27d39f 100644 --- a/ietf/ietfworkflows/utils.py +++ b/ietf/ietfworkflows/utils.py @@ -142,6 +142,7 @@ def set_tag(obj, tag): annotation_tag=tag) return relation + def set_tag_by_name(obj, tag_name): try: tag = AnnotationTag.objects.get(name=tag_name) diff --git a/ietf/ietfworkflows/views.py b/ietf/ietfworkflows/views.py index a4e04f431..515d4856e 100644 --- a/ietf/ietfworkflows/views.py +++ b/ietf/ietfworkflows/views.py @@ -1,9 +1,11 @@ -from ietf.idtracker.models import InternetDraft +from django.http import HttpResponseRedirect from django.shortcuts import get_object_or_404, render_to_response from django.template import RequestContext +from ietf.idtracker.models import InternetDraft from ietf.ietfworkflows.forms import (DraftTagsStateForm, - DraftStreamForm) + DraftStreamForm, + NoWorkflowStateForm) from ietf.ietfworkflows.streams import (get_stream_from_draft, get_streamed_draft) from ietf.ietfworkflows.utils import (get_workflow_history_for_draft, @@ -47,16 +49,18 @@ def stream_history(request, name): def edit_state(request, name, form_class=DraftTagsStateForm): user = request.user draft = get_object_or_404(InternetDraft, filename=name) + workflow = get_workflow_for_draft(draft) + if not workflow: + form_class = NoWorkflowStateForm if request.method == 'POST': form = form_class(user=user, draft=draft, data=request.POST) if form.is_valid(): form.save() - form = form_class(user=user, draft=draft) + return HttpResponseRedirect('.') else: form = form_class(user=user, draft=draft) state = get_state_for_draft(draft) stream = get_stream_from_draft(draft) - workflow = get_workflow_for_draft(draft) history = get_workflow_history_for_draft(draft, 'objectworkflowhistoryentry') tags = get_annotation_tags_for_draft(draft) return render_to_response('ietfworkflows/state_edit.html', diff --git a/ietf/templates/ietfworkflows/noworkflow_state_form.html b/ietf/templates/ietfworkflows/noworkflow_state_form.html new file mode 100644 index 000000000..cd8cbb5bd --- /dev/null +++ b/ietf/templates/ietfworkflows/noworkflow_state_form.html @@ -0,0 +1,26 @@ +
+ + + + + +
Adopt this draft in your WG
+
+ {{ form.errors.comment }} + Comment: *
+ +
+
+ {{ form.errors.weeks }} + Estimated time in 'Call for Adoption by WG Issued': (in weeks) +
+
+

+ You can manage different WGs, please select the WG in wich you want to call for adoption this draft +

+ {{ form.errors.wg }} + Select a WG: {{ form.wg }} +
+ +
+