From 0b84607017ad4f2332059d425549787071a2f443 Mon Sep 17 00:00:00 2001 From: mohsentaba Date: Tue, 6 Jan 2026 15:00:50 +0330 Subject: [PATCH] creating hadith reference and reference images on server --- .../commands/populate_refrence_images.py | 93 +++++++++++++++++++ entrypoint.sh | 3 +- 2 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 apps/hadis/management/commands/populate_refrence_images.py diff --git a/apps/hadis/management/commands/populate_refrence_images.py b/apps/hadis/management/commands/populate_refrence_images.py new file mode 100644 index 0000000..ec2d78e --- /dev/null +++ b/apps/hadis/management/commands/populate_refrence_images.py @@ -0,0 +1,93 @@ +import os +import random +from django.core.management.base import BaseCommand +from django.core.files import File +from django.conf import settings +# REMEMBER: Change 'your_app' to your actual app name +from apps.hadis.models.hadis import Hadis, HadisReference, ReferenceImage +from apps.hadis.models.reference import BookReference + +class Command(BaseCommand): + help = 'Wipes old reference data and seeds new HadisReference and ReferenceImages' + + def handle(self, *args, **kwargs): + self.stdout.write(self.style.WARNING('--- Starting Cleanup ---')) + + # 1. DELETE PREVIOUS DATA + # We delete HadisReference. Because of on_delete=models.CASCADE in ReferenceImage, + # deleting the reference will automatically delete the associated images. + # However, we can delete both explicitly to be sure and show counts. + + deleted_imgs_count, _ = ReferenceImage.objects.all().delete() + deleted_refs_count, _ = HadisReference.objects.all().delete() + + self.stdout.write(self.style.SUCCESS(f'Deleted {deleted_imgs_count} old ReferenceImages.')) + self.stdout.write(self.style.SUCCESS(f'Deleted {deleted_refs_count} old HadisReferences.')) + self.stdout.write('------------------------') + + # 2. Setup Paths for Seeding + base_image_path = os.path.join(settings.BASE_DIR, 'seeds', 'images') + # We look for ref1.png, ref2.png, ref3.png, ref4.png + image_files = [f'ref{i}.png' for i in range(1, 5)] + + # Verify images exist locally before starting + for img_name in image_files: + full_path = os.path.join(base_image_path, img_name) + if not os.path.exists(full_path): + self.stdout.write(self.style.ERROR(f'CRITICAL ERROR: Image not found at {full_path}')) + return + + # 3. Fetch Parents + books = list(BookReference.objects.all()) + hadiths = list(Hadis.objects.all()) + + if len(hadiths) < 2: + self.stdout.write(self.style.ERROR('Not enough Hadiths in DB (need at least 2).')) + return + + if not books: + self.stdout.write(self.style.ERROR('No BookReferences found in DB.')) + return + + self.stdout.write('--- Starting Seeding ---') + + counter_refs = 0 + counter_imgs = 0 + + # 4. Iterate Books (Constraint 1: Each book must relate to at least 2 hadith) + for book in books: + # Pick 2 random hadiths for this book + selected_hadiths = random.sample(hadiths, 2) + + for hadis_obj in selected_hadiths: + # Create the Link (HadisReference) + hadis_ref = HadisReference.objects.create( + hadis=hadis_obj, + book_reference=book, + description=[ + {'language_code': 'en', 'text': f'Reference for {book.title[0].get("text", "Book")} - Hadith {hadis_obj.number}'}, + {'language_code': 'ar', 'text': 'وصف مرجعي'} + ] + ) + counter_refs += 1 + + # 5. Connect Images (Constraint 2: Each hadith ref must have 2 images) + # We pick 2 random images from our list of 4 + selected_images = random.sample(image_files, 2) + + for priority_index, img_name in enumerate(selected_images): + img_path = os.path.join(base_image_path, img_name) + + with open(img_path, 'rb') as f: + # Create ReferenceImage + ref_img = ReferenceImage( + reference=hadis_ref, + priority=priority_index # 0 and 1 + ) + # Save file to the ImageField + ref_img.thumbnail.save(img_name, File(f), save=True) + counter_imgs += 1 + + self.stdout.write(self.style.SUCCESS( + f'DONE: Created {counter_refs} HadisReferences and {counter_imgs} ReferenceImages.' + )) \ No newline at end of file diff --git a/entrypoint.sh b/entrypoint.sh index 12bbaf3..515ac32 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -6,6 +6,7 @@ python manage.py migrate python manage.py collectstatic --noinput # python manage.py populate_books -python manage.py populate_book_reference +# python manage.py populate_book_reference +python manage.py populate_reference_images exec "$@"