diff --git a/akarpov/files/previews/__init__.py b/akarpov/files/previews/__init__.py index e08a383..57cfe9a 100644 --- a/akarpov/files/previews/__init__.py +++ b/akarpov/files/previews/__init__.py @@ -9,7 +9,7 @@ "wav": audio.basic.view, "webm": audio.basic.view, }, - "video": {"mp4": video.mp4.view}, + "video": {"mp4": video.mp4.view, "quicktime": video.basic.view}, "image": { "jpeg": image.basic.view, "png": image.basic.view, @@ -17,4 +17,9 @@ }, } -extensions = {"mp4": video.mp4.view, "mp3": audio.basic.view, "avif": image.basic.view} +extensions = { + "mp4": video.mp4.view, + "mp3": audio.basic.view, + "avif": image.basic.view, + "mov": video.basic.view, +} diff --git a/akarpov/files/previews/audio/basic.py b/akarpov/files/previews/audio/basic.py index 4b26ac0..7cb0c09 100644 --- a/akarpov/files/previews/audio/basic.py +++ b/akarpov/files/previews/audio/basic.py @@ -2,7 +2,8 @@ def view(file: File) -> (str, str): - static = """ + static = f""" + """ content = ( """ diff --git a/akarpov/files/previews/audio/waves.py b/akarpov/files/previews/audio/waves.py index a079633..976951b 100644 --- a/akarpov/files/previews/audio/waves.py +++ b/akarpov/files/previews/audio/waves.py @@ -2,7 +2,11 @@ def view(file: File) -> (str, str): - static = """ + static = ( + f""" + + """ + + """ """ + ) content = ( """
diff --git a/akarpov/files/previews/image/basic.py b/akarpov/files/previews/image/basic.py index c3302b0..4896e8a 100644 --- a/akarpov/files/previews/image/basic.py +++ b/akarpov/files/previews/image/basic.py @@ -2,8 +2,9 @@ def view(file: File) -> (str, str): - static = """ + static = f""" + """ content = ( f""" diff --git a/akarpov/files/previews/video/__init__.py b/akarpov/files/previews/video/__init__.py index 6c53191..518c59d 100644 --- a/akarpov/files/previews/video/__init__.py +++ b/akarpov/files/previews/video/__init__.py @@ -1 +1 @@ -from . import mp4 # noqa +from . import basic, mp4 # noqa diff --git a/akarpov/files/previews/video/basic.py b/akarpov/files/previews/video/basic.py new file mode 100644 index 0000000..18ebe6c --- /dev/null +++ b/akarpov/files/previews/video/basic.py @@ -0,0 +1,26 @@ +from akarpov.files.models import File + + +def view(file: File) -> (str, str): + static = f""" + + + + + + + + """ + data = """"playbackRates": [0.5, 1, 1.5, 2], "responsive": true }""" + content = f""" + + + + + """ + + return static, content diff --git a/akarpov/files/previews/video/mp4.py b/akarpov/files/previews/video/mp4.py index 1ab30fa..40d2ae9 100644 --- a/akarpov/files/previews/video/mp4.py +++ b/akarpov/files/previews/video/mp4.py @@ -2,7 +2,13 @@ def view(file: File) -> (str, str): - static = """ + static = f""" + + + + + + """ data = """"playbackRates": [0.5, 1, 1.5, 2], "responsive": true }""" @@ -11,7 +17,7 @@ def view(file: File) -> (str, str): diff --git a/akarpov/files/tasks.py b/akarpov/files/tasks.py index 561e071..097757c 100644 --- a/akarpov/files/tasks.py +++ b/akarpov/files/tasks.py @@ -5,11 +5,7 @@ from django.core.files import File from akarpov.files.models import File as FileModel -from akarpov.files.services.preview import ( - create_preview, - get_description, - get_file_mimetype, -) +from akarpov.files.services.preview import create_preview, get_file_mimetype logger = structlog.get_logger(__name__) @@ -32,18 +28,7 @@ def process_file(pk: int): except Exception as e: logger.error(e) file.file_type = get_file_mimetype(file.file.path) - descr = None - try: - descr = get_description(file.file.path) - if descr: - with open(descr, encoding="utf-8") as f: - data = f.read() - file.description = data - except Exception as e: - logger.error(e) - file.save(update_fields=["preview", "name", "file_type", "description"]) + file.save(update_fields=["preview", "name", "file_type"]) if pth and os.path.isfile(pth): os.remove(pth) - if descr and os.path.isfile(descr): - os.remove(descr) return pk diff --git a/akarpov/files/urls.py b/akarpov/files/urls.py index e150468..2631fda 100644 --- a/akarpov/files/urls.py +++ b/akarpov/files/urls.py @@ -5,6 +5,7 @@ MyChunkedUploadCompleteView, MyChunkedUploadView, TopFolderView, + delete_file_view, files_view, folder_view, ) @@ -22,5 +23,6 @@ "api/chunked_upload/", MyChunkedUploadView.as_view(), name="api_chunked_upload" ), path("", files_view, name="view"), + path("/delete", delete_file_view, name="delete"), path("f/", folder_view, name="folder"), ] diff --git a/akarpov/files/views.py b/akarpov/files/views.py index 3f9b183..574db17 100644 --- a/akarpov/files/views.py +++ b/akarpov/files/views.py @@ -1,7 +1,9 @@ import os from django.contrib.auth.mixins import LoginRequiredMixin -from django.views.generic import DetailView, ListView +from django.shortcuts import get_object_or_404 +from django.urls import reverse +from django.views.generic import DetailView, ListView, RedirectView from django.views.generic.base import TemplateView from akarpov.contrib.chunked_upload.exceptions import ChunkedUploadError @@ -58,6 +60,17 @@ def get_context_data(self, **kwargs): files_view = FileView.as_view() +class DeleteFileView(LoginRequiredMixin, RedirectView): + def get_redirect_url(self, *args, **kwargs): + file = get_object_or_404(File, slug=kwargs["slug"]) + if file.user == self.request.user: + file.delete() + return reverse("files:main") + + +delete_file_view = DeleteFileView.as_view() + + class FileFolderView(DetailView): template_name = "files/folder.html" model = Folder diff --git a/akarpov/templates/base.html b/akarpov/templates/base.html index 1826e4e..d58a568 100644 --- a/akarpov/templates/base.html +++ b/akarpov/templates/base.html @@ -85,7 +85,7 @@ {% if ACCOUNT_ALLOW_REGISTRATION %}
  • - Sign up + Register
  • {% endif %}
  • diff --git a/akarpov/templates/files/view.html b/akarpov/templates/files/view.html index a8d2ff6..9b95a79 100644 --- a/akarpov/templates/files/view.html +++ b/akarpov/templates/files/view.html @@ -8,8 +8,8 @@ {% block content %}
    -
    -

    {{ file.name }}

    +

    {{ file.name }}

    + -
    +
    {% autoescape off %} {{ preview_content }} {% endautoescape %}
    + + {% endblock %} diff --git a/akarpov/tools/shortener/models.py b/akarpov/tools/shortener/models.py index 9c6dd99..995fb60 100644 --- a/akarpov/tools/shortener/models.py +++ b/akarpov/tools/shortener/models.py @@ -48,12 +48,57 @@ def create_model_link(sender, instance, created, **kwargs): return if hasattr(instance, "creator"): link.creator = instance.creator + elif hasattr(instance, "user"): + link.creator = instance.user + elif hasattr(instance, "owner"): + link.creator = instance.owner link.save() instance.short_link = link instance.save() +def update_model_link(sender, instance, **kwargs): + model = sender + if instance.id: + previous = model.objects.get(id=instance.id) + prev_private = False + cur_private = False + if hasattr(instance, "private"): + if instance.private: + cur_private = True + if hasattr(instance, "public"): + if not instance.public: + cur_private = True + if hasattr(previous, "private"): + if previous.private: + prev_private = True + if hasattr(previous, "public"): + if not previous.public: + prev_private = True + + if prev_private != cur_private: + if prev_private: + # instance was private, public now, need to create short link + if hasattr(instance, "short_link"): + if not instance.short_link: + link = Link(source=instance.get_absolute_url()) + if hasattr(instance, "creator"): + link.creator = instance.creator + elif hasattr(instance, "user"): + link.creator = instance.user + elif hasattr(instance, "owner"): + link.creator = instance.owner + link.save() + instance.short_link = link + else: + # instance was public, private now, need to delete short link + if hasattr(previous, "short_link"): + if previous.short_link: + previous.short_link.delete() + instance.short_link = None + + class ShortLink(SlugModel): short_link: Link | None = models.ForeignKey( "shortener.Link", blank=True, null=True, on_delete=models.SET_NULL @@ -63,6 +108,7 @@ class ShortLink(SlugModel): def __init_subclass__(cls, **kwargs): super().__init_subclass__(**kwargs) models.signals.post_save.connect(create_model_link, sender=cls) + models.signals.pre_save.connect(update_model_link, sender=cls) @abstractmethod def get_absolute_url(self): diff --git a/config/settings/local.py b/config/settings/local.py index 24a2f3e..27ee0ef 100644 --- a/config/settings/local.py +++ b/config/settings/local.py @@ -11,7 +11,8 @@ default="Lm4alUqtub6qQT4MnV4NmtXQP02RCBtmGj1bJhyDho07Bkjk9WFZxGtwpnLNQGJQ", ) # https://docs.djangoproject.com/en/dev/ref/settings/#allowed-hosts -ALLOWED_HOSTS = ["localhost", "0.0.0.0", "127.0.0.1"] +ALLOWED_HOSTS = ["*"] +CSRF_TRUSTED_ORIGINS = ["http://127.0.0.1", "https://*.akarpov.ru"] # CACHES # ------------------------------------------------------------------------------