mirror of
https://github.com/makeplane/plane
synced 2024-06-14 14:31:34 +00:00
Merge branch 'refactor/mobx-store' of https://github.com/makeplane/plane into refactor/mobx-store
This commit is contained in:
commit
6567f62753
@ -2,7 +2,7 @@
|
|||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
# Module imports
|
# Module imports
|
||||||
from .base import BaseSerializer
|
from .base import BaseSerializer, DynamicBaseSerializer
|
||||||
from .user import UserLiteSerializer
|
from .user import UserLiteSerializer
|
||||||
from .project import ProjectLiteSerializer
|
from .project import ProjectLiteSerializer
|
||||||
from .workspace import WorkspaceLiteSerializer
|
from .workspace import WorkspaceLiteSerializer
|
||||||
@ -159,7 +159,7 @@ class ModuleLinkSerializer(BaseSerializer):
|
|||||||
return ModuleLink.objects.create(**validated_data)
|
return ModuleLink.objects.create(**validated_data)
|
||||||
|
|
||||||
|
|
||||||
class ModuleSerializer(BaseSerializer):
|
class ModuleSerializer(DynamicBaseSerializer):
|
||||||
project_detail = ProjectLiteSerializer(read_only=True, source="project")
|
project_detail = ProjectLiteSerializer(read_only=True, source="project")
|
||||||
lead_detail = UserLiteSerializer(read_only=True, source="lead")
|
lead_detail = UserLiteSerializer(read_only=True, source="lead")
|
||||||
members_detail = UserLiteSerializer(read_only=True, many=True, source="members")
|
members_detail = UserLiteSerializer(read_only=True, many=True, source="members")
|
||||||
|
@ -176,6 +176,7 @@ class CycleViewSet(WebhookMixin, BaseViewSet):
|
|||||||
def list(self, request, slug, project_id):
|
def list(self, request, slug, project_id):
|
||||||
queryset = self.get_queryset()
|
queryset = self.get_queryset()
|
||||||
cycle_view = request.GET.get("cycle_view", "all")
|
cycle_view = request.GET.get("cycle_view", "all")
|
||||||
|
fields = [field for field in request.GET.get("fields", "").split(",") if field]
|
||||||
|
|
||||||
queryset = queryset.order_by("-is_favorite","-created_at")
|
queryset = queryset.order_by("-is_favorite","-created_at")
|
||||||
|
|
||||||
@ -281,44 +282,9 @@ class CycleViewSet(WebhookMixin, BaseViewSet):
|
|||||||
|
|
||||||
return Response(data, status=status.HTTP_200_OK)
|
return Response(data, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
# Upcoming Cycles
|
cycles = CycleSerializer(queryset, many=True, fields=fields if fields else None).data
|
||||||
if cycle_view == "upcoming":
|
cycle_dict = {str(cycle["id"]): cycle for cycle in cycles}
|
||||||
queryset = queryset.filter(start_date__gt=timezone.now())
|
return Response(cycle_dict, status=status.HTTP_200_OK)
|
||||||
return Response(
|
|
||||||
CycleSerializer(queryset, many=True).data, status=status.HTTP_200_OK
|
|
||||||
)
|
|
||||||
|
|
||||||
# Completed Cycles
|
|
||||||
if cycle_view == "completed":
|
|
||||||
queryset = queryset.filter(end_date__lt=timezone.now())
|
|
||||||
return Response(
|
|
||||||
CycleSerializer(queryset, many=True).data, status=status.HTTP_200_OK
|
|
||||||
)
|
|
||||||
|
|
||||||
# Draft Cycles
|
|
||||||
if cycle_view == "draft":
|
|
||||||
queryset = queryset.filter(
|
|
||||||
end_date=None,
|
|
||||||
start_date=None,
|
|
||||||
)
|
|
||||||
|
|
||||||
return Response(
|
|
||||||
CycleSerializer(queryset, many=True).data, status=status.HTTP_200_OK
|
|
||||||
)
|
|
||||||
|
|
||||||
# Incomplete Cycles
|
|
||||||
if cycle_view == "incomplete":
|
|
||||||
queryset = queryset.filter(
|
|
||||||
Q(end_date__gte=timezone.now().date()) | Q(end_date__isnull=True),
|
|
||||||
)
|
|
||||||
return Response(
|
|
||||||
CycleSerializer(queryset, many=True).data, status=status.HTTP_200_OK
|
|
||||||
)
|
|
||||||
|
|
||||||
# If no matching view is found return all cycles
|
|
||||||
return Response(
|
|
||||||
CycleSerializer(queryset, many=True).data, status=status.HTTP_200_OK
|
|
||||||
)
|
|
||||||
|
|
||||||
def create(self, request, slug, project_id):
|
def create(self, request, slug, project_id):
|
||||||
if (
|
if (
|
||||||
|
@ -153,6 +153,13 @@ class ModuleViewSet(WebhookMixin, BaseViewSet):
|
|||||||
return Response(serializer.data, status=status.HTTP_201_CREATED)
|
return Response(serializer.data, status=status.HTTP_201_CREATED)
|
||||||
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
def list(self, request, slug, project_id):
|
||||||
|
queryset = self.get_queryset()
|
||||||
|
fields = [field for field in request.GET.get("fields", "").split(",") if field]
|
||||||
|
modules = ModuleSerializer(queryset, many=True, fields=fields if fields else None).data
|
||||||
|
modules_dict = {str(module["id"]): module for module in modules}
|
||||||
|
return Response(modules_dict, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
def retrieve(self, request, slug, project_id, pk):
|
def retrieve(self, request, slug, project_id, pk):
|
||||||
queryset = self.get_queryset().get(pk=pk)
|
queryset = self.get_queryset().get(pk=pk)
|
||||||
|
|
||||||
|
@ -157,9 +157,10 @@ class PageViewSet(BaseViewSet):
|
|||||||
|
|
||||||
def list(self, request, slug, project_id):
|
def list(self, request, slug, project_id):
|
||||||
queryset = self.get_queryset().filter(archived_at__isnull=True)
|
queryset = self.get_queryset().filter(archived_at__isnull=True)
|
||||||
return Response(
|
fields = [field for field in request.GET.get("fields", "").split(",") if field]
|
||||||
PageSerializer(queryset, many=True).data, status=status.HTTP_200_OK
|
pages = PageSerializer(queryset, many=True, fields=fields if fields else None).data
|
||||||
)
|
pages_dict = {str(page["id"]): page for page in pages}
|
||||||
|
return Response(pages_dict, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
def archive(self, request, slug, project_id, page_id):
|
def archive(self, request, slug, project_id, page_id):
|
||||||
page = Page.objects.get(pk=page_id, workspace__slug=slug, project_id=project_id)
|
page = Page.objects.get(pk=page_id, workspace__slug=slug, project_id=project_id)
|
||||||
@ -205,14 +206,16 @@ class PageViewSet(BaseViewSet):
|
|||||||
return Response(status=status.HTTP_204_NO_CONTENT)
|
return Response(status=status.HTTP_204_NO_CONTENT)
|
||||||
|
|
||||||
def archive_list(self, request, slug, project_id):
|
def archive_list(self, request, slug, project_id):
|
||||||
|
fields = [field for field in request.GET.get("fields", "").split(",") if field]
|
||||||
pages = Page.objects.filter(
|
pages = Page.objects.filter(
|
||||||
project_id=project_id,
|
project_id=project_id,
|
||||||
workspace__slug=slug,
|
workspace__slug=slug,
|
||||||
).filter(archived_at__isnull=False)
|
).filter(archived_at__isnull=False)
|
||||||
|
|
||||||
return Response(
|
pages = PageSerializer(pages, many=True, fields=fields if fields else None).data
|
||||||
PageSerializer(pages, many=True).data, status=status.HTTP_200_OK
|
pages_dict = {str(page["id"]): page for page in pages}
|
||||||
)
|
return Response(pages_dict, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
|
||||||
def destroy(self, request, slug, project_id, pk):
|
def destroy(self, request, slug, project_id, pk):
|
||||||
page = Page.objects.get(pk=pk, workspace__slug=slug, project_id=project_id)
|
page = Page.objects.get(pk=pk, workspace__slug=slug, project_id=project_id)
|
||||||
|
@ -180,12 +180,10 @@ class ProjectViewSet(WebhookMixin, BaseViewSet):
|
|||||||
projects, many=True
|
projects, many=True
|
||||||
).data,
|
).data,
|
||||||
)
|
)
|
||||||
|
projects = ProjectListSerializer(projects, many=True, fields=fields if fields else None).data
|
||||||
|
project_dict = {str(project["id"]): project for project in projects}
|
||||||
|
return Response(project_dict, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
return Response(
|
|
||||||
ProjectListSerializer(
|
|
||||||
projects, many=True, fields=fields if fields else None
|
|
||||||
).data
|
|
||||||
)
|
|
||||||
|
|
||||||
def create(self, request, slug):
|
def create(self, request, slug):
|
||||||
try:
|
try:
|
||||||
|
@ -75,6 +75,7 @@ from plane.bgtasks.workspace_invitation_task import workspace_invitation
|
|||||||
from plane.utils.issue_filters import issue_filters
|
from plane.utils.issue_filters import issue_filters
|
||||||
from plane.bgtasks.event_tracking_task import workspace_invite_event
|
from plane.bgtasks.event_tracking_task import workspace_invite_event
|
||||||
|
|
||||||
|
|
||||||
class WorkSpaceViewSet(BaseViewSet):
|
class WorkSpaceViewSet(BaseViewSet):
|
||||||
model = Workspace
|
model = Workspace
|
||||||
serializer_class = WorkSpaceSerializer
|
serializer_class = WorkSpaceSerializer
|
||||||
@ -172,6 +173,7 @@ class UserWorkSpacesEndpoint(BaseAPIView):
|
|||||||
]
|
]
|
||||||
|
|
||||||
def get(self, request):
|
def get(self, request):
|
||||||
|
fields = [field for field in request.GET.get("fields", "").split(",") if field]
|
||||||
member_count = (
|
member_count = (
|
||||||
WorkspaceMember.objects.filter(
|
WorkspaceMember.objects.filter(
|
||||||
workspace=OuterRef("id"),
|
workspace=OuterRef("id"),
|
||||||
@ -207,9 +209,13 @@ class UserWorkSpacesEndpoint(BaseAPIView):
|
|||||||
)
|
)
|
||||||
.distinct()
|
.distinct()
|
||||||
)
|
)
|
||||||
|
workspaces = WorkSpaceSerializer(
|
||||||
serializer = WorkSpaceSerializer(self.filter_queryset(workspace), many=True)
|
self.filter_queryset(workspace),
|
||||||
return Response(serializer.data, status=status.HTTP_200_OK)
|
fields=fields if fields else None,
|
||||||
|
many=True,
|
||||||
|
).data
|
||||||
|
workspace_dict = {str(workspaces["id"]): workspaces for workspace in workspaces}
|
||||||
|
return Response(workspace_dict, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
|
||||||
class WorkSpaceAvailabilityCheckEndpoint(BaseAPIView):
|
class WorkSpaceAvailabilityCheckEndpoint(BaseAPIView):
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import { action, computed, makeObservable, observable, runInAction } from "mobx";
|
import { action, computed, makeObservable, observable, runInAction } from "mobx";
|
||||||
import keyBy from "lodash/keyBy";
|
import keyBy from "lodash/keyBy";
|
||||||
|
import set from "lodash/set";
|
||||||
import isToday from "date-fns/isToday";
|
import isToday from "date-fns/isToday";
|
||||||
import isThisWeek from "date-fns/isThisWeek";
|
import isThisWeek from "date-fns/isThisWeek";
|
||||||
import isYesterday from "date-fns/isYesterday";
|
import isYesterday from "date-fns/isYesterday";
|
||||||
@ -32,8 +33,8 @@ export class PageStore {
|
|||||||
|
|
||||||
constructor(_rootStore: RootStore) {
|
constructor(_rootStore: RootStore) {
|
||||||
makeObservable(this, {
|
makeObservable(this, {
|
||||||
pages: observable.ref,
|
pages: observable,
|
||||||
archivedPages: observable.ref,
|
archivedPages: observable,
|
||||||
// computed
|
// computed
|
||||||
projectPages: computed,
|
projectPages: computed,
|
||||||
favoriteProjectPages: computed,
|
favoriteProjectPages: computed,
|
||||||
@ -193,4 +194,41 @@ export class PageStore {
|
|||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new page using the api and updated the local state in store
|
||||||
|
* @param workspaceSlug
|
||||||
|
* @param projectId
|
||||||
|
* @param data
|
||||||
|
*/
|
||||||
|
createPage = async (workspaceSlug: string, projectId: string, data: Partial<IPage>) => {
|
||||||
|
const response = await this.pageService.createPage(workspaceSlug, projectId, data);
|
||||||
|
runInAction(() => {
|
||||||
|
this.pages = set(this.pages, [response.id], response);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* updates the page using the api and updates the local state in store
|
||||||
|
* @param workspaceSlug
|
||||||
|
* @param projectId
|
||||||
|
* @param pageId
|
||||||
|
* @param data
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
updatePage = async (workspaceSlug: string, projectId: string, pageId: string, data: Partial<IPage>) => {
|
||||||
|
const originalPage = this.pages[pageId];
|
||||||
|
try {
|
||||||
|
runInAction(() => {
|
||||||
|
this.pages[pageId] = { ...originalPage, ...data };
|
||||||
|
});
|
||||||
|
const response = await this.pageService.patchPage(workspaceSlug, projectId, pageId, data);
|
||||||
|
return response;
|
||||||
|
} catch (error) {
|
||||||
|
runInAction(() => {
|
||||||
|
this.pages[pageId] = originalPage;
|
||||||
|
});
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user