# Generated by Django 6.0.7 on 2026-07-22 13:42 import common.storages import django.contrib.gis.db.models.fields import django.db.models.deletion import projects.models from django.conf import settings from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ('common', '0004_initial'), ('contenttypes', '0002_remove_content_type_name'), ('contracts', '0001_initial'), ('documents', '0001_initial'), ('interventions', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='ProjectAttributeChoiceSet', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name_fr', models.CharField(max_length=100, verbose_name='Nom (FR)')), ('name_nl', models.CharField(blank=True, max_length=100, null=True, verbose_name='Nom (NL)')), ], options={ 'verbose_name': 'Ensemble de choix', 'verbose_name_plural': 'Ensembles de choix', 'ordering': ['name_fr'], }, ), migrations.CreateModel( name='ProjectSequence', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('current_number', models.PositiveIntegerField(default=0)), ], ), migrations.CreateModel( name='ProjectTag', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name_fr', models.CharField(max_length=100, unique=True, verbose_name='Nom')), ('name_nl', models.CharField(blank=True, max_length=100, null=True, unique=True, verbose_name='Nom (NL)')), ('slug', models.SlugField(max_length=120, unique=True)), ('order', models.PositiveSmallIntegerField(default=0)), ], options={ 'verbose_name': 'Tag de projet', 'verbose_name_plural': 'Tags de projet', 'ordering': ['order', 'name_fr'], }, ), migrations.CreateModel( name='ProjectTemplate', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name_fr', models.CharField(max_length=200, verbose_name='Nom (FR)')), ('name_nl', models.CharField(blank=True, max_length=200, null=True, verbose_name='Nom (NL)')), ('description', models.TextField(blank=True, null=True, verbose_name='Description')), ('is_active', models.BooleanField(default=True, verbose_name='Actif')), ], options={ 'verbose_name': 'Template de projet', 'verbose_name_plural': 'Templates de projet', 'ordering': ['name_fr'], }, ), migrations.CreateModel( name='Project', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('code', models.CharField(blank=True, max_length=50, unique=True)), ('name', models.CharField(max_length=255, verbose_name='Nom')), ('description', models.TextField(blank=True, null=True, verbose_name='Description')), ('start_date', models.DateField(blank=True, null=True, verbose_name='Date de début')), ('end_date', models.DateField(blank=True, null=True, verbose_name='Date de fin')), ('pmo_number', models.IntegerField(blank=True, null=True, verbose_name='Numéro PMO')), ('osiris_number', models.IntegerField(blank=True, null=True, verbose_name='Numéro OSIRIS')), ('status', models.CharField(choices=[('in_preparation', 'En préparation'), ('planned', 'Planifié'), ('in_progress', 'En cours'), ('finished', 'Terminé'), ('invoiced', 'Comptabilisé'), ('closed', 'Clôturé'), ('canceled', 'Annulé')], default='in_preparation', verbose_name='Statut')), ('geom', django.contrib.gis.db.models.fields.PolygonField(blank=True, null=True, srid=3812)), ('strict_access', models.BooleanField(default=False, help_text="Si coché, seuls les utilisateurs et équipes explicitement mentionnés peuvent accéder à ce projet. Les permissions par thématique ne s'appliquent pas.", verbose_name='Accès strict')), ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='created_projects', to=settings.AUTH_USER_MODEL)), ('thematics', models.ManyToManyField(blank=True, related_name='projects', to='common.thematic', verbose_name='Thématiques')), ('tags', models.ManyToManyField(blank=True, related_name='projects', to='projects.projecttag', verbose_name='Tags')), ('templates', models.ManyToManyField(blank=True, related_name='projects', to='projects.projecttemplate', verbose_name='Templates')), ], options={ 'ordering': ['-code'], }, ), migrations.CreateModel( name='ProjectAsset', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('object_id', models.PositiveIntegerField()), ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.contenttype')), ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='assets', to='projects.project')), ], ), migrations.CreateModel( name='ProjectDocument', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('description', models.TextField(blank=True, null=True, verbose_name='Description du document')), ('status', models.CharField(choices=[('active', 'Actif'), ('archived', 'Archivé')], default='active')), ('file', models.FileField(max_length=255, storage=common.storages.PrivateMediaStorage(), upload_to=projects.models.project_document_upload_path, verbose_name='Fichier')), ('thumbnail', models.ImageField(blank=True, max_length=255, null=True, storage=common.storages.PrivateMediaStorage(), upload_to=projects.models.project_document_upload_path)), ('upload_date', models.DateTimeField(auto_now_add=True, null=True, verbose_name="Date d'upload")), ('managed_document', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(app_label)s_%(class)s_sources', to='documents.manageddocument')), ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='documents', to='projects.project', verbose_name='Projet associé')), ('uploaded_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='uploaded_project_documents', to=settings.AUTH_USER_MODEL)), ], options={ 'ordering': ['upload_date'], 'abstract': False, }, ), migrations.CreateModel( name='ProjectPhase', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=255)), ('description', models.TextField(blank=True, null=True)), ('start_date', models.DateField(blank=True, null=True)), ('end_date', models.DateField(blank=True, null=True)), ('contract', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='projects_phases', to='contracts.contract')), ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='phases', to='projects.project')), ], ), migrations.CreateModel( name='ProjectIntervention', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('row_number', models.IntegerField(blank=True, null=True)), ('intervention', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='interventions.intervention')), ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='interventions', to='projects.project')), ('phase', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='interventions', to='projects.projectphase')), ], ), migrations.CreateModel( name='ProjectTemplateAttribute', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name_fr', models.CharField(max_length=200, verbose_name='Nom (FR)')), ('name_nl', models.CharField(blank=True, max_length=200, null=True, verbose_name='Nom (NL)')), ('help_text_fr', models.CharField(blank=True, max_length=500, null=True, verbose_name="Texte d'aide (FR)")), ('help_text_nl', models.CharField(blank=True, max_length=500, null=True, verbose_name="Texte d'aide (NL)")), ('attribute_type', models.CharField(choices=[('text', 'Texte'), ('number', 'Nombre'), ('boolean', 'Booléen (Oui/Non)'), ('choice', 'Sélection'), ('choice_multiple', 'Sélection multiple'), ('date', 'Date')], max_length=20, verbose_name='Type')), ('is_required', models.BooleanField(default=False, verbose_name='Obligatoire')), ('order', models.PositiveSmallIntegerField(default=0, verbose_name='Ordre')), ('choice_set', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='template_attributes', to='projects.projectattributechoiceset', verbose_name='Ensemble de choix')), ('template', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='attributes', to='projects.projecttemplate')), ], options={ 'verbose_name': 'Attribut de template', 'verbose_name_plural': 'Attributs de template', 'ordering': ['order', 'name_fr'], }, ), migrations.CreateModel( name='ProjectAttributeChoice', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('value', models.CharField(max_length=100, verbose_name='Valeur (clé)')), ('label_fr', models.CharField(max_length=200, verbose_name='Label (FR)')), ('label_nl', models.CharField(blank=True, max_length=200, null=True, verbose_name='Label (NL)')), ('order', models.PositiveSmallIntegerField(default=0, verbose_name='Ordre')), ('choice_set', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='choices', to='projects.projectattributechoiceset')), ], options={ 'verbose_name': 'Choix', 'verbose_name_plural': 'Choix', 'ordering': ['order', 'label_fr'], 'unique_together': {('choice_set', 'value')}, }, ), migrations.CreateModel( name='ProjectTeamAccess', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('can_view', models.BooleanField(default=False, help_text="L'équipe peut voir ce projet.", verbose_name='Peut consulter')), ('can_edit', models.BooleanField(default=False, help_text="L'équipe peut modifier ce projet.", verbose_name='Peut éditer')), ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='team_accesses', to='projects.project', verbose_name='Projet')), ('team', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='project_accesses', to='contracts.companyteam', verbose_name='Équipe')), ], options={ 'verbose_name': 'Accès équipe au projet', 'verbose_name_plural': 'Accès équipes aux projets', 'unique_together': {('project', 'team')}, }, ), migrations.CreateModel( name='ProjectAttributeValue', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('value_text', models.TextField(blank=True, null=True)), ('value_number', models.DecimalField(blank=True, decimal_places=6, max_digits=20, null=True)), ('value_boolean', models.BooleanField(blank=True, null=True)), ('value_choice', models.CharField(blank=True, max_length=100, null=True)), ('value_choices', models.JSONField(blank=True, null=True)), ('value_date', models.DateField(blank=True, null=True)), ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='attribute_values', to='projects.project')), ('attribute', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='values', to='projects.projecttemplateattribute')), ], options={ 'verbose_name': "Valeur d'attribut", 'verbose_name_plural': "Valeurs d'attribut", 'unique_together': {('project', 'attribute')}, }, ), migrations.CreateModel( name='ProjectUserAccess', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('can_view', models.BooleanField(default=False, help_text="L'utilisateur peut voir ce projet.", verbose_name='Peut consulter')), ('can_edit', models.BooleanField(default=False, help_text="L'utilisateur peut modifier ce projet.", verbose_name='Peut éditer')), ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='user_accesses', to='projects.project', verbose_name='Projet')), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='project_direct_accesses', to=settings.AUTH_USER_MODEL, verbose_name='Utilisateur')), ], options={ 'verbose_name': 'Accès direct utilisateur au projet', 'verbose_name_plural': 'Accès directs utilisateurs aux projets', 'unique_together': {('project', 'user')}, }, ), ]