def test_InitAsList(self): ctx_act = ContextActivities( category=ActivityList([Activity(id='categoryList')]), parent=ActivityList([Activity(id='parentList')]), grouping=ActivityList([Activity(id='groupingList')]), other=ActivityList([Activity(id='otherList')])) self.listVerificationHelper(ctx_act)
def get_context_activities(self, event): parent_activities = [ Activity( id='{}/courses/{}'.format(settings.OPENEDX_PLATFORM_URI, event['context']['course_id']), definition=course.CourseActivityDefinition(event) ), ] # browser source events don't know as much about their context if event['event_source'].lower() == 'server': parent_activities.append( Activity( id=event['referer'], definition=BlockActivityDefinition(event) ), ) other_activities = [ Activity( id=event['referer'], definition=base.ReferringActivityDefinition(event) ), ] return ContextActivities( parent=ActivityList(parent_activities), other=ActivityList(other_activities) )
def answer_evaluation_on_criterion(cls, answer, comparison_criterion, **kwargs): context = cls.basic(**kwargs) context.context_activities = ContextActivities( # parent is answer + criterion parent=ActivityList([ Activity(id=XAPIResourceIRI.answer(answer.uuid)), Activity(id=XAPIResourceIRI.criterion( comparison_criterion.criterion_uuid)) ]), # grouping is course + assignment + assignment question grouping=ActivityList([ Activity(id=XAPIResourceIRI.course(answer.course_uuid)), Activity( id=XAPIResourceIRI.assignment(answer.assignment_uuid)), Activity(id=XAPIResourceIRI.assignment_question( answer.assignment_uuid)) ]), # other is comparison + comparison question other=ActivityList([ Activity(id=XAPIResourceIRI.comparison_criterion( comparison_criterion.uuid)), Activity(id=XAPIResourceIRI.comparison( comparison_criterion.comparison_uuid)), Activity(id=XAPIResourceIRI.comparison_question( comparison_criterion.comparison_uuid)) ])) return context
def test_extend(self): a1 = Activity(id='test1', object_type='Activity') a2 = Activity(id='test2', object_type='Activity') arglist = ActivityList([a1, a2]) alist = ActivityList([Activity(id='test3')]) alist.extend(arglist) self.assertEqual(len(alist), 3) self.assertEqual(alist[0].id, 'test3') self.assertEqual(alist[1].id, 'test1') self.assertEqual(alist[2].id, 'test2')
def assignment_question(cls, assignment, **kwargs): context = cls.basic(**kwargs) context.context_activities = ContextActivities( # parent is assignment parent=ActivityList([XAPIObject.assignment(assignment)]), # grouping is course grouping=ActivityList([XAPIObject.course(assignment.course)])) cls._add_sis_data(context, assignment.course) return context
def assignment_question(cls, assignment, **kwargs): context = cls.basic(**kwargs) context.context_activities = ContextActivities( # parent is assignment parent=ActivityList( [Activity(id=XAPIResourceIRI.assignment(assignment.uuid))]), # grouping is course grouping=ActivityList( [Activity(id=XAPIResourceIRI.course(assignment.course_uuid))])) return context
def answer_attachment(cls, answer, **kwargs): context = cls.basic(**kwargs) context.context_activities = ContextActivities( # parent is assignment answer parent=ActivityList([XAPIObject.answer(answer)]), # grouping is course + assignment + assignment question grouping=ActivityList([ XAPIObject.assignment_question(answer.assignment), XAPIObject.assignment(answer.assignment), XAPIObject.course(answer.assignment.course) ])) cls._add_sis_data(context, answer.assignment.course) return context
def test_InitAsEither(self): ctx_act = ContextActivities( category=ActivityList([Activity(id='categoryList')]), parent=Activity(id='parentActivity'), grouping=ActivityList([Activity(id='groupingList')]), other=Activity(id='otherActivity')) self.assertIsInstance(ctx_act, ContextActivities) self.assertIsInstance(ctx_act.category, ActivityList) self.assertEqual(ctx_act.category[0].id, 'categoryList') self.assertIsInstance(ctx_act.parent, ActivityList) self.assertEqual(ctx_act.parent[0].id, 'parentActivity') self.assertIsInstance(ctx_act.grouping, ActivityList) self.assertEqual(ctx_act.grouping[0].id, 'groupingList') self.assertIsInstance(ctx_act.other, ActivityList) self.assertEqual(ctx_act.other[0].id, 'otherActivity')
def test_ToJSON(self): alist = ActivityList([{"id": "test1"}, {"id": "test2"}]) self.assertEqual( json.loads(alist.to_json()), json.loads( '[{"id": "test1", "objectType": "Activity"}, {"id": "test2", "objectType": "Activity"}]' ))
def get_context_activities(self): """ Get context activities for xAPI transformed event. Returns: `ContextActivities` """ if self.get_data('context.course_id') is not None: course = get_course_from_id(self.get_data('context.course_id')) course_name = LanguageMap({constants.EN_US: course["display_name"]}) parent_activities = [ Activity( id=self.get_object_iri('course', self.get_data('context.course_id')), object_type=constants.XAPI_ACTIVITY_COURSE, definition=ActivityDefinition( type=constants.XAPI_ACTIVITY_COURSE, name=course_name ) ), ] return ContextActivities( parent=ActivityList(parent_activities), ) else: return None
def test_AsVersionNotEmpty(self): a1 = Activity(id='test1', object_type='Activity') a2 = Activity(id='test2', object_type='Activity') alist = ActivityList([a1, a2]) check = alist.as_version() self.assertEqual(check, [{"id": "test1", "objectType": "Activity"}, {"id": "test2", "objectType": "Activity"}])
def test_setItemException(self): a1 = Activity(id='test1', object_type='Activity') a2 = Activity(id='test2', object_type='Activity') alist = ActivityList([a1, a2]) with self.assertRaises(TypeError): alist[0] = 'not Activity' self.listVerificationHelper(alist)
def test_appendItem(self): a1 = Activity(id='test1', object_type='Activity') a2 = Activity(id='test2', object_type='Activity') alist = ActivityList() alist.append(a1) alist.append(a2) self.listVerificationHelper(alist)
def answer(cls, answer, **kwargs): context = cls.basic(**kwargs) context.context_activities = ContextActivities( # parent is assignment question parent=ActivityList([ Activity(id=XAPIResourceIRI.assignment_question( answer.assignment_uuid)) ]), # grouping is course + assignment grouping=ActivityList([ Activity(id=XAPIResourceIRI.course(answer.course_uuid)), Activity(id=XAPIResourceIRI.assignment(answer.assignment_uuid)) ])) return context
def self_evaluation_question(cls, answer_comment, **kwargs): context = cls.basic(**kwargs) context.context_activities = ContextActivities( # parent is assignment + answer parent=ActivityList([ Activity(id=XAPIResourceIRI.assignment( answer_comment.assignment_uuid)), Activity(id=XAPIResourceIRI.answer(answer_comment.answer_uuid)) ]), # grouping is course grouping=ActivityList([ Activity(id=XAPIResourceIRI.course(answer_comment.course_uuid)) ])) return context
def comparison_attempt(cls, comparison, current_comparison, **kwargs): context = cls.basic(**kwargs) context.context_activities = ContextActivities( # parent is comparison question + criterion parent=ActivityList([ XAPIObject.comparison_question(comparison.assignment, current_comparison) ]), # grouping is course + assignment + answer1 + answer2 grouping=ActivityList([ XAPIObject.assignment(comparison.assignment), XAPIObject.course(comparison.assignment.course) ]) ) cls._add_sis_data(context, comparison.assignment.course) return context
def self_evaluation_attempt(cls, answer_comment, **kwargs): context = cls.basic(**kwargs) context.context_activities = ContextActivities( # parent is assignment parent=ActivityList([ XAPIObject.self_evaluation_question(answer_comment.answer.assignment) ]), # grouping is course grouping=ActivityList([ XAPIObject.assignment(answer_comment.answer.assignment), XAPIObject.course(answer_comment.answer.assignment.course) ]) ) cls._add_sis_data(context, answer_comment.answer.assignment.course) return context
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 answer_evaluation(cls, answer, comparison, **kwargs): context = cls.answer(answer, **kwargs) context.context_activities.other = ActivityList([ Activity(id=XAPIResourceIRI.comparison(comparison.uuid)), Activity(id=XAPIResourceIRI.comparison_question(comparison.uuid)) ]) return context
def assignment(cls, assignment, **kwargs): context = cls.basic(**kwargs) context.context_activities = ContextActivities( # parent is course parent=ActivityList( [Activity(id=XAPIResourceIRI.course(assignment.course_uuid))])) return context
def assignment(cls, assignment, **kwargs): context = cls.basic(**kwargs) context.context_activities = ContextActivities( # parent is course parent=ActivityList([XAPIObject.course(assignment.course)])) cls._add_sis_data(context, assignment.course) return context
def test_insert(self): a1 = Activity(id='test1', object_type='Activity') a2 = Activity(id='test3') alist = ActivityList([a1, a2]) alist.insert(1, Activity(id='test2', object_type='Activity')) self.assertEqual(len(alist), 3) self.assertEqual(alist[0].id, 'test1') self.assertEqual(alist[1].id, 'test2') self.assertEqual(alist[2].id, 'test3')
def get_context_activities(self, event): parent_activities = [ Activity(id='{}/courses/{}'.format(settings.OPENEDX_PLATFORM_URI, event['context']['course_id']), definition=course.CourseActivityDefinition(event)), Activity(id=event['referer'], definition=block.BlockActivityDefinition(event)) ] return ContextActivities(parent=ActivityList(parent_activities))
def comparison(cls, comparison, **kwargs): context = cls.basic(**kwargs) context.context_activities = ContextActivities( # parent is comparison question + criterion parent=ActivityList([ Activity( id=XAPIResourceIRI.comparison_question(comparison.uuid)) ]), # grouping is course + assignment + answer1 + answer2 grouping=ActivityList([ Activity(id=XAPIResourceIRI.course(comparison.course_uuid)), Activity( id=XAPIResourceIRI.assignment(comparison.assignment_uuid)), Activity(id=XAPIResourceIRI.answer(comparison.answer1_uuid)), Activity(id=XAPIResourceIRI.answer(comparison.answer2_uuid)) ])) return context
def answer(cls, answer, **kwargs): context = cls.basic(**kwargs) context.context_activities = ContextActivities( # parent is assignment question parent=ActivityList( [XAPIObject.assignment_question(answer.assignment)]), # grouping is course + assignment grouping=ActivityList([ XAPIObject.assignment(answer.assignment), XAPIObject.course(answer.assignment.course) ])) if answer.attempt_uuid: context.context_activities.parent.append( XAPIObject.answer_attempt(answer)) cls._add_sis_data(context, answer.assignment.course) return context
def evaluation_response(cls, answer_comment, evaluation_number, **kwargs): context = cls.basic(**kwargs) context.context_activities = ContextActivities( # parent is assignment parent=ActivityList([ XAPIObject.evaluation_question(answer_comment.answer.assignment, evaluation_number), XAPIObject.answer(answer_comment.answer) ]), # grouping is course grouping=ActivityList([ XAPIObject.assignment(answer_comment.answer.assignment), XAPIObject.course(answer_comment.answer.assignment.course) ]) ) if answer_comment.attempt_uuid and evaluation_number: context.context_activities.parent.append(XAPIObject.evaluation_attempt(answer_comment, evaluation_number)) cls._add_sis_data(context, answer_comment.answer.assignment.course) return context
def self_evaluation_response(cls, answer_comment, **kwargs): context = cls.basic(**kwargs) context.context_activities = ContextActivities( # parent is self-evaulation question parent=ActivityList([ XAPIObject.self_evaluation_question(answer_comment.answer.assignment), XAPIObject.answer(answer_comment.answer) ]), # grouping is course + assignment + answer grouping=ActivityList([ XAPIObject.assignment(answer_comment.answer.assignment), XAPIObject.course(answer_comment.answer.assignment.course) ]) ) if answer_comment.attempt_uuid: context.context_activities.parent.append(XAPIObject.self_evaluation_attempt(answer_comment)) cls._add_sis_data(context, answer_comment.answer.assignment.course) return context
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 get_context_activities(self, event): parent_activities = [ Activity(id='{}/courses/{}'.format(settings.OPENEDX_PLATFORM_URI, event['context']['course_id']), definition=course.CourseActivityDefinition(event)), ] parent = settings.OPENEDX_PLATFORM_URI + ':18010/container/' + event[ 'context']['parent']['usage_key'] #parent = event['context']['parent']['usage_key'] #FOR TEST parent_activities.append( Activity(id=parent, definition=block.BlockAssessmentDefinition( event['context']['parent'])), ) return ContextActivities(parent=ActivityList(parent_activities))
def _add_sis_data(cls, context, course): if course.lti_has_sis_data: if not context.context_activities: context.context_activities = ContextActivities() if not context.context_activities.grouping: context.context_activities.grouping = ActivityList() sis_data = course.lti_sis_data context.extensions = Extensions() if not context.extensions else context.extensions context.extensions['sis_courses'] = [] for sis_course_id, sis_section_ids in sis_data.items(): context.extensions['sis_courses'].append({ 'id': sis_course_id, 'section_ids': sis_section_ids })