# 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 sign.models from django.conf import settings from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ('assets', '0002_initial'), ('common', '0002_initial'), ('documents', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='Organization', 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(max_length=255, verbose_name='Nom (NL)')), ('code', models.CharField(max_length=100, unique=True, verbose_name='Code')), ('organization_type', models.CharField(choices=[('municipality', 'Commune'), ('region', 'Région'), ('administration', 'Administration'), ('other', 'Autre')], default='municipality', max_length=50, verbose_name="Type d'organisation")), ('description', models.TextField(blank=True, null=True, verbose_name='Description')), ('contact_email', models.EmailField(blank=True, max_length=254, null=True, verbose_name='Email de contact')), ('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': 'Organisation', 'verbose_name_plural': 'Organisations', 'ordering': ['name_fr'], }, ), migrations.CreateModel( name='SignPanelType', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('code', models.CharField(max_length=100, unique=True)), ('name_fr', models.CharField(max_length=200)), ('name_nl', models.CharField(max_length=200)), ('description', models.TextField(blank=True, null=True)), ('sgv_picture', models.ImageField(blank=True, null=True, upload_to='sign/signpanels_types/')), ('default_width', models.FloatField(blank=True, null=True, verbose_name='Largeur par défaut (cm)')), ('default_height', models.FloatField(blank=True, null=True, verbose_name='Hauteur par défaut (cm)')), ('default_diameter', models.FloatField(blank=True, null=True, verbose_name='Diamètre par défaut (cm)')), ], ), migrations.CreateModel( name='ComplementaryPoliceRegulation', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=255)), ('description', models.TextField(blank=True, null=True)), ('reference', models.CharField(max_length=100)), ('status', models.CharField(blank=True, choices=[('in_preparation', 'En préparation'), ('to_be_approved', 'À approuver'), ('approved', 'Approuvé'), ('expired', 'Expiré'), ('archived', 'Archivé')], default='in_preparation', max_length=50, null=True)), ('decision_date', models.DateField(blank=True, null=True)), ('file', models.FileField(max_length=255, storage=common.storages.PrivateMediaStorage(), upload_to=sign.models.upload_to_police_regulation, verbose_name='Fichier')), ('thumbnail', models.ImageField(blank=True, max_length=255, null=True, storage=common.storages.PrivateMediaStorage(), upload_to=sign.models.upload_to_police_regulation)), ('text_introduction_fr', models.TextField(blank=True, null=True, verbose_name='Introduction (FR)')), ('text_introduction_nl', models.TextField(blank=True, null=True, verbose_name='Introduction (NL)')), ('text_abrogations_fr', models.TextField(blank=True, null=True, verbose_name='Abrogations (FR)')), ('text_abrogations_nl', models.TextField(blank=True, null=True, verbose_name='Abrogations (NL)')), ('text_dispositions_finales_fr', models.TextField(blank=True, null=True, verbose_name='Dispositions finales (FR)')), ('text_dispositions_finales_nl', models.TextField(blank=True, null=True, verbose_name='Dispositions finales (NL)')), ('text_nouvelles_dispositions_fr', models.TextField(blank=True, null=True, verbose_name='Nouvelles dispositions – notes (FR)')), ('text_nouvelles_dispositions_nl', models.TextField(blank=True, null=True, verbose_name='Nouvelles dispositions – notes (NL)')), ('uploaded_at', models.DateTimeField(auto_now_add=True)), ('uploaded_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='uploaded_complementary_police_regulations_sign', to=settings.AUTH_USER_MODEL, verbose_name='Ajouté par')), ('organization', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='sign_app_regulations', to='sign.organization')), ], options={ 'ordering': ['-decision_date', 'reference', 'title'], }, ), migrations.CreateModel( name='RegulationArticle', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('article_id', models.CharField(db_index=True, help_text='Ex: Art.1.1.1', max_length=50, verbose_name='Identifiant article')), ('article_number', models.CharField(blank=True, max_length=20, verbose_name="Numéro d'article")), ('text_fr', models.TextField(verbose_name='Texte FR')), ('text_nl', models.TextField(blank=True, verbose_name='Texte NL')), ('level', models.PositiveSmallIntegerField(default=1, verbose_name='Niveau')), ('ordering', models.PositiveIntegerField(db_index=True, default=0, verbose_name='Ordre')), ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='children', to='sign.regulationarticle', verbose_name='Article parent')), ('regulation', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='custom_articles', to='sign.complementarypoliceregulation', verbose_name='Règlement (sous-article spécifique)')), ], options={ 'verbose_name': 'Article de règlement', 'verbose_name_plural': 'Articles de règlement', 'ordering': ['ordering', 'article_id'], }, ), migrations.AddField( model_name='complementarypoliceregulation', name='selected_abrogation_articles', field=models.ManyToManyField(blank=True, related_name='abrogation_article_regulations', to='sign.regulationarticle', verbose_name='Articles abrogés sélectionnés'), ), migrations.AddField( model_name='complementarypoliceregulation', name='selected_articles', field=models.ManyToManyField(blank=True, related_name='regulations', to='sign.regulationarticle', verbose_name='Articles sélectionnés'), ), migrations.CreateModel( name='RegulationArticleVoirie', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('section', models.CharField(choices=[('nouvelle_disposition', 'Nouvelle disposition'), ('abrogation', 'Abrogation')], default='nouvelle_disposition', max_length=25, verbose_name='Section')), ('text_fr', models.TextField(blank=True, verbose_name='Description voirie (FR)')), ('text_nl', models.TextField(blank=True, verbose_name='Description voirie (NL)')), ('ordering', models.PositiveIntegerField(db_index=True, default=0, verbose_name='Ordre')), ('article', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='voiries', to='sign.regulationarticle', verbose_name='Article')), ('regulation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='article_voiries', to='sign.complementarypoliceregulation', verbose_name='Règlement')), ], options={ 'verbose_name': "Voirie d'article de règlement", 'verbose_name_plural': "Voiries d'articles de règlement", 'ordering': ['ordering', 'id'], }, ), migrations.CreateModel( name='SignPanel', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('code', models.CharField(max_length=50)), ('name_fr', models.CharField(blank=True, max_length=200, null=True)), ('name_nl', models.CharField(blank=True, max_length=200, null=True)), ('status', models.CharField(choices=[('to_be_approved', 'À approuver'), ('planned', 'Planifié'), ('active', 'Actif'), ('damaged', 'Endommagé'), ('to_replace', 'A remplacer'), ('voluntarily_out_of_service', 'Mis hors service volontairement'), ('removed', 'Enlevé'), ('archived', 'Archivé')], default='active', max_length=50)), ('obsolescence', models.CharField(blank=True, choices=[('good', 'Bon état'), ('medium', 'Moyen'), ('bad', 'Dégradé'), ('critical', 'Critique'), ('unknown', 'Inconnu')], default='unknown', null=True)), ('installation_date', models.DateTimeField(blank=True, null=True)), ('uninstallation_date', models.DateTimeField(blank=True, null=True)), ('serial_number', models.CharField(blank=True, max_length=200, null=True)), ('warranty_duration', models.IntegerField(blank=True, null=True, verbose_name='Duration of the warranty (months)')), ('last_inspection_date', models.DateTimeField(blank=True, null=True)), ('last_preventive_date', models.DateTimeField(blank=True, null=True)), ('last_corrective_date', models.DateTimeField(blank=True, null=True)), ('last_survey_date', models.DateTimeField(blank=True, null=True)), ('brand', models.CharField(blank=True, max_length=500, null=True)), ('marked_as_removed_date', models.DateTimeField(blank=True, null=True, verbose_name='Date de marquage comme retiré')), ('note', models.TextField(blank=True, null=True, verbose_name='Note')), ('validation_status', models.CharField(blank=True, choices=[('to_be_validated', 'À valider'), ('validated', 'Validé'), ('to_be_completed', 'À compléter'), ('rejected', 'Rejeté')], max_length=50, null=True, verbose_name='Statut de validation')), ('updated_at', models.DateTimeField(auto_now=True)), ('lon', models.FloatField(blank=True, null=True)), ('lat', models.FloatField(blank=True, null=True)), ('geom', django.contrib.gis.db.models.fields.PointField(blank=True, null=True, srid=3812)), ('geojson', models.TextField(blank=True, null=True)), ('vertical_order', models.IntegerField(blank=True, null=True)), ('signpanel_text', models.CharField(blank=True, choices=[('pole', 'Poteau'), ('lightingpole', "Poteau d'éclairage"), ('trafficlightpole', 'Poteau de signalisation lumineuse'), ('facade', 'Façade'), ('mast', 'Mât'), ('portico', 'Portique'), ('gallows', 'Potence'), ('hopper', 'Trémie'), ('other', 'Autre')], max_length=1000, null=True)), ('signpanel_value', models.FloatField(blank=True, null=True)), ('orientation', models.IntegerField(blank=True, help_text='Orientation en degrés (0-360)', null=True)), ('support_type', models.CharField(blank=True, choices=[('pole', 'Poteau'), ('lightingpole', "Poteau d'éclairage"), ('trafficlightpole', 'Poteau de signalisation lumineuse'), ('facade', 'Façade'), ('mast', 'Mât'), ('portico', 'Portique'), ('gallows', 'Potence'), ('hopper', 'Trémie'), ('other', 'Autre')], max_length=200, null=True)), ('is_temporary', models.BooleanField(default=False)), ('width', models.FloatField(blank=True, help_text='Largeur ou diamètre du panneau en centimètres. Par défaut: 50 cm', null=True, verbose_name='Largeur du panneau (cm)')), ('height', models.FloatField(blank=True, help_text='Hauteur du panneau en centimètres. Par défaut: égal à la largeur', null=True, verbose_name='Hauteur du panneau (cm)')), ('category', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='sign_app_panels', to='assets.assetcategory')), ('marked_as_removed_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(app_label)s_%(class)s_marked_as_removed', to=settings.AUTH_USER_MODEL, verbose_name='Marqué comme retiré par')), ('organization', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='sign_app_panels', to='sign.organization')), ('replaced_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='replaces', to='sign.signpanel', verbose_name='Remplacé par')), ('street', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='sign_app_panels', to='common.adrstreet')), ('updated_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(app_label)s_%(class)s_updated_by', to=settings.AUTH_USER_MODEL, verbose_name='Mis à jour par')), ], ), migrations.CreateModel( name='RegulationMeasurePanel', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('section', models.CharField(choices=[('nouvelle_disposition', 'Nouvelle disposition'), ('abrogation', 'Abrogation')], default='nouvelle_disposition', max_length=25, verbose_name='Section')), ('article', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='measure_panels', to='sign.regulationarticle', verbose_name='Article / Mesure')), ('regulation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='measure_panels', to='sign.complementarypoliceregulation', verbose_name='Règlement')), ('panel', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='regulation_measures', to='sign.signpanel', verbose_name='Panneau')), ], options={ 'verbose_name': "Panneau d'une mesure de règlement", 'verbose_name_plural': 'Panneaux de mesures de règlement', 'ordering': ['regulation', 'article__ordering', 'panel__code'], }, ), migrations.AddField( model_name='complementarypoliceregulation', name='abrogated_panels', field=models.ManyToManyField(blank=True, related_name='abrogation_regulations', to='sign.signpanel', verbose_name='Panneaux abrogés'), ), migrations.AddField( model_name='complementarypoliceregulation', name='panels', field=models.ManyToManyField(blank=True, related_name='sign_app_regulations', to='sign.signpanel'), ), migrations.CreateModel( name='SignPanelModel', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('code', models.CharField(max_length=50)), ('name_fr', models.CharField(blank=True, max_length=200, null=True)), ('name_nl', models.CharField(blank=True, max_length=200, null=True)), ('description', models.TextField(blank=True, null=True)), ('brand', models.CharField(blank=True, max_length=500, null=True)), ('shape', models.CharField(blank=True, max_length=200, null=True)), ('color', models.CharField(blank=True, max_length=200, null=True)), ('ral', models.CharField(blank=True, max_length=200, null=True)), ('height', models.FloatField(blank=True, null=True)), ('width', models.FloatField(blank=True, null=True)), ('diameter', models.FloatField(blank=True, null=True)), ('material', models.CharField(blank=True, max_length=200, null=True)), ('reflective', models.BooleanField(default=False)), ('illuminated', models.BooleanField(default=False)), ('dynamic', models.BooleanField(default=False)), ('category', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='sign_app_panel_models', to='assets.assetcategory')), ], options={ 'verbose_name': 'Modèle de panneau (Sign)', 'verbose_name_plural': 'Modèles de panneaux (Sign)', }, ), migrations.AddField( model_name='signpanel', name='model', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='sign.signpanelmodel'), ), migrations.AddField( model_name='signpanel', name='signpanel_type', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='sign.signpaneltype'), ), migrations.CreateModel( name='SignPanelTypeArticle', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('article', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='panel_types', to='sign.regulationarticle', verbose_name='Article de règlement')), ('panel_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='regulation_articles', to='sign.signpaneltype', verbose_name='Type de panneau')), ], options={ 'verbose_name': 'Article applicable à un type de panneau', 'verbose_name_plural': 'Articles applicables aux types de panneaux', 'ordering': ['panel_type__code', 'article__ordering'], }, ), migrations.CreateModel( name='SignPole', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('code', models.CharField(max_length=50)), ('name_fr', models.CharField(blank=True, max_length=200, null=True)), ('name_nl', models.CharField(blank=True, max_length=200, null=True)), ('status', models.CharField(choices=[('to_be_approved', 'À approuver'), ('planned', 'Planifié'), ('active', 'Actif'), ('damaged', 'Endommagé'), ('to_replace', 'A remplacer'), ('voluntarily_out_of_service', 'Mis hors service volontairement'), ('removed', 'Enlevé'), ('archived', 'Archivé')], default='active', max_length=50)), ('obsolescence', models.CharField(blank=True, choices=[('good', 'Bon état'), ('medium', 'Moyen'), ('bad', 'Dégradé'), ('critical', 'Critique'), ('unknown', 'Inconnu')], default='unknown', null=True)), ('installation_date', models.DateTimeField(blank=True, null=True)), ('uninstallation_date', models.DateTimeField(blank=True, null=True)), ('serial_number', models.CharField(blank=True, max_length=200, null=True)), ('warranty_duration', models.IntegerField(blank=True, null=True, verbose_name='Duration of the warranty (months)')), ('last_inspection_date', models.DateTimeField(blank=True, null=True)), ('last_preventive_date', models.DateTimeField(blank=True, null=True)), ('last_corrective_date', models.DateTimeField(blank=True, null=True)), ('last_survey_date', models.DateTimeField(blank=True, null=True)), ('brand', models.CharField(blank=True, max_length=500, null=True)), ('marked_as_removed_date', models.DateTimeField(blank=True, null=True, verbose_name='Date de marquage comme retiré')), ('note', models.TextField(blank=True, null=True, verbose_name='Note')), ('validation_status', models.CharField(blank=True, choices=[('to_be_validated', 'À valider'), ('validated', 'Validé'), ('to_be_completed', 'À compléter'), ('rejected', 'Rejeté')], max_length=50, null=True, verbose_name='Statut de validation')), ('updated_at', models.DateTimeField(auto_now=True)), ('lon', models.FloatField(blank=True, null=True)), ('lat', models.FloatField(blank=True, null=True)), ('geom', django.contrib.gis.db.models.fields.PointField(blank=True, null=True, srid=3812)), ('geojson', models.TextField(blank=True, null=True)), ('orientation', models.IntegerField(blank=True, default=90, help_text='Orientation en degrés (0-360)', null=True)), ('category', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='sign_app_poles', to='assets.assetcategory')), ('marked_as_removed_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(app_label)s_%(class)s_marked_as_removed', to=settings.AUTH_USER_MODEL, verbose_name='Marqué comme retiré par')), ('organization', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='sign_app_poles', to='sign.organization')), ('replaced_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='replaces', to='sign.signpole', verbose_name='Remplacé par')), ('street', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='sign_app_poles', to='common.adrstreet')), ('updated_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(app_label)s_%(class)s_updated_by', to=settings.AUTH_USER_MODEL, verbose_name='Mis à jour par')), ], ), migrations.AddField( model_name='signpanel', name='pole', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='sign_app_panels', to='sign.signpole'), ), migrations.CreateModel( name='SignPoleModel', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('code', models.CharField(max_length=50)), ('name_fr', models.CharField(blank=True, max_length=200, null=True)), ('name_nl', models.CharField(blank=True, max_length=200, null=True)), ('description', models.TextField(blank=True, null=True)), ('brand', models.CharField(blank=True, max_length=500, null=True)), ('color', models.CharField(blank=True, max_length=200, null=True)), ('ral', models.CharField(blank=True, max_length=200, null=True)), ('height', models.FloatField(blank=True, null=True)), ('diameter', models.FloatField(blank=True, null=True)), ('material', models.CharField(blank=True, max_length=200, null=True)), ('galvanized', models.BooleanField(default=False)), ('category', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='sign_app_pole_models', to='assets.assetcategory')), ], options={ 'verbose_name': 'Modèle de poteau (Sign)', 'verbose_name_plural': 'Modèles de poteaux (Sign)', }, ), migrations.AddField( model_name='signpole', name='model', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='sign.signpolemodel'), ), migrations.CreateModel( name='SignStreet', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('code', models.CharField(max_length=50)), ('name_fr', models.CharField(blank=True, max_length=200, null=True)), ('name_nl', models.CharField(blank=True, max_length=200, null=True)), ('lon', models.FloatField(blank=True, null=True)), ('lat', models.FloatField(blank=True, null=True)), ('geojson', models.TextField(blank=True, null=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('geom', django.contrib.gis.db.models.fields.MultiPolygonField(blank=True, null=True, srid=3812)), ('road_code', models.CharField(blank=True, max_length=50, null=True)), ('section_code', models.CharField(blank=True, max_length=50, null=True)), ('street_level', models.CharField(blank=True, max_length=50, null=True)), ('municipality', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='sign_app_streets', to='common.municipality')), ('updated_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(app_label)s_%(class)s_location_updated_by', to=settings.AUTH_USER_MODEL, verbose_name='Mis à jour par')), ], options={ 'ordering': ['code'], 'abstract': False, }, ), migrations.CreateModel( name='SignStreetDocument', 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')), ('upload_date', models.DateTimeField(auto_now=True, verbose_name='Date de téléversement')), ('status', models.CharField(choices=[('active', 'Actif'), ('archived', 'Archivé')], default='active')), ('file', models.FileField(max_length=255, storage=common.storages.PrivateMediaStorage(), upload_to=sign.models.upload_to_signstreet, verbose_name='Fichier')), ('thumbnail', models.ImageField(blank=True, max_length=255, null=True, storage=common.storages.PrivateMediaStorage(), upload_to=sign.models.upload_to_signstreet)), ('document_type', models.CharField(choices=[('as_built', 'As Built'), ('other', 'Autre')], default='other', max_length=50, verbose_name='Type de document')), ('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')), ('organization', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='sign_street_documents', to='sign.organization')), ('street', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='documents', to='sign.signstreet', verbose_name='Associated Street')), ('uploaded_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='uploaded_sign_street_documents_sign', to=settings.AUTH_USER_MODEL, verbose_name='Ajouté par')), ], options={ 'ordering': ['upload_date'], 'abstract': False, }, ), migrations.AddConstraint( model_name='regulationarticle', constraint=models.UniqueConstraint(condition=models.Q(('regulation', None)), fields=('article_id',), name='sign_regulationarticle_global_unique_article_id'), ), migrations.AlterUniqueTogether( name='regulationmeasurepanel', unique_together={('regulation', 'article', 'section', 'panel')}, ), migrations.AlterUniqueTogether( name='signpaneltypearticle', unique_together={('panel_type', 'article')}, ), migrations.AddIndex( model_name='signpanel', index=models.Index(fields=['code'], name='sign_signpa_code_65ed88_idx'), ), migrations.AddIndex( model_name='signpole', index=models.Index(fields=['code'], name='sign_signpo_code_16a79b_idx'), ), ]