loko/streetup/bim/management/commands/create_sample_ifc.py

82 lines
3.1 KiB
Python

import os
from django.core.management.base import BaseCommand
from django.contrib.auth import get_user_model
from django.core.files import File
from documents.models import ManagedDocument, DocumentVersion, DocumentShare, DocumentFolder
User = get_user_model()
class Command(BaseCommand):
help = "Crée automatiquement un document IFC d'exemple dans la gestion documentaire et l'attache à un dossier partagé."
def handle(self, *args, **options):
users = User.objects.filter(is_active=True)
if not users.exists():
self.stderr.write(self.style.ERROR("Aucun utilisateur actif disponible."))
return
creator = users.filter(is_superuser=True).first() or users.first()
samples_dir = os.path.join(os.path.dirname(__file__), "..", "..", "samples")
sample_file_path = os.path.join(samples_dir, "Duplex_Architecture.ifc")
if not os.path.exists(sample_file_path):
self.stderr.write(self.style.ERROR(f"Fichier d'exemple non trouvé à l'emplacement : {sample_file_path}"))
return
# Ensure a root folder "Maquettes 3D (BIM)" exists so the document is visible in folder navigation
folder, _ = DocumentFolder.objects.get_or_create(
slug="maquettes-3d-bim",
defaults={
"name": "Maquettes 3D (BIM)",
"created_by": creator,
}
)
# Share folder with all active users
for user in users:
DocumentFolder.objects.filter(pk=folder.pk).update()
folder.shares.get_or_create(
user=user,
defaults={"permission": ManagedDocument.PERMISSION_VIEW}
)
title = "Duplex_Architecture"
doc, created = ManagedDocument.objects.get_or_create(
title=title,
defaults={
"description": "Exemple de maquette 3D au format IFC pour tests du viewer BIM (openBIM Duplex).",
"created_by": creator,
}
)
# Attach folder to document
doc.folders.add(folder)
if not doc.current_version:
with open(sample_file_path, "rb") as f:
version = DocumentVersion.objects.create(
document=doc,
version_number=1,
file=File(f, name="Duplex_Architecture.ifc"),
uploaded_by=creator,
description="Version initiale d'exemple IFC"
)
doc.current_version = version
doc.save(update_fields=["current_version"])
# Share document with all active users so everyone can find it in Document Management
for user in users:
DocumentShare.objects.get_or_create(
document=doc,
user=user,
defaults={"permission": ManagedDocument.PERMISSION_VIEW}
)
self.stdout.write(
self.style.SUCCESS(
f"Document d'exemple IFC disponible dans le dossier 'Maquettes 3D (BIM)' (UUID: {doc.uuid}) - Partagé avec {users.count()} utilisateurs."
)
)