From c94661b26076b96c049be116cac28d0e92daea23 Mon Sep 17 00:00:00 2001 From: rythmE Date: Fri, 18 Sep 2020 17:49:57 +0800 Subject: [PATCH] To publish completion after 1s after page loaded --- pdf/pdf.py | 30 ++++++++++++++++++++++++++++-- pdf/static/js/pdf_view.js | 2 +- pdf/static/js/pdf_viewer.js | 11 +++++++++++ 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/pdf/pdf.py b/pdf/pdf.py index b534de0..3e32bd0 100644 --- a/pdf/pdf.py +++ b/pdf/pdf.py @@ -9,6 +9,7 @@ from xblockutils.resources import ResourceLoader from xblockutils.settings import XBlockWithSettingsMixin, ThemableXBlockMixin from xblock.scorable import ScorableXBlockMixin, Score +from xblock.exceptions import JsonHandlerError from .utils import _, DummyTranslationService import pkg_resources from mako.template import Template @@ -130,8 +131,6 @@ def student_view(self, context=None): } self.runtime.publish(self, event_type, event_data) - self.runtime.publish(self, 'completion', {'completion': 1.0}) - frag = Fragment(html) frag.add_javascript(self.load_resource("static/js/pdf_view.js")) ##frag.add_resource_url(self.runtime.local_resource_url(self, "public/")) @@ -145,6 +144,33 @@ def student_view(self, context=None): }) return frag + @XBlock.json_handler + def publish_completion(self, data, dispatch): # pylint: disable=unused-argument + """ + Entry point for completion for student_view. + + Parameters: + data: JSON dict: + key: "completion" + value: float in range [0.0, 1.0] + + dispatch: Ignored. + Return value: JSON response (200 on success, 400 for malformed data) + """ + completion_service = self.runtime.service(self, 'completion') + if completion_service is None: + raise JsonHandlerError(500, u"No completion service found") + elif not completion_service.completion_tracking_enabled(): + raise JsonHandlerError(404, u"Completion tracking is not enabled and API calls are unexpected") + if not isinstance(data['completion'], (int, float)): + message = u"Invalid completion value {}. Must be a float in range [0.0, 1.0]" + raise JsonHandlerError(400, message.format(data['completion'])) + elif not 0.0 <= data['completion'] <= 1.0: + message = u"Invalid completion value {}. Must be in range [0.0, 1.0]" + raise JsonHandlerError(400, message.format(data['completion'])) + self.runtime.publish(self, "completion", data) + return {"result": "ok"} + def studio_view(self, context=None): """ The secondary view of the XBlock, shown to teachers diff --git a/pdf/static/js/pdf_view.js b/pdf/static/js/pdf_view.js index 41c6c44..ffabf75 100644 --- a/pdf/static/js/pdf_view.js +++ b/pdf/static/js/pdf_view.js @@ -1 +1 @@ -!function(e){var n={};function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var o in e)t.d(r,o,function(n){return e[n]}.bind(null,o));return r},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="",t(t.s=0)}([function(e,n){window.pdfXBlockInitView=function(e,n,t){n.innerHTML&&(n=$(n)),$(".pdf-h5-container").attr("data","/xblock/resources/pdf/public/web/viewer.html?file="+t.url),$((function(){n.find(".pdf-download-button").on("click",(function(){var t=e.handlerUrl(n,"on_download");$.post(t,"{}")}))}))}}]); \ No newline at end of file +!function(e){var n={};function t(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,t),r.l=!0,r.exports}t.m=e,t.c=n,t.d=function(e,n,o){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:o})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(t.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var r in e)t.d(o,r,function(n){return e[n]}.bind(null,r));return o},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="",t(t.s=0)}([function(e,n){window.pdfXBlockInitView=function(e,n,t){n.innerHTML&&(n=$(n)),$(".pdf-h5-container").attr("data","/xblock/resources/pdf/public/web/viewer.html?file="+t.url),$((function(){n.find(".pdf-download-button").on("click",(function(){var t=e.handlerUrl(n,"on_download");$.post(t,"{}")}))}));var o=e.handlerUrl(n,"publish_completion");window.onload=function(){setTimeout((function(){$.post(o,JSON.stringify({completion:1})).complete((function(){}))}),1e3)}}}]); \ No newline at end of file diff --git a/pdf/static/js/pdf_viewer.js b/pdf/static/js/pdf_viewer.js index 202026a..5a8bde7 100644 --- a/pdf/static/js/pdf_viewer.js +++ b/pdf/static/js/pdf_viewer.js @@ -16,6 +16,17 @@ function pdfXBlockInitView(runtime, element, json) { $.post(handlerUrl, '{}'); }); }); + + var handlerUrl = runtime.handlerUrl(element, 'publish_completion'); + + window.onload = function() { + setTimeout(function() { + var data = { + 'completion': 1.0, + }; + $.post(handlerUrl, JSON.stringify(data)).complete(function() {}); + }, 1000); + }; } window.pdfXBlockInitView = pdfXBlockInitView;