Пример #1
0
class ResultaatSerializer(serializers.HyperlinkedModelSerializer):
    resultaattype = LengthHyperlinkedRelatedField(
        view_name="resultaattype-detail",
        lookup_field="uuid",
        queryset=ResultaatType.objects.all(),
        max_length=1000,
        min_length=1,
        validators=[IsImmutableValidator()],
        help_text=get_help_text("zaken.Resultaat", "resultaattype"),
    )

    class Meta:
        model = Resultaat
        fields = ("url", "uuid", "zaak", "resultaattype", "toelichting")
        validators = [CorrectZaaktypeValidator("resultaattype")]
        extra_kwargs = {
            "url": {
                "lookup_field": "uuid"
            },
            "uuid": {
                "read_only": True
            },
            "zaak": {
                "lookup_field": "uuid"
            },
        }
Пример #2
0
class ZaakBesluitSerializer(serializers.Serializer):
    """
    Serializer the reverse relation between Besluit-Zaak.

    We use the UUID of the Besluit to generate the URL/UUID of the ZaakBesluit
    instance, since it's a FK relationship, we can safely do this. Effectively,
    we're feeding the :class:`Besluit` instance to this serializer.
    """

    url = NestedHyperlinkedIdentityField(
        view_name="zaakbesluit-detail",
        lookup_field="uuid",
        parent_lookup_kwargs={"zaak_uuid": "zaak__uuid"},
        read_only=True,
    )
    uuid = serializers.UUIDField(
        help_text=_("Unieke resource identifier (UUID4)"), read_only=True)
    besluit = LengthHyperlinkedRelatedField(
        queryset=Besluit.objects.all(),
        view_name="besluit-detail",
        lookup_field="uuid",
        min_length=1,
        max_length=1000,
        help_text=_(
            "URL-referentie naar het BESLUIT (in de Besluiten API), waar "
            "ook de relatieinformatie opgevraagd kan worden."),
    )

    def validate_besluit(self, besluit: Besluit):
        zaak = self.context["view"]._get_zaak()
        if not besluit.zaak == zaak:
            raise serializers.ValidationError(
                _("Het Besluit verwijst niet naar de juiste zaak"),
                code="invalid-zaak")
        return besluit
Пример #3
0
class ObjectInformatieObjectSerializer(serializers.HyperlinkedModelSerializer):
    informatieobject = EnkelvoudigInformatieObjectHyperlinkedRelatedField(
        view_name="enkelvoudiginformatieobject-detail",
        lookup_field="uuid",
        queryset=EnkelvoudigInformatieObject.objects,
        help_text=get_help_text("documenten.ObjectInformatieObject",
                                "informatieobject"),
    )
    object = LengthHyperlinkedRelatedField(
        min_length=1,
        max_length=1000,
        view_name="",
        queryset=QuerySet(),
        lookup_field="uuid",
        help_text=
        _("URL-referentie naar het gerelateerde OBJECT (in deze of een andere API)."
          ),
    )

    class Meta:
        model = ObjectInformatieObject
        fields = ("url", "informatieobject", "object", "object_type")
        extra_kwargs = {"url": {"lookup_field": "uuid"}}

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        value_display_mapping = add_choice_values_help_text(ObjectTypes)
        self.fields["object_type"].help_text += f"\n\n{value_display_mapping}"

    def set_object_properties(self, object_type):
        object_field = self.fields["object"]
        if object_type == "besluit":
            object_field.view_name = "besluit-detail"
            object_field.queryset = Besluit.objects
        else:
            object_field.view_name = "zaak-detail"
            object_field.queryset = Zaak.objects

    def to_internal_value(self, data):
        object_type = data["object_type"]
        self.set_object_properties(object_type)
        res = super().to_internal_value(data)
        return res

    def to_representation(self, instance):
        object_type = instance.object_type
        self.set_object_properties(object_type)
        return super().to_representation(instance)
Пример #4
0
class RelevanteZaakSerializer(serializers.ModelSerializer):
    url = LengthHyperlinkedRelatedField(
        queryset=Zaak.objects.all(),
        view_name="zaak-detail",
        lookup_field="uuid",
        min_length=1,
        max_length=1000,
        help_text=_("URL-referentie naar de ZAAK."),
    )

    class Meta:
        model = RelevanteZaakRelatie
        fields = ("url", "aard_relatie")

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        value_display_mapping = add_choice_values_help_text(AardZaakRelatie)
        self.fields["aard_relatie"].help_text += f"\n\n{value_display_mapping}"
Пример #5
0
class ZaakEigenschapSerializer(NestedHyperlinkedModelSerializer):
    parent_lookup_kwargs = {"zaak_uuid": "zaak__uuid"}

    eigenschap = LengthHyperlinkedRelatedField(
        view_name="eigenschap-detail",
        lookup_field="uuid",
        queryset=Eigenschap.objects.all(),
        max_length=1000,
        min_length=1,
        help_text=get_help_text("zaken.ZaakEigenschap", "eigenschap"),
    )

    class Meta:
        model = ZaakEigenschap
        fields = ("url", "uuid", "zaak", "eigenschap", "naam", "waarde")
        extra_kwargs = {
            "url": {
                "lookup_field": "uuid"
            },
            "uuid": {
                "read_only": True
            },
            "zaak": {
                "lookup_field": "uuid"
            },
            "naam": {
                "source": "_naam",
                "read_only": True
            },
        }

    def validate(self, attrs):
        super().validate(attrs)

        eigenschap = attrs["eigenschap"]
        attrs["_naam"] = eigenschap.eigenschapnaam

        return attrs
Пример #6
0
class BesluitSerializer(serializers.HyperlinkedModelSerializer):
    besluittype = LengthHyperlinkedRelatedField(
        view_name="besluittype-detail",
        lookup_field="uuid",
        queryset=BesluitType.objects,
        max_length=200,
        min_length=1,
        help_text=get_help_text("besluiten.Besluit", "besluittype"),
    )
    zaak = LengthHyperlinkedRelatedField(
        view_name="zaak-detail",
        lookup_field="uuid",
        queryset=Zaak.objects,
        required=False,
        allow_null=True,
        max_length=200,
        help_text=get_help_text("besluiten.Besluit", "zaak"),
    )
    vervalreden_weergave = serializers.CharField(
        source="get_vervalreden_display", read_only=True)

    class Meta:
        model = Besluit
        fields = (
            "url",
            "identificatie",
            "verantwoordelijke_organisatie",
            "besluittype",
            "zaak",
            "datum",
            "toelichting",
            "bestuursorgaan",
            "ingangsdatum",
            "vervaldatum",
            "vervalreden",
            "vervalreden_weergave",
            "publicatiedatum",
            "verzenddatum",
            "uiterlijke_reactiedatum",
        )
        extra_kwargs = {
            "url": {
                "lookup_field": "uuid"
            },
            "identificatie": {
                "validators": [IsImmutableValidator()]
            },
            "verantwoordelijke_organisatie": {
                "validators": [IsImmutableValidator(), validate_rsin]
            },
        }
        validators = [
            UniekeIdentificatieValidator(),
            BesluittypeZaaktypeValidator()
        ]

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        value_display_mapping = add_choice_values_help_text(VervalRedenen)
        self.fields["vervalreden"].help_text += f"\n\n{value_display_mapping}"
Пример #7
0
class RolSerializer(PolymorphicSerializer):
    roltype = LengthHyperlinkedRelatedField(
        view_name="roltype-detail",
        lookup_field="uuid",
        queryset=RolType.objects.all(),
        max_length=1000,
        min_length=1,
        validators=[IsImmutableValidator()],
        help_text=get_help_text("zaken.Rol", "roltype"),
    )
    discriminator = Discriminator(
        discriminator_field="betrokkene_type",
        mapping={
            RolTypes.natuurlijk_persoon:
            RolNatuurlijkPersoonSerializer(),
            RolTypes.niet_natuurlijk_persoon:
            RolNietNatuurlijkPersoonSerializer(),
            RolTypes.vestiging:
            RolVestigingSerializer(),
            RolTypes.organisatorische_eenheid:
            RolOrganisatorischeEenheidSerializer(),
            RolTypes.medewerker:
            RolMedewerkerSerializer(),
        },
        group_field="betrokkene_identificatie",
        same_model=False,
    )

    class Meta:
        model = Rol
        fields = (
            "url",
            "uuid",
            "zaak",
            "betrokkene",
            "betrokkene_type",
            "roltype",
            "omschrijving",
            "omschrijving_generiek",
            "roltoelichting",
            "registratiedatum",
            "indicatie_machtiging",
        )
        validators = [
            RolOccurenceValidator(RolOmschrijving.initiator, max_amount=1),
            RolOccurenceValidator(RolOmschrijving.zaakcoordinator,
                                  max_amount=1),
            CorrectZaaktypeValidator("roltype"),
        ]
        extra_kwargs = {
            "url": {
                "lookup_field": "uuid"
            },
            "uuid": {
                "read_only": True
            },
            "zaak": {
                "lookup_field": "uuid"
            },
            "betrokkene": {
                "required": False
            },
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        value_display_mapping = add_choice_values_help_text(
            IndicatieMachtiging)
        self.fields[
            "indicatie_machtiging"].help_text += f"\n\n{value_display_mapping}"

        value_display_mapping = add_choice_values_help_text(RolTypes)
        self.fields[
            "betrokkene_type"].help_text += f"\n\n{value_display_mapping}"

        value_display_mapping = add_choice_values_help_text(RolOmschrijving)
        self.fields[
            "omschrijving_generiek"].help_text += f"\n\n{value_display_mapping}"

    def validate(self, attrs):
        validated_attrs = super().validate(attrs)
        betrokkene = validated_attrs.get("betrokkene", None)
        betrokkene_identificatie = validated_attrs.get(
            "betrokkene_identificatie", None)

        if not betrokkene and not betrokkene_identificatie:
            raise serializers.ValidationError(
                _("betrokkene or betrokkeneIdentificatie must be provided"),
                code="invalid-betrokkene",
            )

        return validated_attrs

    @transaction.atomic
    def create(self, validated_data):
        group_data = validated_data.pop("betrokkene_identificatie", None)
        rol = super().create(validated_data)

        if group_data:
            group_serializer = self.discriminator.mapping[
                validated_data["betrokkene_type"]]
            serializer = group_serializer.get_fields(
            )["betrokkene_identificatie"]
            group_data["rol"] = rol
            serializer.create(group_data)

        return rol
Пример #8
0
class StatusSerializer(serializers.HyperlinkedModelSerializer):
    statustype = LengthHyperlinkedRelatedField(
        view_name="statustype-detail",
        lookup_field="uuid",
        queryset=StatusType.objects.all(),
        max_length=1000,
        min_length=1,
        help_text=get_help_text("zaken.Status", "statustype"),
    )

    class Meta:
        model = Status
        fields = (
            "url",
            "uuid",
            "zaak",
            "statustype",
            "datum_status_gezet",
            "statustoelichting",
        )
        validators = [CorrectZaaktypeValidator("statustype")]
        extra_kwargs = {
            "url": {
                "lookup_field": "uuid"
            },
            "uuid": {
                "read_only": True
            },
            "zaak": {
                "lookup_field": "uuid"
            },
            "datum_status_gezet": {
                "validators": [DateNotInFutureValidator()]
            },
        }

    def validate(self, attrs):
        validated_attrs = super().validate(attrs)

        statustype = validated_attrs["statustype"]
        validated_attrs["__is_eindstatus"] = statustype.is_eindstatus()

        # validate that all InformationObjects have indicatieGebruiksrecht set
        # and are unlocked
        if validated_attrs["__is_eindstatus"]:
            zaak = validated_attrs["zaak"]

            if zaak.zaakinformatieobject_set.exclude(
                    informatieobject__lock="").exists():
                raise serializers.ValidationError(
                    "Er zijn gerelateerde informatieobjecten die nog gelocked zijn."
                    "Deze informatieobjecten moet eerst unlocked worden voordat de zaak afgesloten kan worden.",
                    code="informatieobject-locked",
                )
            canonical_ids = zaak.zaakinformatieobject_set.values(
                "informatieobject_id")
            io_ids = (EnkelvoudigInformatieObjectCanonical.objects.filter(
                id__in=Subquery(canonical_ids)).annotate(
                    last=Max("enkelvoudiginformatieobject")).values("last"))

            if (EnkelvoudigInformatieObject.objects.filter(
                    id__in=Subquery(io_ids)).filter(
                        indicatie_gebruiksrecht__isnull=True).exists()):

                # zios = zaak.zaakinformatieobject_set.all()
                # for zio in zios:
                #     informatieobject = zio.informatieobject
                #     if informatieobject.latest_version.indicatie_gebruiksrecht is None:
                raise serializers.ValidationError(
                    "Er zijn gerelateerde informatieobjecten waarvoor `indicatieGebruiksrecht` nog niet "
                    "gespecifieerd is. Je moet deze zetten voor je de zaak kan afsluiten.",
                    code="indicatiegebruiksrecht-unset",
                )

            brondatum_calculator = BrondatumCalculator(
                zaak, validated_attrs["datum_status_gezet"])
            try:
                brondatum_calculator.calculate()
            except Resultaat.DoesNotExist as exc:
                raise serializers.ValidationError(
                    exc.args[0], code="resultaat-does-not-exist") from exc
            except DetermineProcessEndDateException as exc:
                # ideally, we'd like to do this in the validate function, but that's unfortunately too
                # early since we don't know the end date yet
                # thought: we _can_ use the datumStatusGezet though!
                raise serializers.ValidationError(
                    exc.args[0], code="archiefactiedatum-error")

            # nasty to pass state around...
            self.context["brondatum_calculator"] = brondatum_calculator

        return validated_attrs

    def create(self, validated_data):
        """
        Perform additional business logic

        Ideally, this would be encapsulated in some utilities for a clear in-output
        system, but for now we need to put a bandage on it.

        NOTE: avoid doing queries outside of the transaction block - we want
        everything or nothing to succeed and no limbo states.
        """
        zaak = validated_data["zaak"]
        _zaak_fields_changed = []

        is_eindstatus = validated_data.pop("__is_eindstatus")
        brondatum_calculator = self.context.pop("brondatum_calculator", None)

        # are we re-opening the case?
        is_reopening = zaak.einddatum and not is_eindstatus

        # if the eindstatus is being set, we need to calculate some more things:
        # 1. zaak.einddatum, which may be relevant for archiving purposes
        # 2. zaak.archiefactiedatum, if not explicitly filled in
        if is_eindstatus:
            zaak.einddatum = validated_data["datum_status_gezet"].date()
        else:
            zaak.einddatum = None
        _zaak_fields_changed.append("einddatum")

        if is_eindstatus:
            # in case of eindstatus - retrieve archive parameters from resultaattype

            # Archiving: Use default archiefnominatie
            if not zaak.archiefnominatie:
                zaak.archiefnominatie = brondatum_calculator.get_archiefnominatie(
                )
                _zaak_fields_changed.append("archiefnominatie")

            # Archiving: Calculate archiefactiedatum
            if not zaak.archiefactiedatum:
                zaak.archiefactiedatum = brondatum_calculator.calculate()
                if zaak.archiefactiedatum is not None:
                    _zaak_fields_changed.append("archiefactiedatum")
        elif is_reopening:
            zaak.archiefnominatie = None
            zaak.archiefactiedatum = None
            _zaak_fields_changed += ["archiefnominatie", "archiefactiedatum"]

        with transaction.atomic():
            obj = super().create(validated_data)

            # Save updated information on the ZAAK
            zaak.save(update_fields=_zaak_fields_changed)

        return obj
Пример #9
0
class ZaakSerializer(
        NestedGegevensGroepMixin,
        NestedCreateMixin,
        NestedUpdateMixin,
        serializers.HyperlinkedModelSerializer,
):
    zaaktype = LengthHyperlinkedRelatedField(
        view_name="zaaktype-detail",
        lookup_field="uuid",
        queryset=ZaakType.objects.all(),
        max_length=1000,
        min_length=1,
        validators=[IsImmutableValidator()],
        help_text=get_help_text("zaken.Zaak", "zaaktype"),
    )
    status = serializers.HyperlinkedRelatedField(
        source="current_status_uuid",
        read_only=True,
        allow_null=True,
        view_name="status-detail",
        lookup_url_kwarg="uuid",
        help_text=_("Indien geen status bekend is, dan is de waarde 'null'"),
    )

    kenmerken = ZaakKenmerkSerializer(
        source="zaakkenmerk_set",
        many=True,
        required=False,
        help_text=
        "Lijst van kenmerken. Merk op dat refereren naar gerelateerde objecten "
        "beter kan via `ZaakObject`.",
    )

    betalingsindicatie_weergave = serializers.CharField(
        source="get_betalingsindicatie_display",
        read_only=True,
        help_text=_("Uitleg bij `betalingsindicatie`."),
    )

    verlenging = VerlengingSerializer(
        required=False,
        allow_null=True,
        help_text=
        _("Gegevens omtrent het verlengen van de doorlooptijd van de behandeling van de ZAAK"
          ),
    )

    opschorting = OpschortingSerializer(
        required=False,
        allow_null=True,
        help_text=
        _("Gegevens omtrent het tijdelijk opschorten van de behandeling van de ZAAK"
          ),
    )

    deelzaken = serializers.HyperlinkedRelatedField(
        read_only=True,
        many=True,
        view_name="zaak-detail",
        lookup_url_kwarg="uuid",
        lookup_field="uuid",
        help_text=_("URL-referenties naar deel ZAAKen."),
    )

    resultaat = serializers.HyperlinkedRelatedField(
        read_only=True,
        allow_null=True,
        view_name="resultaat-detail",
        lookup_url_kwarg="uuid",
        lookup_field="uuid",
        help_text=
        _("URL-referentie naar het RESULTAAT. Indien geen resultaat bekend is, dan is de waarde 'null'"
          ),
    )

    relevante_andere_zaken = RelevanteZaakSerializer(
        many=True,
        required=False,
        help_text=_("Een lijst van relevante andere zaken."))

    class Meta:
        model = Zaak
        fields = (
            "url",
            "uuid",
            "identificatie",
            "bronorganisatie",
            "omschrijving",
            "toelichting",
            "zaaktype",
            "registratiedatum",
            "verantwoordelijke_organisatie",
            "startdatum",
            "einddatum",
            "einddatum_gepland",
            "uiterlijke_einddatum_afdoening",
            "publicatiedatum",
            "communicatiekanaal",
            # TODO: add shape validator once we know the shape
            "producten_of_diensten",
            "vertrouwelijkheidaanduiding",
            "betalingsindicatie",
            "betalingsindicatie_weergave",
            "laatste_betaaldatum",
            "zaakgeometrie",
            "verlenging",
            "opschorting",
            "selectielijstklasse",
            "hoofdzaak",
            "deelzaken",
            "relevante_andere_zaken",
            # read-only veld, on-the-fly opgevraagd
            "status",
            # Writable inline resource, as opposed to eigenschappen for demo
            # purposes. Eventually, we need to choose one form.
            "kenmerken",
            # Archiving
            "archiefnominatie",
            "archiefstatus",
            "archiefactiedatum",
            "resultaat",
        )
        extra_kwargs = {
            "url": {
                "lookup_field": "uuid"
            },
            "uuid": {
                "read_only": True
            },
            "zaakgeometrie": {
                "help_text":
                "Punt, lijn of (multi-)vlak geometrie-informatie, in GeoJSON."
            },
            "identificatie": {
                "validators": [IsImmutableValidator()]
            },
            "einddatum": {
                "read_only": True,
                "allow_null": True
            },
            "communicatiekanaal": {
                "validators": [
                    ResourceValidator("CommunicatieKanaal",
                                      settings.REFERENTIELIJSTEN_API_SPEC)
                ]
            },
            "vertrouwelijkheidaanduiding": {
                "required":
                False,
                "help_text":
                _("Aanduiding van de mate waarin het zaakdossier van de "
                  "ZAAK voor de openbaarheid bestemd is. Optioneel - indien "
                  "geen waarde gekozen wordt, dan wordt de waarde van het "
                  "ZAAKTYPE overgenomen. Dit betekent dat de API _altijd_ een "
                  "waarde teruggeeft."),
            },
            "selectielijstklasse": {
                "validators": [
                    ResourceValidator(
                        "Resultaat",
                        settings.REFERENTIELIJSTEN_API_SPEC,
                        get_auth=get_auth,
                    )
                ]
            },
            "hoofdzaak": {
                "lookup_field": "uuid",
                "queryset": Zaak.objects.all(),
                "validators": [NotSelfValidator(),
                               HoofdzaakValidator()],
            },
            "laatste_betaaldatum": {
                "validators": [UntilNowValidator()]
            },
        }
        # Replace a default "unique together" constraint.
        validators = [UniekeIdentificatieValidator()]

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        value_display_mapping = add_choice_values_help_text(BetalingsIndicatie)
        self.fields[
            "betalingsindicatie"].help_text += f"\n\n{value_display_mapping}"

        value_display_mapping = add_choice_values_help_text(Archiefstatus)
        self.fields[
            "archiefstatus"].help_text += f"\n\n{value_display_mapping}"

        value_display_mapping = add_choice_values_help_text(Archiefnominatie)
        self.fields[
            "archiefnominatie"].help_text += f"\n\n{value_display_mapping}"

    def validate(self, attrs):
        super().validate(attrs)

        default_betalingsindicatie = (self.instance.betalingsindicatie
                                      if self.instance else None)
        betalingsindicatie = attrs.get("betalingsindicatie",
                                       default_betalingsindicatie)
        if betalingsindicatie == BetalingsIndicatie.nvt and attrs.get(
                "laatste_betaaldatum"):
            raise serializers.ValidationError(
                {
                    "laatste_betaaldatum":
                    _('Laatste betaaldatum kan niet gezet worden als de betalingsindicatie "nvt" is'
                      )
                },
                code="betaling-nvt",
            )

        # check that productenOfDiensten are part of the ones on the zaaktype
        default_zaaktype = self.instance.zaaktype if self.instance else None
        zaaktype = attrs.get("zaaktype", default_zaaktype)
        assert zaaktype, "Should not have passed validation - a zaaktype is needed"

        producten_of_diensten = attrs.get("producten_of_diensten")
        if producten_of_diensten:
            if not set(producten_of_diensten).issubset(
                    set(zaaktype.producten_of_diensten)):
                raise serializers.ValidationError(
                    {
                        "producten_of_diensten":
                        _("Niet alle producten/diensten komen voor in "
                          "de producten/diensten op het zaaktype")
                    },
                    code="invalid-products-services",
                )

        # Archiving
        default_archiefstatus = (self.instance.archiefstatus if self.instance
                                 else Archiefstatus.nog_te_archiveren)
        archiefstatus = (attrs.get("archiefstatus", default_archiefstatus) !=
                         Archiefstatus.nog_te_archiveren)
        if archiefstatus:
            # search for related informatieobjects with status != 'gearchiveerd'
            canonical_ids = self.instance.zaakinformatieobject_set.values(
                "informatieobject_id")
            io_ids = (EnkelvoudigInformatieObjectCanonical.objects.filter(
                id__in=Subquery(canonical_ids)).annotate(
                    last=Max("enkelvoudiginformatieobject")).values("last"))

            if (EnkelvoudigInformatieObject.objects.filter(
                    id__in=Subquery(io_ids)).exclude(
                        status="gearchiveerd").exists()):

                raise serializers.ValidationError(
                    {
                        "archiefstatus",
                        _("Er zijn gerelateerde informatieobjecten waarvan de `status` nog niet gelijk is aan "
                          "`gearchiveerd`. Dit is een voorwaarde voor het zetten van de `archiefstatus` op een andere "
                          "waarde dan `nog_te_archiveren`."),
                    },
                    code="documents-not-archived",
                )

            for attr in ["archiefnominatie", "archiefactiedatum"]:
                if not attrs.get(
                        attr,
                        getattr(self.instance, attr)
                        if self.instance else None):
                    raise serializers.ValidationError(
                        {
                            attr:
                            _("Moet van een waarde voorzien zijn als de 'Archiefstatus' een waarde heeft anders dan "
                              "'nog_te_archiveren'.")
                        },
                        code=f"{attr}-not-set",
                    )
        # End archiving

        return attrs

    def create(self, validated_data: dict):
        # set the derived value from ZTC
        if "vertrouwelijkheidaanduiding" not in validated_data:
            zaaktype = validated_data["zaaktype"]
            validated_data[
                "vertrouwelijkheidaanduiding"] = zaaktype.vertrouwelijkheidaanduiding

        return super().create(validated_data)
Пример #10
0
class EnkelvoudigInformatieObjectSerializer(
        serializers.HyperlinkedModelSerializer):
    """
    Serializer for the EnkelvoudigInformatieObject model
    """

    url = serializers.HyperlinkedIdentityField(
        view_name="enkelvoudiginformatieobject-detail", lookup_field="uuid")
    informatieobjecttype = LengthHyperlinkedRelatedField(
        view_name="informatieobjecttype-detail",
        lookup_field="uuid",
        queryset=InformatieObjectType.objects,
        max_length=200,
        min_length=1,
        help_text=get_help_text("documenten.EnkelvoudigInformatieObject",
                                "informatieobjecttype"),
    )
    inhoud = AnyBase64File(
        view_name="enkelvoudiginformatieobject-download",
        help_text=_(
            f"Minimal accepted size of uploaded file = {settings.MIN_UPLOAD_SIZE} bytes "
            f"(or {naturalsize(settings.MIN_UPLOAD_SIZE, binary=True)})"),
    )
    bestandsomvang = serializers.IntegerField(
        source="inhoud.size",
        read_only=True,
        min_value=0,
        help_text=_(
            "Aantal bytes dat de inhoud van INFORMATIEOBJECT in beslag neemt."
        ),
    )
    integriteit = IntegriteitSerializer(
        label=_("integriteit"),
        allow_null=True,
        required=False,
        help_text=
        _("Uitdrukking van mate van volledigheid en onbeschadigd zijn van digitaal bestand."
          ),
    )
    # TODO: validator!
    ondertekening = OndertekeningSerializer(
        label=_("ondertekening"),
        allow_null=True,
        required=False,
        help_text=
        _("Aanduiding van de rechtskracht van een informatieobject. Mag niet van een waarde "
          "zijn voorzien als de `status` de waarde 'in bewerking' of 'ter vaststelling' heeft."
          ),
    )
    locked = serializers.BooleanField(
        label=_("locked"),
        read_only=True,
        source="canonical.lock",
        help_text=_(
            "Geeft aan of het document gelocked is. Alleen als een document gelocked is, "
            "mogen er aanpassingen gemaakt worden."),
    )

    class Meta:
        model = EnkelvoudigInformatieObject
        fields = (
            "url",
            "identificatie",
            "bronorganisatie",
            "creatiedatum",
            "titel",
            "vertrouwelijkheidaanduiding",
            "auteur",
            "status",
            "formaat",
            "taal",
            "versie",
            "begin_registratie",
            "bestandsnaam",
            "inhoud",
            "bestandsomvang",
            "link",
            "beschrijving",
            "ontvangstdatum",
            "verzenddatum",
            "indicatie_gebruiksrecht",
            "ondertekening",
            "integriteit",
            "informatieobjecttype",  # van-relatie,
            "locked",
        )
        extra_kwargs = {"taal": {"min_length": 3}}
        read_only_fields = ["versie", "begin_registratie"]
        validators = [StatusValidator()]

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        value_display_mapping = add_choice_values_help_text(
            VertrouwelijkheidsAanduiding)
        self.fields[
            "vertrouwelijkheidaanduiding"].help_text += f"\n\n{value_display_mapping}"

        value_display_mapping = add_choice_values_help_text(Statussen)
        self.fields["status"].help_text += f"\n\n{value_display_mapping}"

    def validate_indicatie_gebruiksrecht(self, indicatie):
        if (self.instance and not indicatie
                and self.instance.canonical.gebruiksrechten_set.exists()):
            raise serializers.ValidationError(
                _("De indicatie kan niet weggehaald worden of ongespecifieerd "
                  "zijn als er Gebruiksrechten gedefinieerd zijn."),
                code="existing-gebruiksrechten",
            )
        # create: not self.instance or update: usage_rights exists
        elif indicatie and (
                not self.instance
                or not self.instance.canonical.gebruiksrechten_set.exists()):
            raise serializers.ValidationError(
                _("De indicatie moet op 'ja' gezet worden door `gebruiksrechten` "
                  "aan te maken, dit kan niet direct op deze resource."),
                code="missing-gebruiksrechten",
            )
        return indicatie

    @transaction.atomic
    def create(self, validated_data):
        """
        Handle nested writes.
        """
        integriteit = validated_data.pop("integriteit", None)
        ondertekening = validated_data.pop("ondertekening", None)
        # add vertrouwelijkheidaanduiding
        if "vertrouwelijkheidaanduiding" not in validated_data:
            informatieobjecttype = validated_data["informatieobjecttype"]
            validated_data[
                "vertrouwelijkheidaanduiding"] = informatieobjecttype.vertrouwelijkheidaanduiding

        canonical = EnkelvoudigInformatieObjectCanonical.objects.create()
        validated_data["canonical"] = canonical

        eio = super().create(validated_data)
        eio.integriteit = integriteit
        eio.ondertekening = ondertekening
        eio.save()
        return eio

    def update(self, instance, validated_data):
        """
        Instead of updating an existing EnkelvoudigInformatieObject,
        create a new EnkelvoudigInformatieObject with the same
        EnkelvoudigInformatieObjectCanonical
        """
        instance.integriteit = validated_data.pop("integriteit", None)
        instance.ondertekening = validated_data.pop("ondertekening", None)

        validated_data_field_names = validated_data.keys()
        for field in instance._meta.get_fields():
            if field.name not in validated_data_field_names:
                validated_data[field.name] = getattr(instance, field.name)

        validated_data["pk"] = None
        validated_data["versie"] += 1

        # Remove the lock from the data from which a new
        # EnkelvoudigInformatieObject will be created, because lock is not a
        # part of that model
        validated_data.pop("lock")

        return super().create(validated_data)