From 2cf79bb04cce7b8da2eb9928f01aee65194b7e64 Mon Sep 17 00:00:00 2001 From: Ole Laursen Date: Tue, 13 Aug 2013 16:44:07 +0000 Subject: [PATCH] Move update_telechat from idrfc.utils to doc.utils, port remaining code to using log_state_changed from doc.utils, remove idrfc/utils.py - Legacy-Id: 6050 --- ietf/doc/utils.py | 51 +++++++++++++++ ietf/doc/views_conflict_review.py | 4 +- ietf/doc/views_status_change.py | 3 +- ietf/idrfc/expire.py | 10 +-- ietf/idrfc/lastcall.py | 9 ++- ietf/idrfc/mails.py | 7 +- ietf/idrfc/utils.py | 103 ------------------------------ ietf/idrfc/views_ballot.py | 28 ++++---- ietf/idrfc/views_edit.py | 11 ++-- ietf/iesg/views.py | 2 +- ietf/wgcharter/utils.py | 2 +- 11 files changed, 83 insertions(+), 147 deletions(-) delete mode 100644 ietf/idrfc/utils.py diff --git a/ietf/doc/utils.py b/ietf/doc/utils.py index 364b6d716..7cf3ce3ae 100644 --- a/ietf/doc/utils.py +++ b/ietf/doc/utils.py @@ -239,3 +239,54 @@ def nice_consensus(consensus): False: "No" } return mapping[consensus] + +def update_telechat(request, doc, by, new_telechat_date, new_returning_item=None): + from ietf.doc.models import TelechatDocEvent + + on_agenda = bool(new_telechat_date) + + prev = doc.latest_event(TelechatDocEvent, type="scheduled_for_telechat") + 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 + else: + returning = new_returning_item + + if returning == prev_returning and new_telechat_date == prev_telechat: + # 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): + returning = True + + e = TelechatDocEvent() + e.type = "scheduled_for_telechat" + e.by = by + e.doc = doc + e.returning_item = returning + 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" + elif on_agenda and new_telechat_date != prev_telechat: + e.desc = "Telechat date has been changed to %s from %s" % ( + new_telechat_date, prev_telechat) + else: + # we didn't reschedule but flipped returning item bit - let's + # just explain that + if returning: + e.desc = "Set telechat returning item indication" + else: + e.desc = "Removed telechat returning item indication" + + e.save() diff --git a/ietf/doc/views_conflict_review.py b/ietf/doc/views_conflict_review.py index 36c316edc..7b6afd9fe 100644 --- a/ietf/doc/views_conflict_review.py +++ b/ietf/doc/views_conflict_review.py @@ -8,9 +8,7 @@ from django.template import RequestContext from django.template.loader import render_to_string from django.conf import settings -from ietf.idrfc.utils import update_telechat - -from ietf.doc.utils import log_state_changed +from ietf.doc.utils import log_state_changed, update_telechat from ietf.doc.models import save_document_in_history from ietf.doc.utils import create_ballot_if_not_open, close_open_ballots, get_document_content diff --git a/ietf/doc/views_status_change.py b/ietf/doc/views_status_change.py index 389cfc86a..dd8911a24 100644 --- a/ietf/doc/views_status_change.py +++ b/ietf/doc/views_status_change.py @@ -8,8 +8,7 @@ from django.template import RequestContext from django.template.loader import render_to_string from django.conf import settings -from ietf.idrfc.utils import update_telechat -from ietf.doc.utils import log_state_changed +from ietf.doc.utils import log_state_changed, update_telechat from ietf.doc.models import save_document_in_history from ietf.doc.utils import create_ballot_if_not_open, close_open_ballots, get_document_content diff --git a/ietf/idrfc/expire.py b/ietf/idrfc/expire.py index 126d6f76b..53807d8cf 100644 --- a/ietf/idrfc/expire.py +++ b/ietf/idrfc/expire.py @@ -4,13 +4,13 @@ from django.conf import settings from django.template.loader import render_to_string from django.db.models import Q -import datetime, os, shutil, glob, re, itertools +import datetime, os, shutil, glob, re from ietf.utils.mail import send_mail, send_mail_subj -from ietf.idrfc.utils import log_state_changed from ietf.doc.models import Document, DocEvent, State, save_document_in_history, IESG_SUBSTATE_TAGS from ietf.person.models import Person, Email from ietf.meeting.models import Meeting +from ietf.doc.utils import log_state_changed def expirable_draft(draft): """Return whether draft is in an expirable state or not. This is @@ -128,14 +128,14 @@ def expire_draft(doc): save_document_in_history(doc) if doc.latest_event(type='started_iesg_process'): dead_state = State.objects.get(used=True, type="draft-iesg", slug="dead") - prev = doc.get_state("draft-iesg") + prev_state = doc.friendly_state() prev_tag = doc.tags.filter(slug__in=IESG_SUBSTATE_TAGS) prev_tag = prev_tag[0] if prev_tag else None - if prev != dead_state: + if doc.get_state("draft-iesg") != dead_state: doc.set_state(dead_state) if prev_tag: doc.tags.remove(prev_tag) - log_state_changed(None, doc, system, prev, prev_tag) + log_state_changed(None, doc, system, doc.friendly_state(), prev_state) e = DocEvent(doc=doc, by=system) e.type = "expired_document" diff --git a/ietf/idrfc/lastcall.py b/ietf/idrfc/lastcall.py index ba8975502..cb77b04db 100644 --- a/ietf/idrfc/lastcall.py +++ b/ietf/idrfc/lastcall.py @@ -4,11 +4,10 @@ import datetime from django.conf import settings -from ietf.idrfc.mails import * -from ietf.idrfc.utils import * - from ietf.doc.models import * from ietf.person.models import Person +from ietf.doc.utils import log_state_changed +from ietf.idrfc.mails import * def request_last_call(request, doc): if not doc.latest_event(type="changed_ballot_writeup_text"): @@ -45,7 +44,7 @@ def expire_last_call(doc): save_document_in_history(doc) - prev = doc.get_state("draft-iesg") + prev_state = doc.friendly_state() doc.set_state(state) prev_tag = doc.tags.filter(slug__in=IESG_SUBSTATE_TAGS) @@ -53,7 +52,7 @@ def expire_last_call(doc): if prev_tag: doc.tags.remove(prev_tag) - e = log_state_changed(None, doc, Person.objects.get(name="(System)"), prev, prev_tag) + e = log_state_changed(None, doc, Person.objects.get(name="(System)"), doc.friendly_state(), prev_state) doc.time = e.time doc.save() diff --git a/ietf/idrfc/mails.py b/ietf/idrfc/mails.py index 67d044c65..4a6e17360 100644 --- a/ietf/idrfc/mails.py +++ b/ietf/idrfc/mails.py @@ -1,7 +1,6 @@ # generation of mails -import textwrap -from datetime import datetime, date, time, timedelta +import textwrap, datetime from django.template.loader import render_to_string from django.utils.html import strip_tags @@ -100,11 +99,11 @@ def generate_ballot_writeup(request, doc): return e def generate_last_call_announcement(request, doc): - expiration_date = date.today() + timedelta(days=14) + expiration_date = datetime.date.today() + datetime.timedelta(days=14) cc = [] if doc.group.type_id in ("individ", "area"): group = "an individual submitter" - expiration_date += timedelta(days=14) + expiration_date += datetime.timedelta(days=14) else: group = "the %s WG (%s)" % (doc.group.name, doc.group.acronym) if doc.group.list_email: diff --git a/ietf/idrfc/utils.py b/ietf/idrfc/utils.py deleted file mode 100644 index 590fca086..000000000 --- a/ietf/idrfc/utils.py +++ /dev/null @@ -1,103 +0,0 @@ -from django.conf import settings - -from ietf.idrfc.mails import * -from ietf.ietfauth.utils import has_role, is_authorized_in_doc_stream - -def add_document_comment(request, doc, text, ballot=None): - if request: - login = IESGLogin.objects.get(login_name=request.user.username) - else: - login = None - - c = DocumentComment() - c.document = doc.idinternal - c.public_flag = True - c.version = doc.revision_display() - c.comment_text = text - c.created_by = login - if ballot: - c.ballot = ballot - c.rfc_flag = doc.idinternal.rfc_flag - c.save() - -def generate_ballot(request, doc): - ballot = BallotInfo() - ballot.ballot = doc.idinternal.ballot_id - ballot.active = False - ballot.last_call_text = generate_last_call_announcement(request, doc) - ballot.approval_text = generate_approval_mail(request, doc) - ballot.ballot_writeup = render_to_string("idrfc/ballot_writeup.txt") - ballot.save() - doc.idinternal.ballot = ballot - return ballot - -def log_state_changed(request, doc, by, prev_iesg_state, prev_iesg_tag): - from ietf.doc.models import DocEvent, IESG_SUBSTATE_TAGS - - state = doc.get_state("draft-iesg") - - state_name = state.name - tags = doc.tags.filter(slug__in=IESG_SUBSTATE_TAGS) - if tags: - state_name += "::" + tags[0].name - - prev_state_name = prev_iesg_state.name if prev_iesg_state else "I-D Exists" - if prev_iesg_tag: - prev_state_name += "::" + prev_iesg_tag.name - - e = DocEvent(doc=doc, by=by) - e.type = "changed_document" - e.desc = u"State changed to %s from %s" % (state_name, prev_state_name) - e.save() - return e - -def update_telechat(request, doc, by, new_telechat_date, new_returning_item=None): - from ietf.doc.models import TelechatDocEvent - - on_agenda = bool(new_telechat_date) - - prev = doc.latest_event(TelechatDocEvent, type="scheduled_for_telechat") - 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 - else: - returning = new_returning_item - - if returning == prev_returning and new_telechat_date == prev_telechat: - # 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): - returning = True - - e = TelechatDocEvent() - e.type = "scheduled_for_telechat" - e.by = by - e.doc = doc - e.returning_item = returning - 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" - elif on_agenda and new_telechat_date != prev_telechat: - e.desc = "Telechat date has been changed to %s from %s" % ( - new_telechat_date, prev_telechat) - else: - # we didn't reschedule but flipped returning item bit - let's - # just explain that - if returning: - e.desc = "Set telechat returning item indication" - else: - e.desc = "Removed telechat returning item indication" - - e.save() diff --git a/ietf/idrfc/views_ballot.py b/ietf/idrfc/views_ballot.py index 746d4278d..2f01cb1f6 100644 --- a/ietf/idrfc/views_ballot.py +++ b/ietf/idrfc/views_ballot.py @@ -21,7 +21,6 @@ from ietf.iesg.models import TelechatDate from ietf.ipr.models import IprDetail from ietf.ipr.search import iprs_from_docs from ietf.idrfc.mails import * -from ietf.idrfc.utils import * from ietf.idrfc.lastcall import request_last_call from ietf.doc.utils import * @@ -31,9 +30,6 @@ from ietf.name.models import BallotPositionName from ietf.message.utils import infer_message from ietf.person.models import Person -from ietf.doc.utils import log_state_changed as docutil_log_state_changed -from ietf.idrfc.utils import log_state_changed as idrfcutil_log_state_changed - BALLOT_CHOICES = (("yes", "Yes"), ("noobj", "No Objection"), ("discuss", "Discuss"), @@ -57,14 +53,14 @@ def do_undefer_ballot(request, doc): prev_state = doc.friendly_state() if doc.type_id == 'draft': doc.set_state(State.objects.get(used=True, type="draft-iesg", slug='iesg-eva')) - prev_tag = doc.tags.filter(slug__in=('point', 'ad-f-up', 'need-rev', 'extpty')) + prev_tag = doc.tags.filter(slug__in=IESG_SUBSTATE_TAGS) prev_tag = prev_tag[0] if prev_tag else None if prev_tag: doc.tags.remove(prev_tag) elif doc.type_id == 'conflrev': doc.set_state(State.objects.get(used=True, type='conflrev',slug='iesgeval')) - e = docutil_log_state_changed(request, doc, login, doc.friendly_state(), prev_state) + e = log_state_changed(request, doc, login, doc.friendly_state(), prev_state) doc.time = e.time doc.save() @@ -368,7 +364,7 @@ def defer_ballot(request, name): elif doc.type_id == 'conflrev': doc.set_state(State.objects.get(used=True, type='conflrev', slug='defer')) - e = docutil_log_state_changed(request, doc, login, doc.friendly_state(), prev_state) + e = log_state_changed(request, doc, login, doc.friendly_state(), prev_state) doc.time = e.time doc.save() @@ -450,7 +446,7 @@ def lastcalltext(request, name): if "send_last_call_request" in request.POST: save_document_in_history(doc) - prev = doc.get_state("draft-iesg") + prev_state = doc.friendly_state() doc.set_state(State.objects.get(used=True, type="draft-iesg", slug='lc-req')) prev_tag = doc.tags.filter(slug__in=IESG_SUBSTATE_TAGS) @@ -458,7 +454,7 @@ def lastcalltext(request, name): if prev_tag: doc.tags.remove(prev_tag) - e = idrfcutil_log_state_changed(request, doc, login, prev, prev_tag) + e = log_state_changed(request, doc, login, doc.friendly_state(), prev_state) doc.time = e.time doc.save() @@ -669,6 +665,7 @@ def approve_ballot(request, name): else: new_state = State.objects.get(used=True, type="draft-iesg", slug="ann") + prev_friendly_state = doc.friendly_state() prev_state = doc.get_state("draft-iesg") if new_state.slug == "ann" and new_state.slug != prev_state.slug and not request.REQUEST.get("skiprfceditorpost"): # start by notifying the RFC Editor @@ -705,7 +702,7 @@ def approve_ballot(request, name): change_description = e.desc + " and state has been changed to %s" % doc.get_state("draft-iesg").name - e = idrfcutil_log_state_changed(request, doc, login, prev_state, prev_tag) + e = log_state_changed(request, doc, login, doc.friendly_state(), prev_friendly_state) doc.time = e.time doc.save() @@ -770,24 +767,21 @@ def make_last_call(request, name): save_document_in_history(doc) + prev_state = doc.get_state("draft-iesg") if doc.type.slug == 'draft': - - prev = doc.get_state("draft-iesg") doc.set_state(State.objects.get(used=True, type="draft-iesg", slug='lc')) - prev_tag = doc.tags.filter(slug__in=('point', 'ad-f-up', 'need-rev', 'extpty')) + prev_tag = doc.tags.filter(slug__in=IESG_SUBSTATE_TAGS) prev_tag = prev_tag[0] if prev_tag else None if prev_tag: doc.tags.remove(prev_tag) - e = idrfcutil_log_state_changed(request, doc, login, prev, prev_tag) + e = log_state_changed(request, doc, login, doc.friendly_state(), prev_state) change_description = "Last call has been made for %s and state has been changed to %s" % (doc.name, doc.get_state("draft-iesg").name) elif doc.type.slug == 'statchg': - - prev = doc.friendly_state() doc.set_state(State.objects.get(used=True, type="statchg", slug='in-lc')) - e = docutil_log_state_changed(request, doc, login, doc.friendly_state(), prev) + e = log_state_changed(request, doc, login, doc.friendly_state(), prev_state) change_description = "Last call has been made for %s and state has been changed to %s" % (doc.name, doc.friendly_state()) doc.time = e.time diff --git a/ietf/idrfc/views_edit.py b/ietf/idrfc/views_edit.py index 54cdd919d..123ba047d 100644 --- a/ietf/idrfc/views_edit.py +++ b/ietf/idrfc/views_edit.py @@ -16,11 +16,10 @@ from django.forms.util import ErrorList from django.contrib.auth.decorators import login_required from ietf.utils.mail import send_mail_text, send_mail_message -from ietf.ietfauth.decorators import has_role, role_required -from ietf.ietfauth.utils import user_is_person +from ietf.ietfauth.decorators import role_required +from ietf.ietfauth.utils import has_role, is_authorized_in_doc_stream, user_is_person from ietf.iesg.models import TelechatDate from ietf.idrfc.mails import * -from ietf.idrfc.utils import * from ietf.idrfc.lastcall import request_last_call from ietf.utils.textupload import get_cleaned_text_file_content from ietf.person.forms import EmailsField @@ -36,7 +35,6 @@ from ietf.doc.utils import * from ietf.name.models import IntendedStdLevelName, DocTagName, StreamName from ietf.person.models import Person, Email from ietf.message.models import Message -from ietf.idrfc.utils import log_state_changed class ChangeStateForm(forms.Form): state = forms.ModelChoiceField(State.objects.filter(used=True, type="draft-iesg"), empty_label=None, required=True) @@ -53,7 +51,7 @@ class ChangeStateForm(forms.Form): # tag handling is a bit awkward since the UI still works # as if IESG tags are a substate - prev_tag = doc.tags.filter(slug__in=('point', 'ad-f-up', 'need-rev', 'extpty')) + prev_tag = doc.tags.filter(slug__in=IESG_SUBSTATE_TAGS) prev_tag = prev_tag[0] if prev_tag else None if state == prev and tag == prev_tag: @@ -76,6 +74,7 @@ def change_state(request, name): if form.is_valid(): next_state = form.cleaned_data['state'] prev_state = doc.get_state("draft-iesg") + prev_friendly_state = doc.friendly_state() tag = form.cleaned_data['substate'] comment = form.cleaned_data['comment'].strip() @@ -96,7 +95,7 @@ def change_state(request, name): if tag: doc.tags.add(tag) - e = log_state_changed(request, doc, login, prev_state, prev_tag) + e = log_state_changed(request, doc, login, doc.friendly_state(), prev_friendly_state) if comment: c = DocEvent(type="added_comment") diff --git a/ietf/iesg/views.py b/ietf/iesg/views.py index 71e75edad..797479375 100644 --- a/ietf/iesg/views.py +++ b/ietf/iesg/views.py @@ -49,7 +49,7 @@ from django.utils import simplejson as json from django import forms from ietf.iesg.models import TelechatDates, TelechatAgendaItem, WGAction from ietf.idrfc.idrfc_wrapper import IdWrapper, RfcWrapper -from ietf.idrfc.utils import update_telechat +from ietf.doc.utils import update_telechat from ietf.ietfauth.decorators import group_required, role_required from ietf.idtracker.templatetags.ietf_filters import in_group from ietf.ipr.models import IprDocAlias diff --git a/ietf/wgcharter/utils.py b/ietf/wgcharter/utils.py index a38cdf84a..4a8af2a64 100644 --- a/ietf/wgcharter/utils.py +++ b/ietf/wgcharter/utils.py @@ -83,7 +83,7 @@ def historic_milestones_for_charter(charter, rev): def update_telechat(request, doc, by, new_telechat_date): - # FIXME: reuse function in idrfc/utils.py instead of this one + # 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