12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- 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"
- ]
|