6
0

project.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import logging
  2. import os
  3. import uuid
  4. from django.conf import settings
  5. from django.contrib.auth.models import User
  6. from django.db import models
  7. from django.dispatch import receiver
  8. from pycs_api.models import base
  9. from pycs_api.models.label_provider import LabelProvider
  10. from pycs_api.models.model import Model
  11. def new_root_folder():
  12. return f"{settings.PROJECTS_DIR}/{uuid.uuid4()}"
  13. class Project(base.BaseModel):
  14. user = models.ForeignKey(
  15. User,
  16. on_delete=models.CASCADE,
  17. related_name="projects",
  18. related_query_name="project",
  19. )
  20. description = models.TextField()
  21. created = models.DateTimeField(auto_now_add=True)
  22. model = models.ForeignKey(
  23. Model,
  24. null=True,
  25. blank=True,
  26. on_delete=models.SET_NULL
  27. )
  28. label_provider = models.ForeignKey(
  29. LabelProvider,
  30. null=True,
  31. blank=True,
  32. on_delete=models.SET_NULL
  33. )
  34. root_folder = models.CharField(max_length=255,
  35. default=new_root_folder,
  36. unique=True)
  37. data_folder = models.CharField(max_length=255)
  38. external_data = models.BooleanField(default=False)
  39. serializer_fields = base.BaseModel.serializer_fields + [
  40. "description",
  41. "created",
  42. "model",
  43. "label_provider",
  44. "data_folder",
  45. "root_folder",
  46. ]
  47. read_only_fields = base.BaseModel.read_only_fields + [
  48. "created",
  49. "data_folder",
  50. "root_folder",
  51. ]
  52. @receiver(models.signals.pre_save, sender=Project)
  53. def project_pre_save(sender, instance, **kwargs):
  54. is_external = instance.data_folder != ''
  55. logging.info(f"Using external folder: {'yes' if is_external else 'no'}")
  56. instance.external_data = is_external
  57. os.makedirs(instance.root_folder, exist_ok=True)
  58. if not is_external:
  59. logging.info("Setting data folder")
  60. instance.data_folder = instance.root_folder + "/data"
  61. if not os.path.exists(instance.data_folder):
  62. os.makedirs(instance.data_folder, exist_ok=True)
  63. # TODO: copy model to root_folder / "model"
  64. # TODO: create temp folder root_folder / "temp"