Skip to content

Commit a38a514

Browse files
committed
Make condition.property not null
1 parent 5c1c308 commit a38a514

4 files changed

Lines changed: 40 additions & 42 deletions

File tree

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# Generated by Django 4.2.22 on 2025-08-04 20:50
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
"""
8+
Update condition.property to be non-nullable.
9+
10+
Only conditions of operator PERCENTAGE_SPLIT have empty `property` values,
11+
according to this query:
12+
13+
```sql
14+
select c.operator, count(*) from segments_condition c where c.property is null or c.property !~ '\S' group by 1;
15+
```
16+
17+
The Flagsmith engine can now do percentage split upon any property, so we
18+
default empty `property` values to `"$.identity.key"` because that's the
19+
old behavior for PERCENTAGE_SPLIT conditions.
20+
"""
21+
22+
dependencies = [
23+
("segments", "0027_historicalsegmentrule"),
24+
]
25+
26+
operations = [
27+
migrations.AlterField(
28+
model_name="condition",
29+
name="property",
30+
field=models.CharField(default="$.identity.key", max_length=1000),
31+
preserve_default=False,
32+
),
33+
migrations.AlterField(
34+
model_name="historicalcondition",
35+
name="property",
36+
field=models.CharField(default="$.identity.key", max_length=1000),
37+
preserve_default=False,
38+
),
39+
]

api/segments/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ class Condition(
310310
)
311311

312312
operator = models.CharField(choices=CONDITION_TYPES, max_length=500)
313-
property = models.CharField(blank=True, null=True, max_length=1000)
313+
property = models.CharField(max_length=1000)
314314
value = models.CharField(
315315
max_length=settings.SEGMENT_CONDITION_VALUE_LIMIT, blank=True, null=True
316316
)

api/segments/serializers.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
from django.conf import settings
55
from django.db import transaction
66
from drf_writable_nested.serializers import WritableNestedModelSerializer
7-
from flag_engine.segments.constants import PERCENTAGE_SPLIT
87
from rest_framework import serializers
98
from rest_framework.exceptions import ValidationError
109

@@ -33,12 +32,6 @@ class Meta:
3332
"delete",
3433
]
3534

36-
def validate(self, attrs: dict[str, Any]) -> dict[str, Any]:
37-
attrs = super().validate(attrs)
38-
if attrs.get("operator") != PERCENTAGE_SPLIT and not attrs.get("property"):
39-
raise ValidationError({"property": ["This field may not be blank."]})
40-
return attrs
41-
4235
def to_internal_value(self, data: dict[str, Any]) -> Any:
4336
# Conversion to correct value type is handled elsewhere
4437
data["value"] = str(data["value"]) if "value" in data else None

api/tests/unit/segments/test_unit_segments_views.py

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1065,40 +1065,6 @@ def test_create_segment_with_required_metadata_returns_201(
10651065
assert response.json()["metadata"][0]["field_value"] == str(field_value)
10661066

10671067

1068-
def test_update_segment__empty_non_split_condition__responds_400(
1069-
admin_client: APIClient,
1070-
segment: Segment,
1071-
segment_rule: SegmentRule,
1072-
) -> None:
1073-
# When
1074-
response = admin_client.patch(
1075-
f"/api/v1/projects/{segment.project.pk}/segments/{segment.pk}/",
1076-
data={
1077-
"rules": [
1078-
{
1079-
"id": segment_rule.pk,
1080-
"type": "ALL",
1081-
"rules": [],
1082-
"conditions": [
1083-
{
1084-
# "property": "not-provided",
1085-
"operator": EQUAL,
1086-
"value": "👀",
1087-
},
1088-
],
1089-
},
1090-
],
1091-
},
1092-
format="json",
1093-
)
1094-
1095-
# Then
1096-
assert response.status_code == status.HTTP_400_BAD_REQUEST, response.data
1097-
assert response.json()["rules"][0]["conditions"][0]["property"] == [
1098-
"This field may not be blank."
1099-
]
1100-
1101-
11021068
@pytest.mark.parametrize(
11031069
"client",
11041070
[lazy_fixture("admin_master_api_key_client"), lazy_fixture("admin_client")],

0 commit comments

Comments
 (0)