diff options
Diffstat (limited to 'cgi-bin/fetch_milestone.py')
-rwxr-xr-x | cgi-bin/fetch_milestone.py | 198 |
1 files changed, 111 insertions, 87 deletions
diff --git a/cgi-bin/fetch_milestone.py b/cgi-bin/fetch_milestone.py index 0b13db7..b69e911 100755 --- a/cgi-bin/fetch_milestone.py +++ b/cgi-bin/fetch_milestone.py @@ -4,102 +4,107 @@ import os, sys, subprocess from sugar.activity import activity import cgi, cgitb from path import path +import activities +from activities import getInstalled +from activities import getActivitiesJs +from activities import fetchMilestone +from activities import getMilestones +from activities import getActivities +from activities import setMilestones +from activities import setActivities DATAPATH = path(activity.get_activity_root())/ 'data' WORKPATH = DATAPATH / 'work' -USB = path('/media/2011/content') +USB = path('/media/2011/courseware') SS = path('/library/courseware') -#executes sftp command contained in scrpt -#note scrpt must be written to disk and read by sftp command -def sftp(script, folder = None): - flog = open('/tmp/flog','w') - pth = WORKPATH / 'script' - subprocess.call('rm -rf ' + pth, shell=True) - fout = open(pth, 'w') - fout.write(script) - fout.close() - print >> flog, 'script', script - authpth = '/home/olpc/.sugar/default/owner.key' - auth = ' -oIdentityFile=' + authpth - scrpt = ' -b ' + pth - fin = open('/ofw/serial-number','r') - serial_number = fin.read() - fin.close() - srvr = serial_number[:-1] + '@schoolserver' - cmd = 'sftp ' + auth + scrpt + ' ' + srvr - print >>flog, 'cmd=',cmd - if folder: - pid= subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=folder, shell=True) - pid.wait() - if pid.returncode == 0: - result = pid.communicate()[0] - else: - result = pid.returncode - else: - pid = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) - pid.wait() - if pid.returncode == 0: - result = pid.communicate()[0] - else: - result = pid.returncode - print >> flog, pid.returncode - flog.close() - return result - -def getInstalled(subject): - pth = path('content') / subject - temp = pth.dirs() - milestones = [] - for item in temp: - milestones.append(str(item.namebase)) - milestones.remove('karma') - return milestones - -def getMilestone(subject, grade, milestone): - print >>log, 'getMilestone', subject, grade, milestone - if USB.exists: #get from usb drive - pth = USB / subject - cmd = 'cp -r ' + pth / milestone + ' ' + 'content/'+ subject - subprocess.call(cmd,shell=True) - else: #get from schoolserver - folder = 'content/'+ subject - pth = SS / subject - script = 'cd ' + pth + '\nget -r ' + milestone - result = sftp(script, folder) +log = open('/tmp/logfm','w') def process_milestones(subject, grade, current_ms): #base on activities.js not milestone name - current_milestone = (sbj+grade+'m'+current_ms).lower() - next_milestone = (sbj+grade+'m'+next_ms).lower() - print >> log, 'process_student_mode',grade,current_milestone,next_milestone + #need to get milestones as list where current_ms is index + fin = open('content/'+subject+'/activities_'+grade.lower()+'.js','r') + txt = fin.read() + fin.close() + lines = txt.split('\n') + milestones = [] + for line in lines: + try: + milestone = eval(line)[0] + except: + continue + milestones.append(milestone) + current_milestone = milestones[int(current_ms)-1][4] + next_milestone = milestones[int(current_ms)][4] installed = getInstalled(subject) - print >> log, 'installed',subject,installed + if len(installed) < 1: + initialFlag = True + else: + initialFlag = False if not current_milestone in installed: - getMilestone(subject, current_milestone); + fetchMilestone(subject, grade, current_milestone) + milestones = getMilestones(subject) + for milestone in milestones: + if milestone[4] == current_milestone: + milestone[5] = 'blue' + setMilestones(subject,grade,milestones) if not next_milestone in installed: - getMilestone(subject, next_milestone) + fetchMilestone(subject, grade, next_milestone) + milestones = getMilestones(subject) + for milestone in milestones: + if milestone[4] == next_milestone: + milestone[5] = 'blue' + setMilestones(subject,grade,milestones) + if initialFlag and not mode == 'faculty': + #mark first milestone and first activity red + milestones = getMilestones(subject) + entry = milestones[0] + entry[5] = 'red' + milestone = entry[4] + setMilestones(subject, grade, milestones) + activities = getActivities(subject, milestone) + activities[0][5] = 'red' + setActivities(subject, milestone, activities) def process_student(student,student_record): - #copy grade activities.js to activities.js - subprocess.call('cp ' + 'content/English/activities_' + grade.lower()+'.js content/activities.js',shell=True) - subprocess.call('cp ' + 'content/Mathematics/activities_' + grade.lower()+'.js content/activities.js',shell=True) - #download needed milestones grade = student_record['grade'] en_milestone = student_record['milestones'][0] ma_milestone = student_record['milestones'][1] - print>>log, grade, en_milestone, ma_milestone + #copy activities.js for grade to activities.js + src = path('content') / 'English/activities_'+ grade.lower() + '.js' + dst = path('content') / 'English' / 'activities.js' + if not dst.exists(): + cmd = 'cp ' + src + ' ' + dst + subprocess.call(cmd,shell=True) + src = path('content') / 'Mathematics/activities_'+ grade.lower() + '.js' + dst = path('content') / 'Mathematics' / 'activities.js' + if not dst.exists(): + cmd = 'cp ' + src + ' ' + dst + subprocess.call(cmd,shell=True) + #return student menu + fin = open('menu/student_menu','r') + txt = fin.read() + fin.close() + print txt + #download needed milestones #English current_ms = en_milestone.split('.')[0] process_milestones('English',grade, current_ms) #Mathematics current_ms = ma_milestone.split('.')[1] process_milestones('Mathematics',grade, current_ms) - #return student menu - fin = open('menu/student_menu','r') - txt = fin.read() - fin.close() - print txt + +def setColor(subject, grade, milestone, color): + milestones = getMilestones(subject) + for ms in milestones: + if ms[4] == milestone: + ms[5] = color + setMilestones(subject, grade, milestones) + milestones = getMilestones(subject, grade = grade) + for ms in milestones: + if ms[4] == milestone: + ms[5] = color + setMilestones(subject, grade, milestones) def process_faculty(): sbj = form.getfirst('code', default="") @@ -110,14 +115,14 @@ def process_faculty(): fin.close() print txt else: + if sbj[:2] == 'en': + subject = 'English' + else: + subject = 'Mathematics' + grade = sbj[2:] milestone = form.getfirst('milestone', default = "") - if len(milestone)>0: - #fetch requested milestone - if sbj[:2] == 'en': - subject = 'English' - else: - subject = 'Mathematics' - getMilestone(subject, grade, milestone) + fetchMilestone(subject,grade,milestone) + setColor(subject, grade, milestone, 'blue') #main # @@ -125,7 +130,18 @@ def process_faculty(): # cgitb.enable(display=True) print 'Content-Type:text/html\n\n' -log = open('/tmp/logfm','w') +form = cgi.FieldStorage() +#if milestone activities.js not installed, install them +pth = path('content') / 'English' +fs = pth.files('*.js') +if len(fs) < 3: + #get them + getActivitiesJs('English') +pth = path('content') / 'Mathematics' +fs = pth.files('*.js') +if len(fs) < 3: + #get them + getActivitiesJs('Mathematics') #get nick fin = open(DATAPATH / 'learner','r') learner = fin.read() @@ -137,12 +153,20 @@ fin.close() student_record = eval(txt) grade = student_record['grade'] if grade == 'F': - mode = 'CW' + mode = 'faculty' else: mode = 'student' -print >> log, 'mode', mode -if mode == 'CW': - process_faculty() +print >> log, mode +if mode == 'faculty': + try: + process_faculty() + except: + print >> log, 'process_faculty failed',sys.exc_info()[:2] else: - process_student(learner,student_record) + try: + process_student(learner,student_record) + except: + print >> log, 'process student failed', sys.exc_info()[:2] +print >> log, 'done' log.close() + |