From 2892ebb333c2e099b7709b3a28f5ee2dd1087fb6 Mon Sep 17 00:00:00 2001 From: winkidney Date: Fri, 18 Feb 2022 20:27:19 -0800 Subject: [PATCH] Feature: Add token creation for auth --- pinry/settings/base.py | 1 + users/models.py | 15 +++++++++++++++ users/serializers.py | 5 +++++ 3 files changed, 21 insertions(+) diff --git a/pinry/settings/base.py b/pinry/settings/base.py index 700f6ce..0bf2cf2 100644 --- a/pinry/settings/base.py +++ b/pinry/settings/base.py @@ -15,6 +15,7 @@ INSTALLED_APPS = [ 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', + 'rest_framework.authtoken', 'django_filters', 'taggit', 'compressor', diff --git a/users/models.py b/users/models.py index cc52fa2..3588eac 100644 --- a/users/models.py +++ b/users/models.py @@ -1,6 +1,8 @@ import hashlib from django.contrib.auth.models import User as BaseUser +from django.db.models.signals import post_save +from django.dispatch import receiver class User(BaseUser): @@ -10,3 +12,16 @@ class User(BaseUser): class Meta: proxy = True + + def create_token_if_necessary(self): + from rest_framework.authtoken.models import Token + token = Token.objects.filter(user=self).first() + if token is not None: + return token + else: + return Token.objects.create(user=self) + + +@receiver(post_save, sender=User) +def create_profile(sender, instance: User, **kwargs): + instance.create_token_if_necessary() diff --git a/users/serializers.py b/users/serializers.py index 51b4a64..a3d8365 100644 --- a/users/serializers.py +++ b/users/serializers.py @@ -26,6 +26,7 @@ class UserSerializer(serializers.HyperlinkedModelSerializer): model = User fields = ( 'username', + 'token', 'email', 'gravatar', 'password', @@ -52,6 +53,7 @@ class UserSerializer(serializers.HyperlinkedModelSerializer): min_length=6, max_length=32, ) + token = serializers.SerializerMethodField(read_only=True) def create(self, validated_data): if validated_data['password'] != validated_data['password_repeat']: @@ -73,3 +75,6 @@ class UserSerializer(serializers.HyperlinkedModelSerializer): backend=settings.AUTHENTICATION_BACKENDS[0], ) return user + + def get_token(self, obj: User): + return obj.create_token_if_necessary().key