server/src/metaeducation/tracking/messages.py
author ymh <ymh.work@gmail.com>
Tue, 05 Jul 2016 14:03:55 +0200
changeset 78 8e1440b83f0c
parent 77 06f627e804b6
child 81 709541e05240
permissions -rw-r--r--
put task under celery for better perf management

import datetime
import json
import logging
import pytz
import functools

from .tasks import send_tracking_data

logger = logging.getLogger(__name__)


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': current_user,
            'account': {
                'homePage': 'https://www.metaeducation.fr/Utilisateurs/',
                '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_operation_renkan(action, renkan, current_user, content=None):
    if not content:
        content = json.loads(renkan.content)
        title = renkan.title
        renkan_guid = renkan.renkan_guid
    else:
        content = json.loads(content)
        title = content.get('title', '')
        renkan_guid = content.get('id', content.get('_id', ''))
    msg = get_base_message(action, 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)


send_delete_renkan = functools.partial(_send_operation_renkan, 'delete')
send_update_renkan = functools.partial(_send_operation_renkan, 'update')

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)