diff --git a/contracts/migrations/0053_alter_contractfile_file.py b/contracts/migrations/0053_alter_contractfile_file.py new file mode 100644 index 0000000000000000000000000000000000000000..aa0900d944457b4e00028d0ee4a751df7f62d332 --- /dev/null +++ b/contracts/migrations/0053_alter_contractfile_file.py @@ -0,0 +1,19 @@ +# Generated by Django 4.1.4 on 2023-04-21 12:10 + +import contracts.models +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('contracts', '0052_remove_contract_legal_state_contract_is_valid'), + ] + + operations = [ + migrations.AlterField( + model_name='contractfile', + name='file', + field=contracts.models.ContractFileField(upload_to=contracts.models.get_contract_file_loaction, verbose_name='Soubor'), + ), + ] diff --git a/contracts/models.py b/contracts/models.py index 268cd2008f325ed0f585a7fa784357269abcfd58..72d01d2a5649dcb0ff475234d4d607ae49870e3e 100644 --- a/contracts/models.py +++ b/contracts/models.py @@ -2,12 +2,14 @@ import datetime import mimetypes import os import typing +import uuid from django.conf import settings from django.core.exceptions import ValidationError from django.core.validators import RegexValidator, URLValidator from django.db import models from django.db.models.signals import post_save +from django.db.models.fields.files import FieldFile from django.dispatch import receiver from django.urls import reverse from django.utils.safestring import mark_safe @@ -809,15 +811,29 @@ def get_contract_file_loaction(instance, filename): continue extension = mapper[guessed_type] + + if isinstance(extension, list): + extension = extension[0] + break return ( "_private/" f"{current_time.year}/{current_time.month}/{current_time.day}/" - f"{str(instance.id)}{extension}" + f"{uuid.uuid4()}{extension}" ) +class ContractFileProxy(FieldFile): + @property + def url(self) -> str: + return reverse("contracts:download_contract_file", args=(str(self.instance.id),)) + + +class ContractFileField(models.FileField): + attr_class = ContractFileProxy + + class ContractFile(NameStrMixin, models.Model): name = models.CharField( max_length=256, @@ -830,7 +846,7 @@ class ContractFile(NameStrMixin, models.Model): verbose_name="Veřejně dostupný", ) - file = models.FileField( + file = ContractFileField( verbose_name="Soubor", upload_to=get_contract_file_loaction, )