import logging from django.db.models.signals import post_save from django.dispatch import receiver from django.utils.text import slugify from .models import Project, ProjectUserAccess logger = logging.getLogger(__name__) def ensure_project_document_folder(project): """ Create (or retrieve) a DocumentFolder for the given project and attach it as the default folder. Safe to call multiple times (idempotent). Folder name : " – " e.g. "P00001 – Schuman" Folder slug : "project--" Parent folder: the predefined folder with slug='projects' """ from django.contrib.contenttypes.models import ContentType from documents.models import DocumentFolder, DocumentFolderAttachment parent = DocumentFolder.objects.filter(slug="projects", is_predefined=True).first() folder_name = f"{project.code} \u2013 {project.name[:60]}" folder_slug = f"project-{project.code.lower()}-{slugify(project.name)[:80]}" folder, _ = DocumentFolder.objects.get_or_create( slug=folder_slug, defaults={ "name": folder_name, "application_label": "projects", }, ) if parent: folder.parent_folders.add(parent) ct = ContentType.objects.get_for_model(project) DocumentFolderAttachment.objects.get_or_create( folder=folder, content_type=ct, object_id=project.pk, defaults={"is_default": True}, ) return folder @receiver(post_save, sender=Project) def add_owner_as_project_user_access(sender, instance, created, **kwargs): if created: ProjectUserAccess.objects.get_or_create( project=instance, user=instance.created_by, defaults={'can_view': True, 'can_edit': True}, ) @receiver(post_save, sender=Project) def create_project_document_folder(sender, instance, created, **kwargs): if not created: return try: ensure_project_document_folder(instance) except Exception: logger.exception("Failed to create document folder for project %s", instance.pk)