# Generated by Django 5.0.14 on 2026-02-04 22:11

import django.db.models.deletion
import image_factory.models
import traduction.mixins
from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
        ('config', '0001_initial'),
        ('contenttypes', '0002_remove_content_type_name'),
    ]

    operations = [
        migrations.CreateModel(
            name='Keyword',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('name', models.CharField(max_length=100, unique=True, verbose_name='Mot-cle')),
                ('slug', models.SlugField(blank=True, max_length=100, unique=True, verbose_name='Slug')),
                ('description', models.TextField(blank=True, verbose_name='Description')),
            ],
            options={
                'verbose_name': 'Mot-cle',
                'verbose_name_plural': 'Mots-cles',
                'ordering': ['name'],
            },
        ),
        migrations.CreateModel(
            name='Menu',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('active', models.BooleanField(default=True, verbose_name='Active')),
                ('name', models.CharField(max_length=100, verbose_name='Nom')),
                ('slug', models.SlugField(blank=True, max_length=100, unique=True, verbose_name='Slug')),
                ('location', models.CharField(choices=[('header', 'En-tete'), ('footer', 'Pied de page'), ('sidebar', 'Barre laterale'), ('topbar', 'Barre superieure')], default='header', max_length=20, verbose_name='Emplacement')),
            ],
            options={
                'verbose_name': 'Menu',
                'verbose_name_plural': 'Menus',
                'ordering': ['name'],
            },
        ),
        migrations.CreateModel(
            name='Page',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('name', models.CharField(max_length=100, verbose_name='Nom')),
                ('slug', models.SlugField(blank=True, max_length=100, unique=True, verbose_name='Slug')),
                ('title', models.CharField(max_length=255, verbose_name='Titre')),
                ('description', models.TextField(blank=True, verbose_name='Description')),
                ('keywords_text', models.CharField(blank=True, help_text='Separes par des virgules (ex: django, python, web). Cree automatiquement les mots-cles.', max_length=500, verbose_name='Mots-cles')),
                ('is_active', models.BooleanField(default=True, verbose_name='Active')),
                ('is_homepage', models.BooleanField(default=False, verbose_name="Page d'accueil")),
            ],
            options={
                'verbose_name': 'Page',
                'verbose_name_plural': 'Pages',
                'ordering': ['name'],
            },
            bases=(traduction.mixins.TranslatableMixin, models.Model),
        ),
        migrations.CreateModel(
            name='Section',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('image', models.ImageField(blank=True, null=True, upload_to=image_factory.models.get_image_upload_path, verbose_name='Image')),
                ('name', models.CharField(max_length=100, verbose_name='Nom')),
                ('file', models.CharField(help_text='Nom du fichier sans extension .html (cree automatiquement)', max_length=100, verbose_name='Fichier')),
                ('title', models.CharField(blank=True, max_length=255, verbose_name='Titre')),
                ('description', models.TextField(blank=True, verbose_name='Description')),
            ],
            options={
                'verbose_name': 'Section',
                'verbose_name_plural': 'Sections',
                'ordering': ['name'],
            },
            bases=(traduction.mixins.TranslatableMixin, models.Model),
        ),
        migrations.CreateModel(
            name='SettingType',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=50, verbose_name='Nom')),
                ('slug', models.SlugField(blank=True, unique=True, verbose_name='Slug')),
                ('value_type', models.CharField(choices=[('text', 'Texte'), ('textarea', 'Texte long'), ('number', 'Nombre entier'), ('decimal', 'Nombre decimal'), ('phone', 'Telephone'), ('email', 'Email'), ('url', 'URL'), ('currency', 'Devise'), ('percentage', 'Pourcentage'), ('color', 'Couleur'), ('boolean', 'Booleen (Oui/Non)'), ('image', 'Image')], default='text', help_text='Type de donnee attendu pour ce parametre', max_length=15, verbose_name='Type de valeur')),
                ('format_pattern', models.CharField(blank=True, help_text='Pattern HTML avec {value} comme placeholder. Laissez vide pour le pattern par defaut.', max_length=500, verbose_name='Pattern de formatage')),
                ('icon', models.CharField(blank=True, help_text="Classe d'icone (ex: fa-phone, fa-envelope)", max_length=50, verbose_name='Icone')),
                ('description', models.TextField(blank=True, verbose_name='Description')),
            ],
            options={
                'verbose_name': 'Type de parametre',
                'verbose_name_plural': 'Types de parametres',
                'ordering': ['name'],
            },
            bases=(traduction.mixins.TranslatableMixin, models.Model),
        ),
        migrations.CreateModel(
            name='Template',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('active', models.BooleanField(default=True, verbose_name='Active')),
                ('name', models.CharField(max_length=100, verbose_name='Nom')),
                ('slug', models.SlugField(blank=True, max_length=100, unique=True, verbose_name='Slug')),
                ('template_dir', models.CharField(help_text='Nom du repertoire (cree dans cms/templates/ et cms/static/)', max_length=100, verbose_name='Repertoire')),
                ('base_file', models.CharField(default='index.html', help_text='Fichier principal du template (ex: index.html)', max_length=100, verbose_name='Fichier de base')),
                ('description', models.TextField(blank=True, verbose_name='Description')),
            ],
            options={
                'verbose_name': 'Template',
                'verbose_name_plural': 'Templates',
                'ordering': ['name'],
            },
        ),
        migrations.CreateModel(
            name='Button',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('active', models.BooleanField(default=True, verbose_name='Active')),
                ('name', models.CharField(help_text="Nom pour identifier le bouton dans l'admin", max_length=100, verbose_name='Nom interne')),
                ('text', models.CharField(max_length=100, verbose_name='Texte du bouton')),
                ('link_type', models.CharField(choices=[('external', 'Lien externe'), ('internal', 'Page interne'), ('url', 'URL nommee')], default='external', max_length=20, verbose_name='Type de lien')),
                ('external_url', models.URLField(blank=True, help_text='URL complete (ex: https://example.com)', verbose_name='URL externe')),
                ('named_url', models.CharField(blank=True, help_text="Nom de l'URL Django (ex: 'contact:contact', 'news:list')", max_length=100, verbose_name='URL nommee')),
                ('style', models.CharField(choices=[('primary', 'Primaire (jaune)'), ('secondary', 'Secondaire (blanc)'), ('outline', 'Contour (transparent)'), ('dark', 'Sombre (fond fonce)'), ('gradient', 'Degrade'), ('ghost', 'Fantome (texte seul)'), ('success', 'Succes (vert)'), ('danger', 'Danger (rouge)')], default='primary', max_length=20, verbose_name='Style')),
                ('open_in_new_tab', models.BooleanField(default=False, verbose_name='Ouvrir dans un nouvel onglet')),
                ('icon', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='config.icon', verbose_name='Icone')),
                ('internal_page', models.ForeignKey(blank=True, help_text='Selectionner une page du site', null=True, on_delete=django.db.models.deletion.SET_NULL, to='cms.page', verbose_name='Page interne')),
            ],
            options={
                'verbose_name': 'Bouton',
                'verbose_name_plural': 'Boutons',
                'ordering': ['name'],
            },
            bases=(traduction.mixins.TranslatableMixin, models.Model),
        ),
        migrations.CreateModel(
            name='KeywordAssignment',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('object_id', models.PositiveIntegerField(verbose_name='ID objet')),
                ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.contenttype', verbose_name='Type de contenu')),
                ('keyword', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='assignments', to='cms.keyword', verbose_name='Mot-cle')),
            ],
            options={
                'verbose_name': 'Association mot-cle',
                'verbose_name_plural': 'Associations mots-cles',
                'ordering': ['keyword__name'],
            },
        ),
        migrations.CreateModel(
            name='MenuItem',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('order', models.PositiveSmallIntegerField(default=0, verbose_name='Order')),
                ('active', models.BooleanField(default=True, verbose_name='Active')),
                ('title', models.CharField(max_length=100, verbose_name='Titre')),
                ('url_type', models.CharField(choices=[('internal', 'Interne (URL nommee)'), ('external', 'Externe (URL complete)'), ('page', 'Page CMS')], default='internal', max_length=20, verbose_name="Type d'URL")),
                ('internal_url', models.CharField(blank=True, help_text="Ex: 'news:list', 'contact:contact'", max_length=100, verbose_name='URL nommee')),
                ('external_url', models.URLField(blank=True, help_text='URL complete avec https://', verbose_name='URL externe')),
                ('open_in_new_tab', models.BooleanField(default=False, verbose_name='Ouvrir dans un nouvel onglet')),
                ('icon', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='menu_items', to='config.icon', verbose_name='Icone')),
                ('menu', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='items', to='cms.menu', verbose_name='Menu')),
                ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='cms.menuitem', verbose_name='Parent')),
                ('page', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='menu_items', to='cms.page', verbose_name='Page CMS')),
            ],
            options={
                'verbose_name': 'Element de menu',
                'verbose_name_plural': 'Elements de menu',
                'ordering': ['menu', 'parent__order', 'parent__id', 'order'],
            },
            bases=(traduction.mixins.TranslatableMixin, models.Model),
        ),
        migrations.CreateModel(
            name='PageSection',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('order', models.PositiveSmallIntegerField(default=0, verbose_name='Order')),
                ('page', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cms.page', verbose_name='Page')),
                ('section', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cms.section', verbose_name='Section')),
            ],
            options={
                'verbose_name': 'Section de page',
                'verbose_name_plural': 'Sections de page',
                'ordering': ['order'],
            },
        ),
        migrations.AddField(
            model_name='page',
            name='sections',
            field=models.ManyToManyField(blank=True, related_name='pages', through='cms.PageSection', to='cms.section', verbose_name='Sections'),
        ),
        migrations.CreateModel(
            name='SectionField',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('order', models.PositiveSmallIntegerField(default=0, verbose_name='Order')),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('name', models.CharField(help_text='Nom utilise dans le code (ex: button_text)', max_length=100, verbose_name='Nom technique')),
                ('slug', models.SlugField(blank=True, help_text='Auto-genere depuis le nom', max_length=100, verbose_name='Slug')),
                ('label', models.CharField(help_text="Libelle affiche dans l'admin", max_length=255, verbose_name='Libelle')),
                ('field_type', models.CharField(choices=[('text', 'Texte court'), ('textarea', 'Texte long'), ('boolean', 'Case a cocher'), ('integer', 'Nombre entier'), ('decimal', 'Nombre decimal'), ('url', 'URL'), ('email', 'Email'), ('image', 'Image'), ('select', 'Liste de choix')], default='text', max_length=20, verbose_name='Type de champ')),
                ('required', models.BooleanField(default=False, verbose_name='Obligatoire')),
                ('default_value', models.TextField(blank=True, help_text='Valeur utilisee si non renseignee', verbose_name='Valeur par defaut')),
                ('help_text', models.CharField(blank=True, max_length=500, verbose_name="Texte d'aide")),
                ('choices', models.TextField(blank=True, help_text='Un choix par ligne, format: valeur|libelle ou juste valeur', verbose_name='Choix (pour type select)')),
                ('section', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='custom_fields', to='cms.section', verbose_name='Section')),
            ],
            options={
                'verbose_name': 'Champ personnalise',
                'verbose_name_plural': 'Champs personnalises',
                'ordering': ['order'],
            },
        ),
        migrations.CreateModel(
            name='PageSectionFieldValue',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('text_value', models.TextField(blank=True, null=True, verbose_name='Valeur texte')),
                ('integer_value', models.IntegerField(blank=True, null=True, verbose_name='Valeur entiere')),
                ('decimal_value', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='Valeur decimale')),
                ('boolean_value', models.BooleanField(blank=True, null=True, verbose_name='Valeur booleenne')),
                ('image_value', models.ImageField(blank=True, null=True, upload_to='cms/section_fields/', verbose_name='Image')),
                ('page_section', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='field_values', to='cms.pagesection', verbose_name='Section de page')),
                ('field', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='values', to='cms.sectionfield', verbose_name='Champ')),
            ],
            options={
                'verbose_name': 'Valeur de champ',
                'verbose_name_plural': 'Valeurs de champs',
            },
            bases=(traduction.mixins.TranslatableMixin, models.Model),
        ),
        migrations.CreateModel(
            name='Setting',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('category', models.CharField(choices=[('general', 'General'), ('contact', 'Contact'), ('social', 'Reseaux sociaux'), ('seo', 'SEO'), ('appearance', 'Apparence'), ('other', 'Autre')], default='general', max_length=20, verbose_name='Categorie')),
                ('name', models.CharField(max_length=100, verbose_name='Nom')),
                ('slug', models.SlugField(blank=True, help_text='Cle unique pour recuperer ce parametre (auto-genere si vide)', max_length=100, unique=True, verbose_name='Cle')),
                ('value', models.TextField(blank=True, null=True, verbose_name='Valeur')),
                ('image', models.ImageField(blank=True, null=True, upload_to='cms/settings/', verbose_name='Image')),
                ('description', models.CharField(blank=True, help_text="Description interne pour l'admin", max_length=255, verbose_name='Description')),
                ('is_required', models.BooleanField(default=False, help_text='Ce parametre doit avoir une valeur', verbose_name='Obligatoire')),
                ('is_active', models.BooleanField(default=True, verbose_name='Actif')),
                ('order', models.PositiveIntegerField(default=0, verbose_name='Ordre')),
                ('type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='settings', to='cms.settingtype', verbose_name='Type')),
            ],
            options={
                'verbose_name': 'Parametre',
                'verbose_name_plural': 'Parametres',
                'ordering': ['category', 'order', 'name'],
            },
            bases=(traduction.mixins.TranslatableMixin, models.Model),
        ),
        migrations.AddField(
            model_name='section',
            name='template',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sections', to='cms.template', verbose_name='Template'),
        ),
        migrations.AddField(
            model_name='page',
            name='template',
            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='pages', to='cms.template', verbose_name='Template'),
        ),
        migrations.CreateModel(
            name='TemplateFile',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('name', models.CharField(help_text='Nom descriptif du fichier', max_length=100, verbose_name='Nom')),
                ('file', models.CharField(help_text='Nom du fichier sans extension .html', max_length=100, verbose_name='Fichier')),
                ('description', models.TextField(blank=True, verbose_name='Description')),
                ('template', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='files', to='cms.template', verbose_name='Template')),
            ],
            options={
                'verbose_name': 'Fichier de template',
                'verbose_name_plural': 'Fichiers de template',
                'ordering': ['template', 'name'],
            },
        ),
        migrations.AddField(
            model_name='page',
            name='template_file',
            field=models.ForeignKey(blank=True, help_text='Fichier specifique a utiliser (par defaut: index.html)', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='pages', to='cms.templatefile', verbose_name='Fichier de template'),
        ),
        migrations.CreateModel(
            name='ButtonAssignment',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('order', models.PositiveSmallIntegerField(default=0, verbose_name='Order')),
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('object_id', models.PositiveIntegerField(verbose_name='ID objet')),
                ('button', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='assignments', to='cms.button', verbose_name='Bouton')),
                ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.contenttype', verbose_name='Type de contenu')),
            ],
            options={
                'verbose_name': 'Association bouton',
                'verbose_name_plural': 'Associations boutons',
                'ordering': ['order'],
                'indexes': [models.Index(fields=['content_type', 'object_id'], name='cms_buttona_content_cbdf47_idx')],
            },
        ),
        migrations.AddConstraint(
            model_name='buttonassignment',
            constraint=models.UniqueConstraint(fields=('button', 'content_type', 'object_id'), name='unique_button_assignment'),
        ),
        migrations.AddIndex(
            model_name='keywordassignment',
            index=models.Index(fields=['content_type', 'object_id'], name='cms_keyword_content_accf14_idx'),
        ),
        migrations.AddConstraint(
            model_name='keywordassignment',
            constraint=models.UniqueConstraint(fields=('keyword', 'content_type', 'object_id'), name='unique_keyword_assignment'),
        ),
        migrations.AddConstraint(
            model_name='pagesection',
            constraint=models.UniqueConstraint(fields=('page', 'section'), name='unique_page_section'),
        ),
        migrations.AddConstraint(
            model_name='sectionfield',
            constraint=models.UniqueConstraint(fields=('section', 'slug'), name='unique_section_field_slug'),
        ),
        migrations.AddConstraint(
            model_name='pagesectionfieldvalue',
            constraint=models.UniqueConstraint(fields=('page_section', 'field'), name='unique_pagesection_field_value'),
        ),
        migrations.AddConstraint(
            model_name='templatefile',
            constraint=models.UniqueConstraint(fields=('template', 'file'), name='unique_template_file'),
        ),
    ]
