middleware.py 1.61 KB
Newer Older
1 2 3 4
"""
Middleware for user api.
Adds user's tags to tracking event context.
"""
5 6 7
from track.contexts import COURSE_REGEX
from eventtracking import tracker
from user_api.models import UserCourseTag
8
from opaque_keys.edx.locations import SlashSeparatedCourseKey
9

10

11
class UserTagsEventContextMiddleware(object):
12
    """Middleware that adds a user's tags to tracking event context."""
13 14 15 16 17 18 19 20 21 22
    CONTEXT_NAME = 'user_tags_context'

    def process_request(self, request):
        """
        Add a user's tags to the tracking event context.
        """
        match = COURSE_REGEX.match(request.build_absolute_uri())
        course_id = None
        if match:
            course_id = match.group('course_id')
23
            course_key = SlashSeparatedCourseKey.from_deprecated_string(course_id)
24 25 26 27 28 29 30 31 32 33

        context = {}

        if course_id:
            context['course_id'] = course_id

            if request.user.is_authenticated():
                context['course_user_tags'] = dict(
                    UserCourseTag.objects.filter(
                        user=request.user.pk,
34
                        course_id=course_key,
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
                    ).values_list('key', 'value')
                )
            else:
                context['course_user_tags'] = {}

        tracker.get_tracker().enter_context(
            self.CONTEXT_NAME,
            context
        )

    def process_response(self, request, response):  # pylint: disable=unused-argument
        """Exit the context if it exists."""
        try:
            tracker.get_tracker().exit_context(self.CONTEXT_NAME)
        except:  # pylint: disable=bare-except
            pass

52
        return response