decorators.py 1.96 KB
Newer Older
1 2 3
"""
Decorators related to edXNotes.
"""
4

5
import json
6 7 8

from django.conf import settings

9
from edxnotes.helpers import (
10
    get_edxnotes_id_token,
11
    get_public_endpoint,
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
    get_token_url,
    generate_uid,
    is_feature_enabled,
)
from edxmako.shortcuts import render_to_string


def edxnotes(cls):
    """
    Decorator that makes components annotatable.
    """
    original_get_html = cls.get_html

    def get_html(self, *args, **kwargs):
        """
        Returns raw html for the component.
        """
        is_studio = getattr(self.system, "is_author_mode", False)
        course = self.descriptor.runtime.modulestore.get_course(self.runtime.course_id)

        # Must be disabled:
        # - in Studio;
        # - when Harvard Annotation Tool is enabled for the course;
        # - when the feature flag or `edxnotes` setting of the course is set to False.
        if is_studio or not is_feature_enabled(course):
            return original_get_html(self, *args, **kwargs)
        else:
            return render_to_string("edxnotes_wrapper.html", {
                "content": original_get_html(self, *args, **kwargs),
                "uid": generate_uid(),
                "edxnotes_visibility": json.dumps(
                    getattr(self, 'edxnotes_visibility', course.edxnotes_visibility)
                ),
                "params": {
                    # Use camelCase to name keys.
                    "usageId": unicode(self.scope_ids.usage_id).encode("utf-8"),
                    "courseId": unicode(self.runtime.course_id).encode("utf-8"),
49
                    "token": get_edxnotes_id_token(self.runtime.get_real_user(self.runtime.anonymous_student_id)),
50
                    "tokenUrl": get_token_url(self.runtime.course_id),
51
                    "endpoint": get_public_endpoint(),
52
                    "debug": settings.DEBUG,
53
                    "eventStringLimit": settings.TRACK_MAX_EVENT / 6,
54 55 56 57 58
                },
            })

    cls.get_html = get_html
    return cls