Exemple #1
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
Exemple #2
0
    def membership(cls, course, user):
        roles = []
        extensions = {}

        course_role = user.get_course_role(course.id)
        if course_role in [
                CourseRole.instructor, CourseRole.teaching_assistant
        ]:
            roles.append("Instructor")
        if course_role == CourseRole.teaching_assistant:
            roles.append("Instructor#TeachingAssistant")
        if course_role == CourseRole.student:
            roles.append("Learner")
        if user.system_role == SystemRole.sys_admin:
            roles.append("Administrator")

        if course.lti_has_sis_data:
            sis_data = course.lti_sis_data
            extensions['sis_courses'] = []
            for sis_course_id, sis_section_ids in sis_data.items():
                extensions['sis_courses'].append({
                    'id': sis_course_id,
                    'section_ids': sis_section_ids
                })

        return caliper.entities.Membership(
            id=ResourceIRI.user_membership(course.uuid, user.uuid),
            member=CaliperActor.generate_actor(user),
            organization=ResourceIRI.course(course.uuid),
            roles=roles if len(roles) > 0 else None,
            status="Active"
            if course_role != CourseRole.dropped else "Inactive",
            extensions=extensions)
Exemple #3
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
Exemple #4
0
    def answer(cls, answer):
        attempt = None
        extensions = {
            "isDraft": answer.draft,
        }

        if answer.attempt_uuid:
            attempt = CaliperEntities.answer_attempt(answer)

        extensions.update(cls._basic_content_extension(answer.content))

        if answer.score:
            score = answer.score
            score_details = {
                "algorithm": score.scoring_algorithm.value,
                "score": score.score,
                "wins": score.wins,
                "loses": score.loses,
                "rounds": score.rounds,
                "opponents": score.opponents,
                "criteria": {}
            }

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

            extensions["scoreDetails"] = score_details

            for criterion_score in answer.criteria_scores:
                score_details = {
                    "score": criterion_score.score,
                    "wins": criterion_score.wins,
                    "loses": criterion_score.loses,
                    "rounds": criterion_score.rounds,
                    "opponents": criterion_score.opponents,
                }

                if criterion_score.scoring_algorithm == ScoringAlgorithm.true_skill:
                    score_details["mu"] = criterion_score.variable1
                    score_details["sigma"] = criterion_score.variable2

                extensions["scoreDetails"]["criteria"][ResourceIRI.criterion(
                    criterion_score.criterion_uuid)] = score_details

        return caliper.entities.Response(
            id=ResourceIRI.answer(answer.course_uuid, answer.assignment_uuid,
                                  answer.uuid),
            attempt=attempt,
            dateCreated=answer.created.replace(
                tzinfo=pytz.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z',
            dateModified=answer.modified.replace(
                tzinfo=pytz.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z',
            extensions=extensions)
Exemple #5
0
    def answer(cls, answer):
        ret = {
            "id": ResourceIRI.answer(answer.course_uuid, answer.assignment_uuid, answer.uuid),
            "type": CALIPER_ENTITY_TYPES["RESPONSE"],
            "dateCreated": answer.created.replace(tzinfo=pytz.utc).isoformat(),
            "dateModified": answer.modified.replace(tzinfo=pytz.utc).isoformat(),
            "extensions": {
                "isDraft": answer.draft
            }
        }
        ret["extensions"].update(cls._basic_content_extension(answer.content))

        if answer.attempt_uuid:
            ret["attempt"] = CaliperEntities.answer_attempt(answer)

        if answer.score:
            score = answer.score
            score_details = {
                "algorithm": score.scoring_algorithm.value,
                "score": score.score,
                "wins": score.wins,
                "loses": score.loses,
                "rounds": score.rounds,
                "opponents": score.opponents,
                "criteria": {}
            }

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

            ret["extensions"]["scoreDetails"] = score_details

            for criterion_score in answer.criteria_scores:
                score_details = {
                    "score": criterion_score.score,
                    "wins": criterion_score.wins,
                    "loses": criterion_score.loses,
                    "rounds": criterion_score.rounds,
                    "opponents": criterion_score.opponents,
                }

                if criterion_score.scoring_algorithm == ScoringAlgorithm.true_skill:
                    score_details["mu"] = criterion_score.variable1
                    score_details["sigma"] = criterion_score.variable2

                ret["extensions"]["scoreDetails"]["criteria"][ResourceIRI.criterion(criterion_score.criterion_uuid)] = score_details


        return ret
Exemple #6
0
    def comparison(cls, comparison, current_comparison=None):
        attempt = None
        extensions = {
            "pairingAlgorithm":
            comparison.pairing_algorithm.value,
            "winner":
            "Undecided",
            "criteria": {},
            "answers": [
                ResourceIRI.answer(comparison.course_uuid,
                                   comparison.assignment_uuid,
                                   comparison.answer1_uuid),
                ResourceIRI.answer(comparison.course_uuid,
                                   comparison.assignment_uuid,
                                   comparison.answer2_uuid)
            ],
            "completed":
            comparison.completed
        }

        if comparison.winner == WinningAnswer.draw:
            extensions["winner"] = "Draw"
        elif comparison.winner == WinningAnswer.answer1:
            extensions["winner"] = ResourceIRI.answer(
                comparison.course_uuid, comparison.assignment_uuid,
                comparison.answer1_uuid)
        elif comparison.winner == WinningAnswer.answer2:
            extensions["winner"] = ResourceIRI.answer(
                comparison.course_uuid, comparison.assignment_uuid,
                comparison.answer2_uuid)

        if comparison.attempt_uuid and current_comparison:
            attempt = CaliperEntities.comparison_attempt(
                comparison, current_comparison)

        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)

            extensions["criteria"][ResourceIRI.criterion(
                comparison_criterion.criterion_uuid)] = winner

        return caliper.entities.Response(
            id=ResourceIRI.comparison(comparison.course_uuid,
                                      comparison.assignment_uuid,
                                      comparison.uuid),
            attempt=attempt,
            dateCreated=comparison.created.replace(
                tzinfo=pytz.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z',
            dateModified=comparison.modified.replace(
                tzinfo=pytz.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z',
            extensions=extensions)
Exemple #7
0
 def answer_comment(cls, answer_comment):
     return caliper.entities.Comment(
         id=ResourceIRI.answer_comment(answer_comment.course_uuid,
                                       answer_comment.assignment_uuid,
                                       answer_comment.answer_uuid,
                                       answer_comment.uuid),
         commenter=CaliperActor.generate_actor(answer_comment.user),
         commentedOn=CaliperEntities.answer(answer_comment.answer),
         value=LearningRecord.trim_text_to_size_limit(
             answer_comment.content),
         dateCreated=answer_comment.created.replace(
             tzinfo=pytz.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z',
         dateModified=answer_comment.modified.replace(
             tzinfo=pytz.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z',
         extensions={
             "type":
             answer_comment.comment_type.value,
             "isDraft":
             answer_comment.draft,
             "characterCount":
             LearningRecord.character_count(answer_comment.content)
             if answer_comment.content else 0,
             "wordCount":
             LearningRecord.word_count(answer_comment.content)
             if answer_comment.content else 0
         })
Exemple #8
0
    def self_evaluation_question(cls, assignment):
        dateToStartOn = assignment.answer_end.replace(
            tzinfo=pytz.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'
        dateToSubmit = None
        description = None
        if assignment.self_eval_start and assignment.self_eval_end:
            dateToStartOn = assignment.self_eval_start.replace(
                tzinfo=pytz.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'
            dateToSubmit = assignment.self_eval_end.replace(
                tzinfo=pytz.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'
        elif assignment.compare_start and assignment.compare_end:
            dateToStartOn = assignment.answer_end.replace(
                tzinfo=pytz.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'

        if assignment.self_eval_instructions:
            description = LearningRecord.trim_text_to_size_limit(
                assignment.self_eval_instructions)

        return caliper.entities.AssessmentItem(
            id=ResourceIRI.self_evaluation_question(assignment.course_uuid,
                                                    assignment.uuid),
            name="Assignment self-evaluation",
            description=description,
            dateToStartOn=dateToStartOn,
            dateToSubmit=dateToSubmit,
            isPartOf=CaliperEntities.assignment(assignment),
            dateCreated=assignment.created.replace(
                tzinfo=pytz.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z',
            dateModified=assignment.modified.replace(
                tzinfo=pytz.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z')
Exemple #9
0
 def compair_app(cls):
     return caliper.entities.SoftwareApplication(
         id=ResourceIRI.compair(),
         name="ComPAIR",
         description=
         "The ComPAIR learning application pairs student answers for deeper learning through comparison of peer work.",
         version=text_type(current_app.config.get('COMPAIR_VERSION', '')))
Exemple #10
0
    def evaluation_question(cls, assignment, evaluation_number):
        dateToStartOn = assignment.answer_end.replace(
            tzinfo=pytz.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'
        dateToSubmit = None
        description = None
        if assignment.compare_start and assignment.compare_end:
            dateToStartOn = assignment.compare_start.replace(
                tzinfo=pytz.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'
            dateToSubmit = assignment.compare_end.replace(
                tzinfo=pytz.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'

        if assignment.peer_feedback_prompt:
            description = LearningRecord.trim_text_to_size_limit(
                assignment.peer_feedback_prompt)

        return caliper.entities.AssessmentItem(
            id=ResourceIRI.evaluation_question(assignment.course_uuid,
                                               assignment.uuid,
                                               evaluation_number),
            name="Assignment Answer Evaluation #" + str(evaluation_number),
            description=description,
            dateToStartOn=dateToStartOn,
            dateToSubmit=dateToSubmit,
            isPartOf=CaliperEntities.assignment(assignment),
            dateCreated=assignment.created.replace(
                tzinfo=pytz.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z',
            dateModified=assignment.modified.replace(
                tzinfo=pytz.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z')
Exemple #11
0
    def course(cls, course):
        otherIdentifiers = []
        if course.lti_linked:
            for lti_context in course.lti_contexts:
                lti_consumer = lti_context.lti_consumer

                otherIdentifiers.append(
                    caliper.entities.SystemIdentifier(
                        identifier=lti_context.context_id,
                        identifierType=CALIPER_SYSTEM_TYPES['LTI_CONTEXT_ID'],
                        source=lti_consumer.tool_consumer_instance_url,
                        extensions={
                            "oauth_consumer_key":
                            lti_consumer.oauth_consumer_key,
                            "tool_consumer_instance_guid":
                            lti_consumer.tool_consumer_instance_guid,
                            "tool_consumer_instance_name":
                            lti_consumer.tool_consumer_instance_name,
                            "lis_course_offering_sourcedid":
                            lti_context.lis_course_offering_sourcedid,
                            "lis_course_section_sourcedid":
                            lti_context.lis_course_section_sourcedid,
                        }))

        return caliper.entities.CourseOffering(
            id=ResourceIRI.course(course.uuid),
            academicSession=course.term,
            name=LearningRecord.trim_text_to_size_limit(course.name),
            dateCreated=course.created.replace(
                tzinfo=pytz.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z',
            dateModified=course.modified.replace(
                tzinfo=pytz.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z',
            otherIdentifiers=otherIdentifiers)
Exemple #12
0
    def group(cls, group):
        members = [
            CaliperActor.generate_actor(uc.user)
            for uc in group.user_courses.all()
        ]

        return caliper.entities.Group(
            id=ResourceIRI.group(group.course_uuid, group.uuid),
            name=group.name,
            subOrganizationOf=ResourceIRI.course(group.course_uuid),
            members=members,
            dateCreated=group.created.replace(
                tzinfo=pytz.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z',
            dateModified=group.modified.replace(
                tzinfo=pytz.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z',
        )
Exemple #13
0
    def _defaults(cls, user, course=None):
        caliper_actor = CaliperActor.generate_actor(user)
        if impersonation.is_impersonating() and user.id == current_user.id:
            caliper_actor = CaliperActor.generate_actor(impersonation.get_impersonation_original_user())

        defaults = {
            'context': CaliperSensor._version,
            'eventTime': LearningRecord.generate_timestamp(),
            'actor': caliper_actor,
            'edApp': ResourceIRI.compair()
        }

        session = CaliperEntities.session(caliper_actor)
        if request:
            session.setdefault("extensions", {}).setdefault("browser-info", {})

            if request.environ.get('HTTP_USER_AGENT'):
                session["extensions"]["browser-info"]["userAgent"] = request.environ.get('HTTP_USER_AGENT')

            if request.environ.get('HTTP_REFERER'):
                session["extensions"]["browser-info"]["referer"] = request.environ.get('HTTP_REFERER')

            if impersonation.is_impersonating() and user.id == current_user.id:
                session["extensions"]["impersonating-as"] = CaliperActor.generate_actor(user)
        defaults['session'] = session

        if course:
            defaults['membership'] = CaliperEntities.membership(course, user)

        return defaults
Exemple #14
0
    def _generate_global_unique_identifier_account(cls, user):
        external_id = user.global_unique_identifier
        homepage = current_app.config.get(
            'LRS_ACTOR_ACCOUNT_GLOBAL_UNIQUE_IDENTIFIER_HOMEPAGE')
        if not external_id or not homepage:
            return cls._generate_compair_account(user)

        if not homepage.endswith('/'):
            homepage += '/'

        return caliper.entities.Person(
            id=homepage + external_id,
            name=user.fullname,
            dateCreated=user.created.replace(
                tzinfo=pytz.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z',
            dateModified=user.modified.replace(
                tzinfo=pytz.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z',
            otherIdentifiers=cls._generate_other_identifiers(user) + [
                caliper.entities.SystemIdentifier(
                    identifier=external_id,
                    identifierType=CALIPER_SYSTEM_TYPES['SIS_SOURCEDID'],
                    source=homepage),
                caliper.entities.SystemIdentifier(
                    identifier=user.uuid,
                    identifierType=CALIPER_SYSTEM_TYPES['SYSTEM_ID'],
                    source=ResourceIRI.compair())
            ])
Exemple #15
0
    def course(cls, course):
        ret = {
            "id": ResourceIRI.course(course.uuid),
            "type": CALIPER_ENTITY_TYPES["COURSE_OFFERING"],
            "academicSession": course.term,
            "name": LearningRecord.trim_text_to_size_limit(course.name),
            "dateCreated": course.created.replace(tzinfo=pytz.utc).isoformat(),
            "dateModified": course.modified.replace(tzinfo=pytz.utc).isoformat(),
            "extensions": {}
        }

        if course.lti_linked:
            ret["extensions"]["ltiContexts"] = []
            for lti_context in course.lti_contexts:
                lti_consumer = lti_context.lti_consumer

                ret["extensions"]["ltiContexts"].append({
                    "oauth_consumer_key": lti_consumer.oauth_consumer_key,
                    "tool_consumer_instance_guid": lti_consumer.tool_consumer_instance_guid,
                    "tool_consumer_instance_name": lti_consumer.tool_consumer_instance_name,
                    "tool_consumer_instance_url": lti_consumer.tool_consumer_instance_url,
                    "lis_course_offering_sourcedid": lti_context.lis_course_offering_sourcedid,
                    "lis_course_section_sourcedid": lti_context.lis_course_section_sourcedid,
                    "context_id": lti_context.context_id
                })

        return ret
Exemple #16
0
 def report(cls, file_name, mimetype):
     return  {
         "id": ResourceIRI.report(file_name),
         "type": CALIPER_ENTITY_TYPES["DOCUMENT"],
         "name": file_name,
         "mediaType": mimetype,
     }
Exemple #17
0
 def self_evaluation_question(cls, assignment):
     return Activity(
         id=ResourceIRI.self_evaluation_question(assignment.course_uuid,
                                                 assignment.uuid),
         definition=ActivityDefinition(
             type=XAPIActivity.activity_types.get('question'),
             name=LanguageMap({'en-US': "Assignment self-evaluation"})))
Exemple #18
0
    def _defaults(cls, user, course=None):
        caliper_actor = CaliperActor.generate_actor(user)
        if impersonation.is_impersonating() and user.id == current_user.id:
            caliper_actor = CaliperActor.generate_actor(
                impersonation.get_impersonation_original_user())

        defaults = {
            'context': CaliperSensor._version,
            'eventTime': LearningRecord.generate_timestamp(),
            'actor': caliper_actor,
            'edApp': ResourceIRI.compair()
        }

        session = CaliperEntities.session(caliper_actor)
        if request:
            session.setdefault("extensions", {}).setdefault("browser-info", {})

            if request.environ.get('HTTP_USER_AGENT'):
                session["extensions"]["browser-info"][
                    "userAgent"] = request.environ.get('HTTP_USER_AGENT')

            if request.environ.get('HTTP_REFERER'):
                session["extensions"]["browser-info"][
                    "referer"] = request.environ.get('HTTP_REFERER')

            if impersonation.is_impersonating() and user.id == current_user.id:
                session["extensions"][
                    "impersonating-as"] = CaliperActor.generate_actor(user)
        defaults['session'] = session

        if course:
            defaults['membership'] = CaliperEntities.membership(course, user)

        return defaults
Exemple #19
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)

        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
Exemple #20
0
 def _generate_compair_account(cls, user):
     return {
         "id": ResourceIRI.actor_homepage() + user.uuid,
         "type": CALIPER_ENTITY_TYPES["PERSON"],
         "name": user.fullname,
         "dateCreated": user.created.replace(tzinfo=pytz.utc).isoformat(),
         "dateModified": user.modified.replace(tzinfo=pytz.utc).isoformat(),
     }
Exemple #21
0
 def compair_app(cls):
     return {
         "id": ResourceIRI.compair(),
         "type": CALIPER_ENTITY_TYPES["SOFTWARE_APPLICATION"],
         "name": "ComPAIR",
         "description": "The ComPAIR learning application pairs student answers for deeper learning through comparison of peer work.",
         "version": current_app.config.get('COMPAIR_VERSION')
     }
Exemple #22
0
 def comparison_question(cls, assignment, comparison_number):
     return Activity(
         id=ResourceIRI.comparison_question(assignment.course_uuid, assignment.uuid, comparison_number),
         definition=ActivityDefinition(
             type=XAPIActivity.activity_types.get('question'),
             name=LanguageMap({ 'en-US': "Assignment comparison #"+str(comparison_number) })
         )
     )
Exemple #23
0
 def self_evaluation_question(cls, assignment):
     return Activity(
         id=ResourceIRI.self_evaluation_question(assignment.course_uuid, assignment.uuid),
         definition=ActivityDefinition(
             type=XAPIActivity.activity_types.get('question'),
             name=LanguageMap({ 'en-US': "Assignment self-evaluation" })
         )
     )
Exemple #24
0
 def _generate_compair_account(cls, user):
     return {
         "id": ResourceIRI.actor_homepage()+user.uuid,
         "type": CALIPER_ENTITY_TYPES["PERSON"],
         "name": user.fullname,
         "dateCreated": user.created.replace(tzinfo=pytz.utc).isoformat(),
         "dateModified": user.modified.replace(tzinfo=pytz.utc).isoformat(),
     }
Exemple #25
0
 def _generate_compair_account(cls, user):
     return caliper.entities.Person(
         id=ResourceIRI.actor_homepage() + user.uuid,
         name=user.fullname,
         dateCreated=user.created.replace(
             tzinfo=pytz.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z',
         dateModified=user.modified.replace(
             tzinfo=pytz.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z',
         otherIdentifiers=cls._generate_other_identifiers(user))
Exemple #26
0
 def criterion(cls, criterion):
     return {
         "id": ResourceIRI.criterion(criterion.uuid),
         "type": CALIPER_ENTITY_TYPES["ENTITY"],
         "name": LearningRecord.trim_text_to_size_limit(criterion.name),
         "description": LearningRecord.trim_text_to_size_limit(criterion.description),
         "dateCreated": criterion.created.replace(tzinfo=pytz.utc).isoformat(),
         "dateModified": criterion.modified.replace(tzinfo=pytz.utc).isoformat(),
     }
Exemple #27
0
    def assignment_attempt(cls, assignment, attempt_mixin_object, user):
        ret = {
            "id": ResourceIRI.assignment_attempt(assignment.course_uuid, assignment.uuid, attempt_mixin_object.attempt_uuid),
            "type": CALIPER_ENTITY_TYPES["ATTEMPT"],
            "assignee": CaliperActor.generate_actor(user),
            "assignable": CaliperEntities.assignment(assignment),
        }
        ret.update(cls._basic_attempt(attempt_mixin_object))

        return ret
Exemple #28
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
Exemple #29
0
 def answer_attachment(cls, answer, file, mimetype):
     return  {
         "id": ResourceIRI.attachment(file.name),
         "type": CALIPER_ENTITY_TYPES["DOCUMENT"],
         "name": file.alias,
         "mediaType": mimetype,
         "isPartOf": CaliperEntities.answer(answer),
         "dateCreated": file.created.replace(tzinfo=pytz.utc).isoformat(),
         "dateModified": file.modified.replace(tzinfo=pytz.utc).isoformat()
     }
Exemple #30
0
    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
            for sis_course_id, sis_section_ids in sis_data.items():
                context.context_activities.grouping.append({
                    "id": ResourceIRI.sis_course(sis_course_id),
                    "objectType": "Activity"
                })
                for sis_section_id in sis_section_ids:
                    context.context_activities.grouping.append({
                        "id": ResourceIRI.sis_section(sis_course_id, sis_section_id),
                        "objectType": "Activity"
                    })
Exemple #31
0
 def criterion(cls, criterion):
     return caliper.entities.DigitalResource(
         id=ResourceIRI.criterion(criterion.uuid),
         name=LearningRecord.trim_text_to_size_limit(criterion.name),
         description=LearningRecord.trim_text_to_size_limit(
             criterion.description),
         dateCreated=criterion.created.replace(
             tzinfo=pytz.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z',
         dateModified=criterion.modified.replace(
             tzinfo=pytz.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z')
Exemple #32
0
    def comparison_attempt(cls, comparison, current_comparison):
        ret = {
            "id": ResourceIRI.comparison_attempt(comparison.course_uuid, comparison.assignment_uuid, current_comparison, comparison.attempt_uuid),
            "type": CALIPER_ENTITY_TYPES["ATTEMPT"],
            "assignee": CaliperActor.generate_actor(comparison.user),
            "assignable": CaliperEntities.comparison_question(comparison.assignment, current_comparison),
        }
        ret.update(cls._basic_attempt(comparison))

        return ret
Exemple #33
0
    def client(cls, request):
        if not request:
            return None

        return caliper.entities.SoftwareApplication(
            id=ResourceIRI.user_client(sess.get('session_id', '')),
            userAgent=text_type(request.environ.get('HTTP_USER_AGENT', '')),
            ipAddress=text_type(request.environ.get('REMOTE_ADDR', '')),
            host=text_type(request.environ.get('HTTP_HOST', '')),
        )
Exemple #34
0
 def answer_attachment(cls, answer, file, mimetype):
     return caliper.entities.Document(
         id=ResourceIRI.attachment(file.name),
         name=file.alias,
         mediaType=mimetype,
         isPartOf=CaliperEntities.answer(answer),
         dateCreated=file.created.replace(
             tzinfo=pytz.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z',
         dateModified=file.modified.replace(
             tzinfo=pytz.utc).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z')
Exemple #35
0
    def answer_attempt(cls, answer):
        ret = {
            "id": ResourceIRI.answer_attempt(answer.course_uuid, answer.assignment_uuid, answer.attempt_uuid),
            "type": CALIPER_ENTITY_TYPES["ATTEMPT"],
            "assignee": CaliperActor.generate_actor(answer.user),
            "assignable": CaliperEntities.assignment_question(answer.assignment),
        }
        ret.update(cls._basic_attempt(answer))

        return ret
Exemple #36
0
    def course(cls, course):
        activity = Activity(
            id=ResourceIRI.course(course.uuid),
            definition=ActivityDefinition(
                type=XAPIActivity.activity_types.get('course'),
                name=LanguageMap({ 'en-US': LearningRecord.trim_text_to_size_limit(course.name) })
            )
        )

        return activity
Exemple #37
0
    def membership(cls, course, user):
        membership = {
            "id": ResourceIRI.user_membership(course.uuid, user.uuid),
            "type": CALIPER_ENTITY_TYPES["MEMBERSHIP"],
            "member": CaliperActor.generate_actor(user),
            "organization": ResourceIRI.course(course.uuid),
            "status": "Active",
            "extensions": {}
        }

        roles = []
        course_role = user.get_course_role(course.id)
        if course_role in [CourseRole.instructor, CourseRole.teaching_assistant]:
            roles.append("Instructor")
        if course_role == CourseRole.teaching_assistant:
            roles.append("Instructor#TeachingAssistant")
        if course_role == CourseRole.student:
            roles.append("Learner")
        if user.system_role == SystemRole.sys_admin:
            roles.append("Administrator")

        if len(roles) > 0:
            membership["roles"] = roles

        if course_role == CourseRole.dropped:
            membership['status'] = "Inactive"

        if course.lti_has_sis_data:
            sis_data = course.lti_sis_data
            membership['extensions']['sis_courses'] = []
            membership['extensions']['sis_sections'] = []
            for sis_course_id, sis_section_ids in sis_data.items():
                membership['extensions']['sis_courses'].append(ResourceIRI.sis_course(sis_course_id))

                for sis_section_id in sis_section_ids:
                    membership['extensions']['sis_sections'].append(ResourceIRI.sis_section(sis_course_id, sis_section_id))

            sis_course_id = list(sis_data.keys())[0]
            sis_section_id = sis_data[sis_course_id][0]
            membership['organization'] = cls.course_section(sis_course_id, sis_section_id)

        return membership
Exemple #38
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
Exemple #39
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
Exemple #40
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
Exemple #41
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
Exemple #42
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
Exemple #43
0
    def self_evaluation_attempt(cls, answer_comment):
        activity = Activity(
            id=ResourceIRI.self_evaluation_attempt(answer_comment.course_uuid, answer_comment.assignment_uuid,
                answer_comment.attempt_uuid),
            definition=ActivityDefinition(
                type=XAPIActivity.activity_types.get('attempt'),
                description=LanguageMap({ 'en-US': LearningRecord.trim_text_to_size_limit(answer_comment.content) }),
                extensions=Extensions()
            )
        )
        activity.definition.extensions["http://id.tincanapi.com/extension/attempt"] = cls._basic_attempt(answer_comment)

        return activity
Exemple #44
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
Exemple #45
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
Exemple #46
0
    def assignment_question(cls, assignment):
        activity = Activity(
            id=ResourceIRI.assignment_question(assignment.course_uuid, assignment.uuid),
            definition=ActivityDefinition(
                type=XAPIActivity.activity_types.get('question'),
                name=LanguageMap({ 'en-US': LearningRecord.trim_text_to_size_limit(assignment.name) })
            )
        )
        if assignment.description:
            activity.definition.description = LanguageMap({
                'en-US': LearningRecord.trim_text_to_size_limit(assignment.description)
            })

        return activity
Exemple #47
0
    def criterion(cls, criterion):
        activity = Activity(
            id=ResourceIRI.criterion(criterion.uuid),
            definition=ActivityDefinition(
                type=XAPIActivity.activity_types.get('question'),
                name=LanguageMap({ 'en-US': LearningRecord.trim_text_to_size_limit(criterion.name) })
            )
        )
        if criterion.description:
            activity.definition.description = LanguageMap({
                'en-US': LearningRecord.trim_text_to_size_limit(criterion.description)
            })

        return activity
Exemple #48
0
    def answer_comment(cls, answer_comment):
        activity = Activity(
            id=ResourceIRI.answer_comment(answer_comment.course_uuid, answer_comment.assignment_uuid,
                answer_comment.answer_uuid, answer_comment.uuid),
            definition=ActivityDefinition(
                type=XAPIActivity.activity_types.get('comment'),
                name=LanguageMap({ 'en-US': "Assignment answer comment" }),
                extensions=Extensions()
            )
        )
        activity.definition.extensions['http://id.tincanapi.com/extension/type'] = answer_comment.comment_type.value
        activity.definition.extensions['http://id.tincanapi.com/extension/isDraft'] = answer_comment.draft

        return activity
Exemple #49
0
    def evaluation_response(cls, answer_comment):
        activity = Activity(
            id=ResourceIRI.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'),
                description=LanguageMap({ 'en-US': LearningRecord.trim_text_to_size_limit(answer_comment.content) }),
                extensions=Extensions()
            )
        )

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

        return activity