diff --git a/greenmine/base/resolver/__init__.py b/greenmine/base/resolver/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/greenmine/base/resolver/api.py b/greenmine/base/resolver/api.py new file mode 100644 index 00000000..9fd7646e --- /dev/null +++ b/greenmine/base/resolver/api.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- + +from django.db.models.loading import get_model + +from rest_framework.response import Response +from rest_framework import viewsets +from rest_framework.permissions import IsAuthenticated + +from greenmine.base import exceptions as excp + + +class ResolverViewSet(viewsets.ViewSet): + permission_classes = (IsAuthenticated,) + + def list(self, request, **kwargs): + project_model = get_model("projects", "Project") + userstory_model = get_model("userstories", "UserStory") + task_model = get_model("tasks", "Task") + issue_model = get_model("issues", "Issue") + milestone_model = get_model("milestones", "Milestone") + + project_slug = request.QUERY_PARAMS.get('project', None) + us_ref = request.QUERY_PARAMS.get('us', None) + task_ref = request.QUERY_PARAMS.get('task', None) + issue_ref = request.QUERY_PARAMS.get('issue', None) + milestone_slug = request.QUERY_PARAMS.get('milestone', None) + + if project_slug is None: + return Response({}) + + try: + project = project_model.objects.get(slug=project_slug) + except project_model.DoesNotExist: + return Response({}) + + result = {"project": project.id} + + if us_ref is not None: + try: + us = project.user_stories.get(ref=us_ref) + result["us"] = us.id + except userstory_model.DoesNotExist: + pass + + if task_ref is not None: + try: + task = project.tasks.get(ref=task_ref) + result["task"] = task.id + except task_model.DoesNotExist: + pass + + if issue_ref is not None: + try: + issue = project.issues.get(ref=issue_ref) + result["issue"] = issue.id + except issue_model.DoesNotExist: + pass + + if milestone_slug is not None: + try: + milestone = project.milestones.get(slug=milestone_slug) + result["milestone"] = milestone.id + except milestone_model.DoesNotExist: + pass + + return Response(result) diff --git a/greenmine/projects/milestones/models.py b/greenmine/projects/milestones/models.py index 8d8e5be1..0daaecda 100644 --- a/greenmine/projects/milestones/models.py +++ b/greenmine/projects/milestones/models.py @@ -18,6 +18,7 @@ import datetime class Milestone(WatchedMixin, models.Model): name = models.CharField(max_length=200, db_index=True, null=False, blank=False, verbose_name=_("name")) + # TODO: Change the unique restriction to a unique together with the project id slug = models.SlugField(max_length=250, unique=True, null=False, blank=True, verbose_name=_("slug")) owner = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, diff --git a/greenmine/projects/tasks/serializers.py b/greenmine/projects/tasks/serializers.py index 802e0732..657b68e6 100644 --- a/greenmine/projects/tasks/serializers.py +++ b/greenmine/projects/tasks/serializers.py @@ -12,9 +12,16 @@ import reversion class TaskSerializer(serializers.ModelSerializer): tags = PickleField(required=False, default=[]) comment = serializers.SerializerMethodField("get_comment") + milestone_slug = serializers.SerializerMethodField("get_milestone_slug") class Meta: model = models.Task def get_comment(self, obj): return "" + + def get_milestone_slug(self, obj): + if obj.milestone: + return obj.milestone.slug + else: + return None diff --git a/greenmine/routers.py b/greenmine/routers.py index 1b160267..57d204b8 100644 --- a/greenmine/routers.py +++ b/greenmine/routers.py @@ -5,6 +5,7 @@ from greenmine.base.auth.api import AuthViewSet from greenmine.base.users.api import RolesViewSet, UsersViewSet from greenmine.base.searches.api import SearchViewSet from greenmine.base.domains.api import DomainViewSet, DomainMembersViewSet +from greenmine.base.resolver.api import ResolverViewSet from greenmine.projects.api import (ProjectViewSet, MembershipViewSet, InvitationViewSet, UserStoryStatusViewSet, PointsViewSet, TaskStatusViewSet, IssueStatusViewSet, IssueTypeViewSet, PriorityViewSet, @@ -25,6 +26,9 @@ router.register(r"users", UsersViewSet, base_name="users") router.register(r"roles", RolesViewSet, base_name="roles") router.register(r"auth", AuthViewSet, base_name="auth") +# greenmine.base.resolver +router.register(r"resolver", ResolverViewSet, base_name="resolver") + # greenmine.base.searches router.register(r"search", SearchViewSet, base_name="search")