small corrections on oauth server and allauth provider + implemented post_save signals to reference resources into itop ged
authordurandn
Tue, 01 Mar 2016 17:39:09 +0100
changeset 7 cb21b50b7793
parent 6 39cecdd5260e
child 8 e56471e269eb
small corrections on oauth server and allauth provider + implemented post_save signals to reference resources into itop ged
oauth/oauth.py
oauth/settings/client_settings.py.tmpl
server/src/metaeducation/mtdc_oauth_provider/provider.py
server/src/metaeducation/mtdc_oauth_provider/views.py
server/src/metaeducation/settings/dev.py.tmpl
server/src/metaeducation/signals.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/<token>')
 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/<resource_id>', 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"], 
--- 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
--- 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
--- 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:
--- 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 <CONTEXT> 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 <CONTEXT> 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
--- /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