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
# ------------------------------------------------------------------------------