mirror of
https://github.com/tubearchivist/tubearchivist.git
synced 2025-05-10 05:11:09 +00:00
96 lines
2.9 KiB
Python
96 lines
2.9 KiB
Python
"""all user api views"""
|
|
|
|
from common.views import ApiBaseView
|
|
from django.contrib.auth import authenticate, login, logout
|
|
from django.utils.decorators import method_decorator
|
|
from django.views.decorators.csrf import csrf_exempt
|
|
from rest_framework.permissions import AllowAny
|
|
from rest_framework.response import Response
|
|
from rest_framework.views import APIView
|
|
from user.models import Account
|
|
from user.serializers import AccountSerializer
|
|
from user.src.user_config import UserConfig
|
|
|
|
|
|
class UserConfigView(ApiBaseView):
|
|
"""resolves to /api/user/me/
|
|
GET: return current user config
|
|
POST: update user config
|
|
"""
|
|
|
|
def get(self, request):
|
|
"""get config"""
|
|
user_id = request.user.id
|
|
account = Account.objects.get(id=user_id)
|
|
serializer = AccountSerializer(account)
|
|
response = serializer.data.copy()
|
|
|
|
config = UserConfig(user_id).get_config()
|
|
response.update({"config": config})
|
|
|
|
return Response(response)
|
|
|
|
def post(self, request):
|
|
"""update config"""
|
|
user_id = request.user.id
|
|
data = request.data
|
|
|
|
data_config = data.get("config")
|
|
if not data_config:
|
|
message = {
|
|
"status": "Bad Request",
|
|
"message": "missing config key",
|
|
}
|
|
return Response(message, status=400)
|
|
|
|
user_conf = UserConfig(user_id)
|
|
for key, value in data_config.items():
|
|
try:
|
|
user_conf.set_value(key, value)
|
|
except ValueError as err:
|
|
message = {
|
|
"status": "Bad Request",
|
|
"message": f"failed updating {key} to '{value}', {err}",
|
|
}
|
|
return Response(message, status=400)
|
|
|
|
response = user_conf.get_config()
|
|
response.update({"user_id": user_id})
|
|
|
|
return Response(response)
|
|
|
|
|
|
@method_decorator(csrf_exempt, name="dispatch")
|
|
class LoginApiView(APIView):
|
|
"""resolves to /api/user/login/
|
|
POST: return token and username after successful login
|
|
"""
|
|
|
|
permission_classes = [AllowAny]
|
|
|
|
def post(self, request, *args, **kwargs):
|
|
"""post data"""
|
|
# pylint: disable=no-member
|
|
|
|
username = request.data.get("username")
|
|
password = request.data.get("password")
|
|
|
|
user = authenticate(request, username=username, password=password)
|
|
|
|
if user is not None:
|
|
login(request, user) # Creates a session for the user
|
|
return Response({"message": "Login successful"}, status=200)
|
|
|
|
return Response({"message": "Invalid credentials"}, status=400)
|
|
|
|
|
|
class LogoutApiView(ApiBaseView):
|
|
"""resolves to /api/user/logout/
|
|
POST: handle logout
|
|
"""
|
|
|
|
def post(self, request, *args, **kwargs):
|
|
"""logout on post request"""
|
|
logout(request)
|
|
return Response({"message": "Successfully logged out."}, status=200)
|