from django.contrib import admin from .models import ( LandingPageSettings, Partners, Expertise, Product, Inquiry, Testimonial, TeamMember ) @admin.register(LandingPageSettings) class LandingPageSettingsAdmin(admin.ModelAdmin): list_display = ('logo', 'company_address_en') @admin.register(Partners) class PartnersAdmin(admin.ModelAdmin): list_display = ('name_en', 'name_ar', 'order') list_editable = ('order',) ordering = ('order',) @admin.register(Expertise) class ExpertiseAdmin(admin.ModelAdmin): list_display = ('title_en', 'title_ar', 'order') list_editable = ('order',) ordering = ('order',) @admin.register(Product) class ProductAdmin(admin.ModelAdmin): list_display = ('name_en', 'name_ar', 'order', 'link') list_editable = ('order',) ordering = ('order',) @admin.register(Inquiry) class InquiryAdmin(admin.ModelAdmin): list_display = ('name', 'email','message', 'created_at') readonly_fields = ('created_at',) @admin.register(Testimonial) class TestimonialAdmin(admin.ModelAdmin): list_display = ('client_name_en', 'client_name_ar', 'order') list_editable = ('order',) ordering = ('order',) @admin.register(TeamMember) class TeamMemberAdmin(admin.ModelAdmin): list_display = ('name_en', 'name_ar', 'role_en', 'order') list_editable = ('order',) ordering = ('order',) # admin.py import json from django.contrib import admin from django.db.models import Count from rangefilter.filters import DateRangeFilterBuilder # Improved range picker from .models import VisitorLog @admin.register(VisitorLog) class VisitorLogAdmin(admin.ModelAdmin): list_display = ('ip_address', 'country', 'city', 'timestamp') # 1. Add the Date Range Filter to the sidebar list_filter = ( ("timestamp", DateRangeFilterBuilder()), 'country', ) change_list_template = 'admin/visitor_log_changelist.html' def changelist_view(self, request, extra_context=None): # 2. Get the current filtered results based on your date selection response = super().changelist_view(request, extra_context) try: # This captures the exact filtered queryset being shown in the list qs = response.context_data['cl'].queryset except (AttributeError, KeyError): return response # 3. Aggregate data from the FILTERED queryset country_stats = list(qs.values('country').annotate(total=Count('id')).order_by('-total')[:10]) city_stats = list(qs.values('city').annotate(total=Count('id')).order_by('-total')[:10]) extra_context = extra_context or {} extra_context['country_data'] = json.dumps(country_stats) extra_context['city_data'] = json.dumps(city_stats) return super().changelist_view(request, extra_context=extra_context)