Skip to content

Commit 64db882

Browse files
committed
feat: added-types
2 parents cbb1809 + 56e52bc commit 64db882

File tree

4 files changed

+39
-31
lines changed

4 files changed

+39
-31
lines changed

api/segments/models.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
from django.conf import settings
77
from django.contrib.contenttypes.fields import GenericRelation
8+
from django.contrib.contenttypes.models import ContentType
89
from django.core.exceptions import ValidationError
910
from django.db import models
1011
from django_lifecycle import ( # type: ignore[import-untyped]
@@ -14,7 +15,7 @@
1415
hook,
1516
)
1617
from flag_engine.segments import constants
17-
from django.contrib.contenttypes.models import ContentType
18+
1819
from audit.constants import (
1920
SEGMENT_CREATED_MESSAGE,
2021
SEGMENT_DELETED_MESSAGE,
@@ -164,7 +165,11 @@ def clone_segment_rules(self, cloned_segment: "Segment") -> list["SegmentRule"]:
164165
def clone_segment_metadata(self, cloned_segment: "Segment") -> list["Metadata"]:
165166
cloned_metadata = []
166167
for metadata in self.metadata.all():
167-
cloned_metadata.append(metadata.deep_clone_for_new_entity(cloned_segment, ContentType.objects.get_for_model(cloned_segment)))
168+
cloned_metadata.append(
169+
metadata.deep_clone_for_new_entity(
170+
cloned_segment, ContentType.objects.get_for_model(cloned_segment)
171+
)
172+
)
168173
cloned_segment.refresh_from_db()
169174
assert (
170175
len(self.metadata.all())
@@ -174,7 +179,6 @@ def clone_segment_metadata(self, cloned_segment: "Segment") -> list["Metadata"]:
174179

175180
return cloned_metadata
176181

177-
178182
def clone(self, name: str) -> "Segment":
179183
cloned_segment = Segment(
180184
name=name,

api/segments/serializers.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
from rest_framework import serializers
21
from typing import Any, cast
3-
from segments.models import Segment
2+
43
from common.segments.serializers import SegmentSerializer
4+
from rest_framework import serializers
5+
6+
from segments.models import Segment
57

68

79
class SegmentSerializerBasic(serializers.ModelSerializer): # type: ignore[type-arg]
@@ -21,20 +23,21 @@ class SegmentListQuerySerializer(serializers.Serializer): # type: ignore[type-a
2123
)
2224
include_feature_specific = serializers.BooleanField(required=False, default=True)
2325

26+
2427
class CloneSegmentSerializer(SegmentSerializer):
2528
class Meta:
2629
model = Segment
27-
fields = ("name", )
30+
fields = ("name",)
2831

29-
def validate(self, attrs: dict[str, Any]) -> dict[str,Any]:
32+
def validate(self, attrs: dict[str, Any]) -> dict[str, Any]:
3033
if not attrs.get("name"):
3134
raise serializers.ValidationError("Name is required to clone a segment")
3235
return attrs
3336

34-
def create(self, validated_data: dict[str, Any]) -> Segment:
37+
def create(self, validated_data: dict[str, Any]) -> Segment:
3538
name = validated_data.get("name")
3639
source_segment = self.context.get("source_segment")
37-
assert source_segment is not None, "Source segment is required to clone a segment"
38-
return cast(Segment, source_segment.clone(
39-
name
40-
))
40+
assert source_segment is not None, (
41+
"Source segment is required to clone a segment"
42+
)
43+
return cast(Segment, source_segment.clone(name))

api/segments/views.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
import logging
2+
from typing import Any
23

34
from common.projects.permissions import VIEW_PROJECT
45
from common.segments.serializers import (
56
SegmentSerializer,
67
)
78
from django.utils.decorators import method_decorator
89
from drf_yasg.utils import swagger_auto_schema # type: ignore[import-untyped]
9-
from rest_framework import viewsets, status
10+
from rest_framework import status, viewsets
1011
from rest_framework.decorators import action, api_view
1112
from rest_framework.generics import get_object_or_404
13+
from rest_framework.request import Request
1214
from rest_framework.response import Response
1315

1416
from app.pagination import CustomPagination
@@ -29,9 +31,6 @@
2931
SegmentListQuerySerializer,
3032
)
3133

32-
from rest_framework.request import Request
33-
from typing import Any
34-
3534
logger = logging.getLogger()
3635

3736

@@ -125,15 +124,21 @@ def associated_features(self, request, *args, **kwargs): # type: ignore[no-unty
125124
serializer = self.get_serializer(queryset, many=True)
126125
return Response(serializer.data)
127126

128-
@swagger_auto_schema(request_body=CloneSegmentSerializer, responses={201: SegmentSerializer()}, method="post") # type: ignore[misc]
127+
@swagger_auto_schema(
128+
request_body=CloneSegmentSerializer,
129+
responses={201: SegmentSerializer()},
130+
method="post",
131+
) # type: ignore[misc]
129132
@action(
130133
detail=True,
131134
methods=["POST"],
132135
url_path="clone",
133136
serializer_class=CloneSegmentSerializer,
134137
)
135138
def clone(self, request: Request, *args: Any, **kwargs: Any) -> Response:
136-
serializer = CloneSegmentSerializer(data=request.data, context={"source_segment": self.get_object()})
139+
serializer = CloneSegmentSerializer(
140+
data=request.data, context={"source_segment": self.get_object()}
141+
)
137142
serializer.is_valid(raise_exception=True)
138143
clone = serializer.save()
139144
return Response(SegmentSerializer(clone).data, status=status.HTTP_201_CREATED)

api/tests/unit/segments/test_unit_segments_views.py

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1500,7 +1500,7 @@ def test_include_feature_specific_query_filter__false(
15001500
[
15011501
(lazy_fixture("segment")),
15021502
(lazy_fixture("feature_specific_segment")),
1503-
]
1503+
],
15041504
)
15051505
def test_clone_segment(
15061506
project: Project,
@@ -1509,8 +1509,7 @@ def test_clone_segment(
15091509
) -> None:
15101510
# Given
15111511
url = reverse(
1512-
"api-v1:projects:project-segments-clone",
1513-
args=[project.id, source_segment.id]
1512+
"api-v1:projects:project-segments-clone", args=[project.id, source_segment.id]
15141513
)
15151514
new_segment_name = "cloned_segment"
15161515
data = {
@@ -1520,12 +1519,12 @@ def test_clone_segment(
15201519
segment=source_segment, # attach to source_segment instead of using fixture
15211520
type=SegmentRule.ALL_RULE,
15221521
)
1523-
1522+
15241523
sub_rule = SegmentRule.objects.create(
15251524
rule=segment_rule,
15261525
type=SegmentRule.ALL_RULE,
15271526
)
1528-
1527+
15291528
created_condition = Condition.objects.create(
15301529
rule=sub_rule,
15311530
property="foo",
@@ -1536,19 +1535,17 @@ def test_clone_segment(
15361535

15371536
# When
15381537
response = admin_client.post(
1539-
url,
1540-
data=json.dumps(data),
1541-
content_type="application/json"
1538+
url, data=json.dumps(data), content_type="application/json"
15421539
)
15431540

15441541
# Then
15451542
assert response.status_code == status.HTTP_201_CREATED
1546-
1543+
15471544
response_data = response.json()
15481545
assert response_data["name"] == new_segment_name
15491546
assert response_data["project"] == project.id
15501547
assert response_data["id"] != source_segment.id
1551-
1548+
15521549
# Testing cloned segment main attributes
15531550
cloned_segment = Segment.objects.get(id=response_data["id"])
15541551
assert cloned_segment.name == new_segment_name
@@ -1564,14 +1561,13 @@ def test_clone_segment(
15641561

15651562
cloned_top_rule = cloned_segment.rules.first()
15661563
cloned_sub_rule = cloned_top_rule.rules.first()
1567-
1564+
15681565
assert cloned_top_rule.type == segment_rule.type
15691566
assert cloned_sub_rule.type == segment_rule.type
15701567

15711568
# Testing cloning of sub-rules conditions
15721569
cloned_condition = cloned_sub_rule.conditions.first()
1573-
1570+
15741571
assert cloned_condition.property == created_condition.property
15751572
assert cloned_condition.operator == created_condition.operator
15761573
assert cloned_condition.value == created_condition.value
1577-

0 commit comments

Comments
 (0)