From 363c9432f52f484caa52e7fae0cab3c2f92aeb13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Tue, 14 Mar 2017 12:57:01 +0100 Subject: [PATCH] Allow to resolve wikipages with references endpoint --- taiga/projects/references/api.py | 48 +++++++++++-------- taiga/projects/references/validators.py | 4 +- .../integration/test_references_sequences.py | 41 ++++++++++++++++ 3 files changed, 73 insertions(+), 20 deletions(-) diff --git a/taiga/projects/references/api.py b/taiga/projects/references/api.py index 10a08538..67cf9f1d 100644 --- a/taiga/projects/references/api.py +++ b/taiga/projects/references/api.py @@ -66,24 +66,34 @@ class ResolverViewSet(viewsets.ViewSet): if data["ref"]: ref_found = False # No need to continue once one ref is found - if ref_found is False and user_has_perm(request.user, "view_epics", project): - epic = project.epics.filter(ref=data["ref"]).first() - if epic: - result["epic"] = epic.pk - ref_found = True - if user_has_perm(request.user, "view_us", project): - us = project.user_stories.filter(ref=data["ref"]).first() - if us: - result["us"] = us.pk - ref_found = True - if ref_found is False and user_has_perm(request.user, "view_tasks", project): - task = project.tasks.filter(ref=data["ref"]).first() - if task: - result["task"] = task.pk - ref_found = True - if ref_found is False and user_has_perm(request.user, "view_issues", project): - issue = project.issues.filter(ref=data["ref"]).first() - if issue: - result["issue"] = issue.pk + try: + value = int(data["ref"]) + + if user_has_perm(request.user, "view_epics", project): + epic = project.epics.filter(ref=value).first() + if epic: + result["epic"] = epic.pk + ref_found = True + if ref_found is False and user_has_perm(request.user, "view_us", project): + us = project.user_stories.filter(ref=value).first() + if us: + result["us"] = us.pk + ref_found = True + if ref_found is False and user_has_perm(request.user, "view_tasks", project): + task = project.tasks.filter(ref=value).first() + if task: + result["task"] = task.pk + ref_found = True + if ref_found is False and user_has_perm(request.user, "view_issues", project): + issue = project.issues.filter(ref=value).first() + if issue: + result["issue"] = issue.pk + except: + value = data["ref"] + + if user_has_perm(request.user, "view_wiki_pages", project): + wiki_page = project.wiki_pages.filter(slug=value).first() + if wiki_page: + result["wikipage"] = wiki_page.pk return response.Ok(result) diff --git a/taiga/projects/references/validators.py b/taiga/projects/references/validators.py index ad51e42c..3b2baba1 100644 --- a/taiga/projects/references/validators.py +++ b/taiga/projects/references/validators.py @@ -28,8 +28,8 @@ class ResolverValidator(validators.Validator): us = serializers.IntegerField(required=False) task = serializers.IntegerField(required=False) issue = serializers.IntegerField(required=False) - ref = serializers.IntegerField(required=False) wikipage = serializers.CharField(max_length=512, required=False) + ref = serializers.CharField(max_length=512, required=False) def validate(self, attrs): if "ref" in attrs: @@ -41,5 +41,7 @@ class ResolverValidator(validators.Validator): raise ValidationError("'task' param is incompatible with 'ref' in the same request") if "issue" in attrs: raise ValidationError("'issue' param is incompatible with 'ref' in the same request") + if "wikipage" in attrs: + raise ValidationError("'wikipage' param is incompatible with 'ref' in the same request") return attrs diff --git a/tests/integration/test_references_sequences.py b/tests/integration/test_references_sequences.py index 7bb035de..24cf639b 100644 --- a/tests/integration/test_references_sequences.py +++ b/tests/integration/test_references_sequences.py @@ -191,3 +191,44 @@ def test_params_validation_in_api_request(client, refmodels): response = client.json.get("{}?project={}&ref={}&milestone={}".format(url, project.slug, us.ref, milestone.slug)) assert response.status_code == 200 + + +@pytest.mark.django_db +def test_by_ref_calls_in_api_request(client, refmodels): + refmodels.Reference.objects.all().delete() + + user = factories.UserFactory.create() + project = factories.ProjectFactory.create(owner=user) + seqname1 = refmodels.make_sequence_name(project) + role = factories.RoleFactory.create(project=project) + factories.MembershipFactory.create(project=project, user=user, role=role, is_admin=True) + + epic = factories.EpicFactory.create(project=project) + milestone = factories.MilestoneFactory.create(project=project) + us = factories.UserStoryFactory.create(project=project) + task = factories.TaskFactory.create(project=project) + issue = factories.IssueFactory.create(project=project) + wiki_page = factories.WikiPageFactory.create(project=project) + + client.login(user) + + url = reverse("resolver-list") + response = client.json.get("{}?project={}&ref={}".format(url, project.slug, epic.ref)) + assert response.status_code == 200 + assert response.data["epic"] == epic.id + + response = client.json.get("{}?project={}&ref={}".format(url, project.slug, us.ref)) + assert response.status_code == 200 + assert response.data["us"] == us.id + + response = client.json.get("{}?project={}&ref={}".format(url, project.slug, task.ref)) + assert response.status_code == 200 + assert response.data["task"] == task.id + + response = client.json.get("{}?project={}&ref={}".format(url, project.slug, issue.ref)) + assert response.status_code == 200 + assert response.data["issue"] == issue.id + + response = client.json.get("{}?project={}&ref={}".format(url, project.slug, wiki_page.slug)) + assert response.status_code == 200 + assert response.data["wikipage"] == wiki_page.id