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

152 lines
11 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 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')),
],
),
]