taiga-back/greenmine/base/api.py

164 lines
6.1 KiB
Python

# -*- coding: utf-8 -*-
from django.contrib.auth import logout, login, authenticate
from django.contrib.auth.views import login as auth_login, logout as auth_logout
from django import http
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
from rest_framework.reverse import reverse
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from rest_framework import status
from rest_framework import generics
from haystack.query import SearchQuerySet
from greenmine.base.serializers import LoginSerializer, UserLogged, UserSerializer, RoleSerializer
from greenmine.base.serializers import SearchSerializer
from greenmine.base.models import User, Role
from greenmine.scrum import models
from django.conf import settings
import django_filters
class ApiRoot(APIView):
def get(self, request, format=None):
return Response({
'login': reverse('login', request=request, format=format),
'logout': reverse('logout', request=request, format=format),
'projects': reverse('project-list', request=request, format=format),
'milestones': reverse('milestone-list', request=request, format=format),
'user-stories': reverse('user-story-list', request=request, format=format),
'user-stories/statuses': reverse('user-story-status-list', request=request, format=format),
'user-stories/points': reverse('points-list', request=request, format=format),
'issues/attachments': reverse('issues-attachment-list', request=request, format=format),
'issues/statuses': reverse('issues-status-list', request=request, format=format),
'issues/types': reverse('issues-type-list', request=request, format=format),
'issues': reverse('issues-list', request=request, format=format),
'tasks': reverse('tasks-list', request=request, format=format),
'tasks/statuses': reverse('tasks-status-list', request=request, format=format),
'tasks/attachments': reverse('tasks-attachment-list', request=request, format=format),
'severities': reverse('severity-list', request=request, format=format),
'priorities': reverse('priority-list', request=request, format=format),
'documents': reverse('document-list', request=request, format=format),
'questions': reverse('question-list', request=request, format=format),
'wiki/pages': reverse('wiki-page-list', request=request, format=format),
'users': reverse('user-list', request=request, format=format),
'roles': reverse('user-roles', request=request, format=format),
'search': reverse('search', request=request, format=format),
})
class RoleList(generics.ListCreateAPIView):
model = Role
serializer_class = RoleSerializer
permission_classes = (IsAuthenticated,)
def get_queryset(self):
return self.model.objects.all()
class RoleDetail(generics.RetrieveAPIView):
model = Role
serializer_class = RoleSerializer
permission_classes = (IsAuthenticated,)
#class UserFilter(django_filters.FilterSet):
# no_milestone = django_filters.NumberFilter(name="mileston", lookup_type='isnull')
#
# class Meta:
# model = UserStory
# fields = ['project', 'milestone', 'no_milestone']
class UserFilter(django_filters.FilterSet):
class Meta:
model = User
fields = ['is_active']
class UserList(generics.ListCreateAPIView):
model = User
serializer_class = UserSerializer
filter_class = UserFilter
permission_classes = (IsAuthenticated,)
def get_queryset(self):
projects = models.Project.objects.filter(members=self.request.user)
#Project filtering
project = self.request.QUERY_PARAMS.get('project', None)
if project is not None:
projects = projects.filter(id=project)
return super(UserList, self).get_queryset().filter(projects__in=projects)\
.order_by('id').distinct()
def pre_save(self, obj):
pass
class UserDetail(generics.RetrieveUpdateDestroyAPIView):
model = User
serializer_class = UserSerializer
permission_classes = (IsAuthenticated,)
class Login(APIView):
def post(self, request, format=None):
username = request.DATA.get('username', None)
password = request.DATA.get('password', None)
try:
user = User.objects.get(username=username)
if user.check_password(password):
user = authenticate(username=username, password=password)
login(request, user)
return_data = LoginSerializer(UserLogged(**{
'token': request.session.session_key,
'username': request.user.username,
'first_name': request.user.first_name,
'last_name': request.user.last_name,
'email': request.user.email,
'last_login': request.user.last_login,
'color': request.user.color,
'description': request.user.description,
'default_language': request.user.default_language,
'default_timezone': request.user.default_timezone,
'colorize_tags': request.user.colorize_tags,
}))
return Response(return_data.data)
except User.DoesNotExist:
pass
return Response({"detail": "Invalid username or password"}, status.HTTP_400_BAD_REQUEST)
class Logout(APIView):
def post(self, request, format=None):
logout(request)
return Response()
class Search(APIView):
def get(self, request, format=None):
text = request.QUERY_PARAMS.get('text', None)
if text:
#TODO: permission check
results = SearchQuerySet().filter(content=text)[:settings.MAX_SEARCH_RESULTS]
return_data = SearchSerializer(results)
return Response(return_data.data)
return Response({"detail": "Parameter text can't be empty"}, status.HTTP_400_BAD_REQUEST)