69 lines
2.1 KiB
Python
69 lines
2.1 KiB
Python
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 : "<code> – <name[:60]>" e.g. "P00001 – Schuman"
|
||
Folder slug : "project-<code.lower()>-<slugify(name)[:80]>"
|
||
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)
|