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.
276 lines
11 KiB
276 lines
11 KiB
"""
|
|
Django management command to seed mock data for hadith book references.
|
|
Place this file in: yourapp/management/commands/seed_books.py
|
|
|
|
Usage: python manage.py seed_books
|
|
"""
|
|
|
|
import os
|
|
from pathlib import Path
|
|
from django.core.management.base import BaseCommand
|
|
from django.core.files.base import ContentFile
|
|
from django.utils.text import slugify
|
|
from apps.hadis.models.reference import (
|
|
BookReference,
|
|
BookReferenceImage,
|
|
BookAuthor,
|
|
BookAttribute
|
|
)
|
|
|
|
|
|
class Command(BaseCommand):
|
|
help = 'Seed the database with mock hadith book reference data'
|
|
|
|
def add_arguments(self, parser):
|
|
parser.add_argument(
|
|
'--clear',
|
|
action='store_true',
|
|
help='Clear existing data before seeding',
|
|
)
|
|
|
|
def handle(self, *args, **options):
|
|
if options['clear']:
|
|
self.stdout.write(self.style.WARNING('Clearing existing data...'))
|
|
BookAttribute.objects.all().delete()
|
|
BookReferenceImage.objects.all().delete()
|
|
BookAuthor.objects.all().delete()
|
|
BookReference.objects.all().delete()
|
|
self.stdout.write(self.style.SUCCESS('Data cleared successfully!'))
|
|
|
|
# Create authors first
|
|
authors_data = [
|
|
{"name": "Imam Muhammad al-Bukhari"},
|
|
{"name": "Imam Muslim ibn al-Hajjaj"},
|
|
{"name": "Imam Abu Dawood as-Sijistani"},
|
|
{"name": "Imam At-Tirmidhi"},
|
|
{"name": "Imam Ibn Majah"},
|
|
{"name": "Imam Ahmad ibn Hanbal"},
|
|
{"name": "Imam Al-Hakim"},
|
|
{"name": "Imam Ad-Daraqutni"},
|
|
]
|
|
|
|
authors = {}
|
|
for author_data in authors_data:
|
|
author, created = BookAuthor.objects.get_or_create(
|
|
name=author_data['name']
|
|
)
|
|
authors[author_data['name']] = author
|
|
if created:
|
|
self.stdout.write(self.style.SUCCESS(f'Created author: {author.name}'))
|
|
|
|
# Create book references
|
|
books_data = [
|
|
{
|
|
"title": "Sahih al-Bukhari",
|
|
"description": "The most authentic collection of hadith, compiled by Imam Muhammad al-Bukhari. Contains 7,563 ahadith.",
|
|
"language": "Arabic",
|
|
"isbn": "978-1-86043-009-6",
|
|
"volume": "9 volumes",
|
|
"year_of_publication": "1870",
|
|
"number_page": 1200,
|
|
"publisher": "Dar al-Kutub al-Ilmiyah",
|
|
"rate": 5.00,
|
|
"authors": ["Imam Muhammad al-Bukhari"],
|
|
"image_order": 1,
|
|
"attributes": {
|
|
"Collection Type": "Hadith Compilation",
|
|
"Number of Hadith": "7,563",
|
|
"Classification": "6 Books",
|
|
"Authenticity Grade": "Sahih (Authentic)",
|
|
"Compilation Period": "16 years",
|
|
}
|
|
},
|
|
{
|
|
"title": "Sahih Muslim",
|
|
"description": "Second most authentic hadith collection compiled by Imam Muslim ibn al-Hajjaj. Contains 9,200 traditions.",
|
|
"language": "Arabic",
|
|
"isbn": "978-1-86043-010-2",
|
|
"volume": "5 volumes",
|
|
"year_of_publication": "1875",
|
|
"number_page": 1500,
|
|
"publisher": "Dar Ihya at-Turath al-Arabi",
|
|
"rate": 4.95,
|
|
"authors": ["Imam Muslim ibn al-Hajjaj"],
|
|
"image_order": 2,
|
|
"attributes": {
|
|
"Collection Type": "Hadith Compilation",
|
|
"Number of Hadith": "9,200",
|
|
"Classification": "43 Books",
|
|
"Authenticity Grade": "Sahih (Authentic)",
|
|
"Unique Hadith": "Approximately 4,000",
|
|
}
|
|
},
|
|
{
|
|
"title": "Sunan Abu Dawood",
|
|
"description": "A comprehensive collection of hadith containing jurisprudential material, compiled by Imam Abu Dawood as-Sijistani.",
|
|
"language": "Arabic",
|
|
"isbn": "978-1-86043-011-9",
|
|
"volume": "4 volumes",
|
|
"year_of_publication": "1880",
|
|
"number_page": 1400,
|
|
"publisher": "Islamic Digital Library",
|
|
"rate": 4.80,
|
|
"authors": ["Imam Abu Dawood as-Sijistani"],
|
|
"image_order": 3,
|
|
"attributes": {
|
|
"Collection Type": "Sunan (Practice)",
|
|
"Number of Hadith": "5,274",
|
|
"Focus": "Jurisprudential Traditions",
|
|
"Number of Books": "43",
|
|
"Authenticity Grade": "Hasan to Sahih",
|
|
}
|
|
},
|
|
{
|
|
"title": "Jami' at-Tirmidhi",
|
|
"description": "A major collection of hadith compiled by Imam At-Tirmidhi with his commentary and grading of narrations.",
|
|
"language": "Arabic",
|
|
"isbn": "978-1-86043-012-6",
|
|
"volume": "5 volumes",
|
|
"year_of_publication": "1892",
|
|
"number_page": 1350,
|
|
"publisher": "Dar ar-Risalah al-Alamiyah",
|
|
"rate": 4.85,
|
|
"authors": ["Imam At-Tirmidhi"],
|
|
"image_order": 4,
|
|
"attributes": {
|
|
"Collection Type": "Jami (Comprehensive)",
|
|
"Number of Hadith": "3,956",
|
|
"Notable Feature": "Grades each hadith",
|
|
"Categories": "63 Chapters",
|
|
"Authenticity Grade": "Various Grades",
|
|
}
|
|
},
|
|
{
|
|
"title": "Sunan Ibn Majah",
|
|
"description": "A collection of hadith compiled by Imam Ibn Majah, one of the Six Canonical Hadith Collections.",
|
|
"language": "Arabic",
|
|
"isbn": "978-1-86043-013-3",
|
|
"volume": "2 volumes",
|
|
"year_of_publication": "1888",
|
|
"number_page": 900,
|
|
"publisher": "Dar Ihya al-Kutub al-Arabiyah",
|
|
"rate": 4.75,
|
|
"authors": ["Imam Ibn Majah"],
|
|
"image_order": 5,
|
|
"attributes": {
|
|
"Collection Type": "Sunan (Practice)",
|
|
"Number of Hadith": "4,341",
|
|
"Number of Books": "32",
|
|
"Notable Content": "Includes rare narrations",
|
|
"Authenticity Grade": "Mixed - requires verification",
|
|
}
|
|
},
|
|
]
|
|
|
|
books = {}
|
|
for book_data in books_data:
|
|
# Extract author names
|
|
author_names = book_data.pop('authors', [])
|
|
image_order = book_data.pop('image_order', 1)
|
|
attributes_dict = book_data.pop('attributes', {})
|
|
|
|
# Create or get the book
|
|
book, created = BookReference.objects.get_or_create(
|
|
title=book_data['title'],
|
|
defaults=book_data
|
|
)
|
|
|
|
if created:
|
|
self.stdout.write(self.style.SUCCESS(f'Created book: {book.title}'))
|
|
else:
|
|
# Update existing book
|
|
for key, value in book_data.items():
|
|
setattr(book, key, value)
|
|
book.save()
|
|
self.stdout.write(self.style.WARNING(f'Updated book: {book.title}'))
|
|
|
|
books[book.title] = book
|
|
|
|
# Add authors to book
|
|
for author_name in author_names:
|
|
author = authors.get(author_name)
|
|
if author:
|
|
book.authors.add(author)
|
|
|
|
# Add book image
|
|
image_path = self._get_image_path(image_order)
|
|
if image_path and os.path.exists(image_path):
|
|
# Check if image already exists for this book
|
|
if not book.images.exists():
|
|
with open(image_path, 'rb') as img_file:
|
|
image_name = f'book{image_order}.png'
|
|
book_image = BookReferenceImage.objects.create(
|
|
book_reference=book,
|
|
order=1,
|
|
description=f"Cover image for {book.title}"
|
|
)
|
|
book_image.image.save(
|
|
image_name,
|
|
ContentFile(img_file.read()),
|
|
save=True
|
|
)
|
|
self.stdout.write(
|
|
self.style.SUCCESS(f'Added image to: {book.title}')
|
|
)
|
|
else:
|
|
self.stdout.write(
|
|
self.style.WARNING(
|
|
f'Image not found at {image_path} for {book.title}'
|
|
)
|
|
)
|
|
|
|
# Add attributes
|
|
for attr_title, attr_value in attributes_dict.items():
|
|
attribute, created = BookAttribute.objects.get_or_create(
|
|
book_reference=book,
|
|
title=attr_title,
|
|
defaults={'value': attr_value}
|
|
)
|
|
if created:
|
|
self.stdout.write(
|
|
self.style.SUCCESS(
|
|
f'Added attribute: {attr_title} to {book.title}'
|
|
)
|
|
)
|
|
|
|
self.stdout.write(
|
|
self.style.SUCCESS(
|
|
f'\n✓ Successfully seeded {len(books)} books with all relations!'
|
|
)
|
|
)
|
|
self._print_summary()
|
|
|
|
def _get_image_path(self, book_number):
|
|
"""
|
|
Find the image file for the given book number.
|
|
Checks multiple possible locations.
|
|
"""
|
|
possible_paths = [
|
|
Path('seeds/images') / f'book{book_number}.png',
|
|
Path('seed_data/images') / f'book{book_number}.png',
|
|
Path('static/images') / f'book{book_number}.png',
|
|
Path('.') / 'seeds' / 'images' / f'book{book_number}.png',
|
|
]
|
|
|
|
for path in possible_paths:
|
|
if path.exists():
|
|
return path
|
|
|
|
return None
|
|
|
|
def _print_summary(self):
|
|
"""Print a summary of created data"""
|
|
self.stdout.write("\n" + "="*60)
|
|
self.stdout.write(self.style.SUCCESS("DATABASE SUMMARY"))
|
|
self.stdout.write("="*60)
|
|
|
|
books_count = BookReference.objects.count()
|
|
authors_count = BookAuthor.objects.count()
|
|
images_count = BookReferenceImage.objects.count()
|
|
attributes_count = BookAttribute.objects.count()
|
|
|
|
self.stdout.write(f"📚 Total Books: {books_count}")
|
|
self.stdout.write(f"✍️ Total Authors: {authors_count}")
|
|
self.stdout.write(f"🖼️ Total Images: {images_count}")
|
|
self.stdout.write(f"🏷️ Total Attributes: {attributes_count}")
|
|
self.stdout.write("="*60 + "\n")
|