diff --git a/archivist/apps/files/urls.py b/archivist/apps/files/urls.py index 29ea12e..609f4a9 100644 --- a/archivist/apps/files/urls.py +++ b/archivist/apps/files/urls.py @@ -3,7 +3,7 @@ from . import views urlpatterns = [ # Add a URL pattern that captures the file path - path('submission/', views.serve_submission_file, name='serve_submission_file'), + path('/', views.serve_content_file, name='serve_content_file'), # Other URL patterns if any path('upload/', views.fileUpload, name='file_upload'), ] diff --git a/archivist/apps/files/views.py b/archivist/apps/files/views.py index da14ff6..5a8bbc7 100644 --- a/archivist/apps/files/views.py +++ b/archivist/apps/files/views.py @@ -8,9 +8,16 @@ import os import blake3 from .forms import UploadFileForm -from .models import Submission_File +from .models import User_Banner_Images, User_Profile_Images, Metadata_Files, Submission_File +MODEL_MAP = { + 'user_profile': User_Profile_Images, + 'user_banner': User_Banner_Images, + 'submission': Submission_File, + 'metadata': Metadata_Files, +} + def compute_file_hash(file): ''' Compute BLAKE3 hash of the file @@ -49,6 +56,36 @@ def serve_submission_file(request, file_hash): return HttpResponse("File not found", status=404) +@login_required(login_url="/login/") +def serve_content_file(request, folder, file_hash): + ''' + View function to serve content files for download or inline viewing + ''' + + ModelClass = MODEL_MAP.get(folder) + if ModelClass is None: + return HttpResponse("Invalid folder", status=404) + + download = request.GET.get('d') + + try: + obj_file = get_object_or_404(ModelClass, file_hash=file_hash) + file = obj_file.file.file + file_name = obj_file.file_name + + response = FileResponse(file) + if download == "1": + response['Content-Disposition'] = f'attachment; filename="{file_name}"' + else: + response['Content-Disposition'] = f'inline; filename="{file_name}"' + + return response + + except Exception as e: + print(f"Error serving file: {e}") + return HttpResponse("File not found", status=404) + + @login_required(login_url="/login/") def fileUpload(request): '''