# Generated by Django 5.1.15 on 2026-05-02 15:11 import django.db.models.deletion from django.conf import settings from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='Category', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('slug', models.SlugField(max_length=64, unique=True, verbose_name='slug')), ('name', models.CharField(max_length=120, verbose_name='name')), ('name_en', models.CharField(max_length=120, null=True, verbose_name='name')), ('name_fa', models.CharField(max_length=120, null=True, verbose_name='name')), ('order', models.PositiveIntegerField(default=0, verbose_name='order')), ], options={ 'verbose_name': 'category', 'verbose_name_plural': 'categories', 'ordering': ['order', 'slug'], }, ), migrations.CreateModel( name='Course', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('slug', models.SlugField(max_length=80, unique=True, verbose_name='slug')), ('title', models.CharField(max_length=200, verbose_name='title')), ('title_en', models.CharField(max_length=200, null=True, verbose_name='title')), ('title_fa', models.CharField(max_length=200, null=True, verbose_name='title')), ('tagline', models.CharField(blank=True, max_length=300, verbose_name='tagline')), ('tagline_en', models.CharField(blank=True, max_length=300, null=True, verbose_name='tagline')), ('tagline_fa', models.CharField(blank=True, max_length=300, null=True, verbose_name='tagline')), ('description', models.TextField(blank=True, verbose_name='description')), ('description_en', models.TextField(blank=True, null=True, verbose_name='description')), ('description_fa', models.TextField(blank=True, null=True, verbose_name='description')), ('level', models.CharField(choices=[('beginner', 'Beginner'), ('intermediate', 'Intermediate'), ('advanced', 'Advanced'), ('all', 'All levels')], default='beginner', max_length=16, verbose_name='level')), ('language', models.CharField(default='fa', max_length=8, verbose_name='language')), ('cover_image', models.ImageField(blank=True, null=True, upload_to='courses/covers/', verbose_name='cover image')), ('color', models.CharField(blank=True, help_text='CSS color token used by the UI.', max_length=64, verbose_name='color')), ('status', models.CharField(choices=[('draft', 'Draft'), ('published', 'Published')], default='draft', max_length=16, verbose_name='status')), ('published_at', models.DateTimeField(blank=True, null=True, verbose_name='published at')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), ('category', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='courses', to='courses.category')), ('instructor', models.ForeignKey(limit_choices_to={'role': 'teacher'}, on_delete=django.db.models.deletion.PROTECT, related_name='courses', to=settings.AUTH_USER_MODEL)), ], options={ 'verbose_name': 'course', 'verbose_name_plural': 'courses', 'ordering': ['-created_at'], }, ), migrations.CreateModel( name='CourseFAQ', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('question', models.CharField(max_length=300, verbose_name='question')), ('question_en', models.CharField(max_length=300, null=True, verbose_name='question')), ('question_fa', models.CharField(max_length=300, null=True, verbose_name='question')), ('answer', models.TextField(verbose_name='answer')), ('answer_en', models.TextField(null=True, verbose_name='answer')), ('answer_fa', models.TextField(null=True, verbose_name='answer')), ('order', models.PositiveIntegerField(default=0, verbose_name='order')), ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='faqs', to='courses.course')), ], options={ 'verbose_name': 'FAQ', 'verbose_name_plural': 'FAQs', 'ordering': ['order', 'id'], }, ), migrations.CreateModel( name='CourseHighlight', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('text', models.CharField(max_length=200, verbose_name='text')), ('text_en', models.CharField(max_length=200, null=True, verbose_name='text')), ('text_fa', models.CharField(max_length=200, null=True, verbose_name='text')), ('order', models.PositiveIntegerField(default=0, verbose_name='order')), ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='highlights', to='courses.course')), ], options={ 'verbose_name': 'highlight', 'verbose_name_plural': 'highlights', 'ordering': ['order', 'id'], }, ), migrations.CreateModel( name='Section', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=200, verbose_name='title')), ('title_en', models.CharField(max_length=200, null=True, verbose_name='title')), ('title_fa', models.CharField(max_length=200, null=True, verbose_name='title')), ('order', models.PositiveIntegerField(default=0, verbose_name='order')), ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sections', to='courses.course')), ], options={ 'verbose_name': 'section', 'verbose_name_plural': 'sections', 'ordering': ['order', 'id'], }, ), migrations.CreateModel( name='Lesson', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=200, verbose_name='title')), ('title_en', models.CharField(max_length=200, null=True, verbose_name='title')), ('title_fa', models.CharField(max_length=200, null=True, verbose_name='title')), ('kind', models.CharField(choices=[('video', 'Video'), ('text', 'Text'), ('pdf', 'PDF'), ('task', 'Task'), ('quiz', 'Quiz')], max_length=16, verbose_name='kind')), ('body', models.TextField(blank=True, help_text='Markdown body for text/task lessons.', verbose_name='body')), ('body_en', models.TextField(blank=True, help_text='Markdown body for text/task lessons.', null=True, verbose_name='body')), ('body_fa', models.TextField(blank=True, help_text='Markdown body for text/task lessons.', null=True, verbose_name='body')), ('video_url', models.URLField(blank=True, max_length=500, verbose_name='video URL')), ('pdf_file', models.FileField(blank=True, null=True, upload_to='courses/pdfs/', verbose_name='PDF')), ('duration_seconds', models.PositiveIntegerField(blank=True, null=True, verbose_name='duration (seconds)')), ('is_preview', models.BooleanField(default=False, verbose_name='free preview')), ('status', models.CharField(choices=[('draft', 'Draft'), ('published', 'Published')], default='draft', max_length=16, verbose_name='status')), ('order', models.PositiveIntegerField(default=0, verbose_name='order')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), ('section', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='lessons', to='courses.section')), ], options={ 'verbose_name': 'lesson', 'verbose_name_plural': 'lessons', 'ordering': ['order', 'id'], }, ), migrations.AddIndex( model_name='course', index=models.Index(fields=['instructor', 'status'], name='courses_cou_instruc_98570d_idx'), ), migrations.AddIndex( model_name='course', index=models.Index(fields=['status', '-created_at'], name='courses_cou_status_41eebb_idx'), ), migrations.AddIndex( model_name='section', index=models.Index(fields=['course', 'order'], name='courses_sec_course__60bff3_idx'), ), migrations.AddIndex( model_name='lesson', index=models.Index(fields=['section', 'order'], name='courses_les_section_573283_idx'), ), ]