diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 978c09c7..91aad6af 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -14,6 +14,14 @@ Change Log Unreleased ********** +0.15.1 - 2026-03-18 +********************************************** + +Added +===== + +* Implemented JSON-based view to fetch a PDF-block's settings. + 0.15.0 - 2026-03-18 ********************************************** diff --git a/xblock_pdf/pdf.py b/xblock_pdf/pdf.py index 70e84cf4..91a27c25 100644 --- a/xblock_pdf/pdf.py +++ b/xblock_pdf/pdf.py @@ -1,7 +1,9 @@ """pdfXBlock main Python class.""" +import json from django.utils.translation import gettext_noop as _ from web_fragments.fragment import Fragment +from webob import Response from xblock.core import XBlock from xblock.fields import Boolean, Scope, String from xblock.utils.resources import ResourceLoader @@ -58,9 +60,10 @@ class PDFBlock(XBlock): ) ) - def student_view(self, context=None): - """Primary view of the XBlock, shown to students when viewing courses.""" - context = { + @property + def raw_settings(self): + """Get the raw settings of the XBlock as a dictionary.""" + return { 'display_name': self.display_name, 'url': self.url, 'allow_download': self.allow_download, @@ -68,9 +71,12 @@ def student_view(self, context=None): 'source_text': self.source_text, 'source_url': self.source_url, } + + def student_view(self, context=None): # pylint: disable=unused-argument + """Primary view of the XBlock, shown to students when viewing courses.""" html = resource_loader.render_django_template( 'templates/html/pdf_view.html', - context=context, + context=self.raw_settings, i18n_service=self.runtime.service(self, "i18n"), ) @@ -119,6 +125,11 @@ def on_download(self, data, suffix=''): # pylint: disable=unused-argument } self.runtime.publish(self, event_type, event_data) + @XBlock.handler + def load_pdf(self, *_args, **_kwargs): + """Get the PDF block's settings in JSON format.""" + return Response(json.dumps(self.raw_settings), content_type='application/json', charset='utf8') + @XBlock.json_handler def save_pdf(self, data, suffix=''): # pylint: disable=unused-argument """Save handler.""" diff --git a/xblock_pdf/tests/test_pdf.py b/xblock_pdf/tests/test_pdf.py index 83259a4c..f02ddd47 100644 --- a/xblock_pdf/tests/test_pdf.py +++ b/xblock_pdf/tests/test_pdf.py @@ -140,3 +140,11 @@ def test_download_event_fires(mock_publish): "source_url": "", } ) + + +def test_get_settings(): + """Test that fetching the block's settings works.""" + block = make_block() + request = mock_handle_request({}, method="GET") + result = json.loads(block.load_pdf(request).body) + assert result["display_name"] == "PDF" diff --git a/xblocks_contrib/__init__.py b/xblocks_contrib/__init__.py index c6e3a02d..485e9c6c 100644 --- a/xblocks_contrib/__init__.py +++ b/xblocks_contrib/__init__.py @@ -9,4 +9,4 @@ from .video import VideoBlock from .word_cloud import WordCloudBlock -__version__ = "0.15.0" +__version__ = "0.15.1"