From 18e0f1085666580a53f120017fe0c4c8ff6529f6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Valenta?= <git@imaniti.org>
Date: Mon, 10 Apr 2023 23:48:40 +0200
Subject: [PATCH] split stored files, ID-based names

---
 .../0033_alter_contractfile_file.py           | 19 +++++++++++++
 contracts/models.py                           | 27 ++++++++++++++++++-
 2 files changed, 45 insertions(+), 1 deletion(-)
 create mode 100644 contracts/migrations/0033_alter_contractfile_file.py

diff --git a/contracts/migrations/0033_alter_contractfile_file.py b/contracts/migrations/0033_alter_contractfile_file.py
new file mode 100644
index 0000000..bf56c07
--- /dev/null
+++ b/contracts/migrations/0033_alter_contractfile_file.py
@@ -0,0 +1,19 @@
+# Generated by Django 4.1.4 on 2023-04-10 21:45
+
+import contracts.models
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('contracts', '0032_alter_signee_address_country'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='contractfile',
+            name='file',
+            field=models.FileField(upload_to=contracts.models.get_contract_file_loaction, verbose_name='Soubor'),
+        ),
+    ]
diff --git a/contracts/models.py b/contracts/models.py
index 6df1358..51fa005 100644
--- a/contracts/models.py
+++ b/contracts/models.py
@@ -1,4 +1,6 @@
 import datetime
+import os
+import mimetypes
 import typing
 
 from django.conf import settings
@@ -740,6 +742,29 @@ class Contract(NameStrMixin, models.Model):
         ] + OwnPermissionsMixin.Meta.permissions
 
 
+def get_contract_file_loaction(instance, filename):
+    mimetypes_instance = mimetypes.MimeTypes()
+
+    current_time = datetime.datetime.today()
+    guessed_type = mimetypes_instance.guess_type(filename, strict=False)[0]
+
+    extension = ""
+
+    if guessed_type is not None:
+        for mapper in mimetypes_instance.types_map_inv:
+            if guessed_type not in mapper:
+                continue
+
+            extension = mapper[guessed_type]
+            break
+
+    return (
+        "_private/"
+        f"{current_time.year}/{current_time.month}/{current_time.day}/"
+        f"{str(instance.id)}{extension}"
+    )
+
+
 class ContractFile(NameStrMixin, models.Model):
     name = models.CharField(
         max_length=128,
@@ -754,7 +779,7 @@ class ContractFile(NameStrMixin, models.Model):
 
     file = models.FileField(
         verbose_name="Soubor",
-        upload_to="_private/",
+        upload_to=get_contract_file_loaction,
     )
 
     contract = models.ForeignKey(
-- 
GitLab