# HG changeset patch # User durandn # Date 1456850349 -3600 # Node ID cb21b50b77936b07b2f2f00e6b06ea96e1eaa5c3 # Parent 39cecdd5260e68c898834b026c2049d1ac77fcea small corrections on oauth server and allauth provider + implemented post_save signals to reference resources into itop ged diff -r 39cecdd5260e -r cb21b50b7793 oauth/oauth.py --- a/oauth/oauth.py Mon Feb 29 12:23:37 2016 +0100 +++ b/oauth/oauth.py Tue Mar 01 17:39:09 2016 +0100 @@ -206,7 +206,6 @@ @app.route('/oauth/oauth2/authorize', methods=['GET', 'POST']) @oauth.authorize_handler def authorize(*args, **kwargs): - print(request.headers) user = current_user() if not user: return redirect('/') @@ -229,7 +228,6 @@ @app.route('/rest/oauth/validate/') def validate_token(token): - print(request.headers) database_token = Token.query.filter_by(access_token=token).first() related_client = database_token.client return jsonify( @@ -239,14 +237,23 @@ description= "", scope=database_token.scopes ) - + +@app.route('/ws/resource/', methods=["POST", "PUT"]) +@oauth.require_oauth() +def reference_resource(resource_id): + print("#########################") + print(request.headers) + print("#########################") + print(request.data) + return "Resource was referenced", 200 + def init_client(client_id, client_secret, redirect_uris, client_owner, confidential=False): client = Client.query.filter_by(client_id=client_id, client_secret=client_secret).first() if not client: print("Creating client for "+client_owner) user = User.query.filter_by(username=client_owner).first() if not user: - user = User(username=username) + user = User(username=client_owner) db.session.add(user) db.session.commit() if confidential: @@ -270,7 +277,8 @@ client_id=app.config["RENKAN_CLIENT_ID"], client_secret=app.config["RENKAN_CLIENT_SECRET"], redirect_uris=app.config["RENKAN_REDIRECT_URIS"], - client_owner=app.config["RENKAN_SERVER_USER"] + client_owner=app.config["RENKAN_SERVER_USER"], + confidential=True ) init_client( client_id=app.config["MOCK_GED_CLIENT_ID"], diff -r 39cecdd5260e -r cb21b50b7793 oauth/settings/client_settings.py.tmpl --- a/oauth/settings/client_settings.py.tmpl Mon Feb 29 12:23:37 2016 +0100 +++ b/oauth/settings/client_settings.py.tmpl Tue Mar 01 17:39:09 2016 +0100 @@ -1,6 +1,9 @@ class ClientSettings(object): + CLIENT_ID = '' + CLIENT_SECRET = '' + # OAUTH SERVER CONFIG BASE_URL = 'http://127.0.0.1:5000/rest/' REQUEST_TOKEN_URL = None diff -r 39cecdd5260e -r cb21b50b7793 server/src/metaeducation/mtdc_oauth_provider/provider.py --- a/server/src/metaeducation/mtdc_oauth_provider/provider.py Mon Feb 29 12:23:37 2016 +0100 +++ b/server/src/metaeducation/mtdc_oauth_provider/provider.py Tue Mar 01 17:39:09 2016 +0100 @@ -2,7 +2,7 @@ from allauth.socialaccount import providers from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider - +from django.conf import settings class MtdcProvider(OAuth2Provider): id = 'mtdc' @@ -11,12 +11,12 @@ def extract_uid(self, data): print("retrieved data: "+str(data)) - return data.get('id', '') + return data.get(settings.MTDC_USERID_FIELD_NAME, '') def extract_common_fields(self, data): - return {"username": data.get("username", "")} + return {"username": data.get(settings.MTDC_USERNAME_FIELD_NAME, "")} def extract_extra_data(self, data): - return {"username": data.get("username", "")} + return {"username": data.get(settings.MTDC_USERNAME_FIELD_NAME, "")} providers.registry.register(MtdcProvider) \ No newline at end of file diff -r 39cecdd5260e -r cb21b50b7793 server/src/metaeducation/mtdc_oauth_provider/views.py --- a/server/src/metaeducation/mtdc_oauth_provider/views.py Mon Feb 29 12:23:37 2016 +0100 +++ b/server/src/metaeducation/mtdc_oauth_provider/views.py Tue Mar 01 17:39:09 2016 +0100 @@ -48,9 +48,9 @@ self.profile_url = self.oauth_base_url + settings.MTDC_PROFILE_URL def pre_social_login(self, request, sociallogin): - user = sociallogin.user + socialuser = sociallogin.user try: - user = get_user_model().objects.get(username=user.username) # if user exists, connect the account to the existing account and login + user = get_user_model().objects.get(username=socialuser.username) # if user exists, connect the account to the existing account and login sociallogin.state['process'] = 'connect' perform_login(request, user, 'none') except get_user_model().DoesNotExist: diff -r 39cecdd5260e -r cb21b50b7793 server/src/metaeducation/settings/dev.py.tmpl --- a/server/src/metaeducation/settings/dev.py.tmpl Mon Feb 29 12:23:37 2016 +0100 +++ b/server/src/metaeducation/settings/dev.py.tmpl Tue Mar 01 17:39:09 2016 +0100 @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- from metaeducation.settings import * -import os, logging +import os, logging, base64 #TODO override DEBUG = True @@ -43,4 +43,9 @@ MTDC_AUTHORIZE_URL = "" # This URL is the authorize endpoint URL, relative to a Base url that will be passed as query arg to the server MTDC_PROFILE_URL = "" # This URL is the user profile endpoint URL, relative to a Base url that will be passed as query arg to the server -MTDC_VALIDATE_TOKEN_URL = "" # This URL is the ABSOLUTE url for validating a token. There will be no context involved for validation token from server to server. \ No newline at end of file +MTDC_VALIDATE_TOKEN_URL = "" # This URL is the ABSOLUTE url for validating a token. There will be no context involved for validation token from server to server. +MTDC_REFERENCE_RESOURCE_BASE_URL = "" # This URL is the ABSOLUTE url for referencing a resource (ged webservice) +MTDC_CLIENT_CREDENTIALS_TOKEN_URL = "" # This URL is the ABSOLUTE url for getting a token via Client Credentials from server to server. + +MTDC_USERNAME_FIELD_NAME = "username" # Name of the username field that will be transmitted in response to the profile url request (usually "username", for metaeduc will probably be "displayName") +MTDC_USERID_FIELD_NAME = "id" # Name of the user id field that will be transmitted in response to the profile url request (usually "id") \ No newline at end of file diff -r 39cecdd5260e -r cb21b50b7793 server/src/metaeducation/signals.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/src/metaeducation/signals.py Tue Mar 01 17:39:09 2016 +0100 @@ -0,0 +1,61 @@ +from django.db.models.signals import post_save +from django.dispatch import receiver +from django.contrib.auth import get_user_model +from django.conf import settings +import requests, json + +@receiver(post_save) +def reference_created_renkan(sender, instance, created, **kwargs): + from renkanmanager.models import Renkan + if created and sender == Renkan: + token_response = requests.post( + settings.MTDC_CLIENT_CREDENTIALS_TOKEN_URL+"?grant_type=client_credentials", + data = {}, + headers = { + "Authorization": "Basic %s" % settings.MTDC_AUTH_CODE + } + ) + if token_response.status_code == 200: + token = json.loads(token_response.text)['access_token'] + post_data = json.dumps({ + "userId": instance.creator.id, + "title": instance.title + }) + reference_response = requests.post( + settings.MTDC_REFERENCE_RESOURCE_BASE_URL+str(instance.renkan_guid), + data = post_data, + headers = { + "Authorization": "Bearer %s" % token + } + ) + +@receiver(post_save) +def reference_modified_title(sender, instance, created, **kwargs): + from renkanmanager.models import Renkan, Revision + if created and sender == Revision: + try: + referenced_renkan = Renkan.objects.get(renkan_guid = instance.revision_guid) + except Renkan.DoesNotExist: + return + if referenced_renkan.revision_count > 1: + # This means the revision isn't the first of the Renkan and therefore we shouldn't do anything + token_response = requests.post( + settings.MTDC_CLIENT_CREDENTIALS_TOKEN_URL+"?grant_type=client_credentials", + data = {}, + headers = { + "Authorization": "Basic %s" % settings.MTDC_AUTH_CODE + } + ) + if token_response.status_code == 200: + token = json.loads(token_response.text)['access_token'] + put_data = json.dumps({ + "userId": referenced_renkan.creator.id, + "title": referenced_renkan.title + }) + reference_response = requests.post( + settings.MTDC_REFERENCE_RESOURCE_BASE_URL+str(instance.renkan_guid), + data = put_data, + headers = { + "Authorization": "Bearer %s" % token + } + ) \ No newline at end of file