From a8b2bcc8388630c60e242eedd83a51474ecca6a8 Mon Sep 17 00:00:00 2001 From: "M. Palanikannan" <73993394+Palanikannan1437@users.noreply.github.com> Date: Tue, 23 Jul 2024 20:50:51 +0530 Subject: [PATCH 1/2] feat: added created_at field to be writable and added those changes to (#5142) the activity --- apiserver/plane/api/serializers/issue.py | 1 - apiserver/plane/api/views/issue.py | 5 ++++ .../plane/bgtasks/issue_activites_task.py | 29 +++++++++++-------- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/apiserver/plane/api/serializers/issue.py b/apiserver/plane/api/serializers/issue.py index 45b7e7e06..e60b3a137 100644 --- a/apiserver/plane/api/serializers/issue.py +++ b/apiserver/plane/api/serializers/issue.py @@ -55,7 +55,6 @@ class IssueSerializer(BaseSerializer): "project", "created_by", "updated_by", - "created_at", "updated_at", ] exclude = [ diff --git a/apiserver/plane/api/views/issue.py b/apiserver/plane/api/views/issue.py index 365e1c470..e2bbd6a88 100644 --- a/apiserver/plane/api/views/issue.py +++ b/apiserver/plane/api/views/issue.py @@ -309,6 +309,11 @@ class IssueAPIEndpoint(BaseAPIView): ) serializer.save() + # Refetch the issue + issue = Issue.objects.filter(workspace__slug=slug, project_id=project_id, pk=serializer.data["id"]).first() + issue.created_at = request.data.get("created_at") + issue.save(update_fields=["created_at"]) + # Track the issue issue_activity.delay( diff --git a/apiserver/plane/bgtasks/issue_activites_task.py b/apiserver/plane/bgtasks/issue_activites_task.py index 2169f1e1d..0c2af6039 100644 --- a/apiserver/plane/bgtasks/issue_activites_task.py +++ b/apiserver/plane/bgtasks/issue_activites_task.py @@ -582,17 +582,18 @@ def create_issue_activity( issue_activities, epoch, ): - issue_activities.append( - IssueActivity( - issue_id=issue_id, - project_id=project_id, - workspace_id=workspace_id, - comment="created the issue", - verb="created", - actor_id=actor_id, - epoch=epoch, - ) + issue = Issue.objects.get(pk=issue_id) + issue_activity = IssueActivity.objects.create( + issue_id=issue_id, + project_id=project_id, + workspace_id=workspace_id, + comment="created the issue", + verb="created", + actor_id=actor_id, + epoch=epoch, ) + issue_activity.created_at = issue.created_at + issue_activity.save(update_fields=["created_at"]) requested_data = ( json.loads(requested_data) if requested_data is not None else None ) @@ -1717,12 +1718,16 @@ def issue_activity( event=( "issue_comment" if activity.field == "comment" - else "inbox_issue" if inbox else "issue" + else "inbox_issue" + if inbox + else "issue" ), event_id=( activity.issue_comment_id if activity.field == "comment" - else inbox if inbox else activity.issue_id + else inbox + if inbox + else activity.issue_id ), verb=activity.verb, field=( From d22b633d50078e6e89e43408f615d5a46314ce59 Mon Sep 17 00:00:00 2001 From: Akshita Goyal <36129505+gakshita@users.noreply.github.com> Date: Wed, 24 Jul 2024 12:02:01 +0530 Subject: [PATCH 2/2] [WEB-1966] fix: export button handled based on role (#5198) * fix: export button handled based on role * fix: formatting * fix: import optimization * fix: border fix for cycles page * fix: import optimization --- web/core/components/cycles/active-cycle/root.tsx | 2 +- web/core/components/exporter/export-modal.tsx | 11 ++++++++--- web/core/components/exporter/guide.tsx | 15 ++++++++++++--- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/web/core/components/cycles/active-cycle/root.tsx b/web/core/components/cycles/active-cycle/root.tsx index c654e011d..8f398b7b3 100644 --- a/web/core/components/cycles/active-cycle/root.tsx +++ b/web/core/components/cycles/active-cycle/root.tsx @@ -57,7 +57,7 @@ export const ActiveCycleRoot: React.FC = observer((props) = {!currentProjectActiveCycle ? ( ) : ( -
+
{currentProjectActiveCycleId && ( void; @@ -35,8 +35,13 @@ export const Exporter: React.FC = observer((props) => { const { workspaceSlug } = useParams(); // store hooks const { workspaceProjectIds, getProjectById } = useProject(); + const { projectsWithCreatePermissions } = useUser(); - const options = workspaceProjectIds?.map((projectId) => { + const wsProjectIdsWithCreatePermisisons = projectsWithCreatePermissions + ? intersection(workspaceProjectIds, Object.keys(projectsWithCreatePermissions)) + : []; + + const options = wsProjectIdsWithCreatePermisisons?.map((projectId) => { const projectDetails = getProjectById(projectId); return { diff --git a/web/core/components/exporter/guide.tsx b/web/core/components/exporter/guide.tsx index 1a576bd1b..7096555ec 100644 --- a/web/core/components/exporter/guide.tsx +++ b/web/core/components/exporter/guide.tsx @@ -17,7 +17,7 @@ import { ImportExportSettingsLoader } from "@/components/ui"; // constants import { EmptyStateType } from "@/constants/empty-state"; import { EXPORT_SERVICES_LIST } from "@/constants/fetch-keys"; -import { EXPORTERS_LIST } from "@/constants/workspace"; +import { EUserWorkspaceRoles, EXPORTERS_LIST } from "@/constants/workspace"; // hooks import { useProject, useUser } from "@/hooks/store"; import { useAppRouter } from "@/hooks/use-app-router"; @@ -37,7 +37,11 @@ const IntegrationGuide = observer(() => { const searchParams = useSearchParams(); const provider = searchParams.get("provider"); // store hooks - const { data: currentUser } = useUser(); + const { + data: currentUser, + canPerformAnyCreateAction, + membership: { currentWorkspaceRole }, + } = useUser(); const { workspaceProjectIds } = useProject(); const { data: exporterServices } = useSWR( @@ -52,6 +56,7 @@ const IntegrationGuide = observer(() => { }; const hasProjects = workspaceProjectIds && workspaceProjectIds.length > 0; + const isAdmin = currentWorkspaceRole === EUserWorkspaceRoles.ADMIN; return ( <> @@ -76,7 +81,11 @@ const IntegrationGuide = observer(() => {
-