Handle draft without stream so WG chairs/delegates could raise call for adoptions. Fixes #642
- Legacy-Id: 3007
This commit is contained in:
parent
aa7cfebc68
commit
280cbbd707
|
@ -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):
|
||||
|
|
13
ietf/ietfworkflows/constants.py
Normal file
13
ietf/ietfworkflows/constants.py
Normal 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'
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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',
|
||||
|
|
26
ietf/templates/ietfworkflows/noworkflow_state_form.html
Normal file
26
ietf/templates/ietfworkflows/noworkflow_state_form.html
Normal 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>
|
Loading…
Reference in a new issue