From 6d3cbaf764d11b127992f910d1837567e6b4c8e9 Mon Sep 17 00:00:00 2001 From: Christian Cueni Date: Wed, 5 May 2021 14:09:04 +0200 Subject: [PATCH] Create or update user and create or update token --- server/api/urls.py | 4 ++-- server/core/migrations/0002_oauth2token.py | 28 ---------------------- server/core/models.py | 22 ----------------- server/core/settings.py | 1 + server/oauth/__init__.py | 0 server/oauth/apps.py | 6 +++++ server/oauth/managers.py | 24 +++++++++++++++++++ server/oauth/models.py | 23 ++++++++++++++++++ server/oauth/urls.py | 9 +++++++ server/{users => oauth}/views.py | 5 +++- server/registration/apps.py | 9 ------- server/users/models.py | 10 ++++---- server/users/urls.py | 9 ------- 13 files changed, 75 insertions(+), 75 deletions(-) delete mode 100644 server/core/migrations/0002_oauth2token.py create mode 100644 server/oauth/__init__.py create mode 100644 server/oauth/apps.py create mode 100644 server/oauth/managers.py create mode 100644 server/oauth/models.py create mode 100644 server/oauth/urls.py rename server/{users => oauth}/views.py (87%) delete mode 100644 server/users/urls.py diff --git a/server/api/urls.py b/server/api/urls.py index 000ed89e..28036eb0 100644 --- a/server/api/urls.py +++ b/server/api/urls.py @@ -13,8 +13,8 @@ urlpatterns = [ url(r'^graphql-public', csrf_exempt(GraphQLView.as_view(schema=schema))), url(r'^graphql', csrf_exempt(PrivateGraphQLView.as_view())), - # hep proxy - url(r'^proxy/', include('registration.urls', namespace="registration")), + # oauth + url(r'^oauth/', include('oauth.urls', namespace="oauth")), ] if settings.DEBUG: diff --git a/server/core/migrations/0002_oauth2token.py b/server/core/migrations/0002_oauth2token.py deleted file mode 100644 index 95c55047..00000000 --- a/server/core/migrations/0002_oauth2token.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 2.2.21 on 2021-05-05 06:37 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('core', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='OAuth2Token', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=40)), - ('token_type', models.CharField(max_length=40)), - ('access_token', models.CharField(max_length=200)), - ('refresh_token', models.CharField(max_length=200)), - ('expires_at', models.PositiveIntegerField()), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - ] diff --git a/server/core/models.py b/server/core/models.py index 2c46e989..8943cbc3 100644 --- a/server/core/models.py +++ b/server/core/models.py @@ -1,7 +1,4 @@ -from datetime import datetime - from django.db import models -from django.contrib.auth import get_user_model from core.managers import AdminDataManager @@ -11,22 +8,3 @@ class AdminData(models.Model): updated_at = models.DateTimeField(blank=False, null=True, auto_now=True) objects = AdminDataManager() - - -# https://docs.authlib.org/en/latest/client/frameworks.html#frameworks-clients -class OAuth2Token(models.Model): - name = models.CharField(max_length=40) - token_type = models.CharField(max_length=40) - access_token = models.CharField(max_length=200) - refresh_token = models.CharField(max_length=200) - expires_at = models.PositiveIntegerField() - user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE) - - def to_token(self): - return dict( - access_token=self.access_token, - token_type=self.token_type, - refresh_token=self.refresh_token, - expires_at=self.expires_at, - ) - diff --git a/server/core/settings.py b/server/core/settings.py index e3445a19..b28c9bf8 100644 --- a/server/core/settings.py +++ b/server/core/settings.py @@ -61,6 +61,7 @@ INSTALLED_APPS = [ 'notes', 'registration', 'news', + 'oauth', 'wagtail.contrib.forms', 'wagtail.contrib.redirects', diff --git a/server/oauth/__init__.py b/server/oauth/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/server/oauth/apps.py b/server/oauth/apps.py new file mode 100644 index 00000000..ee8a388f --- /dev/null +++ b/server/oauth/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class UserConfig(AppConfig): + name = 'oauth' + diff --git a/server/oauth/managers.py b/server/oauth/managers.py new file mode 100644 index 00000000..18732c46 --- /dev/null +++ b/server/oauth/managers.py @@ -0,0 +1,24 @@ +from django.db import models + + +class OAuth2TokenManager(models.Manager): + def update_or_create_token(self, token_data, user): + + query = self.filter(user=user) + token_properties = { + 'token_type': token_data['token_type'], + 'access_token': token_data['access_token'], + 'refresh_token': token_data['refresh_token'], + 'expires_at': token_data['expires_at'], + } + + if query.exists(): + return query.update(**token_properties) + else: + return self._create_oauthtoken(user, token_properties) + + def _create_oauthtoken(self, user, token_properties): + token = self.model(user=user, **token_properties) + token.save() + return token + diff --git a/server/oauth/models.py b/server/oauth/models.py new file mode 100644 index 00000000..c0063613 --- /dev/null +++ b/server/oauth/models.py @@ -0,0 +1,23 @@ +# https://docs.authlib.org/en/latest/client/frameworks.html#frameworks-clients +from django.contrib.auth import get_user_model +from django.db import models + +from oauth.managers import OAuth2TokenManager + + +class OAuth2Token(models.Model): + token_type = models.CharField(max_length=40) + access_token = models.TextField() + refresh_token = models.TextField() + expires_at = models.PositiveIntegerField() + user = models.OneToOneField(get_user_model(), on_delete=models.CASCADE) + + objects = OAuth2TokenManager() + + def to_token(self): + return dict( + access_token=self.access_token, + token_type=self.token_type, + refresh_token=self.refresh_token, + expires_at=self.expires_at, + ) diff --git a/server/oauth/urls.py b/server/oauth/urls.py new file mode 100644 index 00000000..7d5c3930 --- /dev/null +++ b/server/oauth/urls.py @@ -0,0 +1,9 @@ +from django.conf.urls import url +from oauth import views + +app_name = 'users' +urlpatterns = [ + url(r'^login/', views.login, name='login'), + url(r'^callback/', views.authorize, name='authorize') + # url(r'^oauth/callback/', views.authorize, name='authorize') +] diff --git a/server/users/views.py b/server/oauth/views.py similarity index 87% rename from server/users/views.py rename to server/oauth/views.py index f7f27516..ab4a2464 100644 --- a/server/users/views.py +++ b/server/oauth/views.py @@ -2,6 +2,7 @@ from django.conf import settings from core.hep_client import HepClient from core.oauth import oauth +from oauth.models import OAuth2Token from users.user_signup_login_handler import handle_user_and_verify_products, EMAIL_NOT_VERIFIED from django.contrib.auth import login as dj_login @@ -17,11 +18,13 @@ def authorize(request): token = oauth.hep.authorize_access_token(request) user_data = hep_client.user_details(token) print(user_data) - user, status_msg = handle_user_and_verify_products(user_data) # todo: move handle_fn or authorize + user, status_msg = handle_user_and_verify_products(user_data) user.sync_with_hep_data(user_data) if user and status_msg != EMAIL_NOT_VERIFIED: dj_login(request, user) + some = len(token['access_token']) + OAuth2Token.objects.update_or_create_token(token, user) if status_msg: return status_msg diff --git a/server/registration/apps.py b/server/registration/apps.py index a9b4ab38..cde05eae 100644 --- a/server/registration/apps.py +++ b/server/registration/apps.py @@ -1,12 +1,3 @@ -# -*- coding: utf-8 -*- -# -# ITerativ GmbH -# http://www.iterativ.ch/ -# -# Copyright (c) 2019 ITerativ GmbH. All rights reserved. -# -# Created on 2019-10-08 -# @author: chrigu from django.apps import AppConfig diff --git a/server/users/models.py b/server/users/models.py index 5b9a5db7..e51fc3a1 100644 --- a/server/users/models.py +++ b/server/users/models.py @@ -94,12 +94,12 @@ class User(AbstractUser): self.username = hep_data['email'] data_has_changed = True - if self.first_name != hep_data['firstname']: - self.first_name = hep_data['firstname'] + if self.first_name != hep_data['first_name']: + self.first_name = hep_data['first_name'] data_has_changed = True - if self.last_name != hep_data['lastname']: - self.last_name = hep_data['lastname'] + if self.last_name != hep_data['last_name']: + self.last_name = hep_data['last_name'] data_has_changed = True if data_has_changed: @@ -137,6 +137,8 @@ class GroupWithCode(models.Model): class Meta: abstract = True + +class SchoolClass(models.Model): name = models.CharField(max_length=100, blank=False, null=False, unique=True) is_deleted = models.BooleanField(blank=False, null=False, default=False) code = models.CharField('Code zum Beitreten', blank=True, null=True, max_length=10, unique=True, default=None) diff --git a/server/users/urls.py b/server/users/urls.py deleted file mode 100644 index d2e68058..00000000 --- a/server/users/urls.py +++ /dev/null @@ -1,9 +0,0 @@ -from django.conf.urls import url -from users import views - -app_name = 'registration' -urlpatterns = [ - url(r'^oauth/login/', views.login, name='login'), - url(r'^oauth/callback/', views.authorize, name='authorize') - # url(r'^oauth/callback/', views.authorize, name='authorize') -]