taiga-back/greenmine/base/api.py

166 lines
5.4 KiB
Python

# -*- coding: utf-8 -*-
import uuid
from django.contrib.auth import logout, login, authenticate
from django.contrib.auth.views import login as auth_login, logout as auth_logout
from django.conf import settings
from django.db.models import Q
from django import http
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated, AllowAny
from rest_framework import status, generics, viewsets, views
from haystack import query, inputs
from djmail.template_mail import MagicMailBuilder
from greenmine.base.serializers import (LoginSerializer, UserLogged,
UserSerializer, RoleSerializer,
SearchSerializer)
from greenmine.base.models import User, Role
from greenmine.base import exceptions as excp
from greenmine.scrum import models
class RolesViewSet(viewsets.ViewSet):
permission_classes = (IsAuthenticated,)
serializer_class = RoleSerializer
def list(self, request, pk=None):
queryset = Role.objects.all()
serializer = self.serializer_class(queryset, many=True)
return Response(serializer.data)
def retrieve(self, request, pk=None):
try:
role = Role.objects.get(pk=pk)
except Role.DoesNotExist:
raise excp.NotFound()
serializer = self.serializer_class(role)
return Response(serializer.data)
class UsersViewSet(viewsets.ViewSet):
permission_classes = (IsAuthenticated,)
def get_list_queryset(self):
own_projects = (models.Project.objects
.filter(members=self.request.user))
project = self.request.QUERY_PARAMS.get('project', None)
if project is not None:
own_projects = own_projects.filter(pk=project)
queryset = (User.objects.filter(projects__in=own_projects)
.order_by('username').distinct())
return queryset
def list(self, request, pk=None):
queryset = self.get_list_queryset()
serializer = UserSerializer(queryset, many=True)
return Response(serializer.data)
def retrieve(self, request, pk=None):
return Response({})
@action(methods=["POST"], permission_classes=[])
def password_recovery(self, request, pk=None):
username_or_email = request.DATA.get('username', None)
if not username_or_email:
return Response({"detail": "Invalid username or password"}, status.HTTP_400_BAD_REQUEST)
try:
queryset = User.objects.all()
user = queryset.get(Q(username=username_or_email) |
Q(email=username_or_email))
except User.DoesNotExist:
return Response({"detail": "Invalid username or password"}, status.HTTP_400_BAD_REQUEST)
user.token = str(uuid.uuid1())
user.save(update_fields=["token"])
mbuilder = MagicMailBuilder()
email = mbuilder.password_recovery(user.email, {"user": user})
return Response({"detail": "Mail sended successful!"})
class Login(viewsets.ViewSet):
permission_classes = (AllowAny,)
def create(self, request, **kwargs):
username = request.DATA.get('username', None)
password = request.DATA.get('password', None)
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
return Response({"detail": "Invalid username or password"},
status.HTTP_400_BAD_REQUEST)
if not user.check_password(password):
return Response({"detail": "Invalid username or password"},
status.HTTP_400_BAD_REQUEST)
user = authenticate(username=username, password=password)
login(request, user)
serializer = UserSerializer(user)
response_data = serializer.data
response_data["token"] = request.session.session_key
return Response(response_data)
class Logout(viewsets.ViewSet):
permission_classes = (IsAuthenticated,)
def list(self, request, **kwargs):
return self.logout(request)
def create(self, request, **kwargs):
return self.logout(request)
def logout(self, request):
logout(request)
return Response({})
class Search(viewsets.ViewSet):
def list(self, request, **kwargs):
text = request.QUERY_PARAMS.get('text', "")
project_id = request.QUERY_PARAMS.get('project', None)
try:
project = self._get_project(project_id)
except (models.Project.DoesNotExist, TypeError):
raise excp.PermissionDenied({"detail": "Wrong project id"})
#if not text:
# raise excp.BadRequest("text parameter must be contains text")
queryset = query.SearchQuerySet()
queryset = queryset.filter(text=inputs.AutoQuery(text))
queryset = queryset.filter(project_id=project_id)
return_data = SearchSerializer(queryset)
return Response(return_data.data)
def _get_project(self, project_id):
own_projects = (models.Project.objects
.filter(members=self.request.user))
return own_projects.get(pk=project_id)
class ApiRoot(views.APIView):
def get(self, request, **kwargs):
return Response({"name": "Greenmine Api",
"version": 1,
"info": "build with django-rest-framework"})