# Generated by Django 4.2.30 on 2026-10-19 06:30 import json from django.db import migrations, models import django.db.models.deletion def migrate_existing_opinions_forward(apps, schema_editor): ScholarlyOpinion = apps.get_model("hadis", "ScholarlyOpinion") TransmitterOpinion = apps.get_model("hadis", "TransmitterOpinion") cache = {} for to in TransmitterOpinion.objects.all().order_by("id"): if to.opinion_id: continue raw_text = to.opinion_text if isinstance(to.opinion_text, list) else [] try: key = (to.status_id, json.dumps(raw_text, sort_keys=True, ensure_ascii=False)) except Exception: key = (to.status_id, str(raw_text)) scholarly_op = cache.get(key) if scholarly_op is None: scholarly_op = ScholarlyOpinion.objects.create( opinion_text=raw_text, status_id=to.status_id, ) cache[key] = scholarly_op to.opinion_id = scholarly_op.id to.save(update_fields=["opinion"]) class Migration(migrations.Migration): dependencies = [ ("hadis", "0052_transmitters_gender"), ] operations = [ migrations.CreateModel( name="ScholarlyOpinion", fields=[ ("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), ("opinion_text", models.JSONField(default=list, verbose_name="Opinion Text")), ("created_at", models.DateTimeField(auto_now_add=True, verbose_name="created at")), ("updated_at", models.DateTimeField(auto_now=True, verbose_name="updated at")), ( "status", models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name="scholarly_opinions", to="hadis.opinionstatus", verbose_name="opinion status", ), ), ], options={ "verbose_name": "Scholarly Opinion", "verbose_name_plural": "Scholarly Opinions", "ordering": ("-id",), }, ), migrations.AddField( model_name="transmitteropinion", name="opinion", field=models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name="transmitter_opinions", to="hadis.scholarlyopinion", verbose_name="Scholarly Opinion", ), ), migrations.RunPython(migrate_existing_opinions_forward, migrations.RunPython.noop), ]