From 9c145da2e253f413e516276642a3fdea4a4b1493 Mon Sep 17 00:00:00 2001 From: Markos Gogoulos Date: Mon, 29 Dec 2025 20:02:55 +0200 Subject: [PATCH] all --- files/context_processors.py | 23 ++++++++ files/views/media.py | 18 ++++++- lti/handlers.py | 95 +++++++++++++++------------------- templates/config/core/url.html | 2 +- 4 files changed, 83 insertions(+), 55 deletions(-) diff --git a/files/context_processors.py b/files/context_processors.py index 98c3362a..610128aa 100644 --- a/files/context_processors.py +++ b/files/context_processors.py @@ -4,6 +4,7 @@ from cms.version import VERSION from .frontend_translations import get_translation, get_translation_strings from .methods import is_mediacms_editor, is_mediacms_manager +from .models import Category def stuff(request): @@ -64,4 +65,26 @@ def stuff(request): if request.user.is_superuser: ret["DJANGO_ADMIN_URL"] = settings.DJANGO_ADMIN_URL + # LTI Integration: Add category UID for LTI-authenticated users + if getattr(settings, 'USE_LTI', False): + # Check if user has an active LTI session + lti_session = request.session.get('lti_session') + if lti_session and request.user.is_authenticated: + ret['lti_session'] = lti_session + + # Get the category for this LTI context via lti_platform and lti_context_id + platform_id = lti_session.get('platform_id') + context_id = lti_session.get('context_id') + + if platform_id and context_id: + try: + # Look up category by LTI platform and context + category = Category.objects.get(lti_platform_id=platform_id, lti_context_id=context_id) + + # Check if user has permission to upload to this category + if request.user.has_upload_access_to_category(category): + ret['lti_category_uid'] = category.uid + except Category.DoesNotExist: + pass + return ret diff --git a/files/views/media.py b/files/views/media.py index 4cadf48e..e93972e1 100644 --- a/files/views/media.py +++ b/files/views/media.py @@ -272,7 +272,23 @@ class MediaList(APIView): serializer = MediaSerializer(data=request.data, context={"request": request}) if serializer.is_valid(): media_file = request.data["media_file"] - serializer.save(user=request.user, media_file=media_file) + media = serializer.save(user=request.user, media_file=media_file) + + # Handle LTI category assignment if publish_to_category parameter is provided + publish_to_category = request.data.get('publish_to_category', '').strip() + if publish_to_category: + from ..models import Category + + try: + category = Category.objects.get(uid=publish_to_category) + + # Check if user has upload access to this category + if request.user.has_upload_access_to_category(category): + media.category.add(category) + except Category.DoesNotExist: + # Category doesn't exist, silently ignore + pass + return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) diff --git a/lti/handlers.py b/lti/handlers.py index 089f3589..1c97847d 100644 --- a/lti/handlers.py +++ b/lti/handlers.py @@ -152,65 +152,54 @@ def provision_lti_context(platform, claims, resource_link_id): context_title = context.get('title', '') context_label = context.get('label', '') - # Unique identifier for this course - uid = f"lti_{platform.id}_{context_id}" + # Try to get existing resource link first to reuse category/group + try: + resource_link = LTIResourceLink.objects.get( + platform=platform, + context_id=context_id, + resource_link_id=resource_link_id, + ) + category = resource_link.category + rbac_group = resource_link.rbac_group - # Get or create category - category, created = Category.objects.get_or_create( - uid=uid, - defaults={ - 'title': context_title or context_label or f"Course {context_id}", - 'description': f"Auto-created from {platform.name}: {context_title}", - 'is_global': False, - 'is_rbac_category': True, - 'is_lms_course': True, # New field! - 'lti_platform': platform, - 'lti_context_id': context_id, - }, - ) + # Update context title if changed + if context_title and resource_link.context_title != context_title: + resource_link.context_title = context_title + resource_link.save(update_fields=['context_title']) + if category and category.title != context_title: + category.title = context_title + category.save(update_fields=['title']) - if created: - pass - else: - # Update title if changed - if context_title and category.title != context_title: - category.title = context_title - category.save(update_fields=['title']) + except LTIResourceLink.DoesNotExist: + # Create new category and RBAC group with auto-generated UIDs + category = Category.objects.create( + title=context_title or context_label or f"Course {context_id}", + description=f"Auto-created from {platform.name}: {context_title}", + is_global=False, + is_rbac_category=True, + is_lms_course=True, + lti_platform=platform, + lti_context_id=context_id, + ) - # Get or create RBAC group - rbac_group, created = RBACGroup.objects.get_or_create( - uid=uid, - defaults={ - 'name': f"{context_title or context_label} ({platform.name})", - 'description': f"LTI course group from {platform.name}", - }, - ) + rbac_group = RBACGroup.objects.create( + name=f"{context_title or context_label} ({platform.name})", + description=f"LTI course group from {platform.name}", + ) - # Link category to RBAC group - if category not in rbac_group.categories.all(): + # Link category to RBAC group rbac_group.categories.add(category) - # Get or create resource link - resource_link, created = LTIResourceLink.objects.get_or_create( - platform=platform, - context_id=context_id, - resource_link_id=resource_link_id, - defaults={ - 'context_title': context_title, - 'context_label': context_label, - 'category': category, - 'rbac_group': rbac_group, - }, - ) - - if not created: - # Update relationships if needed - if resource_link.category != category: - resource_link.category = category - resource_link.save(update_fields=['category']) - if resource_link.rbac_group != rbac_group: - resource_link.rbac_group = rbac_group - resource_link.save(update_fields=['rbac_group']) + # Create resource link + resource_link = LTIResourceLink.objects.create( + platform=platform, + context_id=context_id, + resource_link_id=resource_link_id, + context_title=context_title, + context_label=context_label, + category=category, + rbac_group=rbac_group, + ) return category, rbac_group, resource_link diff --git a/templates/config/core/url.html b/templates/config/core/url.html index 4737563e..98a8ec05 100644 --- a/templates/config/core/url.html +++ b/templates/config/core/url.html @@ -14,7 +14,7 @@ MediaCMS.url = { likedMedia: "/liked", history: "/history", /* Add pages */ - addMedia: "/upload", + addMedia: "/upload{% if lti_category_uid %}?publish_to_category={{ lti_category_uid }}{% endif %}", recordScreen: "/record_screen", /* Profile/account edit pages */ editProfile: "{{user.edit_url}}",