159 lines
9.7 KiB
Python
159 lines
9.7 KiB
Python
# 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'),
|
|
),
|
|
]
|