- Use OptionalPagination on AdminBookEditionViewSet (page/page_size), keep full list when not requested
- Extend edition search to title, publisher, year and connected book titles
- Add select_related/prefetch_related and use prefetched data in AdminBookEditionSerializer (54 -> 6 queries per page)
- Add books_detail field; fix editors update logic being nested under wrong condition
- Fallback book_reference to first connected book when missing
- Implement auto_populate_title on TransmitterOriginalText model using linked BookReference title
- Auto-fill title in serializer create/update and OriginalTextReference viewset
- Ensure smart slug and share_link are updated accordingly when title is auto-populated
- Auto-populate title_narrator using 1st narrator known_as (or full_name) for hadith arguments
- Auto-populate title_narrator using reference book author known_as (or name) for non-hadith arguments
- Hook into Hadis.save, AdminHadisDetailSerializer create/update, and AdminHadisTransmitterViewSet relations
- Preserve manual entries when title_narrator is explicitly modified
- Add Country model for transmitters and reference publishers
- Add Publisher model linked to Country and City
- Add migration 0065 for Country and Publisher models
- Expose AdminCountrySerializer, AdminPublisherSerializer, and respective viewsets in admin URLs
- Add RelationType and TransmitterProfession models with two-way sync
- Add migrations 0063 and 0064 for relation types and professions seeding and data migration
- Register RelationType admin serializer, viewset and URL routes
- Update relational migration roadmap documentation
- Introduce Madhhab model with multilingual title, description, and slug
- Link madhhabs relation (ManyToMany) to Transmitters
- Add migration 0062 to create table and populate from existing madhab JSON data
- Register DovodiMadhhabViewSet and admin routes in urls.py
- Update RELATIONAL_MIGRATION_ROADMAP.md for madhhab migration
- Add SahabiStatus model with multilingual title, description, and slug
- Add ForeignKey sahabi_status to Transmitters model
- Create migration 0061 to create SahabiStatus and populate from existing companion_type
- Register DovodiSahabiStatusViewSet and admin routes in urls.py
- Update RELATIONAL_MIGRATION_ROADMAP.md for sahabi_status migration
- Introduce TransmitterFeature model with title, slug, and timestamps
- Link features relation to Transmitters and BookAuthors
- Add DovodiTransmitterFeatureViewSet and register routes in admin router
- Add migration 0060 to create table and populate from existing features data
- Update RELATIONAL_MIGRATION_ROADMAP.md with completed features migration
- Add City model and connect origin_city, lived_in_city, and died_in_city to Transmitters and BookAuthors
- Connect city_of_publication_city to BookEdition
- Add Kunya model and connect many-to-many kunyas relation to Transmitters
- Implement DovodiCityViewSet and DovodiKunyaViewSet and register routes in admin router
- Add migrations 0057, 0058, and 0059 to create tables and migrate existing string/JSON data
- Convert birth_year_hijri and death_year_hijri to CharField and add age_at_death
- Introduce BookAuthorDate model linking BookAuthor with parsed YearValue records
- Add sync_author_dates and date formatting methods to BookAuthor
- Support century filtering via YearValue min/max ranges and prefetch author dates
- Expose live preview fields and canonical date validation in AdminBookAuthorSerializer
- Add migration 0056 to convert fields and populate BookAuthorDate records
- Add date_engine utility for parsing exact, range, circa, before, after, and #context dates
- Introduce YearValue and NarratorDate models to index and translate narrator dates
- Add description field to OpinionStatus and TransmitterReliability models
- Register DovodiYearValueViewSet and DovodiBookAuthorRutbaViewSet admin endpoints
- Add parse-preview action for validating and translating date inputs
- Add migration 0055 to populate YearValue and NarratorDate from existing transmitters
- Introduce BookAuthorRutba model with title, slug, color, and description
- Link BookAuthor to BookAuthorRutba via rutba_status foreign key
- Update reference admin to manage BookAuthorRutba and assign rutba status
- Include rutba_detail in BookAuthorDetailSerializer and BookAuthorSyncSerializer
- Add migration 0054 to seed rutba records from existing authors
- Create ScholarlyOpinion model for standalone reusable scholarly opinions with status and multilingual text
- Add foreign key link from TransmitterOpinion to ScholarlyOpinion with automatic backward sync
- Create data migration 0053 to populate ScholarlyOpinion records from existing transmitter opinions
- Expose DovodiScholarlyOpinionViewSet and register route /dovodi-opinions/ in admin router
- Update TransmitterOpinion serializers and views to prioritize linked ScholarlyOpinion data
- Add bulk-assign-topics endpoint to AdminHadisViewSet supporting add/replace modes
- Validate leaf topic constraints and handle both M2M categories and primary category_id
- Invalidate hadis cache on bulk updates and return updated count with category details
- Expand AdminHadisBriefSerializer with slug, title_narrator, and status fields
- Update annotate_and_prune_empty_categories helper to count active content from both category and categories relations in subtree
- Check both category and categories in category serializers (get_has_hadis, get_hadis_count, get_children_count)
- Support categories M2M relation in HadisSyncView and HadisMainListView filters
- Remove aggressive cached_view decorator from category tree and listing routes to ensure real-time consistency
- Add is_consultant_panel_user method and grant consultant panel access
- Handle Consultant Group assignment in AdminUserSerializer
- Support consultant login in AdminLoginView
- Add consultant filter option in AdminUserViewSet and AdminUserDirectoryViewSet
- Unify support specialist sender name to 'Islamic Scholar'
- Add GenderChoices (male/female) field to Transmitters model with migration 0052
- Include gender across public and admin transmitter serializers
- Expose gender in TransmittersAdmin filter and list display
- Propagate transmitter gender in HadisCategoryXMindView flowchart payload
- Add split_transmitters_gender management command
- Delete associated SupportRoom on User.soft_delete()
- Add cleanup_deleted_or_inactive_support_rooms to purge inactive/soft-deleted users' rooms
- Filter admin rooms list and total unread counter to active users with messages only
- Apply active_support_rooms_queryset filter to room retrieval and reply endpoints
- Add guest_merge.py to resolve guest accounts via token, device_id, and web IP+UA fingerprint
- Implement merge_guest_user_data for support rooms, messages, bookmarks, and ratings
- Trigger guest merging in UserVerifyView on verification and UserLoginView on authentication
- Automatically merge guest support conversations in resolve_user_support_room for logged-in users
- Add AdminSupportRoomSerializer, AdminSupportMessageSerializer, and user serialization utilities
- Implement AdminSupportRoomListView for listing and searching rooms with total unread counters
- Implement AdminSupportRoomByUserView for starting or opening rooms by user_id
- Implement AdminSupportRoomMessagesView for message retrieval and sending specialist responses
- Implement AdminSupportMessageDetailView for message editing and deletion
- Enforce staff/admin authorization with IsSupportAdminPanelUser permission
- Add SupportRoom and SupportMessage models with automated status and unread counters
- Implement API endpoints for message history, message sending, and unread checking
- Support guest session tracking and seamless room migration via X-Guest-Token
- Register SupportRoom and inline messages in Unfold admin dashboard
- Add initial migration 0001_initial and register app in settings and URLs
- Add migrate_leaf_categories_to_topics command to migrate legacy leaf categories to topics
- Add diversify_topic_sources command to balance and distribute distinct source types (hadith, quran, history, fatwa, quote) under parent categories
- Support --dry-run flag and automatic cache invalidation
- Add is_topic boolean field to HadisCategory model with indexing
- Enforce validation rules in clean():
* Topics cannot have children and must define a source_type
* Structural categories cannot contain hadiths and have source_type=None
* Parents cannot be topics
* Hadiths can only be attached to topics (is_topic=True)
- Update admin serializers and views to support is_topic filtering and mapping
- Expose is_topic in public category serializers (SimpleCategory, HadisCategorySelectSerializer, CategorySerializer)
- Include migration 0051_add_category_is_topic
- Add narrator and transmitter filtering support to HadisMainListView and HadisListView by slug or ID
- Include available narrators list with localized names in HadisFiltersView endpoint
- Document narrator query parameter in Swagger schema
- Add cleanup_non_hadith_narrators.py script to remove orphan/erroneous narrator chains and layers from non-hadith arguments
- Add utils/search_parser.py providing query parsing and Django Q construction for exact phrases, mandatory inclusions (+), excluded negations (-), and grouped OR conditions (()).
- Add auto-balancing and sanitization for unclosed quotes and parentheses.
- Seamlessly integrate all operator terms with Arabic and Persian search normalization.
- Update search querysets across Hadis, Transmitters, Book References, and Categories views.
- Add utils/text_normalizer.py providing robust Arabic and Persian orthographic normalization (diacritics/tashkeel removal, unification of Alef variants, Yeh/Alef Maksura, Kaf, Teh Marbuta, Waw Hamza, Tatweel, and digit normalization).
- Implement recursive text extraction from multilingual JSON structures and models.
- Add normalized_text shadow column across Hadis, HadisCorrection, HadisInterpretation, Transmitters, BookReference, and HadisCategory models with automated save-time synchronization.
- Apply database migrations (0048 and 0049).
- Add populate_normalized_search management command for backfilling existing records.
- Update search querysets in hadis, transmitter, book reference, and category views to filter using normalized text queries.
- Add comprehensive documentation in docs/ARABIC_SEARCH_NORMALIZATION_GUIDE.md.