from django.http.response import HttpResponse, Http404, HttpResponseForbidden from django.views.generic import View from django.core.files.storage import default_storage from django.views.decorators.cache import cache_page from django.utils.decorators import method_decorator from university.models import Upload # TODO: wrong way to cache resource @method_decorator(cache_page(60 * 5), name='dispatch') class UploadView(View): def get(self, request, *args, **kwargs): file_path = kwargs['file_path'] try: upload_file = Upload.objects.get(path=file_path, is_private=False) _file = default_storage.open(upload_file.path) return HttpResponse(_file, content_type=upload_file.extension) except Exception: raise Http404 class PrivateUploadView(View): def get(self, request, *args, **kwargs): file_path = kwargs['file_path'] try: if not request.user.is_authenticated: return HttpResponseForbidden() upload_file = Upload.objects.get( path=file_path, is_private=True ) if not (request.user.is_staff or request.user == upload_file.user): return HttpResponseForbidden() _file = default_storage.open(upload_file.path) return HttpResponse(_file, content_type=upload_file.extension) except Exception as e: print(e) raise Http404