loko/streetup/projects/migrations/0001_initial.py
2026-07-22 14:48:40 +02:00

233 lines
15 KiB
Python

# Generated by Django 5.2.8 on 2026-05-21 13:51
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', '0003_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')},
},
),
]