This commit is contained in:
Markos Gogoulos
2026-01-31 13:57:44 +02:00
parent 68cb21ff8a
commit 16f7b010ab
3 changed files with 5 additions and 58 deletions

View File

@@ -12,7 +12,7 @@ import jwt
from cryptography.hazmat.backends import default_backend from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives import serialization
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.http import JsonResponse from django.http import HttpResponseRedirect, JsonResponse
from django.shortcuts import render from django.shortcuts import render
from django.urls import reverse from django.urls import reverse
from django.utils.decorators import method_decorator from django.utils.decorators import method_decorator
@@ -21,7 +21,6 @@ from django.views.decorators.csrf import csrf_exempt
from jwcrypto import jwk from jwcrypto import jwk
from files.models import Media from files.models import Media
from files.views.media import MediaList
from .models import LTIPlatform, LTIToolKeys from .models import LTIPlatform, LTIToolKeys
@@ -36,55 +35,9 @@ class SelectMediaView(View):
""" """
def get(self, request): def get(self, request):
"""Display media selection interface""" """Display media selection interface - redirects to user's profile page"""
profile_url = f"/user/{request.user.username}"
# Check if this is a TinyMCE request (no deep linking session required) return HttpResponseRedirect(profile_url)
is_tinymce = request.GET.get('mode') == 'tinymce'
if not is_tinymce:
# Get deep link session data for regular deep linking flow
deep_link_data = request.session.get('lti_deep_link')
if not deep_link_data:
return JsonResponse({'error': 'No deep linking session data found'}, status=400)
# Reuse MediaList logic to get media with proper permissions
media_list_view = MediaList()
# Get base queryset with all permission/RBAC logic applied
media_queryset = media_list_view._get_media_queryset(request)
# Apply filtering based on query params
show_my_media_only = request.GET.get('my_media_only', 'false').lower() == 'true'
if show_my_media_only:
media_queryset = media_queryset.filter(user=request.user)
# Order by recent
media_queryset = media_queryset.order_by('-add_date')
# TinyMCE mode: Use pagination
if is_tinymce:
from django.core.paginator import Paginator
paginator = Paginator(media_queryset, 24) # 24 items per page
page_number = request.GET.get('page', 1)
page_obj = paginator.get_page(page_number)
context = {
'media_list': page_obj,
'page_obj': page_obj,
}
return render(request, 'lti/tinymce_select_media.html', context)
# Deep linking mode: Limit for performance
media_list = media_queryset[:100]
context = {
'media_list': media_list,
'show_my_media_only': show_my_media_only,
'deep_link_data': deep_link_data,
}
return render(request, 'lti/select_media.html', context)
@method_decorator(csrf_exempt) @method_decorator(csrf_exempt)
def post(self, request): def post(self, request):

View File

@@ -4,7 +4,7 @@ LTI 1.3 URL Configuration for MediaCMS
from django.urls import path from django.urls import path
from . import deep_linking, filter_embed, views from . import deep_linking, views
app_name = 'lti' app_name = 'lti'
@@ -23,6 +23,4 @@ urlpatterns = [
path('sync/<int:platform_id>/<str:context_id>/', views.ManualSyncView.as_view(), name='manual_sync'), path('sync/<int:platform_id>/<str:context_id>/', views.ManualSyncView.as_view(), name='manual_sync'),
# TinyMCE integration (reuses select-media with mode=tinymce parameter) # TinyMCE integration (reuses select-media with mode=tinymce parameter)
path('tinymce-embed/<str:friendly_token>/', views.TinyMCEGetEmbedView.as_view(), name='tinymce_embed'), path('tinymce-embed/<str:friendly_token>/', views.TinyMCEGetEmbedView.as_view(), name='tinymce_embed'),
# Filter embed token API
path('api/v1/get-filter-embed-token/', filter_embed.FilterEmbedTokenView.as_view(), name='filter_embed_token'),
] ]

View File

@@ -679,20 +679,16 @@ class TinyMCEGetEmbedView(View):
def get(self, request, friendly_token): def get(self, request, friendly_token):
"""Get embed code for the specified media.""" """Get embed code for the specified media."""
# Verify user is authenticated
if not request.user.is_authenticated: if not request.user.is_authenticated:
return JsonResponse({'error': 'Authentication required'}, status=401) return JsonResponse({'error': 'Authentication required'}, status=401)
# Verify media exists
media = Media.objects.filter(friendly_token=friendly_token).first() media = Media.objects.filter(friendly_token=friendly_token).first()
if not media: if not media:
return JsonResponse({'error': 'Media not found'}, status=404) return JsonResponse({'error': 'Media not found'}, status=404)
# Build embed URL
embed_url = request.build_absolute_uri(reverse('get_embed') + f'?m={friendly_token}') embed_url = request.build_absolute_uri(reverse('get_embed') + f'?m={friendly_token}')
# Generate iframe embed code
embed_code = f'<iframe src="{embed_url}" ' f'width="960" height="540" ' f'frameborder="0" ' f'allowfullscreen ' f'title="{media.title}">' f'</iframe>' embed_code = f'<iframe src="{embed_url}" ' f'width="960" height="540" ' f'frameborder="0" ' f'allowfullscreen ' f'title="{media.title}">' f'</iframe>'
return JsonResponse( return JsonResponse(