-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathactoren.py
146 lines (123 loc) · 4.33 KB
/
actoren.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
from django.db import transaction
from django.utils.translation import gettext_lazy as _
from rest_framework import serializers
from vng_api_common.serializers import GegevensGroepSerializer, NestedGegevensGroepMixin
from openklant.components.klantinteracties.api.polymorphism import (
Discriminator,
PolymorphicSerializer,
)
from openklant.components.klantinteracties.api.validators import actor_exists
from openklant.components.klantinteracties.models.actoren import (
Actor,
GeautomatiseerdeActor,
Medewerker,
OrganisatorischeEenheid,
)
from openklant.components.klantinteracties.models.constants import SoortActor
class ActorForeignKeySerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Actor
fields = (
"uuid",
"url",
)
extra_kwargs = {
"uuid": {"required": True, "validators": [actor_exists]},
"url": {
"view_name": "klantinteracties:actor-detail",
"lookup_field": "uuid",
"help_text": _("De unieke URL van deze actor binnen deze API."),
},
}
class GeautomatiseerdeActorSerializer(serializers.ModelSerializer):
class Meta:
model = GeautomatiseerdeActor
fields = (
"functie",
"omschrijving",
)
class OrganisatorischeEenheidSerializer(serializers.ModelSerializer):
class Meta:
model = OrganisatorischeEenheid
fields = (
"omschrijving",
"emailadres",
"faxnummer",
"telefoonnummer",
)
class MedewerkerSerializer(serializers.ModelSerializer):
class Meta:
model = Medewerker
fields = (
"functie",
"emailadres",
"telefoonnummer",
)
class ActoridentificatorSerializer(GegevensGroepSerializer):
class Meta:
model = Actor
gegevensgroep = "actoridentificator"
class ActorSerializer(
NestedGegevensGroepMixin,
PolymorphicSerializer,
):
actoridentificator = ActoridentificatorSerializer(
required=False,
allow_null=True,
help_text=_(
"Gegevens die een actorwerpobject in een extern register uniek identificeren."
),
)
discriminator = Discriminator(
discriminator_field="soort_actor",
mapping={
SoortActor.medewerker: MedewerkerSerializer(),
SoortActor.geautomatiseerde_actor: GeautomatiseerdeActorSerializer(),
SoortActor.organisatorische_eenheid: OrganisatorischeEenheidSerializer(),
},
same_model=False,
group_field="actor_identificatie",
)
class Meta:
model = Actor
fields = (
"uuid",
"url",
"naam",
"soort_actor",
"indicatie_actief",
"actoridentificator",
)
extra_kwargs = {
"uuid": {"read_only": True},
"url": {
"view_name": "klantinteracties:actor-detail",
"lookup_field": "uuid",
"help_text": _("De unieke URL van deze actor binnen deze API."),
},
}
@transaction.atomic
def create(self, validated_data):
actor_identificatie = validated_data.pop("actor_identificatie", None)
actor = super().create(validated_data)
if actor_identificatie:
serializer_class = self.discriminator.mapping[validated_data["soort_actor"]]
serializer = serializer_class.get_fields()["actor_identificatie"]
actor_identificatie["actor"] = actor
serializer.create(actor_identificatie)
return actor
@transaction.atomic
def update(self, instance, validated_data):
actor_identificatie = validated_data.pop("actor_identificatie", None)
actor = super().update(instance, validated_data)
if actor_identificatie:
serializer_class = self.discriminator.mapping[
validated_data.get("soort_actor")
]
serializer = serializer_class.get_fields()["actor_identificatie"]
# remove the previous data
model = serializer.Meta.model
model.objects.filter(actor=actor).delete()
actor_identificatie["actor"] = actor
serializer.create(actor_identificatie)
return actor