def process_event(self, event_edx): course_id = event_edx['context'].get('course_id', None) if course_id is None or course_id == '': try: # We need to do this because we receive a string instead than a dictionary event = json.loads(event_edx['event']) course_id = event['POST'].get('course_id', None)[0] except: pass # No event data, just skip if course_id != '' and course_id in self.course_ids: try: # Sometimes we receive time as python datetime, sometimes as string... timepart = event_edx['time'] timestamp = xutils.make_datetime_for_tincan(timepart) actor = None user_id = 0 try: user_id = event_edx['context'].get('user_id', 0) except: user_id = json.loads(event_edx['context']).get('user_id', 0) try: actor = self.get_actor(user_id) except (ValueError, UserSocialAuth.DoesNotExist) as e: # Only logged ECO user need to be tracked return verb, obj = self.to_xapi(event_edx, course_id) context = self.get_context(course_id, user_id) d = {"time_with_millis": timepart} context.extensions = Extensions(d) # verb = None means to not record the action if verb: statement = Statement( actor=actor, verb=verb, object=obj, context=context, timestamp=timestamp ) tldat = TrackingLog( dtcreated=timestamp, user_id=user_id, course_id=course_id, statement=statement.to_json(), original_event=json.dumps(event_edx, cls=DateTimeJSONEncoder) ) # We don't need to add duplication event test, so we save directly tldat.save() except Exception as e: # pylint: disable=broad-except log.exception(e) else: if course_id != '': # print 'Course not activated', course_id # Uncomment for debug pass
def process_data(x, lines): i = 0 for row in lines: event = json.loads(row) try: dt = dateutil.parser.parse(event['time']) except ValueError: print 'Data error -> ', event['time'] continue # event['context']['user_id'] = 6 # used only for local test, comment in the real environment user_id = event['context'].get('user_id') if user_id == '': continue # Search for events of same user in the same date (seconds precision) tls = TrackingLog.objects.filter(dtcreated=xutils.make_datetime_for_tincan(dt), user_id=user_id) if tls: differentMillis = True for t in tls: statement = Statement.from_json(t.statement) try: t_event = statement.context.extensions['time_with_millis'] if t_event == event['time']: differentMillis = False break except: # pylint: disable=bare-except pass if differentMillis: i = i + 1 x.process_event(event) else: # Skip duplicate events # print "Tracking event already exists for dt: %s and user_id : %s ", event['time'], user_id # print event pass else: i = i + 1 x.process_event(event) print "%s events sent to backend", str(i)