Files
Pinry/users/views.py
2020-05-17 12:43:13 +08:00

90 lines
2.6 KiB
Python

import json
from django.conf import settings
from django.contrib import messages
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.decorators import login_required
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect, HttpResponseBadRequest, HttpResponse
from django.utils.functional import lazy
from rest_framework import mixins, routers
from rest_framework.permissions import BasePermission
from rest_framework.renderers import JSONRenderer
from rest_framework.viewsets import GenericViewSet
from core.serializers import UserSerializer
from users.models import User
def reverse_lazy(name=None, *args):
return lazy(reverse, str)(name, args=args)
class UserViewSet(
mixins.RetrieveModelMixin,
mixins.ListModelMixin,
mixins.CreateModelMixin,
GenericViewSet,
):
class Permission(BasePermission):
def has_permission(self, request, view):
if not request.method == "POST":
return True
return settings.ALLOW_NEW_REGISTRATIONS
def has_object_permission(self, request, view, obj):
return request.user == obj
permission_classes = [Permission, ]
serializer_class = UserSerializer
pagination_class = None
def get_queryset(self):
if self.request.user.is_anonymous:
return User.objects.none()
return User.objects.filter(id=self.request.user.id)
def login_user(request):
try:
data = json.loads(request.body)
except json.JSONDecodeError:
return HttpResponseBadRequest()
if 'username' not in data:
return HttpResponseBadRequest(
json.dumps({"username": "this field is required"})
)
if 'password' not in data:
return HttpResponseBadRequest(
json.dumps({"password": "this field is required"})
)
user = authenticate(
request,
username=data['username'],
password=data['password']
)
if not user:
return HttpResponseBadRequest(
json.dumps({"password": "username and password doesn't match"})
)
login(request, user)
data = UserSerializer(
user,
context={'request': request},
).data
return HttpResponse(
JSONRenderer().render(data),
content_type="application/json"
)
@login_required
def logout_user(request):
logout(request)
messages.success(request, 'You have successfully logged out.')
return HttpResponseRedirect('/')
drf_router = routers.DefaultRouter()
drf_router.register(r'users', UserViewSet, basename="user")