' % (snippet, full))
return mark_safe(full)
@register.simple_tag
def doc_edit_button(url_name, *args, **kwargs):
"""Given URL name/args/kwargs, looks up the URL just like "url" tag and returns a properly formatted button for the document material tables."""
- return mark_safe('Edit' % (urlreverse(url_name, args=args, kwargs=kwargs)))
+ return mark_safe('Edit' % (urlreverse(url_name, args=args, kwargs=kwargs)))
@register.filter
def textify(text):
diff --git a/ietf/doc/tests.py b/ietf/doc/tests.py
index 56bc8a2c8..9fdc3f6b2 100644
--- a/ietf/doc/tests.py
+++ b/ietf/doc/tests.py
@@ -1595,7 +1595,7 @@ class DocTestCase(TestCase):
href = q(f'div.balloter-name a[href$="{author_slug}"]').attr('href')
ids = [
target.attr('id')
- for target in q(f'h5[id$="{author_slug}"]').items()
+ for target in q(f'p.h5[id$="{author_slug}"]').items()
]
self.assertEqual(len(ids), 1, 'Should be exactly one link for the balloter')
self.assertEqual(href, f'#{ids[0]}', 'Anchor href should match ID')
diff --git a/ietf/doc/tests_ballot.py b/ietf/doc/tests_ballot.py
index 3d15a307a..317e4e3a1 100644
--- a/ietf/doc/tests_ballot.py
+++ b/ietf/doc/tests_ballot.py
@@ -1196,9 +1196,9 @@ class BallotContentTests(TestCase):
)
def _assertBallotMessage(self, q, balloter, expected):
- heading = q(f'h5[id$="_{slugify(balloter.plain_name())}"]')
+ heading = q(f'p.h5[id$="_{slugify(balloter.plain_name())}"]')
self.assertEqual(len(heading), 1)
- # is followed by a panel with the message of interest, so use next()
+ # is followed by a panel with the message of interest, so use next()
self.assertEqual(
len(heading.next().find(
f'*[title="{expected}"]'
@@ -1379,4 +1379,4 @@ class BallotContentTests(TestCase):
q = PyQuery(content)
self._assertBallotMessage(q, balloters[0], 'No email send requests for this discuss')
self._assertBallotMessage(q, balloters[1], 'No ballot position send log available')
- self._assertBallotMessage(q, old_balloter, 'No ballot position send log available')
+ self._assertBallotMessage(q, old_balloter, 'No ballot position send log available')
\ No newline at end of file
diff --git a/ietf/doc/tests_draft.py b/ietf/doc/tests_draft.py
index 9a4e69383..be29535d8 100644
--- a/ietf/doc/tests_draft.py
+++ b/ietf/doc/tests_draft.py
@@ -106,7 +106,7 @@ class ChangeStateTests(TestCase):
self.assertEqual(len(q('form select[name=state]')), 1)
if next_states:
- self.assertEqual(len(q('[type=submit][value="%s"]' % next_states[0].name)), 1)
+ self.assertEqual(len(q('[type=submit]:contains("%s")' % next_states[0].name)), 1)
# faulty post
@@ -148,7 +148,7 @@ class ChangeStateTests(TestCase):
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
q = PyQuery(r.content)
- self.assertEqual(len(q('form [type=submit][value="%s"]' % first_state.name)), 1)
+ self.assertEqual(len(q('form [type=submit]:contains("%s")' % first_state.name)), 1)
def test_pull_from_rfc_queue(self):
ad = Person.objects.get(user__username="ad")
@@ -1383,7 +1383,7 @@ class SubmitToIesgTests(TestCase):
r = self.client.get(url)
self.assertEqual(r.status_code,200)
q = PyQuery(r.content)
- self.assertEqual(len(q('form input[name="confirm"]')),1)
+ self.assertEqual(len(q('form button[name="confirm"]')),1)
url = urlreverse('ietf.doc.views_draft.to_iesg', kwargs=dict(name=self.docname))
diff --git a/ietf/doc/tests_review.py b/ietf/doc/tests_review.py
index 44287a6ef..7e902514d 100644
--- a/ietf/doc/tests_review.py
+++ b/ietf/doc/tests_review.py
@@ -38,6 +38,7 @@ from ietf.utils.mail import outbox, empty_outbox, parseaddr, on_behalf_of, get_p
from ietf.utils.test_utils import login_testing_unauthorized, reload_db_objects
from ietf.utils.test_utils import TestCase
from ietf.utils.text import strip_prefix, xslugify
+from django.utils.html import escape
class ReviewTests(TestCase):
def setUp(self):
@@ -175,7 +176,7 @@ class ReviewTests(TestCase):
self.assertContains(r, review_req.team.name)
try:
# FIXME-LARS
- self.assertContains(r, author.name)
+ self.assertContains(r, escape(author.name))
except:
print(r.content)
self.assertContains(r, author.name)
diff --git a/ietf/doc/views_ballot.py b/ietf/doc/views_ballot.py
index 6841e07f5..828302e81 100644
--- a/ietf/doc/views_ballot.py
+++ b/ietf/doc/views_ballot.py
@@ -574,7 +574,7 @@ def lastcalltext(request, name):
e.save()
# make sure form has the updated text
- form = LastCallTextForm(initial=dict(last_call_text=e.text))
+ form = LastCallTextForm(initial=dict(last_call_text=escape(e.text)))
s = doc.get_state("draft-iesg")
@@ -813,7 +813,7 @@ def ballot_approvaltext(request, name):
e.save()
# make sure form has the updated text
- form = ApprovalTextForm(initial=dict(approval_text=e.text))
+ form = ApprovalTextForm(initial=dict(approval_text=escape(e.text)))
can_announce = doc.get_state("draft-iesg").order > 19
need_intended_status = ""
diff --git a/ietf/doc/views_charter.py b/ietf/doc/views_charter.py
index 29cfa7f8e..c2b88ac47 100644
--- a/ietf/doc/views_charter.py
+++ b/ietf/doc/views_charter.py
@@ -556,8 +556,8 @@ def review_announcement_text(request, name):
(existing, existing_new_work) = default_review_text(group, charter, by)
existing.save()
existing_new_work.save()
- form = ReviewAnnouncementTextForm(initial=dict(announcement_text=existing.text,
- new_work_text=existing_new_work.text))
+ form = ReviewAnnouncementTextForm(initial=dict(announcement_text=escape(existing.text),
+ new_work_text=escape(existing_new_work.text)))
if any(x in request.POST for x in ['send_annc_only','send_nw_only','send_both']) and form.is_valid():
if any(x in request.POST for x in ['send_annc_only','send_both']):
@@ -613,7 +613,7 @@ def action_announcement_text(request, name):
if "regenerate_text" in request.POST:
e = default_action_text(group, charter, by)
e.save()
- form = ActionAnnouncementTextForm(initial=dict(announcement_text=e.text))
+ form = ActionAnnouncementTextForm(initial=dict(announcement_text=escape(e.text)))
if "send_text" in request.POST and form.is_valid():
parsed_msg = send_mail_preformatted(request, form.cleaned_data['announcement_text'])
diff --git a/ietf/doc/views_status_change.py b/ietf/doc/views_status_change.py
index 2484d8645..e7679f66b 100644
--- a/ietf/doc/views_status_change.py
+++ b/ietf/doc/views_status_change.py
@@ -716,7 +716,7 @@ def last_call(request, name):
if "regenerate_last_call_text" in request.POST:
e = generate_last_call_text(request,status_change)
- form = LastCallTextForm(initial=dict(last_call_text=e.text))
+ form = LastCallTextForm(initial=dict(last_call_text=escape(e.text)))
return render(request, 'doc/status_change/last_call.html',
dict(doc=status_change,
diff --git a/ietf/group/tests_info.py b/ietf/group/tests_info.py
index 988956ca3..0cb9cfc62 100644
--- a/ietf/group/tests_info.py
+++ b/ietf/group/tests_info.py
@@ -1527,7 +1527,7 @@ class DatelessMilestoneTests(TestCase):
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
q = PyQuery(r.content)
- self.assertEqual(q('#switch-date-use-form button').attr('style'), 'display:none;')
+ self.assertTrue(q('#switch-date-use-form button').hasClass('d-none'))
ms.group.charter.rev='00-00'
ms.group.charter.save()
diff --git a/ietf/ietfauth/views.py b/ietf/ietfauth/views.py
index 6a087145b..892e3c646 100644
--- a/ietf/ietfauth/views.py
+++ b/ietf/ietfauth/views.py
@@ -744,17 +744,17 @@ def login(request, extra_context=None):
logout(request)
response = render(request, 'registration/missing_person.html')
if require_consent:
- messages.warning(request, mark_safe("""
+ messages.warning(request, mark_safe('''
You have personal information associated with your account which is not
derived from draft submissions or other ietf work, namely: %s. Please go
- to your account profile and review your
+ to your account profile and review your
personal information, then scoll to the bottom and check the 'confirm'
checkbox and submit the form, in order to to indicate that that the
provided personal information may be used and displayed within the IETF
datatracker.
- """ % ', '.join(require_consent)))
+ ''' % ', '.join(require_consent)))
return response
@login_required
@@ -816,4 +816,4 @@ def apikey_disable(request):
messages.error(request, "Key validation failed; key not disabled")
else:
form = KeyDeleteForm(request.GET)
- return render(request, 'form.html', {'form':form, 'title':"Disable a personal API key", 'description':'', 'button':'Disable key'})
\ No newline at end of file
+ return render(request, 'form.html', {'form':form, 'title':"Disable a personal API key", 'description':'', 'button':'Disable key'})
diff --git a/ietf/liaisons/tests.py b/ietf/liaisons/tests.py
index 7f98b8d75..4e4eaa136 100644
--- a/ietf/liaisons/tests.py
+++ b/ietf/liaisons/tests.py
@@ -317,7 +317,7 @@ class LiaisonManagementTests(TestCase):
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
q = PyQuery(r.content)
- self.assertEqual(len(q('form input[name=do_action_taken]')), 0)
+ self.assertEqual(len(q('form button[name=do_action_taken]')), 0)
# log in and get
self.client.login(username="secretary", password="secretary+password")
@@ -325,13 +325,13 @@ class LiaisonManagementTests(TestCase):
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
q = PyQuery(r.content)
- self.assertEqual(len(q('form input[name=do_action_taken]')), 1)
+ self.assertEqual(len(q('form button[name=do_action_taken]')), 1)
# mark action taken
r = self.client.post(url, dict(do_action_taken="1"))
self.assertEqual(r.status_code, 200)
q = PyQuery(r.content)
- self.assertEqual(len(q('form input[name=do_action_taken]')), 0)
+ self.assertEqual(len(q('form button[name=do_action_taken]')), 0)
liaison = LiaisonStatement.objects.get(id=liaison.id)
self.assertTrue(liaison.action_taken)
@@ -357,7 +357,7 @@ class LiaisonManagementTests(TestCase):
self.assertEqual(r.status_code, 200)
self.assertContains(r, liaison.title)
q = PyQuery(r.content)
- self.assertEqual(len(q('form input[name=approved]')), 0)
+ self.assertEqual(len(q('form button[name=approved]')), 0)
# check the detail page / authorized
self.client.login(username="ulm-liaiman", password="ulm-liaiman+password")
@@ -368,7 +368,7 @@ class LiaisonManagementTests(TestCase):
from ietf.liaisons.utils import can_edit_liaison
user = User.objects.get(username='ulm-liaiman')
self.assertTrue(can_edit_liaison(user, liaison))
- self.assertEqual(len(q('form input[name=approved]')), 1)
+ self.assertEqual(len(q('form button[name=approved]')), 1)
# approve
mailbox_before = len(outbox)
diff --git a/ietf/liaisons/widgets.py b/ietf/liaisons/widgets.py
index 1630f9574..d6e2fe936 100644
--- a/ietf/liaisons/widgets.py
+++ b/ietf/liaisons/widgets.py
@@ -18,21 +18,21 @@ class ButtonWidget(Widget):
super(ButtonWidget, self).__init__(*args, **kwargs)
def render(self, name, value, **kwargs):
- html = '%s' % conditional_escape(self.show_on)
- html += '%s' % conditional_escape(self.label)
+ html = '%s' % conditional_escape(self.show_on)
+ html += '%s' % conditional_escape(self.label)
if self.require:
for i in self.require:
- html += '%s' % conditional_escape(i)
+ html += '%s' % conditional_escape(i)
required_str = 'Please fill in %s to attach a new file' % conditional_escape(self.required_label)
- html += '%s' % conditional_escape(required_str)
- html += '' % conditional_escape(self.label)
+ html += '%s' % conditional_escape(required_str)
+ html += '' % conditional_escape(self.label)
return mark_safe(html)
class ShowAttachmentsWidget(Widget):
def render(self, name, value, **kwargs):
html = '
' % name
- html += 'No files attached'
+ html += 'No files attached'
html += '
'
if value and isinstance(value, QuerySet):
for attachment in value:
diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py
index 12b84dfaa..408b6a29c 100644
--- a/ietf/meeting/views.py
+++ b/ietf/meeting/views.py
@@ -3001,7 +3001,7 @@ def ajax_get_utc(request):
utc_day_offset = (naive_utc_dt.date() - dt.date()).days
html = "{utc} UTC".format(utc=utc)
if utc_day_offset != 0:
- html = html + " {0:+d} Day".format(utc_day_offset)
+ html = html + ' {0:+d} Day'.format(utc_day_offset)
context_data = {'timezone': timezone,
'time': time,
'utc': utc,
diff --git a/ietf/secr/sreq/forms.py b/ietf/secr/sreq/forms.py
index dab5225e2..ecad4ce7e 100644
--- a/ietf/secr/sreq/forms.py
+++ b/ietf/secr/sreq/forms.py
@@ -117,7 +117,7 @@ class SessionForm(forms.Form):
self._add_widget_class(constraint_field.widget, 'wg_constraint')
selector_field = forms.ChoiceField(choices=group_acronym_choices, required=False)
- selector_field.widget.attrs['data-slug'] = constraintname.slug # used by onChange handler
+ selector_field.widget.attrs['data-slug'] = constraintname.slug # used by onchange handler
self._add_widget_class(selector_field.widget, 'wg_constraint_selector')
cfield_id = 'constraint_{}'.format(constraintname.slug)
@@ -150,7 +150,7 @@ class SessionForm(forms.Form):
field_id)
)
- self.fields['joint_with_groups_selector'].widget.attrs['onChange'] = "document.form_post.joint_with_groups.value=document.form_post.joint_with_groups.value + ' ' + this.options[this.selectedIndex].value; return 1;"
+ self.fields['joint_with_groups_selector'].widget.attrs['onchange'] = "document.form_post.joint_with_groups.value=document.form_post.joint_with_groups.value + ' ' + this.options[this.selectedIndex].value; return 1;"
self.fields["resources"].choices = [(x.pk,x.desc) for x in ResourceAssociation.objects.filter(name__used=True).order_by('name__order') ]
if self.hidden:
diff --git a/ietf/secr/templates/announcement/confirm.html b/ietf/secr/templates/announcement/confirm.html
index 8682ebb81..7ad745a09 100644
--- a/ietf/secr/templates/announcement/confirm.html
+++ b/ietf/secr/templates/announcement/confirm.html
@@ -33,7 +33,7 @@ Subject: {{ message.subject }}