import uuid import logging from django.conf import settings from django.contrib.auth.models import User from django.db import models from django.dispatch import receiver from pycs_api.models import base from pycs_api.models.label_provider import LabelProvider from pycs_api.models.model import Model def new_root_folder(): return f"{settings.PROJECTS_DIR}/{uuid.uuid4()}" class Project(base.BaseModel): user = models.ForeignKey( User, on_delete=models.CASCADE, related_name="projects", related_query_name="project", ) description = models.TextField() created = models.DateTimeField(auto_now_add=True) model = models.ForeignKey( Model, null=True, blank=True, on_delete=models.SET_NULL ) label_provider = models.ForeignKey( LabelProvider, null=True, blank=True, on_delete=models.SET_NULL ) root_folder = models.CharField(max_length=255, default=new_root_folder, unique=True) data_folder = models.CharField(max_length=255) external_data = models.BooleanField(default=False) serializer_fields = base.BaseModel.serializer_fields + [ "description", "created", "model", "label_provider", "data_folder", "root_folder", ] read_only_fields = base.BaseModel.read_only_fields + [ "created", "data_folder", "root_folder", ] @receiver(models.signals.pre_save, sender=Project) def project_pre_save(sender, instance, **kwargs): is_external = instance.data_folder != '' logging.info(f"Using external folder: {'yes' if is_external else 'no'}") instance.external_data = is_external if not is_external: logging.info("Setting data folder") instance.data_folder = instance.root_folder + "/data" # TODO: copy model to root_folder / "model" # TODO: create temp folder root_folder / "temp"