diff --git a/taiga/projects/api.py b/taiga/projects/api.py index 5f5532f8..d92806d7 100644 --- a/taiga/projects/api.py +++ b/taiga/projects/api.py @@ -60,6 +60,12 @@ class ProjectViewSet(ModelCrudViewSet): qs = models.Project.objects.all() return attach_votescount_to_queryset(qs, as_field="stars_count") + @list_route(methods=["GET"]) + def by_slug(self, request): + slug = request.QUERY_PARAMS.get("slug", None) + project = get_object_or_404(models.Project, slug=slug) + return self.retrieve(request, pk=project.pk) + @detail_route(methods=["GET", "PATCH"]) def modules(self, request, pk=None): project = self.get_object() diff --git a/taiga/projects/issues/api.py b/taiga/projects/issues/api.py index 94dff493..cdae587f 100644 --- a/taiga/projects/issues/api.py +++ b/taiga/projects/issues/api.py @@ -153,6 +153,13 @@ class IssueViewSet(OCCResourceMixin, HistoryResourceMixin, WatchedResourceMixin, if obj.type and obj.type.project != obj.project: raise exc.PermissionDenied(_("You don't have permissions to set this type to this issue.")) + @list_route(methods=["GET"]) + def by_ref(self, request): + ref = request.QUERY_PARAMS.get("ref", None) + project_id = request.QUERY_PARAMS.get("project", None) + issue = get_object_or_404(models.Issue, ref=ref, project_id=project_id) + return self.retrieve(request, pk=issue.pk) + @list_route(methods=["POST"]) def bulk_create(self, request, **kwargs): serializer = serializers.IssuesBulkSerializer(data=request.DATA) diff --git a/taiga/projects/permissions.py b/taiga/projects/permissions.py index 126ac9c0..aaea97f4 100644 --- a/taiga/projects/permissions.py +++ b/taiga/projects/permissions.py @@ -40,6 +40,7 @@ class CanLeaveProject(PermissionComponent): class ProjectPermission(TaigaResourcePermission): retrieve_perms = HasProjectPerm('view_project') + by_slug_perms = HasProjectPerm('view_project') create_perms = IsAuthenticated() update_perms = IsProjectOwner() partial_update_perms = IsProjectOwner() diff --git a/taiga/projects/serializers.py b/taiga/projects/serializers.py index 5dbbba4c..71068bff 100644 --- a/taiga/projects/serializers.py +++ b/taiga/projects/serializers.py @@ -236,6 +236,7 @@ class ProjectSerializer(ModelSerializer): my_permissions = serializers.SerializerMethodField("get_my_permissions") i_am_owner = serializers.SerializerMethodField("get_i_am_owner") tags_colors = TagsColorsField(required=False) + users = serializers.SerializerMethodField("get_users") class Meta: model = models.Project @@ -256,6 +257,9 @@ class ProjectSerializer(ModelSerializer): return is_project_owner(self.context["request"].user, obj) return False + def get_users(self, obj): + return UserSerializer(obj.members.all(), many=True).data + def validate_total_milestones(self, attrs, source): """ Check that total_milestones is not null, it's an optional parameter but diff --git a/taiga/projects/tasks/api.py b/taiga/projects/tasks/api.py index ed7cd208..a4e6361d 100644 --- a/taiga/projects/tasks/api.py +++ b/taiga/projects/tasks/api.py @@ -64,6 +64,13 @@ class TaskViewSet(OCCResourceMixin, HistoryResourceMixin, WatchedResourceMixin, if obj.milestone and obj.user_story and obj.milestone != obj.user_story.milestone: raise exc.WrongArguments(_("You don't have permissions for add/modify this task.")) + @list_route(methods=["GET"]) + def by_ref(self, request): + ref = request.QUERY_PARAMS.get("ref", None) + project_id = request.QUERY_PARAMS.get("project", None) + task = get_object_or_404(models.Task, ref=ref, project_id=project_id) + return self.retrieve(request, pk=task.pk) + @list_route(methods=["POST"]) def bulk_create(self, request, **kwargs): serializer = serializers.TasksBulkSerializer(data=request.DATA) diff --git a/taiga/projects/userstories/api.py b/taiga/projects/userstories/api.py index 166ddd26..796159e6 100644 --- a/taiga/projects/userstories/api.py +++ b/taiga/projects/userstories/api.py @@ -95,6 +95,13 @@ class UserStoryViewSet(OCCResourceMixin, HistoryResourceMixin, WatchedResourceMi super().post_save(obj, created) + @list_route(methods=["GET"]) + def by_ref(self, request): + ref = request.QUERY_PARAMS.get("ref", None) + project_id = request.QUERY_PARAMS.get("project", None) + userstory = get_object_or_404(models.UserStory, ref=ref, project_id=project_id) + return self.retrieve(request, pk=userstory.pk) + @list_route(methods=["POST"]) def bulk_create(self, request, **kwargs): serializer = serializers.UserStoriesBulkSerializer(data=request.DATA) diff --git a/taiga/projects/wiki/api.py b/taiga/projects/wiki/api.py index 9970502d..8ce56eac 100644 --- a/taiga/projects/wiki/api.py +++ b/taiga/projects/wiki/api.py @@ -45,6 +45,13 @@ class WikiViewSet(OCCResourceMixin, HistoryResourceMixin, WatchedResourceMixin, filter_backends = (filters.CanViewWikiPagesFilterBackend,) filter_fields = ("project", "slug") + @list_route(methods=["GET"]) + def by_slug(self, request): + slug = request.QUERY_PARAMS.get("slug", None) + project_id = request.QUERY_PARAMS.get("project", None) + wiki_page = get_object_or_404(models.WikiPage, slug=slug, project_id=project_id) + return self.retrieve(request, pk=wiki_page.pk) + @list_route(methods=["POST"]) def render(self, request, **kwargs): content = request.DATA.get("content", None)