You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
137 lines
5.6 KiB
137 lines
5.6 KiB
# Generated by Codex on 2026-06-11
|
|
|
|
from django.db import migrations, models
|
|
|
|
|
|
def _is_multilingual_list(value):
|
|
return isinstance(value, list) and all(
|
|
isinstance(item, dict) and item.get("language_code")
|
|
for item in value
|
|
)
|
|
|
|
|
|
def _normalize_multilingual(value):
|
|
if value in (None, "", []):
|
|
return []
|
|
|
|
if _is_multilingual_list(value):
|
|
normalized_items = []
|
|
for item in value:
|
|
title = item.get("title") or item.get("text") or item.get("value") or item.get("name")
|
|
language_code = item.get("language_code") or "en"
|
|
if title:
|
|
normalized_items.append({"title": title, "language_code": language_code})
|
|
return normalized_items
|
|
|
|
if isinstance(value, dict):
|
|
language_map_keys = {"fa", "en", "ru", "ar", "tr"}
|
|
if any(key in value for key in language_map_keys):
|
|
return [
|
|
{"title": title, "language_code": language_code}
|
|
for language_code, title in value.items()
|
|
if title
|
|
]
|
|
|
|
title = value.get("title") or value.get("text") or value.get("value") or value.get("name")
|
|
language_code = value.get("language_code") or "en"
|
|
return [{"title": title, "language_code": language_code}] if title else []
|
|
|
|
if isinstance(value, list):
|
|
normalized_items = []
|
|
for item in value:
|
|
if isinstance(item, dict):
|
|
title = item.get("title") or item.get("text") or item.get("value") or item.get("name")
|
|
language_code = item.get("language_code") or "en"
|
|
if title:
|
|
normalized_items.append({"title": title, "language_code": language_code})
|
|
elif item not in (None, ""):
|
|
normalized_items.append({"title": str(item), "language_code": "en"})
|
|
return normalized_items
|
|
|
|
return [{"title": str(value), "language_code": "en"}]
|
|
|
|
|
|
def forwards(apps, schema_editor):
|
|
Quiz = apps.get_model("quiz", "Quiz")
|
|
Question = apps.get_model("quiz", "Question")
|
|
|
|
for quiz in Quiz.objects.all().iterator():
|
|
quiz.title_i18n = _normalize_multilingual(quiz.title)
|
|
quiz.description_i18n = _normalize_multilingual(quiz.description)
|
|
quiz.save(update_fields=["title_i18n", "description_i18n"])
|
|
|
|
for question in Question.objects.all().iterator():
|
|
question.question_i18n = _normalize_multilingual(question.question)
|
|
question.option1_i18n = _normalize_multilingual(question.option1)
|
|
question.option2_i18n = _normalize_multilingual(question.option2)
|
|
question.option3_i18n = _normalize_multilingual(question.option3)
|
|
question.option4_i18n = _normalize_multilingual(question.option4)
|
|
question.save(
|
|
update_fields=[
|
|
"question_i18n",
|
|
"option1_i18n",
|
|
"option2_i18n",
|
|
"option3_i18n",
|
|
"option4_i18n",
|
|
]
|
|
)
|
|
|
|
|
|
class Migration(migrations.Migration):
|
|
|
|
dependencies = [
|
|
("quiz", "0004_alter_question_options"),
|
|
]
|
|
|
|
operations = [
|
|
migrations.AddField(
|
|
model_name="quiz",
|
|
name="title_i18n",
|
|
field=models.JSONField(default=list, help_text="Quiz Title", verbose_name="Title"),
|
|
),
|
|
migrations.AddField(
|
|
model_name="quiz",
|
|
name="description_i18n",
|
|
field=models.JSONField(blank=True, default=list, verbose_name="Description"),
|
|
),
|
|
migrations.AddField(
|
|
model_name="question",
|
|
name="question_i18n",
|
|
field=models.JSONField(default=list, verbose_name="Question"),
|
|
),
|
|
migrations.AddField(
|
|
model_name="question",
|
|
name="option1_i18n",
|
|
field=models.JSONField(default=list, verbose_name="Option 1"),
|
|
),
|
|
migrations.AddField(
|
|
model_name="question",
|
|
name="option2_i18n",
|
|
field=models.JSONField(default=list, verbose_name="Option 2"),
|
|
),
|
|
migrations.AddField(
|
|
model_name="question",
|
|
name="option3_i18n",
|
|
field=models.JSONField(default=list, verbose_name="Option 3"),
|
|
),
|
|
migrations.AddField(
|
|
model_name="question",
|
|
name="option4_i18n",
|
|
field=models.JSONField(default=list, verbose_name="Option 4"),
|
|
),
|
|
migrations.RunPython(forwards, migrations.RunPython.noop),
|
|
migrations.RemoveField(model_name="quiz", name="title"),
|
|
migrations.RemoveField(model_name="quiz", name="description"),
|
|
migrations.RemoveField(model_name="question", name="question"),
|
|
migrations.RemoveField(model_name="question", name="option1"),
|
|
migrations.RemoveField(model_name="question", name="option2"),
|
|
migrations.RemoveField(model_name="question", name="option3"),
|
|
migrations.RemoveField(model_name="question", name="option4"),
|
|
migrations.RenameField(model_name="quiz", old_name="title_i18n", new_name="title"),
|
|
migrations.RenameField(model_name="quiz", old_name="description_i18n", new_name="description"),
|
|
migrations.RenameField(model_name="question", old_name="question_i18n", new_name="question"),
|
|
migrations.RenameField(model_name="question", old_name="option1_i18n", new_name="option1"),
|
|
migrations.RenameField(model_name="question", old_name="option2_i18n", new_name="option2"),
|
|
migrations.RenameField(model_name="question", old_name="option3_i18n", new_name="option3"),
|
|
migrations.RenameField(model_name="question", old_name="option4_i18n", new_name="option4"),
|
|
]
|