Browse Source
multilanguage setup for course app added , old values set to the language map schema as default english values .
master
multilanguage setup for course app added , old values set to the language map schema as default english values .
master
14 changed files with 594 additions and 103 deletions
-
2apps/course/admin/course.py
-
24apps/course/admin/lesson.py
-
247apps/course/migrations/0008_remove_course_course_cour_status_57ffd9_idx_and_more.py
-
130apps/course/models/course.py
-
28apps/course/models/lesson.py
-
31apps/course/serializers/admin.py
-
130apps/course/serializers/course.py
-
35apps/course/serializers/lesson.py
-
11apps/course/signals.py
-
6apps/course/views/admin.py
-
38apps/course/views/course.py
-
4apps/course/views/lesson.py
-
6apps/course/views/live_session.py
-
5apps/course/views/participant.py
@ -0,0 +1,247 @@ |
|||||
|
# Generated by Django 5.2.12 on 2026-06-03 15:30 |
||||
|
|
||||
|
import json |
||||
|
from django.db import migrations, models |
||||
|
|
||||
|
|
||||
|
def convert_to_json_format(apps, schema_editor): |
||||
|
Attachment = apps.get_model('course', 'Attachment') |
||||
|
Course = apps.get_model('course', 'Course') |
||||
|
CourseCategory = apps.get_model('course', 'CourseCategory') |
||||
|
CourseChapter = apps.get_model('course', 'CourseChapter') |
||||
|
CourseLesson = apps.get_model('course', 'CourseLesson') |
||||
|
Glossary = apps.get_model('course', 'Glossary') |
||||
|
Lesson = apps.get_model('course', 'Lesson') |
||||
|
|
||||
|
def wrap_val(val): |
||||
|
if not val: |
||||
|
return "[]" |
||||
|
if isinstance(val, str): |
||||
|
stripped = val.strip() |
||||
|
if stripped.startswith('[') and stripped.endswith(']'): |
||||
|
try: |
||||
|
# Already JSON |
||||
|
json.loads(val) |
||||
|
return val |
||||
|
except Exception: |
||||
|
pass |
||||
|
# Wrap as JSON string |
||||
|
return json.dumps([{"title": val, "language_code": "en"}], ensure_ascii=False) |
||||
|
return json.dumps([{"title": str(val), "language_code": "en"}], ensure_ascii=False) |
||||
|
|
||||
|
# 1. Attachment |
||||
|
for obj in Attachment.objects.all(): |
||||
|
obj.title = wrap_val(obj.title) |
||||
|
obj.save() |
||||
|
|
||||
|
# 2. Course |
||||
|
for obj in Course.objects.all(): |
||||
|
obj.title = wrap_val(obj.title) |
||||
|
obj.slug = wrap_val(obj.slug) |
||||
|
obj.level = wrap_val(obj.level) |
||||
|
obj.status = wrap_val(obj.status) |
||||
|
obj.timing = wrap_val(obj.timing) |
||||
|
obj.features = wrap_val(obj.features) |
||||
|
obj.save() |
||||
|
|
||||
|
# 3. CourseCategory |
||||
|
for obj in CourseCategory.objects.all(): |
||||
|
obj.name = wrap_val(obj.name) |
||||
|
obj.slug = wrap_val(obj.slug) |
||||
|
obj.save() |
||||
|
|
||||
|
# 4. CourseChapter |
||||
|
for obj in CourseChapter.objects.all(): |
||||
|
obj.title = wrap_val(obj.title) |
||||
|
obj.save() |
||||
|
|
||||
|
# 5. CourseLesson |
||||
|
for obj in CourseLesson.objects.all(): |
||||
|
obj.title = wrap_val(obj.title) |
||||
|
obj.save() |
||||
|
|
||||
|
# 6. Glossary |
||||
|
for obj in Glossary.objects.all(): |
||||
|
obj.description = wrap_val(obj.description) |
||||
|
obj.save() |
||||
|
|
||||
|
# 7. Lesson |
||||
|
for obj in Lesson.objects.all(): |
||||
|
obj.title = wrap_val(obj.title) |
||||
|
obj.content_type = wrap_val(obj.content_type) |
||||
|
obj.save() |
||||
|
|
||||
|
|
||||
|
class Migration(migrations.Migration): |
||||
|
|
||||
|
dependencies = [ |
||||
|
('course', '0007_coursechapter_alter_courselesson_options_and_more'), |
||||
|
] |
||||
|
|
||||
|
operations = [ |
||||
|
# Remove indexes |
||||
|
migrations.RemoveIndex( |
||||
|
model_name='course', |
||||
|
name='course_cour_status_57ffd9_idx', |
||||
|
), |
||||
|
migrations.RemoveIndex( |
||||
|
model_name='course', |
||||
|
name='course_cour_slug_235a66_idx', |
||||
|
), |
||||
|
migrations.RemoveIndex( |
||||
|
model_name='course', |
||||
|
name='course_cour_status_bfcd24_idx', |
||||
|
), |
||||
|
migrations.RemoveIndex( |
||||
|
model_name='course', |
||||
|
name='course_cour_categor_26bb4d_idx', |
||||
|
), |
||||
|
migrations.RemoveIndex( |
||||
|
model_name='course', |
||||
|
name='course_cour_profess_5eae9a_idx', |
||||
|
), |
||||
|
migrations.RemoveIndex( |
||||
|
model_name='lesson', |
||||
|
name='course_less_content_e1cf57_idx', |
||||
|
), |
||||
|
|
||||
|
# Phase 1: Temporary convert columns to TextField to lift length limits |
||||
|
migrations.AlterField( |
||||
|
model_name='attachment', |
||||
|
name='title', |
||||
|
field=models.TextField(blank=True, null=True), |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='course', |
||||
|
name='title', |
||||
|
field=models.TextField(blank=True, null=True), |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='course', |
||||
|
name='slug', |
||||
|
field=models.TextField(blank=True, null=True), |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='course', |
||||
|
name='level', |
||||
|
field=models.TextField(blank=True, null=True), |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='course', |
||||
|
name='status', |
||||
|
field=models.TextField(blank=True, null=True), |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='coursecategory', |
||||
|
name='name', |
||||
|
field=models.TextField(blank=True, null=True), |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='coursecategory', |
||||
|
name='slug', |
||||
|
field=models.TextField(blank=True, null=True), |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='coursechapter', |
||||
|
name='title', |
||||
|
field=models.TextField(blank=True, null=True), |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='courselesson', |
||||
|
name='title', |
||||
|
field=models.TextField(blank=True, null=True), |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='glossary', |
||||
|
name='description', |
||||
|
field=models.TextField(blank=True, null=True), |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='lesson', |
||||
|
name='content_type', |
||||
|
field=models.TextField(blank=True, null=True), |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='lesson', |
||||
|
name='title', |
||||
|
field=models.TextField(blank=True, null=True), |
||||
|
), |
||||
|
|
||||
|
# Phase 2: Run Python conversion logic to format as JSON strings |
||||
|
migrations.RunPython( |
||||
|
convert_to_json_format, |
||||
|
reverse_code=migrations.RunPython.noop |
||||
|
), |
||||
|
|
||||
|
# Phase 3: Final conversion to JSONField database columns |
||||
|
migrations.AlterField( |
||||
|
model_name='attachment', |
||||
|
name='title', |
||||
|
field=models.JSONField(default=list, verbose_name='Attachment Title'), |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='course', |
||||
|
name='features', |
||||
|
field=models.JSONField(blank=True, default=list, null=True, verbose_name='Course features'), |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='course', |
||||
|
name='level', |
||||
|
field=models.JSONField(blank=True, default=list, null=True, verbose_name='Course Level'), |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='course', |
||||
|
name='slug', |
||||
|
field=models.JSONField(blank=True, default=list, null=True, verbose_name='Slug'), |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='course', |
||||
|
name='status', |
||||
|
field=models.JSONField(blank=True, default=list, null=True, verbose_name='Course Status'), |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='course', |
||||
|
name='timing', |
||||
|
field=models.JSONField(blank=True, default=list, null=True, verbose_name='Timing'), |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='course', |
||||
|
name='title', |
||||
|
field=models.JSONField(default=list, verbose_name='Course Title'), |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='coursecategory', |
||||
|
name='name', |
||||
|
field=models.JSONField(default=list, verbose_name='Category Name'), |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='coursecategory', |
||||
|
name='slug', |
||||
|
field=models.JSONField(blank=True, default=list, null=True, verbose_name='Slug'), |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='coursechapter', |
||||
|
name='title', |
||||
|
field=models.JSONField(default=list, verbose_name='Chapter Title'), |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='courselesson', |
||||
|
name='title', |
||||
|
field=models.JSONField(blank=True, default=list, null=True, verbose_name='Sub-lesson Title'), |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='glossary', |
||||
|
name='description', |
||||
|
field=models.JSONField(default=list, verbose_name='Description'), |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='lesson', |
||||
|
name='content_type', |
||||
|
field=models.JSONField(default=list, verbose_name='Content Type'), |
||||
|
), |
||||
|
migrations.AlterField( |
||||
|
model_name='lesson', |
||||
|
name='title', |
||||
|
field=models.JSONField(default=list, verbose_name='Lesson Title'), |
||||
|
), |
||||
|
] |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue