checkpoint. Sets initial notify to empty

- Legacy-Id: 10009
This commit is contained in:
Robert Sparks 2015-08-11 02:27:59 +00:00
parent ecad71eb82
commit 6c85bc558c
11 changed files with 46 additions and 63 deletions

View file

@ -105,14 +105,11 @@ def generate_ballot_writeup(request, doc):
def generate_last_call_announcement(request, doc):
expiration_date = datetime.date.today() + datetime.timedelta(days=14)
cc = []
if doc.group.type_id in ("individ", "area"):
group = "an individual submitter"
expiration_date += datetime.timedelta(days=14)
else:
group = "the %s WG (%s)" % (doc.group.name, doc.group.acronym)
if doc.group.list_email:
cc.append(doc.group.list_email)
doc.filled_title = textwrap.fill(doc.title, width=70, subsequent_indent=" " * 3)
@ -127,7 +124,8 @@ def generate_last_call_announcement(request, doc):
dict(doc=doc,
doc_url=settings.IDTRACKER_BASE_URL + doc.get_absolute_url() + "ballot/",
expiration_date=expiration_date.strftime("%Y-%m-%d"), #.strftime("%B %-d, %Y"),
cc=", ".join("<%s>" % e for e in cc),
to=",\n ".join(gather_addresses('last_call_issued',doc=doc)),
cc=",\n ".join(gather_addresses('last_call_issued_cc',doc=doc)),
group=group,
docs=[ doc ],
urls=[ settings.IDTRACKER_BASE_URL + doc.get_absolute_url() ],
@ -256,14 +254,17 @@ def generate_publication_request(request, doc):
)
def send_last_call_request(request, doc):
to = "iesg-secretary@ietf.org"
to = gather_addresses('last_call_requested',doc=doc)
cc = gather_addresses('last_call_requested_cc',doc=doc)
frm = '"DraftTracker Mail System" <iesg-secretary@ietf.org>'
send_mail(request, to, frm,
"Last Call: %s" % doc.file_tag(),
"doc/mail/last_call_request.txt",
dict(docs=[doc],
doc_url=settings.IDTRACKER_BASE_URL + doc.get_absolute_url()))
doc_url=settings.IDTRACKER_BASE_URL + doc.get_absolute_url(),
),
cc=cc)
def email_resurrect_requested(request, doc, by):
to = "I-D Administrator <internet-drafts@ietf.org>"

View file

@ -196,8 +196,7 @@ class EditCharterTests(TestCase):
self.assertEqual(charter.notify,newlist)
q = PyQuery(r.content)
formlist = q('form input[name=notify]')[0].value
self.assertTrue('marschairman@ietf.org' in formlist)
self.assertFalse('someone@example.com' in formlist)
self.assertEqual(formlist, None)
def test_edit_ad(self):
make_test_data()

View file

@ -189,9 +189,7 @@ class ConflictReviewTests(TestCase):
# Regenerate does not save!
self.assertEqual(doc.notify,newlist)
q = PyQuery(r.content)
self.assertTrue('draft-imaginary-irtf-submission@ietf.org' in q('form input[name=notify]')[0].value)
self.assertTrue('irtf-chair@ietf.org' in q('form input[name=notify]')[0].value)
self.assertTrue('foo@bar.baz.com' not in q('form input[name=notify]')[0].value)
self.assertEqual(None,q('form input[name=notify]')[0].value)
def test_edit_ad(self):
doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission')

View file

@ -330,7 +330,7 @@ class EditInfoTests(TestCase):
self.assertEqual(r.status_code, 200)
q = PyQuery(r.content)
self.assertEqual(len(q('form select[name=intended_std_level]')), 1)
self.assertTrue('@' in q('form input[name=notify]')[0].get('value'))
self.assertEqual(None,q('form input[name=notify]')[0].value)
# add
events_before = draft.docevent_set.count()
@ -734,7 +734,7 @@ class IndividualInfoFormsTests(TestCase):
# Regenerate does not save!
self.assertEqual(self.doc.notify,'TJ2APh2P@ietf.org')
q = PyQuery(r.content)
self.assertTrue('TJ2Aph2P' not in q('form input[name=notify]')[0].value)
self.assertEqual(None,q('form input[name=notify]')[0].value)
def test_doc_change_intended_status(self):
url = urlreverse('doc_change_intended_status', kwargs=dict(name=self.docname))
@ -1092,9 +1092,7 @@ class AdoptDraftTests(TestCase):
self.assertEqual(draft.group.acronym, "mars")
self.assertEqual(draft.stream_id, "ietf")
self.assertEqual(draft.docevent_set.count() - events_before, 5)
self.assertTrue('draft-ietf-mars-test@ietf.org' in draft.notify)
self.assertTrue('draft-ietf-mars-test.ad@ietf.org' in draft.notify)
self.assertTrue('draft-ietf-mars-test.shepherd@ietf.org' in draft.notify)
self.assertEqual(draft.notify,"aliens@example.mars")
self.assertEqual(len(outbox), mailbox_before + 1)
self.assertTrue("state changed" in outbox[-1]["Subject"].lower())
self.assertTrue("marschairman@ietf.org" in unicode(outbox[-1]))

View file

@ -111,7 +111,6 @@ class StatusChangeTests(TestCase):
doc = Document.objects.get(name='status-change-imaginary-mid-review')
self.assertEquals(doc.get_state('statchg').slug,'lc-req')
self.assertEquals(len(outbox), messages_before + 1)
self.assertTrue('iesg-secretary' in outbox[-1]['To'])
self.assertTrue('Last Call:' in outbox[-1]['Subject'])
# successful change to IESG Evaluation
@ -157,9 +156,7 @@ class StatusChangeTests(TestCase):
self.assertEqual(doc.notify,newlist)
q = PyQuery(r.content)
formlist = q('form input[name=notify]')[0].value
self.assertTrue('draft-ietf-random-thing@ietf.org' in formlist)
self.assertTrue('draft-ietf-random-otherthing@ietf.org' in formlist)
self.assertFalse('foo@bar.baz.com' in formlist)
self.assertEqual(None,formlist)
def test_edit_title(self):
doc = Document.objects.get(name='status-change-imaginary-mid-review')
@ -285,7 +282,6 @@ class StatusChangeTests(TestCase):
self.assertEqual(r.status_code,200)
self.assertTrue( 'Last call requested' in ''.join(wrap(r.content,2**16)))
self.assertEqual(len(outbox), messages_before + 1)
self.assertTrue('iesg-secretary' in outbox[-1]['To'])
self.assertTrue('Last Call:' in outbox[-1]['Subject'])
self.assertTrue('Last Call Request has been submitted' in ''.join(wrap(unicode(outbox[-1]),2**16)))

View file

@ -5,7 +5,6 @@ import math
import datetime
from django.conf import settings
from django.db.models import Q
from django.db.models.query import EmptyQuerySet
from django.forms import ValidationError
from django.utils.html import strip_tags, escape
@ -13,10 +12,9 @@ from django.utils.html import strip_tags, escape
from ietf.doc.models import Document, DocHistory, State
from ietf.doc.models import DocAlias, RelatedDocument, BallotType, DocReminder
from ietf.doc.models import DocEvent, BallotDocEvent, NewRevisionDocEvent, StateDocEvent
from ietf.doc.models import save_document_in_history, STATUSCHANGE_RELATIONS
from ietf.doc.models import save_document_in_history
from ietf.name.models import DocReminderTypeName, DocRelationshipName
from ietf.group.models import Role
from ietf.person.models import Email
from ietf.ietfauth.utils import has_role
from ietf.utils import draft, markup_txt
from ietf.utils.mail import send_mail
@ -543,41 +541,9 @@ def check_common_doc_name_rules(name):
raise ValidationError(errors)
def get_initial_notify(doc,extra=None):
# set change state notice to something sensible
# With the mailtoken based changes, a document's notify should start empty
receivers = []
if doc.type.slug=='draft':
if doc.group.type_id in ("individ", "area"):
for a in doc.authors.all():
receivers.append(a.address)
else:
receivers.append("%s-chairs@%s" % (doc.group.acronym, settings.DRAFT_ALIAS_DOMAIN))
for editor in Email.objects.filter(role__name="editor", role__group=doc.group):
receivers.append(editor.address)
receivers.append("%s@%s" % (doc.name, settings.DRAFT_ALIAS_DOMAIN))
receivers.append("%s.ad@%s" % (doc.name, settings.DRAFT_ALIAS_DOMAIN))
receivers.append("%s.shepherd@%s" % (doc.name, settings.DRAFT_ALIAS_DOMAIN))
elif doc.type.slug=='charter':
receivers.extend([role.person.formatted_email() for role in doc.group.role_set.filter(name__slug__in=['ad','chair','secr','techadv'])])
else:
pass
for relation in doc.relateddocument_set.filter(Q(relationship='conflrev')|Q(relationship__in=STATUSCHANGE_RELATIONS)):
if relation.relationship.slug=='conflrev':
doc_to_review = relation.target.document
receivers.extend([x.person.formatted_email() for x in Role.objects.filter(group__acronym=doc_to_review.stream.slug,name='chair')])
receivers.append("%s@%s" % (doc_to_review.name, settings.DRAFT_ALIAS_DOMAIN))
elif relation.relationship.slug in STATUSCHANGE_RELATIONS:
affected_doc = relation.target.document
if affected_doc.notify:
receivers.extend(affected_doc.notify.split(','))
if doc.shepherd:
receivers.append(doc.shepherd.email_address())
if extra:
if isinstance(extra,basestring):
extra = extra.split(', ')

View file

@ -127,8 +127,8 @@ def default_action_text(group, charter, by):
techadv=group.role_set.filter(name="techadv"),
milestones=group.groupmilestone_set.filter(state="charter"),
action_type=action,
to=", ".join(gather_addresses('ballot_approved_charter',doc=charter,group=group)),
cc=", ".join(gather_addresses('ballot_approved_charter_cc',doc=charter,group=group)),
to=",\n ".join(gather_addresses('ballot_approved_charter',doc=charter,group=group)),
cc=",\n ".join(gather_addresses('ballot_approved_charter_cc',doc=charter,group=group)),
))
e.save()

View file

@ -299,8 +299,8 @@ def default_approval_text(status_change,relateddoc):
approved_text = current_text,
action=action,
newstatus=newstatus(relateddoc),
to=", ".join(gather_addresses('ballot_approved_status_change',doc=status_change)),
cc=", ".join(gather_addresses('ballot_approved_status_change_cc',doc=status_change)),
to=",\n ".join(gather_addresses('ballot_approved_status_change',doc=status_change)),
cc=",\n ".join(gather_addresses('ballot_approved_status_change_cc',doc=status_change)),
)
)

View file

@ -194,6 +194,31 @@ def make_mailtokens(apps):
'doc_affecteddoc_notify',
])
mt_factory(slug='last_call_requested',
desc='Recipients when AD requests a last call',
recipient_slugs=['iesg_secretary',])
mt_factory(slug='last_call_requested_cc',
desc='Copied when AD requests a last call',
recipient_slugs=['doc_ad',
'doc_shepherd',
'doc_notify'])
mt_factory(slug='last_call_issued',
desc='Recipients when a last call is issued',
recipient_slugs=['ietf_announce',])
mt_factory(slug='last_call_issued_cc',
desc='Copied when a last call is issued',
recipient_slugs=['doc_ad',
'doc_shepherd',
'doc_authors',
'doc_notify',
'doc_group_list_email',
'doc_group_chairs',
'doc_affecteddoc_authors',
'doc_affecteddoc_group_chairs',
'doc_affecteddoc_notify'])
def forward(apps, schema_editor):

View file

@ -1,5 +1,5 @@
{% load ietf_filters %}{% load mail_filters %}{% autoescape off %}From: The IESG <iesg-secretary@ietf.org>
To: IETF-Announce <ietf-announce@ietf.org>{% if cc %}
To: {{ to }}{% if cc %}
CC: {{ cc }}{% endif %}
Reply-To: ietf@ietf.org
Sender: <iesg-secretary@ietf.org>

View file

@ -335,7 +335,7 @@ def make_test_data():
# This won't allow testing the results of the production configuration - if we want to do that, we'll need to
# extract the production data either directly, or as a fixture
recipient = Recipient.objects.create(slug='bogus_recipient',desc='Bogus Recipient',template='bogus@example.com')
for slug in [u'ballot_approved_charter', u'ballot_approved_charter_cc', u'ballot_approved_conflrev', u'ballot_approved_conflrev_cc', u'ballot_approved_ietf_stream', u'ballot_approved_ietf_stream_cc', u'ballot_approved_ietf_stream_iana', u'ballot_approved_status_change', u'ballot_approved_status_change_cc', u'ballot_deferred', u'ballot_saved', u'ballot_saved_cc']:
for slug in [u'ballot_approved_charter', u'ballot_approved_charter_cc', u'ballot_approved_conflrev', u'ballot_approved_conflrev_cc', u'ballot_approved_ietf_stream', u'ballot_approved_ietf_stream_cc', u'ballot_approved_ietf_stream_iana', u'ballot_approved_status_change', u'ballot_approved_status_change_cc', u'ballot_deferred', u'ballot_saved', u'ballot_saved_cc', u'last_call_issued', u'last_call_issued_cc', u'last_call_requested', u'last_call_requested_cc']:
m = MailToken.objects.create(slug=slug,desc=slug)
m.recipients=[recipient]