You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
4.0 KiB
93 lines
4.0 KiB
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.'
|
|
))
|