From 37a7db5bc00d8156c89bb6c22b84ad6cfac7e5c2 Mon Sep 17 00:00:00 2001 From: Talha Date: Tue, 26 Dec 2023 20:18:45 +0500 Subject: [PATCH] feat: added Multi AUs support for iframe --- openedx_cmi5_xblock/openedx_cmi5_xblock.py | 92 ++++++++++++++----- .../static/html/openedx_cmi5_xblock.html | 17 +++- .../static/js/src/openedx_cmi5_xblock.js | 29 ++++-- 3 files changed, 106 insertions(+), 32 deletions(-) diff --git a/openedx_cmi5_xblock/openedx_cmi5_xblock.py b/openedx_cmi5_xblock/openedx_cmi5_xblock.py index f32a01e..6587369 100644 --- a/openedx_cmi5_xblock/openedx_cmi5_xblock.py +++ b/openedx_cmi5_xblock/openedx_cmi5_xblock.py @@ -1,5 +1,6 @@ """Openedx CMI5 XBlock implementation.""" +import copy import hashlib import json import logging @@ -21,7 +22,7 @@ from webob import Response from xblock.completable import CompletableXBlockMixin from xblock.core import XBlock -from xblock.fields import Boolean, DateTime, Dict, Float, Integer, Scope, String +from xblock.fields import Boolean, DateTime, Dict, Float, Integer, List, Scope, String from xblock.fragment import Fragment from openedx_cmi5_xblock.utils.utility import ( @@ -121,6 +122,13 @@ class CMI5XBlock(XBlock, CompletableXBlockMixin): scope=Scope.settings, ) + au_urls = List( + display_name=_('AU URLs'), + help=_('List of AU URLs'), + default=[], + scope=Scope.content, + ) + has_author_view = True def author_view(self, context=None): @@ -159,6 +167,7 @@ def student_view(self, context=None): student_context = { 'title': self.display_name, 'index_page_url': self.index_page_url, + 'au_urls': self.launch_all_au_urls, 'cmi5_xblock': self, } student_context.update(context or {}) @@ -260,6 +269,49 @@ def studio_submit(self, request, _suffix): response['errors'].append(e.args[0]) return json_response(response) + @property + def launch_all_au_urls(self): + """Gets the URLs of all the cmi5 AUs.""" + temp_au_list = copy.deepcopy(self.au_urls) + + for au in temp_au_list: + au['url'] = self.launch_au_url(au['url']) + + return temp_au_list + + def launch_au_url(self, url): + """Handles the multiple AUs and append launch params with url.""" + if not self.package_meta or not url: + return '' + + lms_cmi5_url = self.make_launch_url(url) + return lms_cmi5_url + + @property + def index_page_url(self): + """ + Gets the URL of the CMI5 index page. + + Returns an empty string if the package metadata or index page path is not available. + """ + if not self.package_meta or not self.index_page_path: + return '' + + lms_cmi5_url = self.make_launch_url(self.index_page_path) + return lms_cmi5_url + + def make_launch_url(self, url): + """Make the launch url for the AUs of cmi5.""" + if is_url(url): + lms_cmi5_url = url + else: + folder = self.extract_folder_path + lms_cmi5_url = requests.utils.unquote(self.storage.url(os.path.join(folder, url))) + + params_joining_symbol = '&' if is_params_exist(lms_cmi5_url) else '?' + lms_cmi5_url = lms_cmi5_url + params_joining_symbol + return lms_cmi5_url + self.get_launch_url_params() + # getters and setters def get_credentials(self): """ @@ -377,26 +429,6 @@ def get_launch_url_params(self): return all_parameters - @property - def index_page_url(self): - """ - Gets the URL of the CMI5 index page. - - Returns an empty string if the package metadata or index page path is not available. - """ - if not self.package_meta or not self.index_page_path: - return '' - - if is_url(self.index_page_path): - lms_cmi5_url = self.index_page_path - else: - folder = self.extract_folder_path - lms_cmi5_url = requests.utils.unquote(self.storage.url(os.path.join(folder, self.index_page_path))) - - params_joining_symbol = '&' if is_params_exist(lms_cmi5_url) else '?' - lms_cmi5_url = lms_cmi5_url + params_joining_symbol - return lms_cmi5_url + self.get_launch_url_params() - @property def extract_folder_path(self): """ @@ -486,9 +518,21 @@ def update_package_fields(self): prefix = '{' + namespace + '}' if namespace else '' self.set_course_detail(prefix, root) - au_url = root.find('.//{prefix}au/{prefix}url'.format(prefix=prefix)) - if au_url is not None: - self.index_page_path = au_url.text + au_elements = root.findall('.//{prefix}au'.format(prefix=prefix)) + if au_elements: + self.index_page_path = au_elements[0].find('./{prefix}url'.format(prefix=prefix)).text + au_data_list = [] + for au in au_elements: + au_url = au.find('./{prefix}url'.format(prefix=prefix)).text + launch_method = au.get('launchMethod', 'AnyWindow') + + au_data = { + 'url': au_url, + 'launch_method': launch_method + } + au_data_list.append(au_data) + + self.au_urls = au_data_list else: self.index_page_path = self.find_relative_file_path('index.html') diff --git a/openedx_cmi5_xblock/static/html/openedx_cmi5_xblock.html b/openedx_cmi5_xblock/static/html/openedx_cmi5_xblock.html index 1d0bfda..4dc0e88 100644 --- a/openedx_cmi5_xblock/static/html/openedx_cmi5_xblock.html +++ b/openedx_cmi5_xblock/static/html/openedx_cmi5_xblock.html @@ -2,11 +2,26 @@

{{title}}

+
+ {% if index_page_url %} +
{% trans "Available Assignables:" %}
+
    + {% for au_url in au_urls %} +
  1. + + {% trans "AU No." %} {{ forloop.counter }} + + ({%trans "Launch: "%} {{au_url.launch_method}}) +
  2. + + {% endfor %} +
+