This commit is contained in:
Markos Gogoulos
2025-12-29 20:02:55 +02:00
parent e9e5d44c3e
commit 9c145da2e2
4 changed files with 83 additions and 55 deletions

View File

@@ -4,6 +4,7 @@ from cms.version import VERSION
from .frontend_translations import get_translation, get_translation_strings from .frontend_translations import get_translation, get_translation_strings
from .methods import is_mediacms_editor, is_mediacms_manager from .methods import is_mediacms_editor, is_mediacms_manager
from .models import Category
def stuff(request): def stuff(request):
@@ -64,4 +65,26 @@ def stuff(request):
if request.user.is_superuser: if request.user.is_superuser:
ret["DJANGO_ADMIN_URL"] = settings.DJANGO_ADMIN_URL 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 return ret

View File

@@ -272,7 +272,23 @@ class MediaList(APIView):
serializer = MediaSerializer(data=request.data, context={"request": request}) serializer = MediaSerializer(data=request.data, context={"request": request})
if serializer.is_valid(): if serializer.is_valid():
media_file = request.data["media_file"] 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.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

View File

@@ -152,65 +152,54 @@ def provision_lti_context(platform, claims, resource_link_id):
context_title = context.get('title', '') context_title = context.get('title', '')
context_label = context.get('label', '') context_label = context.get('label', '')
# Unique identifier for this course # Try to get existing resource link first to reuse category/group
uid = f"lti_{platform.id}_{context_id}" 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 # Update context title if changed
category, created = Category.objects.get_or_create( if context_title and resource_link.context_title != context_title:
uid=uid, resource_link.context_title = context_title
defaults={ resource_link.save(update_fields=['context_title'])
'title': context_title or context_label or f"Course {context_id}", if category and category.title != context_title:
'description': f"Auto-created from {platform.name}: {context_title}", category.title = context_title
'is_global': False, category.save(update_fields=['title'])
'is_rbac_category': True,
'is_lms_course': True, # New field!
'lti_platform': platform,
'lti_context_id': context_id,
},
)
if created: except LTIResourceLink.DoesNotExist:
pass # Create new category and RBAC group with auto-generated UIDs
else: category = Category.objects.create(
# Update title if changed title=context_title or context_label or f"Course {context_id}",
if context_title and category.title != context_title: description=f"Auto-created from {platform.name}: {context_title}",
category.title = context_title is_global=False,
category.save(update_fields=['title']) is_rbac_category=True,
is_lms_course=True,
lti_platform=platform,
lti_context_id=context_id,
)
# Get or create RBAC group rbac_group = RBACGroup.objects.create(
rbac_group, created = RBACGroup.objects.get_or_create( name=f"{context_title or context_label} ({platform.name})",
uid=uid, description=f"LTI course group from {platform.name}",
defaults={ )
'name': f"{context_title or context_label} ({platform.name})",
'description': f"LTI course group from {platform.name}",
},
)
# Link category to RBAC group # Link category to RBAC group
if category not in rbac_group.categories.all():
rbac_group.categories.add(category) rbac_group.categories.add(category)
# Get or create resource link # Create resource link
resource_link, created = LTIResourceLink.objects.get_or_create( resource_link = LTIResourceLink.objects.create(
platform=platform, platform=platform,
context_id=context_id, context_id=context_id,
resource_link_id=resource_link_id, resource_link_id=resource_link_id,
defaults={ context_title=context_title,
'context_title': context_title, context_label=context_label,
'context_label': context_label, category=category,
'category': category, rbac_group=rbac_group,
'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'])
return category, rbac_group, resource_link return category, rbac_group, resource_link

View File

@@ -14,7 +14,7 @@ MediaCMS.url = {
likedMedia: "/liked", likedMedia: "/liked",
history: "/history", history: "/history",
/* Add pages */ /* Add pages */
addMedia: "/upload", addMedia: "/upload{% if lti_category_uid %}?publish_to_category={{ lti_category_uid }}{% endif %}",
recordScreen: "/record_screen", recordScreen: "/record_screen",
/* Profile/account edit pages */ /* Profile/account edit pages */
editProfile: "{{user.edit_url}}", editProfile: "{{user.edit_url}}",