loko/loko/projects/signals.py

70 lines
2.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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, VisibilityScope
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, created = DocumentFolder.objects.get_or_create(
slug=folder_slug,
defaults={
"name": folder_name,
"application_label": "projects",
"visibility": VisibilityScope.SCOPED,
},
)
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)