98 lines
3.3 KiB
Python
98 lines
3.3 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
import datetime
|
|
import json
|
|
|
|
from django.core.serializers.json import DjangoJSONEncoder
|
|
from django.views.generic.base import View
|
|
from django.views.decorators.csrf import csrf_exempt
|
|
from django.contrib.auth import logout, login, authenticate
|
|
from django.contrib.auth.models import User
|
|
from django.utils.functional import Promise
|
|
from django.utils.encoding import force_text
|
|
from django.utils.decorators import method_decorator
|
|
from django.utils import timezone
|
|
from django import http
|
|
|
|
from rest_framework.decorators import api_view
|
|
from rest_framework.response import Response
|
|
from rest_framework.reverse import reverse
|
|
|
|
|
|
@api_view(('GET',))
|
|
def api_root(request, format=None):
|
|
return Response({
|
|
'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),
|
|
'changes': reverse('change-list', request=request, format=format),
|
|
'change-attachments': reverse('change-attachment-list', request=request, format=format),
|
|
'tasks': reverse('task-list', request=request, format=format),
|
|
'severities': reverse('severity-list', request=request, format=format),
|
|
'issue-status': reverse('issue-status-list', request=request, format=format),
|
|
'task-status': reverse('task-status-list', request=request, format=format),
|
|
'user-story-status': reverse('user-story-status-list', request=request, format=format),
|
|
'priorities': reverse('priority-list', request=request, format=format),
|
|
'issue-types': reverse('issue-type-list', request=request, format=format),
|
|
'points': reverse('points-list', request=request, format=format),
|
|
})
|
|
|
|
|
|
class LazyEncoder(DjangoJSONEncoder):
|
|
"""
|
|
JSON encoder class for encode correctly traduction strings.
|
|
Is for ajax response encode.
|
|
"""
|
|
|
|
def default(self, obj):
|
|
if isinstance(obj, Promise):
|
|
return force_text(obj)
|
|
elif isinstance(obj, datetime.datetime):
|
|
obj = timezone.localtime(obj)
|
|
return super(LazyEncoder, self).default(obj)
|
|
|
|
|
|
def request_json_to_dict(request):
|
|
try:
|
|
body = request.body.decode('utf-8')
|
|
return json.loads(body)
|
|
except Exception:
|
|
return {}
|
|
|
|
|
|
def to_json(data):
|
|
return json.dumps(data)
|
|
|
|
|
|
class Login(View):
|
|
def post(self, request):
|
|
data = request_json_to_dict(request)
|
|
|
|
username = data.get('username', None)
|
|
password = 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 http.HttpResponse(to_json({'token': request.session.session_key}))
|
|
except User.DoesNotExist:
|
|
pass
|
|
|
|
return http.HttpResponseBadRequest()
|
|
|
|
@method_decorator(csrf_exempt)
|
|
def dispatch(self, *args, **kwargs):
|
|
return super(Login, self).dispatch(*args, **kwargs)
|
|
|
|
|
|
class Logout(View):
|
|
def post(self, request):
|
|
logout(request)
|
|
return http.HttpResponse()
|
|
|
|
@method_decorator(csrf_exempt)
|
|
def dispatch(self, *args, **kwargs):
|
|
return super(Login, self).dispatch(*args, **kwargs)
|