6
0

project.py 1.9 KB

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