Add notify edit functionality, and send email to charter.notify when

the state is changed as is done for drafts.
 - Legacy-Id: 4396
This commit is contained in:
Ole Laursen 2012-05-04 16:56:12 +00:00
parent fc01365352
commit 4f9bacbe74
6 changed files with 119 additions and 4 deletions

View file

@ -88,16 +88,24 @@
</tr> </tr>
{% endif %} {% endif %}
<tr><td colspan='2'><hr size='1' noshade /></td></tr> <tr><td colspan='2'><hr size='1' noshade /></td></tr>
<tr>
<td>Send notices to:</td>
<td>{{ doc.notify|default:"none" }}
{% if user|has_role:"Area Director,Secretariat" %}
- <a href="{% url charter_edit_notify name=doc.name %}">Change</a>
{% endif %}
</td>
</tr>
<tr><td>Last updated:</td><td> {{ doc.time|date:"Y-m-d" }}</td></tr> <tr><td>Last updated:</td><td> {{ doc.time|date:"Y-m-d" }}</td></tr>
<tr><td colspan='2'><hr size='1' noshade /></td></tr> <tr><td colspan='2'><hr size='1' noshade /></td></tr>
</table> </table>
<div class="actions"> <div class="actions">
<a href="/feed/wgchanges/{{ group.acronym }}/">Atom feed</a> <a href="/feed/group-changes/{{ group.acronym }}/">Atom feed</a>
</div> </div>
</div> </div>

View file

@ -0,0 +1,32 @@
{% extends "base.html" %}
{% block title %}Set notification list for {{ doc.name }}{% endblock %}
{% block morecss %}
form.edit-notify td input#id_notify { width: 40em; }
form.edit-notify td.actions { padding-top: 1em; }
{% endblock %}
{% block content %}
{% load ietf_filters %}
<h1>Set notification list for {{ doc.name }}</h1>
<form class="edit-notify" action="" method="POST">
<table>
<tr>
<th>{{ form.notify.label_tag }}:</th>
<td>{{ form.notify }}
<div class="help">{{ form.notify.help_text }}</div>
{{ form.notify.errors }}
</td>
</tr>
<tr>
<td></td>
<td class="actions">
<a href="{% url doc_view name=doc.name %}">Back</a>
<input type="submit" value="Save"/>
</td>
</tr>
</table>
</form>
{% endblock %}

View file

@ -37,6 +37,20 @@ def email_secretariat(request, wg, type, text):
) )
) )
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"

View file

@ -116,6 +116,22 @@ class EditCharterTestCase(django.test.TestCase):
charter = Document.objects.get(name=charter.name) charter = Document.objects.get(name=charter.name)
self.assertTrue(not charter.latest_event(TelechatDocEvent, "scheduled_for_telechat").telechat_date) self.assertTrue(not charter.latest_event(TelechatDocEvent, "scheduled_for_telechat").telechat_date)
def test_edit_notify(self):
make_test_data()
charter = Group.objects.get(acronym="mars").charter
url = urlreverse('charter_edit_notify', kwargs=dict(name=charter.name))
login_testing_unauthorized(self, "secretary", url)
# post
self.assertTrue(not charter.notify)
r = self.client.post(url, dict(notify="someone@example.com, someoneelse@example.com"))
self.assertEquals(r.status_code, 302)
charter = Document.objects.get(name=charter.name)
self.assertEquals(charter.notify, "someone@example.com, someoneelse@example.com")
def test_submit_charter(self): def test_submit_charter(self):
make_test_data() make_test_data()

View file

@ -6,9 +6,9 @@ urlpatterns = patterns('',
url(r'^state/$', "ietf.wgcharter.views.change_state", name='charter_change_state'), url(r'^state/$', "ietf.wgcharter.views.change_state", name='charter_change_state'),
url(r'^(?P<option>initcharter|recharter|abandon)/$', "ietf.wgcharter.views.change_state", name='charter_startstop_process'), url(r'^(?P<option>initcharter|recharter|abandon)/$', "ietf.wgcharter.views.change_state", name='charter_startstop_process'),
url(r'^telechat/$', "ietf.wgcharter.views.telechat_date", name='charter_telechat_date'), url(r'^telechat/$', "ietf.wgcharter.views.telechat_date", name='charter_telechat_date'),
url(r'^notify/$', "ietf.wgcharter.views.edit_notify", name='charter_edit_notify'),
url(r'^(?P<ann>action|review)/$', "ietf.wgcharter.views.announcement_text"), url(r'^(?P<ann>action|review)/$', "ietf.wgcharter.views.announcement_text"),
url(r'^ballotwriteupnotes/$', "ietf.wgcharter.views.ballot_writeupnotes"), url(r'^ballotwriteupnotes/$', "ietf.wgcharter.views.ballot_writeupnotes"),
url(r'^approve/$', "ietf.wgcharter.views.approve", name='charter_approve'), url(r'^approve/$', "ietf.wgcharter.views.approve", name='charter_approve'),
url(r'^submit/$', "ietf.wgcharter.views.submit", name='charter_submit'), url(r'^submit/$', "ietf.wgcharter.views.submit", name='charter_submit'),
) )

View file

@ -9,7 +9,7 @@ from django.template import RequestContext
from django import forms from django import forms
from django.forms.util import ErrorList from django.forms.util import ErrorList
from django.utils import simplejson from django.utils import simplejson
from django.utils.html import strip_tags from django.utils.html import strip_tags, escape
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from django.conf import settings from django.conf import settings
@ -112,6 +112,8 @@ def change_state(request, name, option=None):
if message: if message:
email_secretariat(request, wg, "state-%s" % charter_state.slug, message) email_secretariat(request, wg, "state-%s" % charter_state.slug, message)
email_state_changed(request, charter, "State changed to %s from %s." % (charter_state, prev))
if charter_state.slug == "intrev": if charter_state.slug == "intrev":
if request.POST.get("ballot_wo_extern"): if request.POST.get("ballot_wo_extern"):
create_ballot_if_not_open(charter, login, "r-wo-ext") create_ballot_if_not_open(charter, login, "r-wo-ext")
@ -223,6 +225,49 @@ def telechat_date(request, name):
login=login), login=login),
context_instance=RequestContext(request)) 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)
def clean_notify(self):
return self.cleaned_data["notify"].strip()
@role_required("Area Director", "Secretariat")
def edit_notify(request, name):
doc = get_object_or_404(Document, type="charter", name=name)
login = request.user.get_profile()
init = {'notify': doc.notify}
if request.method == "POST":
form = NotifyForm(request.POST, initial=init)
if form.is_valid():
n = form.cleaned_data["notify"]
if n != doc.notify:
save_document_in_history(doc)
e = DocEvent(doc=doc, by=login)
e.desc = "Notification list changed to %s" % (escape(n) or "none")
if doc.notify:
e.desc += " from %s" % escape(doc.notify)
e.type = "changed_document"
e.save()
doc.notify = n
doc.time = e.time
doc.save()
return redirect("doc_view", name=doc.name)
else:
form = NotifyForm(initial=init)
return render_to_response('wgcharter/edit_notify.html',
dict(doc=doc,
form=form,
user=request.user,
login=login),
context_instance=RequestContext(request))
class UploadForm(forms.Form): class UploadForm(forms.Form):
content = forms.CharField(widget=forms.Textarea, label="Charter text", help_text="Edit the charter text", required=False) content = forms.CharField(widget=forms.Textarea, label="Charter text", help_text="Edit the charter text", required=False)
txt = forms.FileField(label=".txt format", help_text="Or upload a .txt file", required=False) txt = forms.FileField(label=".txt format", help_text="Or upload a .txt file", required=False)