Merged in [8262] and [8263] from rjsparks@nostrum.com:
Changes when returning_item is automatically set to match the current IESGs preferences. Removes several chunks of dead code related to editing telechat dates. Improves returning item tests. Refactored multiple edit_telechat functions into one function in doc_views. Added a helper function for determining if ballots have changed to isolate the implementation. Fixed the issue with update_agenda setting the returning item bit even when the user explicitly said not to. Added prompting to encourage proper setting of the returning item bit to the edit_telechat view. Fixes #1209 - Legacy-Id: 8369 Note: SVN reference [8262] has been migrated to Git commit 9d8d0d63e2338d6fa81a82c553b8c6a1c3a105c1 Note: SVN reference [8263] has been migrated to Git commit 35a7436b782fc45e224ac9ea29bfb535fd3ce959
This commit is contained in:
parent
d9787d87a3
commit
ec3e247732
|
@ -475,7 +475,7 @@ class DeferUndeferTestCase(TestCase):
|
|||
self.assertEqual(r.status_code, 302)
|
||||
doc = Document.objects.get(name=name)
|
||||
self.assertEqual(doc.telechat_date(), second_date)
|
||||
self.assertTrue(doc.returning_item())
|
||||
self.assertFalse(doc.returning_item())
|
||||
defer_states = dict(draft=['draft-iesg','defer'],conflrev=['conflrev','defer'],statchg=['statchg','defer'])
|
||||
if doc.type_id in defer_states:
|
||||
self.assertEqual(doc.get_state(defer_states[doc.type_id][0]).slug,defer_states[doc.type_id][1])
|
||||
|
|
|
@ -138,6 +138,35 @@ class EditCharterTests(TestCase):
|
|||
charter = Document.objects.get(name=charter.name)
|
||||
self.assertTrue(not charter.latest_event(TelechatDocEvent, "scheduled_for_telechat").telechat_date)
|
||||
|
||||
def test_no_returning_item_for_different_ballot(self):
|
||||
make_test_data()
|
||||
|
||||
group = Group.objects.get(acronym="ames")
|
||||
charter = group.charter
|
||||
url = urlreverse('charter_telechat_date', kwargs=dict(name=charter.name))
|
||||
login_testing_unauthorized(self, "secretary", url)
|
||||
login = Person.objects.get(user__username="secretary")
|
||||
|
||||
# Make it so that the charter has been through internal review, and passed its external review
|
||||
# ballot on a previous telechat
|
||||
last_week = datetime.date.today()-datetime.timedelta(days=7)
|
||||
BallotDocEvent.objects.create(type='created_ballot',by=login,doc=charter,
|
||||
ballot_type=BallotType.objects.get(doc_type=charter.type,slug='r-extrev'),
|
||||
time=last_week)
|
||||
TelechatDocEvent.objects.create(type='scheduled_for_telechat',doc=charter,by=login,telechat_date=last_week,returning_item=False)
|
||||
BallotDocEvent.objects.create(type='created_ballot',by=login,doc=charter,
|
||||
ballot_type=BallotType.objects.get(doc_type=charter.type,slug='approve'))
|
||||
|
||||
# Put the charter onto a future telechat and verify returning item is not set
|
||||
telechat_date = TelechatDate.objects.active()[1].date
|
||||
r = self.client.post(url, dict(name=group.name, acronym=group.acronym, telechat_date=telechat_date.isoformat()))
|
||||
self.assertEqual(r.status_code, 302)
|
||||
|
||||
charter = Document.objects.get(name=charter.name)
|
||||
telechat_event = charter.latest_event(TelechatDocEvent, "scheduled_for_telechat")
|
||||
self.assertEqual(telechat_event.telechat_date, telechat_date)
|
||||
self.assertFalse(telechat_event.returning_item)
|
||||
|
||||
def test_edit_notify(self):
|
||||
make_test_data()
|
||||
|
||||
|
|
|
@ -224,17 +224,11 @@ class ConflictReviewTests(TestCase):
|
|||
doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission')
|
||||
self.assertEqual(doc.latest_event(TelechatDocEvent, "scheduled_for_telechat").telechat_date,telechat_date)
|
||||
|
||||
# move it forward a telechat (this should set the returning item bit)
|
||||
# move it forward a telechat (this should NOT set the returning item bit)
|
||||
telechat_date = TelechatDate.objects.active().order_by('date')[1].date
|
||||
r = self.client.post(url,dict(telechat_date=telechat_date.isoformat()))
|
||||
self.assertEqual(r.status_code,302)
|
||||
doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission')
|
||||
self.assertTrue(doc.returning_item())
|
||||
|
||||
# clear the returning item bit
|
||||
r = self.client.post(url,dict(telechat_date=telechat_date.isoformat()))
|
||||
self.assertEqual(r.status_code,302)
|
||||
doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission')
|
||||
self.assertFalse(doc.returning_item())
|
||||
|
||||
# set the returning item bit without changing the date
|
||||
|
@ -243,6 +237,12 @@ class ConflictReviewTests(TestCase):
|
|||
doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission')
|
||||
self.assertTrue(doc.returning_item())
|
||||
|
||||
# clear the returning item bit
|
||||
r = self.client.post(url,dict(telechat_date=telechat_date.isoformat()))
|
||||
self.assertEqual(r.status_code,302)
|
||||
doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission')
|
||||
self.assertFalse(doc.returning_item())
|
||||
|
||||
# Take the doc back off any telechat
|
||||
r = self.client.post(url,dict(telechat_date=""))
|
||||
self.assertEqual(r.status_code, 302)
|
||||
|
|
|
@ -10,7 +10,8 @@ from django.conf import settings
|
|||
import debug # pyflakes:ignore
|
||||
|
||||
from ietf.doc.models import ( Document, DocAlias, DocReminder, DocumentAuthor, DocEvent,
|
||||
ConsensusDocEvent, LastCallDocEvent, RelatedDocument, State, TelechatDocEvent, WriteupDocEvent )
|
||||
ConsensusDocEvent, LastCallDocEvent, RelatedDocument, State, TelechatDocEvent,
|
||||
WriteupDocEvent, BallotDocEvent)
|
||||
from ietf.doc.utils import get_tags_for_stream_id
|
||||
from ietf.name.models import StreamName, IntendedStdLevelName, DocTagName
|
||||
from ietf.group.models import Group
|
||||
|
@ -255,7 +256,25 @@ class EditInfoTests(TestCase):
|
|||
self.assertEqual(r.status_code, 302)
|
||||
|
||||
draft = Document.objects.get(name=draft.name)
|
||||
self.assertEqual(draft.latest_event(TelechatDocEvent, type="scheduled_for_telechat").telechat_date, TelechatDate.objects.active()[1].date)
|
||||
telechat_event = draft.latest_event(TelechatDocEvent, type="scheduled_for_telechat")
|
||||
self.assertEqual(telechat_event.telechat_date, TelechatDate.objects.active()[1].date)
|
||||
self.assertFalse(telechat_event.returning_item)
|
||||
|
||||
# change to a telechat that should cause returning item to be auto-detected
|
||||
# First, make it appear that the previous telechat has already passed
|
||||
telechat_event.telechat_date = datetime.date.today()-datetime.timedelta(days=7)
|
||||
telechat_event.save()
|
||||
ballot = draft.latest_event(BallotDocEvent, type="created_ballot")
|
||||
ballot.time = telechat_event.telechat_date
|
||||
ballot.save()
|
||||
|
||||
r = self.client.post(url, data)
|
||||
self.assertEqual(r.status_code, 302)
|
||||
|
||||
draft = Document.objects.get(name=draft.name)
|
||||
telechat_event = draft.latest_event(TelechatDocEvent, type="scheduled_for_telechat")
|
||||
self.assertEqual(telechat_event.telechat_date, TelechatDate.objects.active()[1].date)
|
||||
self.assertTrue(telechat_event.returning_item)
|
||||
|
||||
# remove from agenda
|
||||
data["telechat_date"] = ""
|
||||
|
|
|
@ -204,17 +204,11 @@ class StatusChangeTests(TestCase):
|
|||
doc = Document.objects.get(name='status-change-imaginary-mid-review')
|
||||
self.assertEqual(doc.latest_event(TelechatDocEvent, "scheduled_for_telechat").telechat_date,telechat_date)
|
||||
|
||||
# move it forward a telechat (this should set the returning item bit)
|
||||
# move it forward a telechat (this should NOT set the returning item bit)
|
||||
telechat_date = TelechatDate.objects.active().order_by('date')[1].date
|
||||
r = self.client.post(url,dict(telechat_date=telechat_date.isoformat()))
|
||||
self.assertEqual(r.status_code,302)
|
||||
doc = Document.objects.get(name='status-change-imaginary-mid-review')
|
||||
self.assertTrue(doc.returning_item())
|
||||
|
||||
# clear the returning item bit
|
||||
r = self.client.post(url,dict(telechat_date=telechat_date.isoformat()))
|
||||
self.assertEqual(r.status_code,302)
|
||||
doc = Document.objects.get(name='status-change-imaginary-mid-review')
|
||||
self.assertFalse(doc.returning_item())
|
||||
|
||||
# set the returning item bit without changing the date
|
||||
|
@ -223,6 +217,12 @@ class StatusChangeTests(TestCase):
|
|||
doc = Document.objects.get(name='status-change-imaginary-mid-review')
|
||||
self.assertTrue(doc.returning_item())
|
||||
|
||||
# clear the returning item bit
|
||||
r = self.client.post(url,dict(telechat_date=telechat_date.isoformat()))
|
||||
self.assertEqual(r.status_code,302)
|
||||
doc = Document.objects.get(name='status-change-imaginary-mid-review')
|
||||
self.assertFalse(doc.returning_item())
|
||||
|
||||
# Take the doc back off any telechat
|
||||
r = self.client.post(url,dict(telechat_date=""))
|
||||
self.assertEqual(r.status_code, 302)
|
||||
|
|
|
@ -76,7 +76,7 @@ urlpatterns = patterns('',
|
|||
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/replaces/$', views_draft.replaces, name='doc_change_replaces'),
|
||||
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/notify/$', views_draft.edit_notices, name='doc_change_notify'),
|
||||
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/status/$', views_draft.change_intention, name='doc_change_intended_status'),
|
||||
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/telechat/$', views_draft.telechat_date, name='doc_change_telechat_date'),
|
||||
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/telechat/$', views_doc.telechat_date, name='doc_change_telechat_date'),
|
||||
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/iesgnote/$', views_draft.edit_iesg_note, name='doc_change_iesg_note'),
|
||||
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/ad/$', views_draft.edit_ad, name='doc_change_ad'),
|
||||
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/consensus/$', views_draft.edit_consensus, name='doc_edit_consensus'),
|
||||
|
|
|
@ -5,7 +5,7 @@ from django.conf.urls import patterns, url
|
|||
urlpatterns = patterns('',
|
||||
url(r'^state/$', "ietf.doc.views_charter.change_state", name='charter_change_state'),
|
||||
url(r'^(?P<option>initcharter|recharter|abandon)/$', "ietf.doc.views_charter.change_state", name='charter_startstop_process'),
|
||||
url(r'^telechat/$', "ietf.doc.views_charter.telechat_date", name='charter_telechat_date'),
|
||||
url(r'^telechat/$', "ietf.doc.views_doc.telechat_date", name='charter_telechat_date'),
|
||||
url(r'^notify/$', "ietf.doc.views_charter.edit_notify", name='charter_edit_notify'),
|
||||
url(r'^ad/$', "ietf.doc.views_charter.edit_ad", name='charter_edit_ad'),
|
||||
url(r'^(?P<ann>action|review)/$', "ietf.doc.views_charter.announcement_text", name="charter_edit_announcement"),
|
||||
|
|
|
@ -7,6 +7,10 @@ urlpatterns = patterns('ietf.doc.views_conflict_review',
|
|||
url(r'^ad/$', "edit_ad", name='conflict_review_ad'),
|
||||
url(r'^approve/$', "approve", name='conflict_review_approve'),
|
||||
url(r'^start_conflict_review/$', "start_review", name='conflict_review_start'),
|
||||
)
|
||||
|
||||
urlpatterns += patterns('ietf.doc.views_doc',
|
||||
url(r'^telechat/$', "telechat_date", name='conflict_review_telechat_date'),
|
||||
)
|
||||
|
||||
|
||||
|
|
|
@ -7,8 +7,12 @@ urlpatterns = patterns('ietf.doc.views_status_change',
|
|||
url(r'^ad/$', "edit_ad", name='status_change_ad'),
|
||||
url(r'^title/$', "edit_title", name='status_change_title'),
|
||||
url(r'^approve/$', "approve", name='status_change_approve'),
|
||||
url(r'^telechat/$', "telechat_date", name='status_change_telechat_date'),
|
||||
url(r'^relations/$', "edit_relations", name='status_change_relations'),
|
||||
url(r'^last-call/$', "last_call", name='status_change_last_call'),
|
||||
)
|
||||
|
||||
urlpatterns += patterns('ietf.doc.views_doc',
|
||||
url(r'^telechat/$', "telechat_date", name='status_change_telechat_date'),
|
||||
)
|
||||
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@ import os
|
|||
import re
|
||||
import urllib
|
||||
import math
|
||||
import datetime
|
||||
|
||||
from django.conf import settings
|
||||
from django.db.models.query import EmptyQuerySet
|
||||
|
@ -306,6 +307,14 @@ def nice_consensus(consensus):
|
|||
}
|
||||
return mapping[consensus]
|
||||
|
||||
def has_same_ballot(doc, date1, date2=datetime.date.today()):
|
||||
""" Test if the most recent ballot created before the end of date1
|
||||
is the same as the most recent ballot created before the
|
||||
end of date 2. """
|
||||
ballot1 = doc.latest_event(BallotDocEvent,type='created_ballot',time__lt=date1+datetime.timedelta(days=1))
|
||||
ballot2 = doc.latest_event(BallotDocEvent,type='created_ballot',time__lt=date2+datetime.timedelta(days=1))
|
||||
return ballot1==ballot2
|
||||
|
||||
def update_telechat(request, doc, by, new_telechat_date, new_returning_item=None):
|
||||
from ietf.doc.models import TelechatDocEvent
|
||||
|
||||
|
@ -315,8 +324,6 @@ def update_telechat(request, doc, by, new_telechat_date, new_returning_item=None
|
|||
prev_returning = bool(prev and prev.returning_item)
|
||||
prev_telechat = prev.telechat_date if prev else None
|
||||
prev_agenda = bool(prev_telechat)
|
||||
|
||||
returning_item_changed = bool(new_returning_item != None and new_returning_item != prev_returning)
|
||||
|
||||
if new_returning_item == None:
|
||||
returning = prev_returning
|
||||
|
@ -327,9 +334,14 @@ def update_telechat(request, doc, by, new_telechat_date, new_returning_item=None
|
|||
# fully updated, nothing to do
|
||||
return
|
||||
|
||||
# auto-update returning item
|
||||
if (not returning_item_changed and on_agenda and prev_agenda
|
||||
and new_telechat_date != prev_telechat):
|
||||
# auto-set returning item _ONLY_ if the caller did not provide a value
|
||||
if ( new_returning_item != None
|
||||
and on_agenda
|
||||
and prev_agenda
|
||||
and new_telechat_date != prev_telechat
|
||||
and prev_telechat < datetime.date.today()
|
||||
and has_same_ballot(doc,prev.telechat_date)
|
||||
):
|
||||
returning = True
|
||||
|
||||
e = TelechatDocEvent()
|
||||
|
|
|
@ -83,34 +83,6 @@ def historic_milestones_for_charter(charter, rev):
|
|||
|
||||
return res
|
||||
|
||||
|
||||
def update_telechat(request, doc, by, new_telechat_date):
|
||||
# FIXME: reuse function in doc/utils.py instead of this one
|
||||
# (need to fix auto-setting returning item problem first though)
|
||||
from ietf.doc.models import TelechatDocEvent
|
||||
|
||||
on_agenda = bool(new_telechat_date)
|
||||
|
||||
prev = doc.latest_event(TelechatDocEvent, type="scheduled_for_telechat")
|
||||
prev_telechat = prev.telechat_date if prev else None
|
||||
prev_agenda = bool(prev_telechat)
|
||||
|
||||
e = TelechatDocEvent()
|
||||
e.type = "scheduled_for_telechat"
|
||||
e.by = by
|
||||
e.doc = doc
|
||||
e.telechat_date = new_telechat_date
|
||||
|
||||
if on_agenda != prev_agenda:
|
||||
if on_agenda:
|
||||
e.desc = "Placed on agenda for telechat - %s" % new_telechat_date
|
||||
else:
|
||||
e.desc = "Removed from agenda for telechat"
|
||||
e.save()
|
||||
elif on_agenda and new_telechat_date != prev_telechat:
|
||||
e.desc = "Telechat date has been changed to <b>%s</b> from <b>%s</b>" % (new_telechat_date, prev_telechat)
|
||||
e.save()
|
||||
|
||||
def email_state_changed(request, doc, text):
|
||||
to = [e.strip() for e in doc.notify.replace(';', ',').split(',')]
|
||||
if not to:
|
||||
|
|
|
@ -14,16 +14,15 @@ from django.contrib.auth.decorators import login_required
|
|||
import debug # pyflakes:ignore
|
||||
|
||||
from ietf.doc.models import ( Document, DocHistory, State, DocEvent, BallotDocEvent,
|
||||
BallotPositionDocEvent, InitialReviewDocEvent, NewRevisionDocEvent, TelechatDocEvent,
|
||||
BallotPositionDocEvent, InitialReviewDocEvent, NewRevisionDocEvent,
|
||||
WriteupDocEvent, save_document_in_history )
|
||||
from ietf.doc.utils import ( add_state_change_event, close_open_ballots,
|
||||
create_ballot_if_not_open, get_chartering_type, update_telechat )
|
||||
create_ballot_if_not_open, get_chartering_type )
|
||||
from ietf.doc.utils_charter import ( historic_milestones_for_charter,
|
||||
approved_revision, default_review_text, default_action_text, email_state_changed,
|
||||
generate_ballot_writeup, generate_issue_ballot_mail, next_approved_revision, next_revision )
|
||||
from ietf.group.models import ChangeStateGroupEvent, MilestoneGroupEvent
|
||||
from ietf.group.utils import save_group_in_history, save_milestone_in_history, can_manage_group_type
|
||||
from ietf.iesg.models import TelechatDate
|
||||
from ietf.ietfauth.utils import has_role, role_required
|
||||
from ietf.name.models import GroupStateName
|
||||
from ietf.person.models import Person
|
||||
|
@ -32,7 +31,6 @@ from ietf.utils.mail import send_mail_preformatted
|
|||
from ietf.utils.textupload import get_cleaned_text_file_content
|
||||
from ietf.group.mails import email_iesg_secretary_re_charter
|
||||
|
||||
|
||||
class ChangeStateForm(forms.Form):
|
||||
charter_state = forms.ModelChoiceField(State.objects.filter(used=True, type="charter"), label="Charter state", empty_label=None, required=False)
|
||||
initial_time = forms.IntegerField(initial=0, label="Review time", help_text="(in weeks)", required=False)
|
||||
|
@ -227,46 +225,6 @@ def change_state(request, name, option=None):
|
|||
),
|
||||
context_instance=RequestContext(request))
|
||||
|
||||
class TelechatForm(forms.Form):
|
||||
telechat_date = forms.TypedChoiceField(coerce=lambda x: datetime.datetime.strptime(x, '%Y-%m-%d').date(), empty_value=None, required=False)
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(self.__class__, self).__init__(*args, **kwargs)
|
||||
|
||||
dates = [d.date for d in TelechatDate.objects.active().order_by('date')]
|
||||
init = kwargs['initial'].get("telechat_date")
|
||||
if init and init not in dates:
|
||||
dates.insert(0, init)
|
||||
|
||||
self.fields['telechat_date'].choices = [("", "(not on agenda)")] + [(d, d.strftime("%Y-%m-%d")) for d in dates]
|
||||
|
||||
|
||||
@role_required("Area Director", "Secretariat")
|
||||
def telechat_date(request, name):
|
||||
doc = get_object_or_404(Document, type="charter", name=name)
|
||||
login = request.user.person
|
||||
|
||||
e = doc.latest_event(TelechatDocEvent, type="scheduled_for_telechat")
|
||||
|
||||
initial = dict(telechat_date=e.telechat_date if e else None)
|
||||
if request.method == "POST":
|
||||
form = TelechatForm(request.POST, initial=initial)
|
||||
|
||||
if form.is_valid():
|
||||
update_telechat(request, doc, login, form.cleaned_data['telechat_date'])
|
||||
return redirect("doc_view", name=doc.name)
|
||||
else:
|
||||
form = TelechatForm(initial=initial)
|
||||
|
||||
return render_to_response('doc/charter/edit_telechat_date.html',
|
||||
dict(doc=doc,
|
||||
form=form,
|
||||
user=request.user,
|
||||
login=login,
|
||||
okstates=['intrev','extrev','iesgrev'],
|
||||
),
|
||||
context_instance=RequestContext(request))
|
||||
|
||||
class NotifyForm(forms.Form):
|
||||
notify = forms.CharField(max_length=255, help_text="List of email addresses to receive state notifications, separated by comma", label="Notification list", required=False)
|
||||
|
||||
|
|
|
@ -9,11 +9,11 @@ from django.template.loader import render_to_string
|
|||
from django.conf import settings
|
||||
|
||||
from ietf.doc.models import ( BallotDocEvent, BallotPositionDocEvent, DocAlias, DocEvent,
|
||||
Document, NewRevisionDocEvent, State, TelechatDocEvent, save_document_in_history )
|
||||
Document, NewRevisionDocEvent, State, save_document_in_history )
|
||||
from ietf.doc.utils import ( add_state_change_event, close_open_ballots,
|
||||
create_ballot_if_not_open, get_document_content, update_telechat )
|
||||
from ietf.doc.mails import email_iana
|
||||
from ietf.doc.forms import TelechatForm, AdForm, NotifyForm
|
||||
from ietf.doc.forms import AdForm, NotifyForm
|
||||
from ietf.group.models import Role, Group
|
||||
from ietf.iesg.models import TelechatDate
|
||||
from ietf.ietfauth.utils import has_role, role_required, is_authorized_in_doc_stream
|
||||
|
@ -512,31 +512,3 @@ def start_review_as_stream_owner(request, name):
|
|||
'doc_to_review': doc_to_review,
|
||||
},
|
||||
context_instance = RequestContext(request))
|
||||
|
||||
@role_required("Area Director", "Secretariat")
|
||||
def telechat_date(request, name):
|
||||
doc = get_object_or_404(Document, type="conflrev", name=name)
|
||||
login = request.user.person
|
||||
|
||||
e = doc.latest_event(TelechatDocEvent, type="scheduled_for_telechat")
|
||||
initial_returning_item = bool(e and e.returning_item)
|
||||
|
||||
initial = dict(telechat_date=e.telechat_date if e else None,
|
||||
returning_item = initial_returning_item,
|
||||
)
|
||||
if request.method == "POST":
|
||||
form = TelechatForm(request.POST, initial=initial)
|
||||
|
||||
if form.is_valid():
|
||||
update_telechat(request, doc, login, form.cleaned_data['telechat_date'], form.cleaned_data['returning_item'])
|
||||
return redirect("doc_view", name=doc.name)
|
||||
else:
|
||||
form = TelechatForm(initial=initial)
|
||||
|
||||
return render_to_response('doc/edit_telechat_date.html',
|
||||
dict(doc=doc,
|
||||
form=form,
|
||||
user=request.user,
|
||||
login=login),
|
||||
context_instance=RequestContext(request))
|
||||
|
||||
|
|
|
@ -46,7 +46,7 @@ from ietf.doc.models import ( Document, DocAlias, DocHistory, DocEvent, BallotDo
|
|||
IESG_BALLOT_ACTIVE_STATES)
|
||||
from ietf.doc.utils import ( add_links_in_new_revision_events, augment_events_with_revision,
|
||||
can_adopt_draft, get_chartering_type, get_document_content, get_tags_for_stream_id,
|
||||
needed_ballot_positions, nice_consensus, prettify_std_name)
|
||||
needed_ballot_positions, nice_consensus, prettify_std_name, update_telechat, has_same_ballot)
|
||||
from ietf.community.models import CommunityList
|
||||
from ietf.doc.mails import email_ad
|
||||
from ietf.doc.views_status_change import RELATION_SLUGS as status_change_relationships
|
||||
|
@ -56,6 +56,7 @@ from ietf.ietfauth.utils import has_role, is_authorized_in_doc_stream, user_is_p
|
|||
from ietf.name.models import StreamName, BallotPositionName
|
||||
from ietf.person.models import Email
|
||||
from ietf.utils.history import find_history_active_at
|
||||
from ietf.doc.forms import TelechatForm
|
||||
|
||||
def render_document_top(request, doc, tab, name):
|
||||
tabs = []
|
||||
|
@ -849,3 +850,50 @@ def add_comment(request, name):
|
|||
form=form),
|
||||
context_instance=RequestContext(request))
|
||||
|
||||
@role_required("Area Director", "Secretariat")
|
||||
def telechat_date(request, name):
|
||||
doc = get_object_or_404(Document, name=name)
|
||||
login = request.user.person
|
||||
|
||||
e = doc.latest_event(TelechatDocEvent, type="scheduled_for_telechat")
|
||||
initial_returning_item = bool(e and e.returning_item)
|
||||
|
||||
prompts = []
|
||||
if e and doc.type.slug != 'charter':
|
||||
if e.telechat_date==datetime.date.today():
|
||||
prompts.append( "This document is currently scheduled for today's telechat. "
|
||||
+"Please set the returning item bit carefully.")
|
||||
|
||||
elif e.telechat_date<datetime.date.today() and has_same_ballot(doc,e.telechat_date):
|
||||
initial_returning_item = True
|
||||
prompts.append( "This document appears to have been on a previous telechat with the same ballot, "
|
||||
+"so the returning item bit has been set. Clear it if that is not appropriate.")
|
||||
|
||||
else:
|
||||
pass
|
||||
|
||||
initial = dict(telechat_date=e.telechat_date if e else None,
|
||||
returning_item = initial_returning_item,
|
||||
)
|
||||
if request.method == "POST":
|
||||
form = TelechatForm(request.POST, initial=initial)
|
||||
|
||||
if form.is_valid():
|
||||
if doc.type.slug=='charter':
|
||||
cleaned_returning_item = None
|
||||
else:
|
||||
cleaned_returning_item = form.cleaned_data['returning_item']
|
||||
update_telechat(request, doc, login, form.cleaned_data['telechat_date'],cleaned_returning_item)
|
||||
return redirect('doc_view', name=doc.name)
|
||||
else:
|
||||
form = TelechatForm(initial=initial)
|
||||
if doc.type.slug=='charter':
|
||||
del form.fields['returning_item']
|
||||
|
||||
return render_to_response('doc/edit_telechat_date.html',
|
||||
dict(doc=doc,
|
||||
form=form,
|
||||
user=request.user,
|
||||
prompts=prompts,
|
||||
login=login),
|
||||
context_instance=RequestContext(request))
|
||||
|
|
|
@ -877,49 +877,6 @@ def edit_notices(request, name):
|
|||
},
|
||||
context_instance = RequestContext(request))
|
||||
|
||||
class TelechatForm(forms.Form):
|
||||
telechat_date = forms.TypedChoiceField(coerce=lambda x: datetime.datetime.strptime(x, '%Y-%m-%d').date(), empty_value=None, required=False)
|
||||
returning_item = forms.BooleanField(required=False)
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(self.__class__, self).__init__(*args, **kwargs)
|
||||
|
||||
dates = [d.date for d in TelechatDate.objects.active().order_by('date')]
|
||||
init = kwargs['initial'].get("telechat_date")
|
||||
if init and init not in dates:
|
||||
dates.insert(0, init)
|
||||
|
||||
self.fields['telechat_date'].choices = [("", "(not on agenda)")] + [(d, d.strftime("%Y-%m-%d")) for d in dates]
|
||||
|
||||
|
||||
@role_required("Area Director", "Secretariat")
|
||||
def telechat_date(request, name):
|
||||
doc = get_object_or_404(Document, type="draft", name=name)
|
||||
login = request.user.person
|
||||
|
||||
e = doc.latest_event(TelechatDocEvent, type="scheduled_for_telechat")
|
||||
initial_returning_item = bool(e and e.returning_item)
|
||||
|
||||
initial = dict(telechat_date=e.telechat_date if e else None,
|
||||
returning_item = initial_returning_item,
|
||||
)
|
||||
if request.method == "POST":
|
||||
form = TelechatForm(request.POST, initial=initial)
|
||||
|
||||
if form.is_valid():
|
||||
update_telechat(request, doc, login, form.cleaned_data['telechat_date'],form.cleaned_data['returning_item'])
|
||||
return redirect('doc_view', name=doc.name)
|
||||
else:
|
||||
form = TelechatForm(initial=initial)
|
||||
|
||||
return render_to_response('doc/edit_telechat_date.html',
|
||||
dict(doc=doc,
|
||||
form=form,
|
||||
user=request.user,
|
||||
login=login),
|
||||
context_instance=RequestContext(request))
|
||||
|
||||
|
||||
class IESGNoteForm(forms.Form):
|
||||
note = forms.CharField(widget=forms.Textarea, label="IESG note", required=False)
|
||||
|
||||
|
|
|
@ -9,9 +9,9 @@ from django.template.loader import render_to_string
|
|||
from django.conf import settings
|
||||
|
||||
from ietf.doc.models import ( Document, DocAlias, State, DocEvent, BallotDocEvent,
|
||||
BallotPositionDocEvent, NewRevisionDocEvent, TelechatDocEvent, WriteupDocEvent,
|
||||
BallotPositionDocEvent, NewRevisionDocEvent, WriteupDocEvent,
|
||||
save_document_in_history )
|
||||
from ietf.doc.forms import TelechatForm, AdForm, NotifyForm
|
||||
from ietf.doc.forms import AdForm, NotifyForm
|
||||
from ietf.doc.lastcall import request_last_call
|
||||
from ietf.doc.utils import get_document_content, add_state_change_event, update_telechat, close_open_ballots, create_ballot_if_not_open
|
||||
from ietf.doc.views_ballot import LastCallTextForm
|
||||
|
@ -590,34 +590,6 @@ def start_rfc_status_change(request,name):
|
|||
},
|
||||
context_instance = RequestContext(request))
|
||||
|
||||
|
||||
@role_required("Area Director", "Secretariat")
|
||||
def telechat_date(request, name):
|
||||
doc = get_object_or_404(Document, type="statchg", name=name)
|
||||
login = request.user.person
|
||||
|
||||
e = doc.latest_event(TelechatDocEvent, type="scheduled_for_telechat")
|
||||
initial_returning_item = bool(e and e.returning_item)
|
||||
|
||||
initial = dict(telechat_date=e.telechat_date if e else None,
|
||||
returning_item = initial_returning_item,
|
||||
)
|
||||
if request.method == "POST":
|
||||
form = TelechatForm(request.POST, initial=initial)
|
||||
|
||||
if form.is_valid():
|
||||
update_telechat(request, doc, login, form.cleaned_data['telechat_date'], form.cleaned_data['returning_item'])
|
||||
return redirect("doc_view", name=doc.name)
|
||||
else:
|
||||
form = TelechatForm(initial=initial)
|
||||
|
||||
return render_to_response('doc/edit_telechat_date.html',
|
||||
dict(doc=doc,
|
||||
form=form,
|
||||
user=request.user,
|
||||
login=login),
|
||||
context_instance=RequestContext(request))
|
||||
|
||||
@role_required("Area Director", "Secretariat")
|
||||
def edit_relations(request, name):
|
||||
"""Change the affected set of RFCs"""
|
||||
|
|
|
@ -26,4 +26,11 @@ form.telechat-date td.actions {
|
|||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
{% if prompts %}
|
||||
<div>
|
||||
{% for prompt in prompts %}
|
||||
<div class="prompt">{{prompt}}</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
|
|
@ -268,6 +268,8 @@ div.info-message-success { border: 1px solid green; background-color: #eeffbb; p
|
|||
div.info-message-warning { border: 1px dashed red; background-color: #ffeeaa; padding: 1em 2em; margin: 1em 0px; }
|
||||
div.info-message-error { border: 1px solid red; background-color: #ffeebb; padding: 5px 10px; margin: 1em 0px; color: red; }
|
||||
|
||||
/* Prompts */
|
||||
div.prompt { border: 1px dashed red; background-color: #ffeeaa; padding: 1em 2em; margin: 1em 0px; }
|
||||
|
||||
/* Form styles */
|
||||
.baseform {
|
||||
|
|
Loading…
Reference in a new issue