Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/cgi-bin/fetch_milestone.py
diff options
context:
space:
mode:
Diffstat (limited to 'cgi-bin/fetch_milestone.py')
-rwxr-xr-xcgi-bin/fetch_milestone.py198
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()
+