checkpoint
- Legacy-Id: 10017
This commit is contained in:
parent
839d0f89ad
commit
f30f5c39f1
|
@ -16,8 +16,8 @@ from ietf.group.models import Role
|
||||||
from ietf.doc.models import Document
|
from ietf.doc.models import Document
|
||||||
from ietf.mailtoken.utils import gather_addresses, gather_address_list
|
from ietf.mailtoken.utils import gather_addresses, gather_address_list
|
||||||
|
|
||||||
def email_state_changed(request, doc, text):
|
def email_state_changed(request, doc, text, mailtoken_id=None):
|
||||||
to = [x.strip() for x in doc.notify.replace(';', ',').split(',')]
|
to = gather_address_list(mailtoken_id or 'doc_state_edited',doc=doc)
|
||||||
if not to:
|
if not to:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
|
@ -232,7 +232,7 @@ class BallotWriteupsTests(TestCase):
|
||||||
send_last_call_request="1"))
|
send_last_call_request="1"))
|
||||||
draft = Document.objects.get(name=draft.name)
|
draft = Document.objects.get(name=draft.name)
|
||||||
self.assertEqual(draft.get_state_slug("draft-iesg"), "lc-req")
|
self.assertEqual(draft.get_state_slug("draft-iesg"), "lc-req")
|
||||||
self.assertEqual(len(outbox), mailbox_before + 2)
|
self.assertEqual(len(outbox), mailbox_before + 1)
|
||||||
self.assertTrue("Last Call" in outbox[-1]['Subject'])
|
self.assertTrue("Last Call" in outbox[-1]['Subject'])
|
||||||
self.assertTrue(draft.name in outbox[-1]['Subject'])
|
self.assertTrue(draft.name in outbox[-1]['Subject'])
|
||||||
|
|
||||||
|
@ -387,7 +387,7 @@ class ApproveBallotTests(TestCase):
|
||||||
|
|
||||||
draft = Document.objects.get(name=draft.name)
|
draft = Document.objects.get(name=draft.name)
|
||||||
self.assertEqual(draft.get_state_slug("draft-iesg"), "ann")
|
self.assertEqual(draft.get_state_slug("draft-iesg"), "ann")
|
||||||
self.assertEqual(len(outbox), mailbox_before + 3)
|
self.assertEqual(len(outbox), mailbox_before + 2)
|
||||||
self.assertTrue("Protocol Action" in outbox[-2]['Subject'])
|
self.assertTrue("Protocol Action" in outbox[-2]['Subject'])
|
||||||
# the IANA copy
|
# the IANA copy
|
||||||
self.assertTrue("Protocol Action" in outbox[-1]['Subject'])
|
self.assertTrue("Protocol Action" in outbox[-1]['Subject'])
|
||||||
|
@ -409,7 +409,7 @@ class ApproveBallotTests(TestCase):
|
||||||
|
|
||||||
draft = Document.objects.get(name=draft.name)
|
draft = Document.objects.get(name=draft.name)
|
||||||
self.assertEqual(draft.get_state_slug("draft-iesg"), "dead")
|
self.assertEqual(draft.get_state_slug("draft-iesg"), "dead")
|
||||||
self.assertEqual(len(outbox), mailbox_before + 2)
|
self.assertEqual(len(outbox), mailbox_before + 1)
|
||||||
self.assertTrue("NOT be published" in str(outbox[-1]))
|
self.assertTrue("NOT be published" in str(outbox[-1]))
|
||||||
|
|
||||||
|
|
||||||
|
@ -441,11 +441,10 @@ class MakeLastCallTests(TestCase):
|
||||||
draft = Document.objects.get(name=draft.name)
|
draft = Document.objects.get(name=draft.name)
|
||||||
self.assertEqual(draft.get_state_slug("draft-iesg"), "lc")
|
self.assertEqual(draft.get_state_slug("draft-iesg"), "lc")
|
||||||
self.assertEqual(draft.latest_event(LastCallDocEvent, "sent_last_call").expires.strftime("%Y-%m-%d"), expire_date)
|
self.assertEqual(draft.latest_event(LastCallDocEvent, "sent_last_call").expires.strftime("%Y-%m-%d"), expire_date)
|
||||||
self.assertEqual(len(outbox), mailbox_before + 3)
|
self.assertEqual(len(outbox), mailbox_before + 2)
|
||||||
|
|
||||||
self.assertTrue("Last Call" in outbox[-3]['Subject'])
|
|
||||||
# the IANA copy
|
|
||||||
self.assertTrue("Last Call" in outbox[-2]['Subject'])
|
self.assertTrue("Last Call" in outbox[-2]['Subject'])
|
||||||
|
self.assertTrue("Last Call" in outbox[-1]['Subject'])
|
||||||
self.assertTrue("Last Call" in draft.message_set.order_by("-time")[0].subject)
|
self.assertTrue("Last Call" in draft.message_set.order_by("-time")[0].subject)
|
||||||
|
|
||||||
class DeferUndeferTestCase(TestCase):
|
class DeferUndeferTestCase(TestCase):
|
||||||
|
@ -491,8 +490,8 @@ class DeferUndeferTestCase(TestCase):
|
||||||
if doc.type_id in defer_states:
|
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])
|
self.assertEqual(doc.get_state(defer_states[doc.type_id][0]).slug,defer_states[doc.type_id][1])
|
||||||
self.assertTrue(doc.active_defer_event())
|
self.assertTrue(doc.active_defer_event())
|
||||||
self.assertEqual(len(outbox), mailbox_before + 3)
|
self.assertEqual(len(outbox), mailbox_before + 2)
|
||||||
self.assertTrue("State Update" in outbox[-3]['Subject'])
|
#self.assertTrue("State Update" in outbox[-3]['Subject'])
|
||||||
self.assertTrue("Telechat update" in outbox[-2]['Subject'])
|
self.assertTrue("Telechat update" in outbox[-2]['Subject'])
|
||||||
self.assertTrue("Deferred" in outbox[-1]['Subject'])
|
self.assertTrue("Deferred" in outbox[-1]['Subject'])
|
||||||
self.assertTrue(doc.file_tag() in outbox[-1]['Subject'])
|
self.assertTrue(doc.file_tag() in outbox[-1]['Subject'])
|
||||||
|
@ -546,9 +545,8 @@ class DeferUndeferTestCase(TestCase):
|
||||||
if doc.type_id in undefer_states:
|
if doc.type_id in undefer_states:
|
||||||
self.assertEqual(doc.get_state(undefer_states[doc.type_id][0]).slug,undefer_states[doc.type_id][1])
|
self.assertEqual(doc.get_state(undefer_states[doc.type_id][0]).slug,undefer_states[doc.type_id][1])
|
||||||
self.assertFalse(doc.active_defer_event())
|
self.assertFalse(doc.active_defer_event())
|
||||||
self.assertEqual(len(outbox), mailbox_before + 3)
|
self.assertEqual(len(outbox), mailbox_before + 2)
|
||||||
self.assertTrue("Telechat update" in outbox[-3]['Subject'])
|
self.assertTrue("Telechat update" in outbox[-2]['Subject'])
|
||||||
self.assertTrue("State Update" in outbox[-2]['Subject'])
|
|
||||||
self.assertTrue("Undeferred" in outbox[-1]['Subject'])
|
self.assertTrue("Undeferred" in outbox[-1]['Subject'])
|
||||||
self.assertTrue(doc.file_tag() in outbox[-1]['Subject'])
|
self.assertTrue(doc.file_tag() in outbox[-1]['Subject'])
|
||||||
|
|
||||||
|
|
|
@ -96,8 +96,8 @@ class EditCharterTests(TestCase):
|
||||||
if slug in ("intrev", "iesgrev"):
|
if slug in ("intrev", "iesgrev"):
|
||||||
self.assertTrue(find_event("created_ballot"))
|
self.assertTrue(find_event("created_ballot"))
|
||||||
|
|
||||||
self.assertEqual(len(outbox), mailbox_before + 1)
|
self.assertEqual(len(outbox), mailbox_before + 2)
|
||||||
self.assertTrue("state changed" in outbox[-1]['Subject'].lower())
|
self.assertTrue("state changed" in outbox[-2]['Subject'].lower())
|
||||||
|
|
||||||
def test_edit_telechat_date(self):
|
def test_edit_telechat_date(self):
|
||||||
make_test_data()
|
make_test_data()
|
||||||
|
|
|
@ -1,13 +1,11 @@
|
||||||
import re, datetime, os
|
import re, datetime, os
|
||||||
|
|
||||||
from django.template.loader import render_to_string
|
from django.template.loader import render_to_string
|
||||||
from django.utils.html import strip_tags
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
|
||||||
from ietf.doc.models import NewRevisionDocEvent, WriteupDocEvent, BallotPositionDocEvent
|
from ietf.doc.models import NewRevisionDocEvent, WriteupDocEvent, BallotPositionDocEvent
|
||||||
from ietf.person.models import Person
|
from ietf.person.models import Person
|
||||||
from ietf.utils.history import find_history_active_at
|
from ietf.utils.history import find_history_active_at
|
||||||
from ietf.utils.mail import send_mail_text
|
|
||||||
from ietf.mailtoken.utils import gather_addresses
|
from ietf.mailtoken.utils import gather_addresses
|
||||||
|
|
||||||
def charter_name_for_group(group):
|
def charter_name_for_group(group):
|
||||||
|
@ -84,19 +82,6 @@ def historic_milestones_for_charter(charter, rev):
|
||||||
|
|
||||||
return res
|
return res
|
||||||
|
|
||||||
def email_state_changed(request, doc, text):
|
|
||||||
to = [e.strip() for e in doc.notify.replace(';', ',').split(',')]
|
|
||||||
if not to:
|
|
||||||
return
|
|
||||||
|
|
||||||
text = strip_tags(text)
|
|
||||||
text += "\n\n"
|
|
||||||
text += "URL: %s" % (settings.IDTRACKER_BASE_URL + doc.get_absolute_url())
|
|
||||||
|
|
||||||
send_mail_text(request, to, None,
|
|
||||||
"State changed: %s-%s" % (doc.canonical_name(), doc.rev),
|
|
||||||
text)
|
|
||||||
|
|
||||||
def generate_ballot_writeup(request, doc):
|
def generate_ballot_writeup(request, doc):
|
||||||
e = WriteupDocEvent()
|
e = WriteupDocEvent()
|
||||||
e.type = "changed_ballot_writeup_text"
|
e.type = "changed_ballot_writeup_text"
|
||||||
|
|
|
@ -18,7 +18,7 @@ from ietf.doc.models import ( Document, State, DocEvent, BallotDocEvent, BallotP
|
||||||
from ietf.doc.utils import ( add_state_change_event, close_ballot, close_open_ballots,
|
from ietf.doc.utils import ( add_state_change_event, close_ballot, close_open_ballots,
|
||||||
create_ballot_if_not_open, update_telechat )
|
create_ballot_if_not_open, update_telechat )
|
||||||
from ietf.doc.mails import ( email_ballot_deferred, email_ballot_undeferred,
|
from ietf.doc.mails import ( email_ballot_deferred, email_ballot_undeferred,
|
||||||
email_state_changed, extra_automation_headers, generate_last_call_announcement,
|
extra_automation_headers, generate_last_call_announcement,
|
||||||
generate_issue_ballot_mail, generate_ballot_writeup, generate_approval_mail )
|
generate_issue_ballot_mail, generate_ballot_writeup, generate_approval_mail )
|
||||||
from ietf.doc.lastcall import request_last_call
|
from ietf.doc.lastcall import request_last_call
|
||||||
from ietf.iesg.models import TelechatDate
|
from ietf.iesg.models import TelechatDate
|
||||||
|
@ -69,8 +69,6 @@ def do_undefer_ballot(request, doc):
|
||||||
doc.save()
|
doc.save()
|
||||||
|
|
||||||
update_telechat(request, doc, login, telechat_date)
|
update_telechat(request, doc, login, telechat_date)
|
||||||
if e:
|
|
||||||
email_state_changed(request, doc, e.desc)
|
|
||||||
email_ballot_undeferred(request, doc, login.plain_name(), telechat_date)
|
email_ballot_undeferred(request, doc, login.plain_name(), telechat_date)
|
||||||
|
|
||||||
def position_to_ballot_choice(position):
|
def position_to_ballot_choice(position):
|
||||||
|
@ -367,9 +365,6 @@ def defer_ballot(request, name):
|
||||||
doc.time = (e and e.time) or datetime.datetime.now()
|
doc.time = (e and e.time) or datetime.datetime.now()
|
||||||
doc.save()
|
doc.save()
|
||||||
|
|
||||||
if e:
|
|
||||||
email_state_changed(request, doc, e.desc)
|
|
||||||
|
|
||||||
update_telechat(request, doc, login, telechat_date)
|
update_telechat(request, doc, login, telechat_date)
|
||||||
email_ballot_deferred(request, doc, login.plain_name(), telechat_date)
|
email_ballot_deferred(request, doc, login.plain_name(), telechat_date)
|
||||||
|
|
||||||
|
@ -462,9 +457,6 @@ def lastcalltext(request, name):
|
||||||
doc.time = (e and e.time) or datetime.datetime.now()
|
doc.time = (e and e.time) or datetime.datetime.now()
|
||||||
doc.save()
|
doc.save()
|
||||||
|
|
||||||
if e:
|
|
||||||
email_state_changed(request, doc, e.desc)
|
|
||||||
|
|
||||||
request_last_call(request, doc)
|
request_last_call(request, doc)
|
||||||
|
|
||||||
return render_to_response('doc/draft/last_call_requested.html',
|
return render_to_response('doc/draft/last_call_requested.html',
|
||||||
|
@ -699,15 +691,11 @@ def approve_ballot(request, name):
|
||||||
|
|
||||||
e.save()
|
e.save()
|
||||||
|
|
||||||
change_description = e.desc + " and state has been changed to %s" % doc.get_state("draft-iesg").name
|
|
||||||
|
|
||||||
e = add_state_change_event(doc, login, prev_state, new_state, prev_tags=prev_tags, new_tags=[])
|
e = add_state_change_event(doc, login, prev_state, new_state, prev_tags=prev_tags, new_tags=[])
|
||||||
|
|
||||||
doc.time = (e and e.time) or datetime.datetime.now()
|
doc.time = (e and e.time) or datetime.datetime.now()
|
||||||
doc.save()
|
doc.save()
|
||||||
|
|
||||||
email_state_changed(request, doc, change_description)
|
|
||||||
|
|
||||||
# send announcement
|
# send announcement
|
||||||
|
|
||||||
send_mail_preformatted(request, announcement)
|
send_mail_preformatted(request, announcement)
|
||||||
|
@ -785,10 +773,6 @@ def make_last_call(request, name):
|
||||||
doc.time = (e and e.time) or datetime.datetime.now()
|
doc.time = (e and e.time) or datetime.datetime.now()
|
||||||
doc.save()
|
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)
|
|
||||||
|
|
||||||
e = LastCallDocEvent(doc=doc, by=login)
|
e = LastCallDocEvent(doc=doc, by=login)
|
||||||
e.type = "sent_last_call"
|
e.type = "sent_last_call"
|
||||||
e.desc = "The following Last Call announcement was sent out:<br><br>"
|
e.desc = "The following Last Call announcement was sent out:<br><br>"
|
||||||
|
|
|
@ -18,8 +18,9 @@ from ietf.doc.models import ( Document, DocHistory, State, DocEvent, BallotDocEv
|
||||||
from ietf.doc.utils import ( add_state_change_event, close_open_ballots,
|
from ietf.doc.utils import ( add_state_change_event, close_open_ballots,
|
||||||
create_ballot_if_not_open, get_chartering_type )
|
create_ballot_if_not_open, get_chartering_type )
|
||||||
from ietf.doc.utils_charter import ( historic_milestones_for_charter,
|
from ietf.doc.utils_charter import ( historic_milestones_for_charter,
|
||||||
approved_revision, default_review_text, default_action_text, email_state_changed,
|
approved_revision, default_review_text, default_action_text,
|
||||||
generate_ballot_writeup, generate_issue_ballot_mail, next_approved_revision, next_revision )
|
generate_ballot_writeup, generate_issue_ballot_mail, next_approved_revision, next_revision )
|
||||||
|
from ietf.doc.mails import email_state_changed
|
||||||
from ietf.group.models import ChangeStateGroupEvent, MilestoneGroupEvent
|
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.group.utils import save_group_in_history, save_milestone_in_history, can_manage_group_type
|
||||||
from ietf.ietfauth.utils import has_role, role_required
|
from ietf.ietfauth.utils import has_role, role_required
|
||||||
|
@ -142,7 +143,8 @@ def change_state(request, name, option=None):
|
||||||
if message or charter_state.slug == "intrev" or charter_state.slug == "extrev":
|
if message or charter_state.slug == "intrev" or charter_state.slug == "extrev":
|
||||||
email_iesg_secretary_re_charter(request, group, "Charter state changed to %s" % charter_state.name, message)
|
email_iesg_secretary_re_charter(request, group, "Charter state changed to %s" % charter_state.name, message)
|
||||||
|
|
||||||
email_state_changed(request, charter, "State changed to %s." % charter_state)
|
# TODO - do we need a seperate set of recipients for state changes to charters vrs other kind of documents
|
||||||
|
email_state_changed(request, charter, "State changed to %s." % charter_state, 'doc_state_edited')
|
||||||
|
|
||||||
if charter_state.slug == "intrev" and group.type_id == "wg":
|
if charter_state.slug == "intrev" and group.type_id == "wg":
|
||||||
if request.POST.get("ballot_wo_extern"):
|
if request.POST.get("ballot_wo_extern"):
|
||||||
|
@ -266,7 +268,7 @@ def change_title(request, name, option=None):
|
||||||
charter.save()
|
charter.save()
|
||||||
if message:
|
if message:
|
||||||
email_iesg_secretary_re_charter(request, group, "Charter title changed to %s" % new_title, message)
|
email_iesg_secretary_re_charter(request, group, "Charter title changed to %s" % new_title, message)
|
||||||
email_state_changed(request, charter, "Title changed to %s." % new_title)
|
email_state_changed(request, charter, "Title changed to %s." % new_title,'doc_state_edited')
|
||||||
return redirect('doc_view', name=charter.name)
|
return redirect('doc_view', name=charter.name)
|
||||||
else:
|
else:
|
||||||
form = ChangeTitleForm(charter=charter)
|
form = ChangeTitleForm(charter=charter)
|
||||||
|
|
|
@ -110,7 +110,7 @@ def change_state(request, name):
|
||||||
doc.time = e.time
|
doc.time = e.time
|
||||||
doc.save()
|
doc.save()
|
||||||
|
|
||||||
email_state_changed(request, doc, msg)
|
email_state_changed(request, doc, msg,'doc_state_edited')
|
||||||
|
|
||||||
|
|
||||||
if prev_state and prev_state.slug in ("ann", "rfcqueue") and new_state.slug not in ("rfcqueue", "pub"):
|
if prev_state and prev_state.slug in ("ann", "rfcqueue") and new_state.slug not in ("rfcqueue", "pub"):
|
||||||
|
|
|
@ -328,7 +328,19 @@ def make_mailtokens(apps):
|
||||||
])
|
])
|
||||||
|
|
||||||
mt_factory(slug='doc_state_edited',
|
mt_factory(slug='doc_state_edited',
|
||||||
desc="Recipients when a document's state is manutally edited",
|
desc="Recipients when a document's state is manually edited",
|
||||||
|
recipient_slugs=['doc_notify',
|
||||||
|
'doc_ad',
|
||||||
|
'doc_authors',
|
||||||
|
'doc_shepherd',
|
||||||
|
'doc_group_chairs',
|
||||||
|
'doc_affecteddoc_authors',
|
||||||
|
'doc_affecteddoc_group_chairs',
|
||||||
|
'doc_affecteddoc_notify',
|
||||||
|
])
|
||||||
|
|
||||||
|
mt_factory(slug='doc_iana_state_changed',
|
||||||
|
desc="Recipients when IANA state information for a document changes ",
|
||||||
recipient_slugs=['doc_notify',
|
recipient_slugs=['doc_notify',
|
||||||
'doc_ad',
|
'doc_ad',
|
||||||
'doc_authors',
|
'doc_authors',
|
||||||
|
|
|
@ -85,11 +85,11 @@ class Recipient(models.Model):
|
||||||
addrs.extend(Recipient.objects.get(slug='doc_notify').gather(**{'doc':reldoc.document}))
|
addrs.extend(Recipient.objects.get(slug='doc_notify').gather(**{'doc':reldoc.document}))
|
||||||
return addrs
|
return addrs
|
||||||
|
|
||||||
def gather_conflict_review_stream_owner(self, **kwargs):
|
def gather_conflict_review_stream_manager(self, **kwargs):
|
||||||
addrs = []
|
addrs = []
|
||||||
if 'doc' in kwargs:
|
if 'doc' in kwargs:
|
||||||
for reldoc in kwargs['doc'].related_that_doc(['conflrev']):
|
for reldoc in kwargs['doc'].related_that_doc(['conflrev']):
|
||||||
addrs.extend(Recipient.objects.get(slug='doc_stream_owner').gather(**{'doc':reldoc.document}))
|
addrs.extend(Recipient.objects.get(slug='doc_stream_manager').gather(**{'doc':reldoc.document}))
|
||||||
return addrs
|
return addrs
|
||||||
|
|
||||||
def gather_conflict_review_steering_group(self,**kwargs):
|
def gather_conflict_review_steering_group(self,**kwargs):
|
||||||
|
|
|
@ -4757,7 +4757,24 @@
|
||||||
"doc_notify",
|
"doc_notify",
|
||||||
"doc_shepherd"
|
"doc_shepherd"
|
||||||
],
|
],
|
||||||
"desc": "Recipients when a document's state is manutally edited"
|
"desc": "Recipients when IANA state information for a document changes "
|
||||||
|
},
|
||||||
|
"model": "mailtoken.mailtoken",
|
||||||
|
"pk": "doc_iana_state_changed"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fields": {
|
||||||
|
"recipients": [
|
||||||
|
"doc_ad",
|
||||||
|
"doc_affecteddoc_authors",
|
||||||
|
"doc_affecteddoc_group_chairs",
|
||||||
|
"doc_affecteddoc_notify",
|
||||||
|
"doc_authors",
|
||||||
|
"doc_group_chairs",
|
||||||
|
"doc_notify",
|
||||||
|
"doc_shepherd"
|
||||||
|
],
|
||||||
|
"desc": "Recipients when a document's state is manually edited"
|
||||||
},
|
},
|
||||||
"model": "mailtoken.mailtoken",
|
"model": "mailtoken.mailtoken",
|
||||||
"pk": "doc_state_edited"
|
"pk": "doc_state_edited"
|
||||||
|
|
|
@ -261,7 +261,7 @@ def doc_detail(request, date, name):
|
||||||
doc.time = (e and e.time) or datetime.datetime.now()
|
doc.time = (e and e.time) or datetime.datetime.now()
|
||||||
doc.save()
|
doc.save()
|
||||||
|
|
||||||
email_state_changed(request, doc, e.desc)
|
email_state_changed(request, doc, e.desc, 'doc_state_edited')
|
||||||
|
|
||||||
if new_state.slug == "lc-req":
|
if new_state.slug == "lc-req":
|
||||||
request_last_call(request, doc)
|
request_last_call(request, doc)
|
||||||
|
|
|
@ -205,7 +205,7 @@ def update_history_with_changes(changes, send_email=True):
|
||||||
doc.set_state(state)
|
doc.set_state(state)
|
||||||
|
|
||||||
if send_email and (state != prev_state):
|
if send_email and (state != prev_state):
|
||||||
email_state_changed(None, doc, "IANA %s state changed to %s" % (kind, state.name))
|
email_state_changed(None, doc, "IANA %s state changed to %s" % (kind, state.name),'doc_iana_state_changed')
|
||||||
|
|
||||||
if doc.time < timestamp:
|
if doc.time < timestamp:
|
||||||
doc.time = timestamp
|
doc.time = timestamp
|
||||||
|
|
Loading…
Reference in a new issue