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.
55 lines
2.1 KiB
55 lines
2.1 KiB
# -*- coding: utf-8 -*-
|
|
import random
|
|
from django.core.management.base import BaseCommand
|
|
from django.core.cache import cache
|
|
from apps.hadis.models import Hadis, HadisCorrection, HadisInterpretation
|
|
|
|
|
|
ISLAMIC_ENCYCLOPEDIA_SOURCES = [
|
|
("Al-Islam Encyclopedia", "https://www.al-islam.org/articles/hadith-studies-"),
|
|
("Shamela Digital Library", "https://shamela.ws/book/"),
|
|
("WikiShia Encyclopedia", "https://en.wikishia.net/view/Hadith_"),
|
|
("Thaqalayn Hadith Library", "https://thaqalayn.net/hadith/"),
|
|
("Sunnah Hadith Collection", "https://sunnah.com/bukhari/"),
|
|
("Dorar Encyclopedia", "https://dorar.net/hadith/"),
|
|
("IslamWeb Reference", "https://www.islamweb.net/ar/hadith/"),
|
|
("HadithDB Archive", "https://hadithdb.com/tradition/"),
|
|
]
|
|
|
|
|
|
def generate_islamic_links(seed_id: int) -> dict:
|
|
rng = random.Random(seed_id)
|
|
count = rng.randint(2, 3)
|
|
chosen = rng.sample(ISLAMIC_ENCYCLOPEDIA_SOURCES, count)
|
|
links = {}
|
|
for title, base_url in chosen:
|
|
ref_num = rng.randint(100, 4999)
|
|
links[title] = f"{base_url}{ref_num}"
|
|
return links
|
|
|
|
|
|
class Command(BaseCommand):
|
|
help = "Populates 2-3 realistic Islamic encyclopedia links for Hadis, HadisCorrection, and HadisInterpretation records."
|
|
|
|
def handle(self, *args, **options):
|
|
self.stdout.write("Populating Islamic encyclopedia links for Hadis, HadisCorrection, and HadisInterpretation...")
|
|
|
|
for model in (HadisCorrection, HadisInterpretation, Hadis):
|
|
rows = list(model.objects.only("id", "links"))
|
|
to_update = []
|
|
for obj in rows:
|
|
if not obj.links or obj.links == {} or obj.links == []:
|
|
obj.links = generate_islamic_links(obj.id)
|
|
to_update.append(obj)
|
|
|
|
if to_update:
|
|
model.objects.bulk_update(to_update, ["links"], batch_size=500)
|
|
|
|
self.stdout.write(
|
|
self.style.SUCCESS(
|
|
f"Updated {len(to_update)} {model.__name__} records (total {len(rows)})."
|
|
)
|
|
)
|
|
|
|
cache.clear()
|
|
self.stdout.write(self.style.SUCCESS("Cleared Django cache successfully."))
|