diff --git a/greenmine/base/views.py b/greenmine/base/views.py index ebc972b9..89ab07f2 100644 --- a/greenmine/base/views.py +++ b/greenmine/base/views.py @@ -1,4 +1,19 @@ -from rest_framework import renderers +# -*- 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 @@ -21,3 +36,62 @@ def api_root(request, format=None): '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) diff --git a/greenmine/settings/common.py b/greenmine/settings/common.py index fbbeccb4..e595bf15 100644 --- a/greenmine/settings/common.py +++ b/greenmine/settings/common.py @@ -318,4 +318,10 @@ HAYSTACK_CONNECTIONS = { HAYSTACK_DEFAULT_OPERATOR = 'AND' +REST_FRAMEWORK = { + 'DEFAULT_AUTHENTICATION_CLASSES': ( + 'rest_framework.authentication.SessionAuthentication', + ) +} + from .appdefaults import * diff --git a/greenmine/urls.py b/greenmine/urls.py index 3fa23825..1c8a40f3 100644 --- a/greenmine/urls.py +++ b/greenmine/urls.py @@ -3,9 +3,11 @@ from django.conf.urls import patterns, include, url from django.contrib import admin admin.autodiscover() +from greenmine.base.views import Login, Logout + urlpatterns = patterns('', - url(r'^api/auth/', include('rest_framework.urls', - namespace='rest_framework')), + url(r'^api/auth/login/$', Login.as_view(), namespace='api-login')), + url(r'^api/auth/logout/$', Logout.as_view(), namespace='api-logout')), url(r'^api/$', 'greenmine.base.views.api_root'), url(r'^api/scrum/', include('greenmine.scrum.urls')), url(r'^admin/', include(admin.site.urls)),