contatti admin wip

my-submodulepoetico
Guido Longoni 2023-05-15 03:13:24 +02:00
parent 3fc0f7ae2b
commit 2795bd1a8c
2 changed files with 109 additions and 12 deletions

View File

@ -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.contrib import admin
from django.core.cache import cache from django.core.cache import cache
from django.core.paginator import Paginator from django.core.paginator import Paginator
from . import models from django.db.models import Case, Count, Value, When
from . import resources from django.db.models.functions import Concat
from dati_geo_app.admin import RicercaOrdinataMixin, AjaxAutocompleteListFilterModelAdmin 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 # Modified version of a GIST I found in a SO thread
# cfr. http://masnun.rocks/2017/03/20/django-admin-expensive-count-all-queries/ # cfr. http://masnun.rocks/2017/03/20/django-admin-expensive-count-all-queries/
@ -51,16 +59,30 @@ class PersonaContattoAziendaAdmin(ImportExportModelAdmin):
@admin.register(models.VoceContattoRubrica) @admin.register(models.VoceContattoRubrica)
class VoceContattoRubricaAdmin(ImportExportModelAdmin): class VoceContattoRubricaAdmin(ImportExportModelAdmin, PolymorphicParentModelAdmin):
# resource = resources.VoceContattoRubricaResource # resource = resources.VoceContattoRubricaResource
# list_per_page = 15 # list_per_page = 15
# paginator = CachingPaginator # paginator = CachingPaginator
# show_full_result_count = False # 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 pass
@admin.register(models.Telefono) @admin.register(models.Telefono)
class TelefonoAdmin(ImportExportModelAdmin): class TelefonoAdmin(ImportExportModelAdmin, PolymorphicChildModelAdmin):
# resource = resources.TelefonoResource # resource = resources.TelefonoResource
# list_per_page = 15 # list_per_page = 15
# paginator = CachingPaginator # paginator = CachingPaginator
@ -69,7 +91,7 @@ class TelefonoAdmin(ImportExportModelAdmin):
@admin.register(models.Email) @admin.register(models.Email)
class EmailAdmin(ImportExportModelAdmin): class EmailAdmin(ImportExportModelAdmin, PolymorphicChildModelAdmin):
# resource = resources.EmailResource # resource = resources.EmailResource
# list_per_page = 15 # list_per_page = 15
# paginator = CachingPaginator # paginator = CachingPaginator
@ -77,21 +99,49 @@ class EmailAdmin(ImportExportModelAdmin):
pass 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) @admin.register(models.PersonaFisica)
class PersonaFisicaAdmin(ImportExportModelAdmin): class PersonaFisicaAdmin(PolymorphicInlineSupportMixin, PolymorphicChildModelAdmin):
# resource = resources.PersonaFisicaResource # resource = resources.PersonaFisicaResource
# list_per_page = 15 # list_per_page = 15
# paginator = CachingPaginator # paginator = CachingPaginator
# show_full_result_count = False # show_full_result_count = False
show_in_index = False
get_model_perms = lambda self, req: {}
inlines = (VoceContattoRubricaInline,)
pass pass
@admin.register(models.PersonaGiuridica) @admin.register(models.PersonaGiuridica)
class PersonaGiuridicaAdmin(ImportExportModelAdmin): class PersonaGiuridicaAdmin(PolymorphicInlineSupportMixin, PolymorphicChildModelAdmin):
# resource = resources.PersonaGiuridicaResource # resource = resources.PersonaGiuridicaResource
# list_per_page = 15 # list_per_page = 15
# paginator = CachingPaginator # paginator = CachingPaginator
# show_full_result_count = False # show_full_result_count = False
show_in_index = False
get_model_perms = lambda self, req: {}
inlines = (VoceContattoRubricaInline,)
pass pass
@ -105,7 +155,7 @@ class SedeAdmin(ImportExportModelAdmin):
@admin.register(models.Fax) @admin.register(models.Fax)
class FaxAdmin(ImportExportModelAdmin): class FaxAdmin(ImportExportModelAdmin, PolymorphicChildModelAdmin):
# resource = resources.FaxResource # resource = resources.FaxResource
# list_per_page = 15 # list_per_page = 15
# paginator = CachingPaginator # paginator = CachingPaginator
@ -123,20 +173,64 @@ class PecAdmin(ImportExportModelAdmin):
@admin.register(models.SoggettoContattabile) @admin.register(models.SoggettoContattabile)
class SoggettoContattabileAdmin(ImportExportModelAdmin): class SoggettoContattabileAdmin(PolymorphicParentModelAdmin):
# resource = resources.SoggettoContattabileResource # resource = resources.SoggettoContattabileResource
# list_per_page = 15 # list_per_page = 15
# paginator = CachingPaginator # paginator = CachingPaginator
# show_full_result_count = False # 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 pass
@admin.register(models.Indirizzo) @admin.register(models.Indirizzo)
class IndirizzoAdmin(ImportExportModelAdmin): class IndirizzoAdmin(ImportExportModelAdmin, RicercaOrdinataMixin, AjaxAutocompleteListFilterModelAdmin, PolymorphicChildModelAdmin):
# resource = resources.IndirizzoResource # resource = resources.IndirizzoResource
# list_per_page = 15 # list_per_page = 15
# paginator = CachingPaginator # paginator = CachingPaginator
# show_full_result_count = False # 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 pass

View File

@ -9,6 +9,9 @@ class SoggettoContattabile(PolymorphicModel):
verbose_name = 'soggetto contattabile' verbose_name = 'soggetto contattabile'
verbose_name_plural = 'soggetti contattabili' verbose_name_plural = 'soggetti contattabili'
def __str__(self):
return str(getattr(self,self.polymorphic_ctype.model))
class VoceContattoRubrica(PolymorphicModel): class VoceContattoRubrica(PolymorphicModel):
class Meta: class Meta: