diff --git a/ietf/doc/tests_bofreq.py b/ietf/doc/tests_bofreq.py index 05a966944..375b4d5ee 100644 --- a/ietf/doc/tests_bofreq.py +++ b/ietf/doc/tests_bofreq.py @@ -8,7 +8,7 @@ from pathlib import Path from pyquery import PyQuery from random import randint from tempfile import NamedTemporaryFile -from html import escape +from html import escape, unescape from django.conf import settings from django.urls import reverse as urlreverse @@ -191,7 +191,7 @@ This test section has some text. self.client.login(username=username,password=username+'+password') r = self.client.get(url) self.assertEqual(r.status_code,200) - unescaped = unicontent(r).encode('utf-8').decode('unicode-escape') + unescaped = unescape(unicontent(r).encode('utf-8').decode('unicode-escape')) for editor in previous_editors: self.assertIn(editor.name,unescaped) new_editors = set(previous_editors) @@ -231,9 +231,9 @@ This test section has some text. self.client.login(username=username,password=username+'+password') r = self.client.get(url) self.assertEqual(r.status_code,200) - unescaped = unicontent(r).encode('utf-8').decode('unicode-escape') + unescaped = unescape(unicontent(r).encode('utf-8').decode('unicode-escape')) for responsible in previous_responsible: - self.assertIn(escape(responsible.name), unescaped) + self.assertIn(responsible.name, unescaped) new_responsible = set(previous_responsible) new_responsible.add(RoleFactory(group__type_id='area',name_id='ad').person) postdict = dict(responsible=[str(p.pk) for p in new_responsible]) diff --git a/ietf/liaisons/admin.py b/ietf/liaisons/admin.py index bedb1d69f..c7cb7a4da 100644 --- a/ietf/liaisons/admin.py +++ b/ietf/liaisons/admin.py @@ -29,7 +29,7 @@ class LiaisonStatementAdmin(admin.ModelAdmin): inlines = [ RelatedLiaisonStatementInline, LiaisonStatementAttachmentInline ] def related_to(self, obj): - return '
'.join(['%s' % (reverse('admin:liaisons_liaisonstatement_change', None, (i.target.id, )), str(i.target)) for i in obj.source_of_set.select_related('target').all()]) + return '
'.join(['%s' % (reverse('admin:liaisons_liaisonstatement_change', None, (i.target.id, )), str(i.target)) for i in obj.source_of_set.select_related('target').all()]) related_to.allow_tags = True # type: ignore # https://github.com/python/mypy/issues/2087 class LiaisonStatementAttachmentAdmin(admin.ModelAdmin): @@ -50,4 +50,4 @@ class LiaisonStatementEventAdmin(admin.ModelAdmin): raw_id_fields = ["statement", "by"] admin.site.register(LiaisonStatement, LiaisonStatementAdmin) -admin.site.register(LiaisonStatementEvent, LiaisonStatementEventAdmin) +admin.site.register(LiaisonStatementEvent, LiaisonStatementEventAdmin) \ No newline at end of file diff --git a/ietf/liaisons/forms.py b/ietf/liaisons/forms.py index f72becd78..b4aaa386c 100644 --- a/ietf/liaisons/forms.py +++ b/ietf/liaisons/forms.py @@ -211,13 +211,13 @@ class CustomModelMultipleChoiceField(forms.ModelMultipleChoiceField): class LiaisonModelForm(BetterModelForm): '''Specify fields which require a custom widget or that are not part of the model. - NOTE: from_groups and to_groups are marked as not required because select2 has - a problem with validating ''' from_groups = forms.ModelMultipleChoiceField(queryset=Group.objects.all(),label='Groups',required=False) + from_groups.widget.attrs["class"] = "select2-field" from_contact = forms.EmailField() # type: Union[forms.EmailField, SearchableEmailField] to_contacts = forms.CharField(label="Contacts", widget=forms.Textarea(attrs={'rows':'3', }), strip=False) to_groups = forms.ModelMultipleChoiceField(queryset=Group.objects,label='Groups',required=False) + to_groups.widget.attrs["class"] = "select2-field" deadline = DatepickerDateField(date_format="yyyy-mm-dd", picker_settings={"autoclose": "1" }, label='Deadline', required=True) related_to = SearchableLiaisonStatementsField(label='Related Liaison Statement', required=False) submitted_date = DatepickerDateField(date_format="yyyy-mm-dd", picker_settings={"autoclose": "1" }, label='Submission date', required=True, initial=datetime.date.today()) @@ -247,8 +247,8 @@ class LiaisonModelForm(BetterModelForm): self.person = get_person_for_user(user) self.is_new = not self.instance.pk - self.fields["from_groups"].widget.attrs["placeholder"] = "Type in name to search for group" - self.fields["to_groups"].widget.attrs["placeholder"] = "Type in name to search for group" + self.fields["from_groups"].widget.attrs["data-placeholder"] = "Type in name to search for group" + self.fields["to_groups"].widget.attrs["data-placeholder"] = "Type in name to search for group" self.fields["to_contacts"].label = 'Contacts' self.fields["other_identifiers"].widget.attrs["rows"] = 2 @@ -449,7 +449,7 @@ class IncomingLiaisonForm(LiaisonModelForm): else: queryset = Group.objects.filter(type="sdo", state="active", role__person=self.person, role__name__in=("liaiman", "auth")).distinct().order_by('name') self.fields['from_contact'].initial = self.person.role_set.filter(group=queryset[0]).first().email.address - self.fields['from_contact'].widget.attrs['readonly'] = True + self.fields['from_contact'].widget.attrs['disabled'] = True self.fields['from_groups'].queryset = queryset self.fields['from_groups'].widget.submitter = str(self.person) @@ -504,7 +504,7 @@ class OutgoingLiaisonForm(LiaisonModelForm): else: email = self.person.email_address() self.fields['from_contact'].initial = email - self.fields['from_contact'].widget.attrs['readonly'] = True + self.fields['from_contact'].widget.attrs['disabled'] = True def set_to_fields(self): '''Set to_groups and to_contacts options and initial value based on user @@ -551,7 +551,7 @@ class EditLiaisonForm(LiaisonModelForm): queryset = Group.objects.filter(type="sdo").order_by('name') else: queryset = Group.objects.filter(type="sdo", role__person=self.person, role__name__in=("liaiman", "auth")).distinct().order_by('name') - self.fields['from_contact'].widget.attrs['readonly'] = True + self.fields['from_contact'].widget.attrs['disabled'] = True self.fields['from_groups'].queryset = queryset def set_to_fields(self): @@ -571,5 +571,4 @@ class EditLiaisonForm(LiaisonModelForm): class EditAttachmentForm(forms.Form): - title = forms.CharField(max_length=255) - + title = forms.CharField(max_length=255) \ No newline at end of file diff --git a/ietf/liaisons/widgets.py b/ietf/liaisons/widgets.py index fe0f15e36..db27c3780 100644 --- a/ietf/liaisons/widgets.py +++ b/ietf/liaisons/widgets.py @@ -25,7 +25,7 @@ class ButtonWidget(Widget): html += '' % conditional_escape(i) required_str = 'Please fill in %s to attach a new file' % conditional_escape(self.required_label) html += '' % conditional_escape(required_str) - html += '' % conditional_escape(self.label) + html += '' % conditional_escape(self.label) return mark_safe(html) @@ -39,8 +39,8 @@ class ShowAttachmentsWidget(Widget): html += '%s ' % (conditional_escape(attachment.document.get_href()), conditional_escape(attachment.document.title)) html += 'Edit '.format(urlreverse("ietf.liaisons.views.liaison_edit_attachment", kwargs={'object_id':attachment.statement.pk,'doc_id':attachment.document.pk})) html += 'Delete '.format(urlreverse("ietf.liaisons.views.liaison_delete_attachment", kwargs={'object_id':attachment.statement.pk,'attach_id':attachment.pk})) - html += '
' + html += '
' else: html += 'No files attached' html += '' - return mark_safe(html) + return mark_safe(html) \ No newline at end of file diff --git a/ietf/meeting/tests_views.py b/ietf/meeting/tests_views.py index 289c20a60..047f374d4 100644 --- a/ietf/meeting/tests_views.py +++ b/ietf/meeting/tests_views.py @@ -3941,7 +3941,7 @@ class EditScheduleListTests(TestCase): self.assertTrue(r.status_code, 200) q = PyQuery(r.content) - self.assertEqual(len(q(".schedule-diffs tr")), 3) + self.assertEqual(len(q(".schedule-diffs tr")), 3+1) def test_delete_schedule(self): url = urlreverse('ietf.meeting.views.delete_schedule', @@ -5758,14 +5758,14 @@ class MaterialsTests(TestCase): r = self.client.get(session_overview_url) self.assertEqual(r.status_code,200) q = PyQuery(r.content) - self.assertFalse(q('#uploadslides')) - self.assertFalse(q('#proposeslides')) + self.assertFalse(q('.uploadslides')) + self.assertFalse(q('.proposeslides')) self.client.login(username=newperson.user.username,password=newperson.user.username+"+password") r = self.client.get(session_overview_url) self.assertEqual(r.status_code,200) q = PyQuery(r.content) - self.assertTrue(q('#proposeslides')) + self.assertTrue(q('.proposeslides')) self.client.logout() login_testing_unauthorized(self,newperson.user.username,propose_url) @@ -5783,7 +5783,7 @@ class MaterialsTests(TestCase): r = self.client.get(session_overview_url) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) - self.assertEqual(len(q('#proposedslidelist p')), 1) + self.assertEqual(len(q('.proposedslidelist p')), 1) SlideSubmissionFactory(session = session) @@ -5792,7 +5792,7 @@ class MaterialsTests(TestCase): r = self.client.get(session_overview_url) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) - self.assertEqual(len(q('#proposedslidelist p')), 2) + self.assertEqual(len(q('.proposedslidelist p')), 2) self.client.logout() def test_disapprove_proposed_slides(self): diff --git a/ietf/person/tests.py b/ietf/person/tests.py index 7054bb676..bd754194d 100644 --- a/ietf/person/tests.py +++ b/ietf/person/tests.py @@ -92,7 +92,7 @@ class PersonTests(TestCase): #debug.show('person.photo_name()') self.assertContains(r, person.photo_name(), status_code=200) q = PyQuery(r.content) - self.assertIn("Photo of %s"%person, q("div.bio-text img").attr("alt")) + self.assertIn("Photo of %s"%person.name, q("div.bio-text img").attr("alt")) bio_text = q("div.bio-text").text() self.assertIsNotNone(bio_text) diff --git a/ietf/secr/announcement/forms.py b/ietf/secr/announcement/forms.py index 92383631b..3aacbfe62 100644 --- a/ietf/secr/announcement/forms.py +++ b/ietf/secr/announcement/forms.py @@ -73,7 +73,7 @@ def get_to_choices(): class AnnounceForm(forms.ModelForm): nomcom = forms.ModelChoiceField(queryset=Group.objects.filter(acronym__startswith='nomcom',type='nomcom',state='active'),required=False) - to_custom = MultiEmailField(required=False,label='') + to_custom = MultiEmailField(required=False) class Meta: model = Message @@ -131,4 +131,4 @@ class AnnounceForm(forms.ModelForm): if nomcom: message.related_groups.add(nomcom) - return message + return message \ No newline at end of file diff --git a/ietf/secr/templates/base_site.html b/ietf/secr/templates/base_site.html index 2c258efe4..f75b41d06 100644 --- a/ietf/secr/templates/base_site.html +++ b/ietf/secr/templates/base_site.html @@ -24,9 +24,7 @@ {% block footer %} -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/ietf/secr/templates/base_site_bootstrap.html b/ietf/secr/templates/base_site_bootstrap.html index c8edb0124..d1ab1dfde 100644 --- a/ietf/secr/templates/base_site_bootstrap.html +++ b/ietf/secr/templates/base_site_bootstrap.html @@ -24,9 +24,7 @@ {% block footer %} -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/ietf/secr/templates/groups/people.html b/ietf/secr/templates/groups/people.html index 817a614d2..ebcc1aeeb 100644 --- a/ietf/secr/templates/groups/people.html +++ b/ietf/secr/templates/groups/people.html @@ -28,16 +28,18 @@ Action - - {% for role in group.role_set.all %} - - {{ role.name }} - {{ role.person }} - {{ role.email }} - Delete - - {% endfor %} - + {% if group.role_set.all %} + + {% for role in group.role_set.all %} + + {{ role.name }} + {{ role.person }} + {{ role.email }} + Delete + + {% endfor %} + + {% endif %} -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/ietf/secr/templates/groups/search.html b/ietf/secr/templates/groups/search.html index e5a8d9a70..a60455302 100644 --- a/ietf/secr/templates/groups/search.html +++ b/ietf/secr/templates/groups/search.html @@ -7,8 +7,6 @@ -{% endblock %}{% endblock %} - {% endblock %} {% block breadcrumbs %}{{ block.super }} diff --git a/ietf/secr/templates/groups/view.html b/ietf/secr/templates/groups/view.html index 40cbc80b0..a1c2e9ae3 100644 --- a/ietf/secr/templates/groups/view.html +++ b/ietf/secr/templates/groups/view.html @@ -63,38 +63,46 @@
@@ -111,4 +119,4 @@ -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/ietf/secr/templates/includes/meetings_footer.html b/ietf/secr/templates/includes/meetings_footer.html index 64ba3764b..9e9e98677 100755 --- a/ietf/secr/templates/includes/meetings_footer.html +++ b/ietf/secr/templates/includes/meetings_footer.html @@ -1 +1,3 @@ + \ No newline at end of file diff --git a/ietf/secr/templates/includes/search_results_table.html b/ietf/secr/templates/includes/search_results_table.html index 7ee860226..ba7dfd787 100644 --- a/ietf/secr/templates/includes/search_results_table.html +++ b/ietf/secr/templates/includes/search_results_table.html @@ -6,13 +6,15 @@ ID - - {% for item in results %} - - {{item.name}} - {{item.person.email_address}} - {{item.person.id}} - - {% endfor %} - - + {% if results %} + + {% for item in results %} + + {{item.name}} + {{item.person.email_address}} + {{item.person.id}} + + {% endfor %} + + {% endif %} + \ No newline at end of file diff --git a/ietf/secr/templates/includes/sessions_footer.html b/ietf/secr/templates/includes/sessions_footer.html index ab26d53a4..a41a8b8db 100755 --- a/ietf/secr/templates/includes/sessions_footer.html +++ b/ietf/secr/templates/includes/sessions_footer.html @@ -1,4 +1,6 @@ + \ No newline at end of file diff --git a/ietf/secr/templates/includes/upload_footer.html b/ietf/secr/templates/includes/upload_footer.html index 8a32f8820..d2faf02c9 100755 --- a/ietf/secr/templates/includes/upload_footer.html +++ b/ietf/secr/templates/includes/upload_footer.html @@ -1,4 +1,6 @@ + \ No newline at end of file diff --git a/ietf/secr/templates/proceedings/main.html b/ietf/secr/templates/proceedings/main.html index e95de3620..33c1971c9 100644 --- a/ietf/secr/templates/proceedings/main.html +++ b/ietf/secr/templates/proceedings/main.html @@ -22,15 +22,17 @@ IETF Meeting - - {% for meeting in meetings %} - - - {{ meeting.number }} - - - {% endfor %} - + {% if meetings %} + + {% for meeting in meetings %} + + + {{ meeting.number }} + + + {% endfor %} + + {% endif %} {% if user|has_role:"Secretariat" %}
@@ -49,15 +51,17 @@ Interim Meeting - - {% for meeting in interim_meetings %} + {% if interim_meetings %} + + {% for meeting in interim_meetings %} - - {{ meeting.group.acronym }} - {{ meeting.date }} - - {% endfor %} - + + {{ meeting.group.acronym }} + {{ meeting.date }} + + {% endfor %} + + {% endif %}
@@ -89,5 +93,4 @@ {% endblock %} ~ ~ -~ - +~ \ No newline at end of file diff --git a/ietf/secr/templates/proceedings/recording.html b/ietf/secr/templates/proceedings/recording.html index d6adc3801..943239710 100755 --- a/ietf/secr/templates/proceedings/recording.html +++ b/ietf/secr/templates/proceedings/recording.html @@ -56,32 +56,34 @@ Edit - + {% if sessions %} + - {% for session in sessions %} - {% if session.recordings %} - {% for recording in session.recordings %} + {% for session in sessions %} + {% if session.recordings %} + {% for recording in session.recordings %} + + {{ session.group.acronym }} + {{ session.official_timeslotassignment.timeslot.time|date:"m-d H:i" }} + {{ recording.name }} + {{ recording.get_href }} + Edit + + {% endfor %} + {% else %} {{ session.group.acronym }} {{ session.official_timeslotassignment.timeslot.time|date:"m-d H:i" }} - {{ recording.name }} - {{ recording.get_href }} - Edit + + + - {% endfor %} - {% else %} - - {{ session.group.acronym }} - {{ session.official_timeslotassignment.timeslot.time|date:"m-d H:i" }} - - - - - {% endif %} + {% endif %} - {% endfor %} + {% endfor %} - + + {% endif %}
@@ -94,13 +96,15 @@ Filename - - {% for file in unmatched_recordings %} - - {{ file }} - - {% endfor %} - + {% if unmatched_recordings %} + + {% for file in unmatched_recordings %} + + {{ file }} + + {% endfor %} + + {% endif %} {% endif %} @@ -112,4 +116,4 @@ {% block footer-extras %} {% include "includes/upload_footer.html" %} -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/ietf/secr/templates/roles/main.html b/ietf/secr/templates/roles/main.html index 84db0c85d..8033709e0 100755 --- a/ietf/secr/templates/roles/main.html +++ b/ietf/secr/templates/roles/main.html @@ -50,14 +50,11 @@
diff --git a/ietf/secr/templates/sreq/main.html b/ietf/secr/templates/sreq/main.html index 0244e9ab9..b62a751db 100755 --- a/ietf/secr/templates/sreq/main.html +++ b/ietf/secr/templates/sreq/main.html @@ -39,13 +39,14 @@ (Currently, this group does not plan to hold a session at IETF {{ meeting.number }}) {% endif %} + {% empty %} + NONE {% endfor %}
diff --git a/ietf/templates/api/index.html b/ietf/templates/api/index.html index 82accb076..760b9cef5 100644 --- a/ietf/templates/api/index.html +++ b/ietf/templates/api/index.html @@ -154,11 +154,11 @@ $ curl 'https://datatracker.ietf.org/api/v1/doc/document/?limit=0&name__cont available for all documents at the relative url doc.json, e.g., {% url 'ietf.doc.views_doc.document_json' name='draft-ietf-poised95-std-proc-3' %} - + . You can also specify an RFC: {% url 'ietf.doc.views_doc.document_json' name='rfc2026' %} - + . No API key is needed to access this.

diff --git a/ietf/templates/base.html b/ietf/templates/base.html index ba4887891..2623e4a27 100644 --- a/ietf/templates/base.html +++ b/ietf/templates/base.html @@ -7,16 +7,16 @@ {% load django_bootstrap5 %} - - + + {% block title %}No title{% endblock %} - + {% comment Halloween %} - + {% endcomment %} - +