233 lines
15 KiB
Python
233 lines
15 KiB
Python
# 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')},
|
|
},
|
|
),
|
|
]
|