From ffdd515cf842555d09edba3ace33a1f9db712937 Mon Sep 17 00:00:00 2001 From: NarayanBavisetti Date: Mon, 12 Feb 2024 00:49:37 +0530 Subject: [PATCH] chore: migrations and visiblity of views --- apiserver/plane/app/urls/user.py | 27 +++++ apiserver/plane/app/urls/views.py | 100 ++++++++++++------ apiserver/plane/app/views/view.py | 73 +++++++++++++ ...and_more.py => 0061_auto_20240211_1721.py} | 2 +- 4 files changed, 169 insertions(+), 33 deletions(-) rename apiserver/plane/db/migrations/{0059_alter_issueviewfavorite_project_and_more.py => 0061_auto_20240211_1721.py} (97%) diff --git a/apiserver/plane/app/urls/user.py b/apiserver/plane/app/urls/user.py index afd099464..34ef044c9 100644 --- a/apiserver/plane/app/urls/user.py +++ b/apiserver/plane/app/urls/user.py @@ -119,6 +119,15 @@ urlpatterns = [ ), name="user-workspace-views", ), + path( + "users/me/workspaces//views//duplicate/", + UserWorkspaceViewViewSet.as_view( + { + "post": "duplicate", + } + ), + name="user-workspace-views", + ), path( "users/me/workspaces//views//lock/", UserWorkspaceViewViewSet.as_view( @@ -149,5 +158,23 @@ urlpatterns = [ ), name="user-project-views", ), + path( + "users/me/workspaces//projects//views//lock/", + UserProjectViewViewSet.as_view( + { + "post": "toggle_lock", + } + ), + name="user-project-lock-views", + ), + path( + "users/me/workspaces//projects//views//duplicate/", + UserWorkspaceViewViewSet.as_view( + { + "post": "duplicate", + } + ), + name="user-project-duplicate-views", + ), ] diff --git a/apiserver/plane/app/urls/views.py b/apiserver/plane/app/urls/views.py index 642d07449..3fab4f804 100644 --- a/apiserver/plane/app/urls/views.py +++ b/apiserver/plane/app/urls/views.py @@ -10,6 +10,65 @@ from plane.app.views import ( urlpatterns = [ + path( + "workspaces//issues/", + WorkspaceViewViewSet.as_view( + { + "get": "list", + } + ), + name="workspace-view-issues", + ), + path( + "workspaces//views/", + WorkspaceViewViewSet.as_view( + { + "get": "list", + "post": "create", + } + ), + name="workspace-view", + ), + path( + "workspaces//views//", + WorkspaceViewViewSet.as_view( + { + "get": "retrieve", + "patch": "partial_update", + "delete": "destroy", + } + ), + name="workspace-view", + ), + path( + "workspaces//views//duplicate/", + WorkspaceViewFavoriteViewSet.as_view( + { + "post": "duplicate", + } + ), + name="workspace-duplicate-view", + ), + path( + "workspaces//views//favorite/", + WorkspaceViewFavoriteViewSet.as_view( + { + "get": "list", + "post": "create", + "delete": "destroy", + } + ), + name="workspace-favorite-view", + ), + path( + "workspaces//views//visibility/", + WorkspaceViewViewSet.as_view( + { + "post": "visibility", + } + ), + name="workspace-duplicate-view", + ), path( "workspaces//projects//views/", ProjectViewViewSet.as_view( @@ -33,45 +92,22 @@ urlpatterns = [ name="project-view", ), path( - "workspaces//views/", - WorkspaceViewViewSet.as_view( + "workspaces//projects//views//duplicate/", + ProjectViewViewSet.as_view( { - "get": "list", - "post": "create", + "post": "duplicate", } ), - name="global-view", + name="project-duplicate-view", ), path( - "workspaces//views//", - WorkspaceViewViewSet.as_view( + "workspaces//projects//views//visibility/", + ProjectViewViewSet.as_view( { - "get": "retrieve", - "patch": "partial_update", - "delete": "destroy", + "post": "visibility", } ), - name="global-view", - ), - path( - "workspaces//issues/", - WorkspaceViewViewSet.as_view( - { - "get": "list", - } - ), - name="global-view-issues", - ), - path( - "workspaces//views//favorite/", - WorkspaceViewFavoriteViewSet.as_view( - { - "get": "list", - "post": "create", - "delete": "destroy", - } - ), - name="user-workspace-favorite-view", + name="project-duplicate-view", ), path( "workspaces//projects//views//favorite/", @@ -82,6 +118,6 @@ urlpatterns = [ "delete": "destroy", } ), - name="user-project-favorite-view", + name="project-favorite-view", ), ] diff --git a/apiserver/plane/app/views/view.py b/apiserver/plane/app/views/view.py index 167cc1ca4..cad2ad576 100644 --- a/apiserver/plane/app/views/view.py +++ b/apiserver/plane/app/views/view.py @@ -114,6 +114,20 @@ class UserWorkspaceViewViewSet(BaseViewSet): return Response(ViewSerializer(view).data, status=status.HTTP_200_OK) + def duplicate(self, request, slug, pk): + view = View.objects.get(workspace__slug=slug, pk=pk) + # Create a shallow copy of the original view object + new_view = view + + # Set the primary key of the new view to None to ensure it gets a new primary key + new_view.pk = None + + # Modify the name of the new view to indicate that it's a copy + new_view.name = f"{view.name} (Copy)" + new_view.save(owned_by=request.user) + return Response(ViewSerializer(new_view).data, status=status.HTTP_201_CREATED) + + def destroy(self, request, slug, pk): view = View.objects.get(workspace__slug=slug, pk=pk) if view.owned_by != self.request.user: @@ -160,6 +174,29 @@ class WorkspaceViewViewSet(BaseViewSet): view.is_locked = lock view.save(update_fields=["is_locked"]) return Response(ViewSerializer(view).data, status=status.HTTP_200_OK) + + def duplicate(self, request, slug, pk): + view = View.objects.get(workspace__slug=slug, pk=pk) + # Create a shallow copy of the original view object + new_view = view + + # Set the primary key of the new view to None to ensure it gets a new primary key + new_view.pk = None + + # Modify the name of the new view to indicate that it's a copy + new_view.name = f"{view.name} (Copy)" + new_view.save(owned_by=request.user) + return Response(ViewSerializer(new_view).data, status=status.HTTP_201_CREATED) + + def visibility(self, request, slug, pk): + view = ( + self.get_queryset() + .filter(pk=pk, workspace__slug=slug) + .first() + ) + view.access = request.data.get("access", view.access) + view.save(update_fields=["access"]) + return Response(ViewSerializer(view).data, status=status.HTTP_200_OK) class UserProjectViewViewSet(BaseViewSet): @@ -228,6 +265,19 @@ class UserProjectViewViewSet(BaseViewSet): view.is_locked = lock view.save(update_fields=["is_locked"]) return Response(ViewSerializer(view).data, status=status.HTTP_200_OK) + + def duplicate(self, request, slug, project_id, pk): + view = View.objects.get(workspace__slug=slug, project_id=project_id, pk=pk) + # Create a shallow copy of the original view object + new_view = view + + # Set the primary key of the new view to None to ensure it gets a new primary key + new_view.pk = None + + # Modify the name of the new view to indicate that it's a copy + new_view.name = f"{view.name} (Copy)" + new_view.save(owned_by=request.user) + return Response(ViewSerializer(new_view).data, status=status.HTTP_201_CREATED) def destroy(self, request, slug, project_id, pk): view = View.objects.get( @@ -288,6 +338,29 @@ class ProjectViewViewSet(BaseViewSet): view.save(update_fields=["is_locked"]) return Response(ViewSerializer(view).data, status=status.HTTP_200_OK) + def duplicate(self, request, slug, project_id, pk): + view = View.objects.get(workspace__slug=slug, project_id=project_id, pk=pk) + # Create a shallow copy of the original view object + new_view = view + + # Set the primary key of the new view to None to ensure it gets a new primary key + new_view.pk = None + + # Modify the name of the new view to indicate that it's a copy + new_view.name = f"{view.name} (Copy)" + new_view.save(owned_by=request.user) + return Response(ViewSerializer(new_view).data, status=status.HTTP_201_CREATED) + + def visibility(self, request, slug, project_id, pk): + view = ( + self.get_queryset() + .filter(pk=pk, project_id=project_id, workspace__slug=slug) + .first() + ) + view.access = request.data.get("access", view.access) + view.save(update_fields=["access"]) + return Response(ViewSerializer(view).data, status=status.HTTP_200_OK) + class WorkspaceViewIssuesViewSet(BaseViewSet): permission_classes = [ diff --git a/apiserver/plane/db/migrations/0059_alter_issueviewfavorite_project_and_more.py b/apiserver/plane/db/migrations/0061_auto_20240211_1721.py similarity index 97% rename from apiserver/plane/db/migrations/0059_alter_issueviewfavorite_project_and_more.py rename to apiserver/plane/db/migrations/0061_auto_20240211_1721.py index 4dcfd993e..c0a5b1f7c 100644 --- a/apiserver/plane/db/migrations/0059_alter_issueviewfavorite_project_and_more.py +++ b/apiserver/plane/db/migrations/0061_auto_20240211_1721.py @@ -12,7 +12,7 @@ def views_owned_by(apps, schema_editor): class Migration(migrations.Migration): dependencies = [ - ('db', '0058_alter_moduleissue_issue_and_more'), + ('db', '0060_cycle_progress_snapshot'), ] operations = [