From 385aae930f96395c94ad3eb17abbe10959fd1685 Mon Sep 17 00:00:00 2001 From: ITQ Date: Sun, 22 Feb 2026 19:19:44 +0300 Subject: [PATCH] chore(): small improvements --- .../api/v1/decision/tests/test_decision_api.py | 2 ++ src/backend/api/v1/events/schemas.py | 4 ++++ src/backend/api/v1/experiments/endpoints.py | 13 +++++++++---- src/backend/apps/decision/tests/test_decide.py | 10 ++++++++++ src/backend/apps/flags/models.py | 4 ++-- 5 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/backend/api/v1/decision/tests/test_decision_api.py b/src/backend/api/v1/decision/tests/test_decision_api.py index b14656c..9f21ebd 100644 --- a/src/backend/api/v1/decision/tests/test_decision_api.py +++ b/src/backend/api/v1/decision/tests/test_decision_api.py @@ -52,6 +52,7 @@ class DecisionAPITest(TestCase): ) variant_create( experiment=exp, + user=self.owner, name="control", value="ctrl", weight=Decimal("50.00"), @@ -59,6 +60,7 @@ class DecisionAPITest(TestCase): ) variant_create( experiment=exp, + user=self.owner, name="treatment", value="treat", weight=Decimal("50.00"), diff --git a/src/backend/api/v1/events/schemas.py b/src/backend/api/v1/events/schemas.py index 8057699..4ff81bb 100644 --- a/src/backend/api/v1/events/schemas.py +++ b/src/backend/api/v1/events/schemas.py @@ -14,6 +14,7 @@ class EventTypeCreateIn(ModelSchema): EventType.name.field.name, EventType.display_name.field.name, EventType.description.field.name, + EventType.is_exposure.field.name, EventType.requires_exposure.field.name, EventType.required_fields.field.name, ) @@ -22,6 +23,7 @@ class EventTypeCreateIn(ModelSchema): class EventTypeUpdateIn(ModelSchema): display_name: str | None = None description: str | None = None + is_exposure: bool | None = None requires_exposure: bool | None = None required_fields: list[str] | None = None is_active: bool | None = None @@ -31,6 +33,7 @@ class EventTypeUpdateIn(ModelSchema): fields: ClassVar[tuple[str, ...]] = ( EventType.display_name.field.name, EventType.description.field.name, + EventType.is_exposure.field.name, EventType.requires_exposure.field.name, EventType.required_fields.field.name, EventType.is_active.field.name, @@ -45,6 +48,7 @@ class EventTypeOut(ModelSchema): EventType.name.field.name, EventType.display_name.field.name, EventType.description.field.name, + EventType.is_exposure.field.name, EventType.requires_exposure.field.name, EventType.required_fields.field.name, EventType.is_active.field.name, diff --git a/src/backend/api/v1/experiments/endpoints.py b/src/backend/api/v1/experiments/endpoints.py index 16adac4..040f386 100644 --- a/src/backend/api/v1/experiments/endpoints.py +++ b/src/backend/api/v1/experiments/endpoints.py @@ -184,12 +184,14 @@ def create_variant( experiment_id: UUID, payload: VariantCreateIn, ) -> tuple[HTTPStatus, VariantOut]: + user = _get_user(request) exp = get_object_or_404( - Experiment.objects.select_related("flag"), + Experiment.objects.select_related("flag", "owner"), pk=experiment_id, ) v = variant_create( experiment=exp, + user=user, name=payload.name, value=payload.value, weight=payload.weight, @@ -210,13 +212,15 @@ def update_variant( variant_id: UUID, payload: VariantUpdateIn, ) -> tuple[HTTPStatus, VariantOut]: + user = _get_user(request) v = get_object_or_404( - Variant.objects.select_related("experiment__flag"), + Variant.objects.select_related("experiment__flag", "experiment__owner"), pk=variant_id, experiment_id=experiment_id, ) v = variant_update( variant=v, + user=user, **payload.model_dump(exclude_none=True), ) return HTTPStatus.OK, VariantOut.model_validate(v) @@ -233,12 +237,13 @@ def delete_variant( experiment_id: UUID, variant_id: UUID, ) -> tuple[HTTPStatus, None]: + user = _get_user(request) v = get_object_or_404( - Variant, + Variant.objects.select_related("experiment__owner"), pk=variant_id, experiment_id=experiment_id, ) - variant_delete(variant=v) + variant_delete(variant=v, user=user) return HTTPStatus.NO_CONTENT, None diff --git a/src/backend/apps/decision/tests/test_decide.py b/src/backend/apps/decision/tests/test_decide.py index 0272d5c..c5bd969 100644 --- a/src/backend/apps/decision/tests/test_decide.py +++ b/src/backend/apps/decision/tests/test_decide.py @@ -77,6 +77,7 @@ class DecideForFlagTest(TestCase): ) variant_create( experiment=exp, + user=self.owner, name="control", value="ctrl", weight=Decimal("50.00"), @@ -84,6 +85,7 @@ class DecideForFlagTest(TestCase): ) variant_create( experiment=exp, + user=self.owner, name="treatment", value="treat", weight=Decimal("50.00"), @@ -118,6 +120,7 @@ class DecideForFlagTest(TestCase): ) variant_create( experiment=exp, + user=self.owner, name="control", value="ctrl", weight=Decimal("50.00"), @@ -125,6 +128,7 @@ class DecideForFlagTest(TestCase): ) variant_create( experiment=exp, + user=self.owner, name="treatment", value="treat", weight=Decimal("50.00"), @@ -157,6 +161,7 @@ class TargetingRulesTest(TestCase): ) variant_create( experiment=exp, + user=self.owner, name="control", value="ctrl", weight=Decimal("50.00"), @@ -164,6 +169,7 @@ class TargetingRulesTest(TestCase): ) variant_create( experiment=exp, + user=self.owner, name="treatment", value="treat", weight=Decimal("50.00"), @@ -260,6 +266,7 @@ class ParticipationLimitsTest(TestCase): ) variant_create( experiment=exp, + user=self.owner, name="control", value="ctrl", weight=Decimal("50.00"), @@ -267,6 +274,7 @@ class ParticipationLimitsTest(TestCase): ) variant_create( experiment=exp, + user=self.owner, name="treatment", value="treat", weight=Decimal("50.00"), @@ -331,6 +339,7 @@ class PartialTrafficVariantDistributionTest(TestCase): ) variant_create( experiment=exp, + user=self.owner, name="control", value="ctrl", weight=Decimal("10.00"), @@ -338,6 +347,7 @@ class PartialTrafficVariantDistributionTest(TestCase): ) variant_create( experiment=exp, + user=self.owner, name="treatment", value="treat", weight=Decimal("10.00"), diff --git a/src/backend/apps/flags/models.py b/src/backend/apps/flags/models.py index ad5e434..eb8af9c 100644 --- a/src/backend/apps/flags/models.py +++ b/src/backend/apps/flags/models.py @@ -62,8 +62,8 @@ class FeatureFlag(BaseModel): RegexValidator( regex=FLAG_KEY_PATTERN, message=( - "Key must start with a lowercase letter and contain only " - "lowercase letters, digits, and underscores." + "Event type name must follow snake_case, " + "camelCase, or PascalCase." ), ) ],