server/src/metaeducation/signals.py
author durandn
Tue, 12 Apr 2016 11:59:08 +0200
changeset 65 c765c06f0b91
parent 63 6bfac7c633a0
child 68 c33b04bd3707
permissions -rw-r--r--
reorganized userfields populating in Auth Code flow + assigning model permissions in signal + added fields for extracting first and last name

import requests, json, sys, logging

from django.conf import settings
from django.contrib.auth import get_user_model
from django.contrib.auth.signals import user_logged_in, user_logged_out
from django.core.urlresolvers import reverse
from django.db.models.signals import post_save
from django.dispatch import receiver
from guardian.shortcuts import assign_perm


logger = logging.getLogger(__name__)


def reference_created_renkan(sender, instance, created, **kwargs):
    from renkanmanager.models import Renkan
    if not settings.MTDC_CLIENT_CREDENTIALS_TOKEN_URL or not settings.MTDC_REFERENCE_RESOURCE_BASE_URL:
        return
    if created and sender == Renkan and not instance.source_revision_guid:
        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:
            logger.debug("REFERENCING RENKAN: token response is 200")
            token = json.loads(token_response.text)['access_token']
            post_data = json.dumps({
                "id": str(instance.renkan_guid),
                "idOutil": settings.RENKAN_TOOL_ID,
                "idUser": instance.creator.external_id,
                "pf": settings.ITOP_PF_CODE,
                "uai": instance.creator.uai,
                "redirect_uri": settings.OAUTH_REDIRECT_URI,
                "title": instance.title
            })
            resource_ws_url = settings.MTDC_REFERENCE_RESOURCE_BASE_URL# + str(instance.renkan_guid)
            logger.debug("REFERENCING RENKAN: sending reference request to: POST %r", resource_ws_url)
            logger.debug("REFERENCING RENKAN: post_data: %r", post_data)
            reference_response = requests.post(
                resource_ws_url,
                data = post_data,
                headers = {
                    "Authorization": "Bearer %s" % token,
                    "content-type": "application/json"
                }
            )
            logger.debug("REFERENCING RENKAN: response is %r", reference_response.status_code)

def assign_objects_permissions(sender, instance, created, **kwargs):
    from renkanmanager.models import Renkan, Revision, Workspace
    if sender == Renkan and created:
        creator = instance.creator
        logger.debug("SIGNALS: RENKAN WAS CREATED, ASSIGNING PERMS TO USER %r FOR RENKAN %r", instance.creator, instance.renkan_guid)
        assign_perm('renkanmanager.view_renkan', creator, instance)
        assign_perm('renkanamanger.change_renkan', creator, instance)
        assign_perm('renkanmanager.delete_renkan', creator, instance)
    if sender == Revision and created:
        creator = instance.creator
        logger.debug("SIGNALS: REVISION WAS CREATED, ASSIGNING PERMS TO USER %r", instance.creator)
        assign_perm('renkanmanager.view_revision', creator, instance)
        assign_perm('renkanmanager.delete_revision', creator, instance)
    if sender == Workspace and created:
        creator = instance.creator
        logger.debug("SIGNALS: WORKSPACE WAS CREATED, ASSIGNING PERMS TO USER %r", instance.creator)
        assign_perm('renkanmanager.view_workspace', creator, instance)
        assign_perm('renkanmanager.change_workspace', creator, instance)
        assign_perm('renkanmanager.delete_workspace', creator, instance)

def assign_user_permissions(sender, instance, created, **kwargs):
    if sender == get_user_model() and created:
        logger.debug("SIGNALS: USER %r WAS CREATED, ASSIGNING MODEL PERMISSIONS", instance)
        assign_perm('renkanmanager.view_renkan', instance)
        assign_perm('renkanmanager.add_renkan', instance)
        assign_perm('renkanmanager.change_renkan', instance)
        assign_perm('renkanmanager.delete_renkan', instance)

def log_user_logged_in(sender, request, user, **kwargs):
    logger.debug("LOGGING IN: user logged in: %r", user)

def log_user_logged_out(sender, request, user, **kwargs):
    logger.debug("LOGGING OUT: DJANGO: user logged out: %r", user)

def token_updated(sender, instance, created, **kwargs):
    from allauth.socialaccount.models import SocialToken
    if sender == SocialToken:
        logger.debug("TOKEN: SocialToken saved")
        logger.debug("TOKEN: Token created: %r", created)
    
if not 'test' in sys.argv:
    post_save.connect(reference_created_renkan)
post_save.connect(token_updated)
post_save.connect(assign_objects_permissions)
post_save.connect(assign_user_permissions)
user_logged_in.connect(log_user_logged_in)
user_logged_out.connect(log_user_logged_out)