Handle draft without stream so WG chairs/delegates could raise call for adoptions. Fixes #642

- Legacy-Id: 3007
This commit is contained in:
Emilio A. Sánchez López 2011-03-30 15:57:38 +00:00
parent aa7cfebc68
commit 280cbbd707
7 changed files with 123 additions and 17 deletions

View file

@ -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):

View file

@ -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'

View file

@ -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)

View file

@ -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

View file

@ -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)

View file

@ -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',

View file

@ -0,0 +1,26 @@
<form action="" method="post">
<table class="ietf-table edit-form" style="width: 100%;">
<tr>
<th>Adopt this draft in your WG</th>
</tr>
<tr style="vertical-align: top;"><td style="width: 50%;">
<div class="field{% if form.errors.comment %} error{% endif %}">
{{ form.errors.comment }}
Comment: <span class="required">*</span><br />
<textarea name="comment">{{ form.data.comment }}</textarea>
</div>
<div class="field{% if form.errors.weeks %} error{% endif %}">
{{ form.errors.weeks }}
Estimated time in 'Call for Adoption by WG Issued': <input type="text" name="weeks" value="{{ form.data.weeks }}" /> (in weeks)
</div>
<div class="field{% if form.errors.wg %} error{% endif %}">
<p>
You can manage different WGs, please select the WG in wich you want to call for adoption this draft
</p>
{{ form.errors.wg }}
Select a WG: {{ form.wg }}
</div>
<input type="submit" name="change" value="Call for adoption" />
</td></tr>
</table>
</form>