From 5cdcef2205b70bfaedb124a0357c2b96b6d30de9 Mon Sep 17 00:00:00 2001 From: Markos Gogoulos Date: Tue, 10 Feb 2026 09:56:01 +0200 Subject: [PATCH] wtv --- files/forms.py | 24 ++++++++++++++++++++++++ files/serializers.py | 1 + files/views/categories.py | 14 +++++++++++++- files/views/pages.py | 4 ++-- files/widgets.py | 12 +++++++++++- templates/cms/add-media.html | 21 ++++++++++++++++++++- 6 files changed, 71 insertions(+), 5 deletions(-) diff --git a/files/forms.py b/files/forms.py index db327929..36b3e697 100644 --- a/files/forms.py +++ b/files/forms.py @@ -127,6 +127,7 @@ class MediaPublishForm(forms.ModelForm): def __init__(self, user, *args, **kwargs): self.user = user + self.request = kwargs.pop('request', None) super(MediaPublishForm, self).__init__(*args, **kwargs) self.has_custom_permissions = self.instance.permissions.exists() if self.instance.pk else False @@ -169,6 +170,13 @@ class MediaPublishForm(forms.ModelForm): self.fields['category'].queryset = Category.objects.filter(id__in=combined_category_ids).order_by('title') + # Filter for LMS courses only when in embed mode + if self.request and 'category' in self.fields: + is_embed_mode = self._check_embed_mode() + if is_embed_mode: + current_queryset = self.fields['category'].queryset + self.fields['category'].queryset = current_queryset.filter(is_lms_course=True) + self.helper = FormHelper() self.helper.form_tag = True self.helper.form_class = 'post-form' @@ -186,6 +194,22 @@ class MediaPublishForm(forms.ModelForm): self.helper.layout.append(FormActions(Submit('submit', 'Publish Media', css_class='primaryAction'))) + def _check_embed_mode(self): + """Check if the current request is in embed mode""" + if not self.request: + return False + + # Check query parameter + mode = self.request.GET.get('mode', '') + if mode == 'embed_mode': + return True + + # Check session storage + if self.request.session.get('media_cms_embed_mode') == 'true': + return True + + return False + def clean(self): cleaned_data = super().clean() state = cleaned_data.get("state") diff --git a/files/serializers.py b/files/serializers.py index 9d62163c..5c574549 100644 --- a/files/serializers.py +++ b/files/serializers.py @@ -226,6 +226,7 @@ class CategorySerializer(serializers.ModelSerializer): "media_count", "user", "thumbnail_url", + "is_lms_course", ) diff --git a/files/views/categories.py b/files/views/categories.py index d625e988..0da755ad 100644 --- a/files/views/categories.py +++ b/files/views/categories.py @@ -47,7 +47,14 @@ class CategoryListContributor(APIView): """List categories where user has contributor access""" @swagger_auto_schema( - manual_parameters=[], + manual_parameters=[ + openapi.Parameter( + name='lms_courses_only', + type=openapi.TYPE_BOOLEAN, + in_=openapi.IN_QUERY, + description='Filter to show only LMS courses (categories with is_lms_course=True)', + ), + ], tags=['Categories'], operation_summary='Lists Categories for Contributors', operation_description='Lists all categories where the user has contributor access', @@ -71,6 +78,11 @@ class CategoryListContributor(APIView): else: categories = public_categories + # Filter for LMS courses only if requested + lms_courses_only = request.GET.get('lms_courses_only', '').lower() in ['true', '1', 'yes'] + if lms_courses_only: + categories = categories.filter(is_lms_course=True) + categories = categories.order_by("title") serializer = CategorySerializer(categories, many=True, context={"request": request}) diff --git a/files/views/pages.py b/files/views/pages.py index c5a5a506..0583e0a3 100644 --- a/files/views/pages.py +++ b/files/views/pages.py @@ -350,13 +350,13 @@ def publish_media(request): return HttpResponseRedirect(media.get_absolute_url()) if request.method == "POST": - form = MediaPublishForm(request.user, request.POST, request.FILES, instance=media) + form = MediaPublishForm(request.user, request.POST, request.FILES, instance=media, request=request) if form.is_valid(): media = form.save() messages.add_message(request, messages.INFO, translate_string(request.LANGUAGE_CODE, "Media was edited")) return HttpResponseRedirect(media.get_absolute_url()) else: - form = MediaPublishForm(request.user, instance=media) + form = MediaPublishForm(request.user, instance=media, request=request) return render( request, diff --git a/files/widgets.py b/files/widgets.py index edceaf60..a2f61651 100644 --- a/files/widgets.py +++ b/files/widgets.py @@ -3,6 +3,8 @@ import json from django import forms from django.utils.safestring import mark_safe +from .models import Category + class CategoryModalWidget(forms.SelectMultiple): """Two-panel category selector with modal""" @@ -16,7 +18,15 @@ class CategoryModalWidget(forms.SelectMultiple): categories = [] for opt_value, opt_label in self.choices: if opt_value: # Skip empty choice - categories.append({'id': str(opt_value), 'title': str(opt_label)}) + # Extract the actual ID value from ModelChoiceIteratorValue if needed + category_id = opt_value.value if hasattr(opt_value, 'value') else opt_value + + # Get is_lms_course info from the Category object + try: + cat_obj = Category.objects.get(id=category_id) + categories.append({'id': str(category_id), 'title': str(opt_label), 'is_lms_course': cat_obj.is_lms_course}) + except Category.DoesNotExist: + categories.append({'id': str(category_id), 'title': str(opt_label), 'is_lms_course': False}) all_categories_json = json.dumps(categories) selected_ids_json = json.dumps([str(v) for v in (value or [])]) diff --git a/templates/cms/add-media.html b/templates/cms/add-media.html index b1caa3b4..5ef17514 100644 --- a/templates/cms/add-media.html +++ b/templates/cms/add-media.html @@ -224,8 +224,27 @@ }).join(''); } + // Check if in embed mode + function isInEmbedMode() { + try { + const params = new URLSearchParams(window.location.search); + const mode = params.get('mode'); + if (mode === 'embed_mode') { + return true; + } + return sessionStorage.getItem('media_cms_embed_mode') === 'true'; + } catch (e) { + return false; + } + } + // Fetch categories from API - fetch('/api/v1/categories/contributor') + var apiUrl = '/api/v1/categories/contributor'; + if (isInEmbedMode()) { + apiUrl += '?lms_courses_only=true'; + } + + fetch(apiUrl) .then(function(response) { return response.json(); }) .then(function(categories) { allCategories = categories;