# 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 observations.models from django.conf import settings from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ('assets', '0003_initial'), ('interventions', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='ObservationAttributeChoice', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('value', models.CharField(help_text='Valeur technique stockée (ne pas modifier après création)', max_length=100, verbose_name='Valeur (clé)')), ('label_fr', models.CharField(max_length=255, verbose_name='Label (FR)')), ('label_nl', models.CharField(blank=True, max_length=255, null=True, verbose_name='Label (NL)')), ('bootstrap_icon', models.CharField(blank=True, help_text='Ex: bi-check-circle, bi-x-circle, bi-dash-circle', max_length=50, null=True, verbose_name='Icône Bootstrap')), ('bootstrap_color', models.CharField(choices=[('primary', 'Primary'), ('secondary', 'Secondary'), ('success', 'Success'), ('danger', 'Danger'), ('warning', 'Warning'), ('info', 'Info'), ('light', 'Light'), ('dark', 'Dark')], default='primary', max_length=20, verbose_name='Couleur Bootstrap')), ('image', models.ImageField(blank=True, help_text='Image optionnelle pour représenter ce choix (pour usage mobile)', null=True, upload_to=observations.models.attribute_choice_image_upload_path, verbose_name='Image')), ('order', models.PositiveIntegerField(default=0, verbose_name='Ordre')), ('is_active', models.BooleanField(default=True, verbose_name='Actif')), ], options={ 'verbose_name': "Choix d'attribut", 'verbose_name_plural': "Choix d'attributs", 'ordering': ['choice_set', 'order'], }, ), migrations.CreateModel( name='ObservationAttributeChoiceSet', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=255, unique=True, verbose_name='Nom')), ('description', models.TextField(blank=True, null=True, verbose_name='Description')), ('is_active', models.BooleanField(default=True, verbose_name='Actif')), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ], options={ 'verbose_name': "Ensemble de choix d'attribut", 'verbose_name_plural': "Ensembles de choix d'attributs", 'ordering': ['name'], }, ), migrations.CreateModel( name='ObservationChecklistResponse', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('value_boolean', models.BooleanField(blank=True, null=True, verbose_name='Valeur (Oui/Non)')), ('value_text', models.TextField(blank=True, null=True, verbose_name='Valeur (Texte)')), ('value_number', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='Valeur (Nombre)')), ('value_choice', models.CharField(blank=True, max_length=255, null=True, verbose_name='Valeur (Choix simple)')), ('value_choices', models.JSONField(blank=True, help_text='Liste des clés de choix sélectionnées', null=True, verbose_name='Valeurs (Choix multiples)')), ('comment', models.TextField(blank=True, null=True, verbose_name='Commentaire')), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ], options={ 'verbose_name': 'Réponse de checklist', 'verbose_name_plural': 'Réponses de checklist', 'ordering': ['observation', 'checklist_item__order'], }, ), migrations.CreateModel( name='ObservationComment', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('comment', models.TextField()), ('created_at', models.DateTimeField(auto_now_add=True)), ], ), migrations.CreateModel( name='ObservationPhoto', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('photo', models.ImageField(storage=common.storages.PrivateMediaStorage(), upload_to=observations.models.observation_photo_upload_path)), ('thumbnail', models.ImageField(blank=True, max_length=255, null=True, storage=common.storages.PrivateMediaStorage(), upload_to=observations.models.observation_photo_upload_path, verbose_name='Miniature')), ], ), migrations.CreateModel( name='ChecklistTemplate', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name_fr', models.CharField(max_length=255, verbose_name='Nom (FR)')), ('name_nl', models.CharField(blank=True, max_length=255, null=True, verbose_name='Nom (NL)')), ('description', models.TextField(blank=True, null=True, verbose_name='Description')), ('observation_type', models.CharField(choices=[('incident', 'Incident'), ('inventory', 'Inventaire'), ('remark', 'Remarque')], default='inventory', max_length=20, verbose_name="Type d'observation")), ('is_active', models.BooleanField(default=True, verbose_name='Actif')), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='checklist_templates', to='assets.assetcategory', verbose_name="Catégorie d'asset")), ], options={ 'verbose_name': 'Template de checklist', 'verbose_name_plural': 'Templates de checklist', 'ordering': ['category', 'name_fr'], }, ), migrations.CreateModel( name='ChecklistItem', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name_fr', models.CharField(max_length=255, verbose_name='Nom (FR)')), ('name_nl', models.CharField(blank=True, max_length=255, null=True, verbose_name='Nom (NL)')), ('description_fr', models.TextField(blank=True, null=True, verbose_name='Description (FR)')), ('description_nl', models.TextField(blank=True, null=True, verbose_name='Description (NL)')), ('item_type', models.CharField(choices=[('boolean', 'Oui/Non'), ('text', 'Texte libre'), ('number', 'Nombre'), ('choice', 'Choix simple'), ('choice_multiple', 'Choix multiple')], default='boolean', max_length=20, verbose_name='Type de réponse')), ('choices_fr', models.TextField(blank=True, help_text='Alternative aux ensembles de choix. Ex: Bon,Moyen,Mauvais', null=True, verbose_name='Options FR (séparées par des virgules)')), ('choices_nl', models.TextField(blank=True, help_text='Alternative aux ensembles de choix. Ex: Goed,Gemiddeld,Slecht', null=True, verbose_name='Options NL (séparées par des virgules)')), ('choices_icons', models.TextField(blank=True, help_text='Icônes pour chaque option. Ex: bi-check-circle,bi-dash-circle,bi-x-circle', null=True, verbose_name='Icônes Bootstrap (séparées par des virgules)')), ('choices_colors', models.TextField(blank=True, help_text='Couleurs pour chaque option. Ex: success,warning,danger (défaut: primary)', null=True, verbose_name='Couleurs Bootstrap (séparées par des virgules)')), ('is_required', models.BooleanField(default=False, verbose_name='Obligatoire')), ('order', models.PositiveIntegerField(default=0, verbose_name="Ordre d'affichage")), ('template', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='items', to='observations.checklisttemplate', verbose_name='Template')), ], options={ 'verbose_name': 'Élément de checklist', 'verbose_name_plural': 'Éléments de checklist', 'ordering': ['template', 'order', 'name_fr'], }, ), migrations.CreateModel( name='Observation', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('code', models.CharField(blank=True, max_length=20, null=True, unique=True, verbose_name='Code')), ('description', models.TextField(blank=True, null=True)), ('latitude', models.FloatField()), ('longitude', models.FloatField()), ('address', models.CharField(blank=True, max_length=1024, null=True)), ('created_at', models.DateTimeField(auto_now_add=True)), ('observation_type', models.CharField(choices=[('incident', 'Incident'), ('inventory', 'Inventaire'), ('remark', 'Remarque')], default='incident', max_length=20)), ('geom', django.contrib.gis.db.models.fields.PointField(blank=True, null=True, srid=3812)), ('status', models.CharField(choices=[('in_preparation', 'En préparation'), ('to_process', 'À traiter'), ('in_progress', 'En cours'), ('processed', 'Traité'), ('not_relevant', 'Non relevant'), ('to_redirect', 'À rediriger'), ('duplicate', 'Doublon'), ('archived', 'Archivé')], default='in_preparation', max_length=20)), ('category', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='observations', to='assets.assetcategory')), ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='observations', to=settings.AUTH_USER_MODEL)), ('intervention', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='observations', to='interventions.intervention')), ], ), ]