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
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
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)
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
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)
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
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)
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, }, ))
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
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
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
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
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')) }))
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
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
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)
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)
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
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
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')), }), )
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
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
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
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
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')))
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
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
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)