diff --git a/connect/api/v2/projects/serializers.py b/connect/api/v2/projects/serializers.py index e3d40c77..0e30ae36 100644 --- a/connect/api/v2/projects/serializers.py +++ b/connect/api/v2/projects/serializers.py @@ -19,6 +19,7 @@ ProjectAuthorization, Project, Organization, + ProjectMode, RequestRocketPermission, OpenedProject, ProjectRole, @@ -55,6 +56,7 @@ class Meta: "description", "brain_on", "project_type", + "project_mode", "vtex_account", ] ref_name = None @@ -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: @@ -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) @@ -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"] diff --git a/connect/api/v2/projects/tests.py b/connect/api/v2/projects/tests.py index 4ec48c76..c93eb1f5 100644 --- a/connect/api/v2/projects/tests.py +++ b/connect/api/v2/projects/tests.py @@ -13,6 +13,7 @@ BillingPlan, OrganizationRole, Project, + ProjectMode, TypeProject, ) from connect.api.v2.projects.views import ProjectViewSet @@ -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): diff --git a/connect/api/v2/projects/views.py b/connect/api/v2/projects/views.py index 82b9cfec..891d9507 100644 --- a/connect/api/v2/projects/views.py +++ b/connect/api/v2/projects/views.py @@ -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 @@ -9,6 +10,7 @@ from connect.common.models import Project, OpenedProject, TypeProject from connect.api.v2.projects.serializers import ( + ChangeProjectModeSerializer, ProjectSerializer, ProjectUpdateSerializer, ProjectListAuthorizationSerializer, @@ -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