from django.contrib import admin from django.utils.translation import gettext_lazy as _ from unfold.admin import ModelAdmin, TabularInline from unfold.decorators import display from unfold.contrib.filters.admin import ( RangeDateTimeFilter, TextFilter, AutocompleteSelectFilter, ) from apps.account.models import LocationHistory, User from utils.admin import project_admin_site, dovoodi_admin_site class LocationHistoryInline(TabularInline): model = LocationHistory extra = 0 tab = True fields = ('lat', 'lon', 'country', 'city', 'selected_manually', 'ip', 'timezone', 'at_time') readonly_fields = ('lat', 'lon', 'country', 'city', 'selected_manually', 'ip', 'timezone', 'at_time',) verbose_name = _("Location History") verbose_name_plural = _("Location History") can_delete = False show_change_link = True class LocationHistoryAdmin(ModelAdmin): list_display = ('user', 'display_location', 'country', 'city', 'selected_manually', 'ip', 'display_at_time') list_filter = [ ('user', AutocompleteSelectFilter), 'country', 'city', 'selected_manually', ('at_time', RangeDateTimeFilter), ] search_fields = ('user__email', 'user__fullname', 'country', 'city', 'ip') readonly_fields = ('at_time',) fieldsets = ( (None, { 'fields': ('user', ('lat', 'lon'), ('country', 'city')) }), (_('Additional Information'), { 'fields': ('selected_manually', 'ip', 'timezone', 'at_time'), 'classes': ('tab',), }), ) @display(description=_("Location")) def display_location(self, instance: LocationHistory): return f"{instance.lat}, {instance.lon}" @display(description=_("Date & Time")) def display_at_time(self, instance: LocationHistory): return instance.at_time.strftime("%Y-%m-%d %H:%M") if instance.at_time else "-" # Register with both admin sites project_admin_site.register(LocationHistory, LocationHistoryAdmin) dovoodi_admin_site.register(LocationHistory, LocationHistoryAdmin)