Exemple #1
0
    def get_actor(self, event):
        """Get Actor for the statement."""
        try:
            edx_user_info = self._get_edx_user_info(event['event']['username'])
        except:
            if event['username'] == 'anonymous':
                edx_user_info = self._get_edx_user_info(
                    event['context']['module']['username'])
            else:
                edx_user_info = self._get_edx_user_info(event['username'])

        # this can happen in case a user was just deleted, or
        # in cases a user is automatically logged out while
        # they are interacting with courseware (e.g., a video is playing),
        # due to an LMS restart or other circumstance, in which
        # case an event with no username can be sent to the tracking
        # logs.  In this case don't send a Statement
        if not edx_user_info['email']:
            return None

        if settings.UNTI_XAPI and edx_user_info['unti_id']:
            return Agent(
                name=edx_user_info['fullname'],
                account=AgentAccount(name=edx_user_info['unti_id'],
                                     home_page='https://my.2035.university'),
            )
        else:
            return Agent(
                name=edx_user_info['fullname'],
                mbox='mailto:{}'.format(edx_user_info['email']),
            )
Exemple #2
0
def _create_actor():
    """Create xAPI actor"""
    student_id = "https://www.lip6.fr/mocah/invalidURI/student-number:" + student_hash
    partner_id = "https://www.lip6.fr/mocah/invalidURI/partner-number:" + partner_hash
    StudentAgent = Agent(openid=student_id, name="student")
    PartnerAgent = Agent(openid=partner_id, name="partner")
    AgentGroup = Group(member=[StudentAgent, PartnerAgent], name=student_hash + "||" + partner_hash)
    # print(student_hash, partner_hash)
    return AgentGroup
Exemple #3
0
    def setUp(self):
        self.endpoint = lrs_properties.endpoint
        self.version = lrs_properties.version
        self.username = lrs_properties.username
        self.password = lrs_properties.password
        self.lrs = RemoteLRS(
            version=self.version,
            endpoint=self.endpoint,
            username=self.username,
            password=self.password,
        )

        self.agent = Agent(mbox="mailto:[email protected]")
        self.agent2 = Agent(mbox="mailto:[email protected]")
        self.verb = Verb(id="http://adlnet.gov/expapi/verbs/experienced",
                         display=LanguageMap({"en-US": "experienced"}))

        self.group = Group(member=[self.agent, self.agent2])

        self.activity = Activity(
            id="http://tincanapi.com/TinCanPython/Test/Unit/0",
            definition=ActivityDefinition())
        self.activity.definition.type = "http://id.tincanapi.com/activitytype/unit-test"
        self.activity.definition.name = LanguageMap({"en-US": "Python Tests"})
        self.activity.definition.description = LanguageMap(
            {"en-US": "Unit test in the test suite for the Python library"})
        self.activity.object_type = 'Activity'

        self.parent = Activity(id="http://tincanapi.com/TinCanPython/Test",
                               definition=ActivityDefinition())
        self.parent.definition.type = "http://id.tincanapi.com/activitytype/unit-test-suite"
        self.parent.definition.name = LanguageMap({"en-US": "Python Tests"})
        self.parent.definition.description = LanguageMap(
            {"en-US": "Unit test in the test suite for the Python library"})
        self.parent.object_type = 'Activity'

        self.statement_ref = StatementRef(id=uuid.uuid4())

        self.context = Context(registration=uuid.uuid4(),
                               statement=self.statement_ref)
        # self.context.context_activities = ContextActivities(parent=[self.parent])

        self.score = Score(raw=97, scaled=0.97, max=100, min=0)

        self.result = Result(score=self.score,
                             success=True,
                             completion=True,
                             duration="PT120S")

        self.substatement = SubStatement(
            actor=self.agent,
            verb=self.verb,
            object=self.activity,
        )
Exemple #4
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)
    def getStatements(self, name):

        # connect LRS
        lrs = self.LRS

        # specify user as agent
        actor = Agent(
            name=name,
            mbox='mailto:' + name + '@id.lrs',
        )

        # optional specify verb
        verb = Verb(
            id=self.verbs.get("experienced"),
            display=LanguageMap({'en-US': 'experienced'}),
        )

        query = {
            "agent": actor,
            #"verb": verb,
            "limit": 1000 #change limit if needed
        }

        # query LRS for statements
        response = lrs.query_statements(query)

        # check response
        if not response:
            raise ValueError("statements could not be queried")

        # return queried statements
        return response
Exemple #6
0
 def test_InitMboxSha1(self):
     agent = Agent(name='test',
                   mbox='mailto:[email protected]',
                   mbox_sha1sum='test')
     self.assertEqual(agent.object_type, "Agent")
     self.assertEqual(agent.name, 'test')
     self.assertEqual(agent.mbox, 'mailto:[email protected]')
     self.assertEqual(agent.mbox_sha1sum, 'test')
Exemple #7
0
 def test_InitExceptionUnpackEmptymbox_sha1sum(self):
     obj = {
         "name": "test",
         "mbox": "mailto:[email protected]",
         "mbox_sha1sum": ""
     }
     with self.assertRaises(ValueError):
         Agent(**obj)
Exemple #8
0
 def get_actor(self, username, email):
     """
     Get actor for the statement.
     """
     return Agent(
         name=username,
         mbox='mailto:{email}'.format(email=email),
     )
 def test_InitAuthority(self):
     statement = Statement(authority=Agent(name='test'))
     self.assertIsNone(statement.id)
     self.assertIsNone(statement.verb)
     self.assertIsNone(statement.object)
     self.assertIsNone(statement.timestamp)
     self.assertIsNone(statement.stored)
     self.assertIsNone(statement.actor)
     self.agentVerificationHelper(statement.authority)
 def test_InitGroupActor(self):
     statement = Statement(actor=Group(member=[Agent(name='test')]))
     self.assertIsNone(statement.id)
     self.assertIsNone(statement.verb)
     self.assertIsNone(statement.object)
     self.assertIsNone(statement.timestamp)
     self.assertIsNone(statement.stored)
     self.assertIsNone(statement.authority)
     self.groupVerificationHelper(statement.actor)
 def test_InitAnonGroupActor(self):
     statement = Statement(actor={'member': [Agent(name='test')], 'object_type': 'Group'})
     self.assertIsNone(statement.id)
     self.assertIsNone(statement.verb)
     self.assertIsNone(statement.object)
     self.assertIsNone(statement.timestamp)
     self.assertIsNone(statement.stored)
     self.assertIsNone(statement.authority)
     self.groupVerificationHelper(statement.actor)
    def setUp(self):
        self.agent = Agent(mbox="mailto:[email protected]")

        self.activity = Activity(
            id="http://tincanapi.com/TinCanPython/Test/Unit/0",
            definition=ActivityDefinition())
        self.activity.definition.type = "http://id.tincanapi.com/activitytype/unit-test"
        self.activity.definition.name = LanguageMap({"en-US": "Python Tests"})
        self.activity.definition.description = LanguageMap(
            {"en-US": "Unit test in the test suite for the Python library"})
Exemple #13
0
 def get_actor(self, user, user_social_auth):
     """
     Get actor for the statement.
     """
     social_auth_uid = user_social_auth.uid if user_social_auth else ''
     sso_id = social_auth_uid.split(':')[-1]
     name = sso_id if sso_id else user.email
     return Agent(
         name=name,
         mbox=u'mailto:{email}'.format(email=user.email),
     )
Exemple #14
0
 def test_ToJSON(self):
     substatement = SubStatement(object_type='SubStatement',
                                 actor=Agent(name='test'),
                                 verb=Verb(id='test'),
                                 object=Activity(id='test'))
     self.assertEqual(
         json.loads(substatement.to_json()),
         json.loads(
             '{"verb": {"id": "test"}, "object": {"id": "test", "objectType": "Activity"}, '
             '"actor": {"name": "test", "objectType": "Agent"}, "objectType": "SubStatement"}'
         ))
Exemple #15
0
 def get_actor(self, user, user_social_auth):
     """
     Returns the actor component of the Enterprise xAPI statement.
     Arguments:
         user (User): User.
         user_social_auth (UserSocialAuth): UserSocialAuth.
     """
     name = self._get_actor_name(user, user_social_auth)
     return Agent(
         name=name,
         mbox=u'mailto:{email}'.format(email=user.email),
     )
Exemple #16
0
 def test_InitEmptyAccount(self):
     agent = Agent(name='test',
                   mbox='mailto:[email protected]',
                   mbox_sha1sum='test',
                   openid='test',
                   account={})
     self.assertEqual(agent.object_type, "Agent")
     self.assertEqual(agent.name, 'test')
     self.assertEqual(agent.mbox, 'mailto:[email protected]')
     self.assertEqual(agent.mbox_sha1sum, 'test')
     self.assertEqual(agent.openid, 'test')
     self.assertIsInstance(agent.account, AgentAccount)
Exemple #17
0
 def test_InitAccount(self):
     agent = Agent(name='test',
                   mbox='mailto:[email protected]',
                   mbox_sha1sum='test',
                   openid='test',
                   account=AgentAccount(name="test", home_page="test.com"))
     self.assertEqual(agent.object_type, "Agent")
     self.assertEqual(agent.name, 'test')
     self.assertEqual(agent.mbox, 'mailto:[email protected]')
     self.assertEqual(agent.mbox_sha1sum, 'test')
     self.assertEqual(agent.openid, 'test')
     self.accountVerificationHelper(agent.account)
Exemple #18
0
    def get_actor(self):
        """
        Return `Agent` object for the event.

        Returns:
            `Agent`
        """

        user_uuid = get_anonymous_user_id(self.extract_username_or_userid())
        return Agent(
            account={"homePage": settings.LMS_ROOT_URL, "name": user_uuid}
        )
Exemple #19
0
    def generate_actor(cls, user):
        actor = Agent(name=user.fullname)

        if current_app.config.get(
                'LRS_ACTOR_ACCOUNT_USE_GLOBAL_UNIQUE_IDENTIFIER'):
            account = cls._generate_global_unique_identifier_account(user)
            if account:
                actor.account = account

        # set account to compair account by default
        if not actor.account:
            actor.account = cls._generate_compair_account(user)

        return actor
Exemple #20
0
 def sendstatement_session_started(self):
     aname = 'sysadmin'
     actor = Agent(
         name=aname,
         mbox='mailto:' + aname + '@iltserver.com',
     )
     verb = Verb(
         id='http://activitystrea.ms/schema/1.0/start',
         display=LanguageMap({'en-US': 'started'}),
     )
     statement = Statement(actor=actor,
                           verb=verb,
                           object=self._session_object)
     self._send_to_LRS(statement)
Exemple #21
0
 def sendstatement_session_ended(self):
     aname = 'sysadmin'
     actor = Agent(
         name=aname,
         mbox='mailto:' + aname + '@iltserver.com',
     )
     verb = Verb(
         id='http://adlnet.gov/expapi/verbs/terminated',
         display=LanguageMap({'en-US': 'terminated'}),
     )
     statement = Statement(actor=actor,
                           verb=verb,
                           object=self._session_object)
     self._send_to_LRS(statement)
Exemple #22
0
    def get_actor(self, event):
        """Get Actor for the statement."""
        edx_user_info = self._get_edx_user_info(event['username'])

        # this can happen in case a user was just deleted, or
        # in cases a user is automatically logged out while
        # they are interacting with courseware (e.g., a video is playing),
        # due to an LMS restart or other circumstance, in which
        # case an event with no username can be sent to the tracking
        # logs.  In this case don't send a Statement
        if not edx_user_info['email']:
            return None

        return Agent(
            name=edx_user_info['fullname'],
            mbox='mailto:{}'.format(edx_user_info['email']),
        )
Exemple #23
0
    def generate_actor(cls, user):
        actor = Agent(name=user.fullname)

        if current_app.config.get('LRS_ACTOR_ACCOUNT_USE_CAS'):
            from compair.models import ThirdPartyType

            cas_user = user.third_party_auths \
                .filter_by(third_party_type=ThirdPartyType.cas) \
                .first()

            if cas_user:
                actor.account = cls._generate_cas_account(cas_user)

        # set account to compair account by default
        if not actor.account:
            actor.account = cls._generate_compair_account(user)

        return actor
Exemple #24
0
 def test_InitUnpack(self):
     obj = {
         "name": "test",
         "mbox": "mailto:[email protected]",
         "mbox_sha1sum": "test",
         "openid": "test",
         "account": {
             'name': 'test',
             'home_page': 'test.com'
         }
     }
     agent = Agent(**obj)
     self.assertEqual(agent.object_type, "Agent")
     self.assertEqual(agent.name, 'test')
     self.assertEqual(agent.mbox, 'mailto:[email protected]')
     self.assertEqual(agent.mbox_sha1sum, 'test')
     self.assertEqual(agent.openid, 'test')
     self.accountVerificationHelper(agent.account)
def create_statement(arbtt_csv_entry):
    """Creates a Tincan statement from arbtt csv input"""

    arbtt_record = ArbttRecord(arbtt_csv_entry)
    app = arbtt_record.application
    duration = arbtt_record.duration

    # XXX: Look for a cleaner way to get user details
    user = os.environ['LOGNAME']
    email_address = "*****@*****.**" % (user, )

    actor = Agent(
        name=user,
        mbox='mailto:' + email_address,
    )

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

    # Get activity from config or set the activity as 'unknown'
    activity_from_map = activity_map.get(app, "unknown")

    object = Activity(
        id=os.path.join(lrs['activities_uri'], activity_from_map),
        definition=ActivityDefinition(
            name=LanguageMap({'en-US': activity_from_map}),
            extensions=Extensions(
                {'http://id.tincanapi.com/extension/duration': duration}, ),
        ),
    )

    context = Context(platform=app)

    # Construct the statement
    return Statement(
        actor=actor,
        verb=verb,
        object=object,
        context=context,
    )
Exemple #26
0
def socialmedia_builder(statement_id,
                        verb,
                        platform,
                        account_name,
                        account_homepage,
                        object_type,
                        object_id,
                        message,
                        tags=[],
                        parent_object_type=None,
                        parent_id=None,
                        rating=None,
                        instructor_name=None,
                        instructor_email=None,
                        team_name=None,
                        unit=None,
                        account_email=None,
                        user_name=None,
                        timestamp=None,
                        other_contexts=[]):

    agentaccount = AgentAccount(name=account_name, home_page=account_homepage)
    actor = Agent(account=agentaccount)

    # XAPI statements can only have one of: AgentAccount, mbox, mboxsha1 or Openid
    #if (account_email is not None):
    #    actor.mbox = account_email
    #if (user_name is not None):
    #    actor.name = user_name

    verb_obj = Verb(id=xapi_settings.get_verb_iri(verb),
                    display=LanguageMap({'en-US': verb}))

    #message = message.decode('utf-8').encode('ascii', 'ignore') #message.decode('utf-8').replace(u"\u2018", "'").replace(u"\u2019", "'").replace(u"\u2013", "-").replace(u"\ud83d", " ").replace(u"\ude09", " ").replace(u"\u00a0l", " ").replace(u"\ud83d", " ").replace(u"\u2026", " ").replace(u"\ude09", " ").replace(u"\u00a0"," ")

    object = Activity(
        id=object_id,
        object_type=object_type,
        definition=ActivityDefinition(
            name=LanguageMap({'en-US': message}),
            type=xapi_settings.get_object_iri(object_type)),
    )

    taglist = []
    for tag in tags:
        tagobject = Activity(
            id='http://id.tincanapi.com/activity/tags/tincan',
            object_type='Activity',
            definition=ActivityDefinition(
                name=LanguageMap({'en-US': tag}),
                type=xapi_settings.get_object_iri('Tag')),
        )
        taglist.append(tagobject)

    # Add "other" in contextActivities
    other_contexts_list = []
    for other in other_contexts:
        other_context_obj = Activity(
            id=other['obj_id'],
            object_type=other['obj_type'],
            definition=ActivityDefinition(name=LanguageMap(
                {'en-US': other['definition']['name']}),
                                          type=other['definition']['type']),
        )
        other_contexts_list.append(other_context_obj)
    taglist.extend(other_contexts_list)

    parentlist = []
    if (verb in ['liked', 'shared', 'commented',
                 'rated']):  #recipe specific config
        parentobject = Activity(
            id=parent_id,
            object_type=parent_object_type,
        )
        parentlist.append(parentobject)
    elif (platform == 'GitHub' or platform.lower() == 'trello'):
        parentobject = Activity(
            id=parent_id,
            object_type=parent_object_type,
        )
        parentlist.append(parentobject)

    courselist = []
    if unit is not None:
        courseobject = Activity(
            id="http://adlnet.gov/expapi/activities/course",
            object_type='Course',
            definition=ActivityDefinition(
                name=LanguageMap({'en-US': unit.code}),
                description=LanguageMap({
                    'en-US':
                    "A course/unit of learning hosted on the CLAToolkit"
                })))
        courselist.append(courseobject)

    instructor = None
    if (instructor_name is not None):
        instructor = Agent(name=instructor_name, mbox=instructor_email)

    team = None
    if (team_name is not None):
        team = Group(Agent(name=team_name), object_type='Group')

    result = None
    if (rating is not None):
        rating_as_float = float(rating)
        result = Result(score=Score(raw=rating_as_float))

    context = Context(registration=uuid.uuid4(),
                      platform=platform,
                      instructor=instructor,
                      team=team,
                      context_activities=ContextActivities(
                          other=ActivityList(taglist),
                          parent=ActivityList(parentlist),
                          grouping=ActivityList(courselist)))

    # Xapi spec requires that the learning provider SHOULD provide the authority
    # Authority is a group with Agent as oauth consumer app where name is token url and homepage is consumer_key
    account = AgentAccount(name=unit.get_lrs_key(),
                           home_page=unit.get_lrs_access_token_url())

    authority = Group(Agent(account=account))

    statement = statement_builder(statement_id, actor, verb_obj, object,
                                  context, result, authority, timestamp)

    return statement
 def setUp(self):
     self.agent = Agent(mbox="mailto:[email protected]")
Exemple #28
0
 def test_InitMember(self):
     group = Group(member=[Agent(name='test')])
     self.assertIsInstance(group.member[0], Agent)
Exemple #29
0
    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST, request.FILES)
        if form.is_valid():
            data = form.cleaned_data
            project = get_object_or_404(Project, id=data['project'])
            user = data['user']

            timezone = pytz.timezone("Europe/Rome")

            actor = Agent(
                name=user.get_display_name(),
                mbox='mailto:%s' % user.email,
            )

            project_id = get_object_id(request, project)

            activity_type = xapi_activities['assessment']['type']
            object_language = 'it'
            verb = Verb(
                id=xapi_verbs['completed']['id'],
                display=LanguageMap(**xapi_verbs['completed']['display']),
            )

            file = request.FILES['file']
            filename = file.name
            extension = filename.split(".")[-1]
            content = file.read()
            records = pyexcel.get_records(file_type=extension,
                                          file_content=content)
            name_dict = records[0]
            keys = name_dict.keys()
            rows = []
            for record in records:
                date_time = record['Ora']
                lesson = record['Lezione']
                course = record['Corso']
                activity = record['Attività']
                duration_seconds = record['Durata (Secondi)']
                response_seconds = record['Tempo medio di risposta (Secondi)']
                score_percent = record['Punteggio (%)']
                questions = record['Domande con risposta']
                correct_answers = record['Risposte corrette']

                timestamp = datetime.strptime(date_time, "%d/%m/%Y %H.%M")
                timestamp = timezone.localize(timestamp)

                object_name = 'EarMaster: {}'.format(activity)
                object_description = 'Esercizio di {} in lezione EarMaster "{}"'.format(
                    activity, lesson)
                activity_definition = ActivityDefinition(
                    name=LanguageMap(**{object_language: object_name}),
                    description=object_description
                    and LanguageMap(**{object_language: object_description})
                    or None,
                    type=activity_type,
                )
                course_id = '{}{}'.format(project_id, slugify(course))
                lesson_id = '{}/{}'.format(course_id, slugify(lesson))
                object = Activity(
                    objectType='Activity',
                    id=lesson_id,
                    definition=activity_definition,
                )
                parent = {
                    'objectType': 'Activity',
                    'id': course_id,
                    'definition': {
                        'type': xapi_activities['course']['type'],
                        'name': {
                            'it': course
                        }
                    }
                }
                grouping = {
                    'objectType': 'Activity',
                    'id': project_id,
                    'definition': {
                        'type':
                        xapi_activities['project']['type'],
                        'name':
                        LanguageMap(**{get_language(project): project.name})
                    }
                }
                context = {
                    'platform': 'EarMaster',
                    'context_activities': {
                        'parent': parent,
                        'grouping': grouping
                    }
                }
                context = Context(**context)

                score_scaled = float(score_percent.replace('%', '')) / 100
                score_max = questions
                score_raw = correct_answers
                score = {
                    'min': 0,
                    'max': score_max,
                    'raw': score_raw,
                    'scaled': score_scaled
                }
                score = Score(**score)
                result = {'duration': duration_seconds, 'score': score}
                result = Result(**result)

                statement = Statement(actor=actor,
                                      verb=verb,
                                      object=object,
                                      context=context,
                                      result=result,
                                      timestamp=timestamp)
                result = send_statement(statement)
            return HttpResponseRedirect('/project/%s/' % project.slug)
        return render(request, self.template_name,
                      {'earmaster_import_results_form': form})
Exemple #30
0
 def test_AddMember(self):
     group = Group()
     group.addmember(Agent(name='test'))
     self.assertIsInstance(group.member[0], Agent)