Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: revert totals attributes #2625

Merged
merged 2 commits into from
Aug 10, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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.