From 0a66b9c0e30d9d8c47ff573803b40d1661aeeca3 Mon Sep 17 00:00:00 2001 From: salah Date: Thu, 26 Feb 2026 23:39:32 +0100 Subject: [PATCH] fix: Update fields to use Optional type for better clarity and handling of null values --- app/config.py | 2 +- app/models/schemas.py | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/app/config.py b/app/config.py index 2af983f..db41121 100644 --- a/app/config.py +++ b/app/config.py @@ -5,7 +5,7 @@ from functools import lru_cache class Settings(BaseSettings): app_name: str = "Hadith Scholar API" app_version: str = "0.1.0" - debug: bool = False + debug: Optional[bool] = None # PostgreSQL pg_host: str = "pg.betelgeusebytes.io" diff --git a/app/models/schemas.py b/app/models/schemas.py index 3b74fa6..c5e4e7c 100644 --- a/app/models/schemas.py +++ b/app/models/schemas.py @@ -67,8 +67,8 @@ class TopicTag(BaseModel): class NarratorInChain(BaseModel): order: int = Field(description="Position in chain: 1=closest to compiler, last=closest to Prophet ﷺ") name_arabic: str = Field(description="Narrator's Arabic name as it appears in the hadith text") - name_transliterated: str = Field("", description="Latin transliteration of the name") - entity_type: str = Field("", description="PERSON, KUNYA (أبو/أم), NISBA (attributional), or TITLE (رسول الله)") + name_transliterated: Optional[str] = Field(None, description="Latin transliteration of the name") + entity_type: Optional[str] = Field(None, description="PERSON, KUNYA (أبو/أم), NISBA (attributional), or TITLE (رسول الله)") transmission_verb: Optional[str] = Field(None, description="Exact Arabic transmission verb: حدثنا، أخبرنا، عن، سمعت") model_config = { @@ -121,8 +121,8 @@ class HadithDetail(BaseModel): class NarratorSummary(BaseModel): name_arabic: str = Field(description="Primary Arabic name") - name_transliterated: str = Field("", description="Latin transliteration") - entity_type: str = Field("", description="PERSON, KUNYA, NISBA, TITLE") + name_transliterated: Optional[str] = Field(None, description="Latin transliteration") + entity_type: Optional[str] = Field(None, description="PERSON, KUNYA, NISBA, TITLE") generation: Optional[str] = Field(None, description="طبقة: صحابي، تابعي، تابع التابعين") reliability_grade: Optional[str] = Field(None, description="جرح وتعديل: ثقة، صدوق، ضعيف، متروك") hadith_count: int = Field(0, description="Number of hadiths this narrator appears in") @@ -166,8 +166,8 @@ class PlaceRelation(BaseModel): class NarratorProfile(BaseModel): name_arabic: str = Field(description="Primary Arabic name") - name_transliterated: str = Field("", description="Latin transliteration") - entity_type: str = Field("", description="PERSON, KUNYA, NISBA, TITLE") + name_transliterated: Optional[str] = Field(None, description="Latin transliteration") + entity_type: Optional[str] = Field(None, description="PERSON, KUNYA, NISBA, TITLE") full_nasab: Optional[str] = Field(None, description="Full lineage: فلان بن فلان بن فلان") kunya: Optional[str] = Field(None, description="أبو/أم name (e.g. أبو هريرة)") nisba: Optional[str] = Field(None, description="Attributional name (e.g. البخاري، المدني، الزهري)") @@ -226,8 +226,8 @@ class NarratorProfile(BaseModel): class IsnadNode(BaseModel): name_arabic: str = Field(description="Narrator Arabic name") - name_transliterated: str = Field("", description="Latin transliteration") - entity_type: str = Field("", description="PERSON, KUNYA, NISBA, TITLE") + name_transliterated: Optional[str] = Field(None, description="Latin transliteration") + entity_type: Optional[str] = Field(None, description="PERSON, KUNYA, NISBA, TITLE") generation: Optional[str] = Field(None, description="طبقة") reliability_grade: Optional[str] = Field(None, description="جرح وتعديل grade") @@ -271,9 +271,9 @@ class IsnadChain(BaseModel): class NarratorInteraction(BaseModel): narrator_a: str = Field(description="First narrator Arabic name") - narrator_a_transliterated: str = Field("", description="First narrator transliteration") + narrator_a_transliterated: Optional[str] = Field(None, description="First narrator transliteration") narrator_b: str = Field(description="Second narrator Arabic name") - narrator_b_transliterated: str = Field("", description="Second narrator transliteration") + narrator_b_transliterated: Optional[str] = Field(None, description="Second narrator transliteration") relationship_type: str = Field(description="NARRATED_FROM, TEACHER_OF, HEARD_BY, STUDENT_OF") shared_hadith_count: int = Field(0, description="Number of hadiths connecting them") hadith_ids: list[str] = Field(default_factory=list, description="IDs of connecting hadiths (max 20)") @@ -295,7 +295,7 @@ class NarratorInteraction(BaseModel): class NarratorConnection(BaseModel): narrator: str = Field(description="Connected narrator Arabic name") - narrator_transliterated: str = Field("", description="Transliteration") + narrator_transliterated: Optional[str] = Field(None, description="Transliteration") connection_type: str = Field(description="Relationship type") direction: str = Field(description="'incoming' (they → this) or 'outgoing' (this → them)") @@ -311,7 +311,7 @@ class NarratorNetwork(BaseModel): class SemanticSearchResult(BaseModel): hadith: HadithSummary = Field(description="Matching hadith") score: float = Field(description="Cosine similarity score (0-1, higher = more relevant)") - collection: str = Field("", description="Collection name") + collection: Optional[str] = Field(None, description="Collection name") model_config = { "json_schema_extra": {