From 4ffa189d7cffd73018a608c9f1d49615be10f35e Mon Sep 17 00:00:00 2001 From: bart-maykin Date: Thu, 19 Oct 2023 18:42:59 +0200 Subject: [PATCH] :sparkles: [#93] added admin pages for the new models --- .../klantinteracties/admin/__init__.py | 4 + .../klantinteracties/admin/actoren.py | 43 +++++++ .../klantinteracties/admin/digitaal_adres.py | 8 ++ .../klantinteracties/admin/internezaken.py | 9 ++ .../klantinteracties/admin/klantcontacten.py | 115 ++++++++++++++++++ .../klantinteracties/admin/partijen.py | 107 ++++++++++++++++ .../klantinteracties/models/actoren.py | 16 +-- .../klantinteracties/models/digitaal_adres.py | 4 +- .../klantinteracties/models/klantcontacten.py | 6 + .../klantinteracties/models/mixins.py | 9 ++ .../klantinteracties/models/partijen.py | 12 +- .../fixtures/default_admin_index.json | 33 ++++- 12 files changed, 345 insertions(+), 21 deletions(-) create mode 100644 src/openklant/components/klantinteracties/admin/__init__.py create mode 100644 src/openklant/components/klantinteracties/admin/actoren.py create mode 100644 src/openklant/components/klantinteracties/admin/digitaal_adres.py create mode 100644 src/openklant/components/klantinteracties/admin/internezaken.py create mode 100644 src/openklant/components/klantinteracties/admin/klantcontacten.py create mode 100644 src/openklant/components/klantinteracties/admin/partijen.py diff --git a/src/openklant/components/klantinteracties/admin/__init__.py b/src/openklant/components/klantinteracties/admin/__init__.py new file mode 100644 index 00000000..84012ef7 --- /dev/null +++ b/src/openklant/components/klantinteracties/admin/__init__.py @@ -0,0 +1,4 @@ +from .actoren import * # noqa +from .digitaal_adres import * # noqa +from .klantcontacten import * # noqa +from .partijen import * # noqa diff --git a/src/openklant/components/klantinteracties/admin/actoren.py b/src/openklant/components/klantinteracties/admin/actoren.py new file mode 100644 index 00000000..305b88d4 --- /dev/null +++ b/src/openklant/components/klantinteracties/admin/actoren.py @@ -0,0 +1,43 @@ +from django.contrib import admin +from django.utils.translation import gettext_lazy as _ + +from ..admin.internezaken import InterneTaakInlineAdmin +from ..models.actoren import Actor + + +@admin.register(Actor) +class ActorAdmin(admin.ModelAdmin): + list_display = [ + "naam", + "soort_actor", + "indicatie_actief", + ] + list_filter = [ + "soort_actor", + "indicatie_actief", + ] + search_fields = ("naam",) + inlines = [InterneTaakInlineAdmin] + fieldsets = [ + ( + None, + { + "fields": [ + "naam", + "soort_actor", + "indicatie_actief", + ] + }, + ), + ( + _("Objectidentificator velden"), + { + "fields": [ + "objectidentificator_objecttype", + "objectidentificator_soort_object_id", + "objectidentificator_object_id", + "objectidentificator_register", + ] + }, + ), + ] diff --git a/src/openklant/components/klantinteracties/admin/digitaal_adres.py b/src/openklant/components/klantinteracties/admin/digitaal_adres.py new file mode 100644 index 00000000..8f784632 --- /dev/null +++ b/src/openklant/components/klantinteracties/admin/digitaal_adres.py @@ -0,0 +1,8 @@ +from django.contrib import admin + +from ..models.digitaal_adres import DigitaalAdres + + +@admin.register(DigitaalAdres) +class DigitaalAdresAdmin(admin.ModelAdmin): + search_fields = ("adres",) diff --git a/src/openklant/components/klantinteracties/admin/internezaken.py b/src/openklant/components/klantinteracties/admin/internezaken.py new file mode 100644 index 00000000..e9f8910b --- /dev/null +++ b/src/openklant/components/klantinteracties/admin/internezaken.py @@ -0,0 +1,9 @@ +from django.contrib import admin + +from ..models.internetaken import InterneTaak + + +class InterneTaakInlineAdmin(admin.StackedInline): + model = InterneTaak + extra = 0 + autocomplete_fields = ("klantcontact",) diff --git a/src/openklant/components/klantinteracties/admin/klantcontacten.py b/src/openklant/components/klantinteracties/admin/klantcontacten.py new file mode 100644 index 00000000..c86b67ed --- /dev/null +++ b/src/openklant/components/klantinteracties/admin/klantcontacten.py @@ -0,0 +1,115 @@ +from django.contrib import admin +from django.utils.translation import gettext_lazy as _ + +from ..admin.internezaken import InterneTaakInlineAdmin +from ..models.klantcontacten import Betrokkene, Bijlage, Klantcontact, Onderwerpobject + + +class BetrokkeneInlineAdmin(admin.StackedInline): + model = Betrokkene + search_fields = ( + "contactnaam_voorletters", + "contactnaam_voorvoegsel_achternaam", + "contactnaam_achternaam", + ) + fieldsets = [ + ( + None, + { + "fields": [ + "klantcontact", + "digitaal_adres", + "rol", + "organisatienaam", + "initiator", + ] + }, + ), + ( + _("Bezoekadres velden"), + { + "fields": [ + "bezoekadres_nummeraanduiding_id", + "bezoekadres_adresregel1", + "bezoekadres_adresregel2", + "bezoekadres_adresregel3", + "bezoekadres_land", + ] + }, + ), + ( + _("Correspondentieadres velden"), + { + "fields": [ + "correspondentieadres_nummeraanduiding_id", + "correspondentieadres_adresregel1", + "correspondentieadres_adresregel2", + "correspondentieadres_adresregel3", + "correspondentieadres_land", + ] + }, + ), + ( + _("Contactnaam velden"), + { + "fields": [ + "contactnaam_voorletters", + "contactnaam_voornaam", + "contactnaam_voorvoegsel_achternaam", + "contactnaam_achternaam", + ] + }, + ), + ] + extra = 0 + + +@admin.register(Betrokkene) +class BetrokkeneAdmin(admin.ModelAdmin): + search_fields = ( + "contactnaam_voorletters", + "contactnaam_voorvoegsel_achternaam", + "contactnaam_achternaam", + ) + + +class OnderwerpobjectInlineAdmin(admin.StackedInline): + model = Onderwerpobject + fk_name = "klantcontact" + extra = 0 + + +class WasOnderwerpobjectInlineAdmin(admin.StackedInline): + model = Onderwerpobject + fk_name = "was_klantcontact" + extra = 0 + + +class BijlageInlineAdmin(admin.StackedInline): + model = Bijlage + extra = 0 + + +@admin.register(Klantcontact) +class KlantcontactAdmin(admin.ModelAdmin): + list_display = ["nummer", "kanaal", "indicatie_contact_gelukt", "betrokkene_namen"] + list_filter = [ + "indicatie_contact_gelukt", + ] + inlines = [ + BetrokkeneInlineAdmin, + OnderwerpobjectInlineAdmin, + WasOnderwerpobjectInlineAdmin, + BijlageInlineAdmin, + InterneTaakInlineAdmin, + ] + search_fields = ("nummer",) + autocomplete_fields = ["actoren"] + date_hierarchy = "plaatsgevonden_op" + + @admin.display(empty_value="---") + def betrokkene_namen(self, obj): + if betrokkene := obj.betrokkene_set.all(): + return [person.get_contactnaam() for person in betrokkene] + + betrokkene_namen.short_description = _("betrokkene namen") diff --git a/src/openklant/components/klantinteracties/admin/partijen.py b/src/openklant/components/klantinteracties/admin/partijen.py new file mode 100644 index 00000000..752394a8 --- /dev/null +++ b/src/openklant/components/klantinteracties/admin/partijen.py @@ -0,0 +1,107 @@ +from django.contrib import admin +from django.utils.translation import gettext_lazy as _ + +from ..models.constants import SoortPartij +from ..models.partijen import Contactpersoon, Organisatie, Partij, Persoon + + +class PersoonInlineAdmin(admin.StackedInline): + model = Persoon + extra = 0 + + +class ContactpersoonInlineAdmin(admin.StackedInline): + model = Contactpersoon + extra = 0 + + +class OrganisatieInlineAdmin(admin.StackedInline): + model = Organisatie + extra = 0 + + +@admin.register(Partij) +class PartijAdmin(admin.ModelAdmin): + list_display = ( + "nummer", + "get_name", + "soort_partij", + "indicatie_actief", + ) + list_filter = ( + "soort_partij", + "indicatie_actief", + ) + inlines = (PersoonInlineAdmin, ContactpersoonInlineAdmin, OrganisatieInlineAdmin) + autocomplete_fields = ( + "betrokkene", + "digitaal_adres", + "voorkeurs_digitaal_adres", + ) + fieldsets = [ + ( + None, + { + "fields": [ + "betrokkene", + "digitaal_adres", + "voorkeurs_digitaal_adres", + "vertegenwoordigde", + "nummer", + "interne_notitie", + "soort_partij", + "indicatie_geheimhouding", + "voorkeurstaal", + "indicatie_actief", + ] + }, + ), + ( + _("Bezoekadres velden"), + { + "fields": [ + "bezoekadres_nummeraanduiding_id", + "bezoekadres_adresregel1", + "bezoekadres_adresregel2", + "bezoekadres_adresregel3", + "bezoekadres_land", + ] + }, + ), + ( + _("Correspondentieadres velden"), + { + "fields": [ + "correspondentieadres_nummeraanduiding_id", + "correspondentieadres_adresregel1", + "correspondentieadres_adresregel2", + "correspondentieadres_adresregel3", + "correspondentieadres_land", + ] + }, + ), + ] + + @admin.display(empty_value="---") + def get_name(self, obj): + match obj.soort_partij: + case SoortPartij.persoon: + return self.get_personen(obj) + case SoortPartij.contactpersoon: + return self.get_contactpersonen(obj) + case SoortPartij.organisatie: + return self.get_organisaties(obj) + + get_name.short_description = _("naam") + + def get_personen(self, obj): + if people := obj.persoon_set.all(): + return [person.get_contactnaam() for person in people] + + def get_contactpersonen(self, obj): + if people := obj.contactpersoon_set.all(): + return [person.get_contactnaam() for person in people] + + def get_organisaties(self, obj): + if organisaties := obj.organisatie_set.all(): + return [organisatie.naam for organisatie in organisaties] diff --git a/src/openklant/components/klantinteracties/models/actoren.py b/src/openklant/components/klantinteracties/models/actoren.py index 2252c889..e2f7241a 100644 --- a/src/openklant/components/klantinteracties/models/actoren.py +++ b/src/openklant/components/klantinteracties/models/actoren.py @@ -37,8 +37,8 @@ class Meta: verbose_name = _("actor") verbose_name_plural = _("actoren") - def __str__(self): - return self.naam + def __str__(self): + return self.naam class GeautomatiseerdeActor(models.Model): @@ -66,8 +66,8 @@ class Meta: verbose_name = _("geautomatiseerde actor") verbose_name_plural = _("geautomatiseerde actoren") - def __str__(self): - return self.functie + def __str__(self): + return self.functie class Medewerker(models.Model): @@ -103,8 +103,8 @@ class Meta: verbose_name = _("medewerker") verbose_name_plural = _("mederwerkers") - def __str__(self): - return self.functie + def __str__(self): + return self.functie class OrganisatorischeEenheid(models.Model): @@ -146,5 +146,5 @@ class OrganisatorischeEenheid(models.Model): class Meta: verbose_name = _("organisatorische eenheid") - def __str__(self): - return self.omschrijving + def __str__(self): + return self.omschrijving diff --git a/src/openklant/components/klantinteracties/models/digitaal_adres.py b/src/openklant/components/klantinteracties/models/digitaal_adres.py index aecaa247..a36b9268 100644 --- a/src/openklant/components/klantinteracties/models/digitaal_adres.py +++ b/src/openklant/components/klantinteracties/models/digitaal_adres.py @@ -34,5 +34,5 @@ class DigitaalAdres(models.Model): class Meta: verbose_name = _("digitaal adres") - def __str__(self): - return self.adres + def __str__(self): + return self.adres diff --git a/src/openklant/components/klantinteracties/models/klantcontacten.py b/src/openklant/components/klantinteracties/models/klantcontacten.py index e54c8c16..37dc24a4 100644 --- a/src/openklant/components/klantinteracties/models/klantcontacten.py +++ b/src/openklant/components/klantinteracties/models/klantcontacten.py @@ -96,6 +96,9 @@ class Meta: verbose_name = _("klantcontact") verbose_name_plural = _("klantcontacten") + def __str__(self): + return self.nummer + class Betrokkene(BezoekadresMixin, CorrespondentieadresMixin, ContactnaamMixin): uuid = models.UUIDField( @@ -142,6 +145,9 @@ class Betrokkene(BezoekadresMixin, CorrespondentieadresMixin, ContactnaamMixin): class Meta: verbose_name = _("betrokkene bij klantcontact") + def __str__(self): + return self.get_contactnaam() + class Onderwerpobject(ObjectidentificatorMixin): uuid = models.UUIDField( diff --git a/src/openklant/components/klantinteracties/models/mixins.py b/src/openklant/components/klantinteracties/models/mixins.py index 73030925..6dc8e4ee 100644 --- a/src/openklant/components/klantinteracties/models/mixins.py +++ b/src/openklant/components/klantinteracties/models/mixins.py @@ -176,6 +176,15 @@ class ContactnaamMixin(models.Model): class Meta: abstract = True + def get_contactnaam(self): + initials = self.contactnaam_voorletters + + if last_name := self.contactnaam_achternaam: + prefix = self.contactnaam_voorvoegsel_achternaam.lower() + return f"{initials}. {prefix} {last_name}" + + return initials + class ObjectidentificatorMixin(models.Model): objectidentificator_objecttype = models.CharField( diff --git a/src/openklant/components/klantinteracties/models/partijen.py b/src/openklant/components/klantinteracties/models/partijen.py index c03c855d..a5be18e7 100644 --- a/src/openklant/components/klantinteracties/models/partijen.py +++ b/src/openklant/components/klantinteracties/models/partijen.py @@ -117,8 +117,8 @@ class Meta: verbose_name = _("organisatie") verbose_name_plural = _("organisaties") - def __str__(self) -> str: - return self.naam + def __str__(self): + return self.naam class Persoon(ContactnaamMixin): @@ -133,8 +133,8 @@ class Meta: verbose_name = _("persoon") verbose_name_plural = _("personen") - def __str__(self) -> str: - return self.contactnaam_voorletters + def __str__(self): + return self.contactnaam_voorletters class Contactpersoon(ContactnaamMixin): @@ -156,8 +156,8 @@ class Meta: verbose_name = _("contact persoon") verbose_name_plural = _("contact personen") - def __str__(self) -> str: - return self.contactnaam_voorletters + def __str__(self): + return self.contactnaam_voorletters class PartijIdentificator(models.Model): diff --git a/src/openklant/fixtures/default_admin_index.json b/src/openklant/fixtures/default_admin_index.json index dc6e661e..a1726a5a 100644 --- a/src/openklant/fixtures/default_admin_index.json +++ b/src/openklant/fixtures/default_admin_index.json @@ -2,6 +2,29 @@ { "model": "admin_index.appgroup", "pk": 1, + "fields": { + "order": 2, + "name": "klantinteracties", + "slug": "klantinteracties", + "models": [ + [ + "klantinteracties", + "partij" + ], + [ + "klantinteracties", + "klantcontact" + ], + [ + "klantinteracties", + "actor" + ] + ] + } + }, + { + "model": "admin_index.appgroup", + "pk": 2, "fields": { "order": 3, "name": "Configuratie", @@ -32,7 +55,7 @@ }, { "model": "admin_index.appgroup", - "pk": 2, + "pk": 3, "fields": { "order": 4, "name": "Notificaties", @@ -51,7 +74,7 @@ }, { "model": "admin_index.appgroup", - "pk": 3, + "pk": 4, "fields": { "order": 1, "name": "Accounts", @@ -74,7 +97,7 @@ }, { "model": "admin_index.appgroup", - "pk": 4, + "pk": 5, "fields": { "order": 2, "name": "API autorisaties", @@ -101,7 +124,7 @@ }, { "model": "admin_index.appgroup", - "pk": 5, + "pk": 6, "fields": { "order": 5, "name": "Logging", @@ -124,7 +147,7 @@ }, { "model": "admin_index.appgroup", - "pk": 6, + "pk": 7, "fields": { "order": 6, "name": "Legacy",