Transition to mkwsref xblock (reference widget)
[mkwsxb-moved-to-github.git] / mkwsref / mkwsref / mkwsref.py
1 """Embed reference widget from MKWS, the MasterKey Widget Set"""
2
3 import pkg_resources
4 import random
5
6 from xblock.core import XBlock
7 from xblock.fields import Integer, Scope, String, Any, Boolean, Dict
8 from xblock.fragment import Fragment
9
10 class MKWSRef(XBlock):
11     """Embed reference widget from MKWS, the MasterKey Widget Set"""
12
13     # Fields
14     query = String(
15       help="Search query",
16       default="water",
17       scope=Scope.content
18     )
19     display_name = String(
20       default="MKWS Reference Widget",
21       scope=Scope.settings
22     )
23
24     def resource_string(self, path):
25         """Helper for accessing resources."""
26         data = pkg_resources.resource_string(__name__, path)
27         return data.decode("utf8")
28
29     def student_view(self, context=None):
30         """The primary view of the MKWS XBlock, shown to students when viewing courses."""
31         html = self.resource_string("static/html/student.html")
32         frag = Fragment(html.format(query=self.query, team=random.randint(0, 100000)))
33         # student.js uses require.js as it cannot guarantee mkws-complete.js has loaded 
34         # in studio without it. We'll need to add it if we're in the LMS:
35         frag.add_javascript_url("/static/js/vendor/require.js");
36         frag.add_javascript(self.resource_string("static/js/src/student.js"))
37         frag.initialize_js('MKWSRef')
38         return frag;
39
40     def author_view(self, context=None):
41         """View of the MKWS XBlock shown when authoring courses."""
42         html = self.resource_string("static/html/student.html")
43         frag = Fragment(html.format(query=self.query, team=random.randint(0, 100000)))
44         frag.add_javascript(self.resource_string("static/js/src/student.js"))
45         frag.initialize_js('MKWSRef')
46         return frag;
47
48     def studio_view(self, context=None):
49         """Studio configuration view."""
50         html = self.resource_string("static/html/settings.html")
51         frag = Fragment(html.format(query=self.query))
52         frag.add_javascript(self.resource_string("static/js/src/settings.js"))
53         frag.initialize_js('MKWSRefSettings')
54         return frag
55
56     @XBlock.json_handler
57     def update_settings(self, data, suffix=''):
58         """Studio configuration callback."""
59         self.query = data['query']
60         return {"result": "success"}
61
62     @staticmethod
63     def workbench_scenarios():
64         """A canned scenario for display in the workbench."""
65         return [
66             ("MKWSRef",
67              """<vertical_demo>
68                 <mkwsref/>
69                 </vertical_demo>
70              """),
71         ]