8 changed files with 514 additions and 18 deletions
-
30apps/hadis/docs.py
-
91apps/hadis/management/commands/migrate_transmitter_reliability.py
-
47apps/hadis/migrations/0068_transmitterreliability.py
-
134apps/hadis/migrations/0069_alter_transmitters_reliability.py
-
24apps/hadis/migrations/0070_alter_transmitters_reliability.py
-
109apps/hadis/migrations/0070_migrate_transmitter_reliability_data.py
-
65apps/hadis/models/transmitter.py
-
32apps/hadis/serializers/hadis.py
@ -0,0 +1,91 @@ |
|||
""" |
|||
Management command to migrate transmitter reliability data from CharField to ForeignKey. |
|||
Run this after the migration 0069_alter_transmitters_reliability has been applied. |
|||
""" |
|||
|
|||
from django.core.management.base import BaseCommand |
|||
from apps.hadis.models import Transmitters, TransmitterReliability |
|||
|
|||
|
|||
class Command(BaseCommand): |
|||
help = 'Migrate transmitter reliability data from CharField to ForeignKey' |
|||
|
|||
def handle(self, *args, **options): |
|||
self.stdout.write('Starting transmitter reliability data migration...') |
|||
|
|||
# Get or create reliability objects |
|||
reliability_mapping = self.get_reliability_mapping() |
|||
|
|||
# Update transmitters |
|||
updated_count = 0 |
|||
for transmitter in Transmitters.objects.all(): |
|||
old_value = getattr(transmitter, 'reliability_old', None) |
|||
if old_value and old_value in reliability_mapping: |
|||
transmitter.reliability = reliability_mapping[old_value] |
|||
transmitter.save() |
|||
updated_count += 1 |
|||
elif not transmitter.reliability: |
|||
# Set default for transmitters without reliability |
|||
transmitter.reliability = reliability_mapping['unknown'] |
|||
transmitter.save() |
|||
updated_count += 1 |
|||
|
|||
self.stdout.write( |
|||
self.style.SUCCESS( |
|||
f'Successfully migrated {updated_count} transmitters' |
|||
) |
|||
) |
|||
|
|||
def get_reliability_mapping(self): |
|||
"""Get mapping of old values to new TransmitterReliability objects""" |
|||
mapping = {} |
|||
|
|||
# Define the reliability levels |
|||
reliability_data = [ |
|||
('very_reliable', 'Very Reliable', 'green'), |
|||
('reliable', 'Reliable', 'blue'), |
|||
('acceptable', 'Acceptable', 'yellow'), |
|||
('weak', 'Weak', 'orange'), |
|||
('very_weak', 'Very Weak', 'red'), |
|||
('unknown', 'Unknown', 'gray'), |
|||
] |
|||
|
|||
for value, title, color in reliability_data: |
|||
obj, created = TransmitterReliability.objects.get_or_create( |
|||
title__0__text=title, # Check if object exists by title |
|||
defaults={ |
|||
'title': [ |
|||
{'text': title, 'language_code': 'en'}, |
|||
{'text': self.get_persian_title(title), 'language_code': 'fa'}, |
|||
{'text': self.get_russian_title(title), 'language_code': 'ru'} |
|||
], |
|||
'color': color |
|||
} |
|||
) |
|||
mapping[value] = obj |
|||
|
|||
return mapping |
|||
|
|||
def get_persian_title(self, english_title): |
|||
"""Get Persian translation""" |
|||
translations = { |
|||
'Very Reliable': 'بسیار قابل اعتماد', |
|||
'Reliable': 'قابل اعتماد', |
|||
'Acceptable': 'قابل قبول', |
|||
'Weak': 'ضعیف', |
|||
'Very Weak': 'بسیار ضعیف', |
|||
'Unknown': 'نامشخص' |
|||
} |
|||
return translations.get(english_title, english_title) |
|||
|
|||
def get_russian_title(self, english_title): |
|||
"""Get Russian translation""" |
|||
translations = { |
|||
'Very Reliable': 'Очень надежный', |
|||
'Reliable': 'Надежный', |
|||
'Acceptable': 'Приемлемый', |
|||
'Weak': 'Слабый', |
|||
'Very Weak': 'Очень слабый', |
|||
'Unknown': 'Неизвестный' |
|||
} |
|||
return translations.get(english_title, english_title) |
|||
@ -0,0 +1,47 @@ |
|||
# Generated by Django 4.2.27 on 2025-12-23 08:28 |
|||
|
|||
from django.db import migrations, models |
|||
|
|||
|
|||
class Migration(migrations.Migration): |
|||
dependencies = [ |
|||
("hadis", "0067_bookreference_hadis_bookr_id_1b53f6_idx_and_more"), |
|||
] |
|||
|
|||
operations = [ |
|||
migrations.CreateModel( |
|||
name="TransmitterReliability", |
|||
fields=[ |
|||
( |
|||
"id", |
|||
models.BigAutoField( |
|||
auto_created=True, |
|||
primary_key=True, |
|||
serialize=False, |
|||
verbose_name="ID", |
|||
), |
|||
), |
|||
("title", models.JSONField(default=list, verbose_name="Title")), |
|||
( |
|||
"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", |
|||
}, |
|||
), |
|||
] |
|||
@ -0,0 +1,134 @@ |
|||
# Generated by Django 4.2.27 on 2025-12-23 08:32 |
|||
|
|||
from django.db import migrations, models |
|||
import django.db.models.deletion |
|||
|
|||
|
|||
def create_reliability_objects(apps, schema_editor): |
|||
"""Create TransmitterReliability objects for each reliability level""" |
|||
TransmitterReliability = apps.get_model('hadis', 'TransmitterReliability') |
|||
|
|||
# Define the reliability levels with their data |
|||
reliability_data = [ |
|||
{ |
|||
'title': [ |
|||
{'text': 'Very Reliable', 'language_code': 'en'}, |
|||
{'text': 'بسیار قابل اعتماد', 'language_code': 'fa'}, |
|||
{'text': 'Очень надежный', 'language_code': 'ru'} |
|||
], |
|||
'color': 'green', |
|||
'value': 'very_reliable' |
|||
}, |
|||
{ |
|||
'title': [ |
|||
{'text': 'Reliable', 'language_code': 'en'}, |
|||
{'text': 'قابل اعتماد', 'language_code': 'fa'}, |
|||
{'text': 'Надежный', 'language_code': 'ru'} |
|||
], |
|||
'color': 'blue', |
|||
'value': 'reliable' |
|||
}, |
|||
{ |
|||
'title': [ |
|||
{'text': 'Acceptable', 'language_code': 'en'}, |
|||
{'text': 'قابل قبول', 'language_code': 'fa'}, |
|||
{'text': 'Приемлемый', 'language_code': 'ru'} |
|||
], |
|||
'color': 'yellow', |
|||
'value': 'acceptable' |
|||
}, |
|||
{ |
|||
'title': [ |
|||
{'text': 'Weak', 'language_code': 'en'}, |
|||
{'text': 'ضعیف', 'language_code': 'fa'}, |
|||
{'text': 'Слабый', 'language_code': 'ru'} |
|||
], |
|||
'color': 'orange', |
|||
'value': 'weak' |
|||
}, |
|||
{ |
|||
'title': [ |
|||
{'text': 'Very Weak', 'language_code': 'en'}, |
|||
{'text': 'بسیار ضعیف', 'language_code': 'fa'}, |
|||
{'text': 'Очень слабый', 'language_code': 'ru'} |
|||
], |
|||
'color': 'red', |
|||
'value': 'very_weak' |
|||
}, |
|||
{ |
|||
'title': [ |
|||
{'text': 'Unknown', 'language_code': 'en'}, |
|||
{'text': 'نامشخص', 'language_code': 'fa'}, |
|||
{'text': 'Неизвестный', 'language_code': 'ru'} |
|||
], |
|||
'color': 'gray', |
|||
'value': 'unknown' |
|||
} |
|||
] |
|||
|
|||
reliability_objects = {} |
|||
for data in reliability_data: |
|||
obj = TransmitterReliability.objects.create( |
|||
title=data['title'], |
|||
color=data['color'] |
|||
) |
|||
reliability_objects[data['value']] = obj |
|||
|
|||
return reliability_objects |
|||
|
|||
|
|||
def migrate_transmitter_data(apps, schema_editor): |
|||
"""Migrate existing transmitter reliability data""" |
|||
Transmitters = apps.get_model('hadis', 'Transmitters') |
|||
|
|||
# Create reliability objects |
|||
reliability_objects = create_reliability_objects(apps, schema_editor) |
|||
|
|||
# Update all transmitters to use the new temporary field |
|||
for transmitter in Transmitters.objects.all(): |
|||
old_value = getattr(transmitter, 'reliability', None) |
|||
if old_value and old_value in reliability_objects: |
|||
transmitter.reliability_new = reliability_objects[old_value] |
|||
else: |
|||
# Default to unknown if no value or invalid value |
|||
transmitter.reliability_new = reliability_objects['unknown'] |
|||
transmitter.save() |
|||
|
|||
|
|||
def reverse_migrate(apps, schema_editor): |
|||
"""Reverse migration - not needed since we're changing field types""" |
|||
pass |
|||
|
|||
|
|||
class Migration(migrations.Migration): |
|||
dependencies = [ |
|||
("hadis", "0068_transmitterreliability"), |
|||
] |
|||
|
|||
operations = [ |
|||
# Step 1: Add a temporary ForeignKey field |
|||
migrations.AddField( |
|||
model_name='transmitters', |
|||
name='reliability_new', |
|||
field=models.ForeignKey( |
|||
on_delete=django.db.models.deletion.CASCADE, |
|||
related_name="transmitters_temp", |
|||
to="hadis.transmitterreliability", |
|||
verbose_name="reliability", |
|||
null=True, |
|||
), |
|||
), |
|||
# Step 2: Run data migration to populate the new field |
|||
migrations.RunPython(migrate_transmitter_data, reverse_migrate), |
|||
# Step 3: Remove the old field |
|||
migrations.RemoveField( |
|||
model_name='transmitters', |
|||
name='reliability', |
|||
), |
|||
# Step 4: Rename the new field to the final name |
|||
migrations.RenameField( |
|||
model_name='transmitters', |
|||
old_name='reliability_new', |
|||
new_name='reliability', |
|||
), |
|||
] |
|||
@ -0,0 +1,24 @@ |
|||
# Generated by Django 4.2.27 on 2025-12-23 08:46 |
|||
|
|||
from django.db import migrations, models |
|||
import django.db.models.deletion |
|||
|
|||
|
|||
class Migration(migrations.Migration): |
|||
dependencies = [ |
|||
("hadis", "0069_alter_transmitters_reliability"), |
|||
] |
|||
|
|||
operations = [ |
|||
migrations.AlterField( |
|||
model_name="transmitters", |
|||
name="reliability", |
|||
field=models.ForeignKey( |
|||
default=12, |
|||
on_delete=django.db.models.deletion.CASCADE, |
|||
related_name="transmitters", |
|||
to="hadis.transmitterreliability", |
|||
verbose_name="reliability", |
|||
), |
|||
), |
|||
] |
|||
@ -0,0 +1,109 @@ |
|||
# Migration to handle data conversion for transmitter reliability field |
|||
from django.db import migrations |
|||
|
|||
|
|||
def create_reliability_objects(apps, schema_editor): |
|||
"""Create TransmitterReliability objects for each reliability level""" |
|||
TransmitterReliability = apps.get_model('hadis', 'TransmitterReliability') |
|||
|
|||
# Define the reliability levels with their data |
|||
reliability_data = [ |
|||
{ |
|||
'title': [ |
|||
{'text': 'Very Reliable', 'language_code': 'en'}, |
|||
{'text': 'بسیار قابل اعتماد', 'language_code': 'fa'}, |
|||
{'text': 'Очень надежный', 'language_code': 'ru'} |
|||
], |
|||
'color': 'green', |
|||
'value': 'very_reliable' |
|||
}, |
|||
{ |
|||
'title': [ |
|||
{'text': 'Reliable', 'language_code': 'en'}, |
|||
{'text': 'قابل اعتماد', 'language_code': 'fa'}, |
|||
{'text': 'Надежный', 'language_code': 'ru'} |
|||
], |
|||
'color': 'blue', |
|||
'value': 'reliable' |
|||
}, |
|||
{ |
|||
'title': [ |
|||
{'text': 'Acceptable', 'language_code': 'en'}, |
|||
{'text': 'قابل قبول', 'language_code': 'fa'}, |
|||
{'text': 'Приемлемый', 'language_code': 'ru'} |
|||
], |
|||
'color': 'yellow', |
|||
'value': 'acceptable' |
|||
}, |
|||
{ |
|||
'title': [ |
|||
{'text': 'Weak', 'language_code': 'en'}, |
|||
{'text': 'ضعیف', 'language_code': 'fa'}, |
|||
{'text': 'Слабый', 'language_code': 'ru'} |
|||
], |
|||
'color': 'orange', |
|||
'value': 'weak' |
|||
}, |
|||
{ |
|||
'title': [ |
|||
{'text': 'Very Weak', 'language_code': 'en'}, |
|||
{'text': 'بسیار ضعیف', 'language_code': 'fa'}, |
|||
{'text': 'Очень слабый', 'language_code': 'ru'} |
|||
], |
|||
'color': 'red', |
|||
'value': 'very_weak' |
|||
}, |
|||
{ |
|||
'title': [ |
|||
{'text': 'Unknown', 'language_code': 'en'}, |
|||
{'text': 'نامشخص', 'language_code': 'fa'}, |
|||
{'text': 'Неизвестный', 'language_code': 'ru'} |
|||
], |
|||
'color': 'gray', |
|||
'value': 'unknown' |
|||
} |
|||
] |
|||
|
|||
reliability_objects = {} |
|||
for data in reliability_data: |
|||
obj = TransmitterReliability.objects.create( |
|||
title=data['title'], |
|||
color=data['color'] |
|||
) |
|||
reliability_objects[data['value']] = obj |
|||
|
|||
return reliability_objects |
|||
|
|||
|
|||
def migrate_transmitter_data(apps, schema_editor): |
|||
"""Migrate existing transmitter reliability data""" |
|||
Transmitters = apps.get_model('hadis', 'Transmitters') |
|||
|
|||
# Create reliability objects |
|||
reliability_objects = create_reliability_objects(apps, schema_editor) |
|||
|
|||
# Update all transmitters to use the new foreign key references |
|||
for transmitter in Transmitters.objects.all(): |
|||
old_value = getattr(transmitter, 'reliability', None) |
|||
if old_value and old_value in reliability_objects: |
|||
transmitter.reliability = reliability_objects[old_value] |
|||
transmitter.save(update_fields=['reliability']) |
|||
elif old_value == 'unknown' or not old_value: |
|||
# Default to unknown if no value or unknown |
|||
transmitter.reliability = reliability_objects.get('unknown') |
|||
transmitter.save(update_fields=['reliability']) |
|||
|
|||
|
|||
def reverse_migrate(apps, schema_editor): |
|||
"""Reverse migration - not needed since we're changing field types""" |
|||
pass |
|||
|
|||
|
|||
class Migration(migrations.Migration): |
|||
dependencies = [ |
|||
('hadis', '0069_alter_transmitters_reliability'), |
|||
] |
|||
|
|||
operations = [ |
|||
migrations.RunPython(migrate_transmitter_data, reverse_migrate), |
|||
] |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue