diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 211e35e9a35f6e4a6e4f9b2972da6cdabab1e5c6..462ff5a47e42248ed0102f29843e2b16c3bcb33e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -7,8 +7,6 @@ stages: execute_ipynbs: stage: execute - before_script: - - pip install notedown script: - export PYTHONPATH=$PYTHONPATH:${PWD}/code - export OPENBLAS_NUM_THREADS=1 OMP_NUM_THREADS=1 MKL_NUM_THREADS=1 MKL_DYNAMIC=FALSE @@ -47,7 +45,7 @@ mirror to github: edx archive: stage: build - script: ./scripts/converter.py --silent ./generated/with_output + script: ./scripts/converter.py ./generated/with_output artifacts: paths: - generated/import_to_edx.tar.gz diff --git a/code/edx_components.py b/code/edx_components.py index c4352a14adc84955a19ff434b075b7314d6b17e9..d01b67e93a624db113a4a2017dcbd821cfdc8641 100644 --- a/code/edx_components.py +++ b/code/edx_components.py @@ -1,20 +1,43 @@ import sys import os +import secrets + +from xml.etree.ElementTree import Element, SubElement +from xml.etree import ElementTree + from hashlib import md5 +from IPython import display +import feedparser + module_dir = os.path.dirname(__file__) sys.path.extend(module_dir) -from IPython import display -import feedparser -__all__ = ['MoocVideo', 'PreprintReference', 'MoocDiscussion', - 'MoocCheckboxesAssessment', 'MoocMultipleChoiceAssessment', - 'MoocPeerAssessment', 'MoocSelfAssessment'] +__all__ = [ + 'MoocVideo', 'PreprintReference', 'MoocDiscussion', + 'MoocCheckboxesAssessment', 'MoocMultipleChoiceAssessment', + 'MoocSelfAssessment' +] + + +def _add_solution(el, text): + """Add a solution xml to a problem.""" + sol = SubElement(el, 'solution') + div = SubElement(sol, 'div') + div.attrib['class'] = 'detailed-solution' + title = SubElement(div, 'p') + title.text = 'Explanation' + content = SubElement(div, 'p') + content.text = text + class MoocComponent: - def __repr__(self): - return '{0}(**{1})'.format(self.__class__.__name__, repr(self.param)) + def _repr_mimebundle_(self, include, exclude): + return { + 'application/vnd.edx.olxml+xml': + ElementTree.tostring(self.xml, encoding='unicode'), + } class MoocVideo(MoocComponent, display.YouTubeVideo): @@ -22,27 +45,34 @@ class MoocVideo(MoocComponent, display.YouTubeVideo): download_track='true', download_video='true', show_captions='true', **kwargs): """A video component of an EdX mooc embeddable in IPython notebook.""" - tmp = locals() - del tmp['kwargs'], tmp['self'], tmp['__class__'] - del tmp['id'], tmp['src_location'], tmp['res'] - kwargs.update(tmp) - kwargs['youtube_id_1_0'] = id - kwargs['youtube'] = "1.00:" + id - - # Add source if provided - loc = ("http://delftxdownloads.tudelft.nl/" - "TOPOCMx-QuantumKnots/TOPOCMx-{0}-video.{1}.mp4") + + self.xml = Element('video', attrib=dict( + youtube=f'1.00:{id}', + youtube_id_1_0=id, + display_name=display_name, + download_track=download_track, + download_video=download_video, + show_captions=show_captions, + **kwargs, + )) + if src_location is not None: - kwargs['source'] = loc.format(src_location, res) + self.xml.attrib['source'] = ( + "http://delftxdownloads.tudelft.nl/TOPOCMx-QuantumKnots/" + f"TOPOCMx-{src_location}-video.{res}.mp4" + ) - self.param = kwargs super().__init__(id, rel=0, cc_load_policy=1) def _repr_html_(self): orig = super()._repr_html_() - return ('
' - .format(orig.replace(' diff --git a/edx_skeleton/problem/.keep b/edx_skeleton/problem/.keep deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/edx_skeleton/sequential/.keep b/edx_skeleton/sequential/.keep deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/edx_skeleton/sequential/subsec_00_01.xml b/edx_skeleton/sequential/subsec_00_01.xml deleted file mode 100644 index 76754da1544b7b39ed5f2354de5a67f4787333ef..0000000000000000000000000000000000000000 --- a/edx_skeleton/sequential/subsec_00_01.xml +++ /dev/null @@ -1,3 +0,0 @@ -