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:
Lars Eggert 2022-12-08 23:46:35 +02:00 committed by GitHub
parent 7991dadc5e
commit f870715a80
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 75 additions and 22 deletions

View file

@ -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)

View 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),
),
]

View file

@ -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)

View file

@ -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)

View file

@ -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')

View file

@ -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))

View file

@ -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')

View file

@ -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,
},
)
)

View file

@ -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)

View file

@ -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]