server/src/metaeducation/tracking/middleware.py
author ymh <ymh.work@gmail.com>
Tue, 05 Jul 2016 13:19:38 +0200
changeset 77 06f627e804b6
child 78 8e1440b83f0c
permissions -rw-r--r--
add tracking of renkan create, delete and update
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
77
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
import logging
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
import uuid
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
from django.db.models.signals import pre_delete, post_save
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
from django.utils.functional import curry
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
from renkanmanager.models import Renkan, Revision
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
from . import send_delete_renkan, send_create_renkan, send_update_renkan
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
logger = logging.getLogger(__name__)
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
class TrackingMiddleware(object):
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
    def process_request(self, request):
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
        if not request.method in ('GET', 'HEAD', 'OPTIONS', 'TRACE'):
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
            if hasattr(request, 'user') and request.user.is_authenticated():
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
                user = request.user.external_id
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
            else:
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
                user = None
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
            request.renkan_request_id = uuid.uuid4()
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
            pre_delete.connect(curry(self.renkan_delete, user), sender=Renkan, dispatch_uid = (self.__class__,  request.renkan_request_id,), weak=False)
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
            post_save.connect(curry(self.revision_save, user), sender=Revision, dispatch_uid = (self.__class__,  request.renkan_request_id,), weak=False)
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
    def process_response(self, request, response):
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
        if hasattr(request, 'renkan_request_id'):
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
            pre_delete.disconnect(dispatch_uid =  (self.__class__,  request.renkan_request_id,))
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
            post_save.disconnect(dispatch_uid =  (self.__class__,  request.renkan_request_id,))
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
        return response
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
    def process_exception(self, request, exception):
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
        if hasattr(request, 'renkan_request_id'):
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
            pre_delete.disconnect(dispatch_uid =  (self.__class__,  request.renkan_request_id,))
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
            post_save.disconnect(dispatch_uid =  (self.__class__,  request.renkan_request_id,))
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
        return None
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
    def process_view(self, request, view_func, view_args, view_kwargs):
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
        if view_func.__name__ == 'RenkanDetail' and view_func.__module__ == 'renkanmanager.api.views' and request.method == 'PUT' and 'renkan_guid' in view_kwargs:
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
            if hasattr(request, 'user') and request.user.is_authenticated():
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
                user = request.user.external_id
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
            else:
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
                user = None
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
            send_update_renkan(None, user, request.body.decode('utf-8'))
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
        return None
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
    def renkan_delete(self, user, sender, **kwargs):
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
        renkan = kwargs.get('instance', None)
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
        if not renkan:
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
            return
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
        send_delete_renkan(renkan, user)
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
    def revision_save(self, user, sender, **kwargs):
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
        revision = kwargs.get('instance', None)
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
        if not revision:
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
            return
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
        if kwargs.get('created', False) and revision.parent_renkan.revision_count <= 1:
06f627e804b6 add tracking of renkan create, delete and update
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
            send_create_renkan(revision.parent_renkan, user)