diff --git a/ietf/doc/forms.py b/ietf/doc/forms.py index 372c43ab0..53a8d3b07 100644 --- a/ietf/doc/forms.py +++ b/ietf/doc/forms.py @@ -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) \ No newline at end of file + return ExtResourceName.objects.all().order_by('slug').values_list('slug', flat=True) diff --git a/ietf/doc/migrations/0048_send_notices.py b/ietf/doc/migrations/0048_send_notices.py new file mode 100644 index 000000000..f2c6959d8 --- /dev/null +++ b/ietf/doc/migrations/0048_send_notices.py @@ -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), + ), + ] diff --git a/ietf/doc/models.py b/ietf/doc/models.py index 2ad6a0729..670ed9139 100644 --- a/ietf/doc/models.py +++ b/ietf/doc/models.py @@ -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) diff --git a/ietf/doc/tests_charter.py b/ietf/doc/tests_charter.py index c420fdd0a..f65cf14e0 100644 --- a/ietf/doc/tests_charter.py +++ b/ietf/doc/tests_charter.py @@ -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) \ No newline at end of file + self.assertTrue('A new IETF WG has been proposed' in e1.text) diff --git a/ietf/doc/tests_conflict_review.py b/ietf/doc/tests_conflict_review.py index 4cc501ec0..6fa1a4d9b 100644 --- a/ietf/doc/tests_conflict_review.py +++ b/ietf/doc/tests_conflict_review.py @@ -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" ' @@ -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') diff --git a/ietf/doc/tests_draft.py b/ietf/doc/tests_draft.py index a2522b270..c038b27b2 100644 --- a/ietf/doc/tests_draft.py +++ b/ietf/doc/tests_draft.py @@ -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)) diff --git a/ietf/doc/tests_status_change.py b/ietf/doc/tests_status_change.py index cd8f859dd..571d9ed1d 100644 --- a/ietf/doc/tests_status_change.py +++ b/ietf/doc/tests_status_change.py @@ -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" ' @@ -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') diff --git a/ietf/doc/views_conflict_review.py b/ietf/doc/views_conflict_review.py index e42c13872..5efd62dbe 100644 --- a/ietf/doc/views_conflict_review.py +++ b/ietf/doc/views_conflict_review.py @@ -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, }, - ) \ No newline at end of file + ) diff --git a/ietf/doc/views_draft.py b/ietf/doc/views_draft.py index ee5eb9c86..63cdbe9ea 100644 --- a/ietf/doc/views_draft.py +++ b/ietf/doc/views_draft.py @@ -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) diff --git a/ietf/doc/views_status_change.py b/ietf/doc/views_status_change.py index d4868215a..99f82d435 100644 --- a/ietf/doc/views_status_change.py +++ b/ietf/doc/views_status_change.py @@ -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]