Skip to content

Commit

Permalink
fix: revert totals attributes (#2625)
Browse files Browse the repository at this point in the history
  • Loading branch information
matthewelwell authored Aug 10, 2023
1 parent ca2ce04 commit 3905527
Show file tree
Hide file tree
Showing 8 changed files with 21 additions and 184 deletions.
4 changes: 2 additions & 2 deletions api/audit/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

from audit.models import AuditLog
from environments.serializers import EnvironmentSerializerLight
from projects.serializers import ProjectListSerializer
from projects.serializers import ProjectSerializer
from users.serializers import UserListSerializer


class AuditLogSerializer(serializers.ModelSerializer):
author = UserListSerializer()
environment = EnvironmentSerializerLight()
project = ProjectListSerializer()
project = ProjectSerializer()

class Meta:
model = AuditLog
Expand Down
14 changes: 2 additions & 12 deletions api/environments/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@
ReadOnlyIfNotValidPlanMixin,
)
from projects.models import Project
from projects.serializers import ProjectListSerializer
from projects.serializers import ProjectSerializer
from util.drf_writable_nested.serializers import (
DeleteBeforeUpdateWritableNestedModelSerializer,
)


class EnvironmentSerializerFull(serializers.ModelSerializer):
feature_states = FeatureStateSerializerFull(many=True)
project = ProjectListSerializer()
project = ProjectSerializer()

class Meta:
model = Environment
Expand Down Expand Up @@ -86,16 +86,6 @@ def get_project(self, validated_data: dict = None) -> Project:
)


class EnvironmentRetrieveSerializerWithMetadata(EnvironmentSerializerWithMetadata):
total_segment_overrides = serializers.IntegerField()

class Meta(EnvironmentSerializerWithMetadata.Meta):
fields = EnvironmentSerializerWithMetadata.Meta.fields + (
"total_segment_overrides",
)
read_only_fields = ("total_segment_overrides",)


class CreateUpdateEnvironmentSerializer(
ReadOnlyIfNotValidPlanMixin, EnvironmentSerializerWithMetadata
):
Expand Down
14 changes: 1 addition & 13 deletions api/environments/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

import logging

from django.db.models import Count
from django.utils.decorators import method_decorator
from drf_yasg import openapi
from drf_yasg.utils import swagger_auto_schema
Expand Down Expand Up @@ -42,7 +41,6 @@
CloneEnvironmentSerializer,
CreateUpdateEnvironmentSerializer,
EnvironmentAPIKeySerializer,
EnvironmentRetrieveSerializerWithMetadata,
EnvironmentSerializerWithMetadata,
WebhookSerializer,
)
Expand Down Expand Up @@ -75,8 +73,6 @@ def get_serializer_class(self):
return DeleteAllTraitKeysSerializer
if self.action == "clone":
return CloneEnvironmentSerializer
if self.action == "retrieve":
return EnvironmentRetrieveSerializerWithMetadata
elif self.action in ("create", "update", "partial_update"):
return CreateUpdateEnvironmentSerializer
return EnvironmentSerializerWithMetadata
Expand All @@ -102,20 +98,12 @@ def get_queryset(self):
return (
self.request.master_api_key.organisation.projects.environments.all()
)

return self.request.user.get_permitted_environments(
"VIEW_ENVIRONMENT", project=project
)

# Permission class handles validation of permissions for other actions
queryset = Environment.objects.all()

if self.action == "retrieve":
queryset = queryset.annotate(
total_segment_overrides=Count("feature_segments")
)

return queryset
return Environment.objects.all()

def perform_create(self, serializer):
environment = serializer.save()
Expand Down
4 changes: 2 additions & 2 deletions api/organisations/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
PermissionModelSerializer,
UserObjectPermissionsSerializer,
)
from projects.serializers import ProjectListSerializer
from projects.serializers import ProjectSerializer
from users.serializers import UserIdSerializer
from webhooks.mixins import TriggerSampleWebhookMixin
from webhooks.webhooks import WebhookType
Expand Down Expand Up @@ -118,7 +118,7 @@ def create(self, request, **kwargs):
def projects(self, request, pk):
organisation = self.get_object()
projects = organisation.projects.all()
return Response(ProjectListSerializer(projects, many=True).data)
return Response(ProjectSerializer(projects, many=True).data)

@action(detail=True, methods=["POST"])
def invite(self, request, pk):
Expand Down
26 changes: 3 additions & 23 deletions api/projects/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from users.serializers import UserListSerializer, UserPermissionGroupSerializer


class ProjectListSerializer(serializers.ModelSerializer):
class ProjectSerializer(serializers.ModelSerializer):
migration_status = serializers.SerializerMethodField(
help_text="Edge migration status of the project; can be one of: "
+ ", ".join([k.value for k in ProjectIdentityMigrationStatus])
Expand All @@ -39,8 +39,10 @@ class Meta:
def get_migration_status(self, obj: Project) -> str:
if not settings.PROJECT_METADATA_TABLE_NAME_DYNAMO:
migration_status = ProjectIdentityMigrationStatus.NOT_APPLICABLE.value

elif obj.is_edge_project_by_default:
migration_status = ProjectIdentityMigrationStatus.MIGRATION_COMPLETED.value

else:
migration_status = IdentityMigrator(obj.id).migration_status.value

Expand All @@ -56,28 +58,6 @@ def get_use_edge_identities(self, obj: Project) -> bool:
)


class ProjectRetrieveSerializer(ProjectListSerializer):
total_features = serializers.IntegerField()
total_segments = serializers.IntegerField()

class Meta(ProjectListSerializer.Meta):
fields = ProjectListSerializer.Meta.fields + (
"max_segments_allowed",
"max_features_allowed",
"max_segment_overrides_allowed",
"total_features",
"total_segments",
)

read_only_fields = (
"max_segments_allowed",
"max_features_allowed",
"max_segment_overrides_allowed",
"total_features",
"total_segments",
)


class CreateUpdateUserProjectPermissionSerializer(
CreateUpdateUserPermissionSerializerABC
):
Expand Down
44 changes: 9 additions & 35 deletions api/projects/tests/test_serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,10 @@
from django.utils import timezone

from environments.dynamodb.types import ProjectIdentityMigrationStatus
from projects.serializers import (
ProjectListSerializer,
ProjectRetrieveSerializer,
)
from projects.serializers import ProjectSerializer


def test_ProjectListSerializer_get_migration_status_returns_migration_not_applicable_if_not_configured(
def test_ProjectSerializer_get_migration_status_returns_migration_not_applicable_if_not_configured(
mocker, project, settings
):
# Given
Expand All @@ -19,7 +16,7 @@ def test_ProjectListSerializer_get_migration_status_returns_migration_not_applic
"projects.serializers.IdentityMigrator", autospec=True
)

serializer = ProjectListSerializer()
serializer = ProjectSerializer()

# When
migration_status = serializer.get_migration_status(project)
Expand All @@ -29,7 +26,7 @@ def test_ProjectListSerializer_get_migration_status_returns_migration_not_applic
mocked_identity_migrator.assert_not_called()


def test_ProjectListSerializer_get_migration_status_returns_migration_completed_for_new_projects(
def test_ProjectSerializer_get_migration_status_returns_migration_completed_for_new_projects(
mocker, project, settings
):
# Given
Expand All @@ -39,7 +36,7 @@ def test_ProjectListSerializer_get_migration_status_returns_migration_completed_
"projects.serializers.IdentityMigrator", autospec=True
)

serializer = ProjectListSerializer()
serializer = ProjectSerializer()

# When
migration_status = serializer.get_migration_status(project)
Expand All @@ -49,7 +46,7 @@ def test_ProjectListSerializer_get_migration_status_returns_migration_completed_
mocked_identity_migrator.assert_not_called()


def test_ProjectListSerializer_get_migration_status_calls_migrator_with_correct_arguments_for_old_projects(
def test_ProjectSerializer_get_migration_status_calls_migrator_with_correct_arguments_for_old_projects(
mocker, project, settings
):
# Given
Expand All @@ -60,7 +57,7 @@ def test_ProjectListSerializer_get_migration_status_calls_migrator_with_correct_

settings.EDGE_RELEASE_DATETIME = timezone.now()

serializer = ProjectListSerializer()
serializer = ProjectSerializer()

# When
migration_status = serializer.get_migration_status(project)
Expand All @@ -81,32 +78,9 @@ def test_ProjectListSerializer_get_migration_status_calls_migrator_with_correct_
(ProjectIdentityMigrationStatus.NOT_APPLICABLE.value, False),
],
)
def test_ProjectListSerializer_get_use_edge_identities(
project, migration_status, expected
):
def test_ProjectSerializer_get_use_edge_identities(project, migration_status, expected):
# Given
serializer = ProjectListSerializer(context={"migration_status": migration_status})

# When/Then
assert expected is serializer.get_use_edge_identities(project)


@pytest.mark.parametrize(
"migration_status, expected",
[
(ProjectIdentityMigrationStatus.MIGRATION_COMPLETED.value, True),
(ProjectIdentityMigrationStatus.MIGRATION_IN_PROGRESS.value, False),
(ProjectIdentityMigrationStatus.MIGRATION_NOT_STARTED.value, False),
(ProjectIdentityMigrationStatus.NOT_APPLICABLE.value, False),
],
)
def test_ProjectRetrieveSerializer_get_use_edge_identities(
project, migration_status, expected
):
# Given
serializer = ProjectRetrieveSerializer(
context={"migration_status": migration_status}
)
serializer = ProjectSerializer(context={"migration_status": migration_status})

# When/Then
assert expected is serializer.get_use_edge_identities(project)
24 changes: 2 additions & 22 deletions api/projects/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
from __future__ import unicode_literals

from django.conf import settings
from django.db.models import Count, Q
from django.utils.decorators import method_decorator
from drf_yasg import openapi
from drf_yasg.utils import no_body, swagger_auto_schema
Expand Down Expand Up @@ -45,8 +44,7 @@
CreateUpdateUserProjectPermissionSerializer,
ListUserPermissionGroupProjectPermissionSerializer,
ListUserProjectPermissionSerializer,
ProjectListSerializer,
ProjectRetrieveSerializer,
ProjectSerializer,
)


Expand All @@ -72,11 +70,7 @@
),
)
class ProjectViewSet(viewsets.ModelViewSet):
def get_serializer_class(self):
if self.action == "retrieve":
return ProjectRetrieveSerializer
return ProjectListSerializer

serializer_class = ProjectSerializer
permission_classes = [ProjectPermissions | MasterAPIKeyProjectPermissions]
pagination_class = None

Expand All @@ -99,20 +93,6 @@ def get_queryset(self):
if project_uuid:
queryset = queryset.filter(uuid=project_uuid)

if self.action == "retrieve":
queryset = queryset.annotate(
total_features=Count(
"features",
filter=Q(features__deleted_at__isnull=True),
distinct=True,
),
total_segments=Count(
"segments",
filter=Q(segments__deleted_at__isnull=True),
distinct=True,
),
)

return queryset

def perform_create(self, serializer):
Expand Down
75 changes: 0 additions & 75 deletions api/tests/unit/projects/test_unit_projects_views.py

This file was deleted.

1 comment on commit 3905527

@vercel
Copy link

@vercel vercel bot commented on 3905527 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.