fix: Allow more email addresses in notification lists (#4792)
* fix: Allow more email addresses in notification lists Fixes #4736 * Do what @rjsparks suggested * Number migration * Number migration * Fix tests and apply for all doc types
This commit is contained in:
parent
7991dadc5e
commit
f870715a80
|
@ -75,7 +75,13 @@ class AdForm(forms.Form):
|
|||
self.fields['ad'].choices = list(choices) + [("", "-------"), (ad_pk, Person.objects.get(pk=ad_pk).plain_name())]
|
||||
|
||||
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)
|
||||
notify = forms.CharField(
|
||||
widget=forms.Textarea,
|
||||
max_length=1023,
|
||||
help_text="List of email addresses to receive state notifications, separated by comma.",
|
||||
label="Notification list",
|
||||
required=False,
|
||||
)
|
||||
|
||||
def clean_notify(self):
|
||||
addrspecs = [x.strip() for x in self.cleaned_data["notify"].split(',')]
|
||||
|
@ -223,4 +229,4 @@ class ExtResourceForm(forms.Form):
|
|||
|
||||
@staticmethod
|
||||
def valid_resource_tags():
|
||||
return ExtResourceName.objects.all().order_by('slug').values_list('slug', flat=True)
|
||||
return ExtResourceName.objects.all().order_by('slug').values_list('slug', flat=True)
|
||||
|
|
23
ietf/doc/migrations/0048_send_notices.py
Normal file
23
ietf/doc/migrations/0048_send_notices.py
Normal file
|
@ -0,0 +1,23 @@
|
|||
# Generated by Django 2.2.28 on 2022-12-05 17:53
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('doc', '0047_tzaware_deletedevents'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='dochistory',
|
||||
name='notify',
|
||||
field=models.TextField(blank=True, max_length=1023),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='document',
|
||||
name='notify',
|
||||
field=models.TextField(blank=True, max_length=1023),
|
||||
),
|
||||
]
|
|
@ -111,7 +111,7 @@ class DocumentInfo(models.Model):
|
|||
ad = ForeignKey(Person, verbose_name="area director", related_name='ad_%(class)s_set', blank=True, null=True)
|
||||
shepherd = ForeignKey(Email, related_name='shepherd_%(class)s_set', blank=True, null=True)
|
||||
expires = models.DateTimeField(blank=True, null=True)
|
||||
notify = models.CharField(max_length=255, blank=True)
|
||||
notify = models.TextField(max_length=1023, blank=True)
|
||||
external_url = models.URLField(blank=True)
|
||||
uploaded_filename = models.TextField(blank=True)
|
||||
note = models.TextField(blank=True)
|
||||
|
|
|
@ -448,8 +448,8 @@ class EditCharterTests(TestCase):
|
|||
# Regenerate does not save!
|
||||
self.assertEqual(charter.notify,newlist)
|
||||
q = PyQuery(r.content)
|
||||
formlist = q('form input[name=notify]')[0].value
|
||||
self.assertEqual(formlist, None)
|
||||
formlist = q('form textarea[name=notify]')[0].value.strip()
|
||||
self.assertEqual(formlist, "")
|
||||
|
||||
def test_edit_ad(self):
|
||||
|
||||
|
@ -840,4 +840,4 @@ class EditCharterTests(TestCase):
|
|||
ad_role = RoleFactory(group__type_id='area',name_id='ad')
|
||||
charter = CharterFactory(group__type_id='wg',group__state_id='bof',group__parent=ad_role.group)
|
||||
e1,_ = default_review_text(charter.group, charter, Person.objects.get(name="(System)"))
|
||||
self.assertTrue('A new IETF WG has been proposed' in e1.text)
|
||||
self.assertTrue('A new IETF WG has been proposed' in e1.text)
|
||||
|
|
|
@ -105,7 +105,7 @@ class ConflictReviewTests(TestCase):
|
|||
r = self.client.get(url)
|
||||
self.assertEqual(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertEqual(len(q('form input[name=notify]')),1)
|
||||
self.assertEqual(len(q('form textarea[name=notify]')), 1)
|
||||
self.assertEqual(len(q('form select[name=ad]')),0)
|
||||
|
||||
# successfully starts a review, and notifies the secretariat
|
||||
|
@ -179,8 +179,8 @@ class ConflictReviewTests(TestCase):
|
|||
r = self.client.get(url)
|
||||
self.assertEqual(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertEqual(len(q('form input[name=notify]')),1)
|
||||
self.assertEqual(doc.notify,q('form input[name=notify]')[0].value)
|
||||
self.assertEqual(len(q('form textarea[name=notify]')), 1)
|
||||
self.assertEqual(doc.notify, q('form textarea[name=notify]')[0].value.strip())
|
||||
|
||||
# change notice list
|
||||
newlist = '"Foo Bar" <foo@bar.baz.com>'
|
||||
|
@ -197,7 +197,7 @@ class ConflictReviewTests(TestCase):
|
|||
# Regenerate does not save!
|
||||
self.assertEqual(doc.notify,newlist)
|
||||
q = PyQuery(r.content)
|
||||
self.assertEqual(None,q('form input[name=notify]')[0].value)
|
||||
self.assertEqual("", q('form textarea[name=notify]')[0].value.strip())
|
||||
|
||||
def test_edit_ad(self):
|
||||
doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission')
|
||||
|
|
|
@ -456,7 +456,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.assertEqual(None,q('form input[name=notify]')[0].value)
|
||||
self.assertEqual("", q('form textarea[name=notify]')[0].value.strip())
|
||||
|
||||
# add
|
||||
events_before = draft.docevent_set.count()
|
||||
|
@ -947,7 +947,7 @@ class IndividualInfoFormsTests(TestCase):
|
|||
r = self.client.get(url)
|
||||
self.assertEqual(r.status_code,200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertEqual(len(q('form input[name=notify]')),1)
|
||||
self.assertEqual(len(q('form textarea[name=notify]')), 1)
|
||||
|
||||
# Provide a list
|
||||
r = self.client.post(url,dict(notify="TJ2APh2P@ietf.org",save_addresses="1"))
|
||||
|
@ -962,7 +962,7 @@ class IndividualInfoFormsTests(TestCase):
|
|||
# Regenerate does not save!
|
||||
self.assertEqual(doc.notify,'TJ2APh2P@ietf.org')
|
||||
q = PyQuery(r.content)
|
||||
self.assertEqual(None,q('form input[name=notify]')[0].value)
|
||||
self.assertEqual("", q('form textarea[name=notify]')[0].value.strip())
|
||||
|
||||
def test_doc_change_intended_status(self):
|
||||
url = urlreverse('ietf.doc.views_draft.change_intention', kwargs=dict(name=self.docname))
|
||||
|
|
|
@ -147,8 +147,8 @@ class StatusChangeTests(TestCase):
|
|||
r = self.client.get(url)
|
||||
self.assertEqual(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertEqual(len(q('form input[name=notify]')),1)
|
||||
self.assertEqual(doc.notify,q('form input[name=notify]')[0].value)
|
||||
self.assertEqual(len(q('form textarea[name=notify]')), 1)
|
||||
self.assertEqual(doc.notify, q('form textarea[name=notify]')[0].value.strip())
|
||||
|
||||
# change notice list
|
||||
newlist = '"Foo Bar" <foo@bar.baz.com>'
|
||||
|
@ -169,8 +169,8 @@ class StatusChangeTests(TestCase):
|
|||
# Regenerate does not save!
|
||||
self.assertEqual(doc.notify,newlist)
|
||||
q = PyQuery(r.content)
|
||||
formlist = q('form input[name=notify]')[0].value
|
||||
self.assertEqual(None,formlist)
|
||||
formlist = q('form textarea[name=notify]')[0].value.strip()
|
||||
self.assertEqual("", formlist)
|
||||
|
||||
def test_edit_title(self):
|
||||
doc = Document.objects.get(name='status-change-imaginary-mid-review')
|
||||
|
|
|
@ -370,13 +370,25 @@ def approve_conflict_review(request, name):
|
|||
))
|
||||
|
||||
class SimpleStartReviewForm(forms.Form):
|
||||
notify = forms.CharField(max_length=255, label="Notice emails", help_text="Separate email addresses with commas.", required=False)
|
||||
notify = forms.CharField(
|
||||
widget=forms.Textarea,
|
||||
max_length=1023,
|
||||
label="Notice emails",
|
||||
help_text="Separate email addresses with commas.",
|
||||
required=False,
|
||||
)
|
||||
|
||||
class StartReviewForm(forms.Form):
|
||||
ad = forms.ModelChoiceField(Person.objects.filter(role__name="ad", role__group__state="active",role__group__type='area').order_by('name'),
|
||||
label="Shepherding AD", empty_label="(None)", required=True)
|
||||
create_in_state = forms.ModelChoiceField(State.objects.filter(used=True, type="conflrev", slug__in=("needshep", "adrev")), empty_label=None, required=False)
|
||||
notify = forms.CharField(max_length=255, label="Notice emails", help_text="Separate email addresses with commas.", required=False)
|
||||
notify = forms.CharField(
|
||||
widget=forms.Textarea,
|
||||
max_length=1023,
|
||||
label="Notice emails",
|
||||
help_text="Separate email addresses with commas.",
|
||||
required=False,
|
||||
)
|
||||
telechat_date = forms.TypedChoiceField(coerce=lambda x: datetime.datetime.strptime(x, '%Y-%m-%d').date(), empty_value=None, required=False, widget=forms.Select(attrs={'onchange':'make_bold()'}))
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
|
@ -523,4 +535,4 @@ def start_review_as_stream_owner(request, name):
|
|||
{'form': form,
|
||||
'doc_to_review': doc_to_review,
|
||||
},
|
||||
)
|
||||
)
|
||||
|
|
|
@ -515,7 +515,13 @@ class EditInfoForm(forms.Form):
|
|||
area = forms.ModelChoiceField(Group.objects.filter(type="area", state="active"), empty_label="(None - individual submission)", required=False, label="Assigned to area")
|
||||
ad = forms.ModelChoiceField(Person.objects.filter(role__name="ad", role__group__state="active",role__group__type='area').order_by('name'), label="Responsible AD", empty_label="(None)", required=True)
|
||||
create_in_state = forms.ModelChoiceField(State.objects.filter(used=True, type="draft-iesg", slug__in=("pub-req", "watching")), empty_label=None, required=False)
|
||||
notify = forms.CharField(max_length=255, label="Notice emails", help_text="Separate email addresses with commas.", required=False)
|
||||
notify = forms.CharField(
|
||||
widget=forms.Textarea,
|
||||
max_length=1023,
|
||||
label="Notice emails",
|
||||
help_text="Separate email addresses with commas.",
|
||||
required=False,
|
||||
)
|
||||
note = forms.CharField(widget=forms.Textarea, label="IESG note", required=False, strip=False)
|
||||
telechat_date = forms.TypedChoiceField(coerce=lambda x: datetime.datetime.strptime(x, '%Y-%m-%d').date(), empty_value=None, required=False, widget=forms.Select(attrs={'onchange':'make_bold()'}))
|
||||
returning_item = forms.BooleanField(required=False)
|
||||
|
|
|
@ -468,7 +468,13 @@ class StartStatusChangeForm(forms.Form):
|
|||
ad = forms.ModelChoiceField(Person.objects.filter(role__name="ad", role__group__state="active",role__group__type='area').order_by('name'),
|
||||
label="Shepherding AD", empty_label="(None)", required=False)
|
||||
create_in_state = forms.ModelChoiceField(State.objects.filter(type="statchg", slug__in=("needshep", "adrev")), empty_label=None, required=False)
|
||||
notify = forms.CharField(max_length=255, label="Notice emails", help_text="Separate email addresses with commas.", required=False)
|
||||
notify = forms.CharField(
|
||||
widget=forms.Textarea,
|
||||
max_length=1023,
|
||||
label="Notice emails",
|
||||
help_text="Separate email addresses with commas.",
|
||||
required=False,
|
||||
)
|
||||
telechat_date = forms.TypedChoiceField(coerce=lambda x: datetime.datetime.strptime(x, '%Y-%m-%d').date(), empty_value=None, required=False, widget=forms.Select(attrs={'onchange':'make_bold()'}))
|
||||
relations={} # type: Dict[str, str]
|
||||
|
||||
|
|
Loading…
Reference in a new issue