Beispiel #1
0
    def _add_default(cls, user, statement):
        if not statement.timestamp:
            statement.timestamp = datetime.datetime.now().replace(
                tzinfo=pytz.utc).isoformat()

        if impersonation.is_impersonating() and user.id == current_user.id:
            statement.actor = XAPIActor.generate_actor(
                impersonation.get_impersonation_original_user())
        else:
            statement.actor = XAPIActor.generate_actor(user)

        # add default context info
        if not statement.context:
            statement.context = Context()

        if not statement.context.context_activities:
            statement.context.context_activities = ContextActivities()

        if not statement.context.context_activities.category:
            statement.context.context_activities.category = ActivityList()

        statement.context.context_activities.category.append(
            XAPIActivity.compair_source())

        statement.context.platform = XAPIResourceIRI.compair()

        if request and request.environ.get('HTTP_USER_AGENT'):
            if not statement.context.extensions:
                statement.context.extensions = Extensions()
            browser_info_key = XAPIExtension.context_extensions.get(
                'browser information')
            statement.context.extensions[
                browser_info_key] = request.environ.get('HTTP_USER_AGENT')

        if request and request.environ.get('HTTP_REFERER'):
            if not statement.context.extensions:
                statement.context.extensions = Extensions()
            referer_key = XAPIExtension.context_extensions.get('referer')
            statement.context.extensions[referer_key] = request.environ.get(
                'HTTP_REFERER')

        if impersonation.is_impersonating() and user.id == current_user.id:
            if not statement.context.extensions:
                statement.context.extensions = Extensions()
            impersonating_as_key = XAPIExtension.context_extensions.get(
                'impersonating as')
            statement.context.extensions[
                impersonating_as_key] = XAPIActor.generate_actor(user)

        return statement
Beispiel #2
0
    def comparison(cls, comparison, **kwargs):
        result = cls.basic_attempt(comparison, None, **kwargs)
        result.extensions = Extensions() if not result.extensions else result.extensions

        winner = "Undecided"
        if comparison.winner == WinningAnswer.draw:
            winner = "Draw"
        elif comparison.winner == WinningAnswer.answer1:
            winner = ResourceIRI.answer(comparison.course_uuid, comparison.assignment_uuid, comparison.answer1_uuid)
        elif comparison.winner == WinningAnswer.answer2:
            winner = ResourceIRI.answer(comparison.course_uuid, comparison.assignment_uuid, comparison.answer2_uuid)
        result.response = winner

        result.extensions['http://xapi.learninganalytics.ubc.ca/extension/criteria'] = {}
        for comparison_criterion in comparison.comparison_criteria:
            winner = "Undecided"
            if comparison_criterion.winner == WinningAnswer.answer1:
                winner = ResourceIRI.answer(comparison.course_uuid, comparison.assignment_uuid, comparison.answer1_uuid)
            elif comparison_criterion.winner == WinningAnswer.answer2:
                winner = ResourceIRI.answer(comparison.course_uuid, comparison.assignment_uuid, comparison.answer2_uuid)

            result.extensions['http://xapi.learninganalytics.ubc.ca/extension/criteria'][
                ResourceIRI.criterion(comparison_criterion.criterion_uuid)] = winner

        return result
Beispiel #3
0
    def sendstatement_tally_shared(self, conn, tally_obj):
        # self._SC._active_presentation_name   and tally_obj['id'] give me the id.
        # self._presentation_activity_id = 'https://iltserver.com/presentations/' + presentation_slug
        tally_activity_id = 'https://iltserver.com/presentations/' + self._SC._active_presentation_name + '/interaction_stats/' + tally_obj[
            'id']

        verb = Verb(
            id='http://adlnet.gov/expapi/verbs/shared',
            display=LanguageMap({'en-US': 'shared'}),
        )

        obj = Activity(
            id=tally_activity_id,
            definition=ActivityDefinition(
                name=LanguageMap({'en-US': 'Interaction statistics'}),
                description=LanguageMap({
                    'en-US':
                    'Statistics about the responses to an interaction in the Reveal JS presentation.'
                }),
                type=
                'https://xapi.xapicohort.org/iltxapiteam/activity-types/interaction-stats'
            ),
        )
        result_obj = Result(extensions=Extensions({
            'https://iltserver.com/extensions/interaction-response-info':
            tally_obj
        }))
        statement = Statement(actor=conn._actor,
                              verb=verb,
                              object=obj,
                              result=result_obj)
        self._send_to_LRS(statement)
Beispiel #4
0
    def answer_evaluation(cls, answer, score, **kwargs):
        from compair.models import ScoringAlgorithm

        result = cls.basic(**kwargs)
        result.extensions = Extensions(
        ) if not result.extensions else result.extensions

        result.score = Score(raw=score.score)

        score_details = {
            'algorithm': score.scoring_algorithm.value,
            'wins': score.wins,
            'loses': score.loses,
            'rounds': score.rounds,
            'opponents': score.opponents,
        }

        if score.scoring_algorithm == ScoringAlgorithm.comparative_judgement:
            result.score.min = 0.0
            result.score.max = 1.0
            score_details['expected score'] = score.variable1

        elif score.scoring_algorithm == ScoringAlgorithm.true_skill:
            score_details['mu'] = score.variable1
            score_details['sigma'] = score.variable2

        result.extensions[XAPIExtension.result_extensions.get(
            'score details')] = score_details

        return result
Beispiel #5
0
    def _add_default(cls, user, statement):
        if not statement.timestamp:
            statement.timestamp = LearningRecord.generate_timestamp()

        if impersonation.is_impersonating() and user.id == current_user.id:
            statement.actor = XAPIActor.generate_actor(
                impersonation.get_impersonation_original_user())
        else:
            statement.actor = XAPIActor.generate_actor(user)

        # add default context info
        if not statement.context:
            statement.context = Context()

        if not statement.context.context_activities:
            statement.context.context_activities = ContextActivities()

        if not statement.context.context_activities.category:
            statement.context.context_activities.category = ActivityList()

        statement.context.context_activities.category.append(
            XAPIActivity.compair_source())

        statement.context.platform = ResourceIRI.compair()
        if not statement.context.extensions:
            statement.context.extensions = Extensions()

        statement.context.extensions[
            'http://id.tincanapi.com/extension/session-info'] = {
                'id': ResourceIRI.user_session(sess.get('session_id', '')),
                'start_at': sess.get('start_at'),
                'login_method': sess.get('login_method'),
            }
        if sess.get('end_at'):
            statement.context.extensions[
                'http://id.tincanapi.com/extension/session-info'][
                    'end_at'] = sess.get('end_at')

        if impersonation.is_impersonating() and user.id == current_user.id:
            statement.context.extensions[
                'http://id.tincanapi.com/extension/session-info'][
                    'impersonating-as'] = XAPIActor.generate_actor(
                        user).as_version()

        statement.context.extensions[
            'http://id.tincanapi.com/extension/browser-info'] = {}

        if request and request.environ.get('HTTP_USER_AGENT'):
            statement.context.extensions[
                'http://id.tincanapi.com/extension/browser-info'][
                    'user-agent'] = request.environ.get('HTTP_USER_AGENT')

        if request and request.environ.get('HTTP_REFERER'):
            statement.context.extensions[
                'http://id.tincanapi.com/extension/browser-info'][
                    'referer'] = request.environ.get('HTTP_REFERER')

        return statement
    def test_serialize_deserialize(self):
        ext = Extensions()
        ext['http://example.com/string'] = 'extensionValue'
        ext['http://example.com/int'] = 10
        ext['http://example.com/double'] = 1.897

        # ext['http://example.com/object'] = get_agent('Random', 'mbox', 'mailto:[email protected]')

        self.assertSerializeDeserialize(ext)
Beispiel #7
0
 def get_context(self, event):
     # Show transcript and hide transcript only offer currentTime as context data.
     # TODO: get language from Video XBlock events at least, once available
     context = super(VideoTranscriptStatement, self).get_context(event)
     context.extensions = Extensions({
         constants.XAPI_CONTEXT_VIDEO_CC_LANGUAGE:
         "en"  # we don't get this info from tracking log
     })
     return context
Beispiel #8
0
    def login(cls, login_method, **kwargs):
        context = cls.basic(**kwargs)

        if login_method:
            context.extensions = Extensions()
            context.extensions[XAPIExtension.context_extensions.get(
                'login method')] = login_method

        return context
    def test_serialize_deserialize_init(self):
        data = {
            'http://example.com/string': 'extensionValue',
            'http://example.com/int': 10,
            'http://example.com/double': 1.897,
            # 'http://example.com/object': get_agent('Random', 'mbox', 'mailto:[email protected]'),
        }

        ext = Extensions(data)
        self.assertSerializeDeserialize(ext)
Beispiel #10
0
 def get_context(self, user_details, course_details):
     """
     Get Context for the statement.
     """
     return Context(extensions=Extensions(
         {
             'http://id.tincanapi.com/extension/user-details': user_details,
             'http://id.tincanapi.com/extension/course-details':
             course_details,
         }, ))
Beispiel #11
0
    def report(cls, file_name, mimetype):
        activity = Activity(id=ResourceIRI.report(file_name),
                            definition=ActivityDefinition(
                                type=XAPIActivity.activity_types.get('file'),
                                name=LanguageMap({'en-US': file_name}),
                                extensions=Extensions()))
        activity.definition.extensions[
            'http://id.tincanapi.com/extension/mime-type'] = mimetype

        return activity
Beispiel #12
0
    def answer(cls, answer):
        activity = Activity(
            id=ResourceIRI.answer(answer.course_uuid, answer.assignment_uuid,
                                  answer.uuid),
            definition=ActivityDefinition(
                type=XAPIActivity.activity_types.get('solution'),
                extensions=Extensions()))
        activity.definition.extensions[
            'http://id.tincanapi.com/extension/isDraft'] = answer.draft

        return activity
Beispiel #13
0
    def assignment_attachment(cls, file, mimetype):
        activity = Activity(
            id=ResourceIRI.attachment(file.name),
            definition=ActivityDefinition(
                type=XAPIActivity.activity_types.get('file'),
                name=LanguageMap({'en-US': file.alias if file.alias else ""}),
                extensions=Extensions()))
        activity.definition.extensions[
            'http://id.tincanapi.com/extension/mime-type'] = mimetype

        return activity
Beispiel #14
0
 def get_context(self, event):
     context = super(VideoCompleteStatement, self).get_context(event)
     event_data = self.get_event_data(event)
     cur_time = event_data.get('currentTime',
                               event_data.get('current_time', 0))
     context.extensions = Extensions({
         #  length will be same as current time once stopped
         constants.XAPI_CONTEXT_VIDEO_LENGTH:
         cur_time
     })
     return context
Beispiel #15
0
    def get_result(self):
        """
        Get result for xAPI transformed event.

        Returns:
            `Result`
        """
        return Result(extensions=Extensions({
            constants.XAPI_RESULT_VIDEO_TIME:
            convert_seconds_to_float(self.get_data('data.currentTime'))
        }))
Beispiel #16
0
    def answer(cls, answer, **kwargs):
        result = cls.basic_content(answer.content, **kwargs)

        if kwargs:
            if kwargs.get('includeAttachment') != None and answer.file:
                result.extensions = Extensions(
                ) if not result.extensions else result.extensions
                file_iri = XAPIResourceIRI.attachment(answer.file.name)
                result.extensions[XAPIExtension.result_extensions.get(
                    'attachment response')] = file_iri

        return result
Beispiel #17
0
    def compair(cls):
        activity = Activity(
            id=ResourceIRI.compair(),
            definition=ActivityDefinition(
                type=XAPIActivity.activity_types.get('service'),
                name=LanguageMap({'en-US': "ComPAIR"}),
                extensions=Extensions()))
        activity.definition.extensions[
            'http://id.tincanapi.com/extension/version'] = current_app.config.get(
                'COMPAIR_VERSION')

        return activity
Beispiel #18
0
 def sendstatement_unlocked_followme(self, conn):
     # the object of this statement is the presentation, in the context of session
     verb = Verb(
         id='http://adlnet.gov/expapi/verbs/interacted',
         display=LanguageMap({'en-US': 'interacted'}),
     )
     result_obj = Result(extensions=Extensions(
         {'https://iltserver.com/extensions/follow-me': 'off'}))
     statement = Statement(actor=conn._actor,
                           verb=verb,
                           object=self._presentation_object,
                           result=result_obj)
     self._send_to_LRS(statement)
Beispiel #19
0
 def test_InitAll(self):
     ctx = Context(
         registration=uuid.uuid4(),
         instructor=Group(member=[Agent(name='instructorGroupMember')]),
         team=Group(member=[Agent(name='teamGroupMember')]),
         context_activities=ContextActivities(category=Activity(
             id='contextActivityCategory')),
         revision='revision',
         platform='platform',
         language='en-US',
         statement=StatementRef(id='016699c6-d600-48a7-96ab-86187498f16f'),
         extensions=Extensions({'extensions': 'extend!'}))
     self.ctxVerificationHelper(ctx)
Beispiel #20
0
    def self_evaluation_response(cls, answer_comment):
        activity = Activity(
            id=ResourceIRI.self_evaluation_response(
                answer_comment.course_uuid, answer_comment.assignment_uuid,
                answer_comment.answer_uuid, answer_comment.uuid),
            definition=ActivityDefinition(
                type=XAPIActivity.activity_types.get('solution'),
                extensions=Extensions()))

        activity.definition.extensions[
            'http://id.tincanapi.com/extension/isDraft'] = answer_comment.draft

        return activity
Beispiel #21
0
    def basic(cls, **kwargs):
        result = Result()

        if kwargs:
            if kwargs.get('success') != None:
                result.success = kwargs.get('success')
            if kwargs.get('completion') != None:
                result.completion = kwargs.get('completion')
            if kwargs.get('changes') != None:
                result.extensions = Extensions() if not result.extensions else result.extensions
                result.extensions['http://xapi.learninganalytics.ubc.ca/extension/changes'] = kwargs.get('changes')

        return result
Beispiel #22
0
    def get_result(self):
        """
        Get result for xAPI transformed event.

        Returns:
            `Result`
        """
        return Result(extensions=Extensions({
            constants.XAPI_RESULT_VIDEO_TIME_FROM:
            convert_seconds_to_float(self.get_data('data.old_time')),
            constants.XAPI_RESULT_VIDEO_TIME_TO:
            convert_seconds_to_float(self.get_data('data.new_time')),
        }), )
Beispiel #23
0
    def assignment_attempt(cls, assignment, attempt_mixin_object):
        activity = Activity(
            id=ResourceIRI.assignment_attempt(
                assignment.course_uuid, assignment.uuid,
                attempt_mixin_object.attempt_uuid),
            definition=ActivityDefinition(
                type=XAPIActivity.activity_types.get('attempt'),
                extensions=Extensions()))
        activity.definition.extensions[
            "http://id.tincanapi.com/extension/attempt"] = cls._basic_attempt(
                attempt_mixin_object)

        return activity
Beispiel #24
0
    def comparison_question(cls, comparison, comparison_number, pairing_algorithm):
        activity = Activity(
            id=XAPIResourceIRI.comparison_question(comparison.uuid),
            definition=ActivityDefinition(
                type=XAPIActivity.activity_types.get('question'),
                name=LanguageMap({ 'en-US': "Assignment comparison #"+str(int(comparison_number)) }),
                extensions=Extensions()
            )
        )

        activity.definition.extensions[XAPIExtension.object_extensions.get('comparison')] = comparison_number
        activity.definition.extensions[XAPIExtension.object_extensions.get('pair algorithm')] = pairing_algorithm

        return activity
Beispiel #25
0
    def comparison(cls, comparison):
        activity = Activity(
            id=ResourceIRI.comparison(comparison.course_uuid,
                                      comparison.assignment_uuid,
                                      comparison.uuid),
            definition=ActivityDefinition(
                type=XAPIActivity.activity_types.get('solution'),
                name=LanguageMap({'en-US': "Assignment comparison"}),
                extensions=Extensions()))

        activity.definition.extensions[
            'http://id.tincanapi.com/extension/completed'] = comparison.completed

        return activity
Beispiel #26
0
    def basic_content(cls, content, **kwargs):
        result = cls.basic(**kwargs)

        if content:
            result.response = LearningRecord.trim_text_to_size_limit(content)
            result.extensions = Extensions() if not result.extensions else result.extensions

            character_count = LearningRecord.character_count(content)
            result.extensions['http://xapi.learninganalytics.ubc.ca/extension/character-count'] = character_count

            word_count = LearningRecord.word_count(content)
            result.extensions['http://xapi.learninganalytics.ubc.ca/extension/word-count'] = word_count

        return result
Beispiel #27
0
    def get_result(self):
        """
        Get result for xAPI transformed event.

        Returns:
            `Result`
        """
        return Result(extensions=Extensions({
            constants.XAPI_RESULT_VIDEO_TIME:
            convert_seconds_to_float(self.get_data('data.duration'))
        }),
                      completion=True,
                      duration=convert_seconds_to_float(
                          self.get_data('data.duration')))
Beispiel #28
0
    def comparison_attempt(cls, comparison, current_comparison):
        activity = Activity(
            id=ResourceIRI.comparison_attempt(comparison.course_uuid,
                                              comparison.assignment_uuid,
                                              current_comparison,
                                              comparison.attempt_uuid),
            definition=ActivityDefinition(
                type=XAPIActivity.activity_types.get('attempt'),
                extensions=Extensions()))
        activity.definition.extensions[
            "http://id.tincanapi.com/extension/attempt"] = cls._basic_attempt(
                comparison)

        return activity
Beispiel #29
0
    def _add_default(cls, user, statement):
        if not statement.timestamp:
            statement.timestamp = datetime.datetime.now().replace(
                tzinfo=pytz.utc).isoformat()

        statement.actor = XAPIActor.generate_actor(user)

        # add default context info
        if not statement.context:
            statement.context = Context()

        if not statement.context.context_activities:
            statement.context.context_activities = ContextActivities()

        if not statement.context.context_activities.category:
            statement.context.context_activities.category = ActivityList()

        statement.context.context_activities.category.append(
            XAPIActivity.compair_source())

        if request and request.environ.get('HTTP_USER_AGENT'):
            if not statement.context.extensions:
                statement.context.extensions = Extensions()
            browser_info_key = XAPIExtension.context_extensions.get(
                'browser information')
            statement.context.extensions[
                browser_info_key] = request.environ.get('HTTP_USER_AGENT')

        if request and request.environ.get('HTTP_REFERER'):
            if not statement.context.extensions:
                statement.context.extensions = Extensions()
            referer_key = XAPIExtension.context_extensions.get('referer')
            statement.context.extensions[referer_key] = request.environ.get(
                'HTTP_REFERER')

        return statement
Beispiel #30
0
 def sendstatement_sync_all_to_instructor(self, conn):
     # the object of this statement is the presentation, in the context of session
     verb = Verb(
         id='http://adlnet.gov/expapi/verbs/interacted',
         display=LanguageMap({'en-US': 'interacted'}),
     )
     result_obj = Result(extensions=Extensions({
         'https://iltserver.com/extensions/sync-all-to-instructor':
         'request'
     }))
     statement = Statement(actor=conn._actor,
                           verb=verb,
                           object=self._presentation_object,
                           result=result_obj)
     self._send_to_LRS(statement)