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." )
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." )