|
@@ -22,7 +22,7 @@ from sentry.api.bases.project import ProjectPermission
|
|
from sentry.api.exceptions import ResourceDoesNotExist
|
|
from sentry.api.exceptions import ResourceDoesNotExist
|
|
from sentry.constants import ObjectStatus
|
|
from sentry.constants import ObjectStatus
|
|
from sentry.feedback.models import Feedback
|
|
from sentry.feedback.models import Feedback
|
|
-from sentry.models import Organization, ProjectKey
|
|
|
|
|
|
+from sentry.models import Environment, Organization, ProjectKey
|
|
from sentry.models.project import Project
|
|
from sentry.models.project import Project
|
|
from sentry.utils.sdk import bind_organization_context, configure_scope
|
|
from sentry.utils.sdk import bind_organization_context, configure_scope
|
|
|
|
|
|
@@ -36,7 +36,7 @@ class FeedbackValidator(serializers.Serializer):
|
|
|
|
|
|
# optional fields
|
|
# optional fields
|
|
release = serializers.CharField(required=False)
|
|
release = serializers.CharField(required=False)
|
|
- environment = serializers.CharField(required=False)
|
|
|
|
|
|
+ environment = serializers.CharField(required=False, allow_null=True, default="production")
|
|
dist = serializers.CharField(required=False)
|
|
dist = serializers.CharField(required=False)
|
|
event_id = serializers.CharField(required=False)
|
|
event_id = serializers.CharField(required=False)
|
|
request = serializers.JSONField(required=False)
|
|
request = serializers.JSONField(required=False)
|
|
@@ -46,6 +46,11 @@ class FeedbackValidator(serializers.Serializer):
|
|
BrowserContext = serializers.JSONField(required=False)
|
|
BrowserContext = serializers.JSONField(required=False)
|
|
DeviceContext = serializers.JSONField(required=False)
|
|
DeviceContext = serializers.JSONField(required=False)
|
|
|
|
|
|
|
|
+ def validate_environment(self, value):
|
|
|
|
+ if not Environment.is_valid_name(value):
|
|
|
|
+ raise serializers.ValidationError("Invalid value for environment")
|
|
|
|
+ return value
|
|
|
|
+
|
|
def validate(self, data):
|
|
def validate(self, data):
|
|
try:
|
|
try:
|
|
ret: Dict[str, Any] = {}
|
|
ret: Dict[str, Any] = {}
|
|
@@ -54,7 +59,6 @@ class FeedbackValidator(serializers.Serializer):
|
|
"platform": data["platform"],
|
|
"platform": data["platform"],
|
|
"sdk": data["sdk"],
|
|
"sdk": data["sdk"],
|
|
"release": data.get("release"),
|
|
"release": data.get("release"),
|
|
- "environment": data.get("environment"),
|
|
|
|
"request": data.get("request"),
|
|
"request": data.get("request"),
|
|
"user": data.get("user"),
|
|
"user": data.get("user"),
|
|
"tags": data.get("tags"),
|
|
"tags": data.get("tags"),
|
|
@@ -70,6 +74,7 @@ class FeedbackValidator(serializers.Serializer):
|
|
ret["replay_id"] = data["feedback"].get("replay_id")
|
|
ret["replay_id"] = data["feedback"].get("replay_id")
|
|
ret["project_id"] = self.context["project"].id
|
|
ret["project_id"] = self.context["project"].id
|
|
ret["organization_id"] = self.context["organization"].id
|
|
ret["organization_id"] = self.context["organization"].id
|
|
|
|
+ ret["environment"] = data.get("environment")
|
|
return ret
|
|
return ret
|
|
except KeyError:
|
|
except KeyError:
|
|
raise serializers.ValidationError("Input has wrong field name or type")
|
|
raise serializers.ValidationError("Input has wrong field name or type")
|
|
@@ -157,5 +162,10 @@ class FeedbackIngestEndpoint(Endpoint):
|
|
return self.respond(feedback_validator.errors, status=400)
|
|
return self.respond(feedback_validator.errors, status=400)
|
|
|
|
|
|
result = feedback_validator.validated_data
|
|
result = feedback_validator.validated_data
|
|
|
|
+
|
|
|
|
+ env = Environment.objects.get_or_create(
|
|
|
|
+ name=result["environment"], organization_id=organization.id
|
|
|
|
+ )[0]
|
|
|
|
+ result["environment"] = env
|
|
Feedback.objects.create(**result)
|
|
Feedback.objects.create(**result)
|
|
return self.respond(status=201)
|
|
return self.respond(status=201)
|