6
0

file.py 1.7 KB

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