diff --git a/src/document/models.py b/src/document/models.py index a9d72a22f77c1d87841b0e580c3747a57b73961e..8e26ea20ec77461fe475a53e308c9d0194e131c2 100644 --- a/src/document/models.py +++ b/src/document/models.py @@ -1,11 +1,22 @@ +import os + from django.db import models from django.core import validators - +from django.dispatch import receiver from account.models import Profile from homework.models import Solution from common.validators import FileSizeValidator +def document_file_name(instance, filename): + return '/'.join([ + 'document', + instance.solution.task.title, + instance.uploaded_by.full_name, + filename + ]) + + class Document(models.Model): uploaded_by = models.ForeignKey(Profile, on_delete=models.DO_NOTHING) uploaded_at = models.DateTimeField(auto_now_add=True, editable=False) @@ -22,9 +33,18 @@ class Document(models.Model): FileSizeValidator(size_limit=52428800), # 52428800 - 50MiB ], blank=True, - null=True + null=True, + upload_to=document_file_name ) solution = models.ForeignKey(Solution, related_name='files', on_delete=models.CASCADE) def __str__(self): return self.name + + +# Deletes file from filesystem when File object is deleted. +@receiver(models.signals.post_delete, sender=Document) +def auto_delete_file_on_delete(sender, instance, **kwargs): + if instance.file: + if os.path.isfile(instance.file.path): + os.remove(instance.file.path)