Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

✨ [#69] added categorie endpoint and atribute on partij #139

Merged
merged 3 commits into from
Jan 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 39 additions & 5 deletions src/openklant/components/klantinteracties/admin/partijen.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,48 @@
from ..models.constants import SoortPartij
from ..models.digitaal_adres import DigitaalAdres
from ..models.klantcontacten import Betrokkene
from ..models.partijen import Contactpersoon, Organisatie, Partij, Persoon


class DigitaalAdresInlineAdmin(admin.StackedInline):
model = DigitaalAdres
from ..models.partijen import (
Categorie,
CategorieRelatie,
Contactpersoon,
Organisatie,
Partij,
Persoon,
)


class CategorieRelatieInlineAdmin(admin.StackedInline):
model = CategorieRelatie
readonly_fields = ("uuid",)
autocomplete_fields = ("categorie",)
fields = (
"uuid",
"categorie",
"begin_datum",
"eind_datum",
)
extra = 0


class BetrokkeneInlineAdmin(admin.StackedInline):
readonly_fields = ("uuid",)
model = Betrokkene
extra = 0


class DigitaalAdresInlineAdmin(admin.StackedInline):
readonly_fields = ("uuid",)
model = DigitaalAdres
extra = 0


class PersoonInlineAdmin(admin.StackedInline):
model = Persoon
extra = 0


class ContactpersoonInlineAdmin(admin.StackedInline):
readonly_fields = ("uuid",)
model = Contactpersoon
fk_name = "partij"
raw_id_field = ["partij"]
Expand All @@ -48,6 +71,7 @@ class PartijAdmin(admin.ModelAdmin):
)
inlines = (
PersoonInlineAdmin,
CategorieRelatieInlineAdmin,
ContactpersoonInlineAdmin,
OrganisatieInlineAdmin,
DigitaalAdresInlineAdmin,
Expand Down Expand Up @@ -129,3 +153,13 @@ def get_contactpersonen(self, obj):
def get_organisaties(self, obj):
if organisatie := obj.organisatie:
return organisatie.naam


@admin.register(Categorie)
class CategorieAdmin(admin.ModelAdmin):
readonly_fields = ("uuid",)
search_fields = ("naam",)
fields = (
"uuid",
"naam",
)
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@
from openklant.components.klantinteracties.api.serializers.partijen import (
PartijSerializer,
)
from openklant.components.klantinteracties.models.partijen import Partij
from openklant.components.klantinteracties.models.partijen import (
CategorieRelatie,
Partij,
)
from openklant.components.utils.filters import ExpandFilter


Expand Down Expand Up @@ -138,3 +141,83 @@ def filter_identificator_register(self, queryset, name, value):
)
except ValueError:
return queryset.none()


class CategorieRelatieFilterSet(FilterSet):
partij__url = filters.CharFilter(
help_text=_("Zoek categorie relatie object op basis van de partij url"),
method="filter_partij_url",
)
partij__uuid = filters.CharFilter(
help_text=_("Zoek categorie relatie object op basis van de partij uuid"),
method="filter_partij_uuid",
)
partij__nummer = filters.CharFilter(
help_text=_("Zoek categorie relatie object op basis van het partij nummer"),
method="filter_partij_nummer",
)
categorie__naam = filters.CharFilter(
help_text=_("Zoek categorie relatie object op basis van de categorie naam."),
method="filter_categorie_naam",
)
categorie__uuid = filters.CharFilter(
help_text=_("Zoek categorie relatie object op basis van de categorie uuid."),
method="filter_categorie_uuid",
)
categorie__url = filters.CharFilter(
help_text=_("Zoek categorie relatie object op basis van de categorie url."),
method="filter_categorie_url",
)

class Meta:
model = CategorieRelatie
fields = (
"partij__url",
"partij__uuid",
"partij__nummer",
"categorie__url",
"categorie__uuid",
"categorie__naam",
"begin_datum",
"eind_datum",
)

def filter_partij_uuid(self, queryset, name, value):
try:
partij_uuid = uuid.UUID(value)
return queryset.filter(partij__uuid=partij_uuid)
except ValueError:
return queryset.none()

def filter_partij_url(self, queryset, name, value):
try:
url_uuid = uuid.UUID(value.split("/")[-1])
return queryset.filter(partij__uuid=url_uuid)
except ValueError:
return queryset.none()

def filter_partij_nummer(self, queryset, name, value):
try:
return queryset.filter(partij__nummer=value)
except ValueError:
return queryset.none()

def filter_categorie_uuid(self, queryset, name, value):
try:
categorie_uuid = uuid.UUID(value)
return queryset.filter(categorie__uuid=categorie_uuid)
except ValueError:
return queryset.none()

def filter_categorie_url(self, queryset, name, value):
try:
url_uuid = uuid.UUID(value.split("/")[-1])
return queryset.filter(categorie__uuid=url_uuid)
except ValueError:
return queryset.none()

def filter_categorie_naam(self, queryset, name, value):
try:
return queryset.filter(categorie__naam=value)
except ValueError:
return queryset.none()
166 changes: 166 additions & 0 deletions src/openklant/components/klantinteracties/api/serializers/partijen.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import datetime

from django.db import transaction
from django.utils.translation import gettext_lazy as _

Expand All @@ -18,13 +20,17 @@
BetrokkeneForeignKeySerializer,
)
from openklant.components.klantinteracties.api.validators import (
categorie_exists,
categorie_relatie_exists,
partij_exists,
partij_identificator_exists,
partij_is_organisatie,
)
from openklant.components.klantinteracties.models.constants import SoortPartij
from openklant.components.klantinteracties.models.digitaal_adres import DigitaalAdres
from openklant.components.klantinteracties.models.partijen import (
Categorie,
CategorieRelatie,
Contactpersoon,
Organisatie,
Partij,
Expand All @@ -41,6 +47,7 @@ class Meta:
"url",
)
extra_kwargs = {
"uuid": {"required": True, "validators": [partij_exists]},
"url": {
"view_name": "klantinteracties:partij-detail",
"lookup_field": "uuid",
Expand All @@ -57,6 +64,57 @@ class Meta(PartijForeignkeyBaseSerializer.Meta):
}


class CategorieForeignKeySerializer(serializers.HyperlinkedModelSerializer):
"""Let op: Dit attribuut is EXPERIMENTEEL."""

class Meta:
model = Categorie
fields = (
"uuid",
"url",
"naam",
)
extra_kwargs = {
"uuid": {"required": True, "validators": [categorie_exists]},
"url": {
"view_name": "klantinteracties:categorie-detail",
"lookup_field": "uuid",
"help_text": _("De unieke URL van deze categorie binnen deze API."),
},
"naam": {"read_only": True},
}


class CategorieRelatieForeignKeySerializer(serializers.HyperlinkedModelSerializer):
"""Let op: Dit attribuut is EXPERIMENTEEL."""

categorie_naam = serializers.SerializerMethodField(
help_text=_("De naam van de gelinkte categorie.")
)

class Meta:
model = CategorieRelatie
fields = (
"uuid",
"url",
"categorie_naam",
"begin_datum",
"eind_datum",
)
extra_kwargs = {
"uuid": {"required": True, "validators": [categorie_relatie_exists]},
"url": {
"view_name": "klantinteracties:categorierelatie-detail",
"lookup_field": "uuid",
"help_text": _("De unieke URL van deze categorie binnen deze API."),
},
}

def get_categorie_naam(self, obj):
if obj.categorie:
return obj.categorie.naam


class PartijIdentificatorForeignkeySerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = PartijIdentificator
Expand Down Expand Up @@ -107,6 +165,104 @@ class Meta:
ref_name = "PartijCorrespondentieadres"


class CategorieSerializer(serializers.HyperlinkedModelSerializer):
"""Let op: Dit endpoint is EXPERIMENTEEL."""

class Meta:
model = Categorie
fields = (
"uuid",
"url",
"naam",
)
extra_kwargs = {
"uuid": {"read_only": True},
"url": {
"view_name": "klantinteracties:categorie-detail",
"lookup_field": "uuid",
"help_text": _("De unieke URL van deze categorie binnen deze API."),
},
}


class CategorieRelatieSerializer(serializers.HyperlinkedModelSerializer):
"""Let op: Dit endpoint is EXPERIMENTEEL."""

partij = PartijForeignkeyBaseSerializer(
required=True,
allow_null=True,
help_text=_("De partij waar de categorie relatie aan gelinkt is."),
)
categorie = CategorieForeignKeySerializer(
required=True,
allow_null=True,
help_text=_(
"De categorie waar de categorie relatie aan gelinkt is: Let op: Dit attribuut is EXPERIMENTEEL."
),
)
begin_datum = serializers.DateField(
allow_null=True,
help_text=_(
"Aanduiding van datum volgens de NEN-ISO 8601:2019-standaard. "
"Een datum wordt genoteerd van het meest naar het minst "
"significante onderdeel. Een voorbeeld: 2022-02-21"
),
)

class Meta:
model = CategorieRelatie
fields = (
"uuid",
"url",
"partij",
"categorie",
"begin_datum",
"eind_datum",
)
extra_kwargs = {
"uuid": {"read_only": True},
"url": {
"view_name": "klantinteracties:categorie-detail",
"lookup_field": "uuid",
"help_text": _("De unieke URL van deze categorie binnen deze API."),
},
}

@transaction.atomic
def update(self, instance, validated_data):
if "partij" in validated_data:
if partij := validated_data.pop("partij", None):
partij = Partij.objects.get(uuid=str(partij.get("uuid")))

validated_data["partij"] = partij

if "categorie" in validated_data:
if categorie := validated_data.pop("categorie", None):
categorie = Categorie.objects.get(uuid=str(categorie.get("uuid")))

validated_data["categorie"] = categorie

return super().update(instance, validated_data)

@transaction.atomic
def create(self, validated_data):
if not validated_data.get("begin_datum"):
validated_data["begin_datum"] = datetime.datetime.today().strftime(
"%Y-%m-%d"
)

if partij := validated_data.pop("partij"):
partij = Partij.objects.get(uuid=str(partij.get("uuid")))

if categorie := validated_data.pop("categorie"):
categorie = Categorie.objects.get(uuid=str(categorie.get("uuid")))

validated_data["partij"] = partij
validated_data["categorie"] = categorie

return super().create(validated_data)


class OrganisatieSerializer(serializers.ModelSerializer):
class Meta:
model = Organisatie
Expand Down Expand Up @@ -273,6 +429,14 @@ class PartijSerializer(NestedGegevensGroepMixin, PolymorphicSerializer):
many=True,
source="betrokkene_set",
)
categorie_relaties = CategorieRelatieForeignKeySerializer(
read_only=True,
help_text=_(
"De Categorie relaties van een partij: Let op: Dit attribuut is EXPERIMENTEEL."
),
many=True,
source="categorierelatie_set",
)
digitale_adressen = DigitaalAdresForeignKeySerializer(
required=True,
allow_null=True,
Expand Down Expand Up @@ -325,6 +489,7 @@ class PartijSerializer(NestedGegevensGroepMixin, PolymorphicSerializer):
# 1 level
"digitale_adressen": f"{SERIALIZER_PATH}.digitaal_adres.DigitaalAdresSerializer",
"betrokkenen": f"{SERIALIZER_PATH}.klantcontacten.BetrokkeneSerializer",
"categorie_relaties": f"{SERIALIZER_PATH}.partijen.CategorieRelatieSerializer",
# 2 levels
"betrokkenen.had_klantcontact": f"{SERIALIZER_PATH}.klantcontacten.KlantcontactSerializer",
# 3 levels
Expand All @@ -339,6 +504,7 @@ class Meta:
"nummer",
"interne_notitie",
"betrokkenen",
"categorie_relaties",
"digitale_adressen",
"voorkeurs_digitaal_adres",
"vertegenwoordigde",
Expand Down
Loading
Loading