Skip to content

Commit 49c2fa8

Browse files
committed
Add configuration and mechanisms to allow meeting materials to be served via a CDN. Fixes ietf-tools#2935. Commit ready for merge.
- Legacy-Id: 18131
1 parent c6f55a3 commit 49c2fa8

3 files changed

Lines changed: 59 additions & 24 deletions

File tree

ietf/meeting/tests_views.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,18 @@ def test_agenda_week_view(self):
293293
self.assertEqual(r.status_code,200)
294294
self.assertTrue(all([x in unicontent(r) for x in ['var all_items', 'maximize', 'draw_calendar', ]]))
295295

296+
@override_settings(SERVE_MEETING_MATERIALS_LOCALLY=False)
297+
def test_materials_through_cdn(self):
298+
meeting = make_meeting_test_data()
299+
session = Session.objects.filter(meeting=meeting, group__acronym="mars").first()
300+
self.write_materials_files(meeting, session)
301+
for document in (session.agenda(),session.minutes(),session.slides()[0]):
302+
url = urlreverse("ietf.meeting.views.materials_document",
303+
kwargs=dict(num=meeting.number, document=document))
304+
r = self.client.get(url)
305+
self.assertEqual(r.status_code,302)
306+
self.assertEqual(r['Location'],document.get_href())
307+
296308
def test_materials(self):
297309
meeting = make_meeting_test_data()
298310
session = Session.objects.filter(meeting=meeting, group__acronym="mars").first()
@@ -307,6 +319,7 @@ def test_interim_materials(self):
307319

308320
self.do_test_materials(meeting, session)
309321

322+
@override_settings(SERVE_MEETING_MATERIALS_LOCALLY=True)
310323
def do_test_materials(self, meeting, session):
311324

312325
self.write_materials_files(meeting, session)
@@ -2523,6 +2536,7 @@ def test_upload_minutes_agenda_unscheduled(self):
25232536
r = self.client.post(url,dict(file=test_file,apply_to_all=False))
25242537
self.assertEqual(r.status_code, 410)
25252538

2539+
@override_settings(SERVE_MEETING_MATERIALS_LOCALLY=True)
25262540
def test_upload_minutes_agenda_interim(self):
25272541
session=SessionFactory(meeting__type_id='interim')
25282542
for doctype in ('minutes','agenda'):

ietf/meeting/views.py

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -220,29 +220,33 @@ def materials_document(request, document, num=None, ext=None):
220220
_, basename = os.path.split(filename)
221221
if not os.path.exists(filename):
222222
raise Http404("File not found: %s" % filename)
223-
with io.open(filename, 'rb') as file:
224-
bytes = file.read()
225-
226-
mtype, chset = get_mime_type(bytes)
227-
content_type = "%s; charset=%s" % (mtype, chset)
228-
229-
file_ext = os.path.splitext(filename)
230-
if len(file_ext) == 2 and file_ext[1] == '.md' and mtype == 'text/plain':
231-
sorted_accept = sort_accept_tuple(request.META.get('HTTP_ACCEPT'))
232-
for atype in sorted_accept:
233-
if atype[0] == 'text/markdown':
234-
content_type = content_type.replace('plain', 'markdown', 1)
235-
break;
236-
elif atype[0] == 'text/html':
237-
bytes = "<html>\n<head></head>\n<body>\n%s\n</body>\n</html>\n" % markdown2.markdown(bytes)
238-
content_type = content_type.replace('plain', 'html', 1)
239-
break;
240-
elif atype[0] == 'text/plain':
241-
break;
242-
243-
response = HttpResponse(bytes, content_type=content_type)
244-
response['Content-Disposition'] = 'inline; filename="%s"' % basename
245-
return response
223+
224+
if settings.SERVE_MEETING_MATERIALS_LOCALLY :
225+
with io.open(filename, 'rb') as file:
226+
bytes = file.read()
227+
228+
mtype, chset = get_mime_type(bytes)
229+
content_type = "%s; charset=%s" % (mtype, chset)
230+
231+
file_ext = os.path.splitext(filename)
232+
if len(file_ext) == 2 and file_ext[1] == '.md' and mtype == 'text/plain':
233+
sorted_accept = sort_accept_tuple(request.META.get('HTTP_ACCEPT'))
234+
for atype in sorted_accept:
235+
if atype[0] == 'text/markdown':
236+
content_type = content_type.replace('plain', 'markdown', 1)
237+
break;
238+
elif atype[0] == 'text/html':
239+
bytes = "<html>\n<head></head>\n<body>\n%s\n</body>\n</html>\n" % markdown2.markdown(bytes)
240+
content_type = content_type.replace('plain', 'html', 1)
241+
break;
242+
elif atype[0] == 'text/plain':
243+
break;
244+
245+
response = HttpResponse(bytes, content_type=content_type)
246+
response['Content-Disposition'] = 'inline; filename="%s"' % basename
247+
return response
248+
else:
249+
return HttpResponseRedirect(redirect_to=doc.get_href())
246250

247251
@login_required
248252
def materials_editable_groups(request, num=None):

ietf/settings.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -687,14 +687,30 @@ def skip_unreadable_post(record):
687687
"liai-att": "%s{doc.uploaded_filename}" % LIAISON_ATTACH_URL,
688688
}
689689

690-
MEETING_DOC_HREFS = {
690+
SERVE_MEETING_MATERIALS_LOCALLY = False
691+
692+
# If you override SERVE_MEETING_MATERIALS_LOCALLY in your settings_local.conf, you will need to
693+
# set the right value for MEETING_DOC_HREFS there as well. LOCAL_MEETING_DOC_HREFS and
694+
# CDN_MEETING_DOC_HREFS are defined here to make that simpler.
695+
696+
LOCAL_MEETING_DOC_HREFS = {
691697
"agenda": "/meeting/{meeting.number}/materials/{doc.name}-{doc.rev}",
692698
"minutes": "/meeting/{meeting.number}/materials/{doc.name}-{doc.rev}",
693699
"slides": "/meeting/{meeting.number}/materials/{doc.name}-{doc.rev}",
694700
"recording": "{doc.external_url}",
695701
"bluesheets": "https://www.ietf.org/proceedings/{meeting.number}/bluesheets/{doc.uploaded_filename}",
696702
}
697703

704+
CDN_MEETING_DOC_HREFS = {
705+
"agenda": "https://www.ietf.org/proceedings/{meeting.number}/agenda/{doc.name}-{doc.rev}",
706+
"minutes": "https://www.ietf.org/proceedings/{meeting.number}/minutes/{doc.name}-{doc.rev}",
707+
"slides": "https://www.ietf.org/proceedings/{meeting.number}/slides/{doc.name}-{doc.rev}",
708+
"recording": "{doc.external_url}",
709+
"bluesheets": "https://www.ietf.org/proceedings/{meeting.number}/bluesheets/{doc.uploaded_filename}",
710+
}
711+
712+
MEETING_DOC_HREFS = LOCAL_MEETING_DOC_HREFS if SERVE_MEETING_MATERIALS_LOCALLY else CDN_MEETING_DOC_HREFS
713+
698714
MEETING_DOC_OLD_HREFS = {
699715
"agenda": "/meeting/{meeting.number}/materials/{doc.name}",
700716
"minutes": "/meeting/{meeting.number}/materials/{doc.name}",
@@ -712,6 +728,7 @@ def skip_unreadable_post(record):
712728
"bluesheets": "https://www.ietf.org/proceedings/{meeting.number}/bluesheets/{doc.uploaded_filename}",
713729
}
714730

731+
715732
# Valid MIME types for cases where text is uploaded and immediately extracted,
716733
# e.g. a charter or a review. Must be a tuple, not a list.
717734
DOC_TEXT_FILE_VALID_UPLOAD_MIME_TYPES = ('text/plain', 'text/markdown', 'text/x-rst')

0 commit comments

Comments
 (0)