Skip to content

Commit 3619d3b

Browse files
fix: handle invalid fields properly in proc material upload form (ietf-tools#3784)
1 parent eab4705 commit 3619d3b

2 files changed

Lines changed: 58 additions & 2 deletions

File tree

ietf/meeting/tests_views.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from urllib.parse import urlparse, urlsplit, quote
2121
from PIL import Image
2222
from pathlib import Path
23+
from tempfile import NamedTemporaryFile
2324

2425
from django.urls import reverse as urlreverse
2526
from django.conf import settings
@@ -7609,6 +7610,35 @@ def test_add_proceedings_material_doc(self):
76097610
)
76107611
self.assertEqual(mat.get_href(), f'{mat.document.name}:00')
76117612

7613+
def test_add_proceedings_material_doc_invalid_ext(self):
7614+
"""Upload proceedings materials document with disallowed extension"""
7615+
meeting = self._procmat_test_meeting()
7616+
self.client.login(username='secretary', password='secretary+password')
7617+
with NamedTemporaryFile('w+', suffix='.png') as invalid_file:
7618+
invalid_file.write('this is not a PDF file!!')
7619+
for mat_type in ProceedingsMaterialTypeName.objects.filter(used=True):
7620+
url = urlreverse(
7621+
'ietf.meeting.views_proceedings.upload_material',
7622+
kwargs=dict(num=meeting.number, material_type=mat_type.slug),
7623+
)
7624+
invalid_file.seek(0) # read the file contents again
7625+
r = self.client.post(url, {'file': invalid_file, 'external_url': ''})
7626+
self.assertEqual(r.status_code, 200)
7627+
self.assertFormError(r, 'form', 'file', 'Found an unexpected extension: .png. Expected one of .pdf')
7628+
7629+
def test_add_proceedings_material_doc_empty(self):
7630+
"""Upload proceedings materials document without specifying a file"""
7631+
meeting = self._procmat_test_meeting()
7632+
self.client.login(username='secretary', password='secretary+password')
7633+
for mat_type in ProceedingsMaterialTypeName.objects.filter(used=True):
7634+
url = urlreverse(
7635+
'ietf.meeting.views_proceedings.upload_material',
7636+
kwargs=dict(num=meeting.number, material_type=mat_type.slug),
7637+
)
7638+
r = self.client.post(url, {'external_url': ''})
7639+
self.assertEqual(r.status_code, 200)
7640+
self.assertFormError(r, 'form', 'file', 'This field is required')
7641+
76127642
def test_add_proceedings_material_url(self):
76137643
"""Add a URL as proceedings material"""
76147644
meeting = self._procmat_test_meeting()
@@ -7620,6 +7650,32 @@ def test_add_proceedings_material_url(self):
76207650
)
76217651
self.assertEqual(mat.get_href(), 'https://example.com')
76227652

7653+
def test_add_proceedings_material_url_invalid(self):
7654+
"""Add proceedings materials URL with a non-URL value"""
7655+
meeting = self._procmat_test_meeting()
7656+
self.client.login(username='secretary', password='secretary+password')
7657+
for mat_type in ProceedingsMaterialTypeName.objects.filter(used=True):
7658+
url = urlreverse(
7659+
'ietf.meeting.views_proceedings.upload_material',
7660+
kwargs=dict(num=meeting.number, material_type=mat_type.slug),
7661+
)
7662+
r = self.client.post(url, {'use_url': 'on', 'external_url': "Ceci n'est pas une URL"})
7663+
self.assertEqual(r.status_code, 200)
7664+
self.assertFormError(r, 'form', 'external_url', 'Enter a valid URL.')
7665+
7666+
def test_add_proceedings_material_url_empty(self):
7667+
"""Add proceedings materials URL without specifying the URL"""
7668+
meeting = self._procmat_test_meeting()
7669+
self.client.login(username='secretary', password='secretary+password')
7670+
for mat_type in ProceedingsMaterialTypeName.objects.filter(used=True):
7671+
url = urlreverse(
7672+
'ietf.meeting.views_proceedings.upload_material',
7673+
kwargs=dict(num=meeting.number, material_type=mat_type.slug),
7674+
)
7675+
r = self.client.post(url, {'use_url': 'on', 'external_url': ''})
7676+
self.assertEqual(r.status_code, 200)
7677+
self.assertFormError(r, 'form', 'external_url', 'This field is required')
7678+
76237679
@override_settings(MEETING_DOC_HREFS={'procmaterials': '{doc.name}:{doc.rev}'})
76247680
def test_replace_proceedings_material(self):
76257681
"""Replace uploaded document with new uploaded document"""

ietf/meeting/views_proceedings.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,11 @@ def clean_file(self):
5050

5151
def clean(self):
5252
if self.cleaned_data['use_url']:
53-
if not self.cleaned_data['external_url']:
53+
if not self.data.get('external_url', None):
5454
self.add_error('external_url', 'This field is required')
5555
else:
5656
self.cleaned_data['external_url'] = None # make sure this is empty
57-
if self.cleaned_data['file'] is None:
57+
if self.files.get('file', None) is None:
5858
self.add_error('file', 'This field is required')
5959

6060
class EditProceedingsMaterialForm(forms.Form):

0 commit comments

Comments
 (0)