diff --git a/apps/hadis/migrations/0075_opinionstatus.py b/apps/hadis/migrations/0075_opinionstatus.py new file mode 100644 index 0000000..57e4dd4 --- /dev/null +++ b/apps/hadis/migrations/0075_opinionstatus.py @@ -0,0 +1,53 @@ +# Generated by Django 4.2.27 on 2025-12-23 13:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("hadis", "0074_alter_hadisstatus_slug"), + ] + + operations = [ + migrations.CreateModel( + name="OpinionStatus", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.JSONField(default=list, verbose_name="Title")), + ( + "slug", + models.SlugField( + blank=True, max_length=255, null=True, verbose_name="slug" + ), + ), + ( + "color", + models.CharField( + choices=[ + ("red", "Red"), + ("green", "Green"), + ("blue", "Blue"), + ("yellow", "Yellow"), + ("orange", "Orange"), + ("purple", "Purple"), + ("gray", "Gray"), + ], + max_length=20, + verbose_name="color", + ), + ), + ], + options={ + "verbose_name": "transmitter reliability", + "verbose_name_plural": "transmitter reliability", + }, + ), + ] diff --git a/apps/hadis/migrations/0076_alter_transmitteropinion_status.py b/apps/hadis/migrations/0076_alter_transmitteropinion_status.py new file mode 100644 index 0000000..8e87b1a --- /dev/null +++ b/apps/hadis/migrations/0076_alter_transmitteropinion_status.py @@ -0,0 +1,25 @@ +# Generated by Django 4.2.27 on 2025-12-23 13:57 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + dependencies = [ + ("hadis", "0075_opinionstatus"), + ] + + operations = [ + migrations.AlterField( + model_name="transmitteropinion", + name="status", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="opinions", + to="hadis.opinionstatus", + verbose_name="opinion status", + ), + ), + ] diff --git a/apps/hadis/migrations/0077_alter_transmitteropinion_status.py b/apps/hadis/migrations/0077_alter_transmitteropinion_status.py new file mode 100644 index 0000000..ccbaec0 --- /dev/null +++ b/apps/hadis/migrations/0077_alter_transmitteropinion_status.py @@ -0,0 +1,26 @@ +# Generated by Django 4.2.27 on 2025-12-23 14:02 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + dependencies = [ + ("hadis", "0076_alter_transmitteropinion_status"), + ] + + operations = [ + migrations.AlterField( + model_name="transmitteropinion", + name="status", + field=models.ForeignKey( + blank=True, + default=1, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="opinions", + to="hadis.opinionstatus", + verbose_name="opinion status", + ), + ), + ] diff --git a/apps/hadis/migrations/0078_alter_transmitteropinion_status.py b/apps/hadis/migrations/0078_alter_transmitteropinion_status.py new file mode 100644 index 0000000..8052de2 --- /dev/null +++ b/apps/hadis/migrations/0078_alter_transmitteropinion_status.py @@ -0,0 +1,25 @@ +# Generated by Django 4.2.27 on 2025-12-23 14:03 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + dependencies = [ + ("hadis", "0077_alter_transmitteropinion_status"), + ] + + operations = [ + migrations.AlterField( + model_name="transmitteropinion", + name="status", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="opinions", + to="hadis.opinionstatus", + verbose_name="opinion status", + ), + ), + ] diff --git a/apps/hadis/migrations/0079_remove_transmitteropinion_status.py b/apps/hadis/migrations/0079_remove_transmitteropinion_status.py new file mode 100644 index 0000000..49222e9 --- /dev/null +++ b/apps/hadis/migrations/0079_remove_transmitteropinion_status.py @@ -0,0 +1,16 @@ +# Generated by Django 4.2.27 on 2025-12-23 14:08 + +from django.db import migrations + + +class Migration(migrations.Migration): + dependencies = [ + ("hadis", "0078_alter_transmitteropinion_status"), + ] + + operations = [ + migrations.RemoveField( + model_name="transmitteropinion", + name="status", + ), + ] diff --git a/apps/hadis/migrations/0080_transmitteropinion_status.py b/apps/hadis/migrations/0080_transmitteropinion_status.py new file mode 100644 index 0000000..db31e5b --- /dev/null +++ b/apps/hadis/migrations/0080_transmitteropinion_status.py @@ -0,0 +1,25 @@ +# Generated by Django 4.2.27 on 2025-12-23 14:09 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + dependencies = [ + ("hadis", "0079_remove_transmitteropinion_status"), + ] + + operations = [ + migrations.AddField( + model_name="transmitteropinion", + name="status", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="opinions", + to="hadis.opinionstatus", + verbose_name="opinion status", + ), + ), + ] diff --git a/apps/hadis/models/transmitter.py b/apps/hadis/models/transmitter.py index bdea15b..d27a8ae 100644 --- a/apps/hadis/models/transmitter.py +++ b/apps/hadis/models/transmitter.py @@ -325,15 +325,61 @@ class HadisTransmitter(models.Model): layer_info = f" - {self.narrator_layer}" if self.narrator_layer else "" return f'{self.hadis.number} - {self.transmitter.full_name} ({self.order}){layer_info}' + +class OpinionStatus(models.Model): + class ColorChoices(models.TextChoices): + RED = 'red', _('Red') + GREEN = 'green', _('Green') + BLUE = 'blue', _('Blue') + YELLOW = 'yellow', _('Yellow') + ORANGE = 'orange', _('Orange') + PURPLE = 'purple', _('Purple') + GRAY = 'gray', _('Gray') + + title = models.JSONField(default = list , verbose_name=_('Title')) + slug = models.SlugField(max_length=255, verbose_name=_('slug'), blank=True,null=True) + + color = models.CharField(max_length=20, choices=ColorChoices.choices, verbose_name=_('color')) + + def save(self, *args, **kwargs): + if not self.slug: + slug = slugify(self.name[0]['text']) + self.slug = slug + super().save(*args, **kwargs) + + def __str__(self): + return self.title[0]['text'] + + def get_title(self,lang): + """ + Get title for a specific language + """ + + if not self.title or not isinstance(self.title, list): + return None + + for tr in self.title: + if isinstance(tr, dict) and tr.get('language_code') == lang: + return tr.get('text', '') + + for tr in self.title: + if isinstance(tr, dict) and tr.get('language_code') == 'en': + return tr.get('text', '') + return None + + class Meta: + verbose_name = _('transmitter reliability') + verbose_name_plural = _('transmitter reliability') + class TransmitterOpinion(models.Model): """ Model for scholarly opinions about transmitters """ - class OpinionStatus(models.TextChoices): - CONFIRMED = 'confirmed', _('Confirmed') - MIXED = 'mixed', _('Mixed') - REJECTED = 'rejected', _('Rejected') + # class OpinionStatus(models.TextChoices): + # CONFIRMED = 'confirmed', _('Confirmed') + # MIXED = 'mixed', _('Mixed') + # REJECTED = 'rejected', _('Rejected') transmitter = models.ForeignKey( Transmitters, @@ -343,14 +389,15 @@ class TransmitterOpinion(models.Model): ) scholar_name = models.JSONField(default = list , verbose_name=_('Scholar Name')) opinion_text = models.JSONField(default = list , verbose_name=_('Opinion Text')) - status = models.CharField( - max_length=20, - choices=OpinionStatus.choices, - default=OpinionStatus.CONFIRMED, - verbose_name=_('Opinion Status'), - help_text=_('Status of the opinion') + status = models.ForeignKey( + OpinionStatus, + on_delete=models.CASCADE, + verbose_name=_('opinion status'), + related_name='opinions', + # default=1, + blank = True, + null=True ) - created_at = models.DateTimeField(auto_now_add=True, verbose_name=_('created at')) updated_at = models.DateTimeField(auto_now=True, verbose_name=_('updated at'))