#!/usr/bin/python # # generate pyschometrics data from tracking logs and student module data import json from courseware.models import StudentModule from track.models import TrackingLog from psychometrics.models import PsychometricData from django.conf import settings from django.core.management.base import BaseCommand #db = "ocwtutor" # for debugging #db = "default" db = getattr(settings, 'DATABASE_FOR_PSYCHOMETRICS', 'default') class Command(BaseCommand): help = "initialize PsychometricData tables from StudentModule instances (and tracking data, if in SQL)." help += "Note this is done for all courses for which StudentModule instances exist." def handle(self, *args, **options): # delete all pmd #PsychometricData.objects.all().delete() #PsychometricData.objects.using(db).all().delete() smset = StudentModule.objects.using(db).exclude(max_grade=None) for sm in smset: usage_key = sm.module_state_key if not usage_key.block_type == "problem": continue try: state = json.loads(sm.state) done = state['done'] except: print "Oops, failed to eval state for %s (state=%s)" % (sm, sm.state) continue if done: # only keep if problem completed try: pmd = PsychometricData.objects.using(db).get(studentmodule=sm) except PsychometricData.DoesNotExist: pmd = PsychometricData(studentmodule=sm) pmd.done = done pmd.attempts = state['attempts'] # get attempt times from tracking log uname = sm.student.username tset = TrackingLog.objects.using(db).filter(username=uname, event_type__contains='problem_check') tset = tset.filter(event_source='server') tset = tset.filter(event__contains="'%s'" % usage_key) checktimes = [x.dtcreated for x in tset] pmd.checktimes = checktimes if not len(checktimes) == pmd.attempts: print "Oops, mismatch in number of attempts and check times for %s" % pmd #print pmd pmd.save(using=db) print "%d PMD entries" % PsychometricData.objects.using(db).all().count()