From 2795bd1a8c7a3826d9aad517ea012b3c46c107e0 Mon Sep 17 00:00:00 2001 From: Guido Longoni Date: Mon, 15 May 2023 03:13:24 +0200 Subject: [PATCH] contatti admin wip --- django/contatti_app/admin.py | 118 ++++++++++++++++++++++++++++++---- django/contatti_app/models.py | 3 + 2 files changed, 109 insertions(+), 12 deletions(-) diff --git a/django/contatti_app/admin.py b/django/contatti_app/admin.py index 59dd084..430c519 100644 --- a/django/contatti_app/admin.py +++ b/django/contatti_app/admin.py @@ -1,10 +1,18 @@ -from import_export.admin import ImportExportModelAdmin +from dati_geo_app.admin import (AjaxAutocompleteListFilterModelAdmin, + RicercaOrdinataMixin) from django.contrib import admin from django.core.cache import cache from django.core.paginator import Paginator -from . import models -from . import resources -from dati_geo_app.admin import RicercaOrdinataMixin, AjaxAutocompleteListFilterModelAdmin +from django.db.models import Case, Count, Value, When +from django.db.models.functions import Concat +from import_export.admin import ImportExportModelAdmin +from polymorphic.admin import (PolymorphicChildModelAdmin, + PolymorphicChildModelFilter, + PolymorphicInlineSupportMixin, + PolymorphicParentModelAdmin, + StackedPolymorphicInline) + +from . import models, resources # Modified version of a GIST I found in a SO thread # cfr. http://masnun.rocks/2017/03/20/django-admin-expensive-count-all-queries/ @@ -51,16 +59,30 @@ class PersonaContattoAziendaAdmin(ImportExportModelAdmin): @admin.register(models.VoceContattoRubrica) -class VoceContattoRubricaAdmin(ImportExportModelAdmin): +class VoceContattoRubricaAdmin(ImportExportModelAdmin, PolymorphicParentModelAdmin): # resource = resources.VoceContattoRubricaResource # list_per_page = 15 # paginator = CachingPaginator # show_full_result_count = False + child_models = (models.Indirizzo, models.Email, models.Telefono, models.Fax,) + list_filter = (PolymorphicChildModelFilter,) + readonly_fields = ('descrizione','tipo',) + list_display = ('soggetto','descrizione','tipo',) + + def descrizione(self,obj): + return str(getattr(obj,obj.polymorphic_ctype.model)) + + def tipo(self, obj): + return getattr(obj,obj.polymorphic_ctype.model)._meta.verbose_name.title() + + def get_queryset(self, request): + qs=super().get_queryset(request).prefetch_related('polymorphic_ctype') + return qs pass @admin.register(models.Telefono) -class TelefonoAdmin(ImportExportModelAdmin): +class TelefonoAdmin(ImportExportModelAdmin, PolymorphicChildModelAdmin): # resource = resources.TelefonoResource # list_per_page = 15 # paginator = CachingPaginator @@ -69,7 +91,7 @@ class TelefonoAdmin(ImportExportModelAdmin): @admin.register(models.Email) -class EmailAdmin(ImportExportModelAdmin): +class EmailAdmin(ImportExportModelAdmin, PolymorphicChildModelAdmin): # resource = resources.EmailResource # list_per_page = 15 # paginator = CachingPaginator @@ -77,21 +99,49 @@ class EmailAdmin(ImportExportModelAdmin): pass +class VoceContattoRubricaInline(StackedPolymorphicInline): + class IndirizzoInline(StackedPolymorphicInline.Child): + model = models.Indirizzo + + class EmailInline(StackedPolymorphicInline.Child): + model = models.Email + + class TelefonoInline(StackedPolymorphicInline.Child): + model = models.Telefono + + class FaxInline(StackedPolymorphicInline.Child): + model = models.Fax + + model = models.VoceContattoRubrica + child_inlines = ( + IndirizzoInline, + EmailInline, + TelefonoInline, + FaxInline, + ) + + @admin.register(models.PersonaFisica) -class PersonaFisicaAdmin(ImportExportModelAdmin): +class PersonaFisicaAdmin(PolymorphicInlineSupportMixin, PolymorphicChildModelAdmin): # resource = resources.PersonaFisicaResource # list_per_page = 15 # paginator = CachingPaginator # show_full_result_count = False + show_in_index = False + get_model_perms = lambda self, req: {} + inlines = (VoceContattoRubricaInline,) pass @admin.register(models.PersonaGiuridica) -class PersonaGiuridicaAdmin(ImportExportModelAdmin): +class PersonaGiuridicaAdmin(PolymorphicInlineSupportMixin, PolymorphicChildModelAdmin): # resource = resources.PersonaGiuridicaResource # list_per_page = 15 # paginator = CachingPaginator # show_full_result_count = False + show_in_index = False + get_model_perms = lambda self, req: {} + inlines = (VoceContattoRubricaInline,) pass @@ -105,7 +155,7 @@ class SedeAdmin(ImportExportModelAdmin): @admin.register(models.Fax) -class FaxAdmin(ImportExportModelAdmin): +class FaxAdmin(ImportExportModelAdmin, PolymorphicChildModelAdmin): # resource = resources.FaxResource # list_per_page = 15 # paginator = CachingPaginator @@ -123,20 +173,64 @@ class PecAdmin(ImportExportModelAdmin): @admin.register(models.SoggettoContattabile) -class SoggettoContattabileAdmin(ImportExportModelAdmin): +class SoggettoContattabileAdmin(PolymorphicParentModelAdmin): # resource = resources.SoggettoContattabileResource # list_per_page = 15 # paginator = CachingPaginator # show_full_result_count = False + child_models = (models.PersonaFisica, models.PersonaGiuridica,) + list_filter = (PolymorphicChildModelFilter,) + readonly_fields = ('descrizione','tipo',) + list_display = ('descrizione','tipo',) + search_fields = ('personafisica__nome','personafisica__cognome','personagiuridica__denominazione',) + + def descrizione(self,obj): + return str(getattr(obj,obj.polymorphic_ctype.model)) + + def tipo(self, obj): + return getattr(obj,obj.polymorphic_ctype.model)._meta.verbose_name.title() + + def get_queryset(self, request): + qs=super().get_queryset(request).prefetch_related('polymorphic_ctype') + return qs pass @admin.register(models.Indirizzo) -class IndirizzoAdmin(ImportExportModelAdmin): +class IndirizzoAdmin(ImportExportModelAdmin, RicercaOrdinataMixin, AjaxAutocompleteListFilterModelAdmin, PolymorphicChildModelAdmin): # resource = resources.IndirizzoResource # list_per_page = 15 # paginator = CachingPaginator # show_full_result_count = False + list_per_page = 15 + paginator = CachingPaginator + show_full_result_count = False + fields=('soggetto','dug','duf','civico','cap','comune','altro',) + search_fields = ('soggetto','indirizzo','cap_id__exact',) + autocomplete_fields = ('soggetto','dug','cap','comune',) + list_display = ('soggetto','indirizzo', 'cap','comune','provincia','regione',) + ordering = ('comune_id','duf','civico',) + autocomplete_list_filter = ('comune',) + list_filter = ('comune__provincia__regione_id',) + + # def get_queryset(self, request): + # queryset = super().get_queryset(request).select_related('comune__provincia__regione').annotate(indirizzo=Concat('dug_id',Value(' '),'duf',Value(' '),'civico')) + # return queryset + + def provincia(self, obj): + return obj.comune.provincia + provincia.short_description = 'Provincia' + provincia.admin_order_field = 'comune__provincia_id' + + def regione(self, obj): + return obj.comune.provincia.regione_id + regione.short_description = 'Regione' + regione.admin_order_field = 'comune__provincia__regione_id' + + def indirizzo(self, obj): + return obj.indirizzo + indirizzo.short_description = 'Indirizzo' + indirizzo.admin_order_field = ('comune_id','duf','civico',) pass diff --git a/django/contatti_app/models.py b/django/contatti_app/models.py index 582d219..5c7a71f 100644 --- a/django/contatti_app/models.py +++ b/django/contatti_app/models.py @@ -8,6 +8,9 @@ class SoggettoContattabile(PolymorphicModel): class Meta: verbose_name = 'soggetto contattabile' verbose_name_plural = 'soggetti contattabili' + + def __str__(self): + return str(getattr(self,self.polymorphic_ctype.model)) class VoceContattoRubrica(PolymorphicModel):