Skip to content

Commit

Permalink
fix: metadata validation causes AttributeError for patch requests (#2614
Browse files Browse the repository at this point in the history
)
  • Loading branch information
matthewelwell authored Aug 10, 2023
1 parent 9cb49a4 commit 5e13707
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 10 deletions.
14 changes: 9 additions & 5 deletions api/environments/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from environments.models import Environment, EnvironmentAPIKey, Webhook
from features.serializers import FeatureStateSerializerFull
from metadata.serializers import MetadataSerializer, SerializerWithMetadata
from organisations.models import Organisation, Subscription
from organisations.models import Subscription
from organisations.subscriptions.serializers.mixins import (
ReadOnlyIfNotValidPlanMixin,
)
Expand Down Expand Up @@ -75,11 +75,15 @@ class EnvironmentSerializerWithMetadata(
class Meta(EnvironmentSerializerLight.Meta):
fields = EnvironmentSerializerLight.Meta.fields + ("metadata",)

def get_organisation_from_validated_data(self, validated_data) -> Organisation:
return validated_data.get("project").organisation
def get_project(self, validated_data: dict = None) -> Project:
if self.instance:
return self.instance.project
elif "project" in validated_data:
return validated_data["project"]

def get_project_from_validated_data(self, validated_data) -> Project:
return validated_data.get("project")
raise serializers.ValidationError(
"Unable to retrieve project for metadata validation."
)


class CreateUpdateEnvironmentSerializer(
Expand Down
16 changes: 16 additions & 0 deletions api/environments/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -820,3 +820,19 @@ def test_environment_my_permissions_reruns_400_for_master_api_key(
response.json()["detail"]
== "This endpoint can only be used with a user and not Master API Key"
)


def test_partial_environment_update(
admin_client: APIClient, environment: "Environment"
) -> None:
# Given
url = reverse("api-v1:environments:environment-detail", args=[environment.api_key])
new_name = "updated!"

# When
response = admin_client.patch(
url, data=json.dumps({"name": new_name}), content_type="application/json"
)

# Then
assert response.status_code == status.HTTP_200_OK
10 changes: 5 additions & 5 deletions api/metadata/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,18 +98,18 @@ def validate(self, data):


class SerializerWithMetadata(serializers.BaseSerializer):
def get_organisation_from_validated_data(self, validated_data) -> Organisation:
raise NotImplementedError()
def get_organisation(self, validated_data: dict = None) -> Organisation:
return self.get_project(validated_data).organisation

def get_project_from_validated_data(self, validated_data) -> Project:
def get_project(self, validated_data: dict = None) -> Project:
raise NotImplementedError()

def get_required_for_object(
self, requirement: MetadataModelFieldRequirement, data: dict
) -> Model:
model_name = requirement.content_type.model
try:
return getattr(self, f"get_{model_name}_from_validated_data")(data)
return getattr(self, f"get_{model_name}")(data)
except AttributeError:
raise ValueError(
f"`get_{model_name}_from_validated_data` method does not exist"
Expand All @@ -120,7 +120,7 @@ def validate_required_metadata(self, data):

content_type = ContentType.objects.get_for_model(self.Meta.model)

organisation = self.get_organisation_from_validated_data(data)
organisation = self.get_organisation(data)

requirements = MetadataModelFieldRequirement.objects.filter(
model_field__content_type=content_type,
Expand Down

1 comment on commit 5e13707

@vercel
Copy link

@vercel vercel bot commented on 5e13707 Aug 10, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.