Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file added courses/__init__.py
Empty file.
711 changes: 711 additions & 0 deletions courses/admin.py

Large diffs are not rendered by default.

7 changes: 7 additions & 0 deletions courses/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from django.apps import AppConfig


class CoursesConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "courses"
verbose_name = "Курсы"
43 changes: 43 additions & 0 deletions courses/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Generated by Django 4.2.11 on 2026-02-20 05:56

import django.core.validators
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

initial = True

dependencies = [
('partner_programs', '0016_partnerprogram_is_distributed_evaluation'),
('files', '0007_auto_20230929_1727'),
]

operations = [
migrations.CreateModel(
name='Course',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=45, verbose_name='Название курса')),
('description', models.TextField(blank=True, default='', validators=[django.core.validators.MaxLengthValidator(600)], verbose_name='Описание')),
('access_type', models.CharField(choices=[('all_users', 'Для всех пользователей'), ('program_members', 'Для участников программы'), ('subscription_stub', 'По подписке')], default='all_users', max_length=32, verbose_name='Тип доступа')),
('start_date', models.DateField(blank=True, null=True, verbose_name='Дата старта')),
('end_date', models.DateField(blank=True, null=True, verbose_name='Дата окончания')),
('status', models.CharField(choices=[('draft', 'Черновик'), ('published', 'Опубликован'), ('completed', 'Завершен')], default='draft', max_length=16, verbose_name='Статус курса')),
('is_completed', models.BooleanField(default=False, verbose_name='Курс завершен')),
('completed_at', models.DateTimeField(blank=True, null=True, verbose_name='Дата завершения')),
('datetime_created', models.DateTimeField(auto_now_add=True, verbose_name='Дата создания')),
('datetime_updated', models.DateTimeField(auto_now=True, verbose_name='Дата обновления')),
('avatar_file', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='course_avatars', to='files.userfile', verbose_name='Аватар курса')),
('card_cover_file', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='course_card_covers', to='files.userfile', verbose_name='Обложка карточки курса')),
('header_cover_file', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='course_header_covers', to='files.userfile', verbose_name='Обложка шапки курса')),
('partner_program', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='courses', to='partner_programs.partnerprogram', verbose_name='Программа')),
],
options={
'verbose_name': 'Курс',
'verbose_name_plural': 'Курсы',
'ordering': ('-datetime_created',),
},
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Generated by Django 4.2.11 on 2026-02-20 06:13

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('courses', '0001_initial'),
]

operations = [
migrations.AddConstraint(
model_name='course',
constraint=models.CheckConstraint(check=models.Q(models.Q(('access_type', 'program_members'), _negated=True), ('partner_program__isnull', False), _connector='OR'), name='courses_program_members_requires_program'),
),
migrations.AddConstraint(
model_name='course',
constraint=models.CheckConstraint(check=models.Q(models.Q(('end_date__isnull', True), ('start_date__isnull', True)), models.Q(('end_date__isnull', False), ('start_date__isnull', False)), _connector='OR'), name='courses_dates_must_be_set_together'),
),
migrations.AddConstraint(
model_name='course',
constraint=models.CheckConstraint(check=models.Q(('start_date__isnull', True), ('end_date__gte', models.F('start_date')), _connector='OR'), name='courses_end_date_gte_start_date'),
),
migrations.AddConstraint(
model_name='course',
constraint=models.CheckConstraint(check=models.Q(models.Q(('status', 'completed'), _negated=True), ('is_completed', True), _connector='OR'), name='courses_completed_status_implies_flag'),
),
migrations.AddConstraint(
model_name='course',
constraint=models.CheckConstraint(check=models.Q(('is_completed', False), ('status', 'completed'), _connector='OR'), name='courses_completed_flag_implies_status'),
),
]
42 changes: 42 additions & 0 deletions courses/migrations/0003_coursemodule_and_more.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Generated by Django 4.2.11 on 2026-02-20 06:45

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
('files', '0007_auto_20230929_1727'),
('courses', '0002_course_courses_program_members_requires_program_and_more'),
]

operations = [
migrations.CreateModel(
name='CourseModule',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=40, verbose_name='Название модуля')),
('start_date', models.DateField(verbose_name='Дата старта модуля')),
('status', models.CharField(choices=[('draft', 'Черновик'), ('published', 'Опубликован')], default='draft', max_length=16, verbose_name='Статус модуля')),
('order', models.PositiveIntegerField(default=1, verbose_name='Порядковый номер')),
('datetime_created', models.DateTimeField(auto_now_add=True, verbose_name='Дата создания')),
('datetime_updated', models.DateTimeField(auto_now=True, verbose_name='Дата обновления')),
('avatar_file', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='course_module_avatars', to='files.userfile', verbose_name='Аватар модуля')),
('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='modules', to='courses.course', verbose_name='Курс')),
],
options={
'verbose_name': 'Модуль курса',
'verbose_name_plural': 'Модули курса',
'ordering': ('course_id', 'order', 'id'),
},
),
migrations.AddConstraint(
model_name='coursemodule',
constraint=models.UniqueConstraint(fields=('course', 'order'), name='courses_module_unique_course_order'),
),
migrations.AddConstraint(
model_name='coursemodule',
constraint=models.CheckConstraint(check=models.Q(('order__gte', 1)), name='courses_module_order_gte_1'),
),
]
39 changes: 39 additions & 0 deletions courses/migrations/0004_courselesson_and_more.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Generated by Django 4.2.11 on 2026-02-20 06:50

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
('courses', '0003_coursemodule_and_more'),
]

operations = [
migrations.CreateModel(
name='CourseLesson',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=45, verbose_name='Название урока')),
('status', models.CharField(choices=[('draft', 'Черновик'), ('published', 'Опубликован')], default='draft', max_length=16, verbose_name='Статус урока')),
('order', models.PositiveIntegerField(default=1, verbose_name='Порядковый номер')),
('datetime_created', models.DateTimeField(auto_now_add=True, verbose_name='Дата создания')),
('datetime_updated', models.DateTimeField(auto_now=True, verbose_name='Дата обновления')),
('module', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='lessons', to='courses.coursemodule', verbose_name='Модуль курса')),
],
options={
'verbose_name': 'Урок курса',
'verbose_name_plural': 'Уроки курса',
'ordering': ('module_id', 'order', 'id'),
},
),
migrations.AddConstraint(
model_name='courselesson',
constraint=models.UniqueConstraint(fields=('module', 'order'), name='courses_lesson_unique_module_order'),
),
migrations.AddConstraint(
model_name='courselesson',
constraint=models.CheckConstraint(check=models.Q(('order__gte', 1)), name='courses_lesson_order_gte_1'),
),
]
Loading