From 520938ab5c59b6736327be93dfb099026eff82d5 Mon Sep 17 00:00:00 2001 From: Nikhil <118773738+pablohashescobar@users.noreply.github.com> Date: Wed, 7 Aug 2024 19:35:00 +0530 Subject: [PATCH 1/4] chore: add rate limiting in magic generate endpoint (#5322) --- apiserver/plane/authentication/views/app/magic.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apiserver/plane/authentication/views/app/magic.py b/apiserver/plane/authentication/views/app/magic.py index 12f8a0c0b9..980eb4e7cc 100644 --- a/apiserver/plane/authentication/views/app/magic.py +++ b/apiserver/plane/authentication/views/app/magic.py @@ -29,6 +29,7 @@ from plane.authentication.adapter.error import ( AuthenticationException, AUTHENTICATION_ERROR_CODES, ) +from plane.authentication.rate_limit import AuthenticationThrottle class MagicGenerateEndpoint(APIView): @@ -37,6 +38,10 @@ class MagicGenerateEndpoint(APIView): AllowAny, ] + throttle_classes = [ + AuthenticationThrottle, + ] + def post(self, request): # Check if instance is configured instance = Instance.objects.first() From 3dd70452522eef199f9b07deb13e8fa990627dd7 Mon Sep 17 00:00:00 2001 From: Henit Chobisa Date: Wed, 7 Aug 2024 19:53:02 +0530 Subject: [PATCH 2/4] feat: added silo base url for config (#773) --- .env.example | 3 ++- apiserver/.env.example | 3 ++- apiserver/plane/license/api/views/instance.py | 6 ++++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.env.example b/.env.example index 0649839a45..9965fe79ec 100644 --- a/.env.example +++ b/.env.example @@ -19,6 +19,7 @@ AWS_S3_BUCKET_NAME="uploads" FILE_SIZE_LIMIT=5242880 # GPT settings +SILO_BASE_URL= OPENAI_API_BASE="https://api.openai.com/v1" # deprecated OPENAI_API_KEY="sk-" # deprecated GPT_ENGINE="gpt-3.5-turbo" # deprecated @@ -32,4 +33,4 @@ USE_MINIO=1 # Nginx Configuration NGINX_PORT=80 -MONGO_DB_URL="mongodb://plane-mongodb:27017/" \ No newline at end of file +MONGO_DB_URL="mongodb://plane-mongodb:27017/" diff --git a/apiserver/.env.example b/apiserver/.env.example index 7af2f00569..045d72bd73 100644 --- a/apiserver/.env.example +++ b/apiserver/.env.example @@ -50,6 +50,7 @@ GUNICORN_WORKERS=2 ADMIN_BASE_URL= SPACE_BASE_URL= APP_BASE_URL= +SILO_BASE_URL= # Hard delete files after days -HARD_DELETE_AFTER_DAYS= \ No newline at end of file +HARD_DELETE_AFTER_DAYS= diff --git a/apiserver/plane/license/api/views/instance.py b/apiserver/plane/license/api/views/instance.py index 34cdcdac93..1581d34bfa 100644 --- a/apiserver/plane/license/api/views/instance.py +++ b/apiserver/plane/license/api/views/instance.py @@ -72,6 +72,7 @@ class InstanceEndpoint(BaseAPIView): OPENAI_API_KEY, IS_INTERCOM_ENABLED, INTERCOM_APP_ID, + SILO_BASE_URL, ) = get_configuration_value( [ { @@ -147,6 +148,10 @@ class InstanceEndpoint(BaseAPIView): "key": "INTERCOM_APP_ID", "default": os.environ.get("INTERCOM_APP_ID", ""), }, + { + "key": "SILO_BASE_URL", + "default": os.environ.get("SILO_BASE_URL", ""), + }, ] ) @@ -199,6 +204,7 @@ class InstanceEndpoint(BaseAPIView): data["feature_flag_server_base_url"] = ( settings.FEATURE_FLAG_SERVER_BASE_URL ) + data["silo_base_url"] = SILO_BASE_URL instance_data = serializer.data instance_data["workspaces_exist"] = Workspace.objects.count() >= 1 From 56fcd127831dbaf7882f1978d62ea62d6cbb6a30 Mon Sep 17 00:00:00 2001 From: Bavisetti Narayan <72156168+NarayanBavisetti@users.noreply.github.com> Date: Wed, 7 Aug 2024 20:00:21 +0530 Subject: [PATCH 3/4] [WEB-2181] chore: deploy board deletion (#759) * chore: deploy board deletion * chore: page publish deletion * chore: added project deletion validation --------- Co-authored-by: sriram veeraghanta --- apiserver/plane/app/views/page/base.py | 6 ++++++ apiserver/plane/app/views/project/base.py | 10 ++++++++++ apiserver/plane/app/views/view/base.py | 7 +++++++ apiserver/plane/ee/views/app/page/workspace.py | 6 ++++++ 4 files changed, 29 insertions(+) diff --git a/apiserver/plane/app/views/page/base.py b/apiserver/plane/app/views/page/base.py index 7dd3349181..4eccd2a1a0 100644 --- a/apiserver/plane/app/views/page/base.py +++ b/apiserver/plane/app/views/page/base.py @@ -374,6 +374,12 @@ class PageViewSet(BaseViewSet): entity_identifier=pk, entity_type="page", ).delete() + # Delete the deploy board + DeployBoard.objects.get( + entity_name="page", + entity_identifier=pk, + workspace__slug=slug, + ).delete() return Response(status=status.HTTP_204_NO_CONTENT) diff --git a/apiserver/plane/app/views/project/base.py b/apiserver/plane/app/views/project/base.py index 22181dacff..9377dffe95 100644 --- a/apiserver/plane/app/views/project/base.py +++ b/apiserver/plane/app/views/project/base.py @@ -456,6 +456,16 @@ class ProjectViewSet(BaseViewSet): status=status.HTTP_410_GONE, ) + def destroy(self, request, slug, pk): + project = Project.objects.get(pk=pk) + project.delete() + DeployBoard.objects.get( + entity_name="project", + entity_identifier=pk, + workspace__slug=slug, + ).delete() + return Response(status=status.HTTP_204_NO_CONTENT) + class ProjectArchiveUnarchiveEndpoint(BaseAPIView): diff --git a/apiserver/plane/app/views/view/base.py b/apiserver/plane/app/views/view/base.py index 3e829f6e89..ba337017d0 100644 --- a/apiserver/plane/app/views/view/base.py +++ b/apiserver/plane/app/views/view/base.py @@ -460,6 +460,13 @@ class IssueViewViewSet(BaseViewSet): entity_identifier=pk, entity_type="view", ).delete() + # Delete the view from the deploy board + DeployBoard.objects.filter( + entity_name="view", + entity_identifier=pk, + project_id=project_id, + workspace__slug=slug, + ).delete() else: return Response( {"error": "Only admin or owner can delete the view"}, diff --git a/apiserver/plane/ee/views/app/page/workspace.py b/apiserver/plane/ee/views/app/page/workspace.py index dff30869c2..29a9380968 100644 --- a/apiserver/plane/ee/views/app/page/workspace.py +++ b/apiserver/plane/ee/views/app/page/workspace.py @@ -336,6 +336,12 @@ class WorkspacePageViewSet(BaseViewSet): ) page.delete() + # Delete the deploy board + DeployBoard.objects.get( + entity_name="page", + entity_identifier=pk, + workspace__slug=slug, + ).delete() return Response(status=status.HTTP_204_NO_CONTENT) From a9e6501f172197aafaec3a93852f4877d92f6002 Mon Sep 17 00:00:00 2001 From: guru_sainath Date: Thu, 8 Aug 2024 13:43:47 +0530 Subject: [PATCH 4/4] [WEB-2205] chore: worklog edit is disabled in issue property in peek overview (#781) * chore: worklog edit is disabled in issue property in peek overview * chore: updated UI --- .../issues/worklog/property/button.tsx | 15 +++----- .../issues/worklog/property/root.tsx | 36 ++++--------------- 2 files changed, 12 insertions(+), 39 deletions(-) diff --git a/web/ee/components/issues/worklog/property/button.tsx b/web/ee/components/issues/worklog/property/button.tsx index fda8c18593..ce8db14149 100644 --- a/web/ee/components/issues/worklog/property/button.tsx +++ b/web/ee/components/issues/worklog/property/button.tsx @@ -5,24 +5,19 @@ import { Loader, Plus } from "lucide-react"; // helpers import { cn } from "@/helpers/common.helper"; -type TIssueWorklogPropertyButton = { content?: string; placeHolder?: string; disabled?: boolean; isLoading?: boolean }; +type TIssueWorklogPropertyButton = { content?: string; isLoading?: boolean }; export const IssueWorklogPropertyButton: FC = (props) => { - const { content, placeHolder, disabled, isLoading } = props; + const { content, isLoading } = props; return ( -
+
- {(content || "").length > 0 ? content : placeHolder ? placeHolder : "Add time tracking"} + {(content || "").length > 0 ? content : "0h 0m"}
{isLoading ? (
diff --git a/web/ee/components/issues/worklog/property/root.tsx b/web/ee/components/issues/worklog/property/root.tsx index e242fde0ad..5b3c5ba05d 100644 --- a/web/ee/components/issues/worklog/property/root.tsx +++ b/web/ee/components/issues/worklog/property/root.tsx @@ -1,17 +1,15 @@ "use client"; -import { FC, useRef } from "react"; +import { FC } from "react"; import { observer } from "mobx-react"; import useSWR from "swr"; import { Timer } from "lucide-react"; -import { Popover } from "@plane/ui"; // helpers -import { cn } from "@/helpers/common.helper"; import { convertMinutesToHoursMinutesString } from "@/helpers/date-time.helper"; // hooks import { useIssueDetail } from "@/hooks/store"; // plane web components -import { IssueWorklogPropertyButton, WorklogCreate } from "@/plane-web/components/issues/worklog"; +import { IssueWorklogPropertyButton } from "@/plane-web/components/issues/worklog"; // plane web hooks import { useWorkspaceWorklogs } from "@/plane-web/hooks/store"; @@ -23,13 +21,11 @@ type TIssueWorklogProperty = { }; export const IssueWorklogProperty: FC = observer((props) => { - const { workspaceSlug, projectId, issueId, disabled: propertyDisabled = false } = props; + const { workspaceSlug, projectId, issueId } = props; // hooks const { issueWorklogTotalMinutes, isWorklogsEnabledByProjectId, getIssueWorklogTotalMinutes } = useWorkspaceWorklogs(); const { peekIssue } = useIssueDetail(); - // ref - const popoverButtonRef = useRef(null); // fetching current issue total worklog count const { isLoading } = useSWR( @@ -44,7 +40,6 @@ export const IssueWorklogProperty: FC = observer((props) // derived values const isPeekOverview = peekIssue ? true : false; const totalMinutes = issueId && issueWorklogTotalMinutes[issueId] ? issueWorklogTotalMinutes[issueId] : 0; - const disabled = propertyDisabled || isLoading; if (!isWorklogsEnabledByProjectId(projectId)) return <>; return ( @@ -56,27 +51,10 @@ export const IssueWorklogProperty: FC = observer((props) Tracked time
- - } - popperPosition="bottom-start" - panelClassName="w-72 my-1 rounded border-[0.5px] border-custom-border-300 bg-custom-background-100 p-3 text-xs shadow-custom-shadow-rg focus:outline-none" - > - popoverButtonRef.current?.click()} - /> - +
);