10 changed files with 198 additions and 23 deletions
-
24apps/hadis/docs.py
-
71apps/hadis/management/commands/generate_transmit_slug.py
-
19apps/hadis/migrations/0046_transmitters_slug.py
-
16apps/hadis/migrations/0047_remove_transmitters_slug.py
-
19apps/hadis/migrations/0048_transmitters_slug.py
-
19apps/hadis/migrations/0049_alter_transmitters_slug.py
-
12apps/hadis/models/transmitter.py
-
2apps/hadis/serializers/hadis.py
-
6apps/hadis/urls.py
-
33apps/hadis/views/transmitter.py
@ -0,0 +1,71 @@ |
|||||
|
# Create this file: yourapp/management/commands/generate_transmitter_slugs.py |
||||
|
|
||||
|
from django.core.management.base import BaseCommand |
||||
|
from django.utils.text import slugify |
||||
|
from apps.hadis.models import Transmitters # adjust import path as needed |
||||
|
|
||||
|
|
||||
|
class Command(BaseCommand): |
||||
|
help = 'Generate unique slugs for all transmitters' |
||||
|
|
||||
|
def add_arguments(self, parser): |
||||
|
parser.add_argument( |
||||
|
'--regenerate', |
||||
|
action='store_true', |
||||
|
help='Regenerate slugs even if they already exist', |
||||
|
) |
||||
|
|
||||
|
def handle(self, *args, **options): |
||||
|
regenerate = options['regenerate'] |
||||
|
|
||||
|
transmitters = Transmitters.objects.all() |
||||
|
updated_count = 0 |
||||
|
skipped_count = 0 |
||||
|
|
||||
|
self.stdout.write( |
||||
|
self.style.SUCCESS(f'\n📝 Processing {transmitters.count()} transmitters...\n') |
||||
|
) |
||||
|
|
||||
|
for transmitter in transmitters: |
||||
|
# Skip if slug exists and regenerate is False |
||||
|
if transmitter.slug and not regenerate: |
||||
|
self.stdout.write( |
||||
|
self.style.WARNING(f"⊘ Skipped: {transmitter.full_name} (slug exists)") |
||||
|
) |
||||
|
skipped_count += 1 |
||||
|
continue |
||||
|
|
||||
|
# Generate base slug from full_name |
||||
|
base_slug = slugify(transmitter.full_name, allow_unicode=True) |
||||
|
|
||||
|
if not base_slug: |
||||
|
self.stdout.write( |
||||
|
self.style.ERROR(f"✗ Error: {transmitter.full_name} - Cannot generate slug from empty name") |
||||
|
) |
||||
|
continue |
||||
|
|
||||
|
# Ensure uniqueness |
||||
|
slug = base_slug |
||||
|
counter = 1 |
||||
|
|
||||
|
while Transmitters.objects.filter(slug=slug).exclude(pk=transmitter.pk).exists(): |
||||
|
slug = f"{base_slug}-{counter}" |
||||
|
counter += 1 |
||||
|
|
||||
|
# Update the transmitter |
||||
|
transmitter.slug = slug |
||||
|
transmitter.save() |
||||
|
updated_count += 1 |
||||
|
|
||||
|
self.stdout.write( |
||||
|
self.style.SUCCESS(f"✓ Generated: {transmitter.full_name} → {slug}") |
||||
|
) |
||||
|
|
||||
|
# Print summary |
||||
|
self.stdout.write("\n" + "="*70) |
||||
|
self.stdout.write(self.style.SUCCESS("SLUG GENERATION SUMMARY")) |
||||
|
self.stdout.write("="*70) |
||||
|
self.stdout.write(f"✓ Generated: {updated_count}") |
||||
|
self.stdout.write(f"⊘ Skipped: {skipped_count}") |
||||
|
self.stdout.write(f"📊 Total: {transmitters.count()}") |
||||
|
self.stdout.write("="*70 + "\n") |
||||
@ -0,0 +1,19 @@ |
|||||
|
# Generated by Django 5.2.9 on 2025-12-17 13:25 |
||||
|
|
||||
|
from django.db import migrations, models |
||||
|
|
||||
|
|
||||
|
class Migration(migrations.Migration): |
||||
|
dependencies = [ |
||||
|
("hadis", "0045_bookreference_publisher"), |
||||
|
] |
||||
|
|
||||
|
operations = [ |
||||
|
migrations.AddField( |
||||
|
model_name="transmitters", |
||||
|
name="slug", |
||||
|
field=models.SlugField( |
||||
|
blank=True, max_length=255, unique=True, verbose_name="slug" |
||||
|
), |
||||
|
), |
||||
|
] |
||||
@ -0,0 +1,16 @@ |
|||||
|
# Generated by Django 5.2.9 on 2025-12-17 13:26 |
||||
|
|
||||
|
from django.db import migrations |
||||
|
|
||||
|
|
||||
|
class Migration(migrations.Migration): |
||||
|
dependencies = [ |
||||
|
("hadis", "0046_transmitters_slug"), |
||||
|
] |
||||
|
|
||||
|
operations = [ |
||||
|
migrations.RemoveField( |
||||
|
model_name="transmitters", |
||||
|
name="slug", |
||||
|
), |
||||
|
] |
||||
@ -0,0 +1,19 @@ |
|||||
|
# Generated by Django 5.2.9 on 2025-12-17 13:26 |
||||
|
|
||||
|
from django.db import migrations, models |
||||
|
|
||||
|
|
||||
|
class Migration(migrations.Migration): |
||||
|
dependencies = [ |
||||
|
("hadis", "0047_remove_transmitters_slug"), |
||||
|
] |
||||
|
|
||||
|
operations = [ |
||||
|
migrations.AddField( |
||||
|
model_name="transmitters", |
||||
|
name="slug", |
||||
|
field=models.SlugField( |
||||
|
blank=True, max_length=255, null=True, verbose_name="slug" |
||||
|
), |
||||
|
), |
||||
|
] |
||||
@ -0,0 +1,19 @@ |
|||||
|
# Generated by Django 5.2.9 on 2025-12-17 13:34 |
||||
|
|
||||
|
from django.db import migrations, models |
||||
|
|
||||
|
|
||||
|
class Migration(migrations.Migration): |
||||
|
dependencies = [ |
||||
|
("hadis", "0048_transmitters_slug"), |
||||
|
] |
||||
|
|
||||
|
operations = [ |
||||
|
migrations.AlterField( |
||||
|
model_name="transmitters", |
||||
|
name="slug", |
||||
|
field=models.SlugField( |
||||
|
blank=True, max_length=255, unique=True, verbose_name="slug" |
||||
|
), |
||||
|
), |
||||
|
] |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue