import enum import uuid from django.conf import settings from django.core.files.uploadedfile import UploadedFile from django.db import models from pathlib import Path from pycs_api.models import base from pycs_api.models.project import Project class Extensions(enum.Enum): JPG = ".jpg" JPEG = ".jpeg" PNG = ".png" def project_directory(instance: "File", filename: str): project_dir = Path(instance.project.data_folder).relative_to(settings.MEDIA_ROOT) return f"{project_dir}/{filename}" class File(base.BaseModel): EXTENSIONS = [ (Extensions.JPG, "JPG Image"), (Extensions.JPEG, "JPEG Image"), (Extensions.PNG, "PNG Image"), ] uuid = models.UUIDField( default=uuid.uuid4 ) project = models.ForeignKey( Project, on_delete=models.CASCADE, related_name="files", related_query_name="file", ) extension = models.CharField( max_length=16, choices=EXTENSIONS ) size = models.PositiveIntegerField() created = models.DateTimeField(auto_now_add=True) path = models.ImageField(upload_to=project_directory) serializer_fields = base.BaseModel.serializer_fields + [ "project", "created", "url", "uuid", ] @property def url(self): return self.path.url @classmethod def create(cls, uploaded_file: UploadedFile, project: Project): filename = Path(uploaded_file.name) file = cls.objects.create( project=project, size=uploaded_file.size, name=filename.stem, extension=filename.suffix.lower(), path=uploaded_file ) return file class Meta: unique_together = [ "project", "path" ]