From a59fce881f4ada59228805e99ea60437a6b1cfc1 Mon Sep 17 00:00:00 2001 From: winkidney Date: Fri, 18 Feb 2022 21:17:27 -0800 Subject: [PATCH] Feature: Add frontend support for API token and fix bug --- pinry-spa/src/components/PHeader.vue | 5 ++ pinry-spa/src/components/UserProfileCard.vue | 19 +++++++ pinry-spa/src/components/user/profile.vue | 41 +++++++++++++++ pinry-spa/src/router/index.js | 6 +++ pinry-spa/src/views/Profile4User.vue | 54 ++++++++++++++++++++ users/models.py | 20 ++++---- users/serializers.py | 4 +- 7 files changed, 138 insertions(+), 11 deletions(-) create mode 100644 pinry-spa/src/components/user/profile.vue create mode 100644 pinry-spa/src/views/Profile4User.vue diff --git a/pinry-spa/src/components/PHeader.vue b/pinry-spa/src/components/PHeader.vue index 8c725ea..7bfd036 100644 --- a/pinry-spa/src/components/PHeader.vue +++ b/pinry-spa/src/components/PHeader.vue @@ -56,6 +56,11 @@ class="navbar-item"> Pins + + Profile + @@ -71,6 +81,10 @@ export default { type: Boolean, default: false, }, + inProfile: { + type: Boolean, + default: false, + }, }, data() { return { @@ -91,6 +105,11 @@ export default { { name: 'boards4user', params: { username: this.username } }, ); }, + go2UserProfile() { + this.$router.push( + { name: 'profile4user', params: { username: this.username } }, + ); + }, go2UserPins() { this.$router.push( { name: 'user', params: { user: this.username } }, diff --git a/pinry-spa/src/components/user/profile.vue b/pinry-spa/src/components/user/profile.vue new file mode 100644 index 0000000..627ee51 --- /dev/null +++ b/pinry-spa/src/components/user/profile.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/pinry-spa/src/router/index.js b/pinry-spa/src/router/index.js index 8838324..8f01d90 100644 --- a/pinry-spa/src/router/index.js +++ b/pinry-spa/src/router/index.js @@ -6,6 +6,7 @@ import Pins4User from '../views/Pins4User.vue'; import Pins4Board from '../views/Pins4Board.vue'; import Pins4Id from '../views/Pins4Id.vue'; import Boards4User from '../views/Boards4User.vue'; +import Profile4User from '../views/Profile4User.vue'; import PinCreate from '../views/PinCreate.vue'; import Search from '../views/Search.vue'; import PageNotFound from '../views/PageNotFound.vue'; @@ -43,6 +44,11 @@ const routes = [ name: 'boards4user', component: Boards4User, }, + { + path: '/profile/:username', + name: 'profile4user', + component: Profile4User, + }, { path: '/pin-creation/from-url', name: 'pin-creation-from-url', diff --git a/pinry-spa/src/views/Profile4User.vue b/pinry-spa/src/views/Profile4User.vue new file mode 100644 index 0000000..7237fd3 --- /dev/null +++ b/pinry-spa/src/views/Profile4User.vue @@ -0,0 +1,54 @@ + + + + + + diff --git a/users/models.py b/users/models.py index 3588eac..753732f 100644 --- a/users/models.py +++ b/users/models.py @@ -5,7 +5,17 @@ from django.db.models.signals import post_save from django.dispatch import receiver +def create_token_if_necessary(user: BaseUser): + from rest_framework.authtoken.models import Token + token = Token.objects.filter(user=user).first() + if token is not None: + return token + else: + return Token.objects.create(user=user) + + class User(BaseUser): + @property def gravatar(self): return hashlib.md5(self.email.encode('utf-8')).hexdigest() @@ -13,15 +23,7 @@ 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() + create_token_if_necessary(instance) diff --git a/users/serializers.py b/users/serializers.py index a3d8365..d2e02ff 100644 --- a/users/serializers.py +++ b/users/serializers.py @@ -3,7 +3,7 @@ from django.contrib.auth import login from rest_framework import serializers from rest_framework.exceptions import ValidationError -from users.models import User +from users.models import User, create_token_if_necessary class PublicUserSerializer(serializers.HyperlinkedModelSerializer): @@ -77,4 +77,4 @@ class UserSerializer(serializers.HyperlinkedModelSerializer): return user def get_token(self, obj: User): - return obj.create_token_if_necessary().key + return create_token_if_necessary(obj).key