From 89f4bd21f5d1bdf8847475d1ca108790fcc88eec Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Wed, 6 Feb 2019 17:03:27 +0100 Subject: [PATCH] Allow static files as materials Each session can now have static files as materials. Expected usage: - Homework assignments (in PDF) - Slides for presentations - Homework feedback These are the use cases for: https://github.com/pyvec/naucse.python.cz/issues/432 --- naucse_render/course.py | 26 +++++++++++-- .../expected-dumps/courses/content-test.yaml | 35 ++++++++++++++++++ .../courses/content-test/info.yml | 19 ++++++++++ .../courses/content-test/static/report.txt | 1 + .../courses/content-test/static/slides.html | 9 +++++ .../courses/content-test/static/smile.png | Bin 0 -> 213 bytes test_naucse_render/test_integration.py | 1 + 7 files changed, 87 insertions(+), 4 deletions(-) create mode 100644 test_naucse_render/fixtures/expected-dumps/courses/content-test.yaml create mode 100644 test_naucse_render/fixtures/test_content/courses/content-test/info.yml create mode 100644 test_naucse_render/fixtures/test_content/courses/content-test/static/report.txt create mode 100644 test_naucse_render/fixtures/test_content/courses/content-test/static/slides.html create mode 100644 test_naucse_render/fixtures/test_content/courses/content-test/static/smile.png diff --git a/naucse_render/course.py b/naucse_render/course.py index d638360..68838a5 100644 --- a/naucse_render/course.py +++ b/naucse_render/course.py @@ -13,6 +13,7 @@ from .load import read_yaml from .markdown import convert_markdown +from .lesson import get_static_files def encode_to_json(value): @@ -22,10 +23,10 @@ def encode_to_json(value): return {k: encode_to_json(v) for k, v in value.items()} elif isinstance(value, (list, tuple)): return [encode_to_json(v) for v in value] - elif isinstance(value, (str, int, bool, type(None))): - return value elif isinstance(value, Markup): return str(value) + elif isinstance(value, (str, int, bool, type(None))): + return value raise TypeError(value) @@ -101,7 +102,8 @@ def get_course(course_slug: str, *, path='.', version=None): # Update all materials for material in session.get('materials', []): - update_material(material, vars=info.get('vars'), path=base_path) + update_material( + session, material, vars=info.get('vars'), path=base_path) # Convert Markdown in "description" to HTML if 'description' in session: @@ -126,7 +128,7 @@ def get_course(course_slug: str, *, path='.', version=None): } -def update_material(material, vars=None, *, path): +def update_material(session, material, vars=None, *, path): """Update material entry: mainly, add computed fields""" # All materials should have a "type", as used for the icon in lists lesson_slug = material.pop('lesson', None) @@ -136,6 +138,8 @@ def update_material(material, vars=None, *, path): if material.pop('url', None): pass # XXX: raise ValueError(f'Material {material} has URL') + if material.pop('static', None): + raise ValueError(f'Material {material} has a static file') material.setdefault('type', 'lesson') if 'title' not in material: # Set title based on the referenced lesson @@ -144,10 +148,24 @@ def update_material(material, vars=None, *, path): else: # External link (or link-less entry) url = material.pop('url', None) + static = material.pop('static', None) if url: material['external_url'] = url # XXX: Probably a bug; this should be just 'link' material.setdefault('type', 'none-link') + if static: + raise ValueError('`url` and `static_file` are exclusive') + elif static: + session_path = path.joinpath(session['source_file']).parent + filename = session_path / 'static' / static + if filename.exists(): + material['static_file'] = { + 'path': str(filename.relative_to(path)), + } + else: + raise FileNotFound(filename) + material.setdefault('slug', static) + material.setdefault('type', 'special') else: material.setdefault('type', 'special') diff --git a/test_naucse_render/fixtures/expected-dumps/courses/content-test.yaml b/test_naucse_render/fixtures/expected-dumps/courses/content-test.yaml new file mode 100644 index 0000000..e97557b --- /dev/null +++ b/test_naucse_render/fixtures/expected-dumps/courses/content-test.yaml @@ -0,0 +1,35 @@ +api_version: +- 0 +- 0 +course: + sessions: + - materials: + - external_url: https://nauc.se + title: A URL + type: none-link + - title: A note + type: special + slug: apecial + source_file: courses/content-test/info.yml + title: Special materials + - materials: + - slug: report.txt + static_file: + path: courses/content-test/static/report.txt + title: A static text file + type: special + - slug: slides.html + static_file: + path: courses/content-test/static/slides.html + title: A static HTML page + type: special + - slug: smile.png + static_file: + path: courses/content-test/static/smile.png + title: A static image + type: special + slug: static + source_file: courses/content-test/info.yml + title: Static file materials + source_file: courses/content-test/info.yml + title: A course for testing content diff --git a/test_naucse_render/fixtures/test_content/courses/content-test/info.yml b/test_naucse_render/fixtures/test_content/courses/content-test/info.yml new file mode 100644 index 0000000..f5da41a --- /dev/null +++ b/test_naucse_render/fixtures/test_content/courses/content-test/info.yml @@ -0,0 +1,19 @@ +title: A course for testing content + +sessions: +- title: Special materials + slug: apecial + materials: + - title: A URL + url: https://nauc.se + - title: A note + url: null +- title: Static file materials + slug: static + materials: + - title: A static text file + static: report.txt + - title: A static HTML page + static: slides.html + - title: A static image + static: smile.png diff --git a/test_naucse_render/fixtures/test_content/courses/content-test/static/report.txt b/test_naucse_render/fixtures/test_content/courses/content-test/static/report.txt new file mode 100644 index 0000000..4b3d5be --- /dev/null +++ b/test_naucse_render/fixtures/test_content/courses/content-test/static/report.txt @@ -0,0 +1 @@ +All OK! diff --git a/test_naucse_render/fixtures/test_content/courses/content-test/static/slides.html b/test_naucse_render/fixtures/test_content/courses/content-test/static/slides.html new file mode 100644 index 0000000..3e50732 --- /dev/null +++ b/test_naucse_render/fixtures/test_content/courses/content-test/static/slides.html @@ -0,0 +1,9 @@ + + + Slides + + +
A
+
B
+ + diff --git a/test_naucse_render/fixtures/test_content/courses/content-test/static/smile.png b/test_naucse_render/fixtures/test_content/courses/content-test/static/smile.png new file mode 100644 index 0000000000000000000000000000000000000000..215e2168f6ac2012646395914d175f5d05fa3082 GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4^3?%3Nf7cA+1o(uw0%;)l|DR#qeT8@+i?Jlg zFPOpM*^M+1C&}C0g`tC0)&t1lEbxddW?;}$24TjErS@e&LG}_)Usv|WOlwc6x=<11Hv2m#DR(wJY5_^IIbrr@Fpfq th&p*-!q!ubin%kH=bY;)V(4am$~Y&Iqb6*Y%_pE*22WQ%mvv4FO#qw=Ie-8F literal 0 HcmV?d00001 diff --git a/test_naucse_render/test_integration.py b/test_naucse_render/test_integration.py index 4aaafc7..0e52d7a 100644 --- a/test_naucse_render/test_integration.py +++ b/test_naucse_render/test_integration.py @@ -9,6 +9,7 @@ 'slug', [ 'courses/normal-course', + 'courses/content-test', '2000/run-without-times', '2000/run-with-times', 'lessons',