mailtoken becomes mailtrigger

- Legacy-Id: 10090
This commit is contained in:
Robert Sparks 2015-09-17 20:03:45 +00:00
parent e03bdbabe4
commit f5b6465e81
43 changed files with 261 additions and 261 deletions

View file

@ -10,7 +10,7 @@ from ietf.doc.models import Document, DocEvent, State, save_document_in_history,
from ietf.person.models import Person from ietf.person.models import Person
from ietf.meeting.models import Meeting from ietf.meeting.models import Meeting
from ietf.doc.utils import add_state_change_event from ietf.doc.utils import add_state_change_event
from ietf.mailtoken.utils import gather_address_lists from ietf.mailtrigger.utils import gather_address_lists
def expirable_draft(draft): def expirable_draft(draft):

View file

@ -14,10 +14,10 @@ from ietf.doc.models import WriteupDocEvent, LastCallDocEvent, DocAlias, Consens
from ietf.doc.utils import needed_ballot_positions, get_document_content from ietf.doc.utils import needed_ballot_positions, get_document_content
from ietf.group.models import Role from ietf.group.models import Role
from ietf.doc.models import Document from ietf.doc.models import Document
from ietf.mailtoken.utils import gather_address_lists from ietf.mailtrigger.utils import gather_address_lists
def email_state_changed(request, doc, text, mailtoken_id=None): def email_state_changed(request, doc, text, mailtrigger_id=None):
(to,cc) = gather_address_lists(mailtoken_id or 'doc_state_edited',doc=doc) (to,cc) = gather_address_lists(mailtrigger_id or 'doc_state_edited',doc=doc)
if not to: if not to:
return return

View file

@ -152,7 +152,7 @@ class EditPositionTests(TestCase):
# send # send
mailbox_before = len(outbox) mailbox_before = len(outbox)
r = self.client.post(url, dict(extra_cc="test298347@example.com", cc_tokens=['doc_notify','doc_group_chairs'])) r = self.client.post(url, dict(extra_cc="test298347@example.com", cc_choices=['doc_notify','doc_group_chairs']))
self.assertEqual(r.status_code, 302) self.assertEqual(r.status_code, 302)
self.assertEqual(len(outbox), mailbox_before + 1) self.assertEqual(len(outbox), mailbox_before + 1)
@ -163,11 +163,11 @@ class EditPositionTests(TestCase):
self.assertTrue("clearer title" in str(m)) self.assertTrue("clearer title" in str(m))
self.assertTrue("Test!" in str(m)) self.assertTrue("Test!" in str(m))
self.assertTrue("iesg@" in m['To']) self.assertTrue("iesg@" in m['To'])
# cc_token doc_group_chairs # cc_choice doc_group_chairs
self.assertTrue("mars-chairs@" in m['Cc']) self.assertTrue("mars-chairs@" in m['Cc'])
# cc_token doc_notify # cc_choice doc_notify
self.assertTrue("somebody@example.com" in m['Cc']) self.assertTrue("somebody@example.com" in m['Cc'])
# cc_token doc_group_email_list was not selected # cc_choice doc_group_email_list was not selected
self.assertFalse(draft.group.list_email in m['Cc']) self.assertFalse(draft.group.list_email in m['Cc'])
# extra-cc # extra-cc
self.assertTrue("test298347@example.com" in m['Cc']) self.assertTrue("test298347@example.com" in m['Cc'])

View file

@ -18,7 +18,7 @@ from ietf.group.models import Role
from ietf.ietfauth.utils import has_role from ietf.ietfauth.utils import has_role
from ietf.utils import draft, markup_txt from ietf.utils import draft, markup_txt
from ietf.utils.mail import send_mail from ietf.utils.mail import send_mail
from ietf.mailtoken.utils import gather_address_lists from ietf.mailtrigger.utils import gather_address_lists
#TODO FIXME - it would be better if this lived in ietf/doc/mails.py, but there's #TODO FIXME - it would be better if this lived in ietf/doc/mails.py, but there's
# an import order issue to work out. # an import order issue to work out.
@ -524,7 +524,7 @@ def check_common_doc_name_rules(name):
raise ValidationError(errors) raise ValidationError(errors)
def get_initial_notify(doc,extra=None): def get_initial_notify(doc,extra=None):
# With the mailtoken based changes, a document's notify should start empty # With the mailtrigger based changes, a document's notify should start empty
receivers = [] receivers = []
if extra: if extra:

View file

@ -6,7 +6,7 @@ from django.conf import settings
from ietf.doc.models import NewRevisionDocEvent, WriteupDocEvent from ietf.doc.models import NewRevisionDocEvent, WriteupDocEvent
from ietf.utils.history import find_history_active_at from ietf.utils.history import find_history_active_at
from ietf.utils.mail import parse_preformatted from ietf.utils.mail import parse_preformatted
from ietf.mailtoken.utils import gather_address_lists from ietf.mailtrigger.utils import gather_address_lists
def charter_name_for_group(group): def charter_name_for_group(group):
if group.type_id == "rg": if group.type_id == "rg":

View file

@ -27,8 +27,8 @@ from ietf.message.utils import infer_message
from ietf.name.models import BallotPositionName from ietf.name.models import BallotPositionName
from ietf.person.models import Person from ietf.person.models import Person
from ietf.utils.mail import send_mail_text, send_mail_preformatted from ietf.utils.mail import send_mail_text, send_mail_preformatted
from ietf.mailtoken.utils import gather_address_lists from ietf.mailtrigger.utils import gather_address_lists
from ietf.mailtoken.forms import CcSelectForm from ietf.mailtrigger.forms import CcSelectForm
BALLOT_CHOICES = (("yes", "Yes"), BALLOT_CHOICES = (("yes", "Yes"),
("noobj", "No Objection"), ("noobj", "No Objection"),
@ -289,7 +289,7 @@ def send_ballot_comment(request, name, ballot_id):
if request.method == 'POST': if request.method == 'POST':
cc = [] cc = []
cc_select_form = CcSelectForm(data=request.POST,mailtoken_slug='ballot_saved',mailtoken_context={'doc':doc}) cc_select_form = CcSelectForm(data=request.POST,mailtrigger_slug='ballot_saved',mailtrigger_context={'doc':doc})
if cc_select_form.is_valid(): if cc_select_form.is_valid():
cc.extend(cc_select_form.get_selected_addresses()) cc.extend(cc_select_form.get_selected_addresses())
extra_cc = [x.strip() for x in request.POST.get("extra_cc","").split(',') if x.strip()] extra_cc = [x.strip() for x in request.POST.get("extra_cc","").split(',') if x.strip()]
@ -302,7 +302,7 @@ def send_ballot_comment(request, name, ballot_id):
else: else:
cc_select_form = CcSelectForm(mailtoken_slug='ballot_saved',mailtoken_context={'doc':doc}) cc_select_form = CcSelectForm(mailtrigger_slug='ballot_saved',mailtrigger_context={'doc':doc})
return render_to_response('doc/ballot/send_ballot_comment.html', return render_to_response('doc/ballot/send_ballot_comment.html',
dict(doc=doc, dict(doc=doc,

View file

@ -20,7 +20,7 @@ from ietf.ietfauth.utils import has_role, role_required, is_authorized_in_doc_st
from ietf.person.models import Person from ietf.person.models import Person
from ietf.utils.mail import send_mail_preformatted from ietf.utils.mail import send_mail_preformatted
from ietf.utils.textupload import get_cleaned_text_file_content from ietf.utils.textupload import get_cleaned_text_file_content
from ietf.mailtoken.utils import gather_address_lists from ietf.mailtrigger.utils import gather_address_lists
class ChangeStateForm(forms.Form): class ChangeStateForm(forms.Form):
review_state = forms.ModelChoiceField(State.objects.filter(used=True, type="conflrev"), label="Conflict review state", empty_label=None, required=True) review_state = forms.ModelChoiceField(State.objects.filter(used=True, type="conflrev"), label="Conflict review state", empty_label=None, required=True)

View file

@ -59,7 +59,7 @@ from ietf.person.models import Email
from ietf.utils.history import find_history_active_at from ietf.utils.history import find_history_active_at
from ietf.doc.forms import TelechatForm, NotifyForm from ietf.doc.forms import TelechatForm, NotifyForm
from ietf.doc.mails import email_comment from ietf.doc.mails import email_comment
from ietf.mailtoken.utils import gather_relevant_expansions from ietf.mailtrigger.utils import gather_relevant_expansions
def render_document_top(request, doc, tab, name): def render_document_top(request, doc, tab, name):
tabs = [] tabs = []

View file

@ -38,7 +38,7 @@ from ietf.person.models import Person, Email
from ietf.secr.lib.template import jsonapi from ietf.secr.lib.template import jsonapi
from ietf.utils.mail import send_mail, send_mail_message from ietf.utils.mail import send_mail, send_mail_message
from ietf.utils.textupload import get_cleaned_text_file_content from ietf.utils.textupload import get_cleaned_text_file_content
from ietf.mailtoken.utils import gather_address_lists from ietf.mailtrigger.utils import gather_address_lists
class ChangeStateForm(forms.Form): class ChangeStateForm(forms.Form):
state = forms.ModelChoiceField(State.objects.filter(used=True, type="draft-iesg"), empty_label=None, required=True) state = forms.ModelChoiceField(State.objects.filter(used=True, type="draft-iesg"), empty_label=None, required=True)

View file

@ -22,7 +22,7 @@ from ietf.name.models import DocRelationshipName, StdLevelName
from ietf.person.models import Person from ietf.person.models import Person
from ietf.utils.mail import send_mail_preformatted from ietf.utils.mail import send_mail_preformatted
from ietf.utils.textupload import get_cleaned_text_file_content from ietf.utils.textupload import get_cleaned_text_file_content
from ietf.mailtoken.utils import gather_address_lists from ietf.mailtrigger.utils import gather_address_lists
class ChangeStateForm(forms.Form): class ChangeStateForm(forms.Form):
new_state = forms.ModelChoiceField(State.objects.filter(type="statchg", used=True), label="Status Change Evaluation State", empty_label=None, required=True) new_state = forms.ModelChoiceField(State.objects.filter(type="statchg", used=True), label="Status Change Evaluation State", empty_label=None, required=True)

View file

@ -57,7 +57,7 @@ from ietf.group.utils import get_charter_text, can_manage_group_type, milestone_
from ietf.group.utils import can_manage_materials, get_group_or_404 from ietf.group.utils import can_manage_materials, get_group_or_404
from ietf.utils.pipe import pipe from ietf.utils.pipe import pipe
from ietf.settings import MAILING_LIST_INFO_URL from ietf.settings import MAILING_LIST_INFO_URL
from ietf.mailtoken.utils import gather_relevant_expansions from ietf.mailtrigger.utils import gather_relevant_expansions
def roles(group, role_name): def roles(group, role_name):
return Role.objects.filter(group=group, name=role_name).select_related("email", "person") return Role.objects.filter(group=group, name=role_name).select_related("email", "person")

View file

@ -12,10 +12,10 @@ from django.core.urlresolvers import reverse as urlreverse
from ietf.utils.mail import send_mail, send_mail_text from ietf.utils.mail import send_mail, send_mail_text
from ietf.group.models import Group from ietf.group.models import Group
from ietf.group.utils import milestone_reviewer_for_group_type from ietf.group.utils import milestone_reviewer_for_group_type
from ietf.mailtoken.utils import gather_address_lists from ietf.mailtrigger.utils import gather_address_lists
def email_admin_re_charter(request, group, subject, text, mailtoken): def email_admin_re_charter(request, group, subject, text, mailtrigger):
(to,cc) = gather_address_lists(mailtoken,group=group) (to,cc) = gather_address_lists(mailtrigger,group=group)
full_subject = u"Regarding %s %s: %s" % (group.type.name, group.acronym, subject) full_subject = u"Regarding %s %s: %s" % (group.type.name, group.acronym, subject)
text = strip_tags(text) text = strip_tags(text)

View file

@ -11,7 +11,7 @@ from ietf.ipr.models import IprEvent
from ietf.message.models import Message from ietf.message.models import Message
from ietf.person.models import Person from ietf.person.models import Person
from ietf.utils.log import log from ietf.utils.log import log
from ietf.mailtoken.utils import get_base_ipr_request_address from ietf.mailtrigger.utils import get_base_ipr_request_address
# ---------------------------------------------------------------- # ----------------------------------------------------------------
# Date Functions # Date Functions
@ -129,7 +129,7 @@ def get_update_submitter_emails(ipr):
else: else:
email_to_iprs[email] = [related.target] email_to_iprs[email] = [related.target]
# TODO: This has not been converted to use mailtoken. It is complicated. # TODO: This has not been converted to use mailtrigger. It is complicated.
# When converting it, it will need something like ipr_submitter_ietfer_or_holder perhaps # When converting it, it will need something like ipr_submitter_ietfer_or_holder perhaps
for email in email_to_iprs: for email in email_to_iprs:
context = dict( context = dict(

View file

@ -15,7 +15,7 @@ from ietf.message.models import Message
from ietf.utils.test_utils import TestCase, login_testing_unauthorized from ietf.utils.test_utils import TestCase, login_testing_unauthorized
from ietf.utils.test_data import make_test_data from ietf.utils.test_data import make_test_data
from ietf.utils.mail import outbox, empty_outbox from ietf.utils.mail import outbox, empty_outbox
from ietf.mailtoken.utils import gather_address_lists from ietf.mailtrigger.utils import gather_address_lists
class IprTests(TestCase): class IprTests(TestCase):

View file

@ -34,7 +34,7 @@ from ietf.person.models import Person
from ietf.secr.utils.document import get_rfc_num, is_draft from ietf.secr.utils.document import get_rfc_num, is_draft
from ietf.utils.draft_search import normalize_draftname from ietf.utils.draft_search import normalize_draftname
from ietf.utils.mail import send_mail, send_mail_message from ietf.utils.mail import send_mail, send_mail_message
from ietf.mailtoken.utils import gather_address_lists from ietf.mailtrigger.utils import gather_address_lists
# ---------------------------------------------------------------- # ----------------------------------------------------------------
# Globals # Globals

View file

@ -7,7 +7,7 @@ from django.core.urlresolvers import reverse as urlreverse
from ietf.utils.mail import send_mail_text from ietf.utils.mail import send_mail_text
from ietf.liaisons.utils import role_persons_with_fixed_email from ietf.liaisons.utils import role_persons_with_fixed_email
from ietf.group.models import Role from ietf.group.models import Role
from ietf.mailtoken.utils import gather_address_lists from ietf.mailtrigger.utils import gather_address_lists
def send_liaison_by_email(request, liaison): def send_liaison_by_email(request, liaison):
subject = u'New Liaison Statement, "%s"' % (liaison.title) subject = u'New Liaison Statement, "%s"' % (liaison.title)

View file

@ -1,11 +0,0 @@
from django.conf.urls import patterns, url
from django.views.generic import RedirectView
from django.core.urlresolvers import reverse_lazy
urlpatterns = patterns('ietf.mailtoken.views',
url(r'^$', RedirectView.as_view(url=reverse_lazy('mailtoken_show_tokens'), permanent=True)),
url(r'^token/$', 'show_tokens', name='mailtoken_show_tokens' ),
url(r'^token/(?P<mailtoken_slug>[-\w]+)/$', 'show_tokens' ),
url(r'^recipient/$', 'show_recipients' ),
url(r'^recipient/(?P<recipient_slug>[-\w]+)/$', 'show_recipients' ),
)

View file

@ -1,6 +1,6 @@
from django.contrib import admin from django.contrib import admin
from ietf.mailtoken.models import MailToken, Recipient from ietf.mailtrigger.models import MailTrigger, Recipient
class RecipientAdmin(admin.ModelAdmin): class RecipientAdmin(admin.ModelAdmin):
list_display = [ 'slug', 'desc', 'template', 'has_code', ] list_display = [ 'slug', 'desc', 'template', 'has_code', ]
@ -10,8 +10,8 @@ class RecipientAdmin(admin.ModelAdmin):
admin.site.register(Recipient, RecipientAdmin) admin.site.register(Recipient, RecipientAdmin)
class MailTokenAdmin(admin.ModelAdmin): class MailTriggerAdmin(admin.ModelAdmin):
list_display = [ 'slug', 'desc', ] list_display = [ 'slug', 'desc', ]
filter_horizontal = [ 'to', 'cc', ] filter_horizontal = [ 'to', 'cc', ]
admin.site.register(MailToken, MailTokenAdmin) admin.site.register(MailTrigger, MailTriggerAdmin)

View file

@ -1,30 +1,30 @@
from django import forms from django import forms
from ietf.mailtoken.models import MailToken from ietf.mailtrigger.models import MailTrigger
class CcSelectForm(forms.Form): class CcSelectForm(forms.Form):
expansions = dict() expansions = dict()
cc_tokens = forms.MultipleChoiceField( cc_choices = forms.MultipleChoiceField(
label='Cc', label='Cc',
choices=[], choices=[],
widget=forms.CheckboxSelectMultiple(attrs={'frob':'knob'}), widget=forms.CheckboxSelectMultiple(attrs={'frob':'knob'}),
) )
def __init__(self, mailtoken_slug, mailtoken_context, *args, **kwargs): def __init__(self, mailtrigger_slug, mailtrigger_context, *args, **kwargs):
super(CcSelectForm,self).__init__(*args,**kwargs) super(CcSelectForm,self).__init__(*args,**kwargs)
mailtoken = MailToken.objects.get(slug=mailtoken_slug) mailtrigger = MailTrigger.objects.get(slug=mailtrigger_slug)
for r in mailtoken.cc.all(): for r in mailtrigger.cc.all():
self.expansions[r.slug] = r.gather(**mailtoken_context) self.expansions[r.slug] = r.gather(**mailtrigger_context)
non_empty_expansions = [x for x in self.expansions if self.expansions[x]] non_empty_expansions = [x for x in self.expansions if self.expansions[x]]
self.fields['cc_tokens'].initial = non_empty_expansions self.fields['cc_choices'].initial = non_empty_expansions
self.fields['cc_tokens'].choices = [(t,'%s: %s'%(t,", ".join(self.expansions[t]))) for t in non_empty_expansions] self.fields['cc_choices'].choices = [(t,'%s: %s'%(t,", ".join(self.expansions[t]))) for t in non_empty_expansions]
def get_selected_addresses(self): def get_selected_addresses(self):
if self.is_valid(): if self.is_valid():
addrs = [] addrs = []
for t in self.cleaned_data['cc_tokens']: for t in self.cleaned_data['cc_choices']:
addrs.extend(self.expansions[t]) addrs.extend(self.expansions[t])
return addrs return addrs
else: else:

View file

@ -11,7 +11,7 @@ class Migration(migrations.Migration):
operations = [ operations = [
migrations.CreateModel( migrations.CreateModel(
name='MailToken', name='MailTrigger',
fields=[ fields=[
('slug', models.CharField(max_length=32, serialize=False, primary_key=True)), ('slug', models.CharField(max_length=32, serialize=False, primary_key=True)),
('desc', models.TextField(blank=True)), ('desc', models.TextField(blank=True)),
@ -34,15 +34,15 @@ class Migration(migrations.Migration):
bases=(models.Model,), bases=(models.Model,),
), ),
migrations.AddField( migrations.AddField(
model_name='mailtoken', model_name='mailtrigger',
name='cc', name='cc',
field=models.ManyToManyField(related_name='used_in_cc', null=True, to='mailtoken.Recipient', blank=True), field=models.ManyToManyField(related_name='used_in_cc', null=True, to='mailtrigger.Recipient', blank=True),
preserve_default=True, preserve_default=True,
), ),
migrations.AddField( migrations.AddField(
model_name='mailtoken', model_name='mailtrigger',
name='to', name='to',
field=models.ManyToManyField(related_name='used_in_to', null=True, to='mailtoken.Recipient', blank=True), field=models.ManyToManyField(related_name='used_in_to', null=True, to='mailtrigger.Recipient', blank=True),
preserve_default=True, preserve_default=True,
), ),
] ]

View file

@ -5,7 +5,7 @@ from django.db import migrations
def make_recipients(apps): def make_recipients(apps):
Recipient=apps.get_model('mailtoken','Recipient') Recipient=apps.get_model('mailtrigger','Recipient')
rc = Recipient.objects.create rc = Recipient.objects.create
@ -247,10 +247,10 @@ def make_recipients(apps):
desc="The IETF New Work list", desc="The IETF New Work list",
template='<new-work@ietf.org>') template='<new-work@ietf.org>')
def make_mailtokens(apps): def make_mailtriggers(apps):
Recipient=apps.get_model('mailtoken','Recipient') Recipient=apps.get_model('mailtrigger','Recipient')
MailToken=apps.get_model('mailtoken','MailToken') MailTrigger=apps.get_model('mailtrigger','MailTrigger')
def mt_factory(slug,desc,to_slugs,cc_slugs=[]): def mt_factory(slug,desc,to_slugs,cc_slugs=[]):
@ -264,7 +264,7 @@ def make_mailtokens(apps):
print "****Some rule tried to use",recipient_slug print "****Some rule tried to use",recipient_slug
raise raise
m = MailToken.objects.create(slug=slug, desc=desc) m = MailTrigger.objects.create(slug=slug, desc=desc)
m.to = Recipient.objects.filter(slug__in=to_slugs) m.to = Recipient.objects.filter(slug__in=to_slugs)
m.cc = Recipient.objects.filter(slug__in=cc_slugs) m.cc = Recipient.objects.filter(slug__in=cc_slugs)
@ -841,21 +841,21 @@ def make_mailtokens(apps):
def forward(apps, schema_editor): def forward(apps, schema_editor):
make_recipients(apps) make_recipients(apps)
make_mailtokens(apps) make_mailtriggers(apps)
def reverse(apps, schema_editor): def reverse(apps, schema_editor):
Recipient=apps.get_model('mailtoken','Recipient') Recipient=apps.get_model('mailtrigger','Recipient')
MailToken=apps.get_model('mailtoken','MailToken') MailTrigger=apps.get_model('mailtrigger','MailTrigger')
Recipient.objects.all().delete() Recipient.objects.all().delete()
MailToken.objects.all().delete() MailTrigger.objects.all().delete()
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('mailtoken', '0001_initial'), ('mailtrigger', '0001_initial'),
] ]
operations = [ operations = [

View file

@ -5,7 +5,7 @@ from django.template import Template, Context
from ietf.group.models import Role from ietf.group.models import Role
class MailToken(models.Model): class MailTrigger(models.Model):
slug = models.CharField(max_length=32, primary_key=True) slug = models.CharField(max_length=32, primary_key=True)
desc = models.TextField(blank=True) desc = models.TextField(blank=True)
to = models.ManyToManyField('Recipient', null=True, blank=True, related_name='used_in_to') to = models.ManyToManyField('Recipient', null=True, blank=True, related_name='used_in_to')

View file

@ -5,7 +5,7 @@ from tastypie.constants import ALL, ALL_WITH_RELATIONS # pyflakes:ignore
from ietf import api from ietf import api
from ietf.mailtoken.models import * # pyflakes:ignore from ietf.mailtrigger.models import * # pyflakes:ignore
class RecipientResource(ModelResource): class RecipientResource(ModelResource):
@ -17,19 +17,19 @@ class RecipientResource(ModelResource):
"desc": ALL, "desc": ALL,
"template": ALL, "template": ALL,
} }
api.mailtoken.register(RecipientResource()) api.mailtrigger.register(RecipientResource())
class MailTokenResource(ModelResource): class MailTriggerResource(ModelResource):
to = ToManyField(RecipientResource, 'to', null=True) to = ToManyField(RecipientResource, 'to', null=True)
cc = ToManyField(RecipientResource, 'cc', null=True) cc = ToManyField(RecipientResource, 'cc', null=True)
class Meta: class Meta:
queryset = MailToken.objects.all() queryset = MailTrigger.objects.all()
#resource_name = 'mailtoken' #resource_name = 'mailtrigger'
filtering = { filtering = {
"slug": ALL, "slug": ALL,
"desc": ALL, "desc": ALL,
"to": ALL_WITH_RELATIONS, "to": ALL_WITH_RELATIONS,
"cc": ALL_WITH_RELATIONS, "cc": ALL_WITH_RELATIONS,
} }
api.mailtoken.register(MailTokenResource()) api.mailtrigger.register(MailTriggerResource())

View file

@ -8,26 +8,26 @@ class EventMailTests(TestCase):
def setUp(self): def setUp(self):
make_test_data() make_test_data()
def test_show_tokens(self): def test_show_triggers(self):
url = urlreverse('ietf.mailtoken.views.show_tokens') url = urlreverse('ietf.mailtrigger.views.show_triggers')
r = self.client.get(url) r = self.client.get(url)
self.assertEqual(r.status_code, 200) self.assertEqual(r.status_code, 200)
self.assertTrue('ballot_saved' in r.content) self.assertTrue('ballot_saved' in r.content)
url = urlreverse('ietf.mailtoken.views.show_tokens',kwargs=dict(mailtoken_slug='ballot_saved')) url = urlreverse('ietf.mailtrigger.views.show_triggers',kwargs=dict(mailtrigger_slug='ballot_saved'))
r = self.client.get(url) r = self.client.get(url)
self.assertEqual(r.status_code, 200) self.assertEqual(r.status_code, 200)
self.assertTrue('ballot_saved' in r.content) self.assertTrue('ballot_saved' in r.content)
def test_show_recipients(self): def test_show_recipients(self):
url = urlreverse('ietf.mailtoken.views.show_recipients') url = urlreverse('ietf.mailtrigger.views.show_recipients')
r = self.client.get(url) r = self.client.get(url)
self.assertEqual(r.status_code, 200) self.assertEqual(r.status_code, 200)
self.assertTrue('doc_group_mail_list' in r.content) self.assertTrue('doc_group_mail_list' in r.content)
url = urlreverse('ietf.mailtoken.views.show_recipients',kwargs=dict(recipient_slug='doc_group_mail_list')) url = urlreverse('ietf.mailtrigger.views.show_recipients',kwargs=dict(recipient_slug='doc_group_mail_list'))
r = self.client.get(url) r = self.client.get(url)
self.assertEqual(r.status_code, 200) self.assertEqual(r.status_code, 200)
self.assertTrue('doc_group_mail_list' in r.content) self.assertTrue('doc_group_mail_list' in r.content)

11
ietf/mailtrigger/urls.py Normal file
View file

@ -0,0 +1,11 @@
from django.conf.urls import patterns, url
from django.views.generic import RedirectView
from django.core.urlresolvers import reverse_lazy
urlpatterns = patterns('ietf.mailtrigger.views',
url(r'^$', RedirectView.as_view(url=reverse_lazy('mailtrigger_show_triggers'), permanent=True)),
url(r'^name/$', 'show_triggers', name='mailtrigger_show_triggers' ),
url(r'^name/(?P<mailtrigger_slug>[-\w]+)/$', 'show_triggers' ),
url(r'^recipient/$', 'show_recipients' ),
url(r'^recipient/(?P<recipient_slug>[-\w]+)/$', 'show_recipients' ),
)

View file

@ -1,5 +1,5 @@
from collections import namedtuple from collections import namedtuple
from ietf.mailtoken.models import MailToken, Recipient from ietf.mailtrigger.models import MailTrigger, Recipient
from ietf.submit.models import Submission from ietf.submit.models import Submission
class AddrLists(namedtuple('AddrLists',['to','cc'])): class AddrLists(namedtuple('AddrLists',['to','cc'])):
@ -15,15 +15,15 @@ class AddrLists(namedtuple('AddrLists',['to','cc'])):
return namedtuple('AddrListsAsStrings',['to','cc'])(to=to_string,cc=cc_string) return namedtuple('AddrListsAsStrings',['to','cc'])(to=to_string,cc=cc_string)
def gather_address_lists(slug, **kwargs): def gather_address_lists(slug, **kwargs):
mailtoken = MailToken.objects.get(slug=slug) mailtrigger = MailTrigger.objects.get(slug=slug)
to = set() to = set()
for recipient in mailtoken.to.all(): for recipient in mailtrigger.to.all():
to.update(recipient.gather(**kwargs)) to.update(recipient.gather(**kwargs))
to.discard('') to.discard('')
cc = set() cc = set()
for recipient in mailtoken.cc.all(): for recipient in mailtrigger.cc.all():
cc.update(recipient.gather(**kwargs)) cc.update(recipient.gather(**kwargs))
cc.discard('') cc.discard('')
@ -32,7 +32,7 @@ def gather_address_lists(slug, **kwargs):
def gather_relevant_expansions(**kwargs): def gather_relevant_expansions(**kwargs):
def starts_with(prefix): def starts_with(prefix):
return MailToken.objects.filter(slug__startswith=prefix).values_list('slug',flat=True) return MailTrigger.objects.filter(slug__startswith=prefix).values_list('slug',flat=True)
relevant = set() relevant = set()
@ -74,10 +74,10 @@ def gather_relevant_expansions(**kwargs):
relevant.update(starts_with('sub_')) relevant.update(starts_with('sub_'))
rule_list = [] rule_list = []
for mailtoken in MailToken.objects.filter(slug__in=relevant): for mailtrigger in MailTrigger.objects.filter(slug__in=relevant):
addrs = gather_address_lists(mailtoken.slug,**kwargs) addrs = gather_address_lists(mailtrigger.slug,**kwargs)
if addrs.to or addrs.cc: if addrs.to or addrs.cc:
rule_list.append((mailtoken.slug,mailtoken.desc,addrs.to,addrs.cc)) rule_list.append((mailtrigger.slug,mailtrigger.desc,addrs.to,addrs.cc))
return sorted(rule_list) return sorted(rule_list)
def get_base_ipr_request_address(): def get_base_ipr_request_address():

View file

@ -4,15 +4,15 @@ from inspect import getsourcelines
from django.shortcuts import render, get_object_or_404 from django.shortcuts import render, get_object_or_404
from ietf.mailtoken.models import MailToken, Recipient from ietf.mailtrigger.models import MailTrigger, Recipient
def show_tokens(request, mailtoken_slug=None): def show_triggers(request, mailtrigger_slug=None):
mailtokens = MailToken.objects.all() mailtriggers = MailTrigger.objects.all()
if mailtoken_slug: if mailtrigger_slug:
get_object_or_404(MailToken,slug=mailtoken_slug) get_object_or_404(MailTrigger,slug=mailtrigger_slug)
mailtokens = mailtokens.filter(slug=mailtoken_slug) mailtriggers = mailtriggers.filter(slug=mailtrigger_slug)
return render(request,'mailtoken/token.html',{'mailtoken_slug':mailtoken_slug, return render(request,'mailtrigger/trigger.html',{'mailtrigger_slug':mailtrigger_slug,
'mailtokens':mailtokens}) 'mailtriggers':mailtriggers})
def show_recipients(request, recipient_slug=None): def show_recipients(request, recipient_slug=None):
recipients = Recipient.objects.all() recipients = Recipient.objects.all()
if recipient_slug: if recipient_slug:
@ -22,5 +22,5 @@ def show_recipients(request, recipient_slug=None):
fname = 'gather_%s'%recipient.slug fname = 'gather_%s'%recipient.slug
if hasattr(recipient,fname): if hasattr(recipient,fname):
recipient.code = ''.join(getsourcelines(getattr(recipient,fname))[0]) recipient.code = ''.join(getsourcelines(getattr(recipient,fname))[0])
return render(request,'mailtoken/recipient.html',{'recipient_slug':recipient_slug, return render(request,'mailtrigger/recipient.html',{'recipient_slug':recipient_slug,
'recipients':recipients}) 'recipients':recipients})

File diff suppressed because it is too large Load diff

View file

@ -41,9 +41,9 @@ objects += ietf.doc.models.StateType.objects.all()
objects += ietf.doc.models.State.objects.all() objects += ietf.doc.models.State.objects.all()
objects += ietf.doc.models.BallotType.objects.all() objects += ietf.doc.models.BallotType.objects.all()
import ietf.mailtoken.models import ietf.mailtrigger.models
objects += ietf.mailtoken.models.Recipient.objects.all() objects += ietf.mailtrigger.models.Recipient.objects.all()
objects += ietf.mailtoken.models.MailToken.objects.all() objects += ietf.mailtrigger.models.MailTrigger.objects.all()
output("names", objects) output("names", objects)

View file

@ -20,7 +20,7 @@ from ietf.person.models import Email
from ietf.person.fields import SearchableEmailField from ietf.person.fields import SearchableEmailField
from ietf.utils.fields import MultiEmailField from ietf.utils.fields import MultiEmailField
from ietf.utils.mail import send_mail from ietf.utils.mail import send_mail
from ietf.mailtoken.utils import gather_address_lists from ietf.mailtrigger.utils import gather_address_lists
ROLODEX_URL = getattr(settings, 'ROLODEX_URL', None) ROLODEX_URL = getattr(settings, 'ROLODEX_URL', None)

View file

@ -18,7 +18,7 @@ from django.utils.encoding import smart_str
from ietf.dbtemplate.models import DBTemplate from ietf.dbtemplate.models import DBTemplate
from ietf.person.models import Email, Person from ietf.person.models import Email, Person
from ietf.mailtoken.utils import gather_address_lists from ietf.mailtrigger.utils import gather_address_lists
from ietf.utils.pipe import pipe from ietf.utils.pipe import pipe
from ietf.utils import unaccent from ietf.utils import unaccent
from ietf.utils.mail import send_mail_text, send_mail from ietf.utils.mail import send_mail_text, send_mail

View file

@ -26,7 +26,7 @@ from ietf.secr.proceedings.views import build_choices, handle_upload_file, make_
from ietf.secr.sreq.forms import GroupSelectForm from ietf.secr.sreq.forms import GroupSelectForm
from ietf.secr.sreq.views import get_initial_session from ietf.secr.sreq.views import get_initial_session
from ietf.secr.utils.meeting import get_session, get_timeslot from ietf.secr.utils.meeting import get_session, get_timeslot
from ietf.mailtoken.utils import gather_address_lists from ietf.mailtrigger.utils import gather_address_lists
# prep for agenda changes # prep for agenda changes

View file

@ -16,7 +16,7 @@ from ietf.secr.utils.decorators import check_permissions
from ietf.secr.utils.group import groups_by_session from ietf.secr.utils.group import groups_by_session
from ietf.utils.mail import send_mail from ietf.utils.mail import send_mail
from ietf.person.models import Person from ietf.person.models import Person
from ietf.mailtoken.utils import gather_address_lists from ietf.mailtrigger.utils import gather_address_lists
# ------------------------------------------------- # -------------------------------------------------
# Globals # Globals

View file

@ -219,7 +219,7 @@ INSTALLED_APPS = (
'ietf.ipr', 'ietf.ipr',
'ietf.liaisons', 'ietf.liaisons',
'ietf.mailinglists', 'ietf.mailinglists',
'ietf.mailtoken', 'ietf.mailtrigger',
'ietf.meeting', 'ietf.meeting',
'ietf.message', 'ietf.message',
'ietf.name', 'ietf.name',

View file

@ -8,7 +8,7 @@ from ietf.doc.models import Document
from ietf.person.models import Person from ietf.person.models import Person
from ietf.message.models import Message from ietf.message.models import Message
from ietf.utils.accesstoken import generate_access_token from ietf.utils.accesstoken import generate_access_token
from ietf.mailtoken.utils import gather_address_lists from ietf.mailtrigger.utils import gather_address_lists
def send_submission_confirmation(request, submission): def send_submission_confirmation(request, submission):
subject = 'Confirm submission of I-D %s' % submission.name subject = 'Confirm submission of I-D %s' % submission.name

View file

@ -23,7 +23,7 @@ from ietf.submit.utils import check_idnits, found_idnits, validate_submission, c
from ietf.submit.utils import post_submission, cancel_submission, rename_submission_files from ietf.submit.utils import post_submission, cancel_submission, rename_submission_files
from ietf.utils.accesstoken import generate_random_key, generate_access_token from ietf.utils.accesstoken import generate_random_key, generate_access_token
from ietf.utils.draft import Draft from ietf.utils.draft import Draft
from ietf.mailtoken.utils import gather_address_lists from ietf.mailtrigger.utils import gather_address_lists
def upload_submission(request): def upload_submission(request):

View file

@ -30,16 +30,16 @@
<table class="table table-condensed table-striped ietf"> <table class="table table-condensed table-striped ietf">
<thead> <thead>
<tr> <tr>
<th>MailToken</th> <th>Mail Trigger</th>
<th>To</th> <th>To</th>
<th>Cc</th> <th>Cc</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for token,desc,to,cc in expansions %} {% for trigger,desc,to,cc in expansions %}
<tr> <tr>
<td><a href="{% url 'ietf.mailtoken.views.show_tokens' token %}" <td><a href="{% url 'ietf.mailtrigger.views.show_triggers' trigger %}"
title="{{desc}}">{{token}}</a></td> title="{{desc}}">{{trigger}}</a></td>
<td> {{to|join:', '}}</td> <td> {{to|join:', '}}</td>
<td> {{cc|join:', '}}</td> <td> {{cc|join:', '}}</td>
</tr> </tr>

View file

@ -27,16 +27,16 @@
<table class="table table-condensed table-striped ietf"> <table class="table table-condensed table-striped ietf">
<thead> <thead>
<tr> <tr>
<th>MailToken</th> <th>Mail Trigger</th>
<th>To</th> <th>To</th>
<th>Cc</th> <th>Cc</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for token,desc,to,cc in expansions %} {% for trigger,desc,to,cc in expansions %}
<tr> <tr>
<td><a href="{% url 'ietf.mailtoken.views.show_tokens' token %}" <td><a href="{% url 'ietf.mailtrigger.views.show_triggers' trigger %}"
title="{{desc}}">{{token}}</a></td> title="{{desc}}">{{trigger}}</a></td>
<td> {{to|join:', '}}</td> <td> {{to|join:', '}}</td>
<td> {{cc|join:', '}}</td> <td> {{cc|join:', '}}</td>
</tr> </tr>

View file

@ -13,7 +13,7 @@
<thead> <thead>
<tr> <tr>
<th>Recipient</th> <th>Recipient</th>
<th>Tokens</th> <th>Triggers</th>
<th>Template</th> <th>Template</th>
<th>Code</th> <th>Code</th>
</tr> </tr>
@ -23,11 +23,11 @@
<tr> <tr>
<td><span title="{{recipient.desc}}">{{recipient.slug}}</span></td> <td><span title="{{recipient.desc}}">{{recipient.slug}}</span></td>
<td> <td>
{% for mailtoken in recipient.used_in_to.all %} {% for mailtrigger in recipient.used_in_to.all %}
<a href="{% url 'ietf.mailtoken.views.show_tokens' mailtoken.slug %}" title="{{mailtoken.desc}}">{{mailtoken.slug}}</a>{% if not forloop.last %}, {%endif%} <a href="{% url 'ietf.mailtrigger.views.show_triggers' mailtrigger.slug %}" title="{{mailtrigger.desc}}">{{mailtrigger.slug}}</a>{% if not forloop.last %}, {%endif%}
{% endfor %}{% if recipient.used_in_to.exists and recipient.used_in_cc.exists %},{% endif %} {% endfor %}{% if recipient.used_in_to.exists and recipient.used_in_cc.exists %},{% endif %}
{% for mailtoken in recipient.used_in_cc.all %} {% for mailtrigger in recipient.used_in_cc.all %}
<a href="{% url 'ietf.mailtoken.views.show_tokens' mailtoken.slug %}" title="{{mailtoken.desc}}">{{mailtoken.slug}}</a>{% if not forloop.last %}, {%endif%} <a href="{% url 'ietf.mailtrigger.views.show_triggers' mailtrigger.slug %}" title="{{mailtrigger.desc}}">{{mailtrigger.slug}}</a>{% if not forloop.last %}, {%endif%}
{% endfor %} {% endfor %}
</td> </td>
<td>{{recipient.template}}</td> <td>{{recipient.template}}</td>

View file

@ -2,34 +2,34 @@
{# Copyright The IETF Trust 2015, All Rights Reserved #} {# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %} {% load origin %}
{% block title %}Mail Tokens{% endblock %} {% block title %}Mail Triggers{% endblock %}
{% block content %} {% block content %}
{% origin %} {% origin %}
<h1>Mail Tokens</h1> <h1>Mail Triggers</h1>
<table class="table table-condensed table-striped"> <table class="table table-condensed table-striped">
<thead> <thead>
<tr> <tr>
<th>Token</th> <th>Trigger</th>
<th>Recipients</th> <th>Recipients</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for mailtoken in mailtokens %} {% for mailtrigger in mailtriggers %}
<tr> <tr>
<td><span title="{{mailtoken.desc}}">{{mailtoken.slug}}</span></td> <td><span title="{{mailtrigger.desc}}">{{mailtrigger.slug}}</span></td>
<td>To: <td>To:
{% for recipient in mailtoken.to.all %} {% for recipient in mailtrigger.to.all %}
{% comment %}<span title="{{recipient.desc}}">{{recipient.slug}}</span>{% endcomment %} {% comment %}<span title="{{recipient.desc}}">{{recipient.slug}}</span>{% endcomment %}
<a href="{% url 'ietf.mailtoken.views.show_recipients' recipient.slug %}" title="{{recipient.desc}}">{{recipient.slug}}</a>{% if not forloop.last %}, {% endif %} <a href="{% url 'ietf.mailtrigger.views.show_recipients' recipient.slug %}" title="{{recipient.desc}}">{{recipient.slug}}</a>{% if not forloop.last %}, {% endif %}
{% endfor %} {% endfor %}
{% if mailtoken.cc.exists %} {% if mailtrigger.cc.exists %}
<br/>Cc: <br/>Cc:
{% for recipient in mailtoken.cc.all %} {% for recipient in mailtrigger.cc.all %}
{% comment %}<span title="{{recipient.desc}}">{{recipient.slug}}</span>{% endcomment %} {% comment %}<span title="{{recipient.desc}}">{{recipient.slug}}</span>{% endcomment %}
<a href="{% url 'ietf.mailtoken.views.show_recipients' recipient.slug %}" title="{{recipient.desc}}">{{recipient.slug}}</a>{% if not forloop.last %}, {% endif %} <a href="{% url 'ietf.mailtrigger.views.show_recipients' recipient.slug %}" title="{{recipient.desc}}">{{recipient.slug}}</a>{% if not forloop.last %}, {% endif %}
{% endfor %} {% endfor %}
{% endif %} {% endif %}
</td> </td>

View file

@ -35,7 +35,7 @@ urlpatterns = patterns('',
(r'^accounts/settings/', include('ietf.cookies.urls')), (r'^accounts/settings/', include('ietf.cookies.urls')),
(r'^doc/', include('ietf.doc.urls')), (r'^doc/', include('ietf.doc.urls')),
(r'^drafts/', include('ietf.doc.redirect_drafts_urls')), (r'^drafts/', include('ietf.doc.redirect_drafts_urls')),
(r'^mailtoken/',include('ietf.mailtoken.urls')), (r'^mailtrigger/',include('ietf.mailtrigger.urls')),
(r'^feed/', include('ietf.feed_urls')), (r'^feed/', include('ietf.feed_urls')),
(r'^group/', include('ietf.group.urls')), (r'^group/', include('ietf.group.urls')),
(r'^help/', include('ietf.help.urls')), (r'^help/', include('ietf.help.urls')),