From 2c67e002ff726078bc525799aabd71a850ba4db3 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 26 Mar 2013 00:17:55 +0100 Subject: [PATCH] Make login view accept json instead of form encoded data. --- greenmine/base/api_actions.py | 52 ++++++++++++++++++++++++++++------- greenmine/urls.py | 13 ++++----- 2 files changed, 48 insertions(+), 17 deletions(-) diff --git a/greenmine/base/api_actions.py b/greenmine/base/api_actions.py index 39390e64..4dab26a9 100644 --- a/greenmine/base/api_actions.py +++ b/greenmine/base/api_actions.py @@ -1,31 +1,63 @@ +# -*- 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.utils.decorators import method_decorator -from django.http import HttpResponse - 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 -import json + +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): - username = request.POST.get('username', None) - password = request.POST.get('password', None) - print username - print password + 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 HttpResponse(json.dumps({'token': request.session.session_key, 'error': False})) + return http.HttpResponse(to_json({'token': request.session.session_key})) except User.DoesNotExist: pass - return HttpResponse(json.dumps({'error': True})) + return http.HttpResponseBadRequest() @method_decorator(csrf_exempt) def dispatch(self, *args, **kwargs): diff --git a/greenmine/urls.py b/greenmine/urls.py index 2366b5ea..beda6c70 100644 --- a/greenmine/urls.py +++ b/greenmine/urls.py @@ -3,15 +3,14 @@ from django.conf.urls import patterns, include, url from django.contrib import admin admin.autodiscover() -from base.api_actions import Login, Logout - from tastypie.api import Api -from scrum.api import * -from questions.api import * -from documents.api import * -from profile.api import * -from wiki.api import * +from .base.api_actions import Login, Logout +from .scrum.api import * +from .questions.api import * +from .documents.api import * +from .profile.api import * +from .wiki.api import * v1_api = Api(api_name='gm') v1_api.register(ProjectResource())