Skip to content

Commit

Permalink
feat: add set mode endpoint to the project viewset
Browse files Browse the repository at this point in the history
  • Loading branch information
kallilsouza committed Jan 21, 2025
1 parent 340f6ec commit 6d3bcef
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 0 deletions.
19 changes: 19 additions & 0 deletions connect/api/v2/projects/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
ProjectAuthorization,
Project,
Organization,
ProjectMode,
RequestRocketPermission,
OpenedProject,
ProjectRole,
Expand Down Expand Up @@ -55,6 +56,7 @@ class Meta:
"description",
"brain_on",
"project_type",
"project_mode",
"vtex_account",
]
ref_name = None
Expand Down Expand Up @@ -84,6 +86,10 @@ class Meta:
project_type = serializers.ChoiceField(
choices=TypeProject.choices, default=TypeProject.GENERAL
)
project_mode = serializers.ChoiceField(
choices=ProjectMode.choices,
default=ProjectMode.WENI_FRAMEWORK,
)

def get_project_template_type(self, obj):
if obj.is_template:
Expand Down Expand Up @@ -122,6 +128,9 @@ def create(self, validated_data):
project_template_type=project_template_type,
description=validated_data.get("description", None),
project_type=validated_data.get("project_type", TypeProject.GENERAL.value),
project_mode=validated_data.get(
"project_mode", ProjectMode.WENI_FRAMEWORK.value
),
)

self.send_request_flow_product(user)
Expand Down Expand Up @@ -579,3 +588,13 @@ def get_project(self, obj):
data = ProjectSerializer(obj.project, context=self.context).data

return data


class ChangeProjectModeSerializer(serializers.ModelSerializer):
project_mode = serializers.ChoiceField(
choices=ProjectMode.choices,
)

class Meta:
model = Project
fields = ["uuid", "project_mode"]
53 changes: 53 additions & 0 deletions connect/api/v2/projects/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
BillingPlan,
OrganizationRole,
Project,
ProjectMode,
TypeProject,
)
from connect.api.v2.projects.views import ProjectViewSet
Expand Down Expand Up @@ -308,6 +309,58 @@ def test_set_type_user_unauthorized(self):

self.assertEquals(response.status_code, status.HTTP_403_FORBIDDEN)

def test_set_mode(self):
self.project1.project_mode = ProjectMode.OPINIONATED
self.project1.save(update_fields=["project_mode"])

project_uuid = str(self.project1.uuid)
new_mode = ProjectMode.WENI_FRAMEWORK

path = f"/v2/projects/{project_uuid}/set-mode"
method = {"post": "set_mode"}
data = {"project_mode": new_mode}
user = self.user

response, content_data = self.request(
path,
method,
user=user,
project_uuid=project_uuid,
data=data,
)

self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(content_data.get("project_mode"), new_mode)

self.project1.refresh_from_db(fields=["project_mode"])
self.assertEqual(self.project1.project_mode, new_mode)

def test_cannot_set_mode_with_invalid_option(self):
self.project1.project_mode = ProjectMode.OPINIONATED
self.project1.save(update_fields=["project_mode"])

project_uuid = str(self.project1.uuid)
new_mode = "invalid"

path = f"/v2/projects/{project_uuid}/set-mode"
method = {"post": "set_mode"}
data = {"project_mode": new_mode}
user = self.user

response, content_data = self.request(
path,
method,
user=user,
project_uuid=project_uuid,
data=data,
)

self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertIn("is not a valid choice", content_data.get("project_mode")[0])

self.project1.refresh_from_db(fields=["project_mode"])
self.assertNotEqual(self.project1.project_mode, new_mode)


class ProjectTestCase(TestCase):

Expand Down
17 changes: 17 additions & 0 deletions connect/api/v2/projects/views.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from rest_framework import mixins, status
from rest_framework.viewsets import GenericViewSet
from rest_framework.request import Request
from rest_framework.response import Response
from rest_framework.decorators import action
from rest_framework.permissions import IsAuthenticated
Expand All @@ -9,6 +10,7 @@

from connect.common.models import Project, OpenedProject, TypeProject
from connect.api.v2.projects.serializers import (
ChangeProjectModeSerializer,
ProjectSerializer,
ProjectUpdateSerializer,
ProjectListAuthorizationSerializer,
Expand Down Expand Up @@ -139,6 +141,21 @@ def set_type(self, request, **kwargs):
except Exception as e:
return Response({"detail": str(e)}, status=status.HTTP_400_BAD_REQUEST)

@action(
detail=True,
methods=["POST"],
url_name="set-mode",
serializer_class=ChangeProjectModeSerializer,
)
def set_mode(self, request: Request, **kwargs) -> Response:
instance: Project = self.get_object()

serializer = ChangeProjectModeSerializer(instance, data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()

return Response(serializer.data, status=status.HTTP_200_OK)


class ProjectAuthorizationViewSet(mixins.RetrieveModelMixin, GenericViewSet):
queryset = Project.objects
Expand Down

0 comments on commit 6d3bcef

Please sign in to comment.