def generate_fake_coachreport_logs(password="******"): t,_ = FacilityUser.objects.get_or_create( facility=Facility.objects.all()[0], username=random.choice(firstnames) ) t.set_password(password) # TODO: create flags later num_logs = 20 logs = [] for _ in xrange(num_logs): date_logged_in = datetime.datetime.now() - datetime.timedelta(days=random.randint(1,10)) date_viewed_coachreport = date_logged_in + datetime.timedelta(minutes=random.randint(0, 30)) date_logged_out = date_viewed_coachreport + datetime.timedelta(minutes=random.randint(0, 30)) login_log = UserLog.objects.create( user=t, activity_type=UserLog.get_activity_int("login"), start_datetime=date_logged_in, last_active_datetime=date_viewed_coachreport, end_datetime=date_logged_out, ) logging.info("created login log for teacher %s" % t.username) coachreport_log = UserLog.objects.create( user=t, activity_type=UserLog.get_activity_int("coachreport"), start_datetime=date_viewed_coachreport, last_active_datetime=date_viewed_coachreport, end_datetime=date_viewed_coachreport, ) logs.append((login_log, coachreport_log)) logging.info("created coachreport log for teacher %s" % t.username) return logs
def generate_fake_coachreport_logs(): teacher_password = make_password('hellothere') t,_ = FacilityUser.objects.get_or_create( facility=Facility.objects.all()[0], username=random.choice(firstnames), defaults={ 'password' : teacher_password, 'is_teacher' : True, } ) # TODO: create flags later num_logs = 20 logs = [] for _ in xrange(num_logs): date_logged_in = datetime.datetime.now() - datetime.timedelta(days=random.randint(1,10)) date_viewed_coachreport = date_logged_in + datetime.timedelta(minutes=random.randint(0, 30)) date_logged_out = date_viewed_coachreport + datetime.timedelta(minutes=random.randint(0, 30)) login_log = UserLog.objects.create( user=t, activity_type=UserLog.get_activity_int("login"), start_datetime=date_logged_in, last_active_datetime=date_viewed_coachreport, end_datetime=date_logged_out, ) logging.info("created login log for teacher %s" % t.username) coachreport_log = UserLog.objects.create( user=t, activity_type=UserLog.get_activity_int("coachreport"), start_datetime=date_viewed_coachreport, last_active_datetime=date_viewed_coachreport, end_datetime=date_viewed_coachreport, ) logs.append((login_log, coachreport_log)) logging.info("created coachreport log for teacher %s" % t.username) return logs
def _get_user_usage_data(users, period_start=None, period_end=None): """ Returns facility user data, within the given date range. """ # compute period start and end # Now compute stats, based on queried data len_all_exercises = len(topicdata.NODE_CACHE['Exercise']) user_data = OrderedDict() group_data = OrderedDict() # Make queries efficiently exercise_logs = ExerciseLog.objects.filter(user__in=users, complete=True) video_logs = VideoLog.objects.filter(user__in=users) login_logs = UserLogSummary.objects.filter(user__in=users) # filter results if period_start: exercise_logs = exercise_logs.filter(completion_timestamp__gte=period_start) video_logs = video_logs.filter(completion_timestamp__gte=period_start) login_logs = login_logs.filter(start_datetime__gte=period_start) if period_end: exercise_logs = exercise_logs.filter(completion_timestamp__lte=period_end) video_logs = video_logs.filter(completion_timestamp__lte=period_end) login_logs = login_logs.filter(end_datetime__lte=period_end) # Force results in a single query exercise_logs = list(exercise_logs.values("exercise_id", "user__pk")) video_logs = list(video_logs.values("youtube_id", "user__pk")) login_logs = list(login_logs.values("activity_type", "total_seconds", "user__pk")) for user in users: user_data[user.pk] = OrderedDict() user_data[user.pk]["first_name"] = user.first_name user_data[user.pk]["last_name"] = user.last_name user_data[user.pk]["username"] = user.username user_data[user.pk]["group"] = user.group user_data[user.pk]["total_report_views"] = 0#report_stats["count__sum"] or 0 user_data[user.pk]["total_logins"] =0# login_stats["count__sum"] or 0 user_data[user.pk]["total_hours"] = 0#login_stats["total_seconds__sum"] or 0)/3600. user_data[user.pk]["total_exercises"] = 0 user_data[user.pk]["pct_mastery"] = 0. user_data[user.pk]["exercises_mastered"] = [] user_data[user.pk]["total_videos"] = 0 user_data[user.pk]["videos_watched"] = [] for elog in exercise_logs: user_data[elog["user__pk"]]["total_exercises"] += 1 user_data[elog["user__pk"]]["pct_mastery"] += 1. / len_all_exercises user_data[elog["user__pk"]]["exercises_mastered"].append(elog["exercise_id"]) for vlog in video_logs: user_data[vlog["user__pk"]]["total_videos"] += 1 user_data[vlog["user__pk"]]["videos_watched"].append(vlog["youtube_id"]) for llog in login_logs: if llog["activity_type"] == UserLog.get_activity_int("coachreport"): user_data[llog["user__pk"]]["total_report_views"] += 1 elif llog["activity_type"] == UserLog.get_activity_int("login"): user_data[llog["user__pk"]]["total_hours"] += (llog["total_seconds"]) / 3600. user_data[llog["user__pk"]]["total_logins"] += 1 # Add group data. Allow a fake group "Ungrouped" for user in users: group_pk = getattr(user.group, "pk", None) group_name = getattr(user.group, "name", "Ungrouped") if not group_pk in group_data: group_data[group_pk] = { "name": group_name, "total_logins": 0, "total_hours": 0, "total_users": 0, "total_videos": 0, "total_exercises": 0, "pct_mastery": 0, } group_data[group_pk]["total_users"] += 1 group_data[group_pk]["total_logins"] += user_data[user.pk]["total_logins"] group_data[group_pk]["total_hours"] += user_data[user.pk]["total_hours"] group_data[group_pk]["total_videos"] += user_data[user.pk]["total_videos"] group_data[group_pk]["total_exercises"] += user_data[user.pk]["total_exercises"] total_mastery_so_far = (group_data[group_pk]["pct_mastery"] * (group_data[group_pk]["total_users"] - 1) + user_data[user.pk]["pct_mastery"]) group_data[group_pk]["pct_mastery"] = total_mastery_so_far / group_data[group_pk]["total_users"] return (user_data, group_data)
def facility_usage(request, facility_id, org_id=None, zone_id=None): # Basic data org = get_object_or_None(Organization, pk=org_id) if org_id else None zone = get_object_or_None(Zone, pk=zone_id) if zone_id else None facility = get_object_or_404(Facility, pk=facility_id) groups = FacilityGroup.objects.filter(facility=facility).order_by("name") users = FacilityUser.objects.filter(facility=facility).order_by("last_name") # Accumulating data len_all_exercises = len(topicdata.NODE_CACHE['Exercise']) group_data = collections.OrderedDict() user_data = collections.OrderedDict() for user in users: exercise_logs = ExerciseLog.objects.filter(user=user) exercise_stats = {"count": exercise_logs.count(), "total_mastery": exercise_logs.aggregate(Sum("complete"))["complete__sum"]} video_stats = {"count": VideoLog.objects.filter(user=user).count()} login_stats = UserLogSummary.objects \ .filter(user=user, activity_type=UserLog.get_activity_int("login")) \ .aggregate(Sum("count"), Sum("total_seconds")) user_data[user.pk] = { "first_name": user.first_name, "last_name": user.last_name, "name": user.get_name(), "group": user.group, "total_logins": login_stats["count__sum"] or 0, "total_hours": (login_stats["total_seconds__sum"] or 0)/3600., "total_videos": video_stats["count"], "total_exercises": exercise_stats["count"], "pct_mastery": (exercise_stats["total_mastery"] or 0)/float(len_all_exercises), } group = user.group if group: if not group.pk in group_data: group_data[group.pk] = { "name": group.name, "total_logins": 0, "total_hours": 0, "total_users": 0, "total_videos": 0, "total_exercises": 0, "pct_mastery": 0, } group_data[group.pk]["total_users"] += 1 group_data[group.pk]["total_logins"] += user_data[user.pk]["total_logins"] group_data[group.pk]["total_hours"] += user_data[user.pk]["total_hours"] group_data[group.pk]["total_videos"] += user_data[user.pk]["total_videos"] group_data[group.pk]["total_exercises"] += user_data[user.pk]["total_exercises"] total_mastery_so_far = (group_data[group.pk]["pct_mastery"] * (group_data[group.pk]["total_users"] - 1) + user_data[user.pk]["pct_mastery"]) group_data[group.pk]["pct_mastery"] = total_mastery_so_far / group_data[group.pk]["total_users"] return { "org": org, "zone": zone, "facility": facility, "groups": group_data, "users": user_data, }
def _get_user_usage_data(users, period_start=None, period_end=None): """ Returns facility user data, within the given date range. """ # compute period start and end # Now compute stats, based on queried data num_exercises = len(topicdata.NODE_CACHE['Exercise']) user_data = OrderedDict() group_data = OrderedDict() # Make queries efficiently exercise_logs = ExerciseLog.objects.filter(user__in=users, complete=True) video_logs = VideoLog.objects.filter(user__in=users) login_logs = UserLogSummary.objects.filter(user__in=users) # filter results if period_start: exercise_logs = exercise_logs.filter( completion_timestamp__gte=period_start) video_logs = video_logs.filter(completion_timestamp__gte=period_start) login_logs = login_logs.filter(start_datetime__gte=period_start) if period_end: exercise_logs = exercise_logs.filter( completion_timestamp__lte=period_end) video_logs = video_logs.filter(completion_timestamp__lte=period_end) login_logs = login_logs.filter(end_datetime__lte=period_end) # Force results in a single query exercise_logs = list(exercise_logs.values("exercise_id", "user__pk")) video_logs = list(video_logs.values("video_id", "user__pk")) login_logs = list( login_logs.values("activity_type", "total_seconds", "user__pk")) for user in users: user_data[user.pk] = OrderedDict() user_data[user.pk]["first_name"] = user.first_name user_data[user.pk]["last_name"] = user.last_name user_data[user.pk]["username"] = user.username user_data[user.pk]["group"] = user.group user_data[user.pk][ "total_report_views"] = 0 #report_stats["count__sum"] or 0 user_data[ user.pk]["total_logins"] = 0 # login_stats["count__sum"] or 0 user_data[user.pk][ "total_hours"] = 0 #login_stats["total_seconds__sum"] or 0)/3600. user_data[user.pk]["total_exercises"] = 0 user_data[user.pk]["pct_mastery"] = 0. user_data[user.pk]["exercises_mastered"] = [] user_data[user.pk]["total_videos"] = 0 user_data[user.pk]["videos_watched"] = [] for elog in exercise_logs: user_data[elog["user__pk"]]["total_exercises"] += 1 user_data[elog["user__pk"]]["pct_mastery"] += 1. / num_exercises user_data[elog["user__pk"]]["exercises_mastered"].append( elog["exercise_id"]) for vlog in video_logs: user_data[vlog["user__pk"]]["total_videos"] += 1 user_data[vlog["user__pk"]]["videos_watched"].append(vlog["video_id"]) for llog in login_logs: if llog["activity_type"] == UserLog.get_activity_int("coachreport"): user_data[llog["user__pk"]]["total_report_views"] += 1 elif llog["activity_type"] == UserLog.get_activity_int("login"): user_data[llog["user__pk"]]["total_hours"] += ( llog["total_seconds"]) / 3600. user_data[llog["user__pk"]]["total_logins"] += 1 # Add group data. Allow a fake group "Ungrouped" for user in users: group_pk = getattr(user.group, "pk", None) group_name = getattr(user.group, "name", _("Ungrouped")) if not group_pk in group_data: group_data[group_pk] = { "name": group_name, "total_logins": 0, "total_hours": 0, "total_users": 0, "total_videos": 0, "total_exercises": 0, "pct_mastery": 0, } group_data[group_pk]["total_users"] += 1 group_data[group_pk]["total_logins"] += user_data[ user.pk]["total_logins"] group_data[group_pk]["total_hours"] += user_data[ user.pk]["total_hours"] group_data[group_pk]["total_videos"] += user_data[ user.pk]["total_videos"] group_data[group_pk]["total_exercises"] += user_data[ user.pk]["total_exercises"] total_mastery_so_far = (group_data[group_pk]["pct_mastery"] * (group_data[group_pk]["total_users"] - 1) + user_data[user.pk]["pct_mastery"]) group_data[group_pk][ "pct_mastery"] = total_mastery_so_far / group_data[group_pk][ "total_users"] return (user_data, group_data)
def facility_usage(request, facility_id, org_id=None, zone_id=None): # Basic data org = get_object_or_None(Organization, pk=org_id) if org_id else None zone = get_object_or_None(Zone, pk=zone_id) if zone_id else None facility = get_object_or_404(Facility, pk=facility_id) groups = FacilityGroup.objects.filter(facility=facility).order_by("name") users = FacilityUser.objects.filter( facility=facility).order_by("last_name") # Accumulating data len_all_exercises = len(topicdata.NODE_CACHE['Exercise']) group_data = collections.OrderedDict() user_data = collections.OrderedDict() for user in users: exercise_logs = ExerciseLog.objects.filter(user=user) exercise_stats = { "count": exercise_logs.count(), "total_mastery": exercise_logs.aggregate(Sum("complete"))["complete__sum"] } video_stats = {"count": VideoLog.objects.filter(user=user).count()} login_stats = UserLogSummary.objects \ .filter(user=user, activity_type=UserLog.get_activity_int("login")) \ .aggregate(Sum("count"), Sum("total_seconds")) user_data[user.pk] = { "first_name": user.first_name, "last_name": user.last_name, "name": user.get_name(), "group": user.group, "total_logins": login_stats["count__sum"] or 0, "total_hours": (login_stats["total_seconds__sum"] or 0) / 3600., "total_videos": video_stats["count"], "total_exercises": exercise_stats["count"], "pct_mastery": (exercise_stats["total_mastery"] or 0) / float(len_all_exercises), } group = user.group if group: if not group.pk in group_data: group_data[group.pk] = { "name": group.name, "total_logins": 0, "total_hours": 0, "total_users": 0, "total_videos": 0, "total_exercises": 0, "pct_mastery": 0, } group_data[group.pk]["total_users"] += 1 group_data[group.pk]["total_logins"] += user_data[ user.pk]["total_logins"] group_data[group.pk]["total_hours"] += user_data[ user.pk]["total_hours"] group_data[group.pk]["total_videos"] += user_data[ user.pk]["total_videos"] group_data[group.pk]["total_exercises"] += user_data[ user.pk]["total_exercises"] total_mastery_so_far = (group_data[group.pk]["pct_mastery"] * (group_data[group.pk]["total_users"] - 1) + user_data[user.pk]["pct_mastery"]) group_data[ group.pk]["pct_mastery"] = total_mastery_so_far / group_data[ group.pk]["total_users"] return { "org": org, "zone": zone, "facility": facility, "groups": group_data, "users": user_data, }