import json from django.shortcuts import render from django.shortcuts import redirect from django.conf import settings import django.contrib.auth from django.contrib.auth import get_user_model from ..item.utils import render_to_json from ..utils import default_context from brake.decorators import ratelimit User = get_user_model() @ratelimit(method="POST", block=True, rate="5/m") def register(request): context = default_context(request) response = {} request_type = 'json' if request.method == "POST": if "username" in request.POST and "password" in request.POST: data = request.POST request_type = 'html' else: data = json.loads(request.body) if User.objects.filter(username__iexact=data['username']).exists(): response['error'] = 'username not allowed' elif User.objects.filter(email__iexact=data['email']).exists(): response['error'] = 'username not allowed' elif not data['password']: response['error'] = 'password too simple' if not response: user = User(username=data['username'], email=data['email'].lower()) user.set_password(data['password']) user.is_active = True user.save() user = django.contrib.auth.authenticate(username=data['username'], password=data['password']) django.contrib.auth.login(request, user) response['user'] = user.username if request_type == 'html': if 'error' in response: context['error'] = response['error'] return render(request, 'register.html', context) else: return redirect('/') return render_to_json(response) else: if request.user.is_authenticated: return redirect('/') context = default_context(request) return render(request, 'register.html', context) @ratelimit(method="POST", block=True, rate="5/m") def login(request): context = default_context(request) response = {} request_type = 'json' if request.method == "POST": if "username" in request.POST and "password" in request.POST: data = request.POST request_type = 'html' else: data = json.loads(request.body) user = django.contrib.auth.authenticate(username=data['username'], password=data['password']) if user is not None and user.is_active: django.contrib.auth.login(request, user) response['user'] = user.username if request_type == 'html': return redirect('/') else: response['error'] = 'login failed' if request_type == 'html': context['error'] = response['error'] return render(request, 'login.html', context) return render_to_json(response) else: if request.user.is_authenticated: return redirect('/') return render(request, 'login.html', context) def logout(request): if request.user.is_authenticated: django.contrib.auth.logout(request) if request.method == "POST": data = json.loads(request.body) return render_to_json({}) return redirect('/')