diff --git a/ietf/doc/expire.py b/ietf/doc/expire.py
index 416ac006a..e78ce90a8 100644
--- a/ietf/doc/expire.py
+++ b/ietf/doc/expire.py
@@ -10,7 +10,7 @@ from ietf.utils.mail import send_mail, send_mail_subj
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
+from ietf.doc.utils import add_state_change_event
def expirable_draft(draft):
"""Return whether draft is in an expirable state or not. This is
@@ -122,20 +122,18 @@ def expire_draft(doc):
# clean up files
move_draft_files_to_archive(doc, doc.rev)
- # change the state
system = Person.objects.get(name="(System)")
+ # change the state
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_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 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, doc.friendly_state(), prev_state)
+ new_state = State.objects.get(used=True, type="draft-iesg", slug="dead")
+ prev_state = doc.get_state(new_state.type_id)
+ prev_tags = doc.tags.filter(slug__in=IESG_SUBSTATE_TAGS)
+ if new_state != prev_state:
+ doc.set_state(new_state)
+ doc.tags.remove(*prev_tags)
+ e = add_state_change_event(doc, system, prev_state, new_state, prev_tags=prev_tags, new_tags=[])
e = DocEvent(doc=doc, by=system)
e.type = "expired_document"
diff --git a/ietf/doc/lastcall.py b/ietf/doc/lastcall.py
index 68f47681d..b2f1cdd72 100644
--- a/ietf/doc/lastcall.py
+++ b/ietf/doc/lastcall.py
@@ -6,7 +6,7 @@ from django.conf import settings
from ietf.doc.models import *
from ietf.person.models import Person
-from ietf.doc.utils import log_state_changed
+from ietf.doc.utils import add_state_change_event
from ietf.doc.mails import *
def request_last_call(request, doc):
@@ -36,30 +36,27 @@ def get_expired_last_calls():
def expire_last_call(doc):
if doc.type_id == 'draft':
- state = State.objects.get(used=True, type="draft-iesg", slug="writeupw")
+ new_state = State.objects.get(used=True, type="draft-iesg", slug="writeupw")
e = doc.latest_event(WriteupDocEvent, type="changed_ballot_writeup_text")
if e and "Relevant content can frequently be found in the abstract" not in e.text:
# if boiler-plate text has been removed, we assume the
# write-up has been written
- state = State.objects.get(used=True, type="draft-iesg", slug="goaheadw")
- prev = doc.get_state("draft-iesg")
+ new_state = State.objects.get(used=True, type="draft-iesg", slug="goaheadw")
elif doc.type_id == 'statchg':
- state = State.objects.get(used=True, type="statchg", slug="goahead")
- prev = doc.get_state("statchg")
+ new_state = State.objects.get(used=True, type="statchg", slug="goahead")
else:
raise ValueError("Unexpected document type to expire_last_call(): %s" % doc.type)
- prev_state = doc.friendly_state()
-
save_document_in_history(doc)
- doc.set_state(state)
- 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)
+ prev_state = doc.get_state(new_state.type_id)
+ doc.set_state(new_state)
- e = log_state_changed(None, doc, Person.objects.get(name="(System)"), doc.friendly_state(), prev_state)
+ prev_tags = doc.tags.filter(slug__in=IESG_SUBSTATE_TAGS)
+ doc.tags.remove(*prev_tags)
+
+ system = Person.objects.get(name="(System)")
+ e = add_state_change_event(doc, system, prev_state, new_state, prev_tags=prev_tags, new_tags=[])
doc.time = e.time
doc.save()
diff --git a/ietf/doc/models.py b/ietf/doc/models.py
index ec7adb628..f2b2eb395 100644
--- a/ietf/doc/models.py
+++ b/ietf/doc/models.py
@@ -392,7 +392,7 @@ class Document(DocumentInfo):
# Expired/Withdrawn by Submitter/IETF
return state.name
else:
- return state.name
+ return state.name
def ipr(self):
"""Returns the IPR disclosures against this document (as a queryset over IprDocAlias)."""
diff --git a/ietf/doc/tests_charter.py b/ietf/doc/tests_charter.py
index 0d8e26715..bc170f7ee 100644
--- a/ietf/doc/tests_charter.py
+++ b/ietf/doc/tests_charter.py
@@ -51,7 +51,7 @@ class EditCharterTests(TestCase):
if option == "abandon":
self.assertTrue("abandoned" in charter.latest_event(type="changed_document").desc.lower())
else:
- self.assertTrue("state changed" in charter.latest_event(type="changed_document").desc.lower())
+ self.assertTrue("state changed" in charter.latest_event(type="changed_state").desc.lower())
def test_change_state(self):
make_test_data()
@@ -94,7 +94,7 @@ class EditCharterTests(TestCase):
def find_event(t):
return [e for e in charter.docevent_set.all()[:events_now - events_before] if e.type == t]
- self.assertTrue("state changed" in find_event("changed_document")[0].desc.lower())
+ self.assertTrue("state changed" in find_event("changed_state")[0].desc.lower())
if slug in ("intrev", "iesgrev"):
self.assertTrue(find_event("created_ballot"))
@@ -111,6 +111,10 @@ class EditCharterTests(TestCase):
url = urlreverse('charter_telechat_date', kwargs=dict(name=charter.name))
login_testing_unauthorized(self, "secretary", url)
+ # get
+ r = self.client.get(url)
+ self.assertEqual(r.status_code, 200)
+
# add to telechat
self.assertTrue(not charter.latest_event(TelechatDocEvent, "scheduled_for_telechat"))
telechat_date = TelechatDate.objects.active()[0].date
@@ -145,6 +149,10 @@ class EditCharterTests(TestCase):
url = urlreverse('charter_edit_notify', kwargs=dict(name=charter.name))
login_testing_unauthorized(self, "secretary", url)
+ # get
+ r = self.client.get(url)
+ self.assertEqual(r.status_code, 200)
+
# post
self.assertTrue(not charter.notify)
r = self.client.post(url, dict(notify="someone@example.com, someoneelse@example.com"))
diff --git a/ietf/doc/tests_draft.py b/ietf/doc/tests_draft.py
index 21057d1a1..8d7d8befa 100644
--- a/ietf/doc/tests_draft.py
+++ b/ietf/doc/tests_draft.py
@@ -67,7 +67,7 @@ class ChangeStateTests(TestCase):
self.assertTrue(draft.tags.filter(slug="point"))
self.assertEqual(draft.docevent_set.count(), events_before + 2)
self.assertTrue("Test comment" in draft.docevent_set.all()[0].desc)
- self.assertTrue("State changed" in draft.docevent_set.all()[1].desc)
+ self.assertTrue("IESG state changed" in draft.docevent_set.all()[1].desc)
self.assertEqual(len(outbox), mailbox_before + 2)
self.assertTrue("State Update Notice" in outbox[-2]['Subject'])
self.assertTrue(draft.name in outbox[-1]['Subject'])
@@ -232,6 +232,10 @@ class EditInfoTests(TestCase):
note="",
)
+ # get
+ r = self.client.get(url)
+ self.assertEqual(r.status_code, 200)
+
# add to telechat
self.assertTrue(not draft.latest_event(TelechatDocEvent, type="scheduled_for_telechat"))
data["telechat_date"] = TelechatDate.objects.active()[0].date.isoformat()
@@ -347,6 +351,11 @@ class EditInfoTests(TestCase):
url = urlreverse('doc_edit_consensus', kwargs=dict(name=draft.name))
login_testing_unauthorized(self, "secretary", url)
+ # get
+ r = self.client.get(url)
+ self.assertEqual(r.status_code, 200)
+
+ # post
self.assertTrue(not draft.latest_event(ConsensusDocEvent, type="changed_consensus"))
r = self.client.post(url, dict(consensus="Yes"))
self.assertEqual(r.status_code, 302)
diff --git a/ietf/doc/utils.py b/ietf/doc/utils.py
index 52b815207..4fda80615 100644
--- a/ietf/doc/utils.py
+++ b/ietf/doc/utils.py
@@ -220,25 +220,24 @@ def get_document_content(key, filename, split=True, markup=True):
else:
return raw_content
-def log_state_changed(request, doc, by, new_description, old_description):
- e = DocEvent(doc=doc, by=by)
- e.type = "changed_document"
- e.desc = u"State changed to %s from %s" % (new_description, old_description)
- e.save()
- return e
-
-def add_state_change_event(doc, by, prev_state, new_state, timestamp=None):
+def add_state_change_event(doc, by, prev_state, new_state, prev_tags=[], new_tags=[], timestamp=None):
"""Add doc event to explain that state change just happened."""
- if prev_state == new_state:
+ if prev_state and new_state:
+ assert prev_state.type_id == new_state.type_id
+
+ if prev_state == new_state and set(prev_tags) == set(new_tags):
return None
+ def tags_suffix(tags):
+ return (u"::" + u"::".join(t.name for t in tags)) if tags else u""
+
e = StateDocEvent(doc=doc, by=by)
e.type = "changed_state"
e.state_type = (prev_state or new_state).type
e.state = new_state
- e.desc = "%s changed to %s" % (e.state_type.label, new_state.name)
+ e.desc = "%s changed to %s" % (e.state_type.label, new_state.name + tags_suffix(new_tags))
if prev_state:
- e.desc += " from %s" % prev_state.name
+ e.desc += " from %s" % (prev_state.name + tags_suffix(prev_tags))
if timestamp:
e.time = timestamp
e.save()
diff --git a/ietf/doc/utils_charter.py b/ietf/doc/utils_charter.py
index f373b11a9..da5b5c61b 100644
--- a/ietf/doc/utils_charter.py
+++ b/ietf/doc/utils_charter.py
@@ -13,15 +13,6 @@ from ietf.doc.models import DocEvent, NewRevisionDocEvent, WriteupDocEvent, Ball
from ietf.utils.history import find_history_active_at
-def log_state_changed(request, doc, by, prev_state):
- e = DocEvent(doc=doc, by=by)
- e.type = "changed_document"
- e.desc = u"State changed to %s from %s" % (
- doc.get_state().name,
- prev_state.name if prev_state else "None")
- e.save()
- return e
-
def next_revision(rev):
if rev == "":
return "00-00"
diff --git a/ietf/doc/views_ballot.py b/ietf/doc/views_ballot.py
index 8cd0c34ea..2bca24f94 100644
--- a/ietf/doc/views_ballot.py
+++ b/ietf/doc/views_ballot.py
@@ -49,17 +49,21 @@ def do_undefer_ballot(request, doc):
telechat_date = TelechatDate.objects.active().order_by("date")[0].date
save_document_in_history(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=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'))
+ new_state = doc.get_state()
+ prev_tags = new_tags = []
- e = log_state_changed(request, doc, login, doc.friendly_state(), prev_state)
+ if doc.type_id == 'draft':
+ new_state = State.objects.get(used=True, type="draft-iesg", slug='iesg-eva')
+ prev_tags = doc.tags.filter(slug__in=IESG_SUBSTATE_TAGS)
+ elif doc.type_id == 'conflrev':
+ new_state = State.objects.get(used=True, type='conflrev',slug='iesgeval')
+
+ prev_state = doc.get_state(new_state.type_id if new_state else None)
+
+ doc.set_state(new_state)
+ doc.tags.remove(*prev_tags)
+
+ e = add_state_change_event(doc, login, prev_state, new_state, prev_tags=prev_tags, new_tags=new_tags)
doc.time = e.time
doc.save()
@@ -353,17 +357,21 @@ def defer_ballot(request, name):
if request.method == 'POST':
save_document_in_history(doc)
- prev_state = doc.friendly_state()
- if doc.type_id == 'draft':
- doc.set_state(State.objects.get(used=True, type="draft-iesg", slug='defer'))
- 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='defer'))
+ new_state = doc.get_state()
+ prev_tags = new_tags = []
- e = log_state_changed(request, doc, login, doc.friendly_state(), prev_state)
+ if doc.type_id == 'draft':
+ new_state = State.objects.get(used=True, type="draft-iesg", slug='defer')
+ prev_tags = doc.tags.filter(slug__in=IESG_SUBSTATE_TAGS)
+ elif doc.type_id == 'conflrev':
+ new_state = State.objects.get(used=True, type='conflrev', slug='defer')
+
+ prev_state = doc.get_state(new_state.type_id if new_state else None)
+
+ doc.set_state(new_state)
+ doc.tags.remove(*prev_tags)
+
+ e = add_state_change_event(doc, login, prev_state, new_state, prev_tags=prev_tags, new_tags=new_tags)
doc.time = e.time
doc.save()
@@ -445,16 +453,16 @@ def lastcalltext(request, name):
if "send_last_call_request" in request.POST:
save_document_in_history(doc)
- prev_state = doc.friendly_state()
- doc.set_state(State.objects.get(used=True, type="draft-iesg", slug='lc-req'))
+ prev_state = doc.get_state("draft-iesg")
+ new_state = State.objects.get(used=True, type="draft-iesg", slug='lc-req')
- 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)
+ prev_tags = doc.tags.filter(slug__in=IESG_SUBSTATE_TAGS)
+
+ doc.set_state(new_state)
+ doc.tags.remove(*prev_tags)
+
+ e = add_state_change_event(doc, login, prev_state, new_state, prev_tags=prev_tags, new_tags=[])
- e = log_state_changed(request, doc, login, doc.friendly_state(), prev_state)
-
doc.time = e.time
doc.save()
@@ -664,8 +672,9 @@ 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")
+ prev_tags = doc.tags.filter(slug__in=IESG_SUBSTATE_TAGS)
+
if new_state.slug == "ann" and new_state.slug != prev_state.slug and not request.REQUEST.get("skiprfceditorpost"):
# start by notifying the RFC Editor
import ietf.sync.rfceditor
@@ -677,18 +686,14 @@ def approve_ballot(request, name):
error=error),
context_instance=RequestContext(request))
- # fixup document
- close_open_ballots(doc, login)
-
save_document_in_history(doc)
doc.set_state(new_state)
-
- 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)
+ doc.tags.remove(*prev_tags)
+ # fixup document
+ close_open_ballots(doc, login)
+
e = DocEvent(doc=doc, by=login)
if action == "do_not_publish":
e.type = "iesg_disapproved"
@@ -701,8 +706,8 @@ def approve_ballot(request, name):
change_description = e.desc + " and state has been changed to %s" % doc.get_state("draft-iesg").name
- e = log_state_changed(request, doc, login, doc.friendly_state(), prev_friendly_state)
-
+ e = add_state_change_event(doc, login, prev_state, new_state, prev_tags=prev_tags, new_tags=[])
+
doc.time = e.time
doc.save()
@@ -766,26 +771,27 @@ def make_last_call(request, name):
save_document_in_history(doc)
- prev_state = doc.get_state("draft-iesg")
+ new_state = doc.get_state()
+ prev_tags = new_tags = []
+
if doc.type.slug == 'draft':
- doc.set_state(State.objects.get(used=True, type="draft-iesg", slug='lc'))
-
- 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 = 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)
-
+ new_state = State.objects.get(used=True, type="draft-iesg", slug='lc')
+ prev_tags = doc.tags.filter(slug__in=IESG_SUBSTATE_TAGS)
elif doc.type.slug == 'statchg':
- doc.set_state(State.objects.get(used=True, type="statchg", slug='in-lc'))
- 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())
-
+ new_state = State.objects.get(used=True, type="statchg", slug='in-lc')
+
+ prev_state = doc.get_state(new_state.type_id)
+
+ doc.set_state(new_state)
+ doc.tags.remove(*prev_tags)
+
+ e = add_state_change_event(doc, login, prev_state, new_state, prev_tags=prev_tags, new_tags=new_tags)
+
doc.time = e.time
doc.save()
+ change_description = "Last call has been made for %s and state has been changed to %s" % (doc.name, new_state.name)
+
email_state_changed(request, doc, change_description)
email_ad(request, doc, doc.ad, login, change_description)
diff --git a/ietf/doc/views_charter.py b/ietf/doc/views_charter.py
index 8c31bda6c..110fd5bb2 100644
--- a/ietf/doc/views_charter.py
+++ b/ietf/doc/views_charter.py
@@ -100,12 +100,13 @@ def change_state(request, name, option=None):
# Charter state changed
save_document_in_history(charter)
- prev = charter.get_state()
- charter.set_state(charter_state)
+ prev_state = charter.get_state()
+ new_state = charter_state
+ charter.set_state(new_state)
charter.rev = charter_rev
if option != "abandon":
- log_state_changed(request, charter, login, prev)
+ add_state_change_event(charter, login, prev_state, new_state)
else:
# kill hanging ballots
close_open_ballots(charter, login)
@@ -612,7 +613,7 @@ def approve(request, name):
change_description += " and %s state has been changed to %s" % (group.type.name, new_state.name)
- e = log_state_changed(request, charter, login, prev_charter_state)
+ e = add_state_change_event(charter, login, prev_charter_state, new_charter_state)
# according to spec, 00-02 becomes 01, so copy file and record new revision
try:
diff --git a/ietf/doc/views_conflict_review.py b/ietf/doc/views_conflict_review.py
index 50fe6f5c0..7a0a1c09e 100644
--- a/ietf/doc/views_conflict_review.py
+++ b/ietf/doc/views_conflict_review.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.doc.utils import log_state_changed, update_telechat
-
+from ietf.doc.utils import add_state_change_event, 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
from ietf.ietfauth.utils import has_role, role_required
@@ -41,7 +40,7 @@ def change_state(request, name, option=None):
form = ChangeStateForm(request.POST)
if form.is_valid():
clean = form.cleaned_data
- review_state = clean['review_state']
+ new_state = clean['review_state']
comment = clean['comment'].rstrip()
if comment:
@@ -49,19 +48,17 @@ def change_state(request, name, option=None):
c.desc = comment
c.save()
- if review_state != review.get_state():
+ prev_state = review.get_state()
+ if new_state != prev_state:
save_document_in_history(review)
- old_description = review.friendly_state()
- review.set_state(review_state)
- new_description = review.friendly_state()
-
- log_state_changed(request, review, login, new_description, old_description)
+ review.set_state(new_state)
+ add_state_change_event(review, login, prev_state, new_state)
review.time = datetime.datetime.now()
review.save()
- if review_state.slug == "iesgeval":
+ if new_state.slug == "iesgeval":
create_ballot_if_not_open(review, login, "conflrev")
ballot = review.latest_event(BallotDocEvent, type="created_ballot")
if has_role(request.user, "Area Director") and not review.latest_event(BallotPositionDocEvent, ad=login, ballot=ballot, type="changed_ballot_position"):
@@ -307,15 +304,14 @@ def approve(request, name):
form = AnnouncementForm(request.POST)
if form.is_valid():
+ prev_state = review.get_state()
- new_state_slug = 'appr-reqnopub-sent' if review.get_state('conflrev').slug=='appr-reqnopub-pend' else 'appr-noprob-sent'
- new_review_state = State.objects.get(used=True, type="conflrev", slug=new_state_slug)
+ new_state_slug = 'appr-reqnopub-sent' if prev_state.slug == 'appr-reqnopub-pend' else 'appr-noprob-sent'
+ new_state = State.objects.get(used=True, type="conflrev", slug=new_state_slug)
save_document_in_history(review)
- old_description = review.friendly_state()
- review.set_state(new_review_state)
- new_description = review.friendly_state()
- log_state_changed(request, review, login, new_description, old_description)
+ review.set_state(new_state)
+ add_state_change_event(review, login, prev_state, new_state)
close_open_ballots(review, login)
diff --git a/ietf/doc/views_draft.py b/ietf/doc/views_draft.py
index 5192b6c4b..ab74a1e30 100644
--- a/ietf/doc/views_draft.py
+++ b/ietf/doc/views_draft.py
@@ -57,7 +57,7 @@ class ChangeStateForm(forms.Form):
@role_required('Area Director','Secretariat')
def change_state(request, name):
- """Change state of Internet Draft, notifying parties as necessary
+ """Change IESG state of Internet Draft, notifying parties as necessary
and logging the change as a comment."""
doc = get_object_or_404(Document, docalias__name=name)
if (not doc.latest_event(type="started_iesg_process")) or doc.get_state_slug() == "expired":
@@ -69,30 +69,28 @@ def change_state(request, name):
form = ChangeStateForm(request.POST)
form.docname=name
if form.is_valid():
- next_state = form.cleaned_data['state']
+ new_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()
# 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=IESG_SUBSTATE_TAGS)
- prev_tag = prev_tag[0] if prev_tag else None
-
- if next_state != prev_state or tag != prev_tag:
+ prev_tags = doc.tags.filter(slug__in=IESG_SUBSTATE_TAGS)
+ new_tags = [tag] if tag else []
+ if new_state != prev_state or set(new_tags) != set(prev_tags):
save_document_in_history(doc)
- doc.set_state(next_state)
+ doc.set_state(new_state)
- if prev_tag:
- doc.tags.remove(prev_tag)
+ doc.tags.remove(*prev_tags)
+ doc.tags.add(*new_tags)
- if tag:
- doc.tags.add(tag)
+ e = add_state_change_event(doc, login, prev_state, new_state,
+ prev_tags=prev_tags, new_tags=new_tags)
- e = log_state_changed(request, doc, login, doc.friendly_state(), prev_friendly_state)
+ msg = e.desc
if comment:
c = DocEvent(type="added_comment")
@@ -101,23 +99,23 @@ def change_state(request, name):
c.desc = comment
c.save()
- e.desc += "
" + comment
+ msg += "\n" + comment
doc.time = e.time
doc.save()
- email_state_changed(request, doc, e.desc)
- email_ad(request, doc, doc.ad, login, e.desc)
+ email_state_changed(request, doc, msg)
+ email_ad(request, doc, doc.ad, login, msg)
- if prev_state and prev_state.slug in ("ann", "rfcqueue") and next_state.slug not in ("rfcqueue", "pub"):
- email_pulled_from_rfc_queue(request, doc, comment, prev_state, next_state)
+ if prev_state and prev_state.slug in ("ann", "rfcqueue") and new_state.slug not in ("rfcqueue", "pub"):
+ email_pulled_from_rfc_queue(request, doc, comment, prev_state, new_state)
- if next_state.slug in ("iesg-eva", "lc"):
+ if new_state.slug in ("iesg-eva", "lc"):
if not doc.get_state_slug("draft-iana-review"):
doc.set_state(State.objects.get(used=True, type="draft-iana-review", slug="need-rev"))
- if next_state.slug == "lc-req":
+ if new_state.slug == "lc-req":
request_last_call(request, doc)
return render_to_response('doc/draft/last_call_requested.html',
@@ -179,14 +177,14 @@ def change_iana_state(request, name, state_type):
if request.method == 'POST':
form = ChangeIanaStateForm(state_type, request.POST)
if form.is_valid():
- next_state = form.cleaned_data['state']
+ new_state = form.cleaned_data['state']
- if next_state != prev_state:
+ if new_state != prev_state:
save_document_in_history(doc)
- doc.set_state(next_state)
+ doc.set_state(new_state)
- e = add_state_change_event(doc, request.user.person, prev_state, next_state)
+ e = add_state_change_event(doc, request.user.person, prev_state, new_state)
doc.time = e.time
doc.save()
@@ -1220,7 +1218,7 @@ def request_publication(request, name):
e.save()
# change state
- prev_state = doc.get_state(next_state.type)
+ prev_state = doc.get_state(next_state.type_id)
if next_state != prev_state:
doc.set_state(next_state)
e = add_state_change_event(doc, request.user.person, prev_state, next_state)
@@ -1322,7 +1320,7 @@ def adopt_draft(request, name):
new_state = State.objects.get(slug=adopt_state_slug, type="draft-stream-%s" % doc.stream_id, used=True)
if new_state != prev_state:
doc.set_state(new_state)
- e = add_state_change_event(doc, by, prev_state, new_state, doc.time)
+ e = add_state_change_event(doc, by, prev_state, new_state, timestamp=doc.time)
due_date = None
if form.cleaned_data["weeks"] != None:
@@ -1423,7 +1421,7 @@ def change_stream_state(request, name, state_type):
new_state = form.cleaned_data["new_state"]
if new_state != prev_state:
doc.set_state(new_state)
- e = add_state_change_event(doc, by, prev_state, new_state, doc.time)
+ e = add_state_change_event(doc, by, prev_state, new_state, timestamp=doc.time)
due_date = None
if form.cleaned_data["weeks"] != None:
diff --git a/ietf/doc/views_status_change.py b/ietf/doc/views_status_change.py
index a28eaacca..3da46c626 100644
--- a/ietf/doc/views_status_change.py
+++ b/ietf/doc/views_status_change.py
@@ -8,7 +8,7 @@ from django.template import RequestContext
from django.template.loader import render_to_string
from django.conf import settings
-from ietf.doc.utils import log_state_changed, update_telechat
+from ietf.doc.utils import add_state_change_event, 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
@@ -51,14 +51,12 @@ def change_state(request, name, option=None):
c.desc = comment
c.save()
- if new_state != status_change.get_state():
+ prev_state = status_change.get_state()
+ if new_state != prev_state:
save_document_in_history(status_change)
- old_description = status_change.friendly_state()
status_change.set_state(new_state)
- new_description = status_change.friendly_state()
-
- log_state_changed(request, status_change, login, new_description, old_description)
+ add_state_change_event(status_change, login, prev_state, new_state)
status_change.time = datetime.datetime.now()
status_change.save()
@@ -327,10 +325,11 @@ def approve(request, name):
save_document_in_history(status_change)
- old_description = status_change.friendly_state()
- status_change.set_state(State.objects.get(type='statchg', slug='appr-sent'))
- new_description = status_change.friendly_state()
- log_state_changed(request, status_change, login, new_description, old_description)
+ prev_state = status_change.get_state()
+ new_state = State.objects.get(type='statchg', slug='appr-sent')
+
+ status_change.set_state(new_state)
+ add_state_change_event(status_change, login, prev_state, new_state)
close_open_ballots(status_change, login)
@@ -689,11 +688,11 @@ def last_call(request, name):
if "send_last_call_request" in request.POST:
save_document_in_history(status_change)
- old_description = status_change.friendly_state()
- status_change.set_state(State.objects.get(type='statchg', slug='lc-req'))
- new_description = status_change.friendly_state()
+ prev_state = status_change.get_state()
+ new_state = State.objects.get(type='statchg', slug='lc-req')
- e = log_state_changed(request, status_change, login, new_description, old_description)
+ status_change.set_state(new_state)
+ e = add_state_change_event(status_change, login, prev_state, new_state)
status_change.time = e.time
status_change.save()
diff --git a/ietf/secr/telechat/views.py b/ietf/secr/telechat/views.py
index 40b4f1a16..08a63009d 100644
--- a/ietf/secr/telechat/views.py
+++ b/ietf/secr/telechat/views.py
@@ -8,7 +8,7 @@ from django.shortcuts import render_to_response, get_object_or_404, redirect
from django.template import RequestContext
from ietf.doc.models import DocEvent, Document, BallotDocEvent, BallotPositionDocEvent, TelechatDocEvent, WriteupDocEvent, save_document_in_history
-from ietf.doc.utils import get_document_content, log_state_changed
+from ietf.doc.utils import get_document_content, add_state_change_event
from ietf.group.models import Group
from ietf.name.models import BallotPositionName
from ietf.person.models import Person
@@ -237,38 +237,35 @@ def doc_detail(request, date, name):
formset = BallotFormset(initial=initial_ballot)
state_form = ChangeStateForm(request.POST, initial=initial_state)
if state_form.is_valid():
- state = state_form.cleaned_data['state']
+ prev_state = doc.get_state(state_type)
+
+ new_state = state_form.cleaned_data['state']
tag = state_form.cleaned_data['substate']
- prev = doc.get_state(state_type)
# 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=(TELECHAT_TAGS))
- prev_tag = prev_tag[0] if prev_tag else None
+ prev_tags = doc.tags.filter(slug__in=TELECHAT_TAGS)
+ new_tags = [tag] if tag else []
- #if state != prev or tag != prev_tag:
if state_form.changed_data:
save_document_in_history(doc)
- old_description = doc.friendly_state()
if 'state' in state_form.changed_data:
- doc.set_state(state)
+ doc.set_state(new_state)
if 'substate' in state_form.changed_data:
- if prev_tag:
- doc.tags.remove(prev_tag)
- if tag:
- doc.tags.add(tag)
+ doc.tags.remove(*prev_tags)
+ doc.tags.add(*new_tags)
- new_description = doc.friendly_state()
- e = log_state_changed(request, doc, login, new_description, old_description)
+ e = add_state_change_event(doc, login, prev_state, new_state,
+ prev_tags=prev_tags, new_tags=new_tags)
doc.time = e.time
doc.save()
email_state_changed(request, doc, e.desc)
email_ad(request, doc, doc.ad, login, e.desc)
- if state.slug == "lc-req":
+ if new_state.slug == "lc-req":
request_last_call(request, doc)
messages.success(request,'Document state updated')
diff --git a/ietf/sync/iana.py b/ietf/sync/iana.py
index 9e7181ec2..6180e84e2 100644
--- a/ietf/sync/iana.py
+++ b/ietf/sync/iana.py
@@ -187,7 +187,7 @@ def update_history_with_changes(changes, send_email=True):
# that we assume these changes are cronologically
# applied
prev_state = doc.get_state(state_type)
- e = add_state_change_event(doc, system, prev_state, state, timestamp)
+ e = add_state_change_event(doc, system, prev_state, state, timestamp=timestamp)
if e:
# for logging purposes