6
0

file.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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"uploads/{instance.project.id}/{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. "path",
  40. "uuid",
  41. ]
  42. @classmethod
  43. def create(cls, uploaded_file: UploadedFile, project: Project):
  44. filename = Path(uploaded_file.name)
  45. file = cls.objects.create(
  46. project=project,
  47. size=uploaded_file.size,
  48. name=filename.stem,
  49. extension=filename.suffix.lower(),
  50. path=uploaded_file
  51. )
  52. return file
  53. class Meta:
  54. unique_together = [
  55. "project",
  56. "path"
  57. ]