music.service.backend/portfolio/account/serializers.py

75 lines
2.5 KiB
Python
Executable File

from .models import Account, Guest
from rest_framework import serializers
from rest_framework.authtoken.models import Token
from django.contrib.auth import authenticate, logout as logoutDjango
from django.core.paginator import Paginator
from django.http import JsonResponse
class AccountGetSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(read_only = True)
username = serializers.CharField(max_length = 100)
email = serializers.EmailField()
ip = serializers.CharField(max_length = 12)
city = serializers.CharField(max_length = 255)
country = serializers.CharField(max_length = 255)
class Meta:
model = Account
fields = ['id', 'username', 'email', 'ip', 'city', 'country']
class AccountSerializer(AccountGetSerializer):
password = serializers.CharField(max_length = 100)
def create(self, validated_data):
return Account.register(validated_data)
def update(self, instance, validated_data):
return instance.update(validated_data)
class Meta:
model = Account
fields = ['id', 'username', 'password', 'email', 'ip', 'city', 'country']
class AccountAuthSerializer(serializers.ModelSerializer):
username = serializers.CharField(max_length = 100)
password = serializers.CharField(max_length = 100)
@staticmethod
def login(username, password) -> dict:
tryLogin = authenticate(username = username, password = password)
if tryLogin is not None:
user = Account.objects.get(username = username)
try:
token = Token.objects.get(user = user)
except:
token = Token.objects.create(user = user)
return { 'Authorization': 'Token ' + token.key, 'user': user.toDict() }
else:
return { 'error': 'login failed'}
@staticmethod
def logout(request, format=None):
logoutDjango(request)
tokenStr = request.headers['Authorization'].split(' ')[1]
token = Token.objects.get(key = tokenStr)
token.delete()
return { 'info': 'logout success' }
class Meta:
model = Account
fields = ['username', 'password']
class GuestSerializer(serializers.HyperlinkedModelSerializer):
id = serializers.IntegerField(read_only = True)
ip = serializers.CharField(max_length = 12)
city = serializers.CharField(max_length = 255)
country = serializers.CharField(max_length = 255)
class Meta:
model = Guest
fields = ['id', 'ip', 'city', 'country']