Browse Source
Add custom forms for JSON fields in Hadis admin
Add custom forms for JSON fields in Hadis admin
- Introduced custom forms for Hadis, HadisCollection, HadisTag, HadisStatus, HadisReference, and Transmitters models to utilize JSON editor widgets for better data management. - Implemented schemas for various JSON fields including titles, descriptions, and addresses to enhance the admin interface. - Updated list displays in admin classes to show the first text from JSON fields for improved readability. - Added a management command to seed HadisStatus descriptions with multilingual definitions based on keywords.master
4 changed files with 983 additions and 51 deletions
-
517apps/hadis/admin/hadis.py
-
243apps/hadis/admin/reference.py
-
164apps/hadis/admin/transmitter.py
-
110apps/hadis/management/commands/seed_hadisstatus.py
@ -0,0 +1,110 @@ |
|||
import json |
|||
from django.core.management.base import BaseCommand |
|||
from django.db import transaction |
|||
# REPLACE 'apps.hadis.models' with your actual app path |
|||
from apps.hadis.models import HadisStatus |
|||
|
|||
class Command(BaseCommand): |
|||
help = 'Updates HadisStatus descriptions mapping Russian/English titles to trilingual academic definitions' |
|||
|
|||
def handle(self, *args, **options): |
|||
self.stdout.write("Starting update of HadisStatus descriptions...") |
|||
|
|||
# 1. DEFINITIONS LIBRARY |
|||
# We define the content for each 'Type' of status found in your DB |
|||
|
|||
# SAHIH (Authentic) -> Matches: "Достоверный", "Authentic / Accepted" |
|||
desc_sahih = { |
|||
'en': "A Sahih (Authentic) Hadith represents the highest level of reliability. It possesses a continuous chain of narrators (Isnad) made up of upright (Adl) and retentive (Dabit) transmitters, free from any hidden defects (Illah) or irregularities (Shudhudh). It is universally accepted for deriving Islamic laws.", |
|||
'fa': "حدیث صحیح بالاترین درجه اعتبار را دارد. این حدیث دارای سندی متصل است که راویان آن عادل و دارای ضبط (حافظه قوی) هستند و در آن هیچگونه علت (عیب پنهان) یا شذوذ (مخالفت با راویان معتبرتر) وجود ندارد. این حدیث مبنای استنباط احکام شرعی است.", |
|||
'ru': "Хадис Сахих (Достоверный) представляет собой высший уровень надежности. Он имеет непрерывную цепочку передатчиков (иснад), состоящую из праведных ('адль) и обладающих хорошей памятью (дабит) людей, свободен от скрытых недостатков ('илля) или отклонений (шузуз). Он безоговорочно принимается для вынесения шариатских решений." |
|||
} |
|||
|
|||
# HASAN (Good) -> Matches: "Хороший" |
|||
desc_hasan = { |
|||
'en': "A Hasan (Good) Hadith is valid and acceptable for legal rulings. It fulfills all conditions of a Sahih hadith (continuity, uprightness, lack of defects), except that the memory or precision of one or more narrators is slightly below the perfect standard required for Sahih.", |
|||
'fa': "حدیث حسن حدیثی معتبر و قابل استناد در احکام است. این حدیث تمام شرایط حدیث صحیح (اتصال سند، عدالت راوی، عدم عیب) را دارد، با این تفاوت که ضبط (دقت و حافظه) یک یا چند نفر از راویان آن کمی پایینتر از حد عالی لازم برای حدیث صحیح است.", |
|||
'ru': "Хадис Хасан (Хороший) является действительным и приемлемым. Он отвечает всем условиям хадиса Сахих (непрерывность, праведность, отсутствие недостатков), за исключением того, что память или точность одного из передатчиков немного ниже идеального стандарта, требуемого для Сахих." |
|||
} |
|||
|
|||
# DA'IF (Weak) -> Matches: "Слабый", "Weak / Needs Review" |
|||
desc_weak = { |
|||
'en': "A Da'if (Weak) Hadith fails to reach the rank of Hasan because it lacks one or more essential conditions of authenticity. This could be due to a disconnection in the chain of narrators or a significant weakness in the character or memory of a narrator. It is generally not used for legal rulings.", |
|||
'fa': "حدیث ضعیف حدیثی است که به درجه حسن نمیرسد زیرا فاقد یک یا چند شرط اصلی صحت است. این امر میتواند ناشی از قطع در سند روایت یا ضعف جدی در شخصیت یا حافظه راوی باشد. این حدیث معمولاً مبنای احکام فقهی قرار نمیگیرد.", |
|||
'ru': "Хадис Даиф (Слабый) не достигает уровня Хасан, так как в нем отсутствует одно или несколько условий достоверности. Это может быть связано с разрывом в цепочке передатчиков или значительной слабостью в характере или памяти передатчика. Обычно он не используется для правовых решений." |
|||
} |
|||
|
|||
# MAWDU (Fabricated) -> Matches: "Выдуманный" |
|||
desc_fabricated = { |
|||
'en': "A Mawdu' (Fabricated) Hadith is a false narration attributed to the Prophet (PBUH) which he did not say. It is considered rejected (Mardud) and is impermissible to convey except to expose its fabrication and warn the community against it.", |
|||
'fa': "حدیث موضوع (جعلی) روایتی دروغین است که به پیامبر (ص) نسبت داده شده در حالی که ایشان آن را نفرمودهاند. این حدیث مردود است و نقل آن حرام میباشد، مگر برای افشای جعلی بودن و هشدار دادن به جامعه درباره آن.", |
|||
'ru': "Хадис Мавду (Выдуманный) — это ложное предание, приписанное Пророку (мир ему), которого он не говорил. Он считается отвергнутым (Мардуд), и его передача запрещена, кроме как для разоблачения его ложности и предостережения общины." |
|||
} |
|||
|
|||
# BROKEN / INTERRUPTED -> Matches: "Разорванный", "Прерванный" |
|||
desc_broken = { |
|||
'en': "This category ('Munqati' or 'Maqtu') refers to a Hadith with a non-continuous chain of transmission. There is a missing link (or links) between the narrators, meaning the person reporting the Hadith did not hear it directly from the source they are quoting.", |
|||
'fa': "این دسته (منقطع یا مقطوع) به حدیثی اشاره دارد که سند آن پیوسته نیست. در زنجیره راویان حلقهای مفقود وجود دارد، به این معنا که نقلکننده حدیث، آن را مستقیماً از کسی که از او نقل میکند، نشنیده است.", |
|||
'ru': "Эта категория ('Мункати' или 'Макту') относится к хадису с прерывистой цепочкой передачи. Между передатчиками отсутствует одно или несколько звеньев; это означает, что человек, передающий хадис, не слышал его непосредственно от источника, который он цитирует." |
|||
} |
|||
|
|||
# UNKNOWN -> Matches: "Неизвестный" |
|||
desc_unknown = { |
|||
'en': "This status ('Majhul') indicates that a narrator in the chain is not identified or their reliability status is unknown to scholars. Without verification of the narrator's identity and trustworthiness, the narration cannot be authenticated.", |
|||
'fa': "این وضعیت (مجهول) نشان میدهد که یکی از راویان در سند شناخته شده نیست یا وضعیت اعتبار او برای علما نامشخص است. بدون احراز هویت و وثاقت راوی، روایت قابل تایید و استناد نمیباشد.", |
|||
'ru': "Этот статус ('Маджхуль') указывает на то, что передатчик в цепочке не идентифицирован или его статус надежности неизвестен ученым. Без подтверждения личности и благонадежности передатчика предание не может быть признано достоверным." |
|||
} |
|||
|
|||
# 2. MAPPING LOGIC |
|||
# We define keywords to look for in the title (searching both English and Russian text) |
|||
mapping_rules = [ |
|||
(['достоверный', 'authentic', 'accepted'], desc_sahih), |
|||
(['хороший', 'good'], desc_hasan), |
|||
(['слабый', 'weak', 'needs review'], desc_weak), |
|||
(['выдуманный', 'fabricated'], desc_fabricated), |
|||
(['разорванный', 'прерванный', 'broken', 'interrupted'], desc_broken), |
|||
(['неизвестный', 'unknown'], desc_unknown), |
|||
] |
|||
|
|||
count = 0 |
|||
qs = HadisStatus.objects.all() |
|||
|
|||
if not qs.exists(): |
|||
self.stdout.write(self.style.WARNING("No HadisStatus objects found.")) |
|||
return |
|||
|
|||
for status in qs: |
|||
# 1. Extract all text from the title list into a single lowercase search string |
|||
# Example title: [{"text": "Достоверный", "language_code": "ru"}] -> "достоверный" |
|||
search_text = "" |
|||
if isinstance(status.title, list): |
|||
search_text = " ".join([item.get('text', '') for item in status.title]).lower() |
|||
|
|||
# 2. Find the correct definition |
|||
selected_desc = None |
|||
found_key = "" |
|||
|
|||
for keywords, description in mapping_rules: |
|||
# Check if ANY keyword exists in the search text |
|||
if any(k in search_text for k in keywords): |
|||
selected_desc = description |
|||
found_key = search_text |
|||
break |
|||
|
|||
# 3. Update or Skip |
|||
if selected_desc: |
|||
# Construct the new JSON format |
|||
new_description = [ |
|||
{"language_code": "en", "text": selected_desc['en']}, |
|||
{"language_code": "fa", "text": selected_desc['fa']}, |
|||
{"language_code": "ru", "text": selected_desc['ru']} |
|||
] |
|||
|
|||
status.description = new_description |
|||
status.save() |
|||
count += 1 |
|||
self.stdout.write(f"Updated ID {status.id} ({found_key}) -> mapped to new description.") |
|||
else: |
|||
self.stdout.write(self.style.WARNING(f"Skipped ID {status.id}: Title '{search_text}' did not match any known categories.")) |
|||
|
|||
self.stdout.write(self.style.SUCCESS(f"Successfully updated {count} HadisStatus descriptions.")) |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue