<<<<<<< HEAD from django.contrib import admin from django.utils.translation import gettext_lazy as _ from dj_category.admin import BaseCategoryAdmin from ajaxdatatable.admin import AjaxDatatable from django.http import JsonResponse from django.urls import path from django.db.models import Q from django.utils.safestring import mark_safe from django.forms.widgets import RadioSelect from apps.hadis.models import * from django import forms from utils.json_editor_field import JsonEditorWidget # Define color choices COLOR_CHOICES = [ ('red', _('Red')), ('blue', _('Blue')), ('green', _('Green')), ('yellow', _('Yellow')), ('orange', _('Orange')), ('purple', _('Purple')), ('pink', _('Pink')), ('brown', _('Brown')), ('gray', _('Gray')), ('black', _('Black')), ] class ColorRadioSelect(RadioSelect): template_name = 'admin/widgets/color_radio.html' option_template_name = 'admin/widgets/color_radio_option.html' def get_links_schema(): return { 'type': "array", 'format': 'table', 'title': ' ', 'items': { 'type': 'object', 'title': str(_('Link')), 'properties': { 'text': {'type': 'string', "format": "textarea",'title': str(_('text'))}, 'link': {'type': 'string', "format": "textarea", 'title': str(_('link'))}, } } } class HadisOverviewForm(forms.ModelForm): status_color = forms.ChoiceField( choices=COLOR_CHOICES, widget=ColorRadioSelect(), required=False ) class Meta: model = HadisOverview fields = '__all__' widgets = { 'links': JsonEditorWidget(attrs={'schema': get_links_schema}), } @admin.register(HadisTag) class HadisTagAdmin(AjaxDatatable): list_display = ['title', 'status'] search_fields = ['title'] class ReferenceImageInline(admin.TabularInline): model = ReferenceImage extra = 1 verbose_name_plural = _('Reference Images') fields = ('thumbnail', 'priority') @admin.register(HadisReference) class HadisReferenceAdmin(AjaxDatatable): list_display = ['hadis', 'book', 'created_at'] list_filter = ['book'] search_fields = ['hadis__title', 'hadis__number', 'description'] autocomplete_fields = ['hadis', 'book'] readonly_fields = ['created_at'] inlines = [ReferenceImageInline] fieldsets = ( (None, { 'fields': ('hadis', 'book', 'description') }), ) @admin.register(HadisOverview) class HadisOverviewAdmin(AjaxDatatable): change_form_template = 'admin/hadisowerview_change_form.html' form = HadisOverviewForm ordering = ['hadis__number'] list_display = ['hadis', 'status', 'created_at'] search_fields = ['hadis__title', 'hadis__number', 'status_text',] autocomplete_fields = ['hadis', 'tags'] fieldsets = ( (None, { 'fields': ('hadis', 'status', 'status_color', 'status_text') }), (_('Reference Information'), { 'fields': ('address', 'share_link',), }), (_('Additional Information'), { 'fields': ('links', 'tags', 'created_at'), 'classes': ('collapse',), ======= from django import forms from django.contrib import admin from django.utils.translation import gettext_lazy as _ from unfold.admin import ModelAdmin, TabularInline from unfold.contrib.forms.widgets import WysiwygWidget from unfold.decorators import display, action from utils.json_editor_field import JsonEditorWidget import json from utils.admin import dovoodi_admin_site,dovoodi_admin_site from ..models import ( Hadis, HadisReference, HadisTag, HadisStatus, ReferenceImage, HadisCollection, HadisInCollection, HadisCorrection ) # Custom Forms for JSON Fields class HadisAdminForm(forms.ModelForm): """Custom form for Hadis with JSON editor widgets""" class Meta: model = Hadis fields = '__all__' widgets = { 'explanation': WysiwygWidget(), } def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # Schema for translation JSON field translation_schema = { "type": "array", "title": "Translations", "items": { "type": "object", "title": "Translation", "properties": { "language_code": { "type": "string", "title": "Language Code", "enum": ["en", "fa", "ar", "ur"], "options": { "enum_titles": ["English", "Persian", "Arabic", "Urdu"] } }, "text": { # <‑‑ use text, not title "type": "string", "title": "Translation Text" } }, "required": ["language_code", "text"] # <‑‑ update required key } } # Schema for links JSON field (array of objects with title and link) links_schema = { "type": "array", "title": "Links", "items": { "type": "object", "title": "Link", "properties": { "title": { "type": "string", "title": "Link Title" }, "link": { "type": "string", "title": "URL", "format": "uri" } }, "required": ["title", "link"] } } # Apply JSON editor widgets self.fields['translation'].widget = JsonEditorWidget(attrs={ 'schema': json.dumps(translation_schema), 'title': 'Translations' }) self.fields['links'].widget = JsonEditorWidget(attrs={ 'schema': json.dumps(links_schema), 'title': 'Links' }) # Inline Admin Classes class ReferenceImageInline(TabularInline): """Inline for ReferenceImage in HadisReference admin""" model = ReferenceImage extra = 0 fields = ('thumbnail', 'priority') ordering = ('priority',) class HadisReferenceInline(TabularInline): """Inline for HadisReference in Hadis admin""" model = HadisReference extra = 0 fields = ('book_reference',) readonly_fields = ('created_at',) # Main Admin Classes class HadisTagAdmin(ModelAdmin): """Admin for HadisTag model""" list_display = ('title', 'status', 'created_at') list_filter = ('status', 'created_at') search_fields = ('title',) readonly_fields = ('created_at', 'updated_at') fieldsets = ( (None, { 'fields': ('title', 'status') }), (_('Timestamps'), { 'fields': ('created_at', 'updated_at'), 'classes': ('collapse',) >>>>>>> develop }), ) <<<<<<< HEAD class HadisOverviewInline(admin.StackedInline): change_form_template = 'admin/hadisowerview_change_form.html' form = HadisOverviewForm model = HadisOverview autocomplete_fields = ['tags', ] can_delete = False verbose_name_plural = _('Hadis Overview') fieldsets = ( (None, { 'fields': ('status', 'status_color', 'status_text', 'address', 'share_link', 'links', 'tags',), }), ) extra = 1 min_num = 1 @admin.register(Hadis) class HadisAdmin(AjaxDatatable): # form = HadisForm list_display = ['number', 'title', 'category', 'status', 'created_at'] list_filter = ['status', 'category'] search_fields = ['title', 'text', 'number'] readonly_fields = ['created_at', 'updated_at'] autocomplete_fields = ['category'] inlines = [HadisOverviewInline] fieldsets = ( (None, { 'fields': ('number', 'title', 'category', 'status') }), (_('Content'), { 'fields': ('text', 'translation'), 'classes': ('collapse',), ======= class HadisStatusAdmin(ModelAdmin): """Admin for HadisStatus model""" list_display = ('title', 'color', 'order') list_filter = ('color',) search_fields = ('title',) ordering = ('order',) fieldsets = ( (None, { 'fields': ('title', 'color', 'order') }), ) class HadisAdmin(ModelAdmin): """Admin for Hadis model""" form = HadisAdminForm list_display = ('number', 'title', 'category', 'status', 'hadis_status', 'created_at') list_filter = ('status', 'hadis_status', 'category', 'created_at') search_fields = ('title', 'text', 'category__title') readonly_fields = ('created_at', 'updated_at', 'share_link') ordering = ('category', 'number') inlines = [HadisReferenceInline] filter_horizontal = ('tags',) fieldsets = ( (None, { 'fields': ('category', 'number', 'title', 'status') }), (_('Content'), { 'fields': ('text', 'translation', 'explanation') }), (_('Status & Classification'), { 'fields': ('hadis_status', 'hadis_status_text', 'tags') }), (_('Additional Information'), { 'fields': ('address', 'links', 'share_link'), 'classes': ('collapse',) }), (_('Timestamps'), { 'fields': ('created_at', 'updated_at'), 'classes': ('collapse',) >>>>>>> develop }), ) <<<<<<< HEAD def get_form(self, request, obj=None, **kwargs): form = super().get_form(request, obj, **kwargs) if obj is None: form.base_fields['category'].widget.can_add_related = False return form ======= class HadisReferenceAdmin(ModelAdmin): """Admin for HadisReference model""" list_display = ('hadis', 'book_reference', 'created_at') list_filter = ('created_at', 'book_reference') search_fields = ('hadis__title', 'book_reference__title') readonly_fields = ('created_at',) inlines = [ReferenceImageInline] fieldsets = ( (None, { 'fields': ('hadis', 'book_reference') }), (_('Timestamps'), { 'fields': ('created_at',), 'classes': ('collapse',) }), ) class ReferenceImageAdmin(ModelAdmin): """Admin for ReferenceImage model""" list_display = ('reference', 'thumbnail', 'priority') list_filter = ('priority',) search_fields = ('reference__hadis__title', 'reference__book__title') ordering = ('reference', 'priority') fieldsets = ( (None, { 'fields': ('reference', 'thumbnail', 'priority') }), ) class HadisInCollectionInline(TabularInline): """Inline for HadisInCollection in HadisCollection admin""" model = HadisInCollection extra = 0 fields = ('hadis', 'order') ordering = ('order',) class HadisCollectionAdmin(ModelAdmin): """Admin for HadisCollection model""" list_display = ('title', 'slug', 'status', 'order', 'created_at') list_filter = ('status', 'created_at') search_fields = ('title', 'slug', 'summary') readonly_fields = ('slug', 'created_at', 'updated_at') ordering = ('order',) inlines = [HadisInCollectionInline] fieldsets = ( (None, { 'fields': ('title', 'slug', 'summary', 'status', 'order', 'thumbnail') }), (_('Timestamps'), { 'fields': ('created_at', 'updated_at'), 'classes': ('collapse',) }), ) class HadisInCollectionAdmin(ModelAdmin): """Admin for HadisInCollection model""" list_display = ('hadis', 'collection', 'order', 'created_at') list_filter = ('collection', 'created_at') search_fields = ('hadis__title', 'collection__title') readonly_fields = ('created_at',) ordering = ('collection', 'order') fieldsets = ( (None, { 'fields': ('hadis', 'collection', 'order') }), (_('Timestamps'), { 'fields': ('created_at',), 'classes': ('collapse',) }), ) class HadisCorrectionAdminForm(forms.ModelForm): """Custom form for HadisCorrection with JSON editor widgets""" class Meta: model = HadisCorrection fields = '__all__' def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # Schema for title JSON field title_schema = { "type": "array", "title": "Titles", "items": { "type": "object", "title": "Title", "properties": { "language_code": { "type": "string", "title": "Language Code", "enum": ["en", "fa", "ar", "ur", "ru"], "options": { "enum_titles": ["English", "Persian", "Arabic", "Urdu", "Russian"] } }, "text": { "type": "string", "title": "Title Text" } }, "required": ["language_code", "text"] } } # Schema for description JSON field description_schema = { "type": "array", "title": "Descriptions", "items": { "type": "object", "title": "Description", "properties": { "language_code": { "type": "string", "title": "Language Code", "enum": ["en", "fa", "ar", "ur", "ru"], "options": { "enum_titles": ["English", "Persian", "Arabic", "Urdu", "Russian"] } }, "text": { "type": "string", "title": "Description Text" } }, "required": ["language_code", "text"] } } # Schema for translation JSON field translation_schema = { "type": "array", "title": "Translations", "items": { "type": "object", "title": "Translation", "properties": { "language_code": { "type": "string", "title": "Language Code", "enum": ["en", "fa", "ar", "ur", "ru"], "options": { "enum_titles": ["English", "Persian", "Arabic", "Urdu", "Russian"] } }, "text": { "type": "string", "title": "Translation Text" } }, "required": ["language_code", "text"] } } # Apply JSON editor widgets self.fields['title'].widget = JsonEditorWidget(attrs={ 'schema': json.dumps(title_schema), 'title': 'Titles' }) self.fields['description'].widget = JsonEditorWidget(attrs={ 'schema': json.dumps(description_schema), 'title': 'Descriptions' }) self.fields['translation'].widget = JsonEditorWidget(attrs={ 'schema': json.dumps(translation_schema), 'title': 'Translations' }) class HadisCorrectionAdmin(ModelAdmin): """Admin for HadisCorrection model""" form = HadisCorrectionAdminForm list_display = ('hadis', 'title', 'slug', 'created_at') list_filter = ('created_at', 'hadis__category') search_fields = ('hadis__title', 'title', 'slug') readonly_fields = ('slug', 'created_at', 'updated_at', 'share_link') ordering = ('-created_at',) fieldsets = ( (None, { 'fields': ('hadis', 'title', 'slug') }), (_('Content'), { 'fields': ('description', 'translation') }), (_('Additional Information'), { 'fields': ('share_link',), 'classes': ('collapse',) }), (_('Timestamps'), { 'fields': ('created_at', 'updated_at'), 'classes': ('collapse',) }), ) # Register models with dovoodi admin site dovoodi_admin_site.register(HadisTag, HadisTagAdmin) dovoodi_admin_site.register(HadisStatus, HadisStatusAdmin) dovoodi_admin_site.register(Hadis, HadisAdmin) dovoodi_admin_site.register(HadisReference, HadisReferenceAdmin) dovoodi_admin_site.register(ReferenceImage, ReferenceImageAdmin) dovoodi_admin_site.register(HadisCollection, HadisCollectionAdmin) dovoodi_admin_site.register(HadisInCollection, HadisInCollectionAdmin) dovoodi_admin_site.register(HadisCorrection, HadisCorrectionAdmin) >>>>>>> develop