Example #1
0
class ExternalActorSerializerBase(CamelSnakeModelSerializer):  # type: ignore
    external_id = serializers.CharField(required=False, allow_null=True)
    external_name = serializers.CharField(required=True)
    provider = serializers.ChoiceField(
        choices=get_provider_choices(AVAILABLE_PROVIDERS))
    integration_id = serializers.IntegerField(required=True)

    @property
    def organization(self) -> Organization:
        return self.context["organization"]

    def validate_integration_id(self, integration_id: str) -> str:
        return validate_integration_id(integration_id, self.organization)

    def validate_external_id(self, external_id: str) -> Optional[str]:
        return validate_external_id_option(external_id)

    def validate_external_name(self, external_name: str) -> str:
        provider = self.initial_data.get("provider")
        # Ensure the provider is strict, otherwise do not validate
        if is_valid_provider(provider, STRICT_NAME_PROVIDERS):
            return validate_external_name(external_name)
        return external_name

    def validate_provider(self, provider_name_option: str) -> int:
        provider = validate_provider(provider_name_option,
                                     available_providers=AVAILABLE_PROVIDERS)
        return int(provider.value)

    def get_actor_id(self, validated_data: MutableMapping[str, Any]) -> int:
        return int(validated_data.pop(self._actor_key).actor_id)

    def create(self, validated_data: MutableMapping[str,
                                                    Any]) -> ExternalActor:
        actor_id = self.get_actor_id(validated_data)
        return ExternalActor.objects.get_or_create(
            **validated_data,
            actor_id=actor_id,
            organization=self.organization,
        )

    def update(self, instance: ExternalActor,
               validated_data: MutableMapping[str, Any]) -> ExternalActor:
        # Discard the object ID passed by the API.
        if "id" in validated_data:
            validated_data.pop("id")

        if self._actor_key in validated_data:
            validated_data["actor_id"] = self.get_actor_id({**validated_data})

        for key, value in validated_data.items():
            setattr(self.instance, key, value)
        try:
            self.instance.save()
            return self.instance
        except IntegrityError:
            raise serializers.ValidationError(
                "There already exists an external association with this external_name and provider."
            )
Example #2
0
class ExternalActorSerializerBase(CamelSnakeModelSerializer):  # type: ignore
    external_id = serializers.CharField()
    external_name = serializers.CharField(required=True)
    provider = serializers.ChoiceField(choices=get_provider_choices(AVAILABLE_PROVIDERS))

    @property
    def organization(self) -> Organization:
        return self.context["organization"]

    def get_actor_id(self, validated_data: MutableMapping[str, Any]) -> int:
        return int(validated_data.pop(self._actor_key).actor_id)

    def get_provider_id(self, validated_data: MutableMapping[str, Any]) -> int:
        provider_name_option = validated_data.pop("provider", None)
        provider = validate_provider(provider_name_option, available_providers=AVAILABLE_PROVIDERS)
        return int(provider.value)

    def create(self, validated_data: MutableMapping[str, Any]) -> ExternalActor:
        actor_id = self.get_actor_id(validated_data)
        provider = self.get_provider_id(validated_data)

        return ExternalActor.objects.get_or_create(
            **validated_data,
            actor_id=actor_id,
            provider=provider,
            organization=self.organization,
        )

    def update(
        self, instance: ExternalActor, validated_data: MutableMapping[str, Any]
    ) -> ExternalActor:
        # Discard the object ID passed by the API.
        if "id" in validated_data:
            validated_data.pop("id")

        for key, value in validated_data.items():
            setattr(self.instance, key, value)
        try:
            self.instance.save()
            return self.instance
        except IntegrityError:
            raise serializers.ValidationError(
                "There already exists an external association with this external_name and provider."
            )