server/src/metaeducation/tracking/messages.py
author ymh <ymh.work@gmail.com>
Sun, 24 Jul 2016 23:59:57 +0200
changeset 88 b523b73ae39d
parent 81 709541e05240
child 112 2ec47574a371
permissions -rw-r--r--
rationalize user parameter for messages

import datetime
import json
import logging
import pytz

from django.utils import six

from .tasks import send_tracking_data

logger = logging.getLogger(__name__)

def get_user_name(user):
    if not user:
        return 'n/a'
    if isinstance(user, six.string_types):
        return user
    try:
        if user.is_authenticated() and user.external_id:
            return str(user.external_id)
        else:
            return 'Anonymous'
    except:
        return 'anonymous'


def get_base_message(verb, renkan_id, current_user, registration = None):
    #create
    #open-read
    #open-edit
    #close
    #delete
    #update
    timestamp = datetime.datetime.utcnow().replace(tzinfo=pytz.utc)

    verbNode = {
        "create" : {
            "id": 'http://activitystrea.ms/schema/1.0/create',
            "display": { 'fr-FR': 'a créé' }
        },
        "update": {
            "id": 'http://activitystrea.ms/schema/1.0/update',
            "display": { 'fr-FR': 'a modifié' }
        },
        "delete": {
            "id": 'http://activitystrea.ms/schema/1.0/delete',
            "display": { 'fr-FR': 'a supprimé' }
        },
        "close": {
            "id": 'http://activitystrea.ms/schema/1.0/close',
            "display": { 'fr-FR': 'a fermé'}
        },
        "open_read": {
            "id": 'http://id.tincanapi.com/verb/viewed',
            "display": { 'fr-FR': 'a vu'}
        },
        "open_edit": {
            "id" : 'http://activitystrea.ms/schema/1.0/access',
            "display": { 'fr-FR': "a édité" }
        }
    }[verb];
    msg = {
        'actor': {
            'objectType': 'Agent',
            'name': get_user_name(current_user),
            'account': {
                'homePage': 'https://www.metaeducation.fr/Utilisateurs/',
                'name': get_user_name(current_user)
            }
        },
        'verb': verbNode,
        'object': {
            'objectType': 'Activity',
            'id': get_renkan_urn(renkan_id)
        },
        'context': {
            'extensions': {
                'http://liris.renkantracking.org/application': 'Outil carte mentale'
            }
        },
        'timestamp': timestamp.isoformat()
    };
    if registration:
        msg['context']['registration'] = registration

    return msg

def get_renkan_urn(renkan_id):
    return 'urn:mtdc:renkan:renkan:%s' % renkan_id;


def send_close_renkan(renkan, current_user, registration):
    msg = get_base_message('close', renkan.renkan_guid, current_user, registration)

    msg['object'] = {
        **(msg['object']),
        **{
            "definition": {
                "name": {
                    'fr-FR': renkan.title
                },
                "type": "http://www.w3.org/ns/activitystreams#Renkan",
                "extensions": {
                    'http://www.w3.org/ns/activitystreams#Data': json.loads(renkan.content),
                }
            }
        }
    }

    send_tracking_data.delay(msg)


def send_open_read_renkan(renkan, current_user, registration):
    msg = get_base_message('open_read', renkan.renkan_guid, current_user, registration)

    msg['object'] = {
        **(msg['object']),
        **{
            "definition": {
                "name": {
                    'fr-FR': renkan.title
                },
                "type": "http://www.w3.org/ns/activitystreams#Renkan",
                "extensions": {
                    'http://www.w3.org/ns/activitystreams#Data': json.loads(renkan.content),
                }
            }
        }
    }

    send_tracking_data.delay(msg)

def send_open_edit_renkan(renkan, current_user, registration):
    msg = get_base_message('open_edit', renkan.renkan_guid, current_user, registration)

    msg['object'] = {
        **(msg.get('object', {})),
        **{
            "definition": {
                "name": {
                    'fr-FR': renkan.title
                },
                "type": "http://www.w3.org/ns/activitystreams#Renkan",
                "extensions": {
                    'http://www.w3.org/ns/activitystreams#Data': json.loads(renkan.content),
                }
            }
        }
    }

    send_tracking_data.delay(msg)

def send_delete_renkan(renkan, current_user):
    content = json.loads(renkan.content)
    title = renkan.title
    renkan_guid = renkan.renkan_guid

    msg = get_base_message('delete', renkan_guid, current_user)
    msg['object'] = {
        **(msg.get('object',{})),
        **{
            "definition": {
                "name": {
                    'fr-FR': title
                },
                "type": "http://www.w3.org/ns/activitystreams#Renkan",
                "extensions": {
                    'http://www.w3.org/ns/activitystreams#Data': content,
                }
            }
        }
    }
    send_tracking_data.delay(msg)

# This must be called with a revision object containing the new content BEFORE the object save
def send_update_renkan(revision, current_user):
    renkan = revision.parent_renkan
    previousContent = json.loads(renkan.content)
    content = json.loads(revision.content)
    title = renkan.title
    renkan_guid = renkan.renkan_guid
    msg = get_base_message('update', renkan_guid, current_user)
    msg['object'] = {
        **(msg.get('object',{})),
        **{
            "definition": {
                "name": {
                    'fr-FR': title
                },
                "type": "http://www.w3.org/ns/activitystreams#Renkan",
                "extensions": {
                    'http://www.w3.org/ns/activitystreams#Data': content,
                    'http://www.w3.org/ns/activitystreams#previousData': previousContent,
                }
            }
        }
    }
    send_tracking_data.delay(msg)


def send_create_renkan(renkan, current_user):
    msg = get_base_message('create', renkan.renkan_guid, current_user)
    msg['object'] = {
        **(msg.get('object', {})),
        **{
            "definition": {
                "name": {
                    'fr-FR': renkan.title
                },
                "type": "http://www.w3.org/ns/activitystreams#Renkan",
                "extensions": {
                    'http://www.w3.org/ns/activitystreams#Data': json.loads(renkan.content),
                }
            }
        }
    }
    if renkan.source_revision:
        msg['context']['extensions'] = {
            **msg.get('context', {}).get('extensions', {}),
            **{
                'http://liris.renkantracking.org/fromCreate': {'renkan': renkan.source_revision.parent_renkan.renkan_guid, 'revision': renkan.source_revision.revision_guid}
            }
        }
    send_tracking_data.delay(msg)