file.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import enum
  2. import uuid
  3. from django.conf import settings
  4. from django.core.files.uploadedfile import UploadedFile
  5. from django.db import models
  6. from pathlib import Path
  7. from pycs_api.models import base
  8. from pycs_api.models.project import Project
  9. class Extensions(enum.Enum):
  10. JPG = ".jpg"
  11. JPEG = ".jpeg"
  12. PNG = ".png"
  13. def project_directory(instance: "File", filename: str):
  14. project_dir = Path(instance.project.data_folder).relative_to(settings.MEDIA_ROOT)
  15. return f"{project_dir}/{filename}"
  16. class File(base.BaseModel):
  17. EXTENSIONS = [
  18. (Extensions.JPG, "JPG Image"),
  19. (Extensions.JPEG, "JPEG Image"),
  20. (Extensions.PNG, "PNG Image"),
  21. ]
  22. uuid = models.UUIDField(
  23. default=uuid.uuid4
  24. )
  25. project = models.ForeignKey(
  26. Project,
  27. on_delete=models.CASCADE,
  28. related_name="files",
  29. related_query_name="file",
  30. )
  31. extension = models.CharField(
  32. max_length=16,
  33. choices=EXTENSIONS
  34. )
  35. size = models.PositiveIntegerField()
  36. created = models.DateTimeField(auto_now_add=True)
  37. path = models.ImageField(upload_to=project_directory)
  38. serializer_fields = base.BaseModel.serializer_fields + [
  39. "project",
  40. "created",
  41. "url",
  42. "uuid",
  43. ]
  44. @property
  45. def url(self):
  46. return self.path.url
  47. @classmethod
  48. def create(cls, uploaded_file: UploadedFile, project: Project):
  49. filename = Path(uploaded_file.name)
  50. file = cls.objects.create(
  51. project=project,
  52. size=uploaded_file.size,
  53. name=filename.stem,
  54. extension=filename.suffix.lower(),
  55. path=uploaded_file
  56. )
  57. return file
  58. class Meta:
  59. unique_together = [
  60. "project",
  61. "path"
  62. ]