#-*- mode: python; mode: fold -*-
# $Id: Students.py 1997 2007-07-08 09:16:21Z joachim $
from string import Template
from Globals import InitializeClass
from AccessControl import ClassSecurityInfo
from AccessControl.SecurityManagement import newSecurityManager
from zExceptions import BadRequest
from Products.ZCatalog.ZCatalog import ZCatalog
from Products.CMFCore.utils import UniqueObject, getToolByName
from Products.CMFCore.permissions import View
from Products.CMFCore.permissions import ModifyPortalContent
from Products.CPSCore.CPSBase import CPSBase_adder, CPSBaseFolder
#from Products.CPSCore.CPSBase import CPSBaseDocument as BaseDocument
from Products.CPSDocument.CPSDocument import CPSDocument
from Products.CPSCore.CPSBase import CPSBaseBTreeFolder as BaseBTreeFolder
from Products.CPSCore.CPSMembershipTool import CPSUnrestrictedUser
from Products.WAeUP_SRP.Academics import makeCertificateCode
from Products.AdvancedQuery import Eq, Between, Le,In
from Products.azax import AzaxBaseView
import DateTime
import logging
import csv,re,os
import Globals
p_home = Globals.package_home(globals())
i_home = Globals.INSTANCE_HOME
MAX_TRANS = 1000
from urllib import urlencode
import DateTime
#import PIL.Image
from StringIO import StringIO
def makeCertificateCode(code): ###(
code = code.replace('.','')
code = code.replace('(','')
code = code.replace(')','')
code = code.replace('/','')
code = code.replace(' ','')
code = code.replace('_','')
return code
###)
def response_write(response,s): ###(
response.setHeader('Content-type','text/html; charset=ISO-8859-15')
while s.find('<') > -1:
s = s.replace('<','<')
while s.find('>') > -1:
#from pdb import set_trace;set_trace()
s = s.replace('>','>')
response.write("%s
\n" % s)
###)
def getInt(s): ###(
try:
return int(s)
except:
return 0
def getFloat(s):
try:
return float(s)
except:
return 0.0
###)
def getStudentByRegNo(self,reg_no): ###(
"""search student by JAMB Reg No and return StudentFolder"""
res = self.students_catalog(jamb_reg_no = reg_no.upper())
if len(res) == 1:
return getattr(self.portal_url.getPortalObject().campus.students,res[0].id)
else:
return None
# don't search in portal_catalog
# search = ZCatalog.searchResults(self.portal_catalog_real,{'meta_type': 'StudentApplication',
# 'SearchableText': reg_no,
# })
# if len(search) < 1:
# return None
# return search[0].getObject().aq_parent
###)
def checkJambNo(jnr): ###(
try:
if len(jnr) != 10:
return False
except:
return False
try:
int(jnr[:8])
return True
except:
return False
###)
def formatLGA(lga):
if lga.find('_') > -1:
return "%s / %s" % (lga.split('_')[0].upper(),lga.split('_')[1].upper())
return lga
class StudentsFolder(CPSDocument): ###(
"""
WAeUP container for the various WAeUP containers data
"""
meta_type = 'StudentsFolder'
portal_type = meta_type
security = ClassSecurityInfo()
security.declareProtected(ModifyPortalContent,"loadPumeResultsFromCSV")###(
def loadPumeResultsFromCSV(self):
"""load Fulltime Studentdata from CSV values into pumeresults catalog"""
import transaction
import random
## csv_d = {'jamb_reg_no': "RegNumber", ###(
## 'status': "Admission Status",
## 'name': "Name",
## 'score': "Score",
## 'sex': "Sex",
## 'faculty': "Faculty",
## 'department': "Dept",
## 'course': "Course",
## 'course_code_org': "Course Code",
## }
###)
## csv_d = {'jamb_reg_no': "JAMBRegno",
## 'name': "Name",
## 'score': "Score",
## 'sex': "Sex",
## 'course': "Course",
## 'faculty': "Faculty",
## 'department': "Dept",
## 'course_code_org': "Course Code",
## 'status': "Admission Status",
## 'result_type': None,
## }
csv_d = {'jamb_reg_no': "reg_no",
'name': "fullname",
'score': "pume_score",
'sex': "sex",
'course': "study_course",
'course_code_org': "study_course",
'status': "admission_status",
'result_type': "entry_mode",
}
csv_fields = [f[1] for f in csv_d.items() if f[1]]
tr_count = 0
total = 0
#name = 'pup_new'
#name = 'pup_update'
name = 'Admitted_update'
update = name.endswith('update')
no_import = []
ok_import = []
ok_import.append('%s' % ','.join(['"%s"' % fn for fn in csv_d.keys()]))
no_import.append('%s' % ','.join(['"%s"' % fn for fn in csv_fields]))
current = DateTime.DateTime().strftime("%d-%m-%y_%H_%M_%S")
ok_import_name = "%s/import/%s_imported_%s.csv" % (i_home,name,current)
#open(ok_import_name,"w").write('\n'.join(no_import))
no_import_name = "%s/import/%s_not_imported_%s.csv" % (i_home,name,current)
#open(no_import_name,"w").write('\n'.join(no_import))
logger = logging.getLogger('Students.loadPumeResultsFromCSV')
starttime = DateTime.now()
logger.info('Start loading from %s.csv' % name)
try:
result = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
except:
logger.error('Error reading %s.csv' % name)
return
pume = self.portal_pumeresults
format = ','.join(['"%%(%s)s"' % fn for fn in csv_fields])
import_format = ','.join(['"%%(%s)s"' % fn for fn in csv_d.keys()])
eduplicate = '%s,"duplicate"' % format
eoriginal = '%s,"original"' % format
einvalidjamb = '%s,"invalid JambRegNo"' % format
added = 'added ,%s' % format
#from pdb import set_trace;set_trace()
for jamb in result:
if not jamb.get(csv_d['score']):
logger.info('Student %s has no pume_score' % jamb.get(csv_d['jamb_reg_no']))
continue
dict = {}
for f,fn in csv_d.items():
dict[f] = jamb.get(csv_d[f])
dict['result_type'] = 'CEST'
jnr = jamb.get(csv_d['jamb_reg_no'])
#if not checkJambNo(jnr):
# logger.info(einvalidjamb % jamb)
# dd = {}
# for f,fn in csv_d.items():
# dd[fn] = getattr(data,f)
# no_import.append(eduplicate % dd)
# no_import.append(eduplicate % jamb)
# continue
res = pume(jamb_reg_no=jnr)
if len(res) > 0:
if update:
try:
pume.modifyRecord(**dict)
# Can not happen, but anyway...
except ValueError:
logger.info(eduplicate % jamb)
continue
# Can not happen, but anyway...
except KeyError:
pume.addRecord(**dict)
logger.info(added % jamb)
continue
else:
data = res[0]
if data.name != jamb.get(csv_d['name']):
#set_trace()
logger.info(eduplicate % jamb)
#em = 'Student with REG-NO %(jamb_reg_no)s already exists\n' % dict
#logger.info(em)
dd = {}
for f,fn in csv_d.items():
dd[fn] = getattr(data,f)
no_import.append(eoriginal % dd)
no_import.append(eduplicate % jamb)
continue
else:
try:
pume.addRecord(**dict)
ok_import.append(import_format % dict)
except ValueError:
logger.info(eduplicate % jamb)
#em = 'Student with REG-NO %(jamb_reg_no)s already exists\n' % dict
#logger.info(em)
no_import.append(eduplicate % jamb)
logger.info('End loading from %s.csv' % name)
if len(no_import) > 1:
open(no_import_name,"w+").write('\n'.join(no_import))
open(ok_import_name,"w+").write('\n'.join(ok_import))
return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
###)
security.declareProtected(ModifyPortalContent,"createStudents")###(
def createStudents(self):
"""
load addmitted Studentdata from CSV values and create Studentobjects.
This is the current method to create new addmitted Students.
Before running the eventservice for the students_catalog must be disabled.
"""
import transaction
import random
#from pdb import set_trace
wftool = self.portal_workflow
#students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
students_folder = self.portal_url.getPortalObject().campus.students
levels = {'ume_ft':'100',
'de_ft': '200',
'ug_pt': '100',
'de_pt': '200',
'pg_ft': '700',
'pg_pt': '700',
'dp_pt': '100',
'dp_ft': '100',
}
csv_d = {'jamb_reg_no': "reg_no",
'entry_mode': 'entry_mode',
'jamb_firstname': "firstname",
'jamb_middlename': "middlename",
'jamb_lastname': "lastname",
'jamb_sex': "sex",
'jamb_state': "state",
'birthday': "date_of_birth",
'app_email': "email",
'study_course': "study_course",
'perm_address': "address",
'admission_status': "admission_status",
}
csv_fields = [f[1] for f in csv_d.items()]
tr_count = 0
total = 0
#name = 'pume_results'
name = 'Admitted_update'
no_import = []
s = ','.join(['"%s"' % fn for fn in csv_fields])
no_import.append('"Error",%s' % s)
format = '"%(Error)s",' + ','.join(['"%%(%s)s"' % fn for fn in csv_fields])
no_certificate = "no certificate %s" % format
open("%s/import/%s_not_imported.csv" % (i_home,name),"w").write('\n'.join(no_import))
logger = logging.getLogger('Students.StudentsFolder.createStudents')
logger.info('Start loading from %s.csv' % name)
certs = {}
try:
results = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
except:
logger.error('Error reading %s.csv' % name)
return
for result in results:
if not result.get(csv_d['admission_status']).startswith('Admitted'):
continue
#result['Error'] = "Processing "
#logger.info(format % result)
jamb_reg_no = result.get(csv_d['jamb_reg_no'])
res = self.students_catalog(jamb_reg_no = jamb_reg_no)
if res:
em = 'Student with RegNo %s already exists\n' % jamb_reg_no
logger.info(em)
result['Error'] = "Student exists"
no_import.append(format % result)
continue
cert_id = makeCertificateCode(result.get(csv_d['study_course']))
if cert_id not in certs.keys():
res = self.portal_catalog(meta_type = "Certificate",id = cert_id)
if not res:
em = 'No Certificate with ID %s \n' % cert_id
logger.info(em)
result['Error'] = "No Certificate %s" % cert_id
no_import.append( format % result)
continue
cert = res[0]
cert_path = cert.getPath().split('/')
certificate = certs[cert_id] = {'faculty': cert_path[-4],
'department': cert_path[-3]}
cert_doc = certs[cert_id]
catalog_entry = {}
catalog_entry['jamb_reg_no'] = jamb_reg_no
firstname = result.get(csv_d['jamb_firstname'])
middlename = result.get(csv_d['jamb_middlename'])
lastname = result.get(csv_d['jamb_lastname'])
if len(firstname) < 3\
and len(middlename) < 3\
and len(lastname) < 3:
em = 'Student Names to short \n'
logger.info(em)
result['Error'] = "Names to short"
no_import.append( format % result)
continue
perm_address = result.get(csv_d['perm_address'])
sid = self.generateStudentId('x')
students_folder.invokeFactory('Student', sid)
catalog_entry['id'] = sid
tr_count += 1
logger.info('%(total)s+%(tr_count)s: Creating Student with ID %(sid)s reg_no %(jamb_reg_no)s ' % vars())
student = getattr(self,sid)
student.manage_setLocalRoles(sid, ['Owner',])
student.invokeFactory('StudentApplication','application')
da = {'Title': 'Application Data'}
da["jamb_firstname"] = firstname
da["jamb_middlename"] = middlename
da["jamb_lastname"] = lastname
catalog_entry['entry_session'] = da["entry_session"] = self.getSessionId()[-2:]
catalog_entry['sex'] = sex = result.get(csv_d['jamb_sex']).startswith('F')
da_fields = ('jamb_reg_no',
'jamb_sex',
'jamb_state',
'entry_mode',
'app_email',
)
for f in da_fields:
da[f] = result.get(csv_d[f])
catalog_entry['email'] = da['app_email']
catalog_entry['entry_mode'] = da['entry_mode']
app = student.application
app_doc = app.getContent()
app.getContent().edit(mapping=da)
picture ="%s/import/pictures/%s.jpg" % (i_home,jamb_reg_no)
app.manage_setLocalRoles(sid, ['Owner',])
picture_id = da['jamb_reg_no'].replace('/','_')
file = None
for ext in ('jpg','JPG'):
picture ="%s/import/pictures_admitted_latest/%s.%s" % (i_home,picture_id,ext)
if os.path.exists(picture):
file = open(picture)
break
if file is not None:
## file conversion does not work
#img = PIL.Image.open(file)
#img.thumbnail((150,200),
# resample=PIL.Image.ANTIALIAS)
#outfile = StringIO()
#img.save(outfile, format=img.format)
outfile = file.read()
app_doc.manage_addFile('passport',
file=outfile,
title="%s.jpg" % jamb_reg_no)
#wftool.doActionFor(app,'close')
dp = {}
dp['firstname'] = firstname
dp['middlename'] = middlename
dp['lastname'] = lastname
dp['email'] = da['app_email']
dp['sex'] = sex
dp['perm_address'] = perm_address
catalog_entry['name'] = "%(firstname)s %(middlename)s %(lastname)s" % dp
student.invokeFactory('StudentPersonal','personal')
per = student.personal
per_doc = per.getContent()
per_doc.edit(mapping = dp)
per.manage_setLocalRoles(sid, ['Owner',])
wftool.doActionFor(student,'pume_pass')
wftool.doActionFor(student,'admit')
#
# Clearance
#
student.invokeFactory('StudentClearance','clearance')
#wftool.doActionFor(student.clearance,'open')
clearance = student.clearance
dc = {'Title': 'Clearance/Eligibility Record'}
clearance = student.clearance
date_str = result.get(csv_d['birthday'])
try:
date = DateTime.DateTime(date_str)
except:
#import pdb;pdb.set_trace()
date = None
dc['birthday'] = date
clearance.getContent().edit(mapping=dc)
clearance.manage_setLocalRoles(sid, ['Owner',])
#
# Study Course
#
student.invokeFactory('StudentStudyCourse','study_course')
study_course = student.study_course
dsc = {}
catalog_entry['level'] = dsc['current_level'] = levels.get(da['entry_mode'],'100')
#catalog_entry['level'] = dsc['current_level'] = '100' # Attention: not for DE students
catalog_entry['session'] = dsc['current_session'] = da['entry_session']
catalog_entry['mode'] = dsc['current_mode'] = da['entry_mode']
catalog_entry['course'] = dsc['study_course'] = cert_id
catalog_entry['faculty'] = certificate['faculty']
catalog_entry['department'] = certificate['department']
catalog_entry['verdict'] = dsc['current_verdict'] = 'N/A'
catalog_entry['review_state'] = self.portal_workflow.getInfoFor(student,'review_state',None)
study_course.getContent().edit(mapping=dsc)
#import pdb;pdb.set_trace()
self.students_catalog.addRecord(**catalog_entry)
if tr_count > 100:
if len(no_import) > 0:
open("%s/import/%s_not_imported.csv" % (i_home,name),"a").write(
'\n'.join(no_import) + "\n")
no_import = []
em = '%d transactions commited\n' % tr_count
transaction.commit()
logger.info(em)
total += tr_count
tr_count = 0
open("%s/import/%s_not_imported.csv" % (i_home,name),"a").write(
'\n'.join(no_import))
return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
###)
security.declareProtected(ModifyPortalContent,"transferStudents")###(
def transferStudents(self,filename):
"""
load Interfaculty transferStudents Studentdata from CSV values.
"""
import transaction
import random
current = DateTime.DateTime().strftime("%d-%m-%y_%H_%M_%S")
pm = self.portal_membership
member = pm.getAuthenticatedMember()
logger = logging.getLogger('Students.StudentsFolder.transferStudents')
#students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
students_folder = self.portal_url.getPortalObject().campus.students
csv_fields = ('old_matric_no',
'matric_no',
'study_course',
'current_mode',
'current_level',
)
tr_count = 0
total = 0
total_imported = 0
total_not_imported = 0
imported = []
not_imported = []
certs = {}
try:
results = csv.DictReader(open("%s/import/%s.csv" % (i_home,filename),"rb"))
except:
logger.error('Error reading %s.csv' % filename)
return
start = True
for result in results:
total += 1
if start:
start = False
logger.info('%s starts import from %s.csv' % (member,filename))
import_keys = [k for k in result.keys() if not k.startswith('ignore')]
diff2schema = set(import_keys).difference(set(csv_fields))
if diff2schema:
em = "not ignorable key(s) %s found in heading" % diff2schema
return em
s = ','.join(['"%s"' % fn for fn in import_keys])
open("%s/import/%s_not_imported%s.csv" % (i_home,filename,current),"a").write(s + ',"Error"'+ '\n')
s = '"id",' + s
open("%s/import/%s_imported%s.csv" % (i_home,filename,current),"a").write(s + '\n')
format = ','.join(['"%%(%s)s"' % fn for fn in import_keys])
format_error = format + ',"%(Error)s"'
format = '"%(id)s",'+ format
old_matric_no = result.get('old_matric_no')
res = self.students_catalog(matric_no = old_matric_no)
result['id'] = "None"
if not res:
em = 'Student with matric_no %s not found' % old_matric_no
logger.info(em)
result['Error'] = "Student does not exist"
not_imported.append(format_error % result)
total_not_imported += 1
continue
student_brain = res[0]
student_object = getattr(students_folder,student_brain.id)
result['id'] = student_brain.id
cert_id = makeCertificateCode(result.get('study_course'))
if cert_id not in certs.keys():
res = self.portal_catalog(meta_type = "Certificate",id = cert_id)
if not res:
em = 'No certificate with ID %s \n' % cert_id
logger.info(em)
result['Error'] = "No Certificate %s" % cert_id
not_imported.append( format_error % result)
total_not_imported += 1
continue
cert = res[0]
cert_path = cert.getPath().split('/')
certificate = certs[cert_id] = {'faculty': cert_path[-4],
'department': cert_path[-3]}
cert_doc = certs[cert_id]
clearance = getattr(student_object,'clearance',None)
if clearance is None:
em = 'Student has no clearance object'
logger.info(em)
result['Error'] = em
not_imported.append( format_error % result)
total_not_imported += 1
continue
clearance_doc = clearance.getContent()
study_course = student_object.study_course
study_course_doc = study_course.getContent()
old_study_course = study_course_doc.study_course
old_current_level = study_course_doc.current_level
current_level = result.get('current_level',None)
new_study_course = result.get('study_course',None)
try:
icl = int(current_level)
except:
em = 'Invalid new level %s' % current_level
logger.info(em)
result['Error'] = em
not_imported.append( format_error % result)
total_not_imported += 1
continue
if icl == int(old_current_level) and old_study_course == new_study_course:
em = 'Already transferred'
logger.info(em)
result['Error'] = em
not_imported.append( format_error % result)
total_not_imported += 1
continue
if study_course.objectIds():
em = 'Already registered level %s for %s, but is supposed to study %s at level %s' % (old_current_level,old_study_course,new_study_course,current_level)
logger.info(em)
result['Error'] = em
not_imported.append( format_error % result)
total_not_imported += 1
continue
#from pdb import set_trace; set_trace()
cd = {}
matric_no_history = getattr(clearance_doc,'matric_no_history',[])
if not matric_no_history:
matric_no_history = []
matric_no_history.append(old_matric_no)
cd['matric_no_history'] = matric_no_history
cd['matric_no'] = result.get('matric_no')
clearance_doc.edit(mapping = cd)
dsc = {}
study_course_history = getattr(study_course_doc,'study_course_history',[])
if not study_course_history:
study_course_history = []
study_course_history.append(old_study_course)
dsc['study_course_history'] = study_course_history
dsc['study_course'] = new_study_course
dsc['current_level'] = current_level
dsc['current_mode'] = result.get('current_mode')
study_course_doc.edit(mapping=dsc)
imported.append( format % result)
tr_count += 1
total_imported += 1
if tr_count > 1000:
if len(not_imported) > 0:
open("%s/import/%s_not_imported%s.csv" % (i_home,filename,current),"a").write(
'\n'.join(not_imported) + '\n')
not_imported = []
if len(imported) > 0:
open("%s/import/%s_imported%s.csv" % (i_home,filename,current),"a").write(
'\n'.join(imported) + '\n')
imported = []
em = '%d transactions committed\n' % (tr_count)
transaction.commit()
regs = []
logger.info(em)
tr_count = 0
if len(imported) > 0:
open("%s/import/%s_imported%s.csv" % (i_home,filename,current),"a").write(
'\n'.join(imported))
if len(not_imported) > 0:
open("%s/import/%s_not_imported%s.csv" % (i_home,filename,current),"a").write(
'\n'.join(not_imported))
em = "Imported: %d, not imported: %d of total %d" % (total_imported,total_not_imported,total)
logger.info(em)
return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
###)
security.declareProtected(ModifyPortalContent,"importReturningStudents")###(
def importReturningStudents(self):
"""load Returning Studentdata from CSV values"""
import transaction
import random
#from pdb import set_trace
wftool = self.portal_workflow
current = DateTime.DateTime().strftime("%d-%m-%y_%H_%M_%S")
#students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
students_folder = self.portal_url.getPortalObject().campus.students
tr_count = 1
total = 0
#name = 'pume_results'
name = 'Returning'
table = self.returning_import
no_import = []
imported = []
logger = logging.getLogger('Students.StudentsFolder.importReturningStudents')
try:
returning = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
except:
logger.error('Error reading %s.csv' % name)
return
l = self.portal_catalog({'meta_type': "Certificate"})
certs = {}
cert_docs = {}
for f in l:
certs[f.getId] = f.getObject().getContent()
start = True
res = table()
regs = []
if len(res) > 0:
regs = [s.matric_no for s in res]
#import pdb;pdb.set_trace()
for student in returning:
if start:
start = False
logger.info('Start loading from %s.csv' % name)
s = ','.join(['"%s"' % fn for fn in student.keys()])
imported.append(s)
no_import.append('%s,"Error"' % s)
format = ','.join(['"%%(%s)s"' % fn for fn in student.keys()])
format_error = format + ',"%(Error)s"'
no_certificate = "no certificate %s" % format
student['matric_no'] = matric_no = student.get('matric_no').upper()
student['Mode_of_Entry'] = entry_mode = student.get('Mode of Entry').upper()
student['Permanent_Address'] = perm_address = student.get('Permanent Address')
if matric_no == '':
student['Error'] = "Empty matric_no"
no_import.append( format_error % student)
continue
if matric_no in regs or self.returning_import(matric_no = matric_no):
student['Error'] = "Duplicate"
no_import.append( format_error % student)
continue
cert_id = makeCertificateCode(student.get('Coursemajorcode'))
if cert_id not in certs.keys():
student['Error'] = "No Certificate %s" % cert_id
no_import.append( format_error % student)
continue
try:
table.addRecord(**student)
except ValueError:
student['Error'] = "Duplicate"
no_import.append( format_error % student)
continue
regs.append(student.get('matric_no'))
imported.append(format % student)
tr_count += 1
if tr_count > 1000:
if len(no_import) > 0:
open("%s/import/%s_not_imported%s.csv" % (i_home,name,current),"a").write(
'\n'.join(no_import) + '\n')
no_import = []
open("%s/import/%simported%s.csv" % (i_home,name,current),"a").write(
'\n'.join(no_import) + "\n")
imported = []
em = '%d transactions commited total %s\n' % (tr_count,total)
transaction.commit()
regs = []
logger.info(em)
total += tr_count
tr_count = 0
open("%s/import/%simported%s.csv" % (i_home,name,current),"a").write(
'\n'.join(imported))
open("%s/import/%s_not_imported%s.csv" % (i_home,name,current),"a").write(
'\n'.join(no_import))
return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
###)
security.declareProtected(ModifyPortalContent,"fixAllNames")###(
def fixAllNames(self):
"fix all students names"
import transaction
response = self.REQUEST.RESPONSE
logger = logging.getLogger('fixAllNames')
logger.info('Start')
students = self.portal_catalog(portal_type='Student')
count = 0
total = 0
for student in students:
scat_res = self.students_catalog(id = student.getId)
if not scat_res:
self.students_catalog.addRecord(id = student.getId)
scat_res = self.students_catalog(id = student.getId)
student_entry = scat_res[0]
old_new = self.fixName(student,student_entry)
count += 1
response_write(response,'"%d","%s",%s' % (count + total,student_entry.id,old_new))
if count > 2000:
transaction.commit()
logger.info("%d transactions commited" % count)
total += count
count = 0
###)
security.declareProtected(ModifyPortalContent,"fixName")###(
def fixName(self,student_brain, student_entry):
"fix the name of a student"
fix = "first"
if student_entry.get('name_fixed',None) == fix:
return "Name already fixed"
student_id = student_entry.id
new_student = student_entry.jamb_reg_no.startswith('6')
student_obj = student_brain.getObject()
personal = getattr(student_obj,'personal',None)
invalid = ''
if personal is None:
return '"%s","Returning","%s","%s"' % (invalid,student_entry.name,"not logged in")
per_doc = personal.getContent()
old_first = per_doc.firstname
old_middle = per_doc.middlename
old_last = per_doc.lastname
new_first = ''
new_middle = ''
new_last = ''
if new_student:
if not old_first and not old_middle and old_last:
new_names = [n.capitalize() for n in old_last.split()]
if len(new_names) > 1:
old_first = new_names[0]
old_last = new_names[-1]
old_middle = ' '.join(new_names[1:-1])
else:
old_last = new_names[0]
old_first = ''
old_middle = ''
if old_first:
new_first = old_first
if old_middle:
new_middle = old_middle
if old_last:
new_last = old_last
if old_first.find('<') != -1 or\
old_first.find('>') != -1 or\
old_middle.find('<') != -1 or\
old_middle.find('>') != -1 or\
old_last.find('<') != -1 or\
old_last.find('>') != -1:
invalid = "invalid characters"
else:
new_first = old_first
if new_first.strip() == '-':
new_first = ''
new_middle = old_middle
if new_middle.strip() == '-':
new_middle = ''
new_last = old_last
if new_last.strip() == '-':
new_last = ''
name = "%(new_first)s %(new_middle)s %(new_last)s" % vars()
if new_student:
text = "New"
else:
text = "Returning"
old_new = '"%s","%s","%s","%s"' % (invalid,text,
student_entry.name,
name)
if not invalid:
self.students_catalog.modifyRecord(id = student_id,
name_fixed = fix,
name = name)
per_doc.edit(mapping = {'firstname' : new_first,
'middlename' : new_middle,
'lastname' : new_last,
})
return old_new
###)
security.declareProtected(ModifyPortalContent,"updateReturningStudents")###(
def updateReturningStudents(self):
"""load and overwrite Returning Student Data from CSV values"""
import transaction
import random
#from pdb import set_trace
wftool = self.portal_workflow
current = DateTime.DateTime().strftime("%d-%m-%y_%H_%M_%S")
#students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
students_folder = self.portal_url.getPortalObject().campus.students
tr_count = 1
total = 0
#name = 'pume_results'
name = 'Returning_update'
table = self.returning_import
no_import = []
imported = []
logger = logging.getLogger('Students.StudentsFolder.updateReturningStudents')
try:
returning = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
except:
logger.error('Error reading %s.csv' % name)
return
l = self.portal_catalog({'meta_type': "Certificate"})
certs = {}
cert_docs = {}
for f in l:
certs[f.getId] = f.getObject().getContent()
start = True
res = table()
regs = []
if len(res) > 0:
regs = [s.matric_no for s in res]
for student in returning:
if start:
start = False
logger.info('Start loading from %s.csv' % name)
s = ','.join(['"%s"' % fn for fn in student.keys()])
imported.append(s)
no_import.append('%s,"Error"' % s)
format = ','.join(['"%%(%s)s"' % fn for fn in student.keys()])
format_error = format + ',"%(Error)s"'
no_certificate = "no certificate %s" % format
matric_no = student.get('matric_no').upper()
student['matric_no'] = matric_no
if matric_no == '':
student['Error'] = "Empty matric_no"
no_import.append( format_error % student)
continue
# if matric_no in regs or self.returning_import(matric_no = matric_no):
# student['Error'] = "Duplicate"
# no_import.append( format_error % student)
# continue
# cert_id = makeCertificateCode(student.get('Coursemajorcode'))
# if cert_id not in certs.keys():
# student['Error'] = "No Certificate %s" % cert_id
# no_import.append( format_error % student)
# continue
try:
table.modifyRecord(**student)
except KeyError:
#import pdb;pdb.set_trace()
student['Error'] = "no Student found to update"
no_import.append( format_error % student)
continue
#s = self.students_catalog(matric_no=matric_no)
#if s:
# level = "%s" % (int(student.get('Level')) + 100)
# self.students_catalog.modifyRecord(id = s[0].id,
# level=level)
regs.append(student.get('matric_no'))
imported.append(format % student)
tr_count += 1
if tr_count > 1000:
if len(no_import) > 0:
open("%s/import/%s_not_imported%s.csv" % (i_home,name,current),"a").write(
'\n'.join(no_import) + '\n')
no_import = []
open("%s/import/%simported%s.csv" % (i_home,name,current),"a").write(
'\n'.join(no_import) + "\n")
imported = []
em = '%d transactions commited total %s\n' % (tr_count,total)
transaction.commit()
regs = []
logger.info(em)
total += tr_count
tr_count = 0
open("%s/import/%simported%s.csv" % (i_home,name,current),"a").write(
'\n'.join(imported))
open("%s/import/%s_not_imported%s.csv" % (i_home,name,current),"a").write(
'\n'.join(no_import))
return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
###)
security.declareProtected(ModifyPortalContent,"exportStudents")###(
def exportStudents(self):
"""export Studentsdata to a file"""
member = self.portal_membership.getAuthenticatedMember()
logger = logging.getLogger('Students.exportStudents')
current = DateTime.DateTime().strftime("%d-%m-%y_%H_%M_%S")
students_folder = self.portal_url.getPortalObject().campus.students
export_file = "%s/export/students_%s.csv" % (i_home,current)
from Products.AdvancedQuery import Eq, Between, Le,In,MatchRegexp
aq_students = self.students_catalog.evalAdvancedQuery
toexport = {'students_catalog': ("id",
"matric_no",
"jamb_reg_no",
"review_state",
"sex",
"email",
"faculty",
"department",
"course",
"level",
),
'personal': ('firstname',
'middlename',
'lastname',
'perm_address',
),
'clearance': ('state',
'lga',
)
}
res_list = []
lines = []
fields = []
with_lga = False
for k in toexport.keys():
for f in toexport[k]:
if f == 'lga' :
with_lga = True
fields.append(f)
headline = ','.join(fields).replace('level','current_level')
open(export_file,"a").write(headline +'\n')
format = '"%(' + ')s","%('.join(fields) + ')s"'
query = In('review_state',('cleared_and_validated',
'school_fee_paid',
'courses_registered',
'courses_validated'))
students = aq_students(query)
nr2export = len(students)
logger.info('%s starts exportStudents, %s student records to export' % (member,nr2export))
chunk = 2000
total = 0
start = DateTime.DateTime().timeTime()
start_chunk = DateTime.DateTime().timeTime()
## alternative method slightly slower
# student_recs = {}
# for s in students:
# student_recs[s.id] = s
# catalog_recs = {}
# brains = self.portal_catalog(portal_type = 'Student')
# for cat_rec in brains:
# sid = cat_rec.getId
# catalog_recs[sid] = cat_rec
# #import pdb;pdb.set_trace()
# start = DateTime.DateTime().timeTime()
# start_chunk = DateTime.DateTime().timeTime()
# for student in students:
# if student.id not in student_recs.keys():
# continue
# not_all = False
# d = self.getFormattedStudentEntry(student_recs[student.id])
# student_obj = catalog_recs[student.id].getObject()
for student in students:
not_all = False
d = self.getFormattedStudentEntry(student)
student_obj = getattr(students_folder,student.id)
for k in toexport.keys()[1:]:
try:
object = getattr(student_obj,k)
object_doc = object.getContent()
except:
logger.info('%s %s record not found' % (student.id,k))
not_all = True
continue
for f in toexport[k]:
d[f] = getattr(object_doc,f,'')
if not_all:
continue
if with_lga:
d['lga'] = formatLGA(d['lga'])
lines.append(format % d)
total += 1
if total and not total % chunk or total == len(students):
open(export_file,"a").write('\n'.join(lines) +'\n')
anz = len(lines)
logger.info("wrote %(anz)d total written %(total)d" % vars())
end_chunk = DateTime.DateTime().timeTime()
duration = end_chunk-start_chunk
per_record = duration/anz
till_now = end_chunk - start
avarage_per_record = till_now/total
estimated_end = DateTime.DateTime(start + avarage_per_record * nr2export)
estimated_end = estimated_end.strftime("%H:%M:%S")
logger.info('%(duration)4.1f, %(per_record)4.3f,end %(estimated_end)s' % vars())
start_chunk = DateTime.DateTime().timeTime()
lines = []
end = DateTime.DateTime().timeTime()
logger.info('total time %6.2f m' % ((end-start)/60))
filename, extension = os.path.splitext(export_file)
from subprocess import call
msg = "wrote %(total)d records to %(export_file)s" % vars()
try:
retcode = call('gzip %s' % (export_file),shell=True)
if retcode == 0:
msg = "wrote %(total)d records to %(export_file)s.gz" % vars()
except OSError, e:
retcode = -99
logger.info("zip failed with %s" % e)
logger.info(msg)
args = {'portal_status_message': msg}
#url = self.REQUEST.get('URL1') + '?' + urlencode(args)
url = self.REQUEST.get('URL2')
return self.REQUEST.RESPONSE.redirect(url)
###)
security.declareProtected(ModifyPortalContent,"dumpStudentsCatalog")###(
def dumpStudentsCatalog(self):
"""dump all data in students_catalog to a csv"""
member = self.portal_membership.getAuthenticatedMember()
logger = logging.getLogger('Students.dumpStudentsCatalog')
current = DateTime.DateTime().strftime("%d-%m-%y_%H_%M_%S")
export_file = "%s/export/students_catalog_%s.csv" % (i_home,current)
res_list = []
lines = []
fields = []
for f in self.students_catalog.schema():
fields.append(f)
headline = ','.join(fields)
open(export_file,"a").write(headline +'\n')
format = '"%(' + ')s","%('.join(fields) + ')s"'
students = self.students_catalog()
nr2export = len(students)
logger.info('%s starts exportStudents, %s student records to export' % (member,nr2export))
chunk = 2000
total = 0
start = DateTime.DateTime().timeTime()
start_chunk = DateTime.DateTime().timeTime()
for student in students:
not_all = False
d = self.getFormattedStudentEntry(student)
lines.append(format % d)
total += 1
if total and not total % chunk or total == len(students):
open(export_file,"a").write('\n'.join(lines) +'\n')
anz = len(lines)
logger.info("wrote %(anz)d total written %(total)d" % vars())
end_chunk = DateTime.DateTime().timeTime()
duration = end_chunk-start_chunk
per_record = duration/anz
till_now = end_chunk - start
avarage_per_record = till_now/total
estimated_end = DateTime.DateTime(start + avarage_per_record * nr2export)
estimated_end = estimated_end.strftime("%H:%M:%S")
logger.info('%(duration)4.1f, %(per_record)4.3f,end %(estimated_end)s' % vars())
start_chunk = DateTime.DateTime().timeTime()
lines = []
end = DateTime.DateTime().timeTime()
logger.info('total time %6.2f m' % ((end-start)/60))
filename, extension = os.path.splitext(export_file)
from subprocess import call
msg = "wrote %(total)d records to %(export_file)s" % vars()
try:
retcode = call('gzip %s' % (export_file),shell=True)
if retcode == 0:
msg = "wrote %(total)d records to %(export_file)s.gz" % vars()
except OSError, e:
retcode = -99
logger.info("zip failed with %s" % e)
logger.info(msg)
args = {'portal_status_message': msg}
#url = self.REQUEST.get('URL1') + '?' + urlencode(args)
url = self.REQUEST.get('URL2')
return self.REQUEST.RESPONSE.redirect(url)
###)
security.declareProtected(ModifyPortalContent,"importResults")###(
def importResults(self):
"""load Returning Students Results from CSV"""
import transaction
import random
#from pdb import set_trace
wftool = self.portal_workflow
current = DateTime.DateTime().strftime("%d-%m-%y_%H_%M_%S")
#students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
students_folder = self.portal_url.getPortalObject().campus.students
tr_count = 1
total = 0
#name = 'pume_results'
name = 'Results'
table = self.results_import
no_import = []
imported = []
logger = logging.getLogger('Students.StudentsFolder.importResults')
try:
results = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
except:
logger.error('Error reading %s.csv' % name)
return
l = self.portal_catalog({'meta_type': "Course"})
courses = [f.getId for f in l]
start = True
res = table()
regs = []
if len(res) > 0:
regs = [s.key for s in res]
no_course = []
no_course_list = []
course_count = 0
for result in results:
if start:
start = False
logger.info('Start loading from %s.csv' % name)
s = ','.join(['"%s"' % fn for fn in result.keys()])
imported.append(s)
no_import.append('%s,"Error"' % s)
format = ','.join(['"%%(%s)s"' % fn for fn in result.keys()])
format_error = format + ',"%(Error)s"'
no_certificate = "no certificate %s" % format
course_id = result.get('CosCode')
if not course_id:
course_id = 'N/A'
result['CosCode'] = course_id
matric_no = result.get('matric_no').upper()
result['matric_no'] = matric_no
key = matric_no+course_id
if matric_no == '':
result['Error'] = "Empty matric_no"
no_import.append( format_error % result)
continue
if key in regs or self.results_import(key = key):
result['Error'] = "Duplicate"
no_import.append( format_error % result)
continue
if course_id not in courses:
if course_id not in no_course:
course_count +=1
no_course.append(course_id)
no_course_list.append('"%s"' % course_id)
#result['Error'] = "No Course"
#logger.info(format_error % result)
result['key'] = key
try:
table.addRecord(**result)
except ValueError:
#import pdb;pdb.set_trace()
result['Error'] = "Duplicate"
no_import.append( format_error % result)
continue
regs.append(key)
imported.append(format % result)
tr_count += 1
if tr_count > 1000:
if len(no_import) > 0:
open("%s/import/%s_not_imported%s.csv" % (i_home,name,current),"a").write(
'\n'.join(no_import)+'\n')
no_import = []
open("%s/import/%simported%s.csv" % (i_home,name,current),"a").write(
'\n'.join(imported) + '\n')
imported = []
if no_course_list:
open("%s/import/%sno_courses%s.csv" % (i_home,name,current),"a").write(
'\n'.join(no_course_list) + '\n')
no_course_list = []
em = '%d transactions commited total %s\n courses not found %s' % (tr_count,total,course_count)
transaction.commit()
logger.info(em)
regs = []
total += tr_count
tr_count = 0
open("%s/import/%simported%s.csv" % (i_home,name,current),"a").write(
'\n'.join(imported))
open("%s/import/%s_not_imported%s.csv" % (i_home,name,current),"a").write(
'\n'.join(no_import))
if no_course_list:
open("%s/import/%sno_courses%s.csv" % (i_home,name,current),"a").write(
'\n'.join(no_course_list))
em = '%d transactions commited total %s\n courses not found %s' % (tr_count,total,course_count)
logger.info(em)
return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
###)
security.declareProtected(ModifyPortalContent,"updateStudyCourse")###(
def updateStudyCourse(self):
"""update StudyCourse from CSV values"""
import transaction
import random
from pdb import set_trace
wftool = self.portal_workflow
#students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
students_folder = self.portal_url.getPortalObject().campus.students
csv_d = {'jamb_reg_no': "RegNumber",
'jamb_lastname': "Name",
'session': "Session",
'pume_tot_score': "PUME SCORE",
'jamb_score': "JambScore",
'jamb_sex': "Sex",
'jamb_state': "State",
## 'jamb_first_cos': "AdminCourse",
'faculty': "AdminFaculty",
'course_code': "AdmitCoscode",
'stud_status':"AdmitStatus",
'department': "AdmitDept",
'jamb_lga': "LGA",
'app_email': "email",
'app_mobile': "PhoneNumbers",
}
csv_fields = [f[1] for f in csv_d.items()]
tr_count = 0
total = 0
#name = 'pume_results'
name = 'StudyCourseChange'
no_import = []
s = ','.join(['"%s"' % fn for fn in csv_fields])
no_import.append('"Error",%s' % s)
format = '"%(Error)s",' + ','.join(['"%%(%s)s"' % fn for fn in csv_fields])
no_certificate = "no certificate %s" % format
open("%s/import/%s_not_imported.csv" % (i_home,name),"w").write(
'\n'.join(no_import))
logger = logging.getLogger('Students.StudentsFolder.updateStudyCourse')
logger.info('Start loading from %s.csv' % name)
l = self.portal_catalog({'meta_type': "Certificate"})
try:
result = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
except:
logger.error('Error reading %s.csv' % name)
return
for jamb in result:
jamb['Error'] = "Processing "
logger.info(format % jamb)
jamb_reg_no = jamb.get(csv_d['jamb_reg_no'])
res = self.portal_catalog({'portal_type': "StudentApplication",
'SearchableText': jamb_reg_no })
if not res:
em = 'Student with jamb_reg_no %s does not exists\n' % jamb_reg_no
logger.info(em)
jamb['Error'] = "Student does not exist"
no_import.append(format % jamb)
continue
sid = res[0].getPath().split('/')[-2]
cert_id = makeCertificateCode(jamb.get(csv_d['course_code']))
res = self.portal_catalog(portal_type = "Certificate", id = cert_id)
if not res:
em = 'No Certificate with ID %s \n' % cert_id
logger.info(em)
jamb['Error'] = "No Certificate %s" % cert_id
no_import.append( format % jamb)
continue
cert_brain = res[0]
catalog_entry = {}
student = getattr(self,sid)
#
# Study Course
#
study_course = student.study_course
dsc = {}
cert_pl = cert_brain.getPath().split('/')
catalog_entry['id'] = sid
catalog_entry['faculty'] = cert_pl[-4]
catalog_entry['department'] = cert_pl[-3]
catalog_entry['course'] = cert_id
dsc['study_course'] = cert_id
study_course.getContent().edit(mapping=dsc)
self.students_catalog.modifyRecord(**catalog_entry)
if tr_count > 10:
if len(no_import) > 1:
open("%s/import/%s_not_imported.csv" % (i_home,name),"w+").write(
'\n'.join(no_import))
no_import = []
em = '%d transactions commited\n' % tr_count
transaction.commit()
logger.info(em)
total += tr_count
tr_count = 0
tr_count += 1
return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
###)
security.declareProtected(View,"fixOwnership") ###(
def fixOwnership(self):
"""fix Ownership"""
for s in self.portal_catalog(meta_type = 'Student'):
student = s.getObject()
sid = s.getId
import pdb;pdb.set_trace()
student.application.manage_setLocalRoles(sid, ['Owner',])
student.personal.manage_setLocalRoles(sid, ['Owner',])
###)
security.declareProtected(View,"Title") ###(
def Title(self):
"""compose title"""
return "Student Section"
###)
def generateStudentId(self,letter,students = None): ###(
import random
r = random
if students is None:
students = self.portal_url.getPortalObject().campus.students
if letter not in ('ABCDEFGIHKLMNOPQRSTUVWXY'):
letter= r.choice('ABCDEFGHKLMNPQRSTUVWXY')
sid = "%c%d" % (letter,r.randint(99999,1000000))
while hasattr(students, sid):
sid = "%c%d" % (letter,r.randint(99999,1000000))
return sid
#return "%c%d" % (r.choice('ABCDEFGHKLMNPQRSTUVWXY'),r.randint(99999,1000000))
###)
InitializeClass(StudentsFolder)
def addStudentsFolder(container, id, REQUEST=None, **kw): ###(
"""Add a Student."""
ob = StudentsFolder(id, **kw)
return CPSBase_adder(container, ob, REQUEST=REQUEST)
###)
###)
class Student(CPSDocument): ###(
"""
WAeUP Student container for the various student data
"""
meta_type = 'Student'
portal_type = meta_type
security = ClassSecurityInfo()
security.declareProtected(View,"Title")
def Title(self):
"""compose title"""
reg_nr = self.getId()[1:]
data = getattr(self,'personal',None)
if data:
content = data.getContent()
return "%s %s %s" % (content.firstname,content.middlename,content.lastname)
data = getattr(self,'application',None)
if data:
content = data.getContent()
return "%s" % (content.jamb_lastname)
return self.title
security.declarePrivate('makeStudentMember') ###(
def makeStudentMember(self,sid,password='uNsEt'):
"""make the student a member"""
membership = self.portal_membership
membership.addMember(sid,
password ,
roles=('Member',
'Student',
),
domains='',
properties = {'memberareaCreationFlag': False,
'homeless': True},)
member = membership.getMemberById(sid)
self.portal_registration.afterAdd(member, sid, password, None)
self.manage_setLocalRoles(sid, ['Owner',])
###)
security.declareProtected(View,'createSubObjects') ###(
def createSubObjects(self):
"""make the student a member"""
dp = {'Title': 'Personal Data'}
app_doc = self.application.getContent()
names = app_doc.jamb_lastname.split()
if len(names) == 3:
dp['firstname'] = names[0].capitalize()
dp['middlename'] = names[1].capitalize()
dp['lastname'] = names[2].capitalize()
elif len(names) == 2:
dp['firstname'] = names[0].capitalize()
dp['lastname'] = names[1].capitalize()
else:
dp['lastname'] = app_doc.jamb_lastname
dp['sex'] = app_doc.jamb_sex == 'F'
dp['lga'] = "%s/%s" % (app_doc.jamb_state,app_doc.jamb_lga )
proxy = self.aq_parent
proxy.invokeFactory('StudentPersonal','personal')
per = proxy.personal
per_doc = per.getContent()
per_doc.edit(mapping = dp)
per.manage_setLocalRoles(proxy.getId(), ['Owner',])
#self.portal_workflow.doActionFor(per,'open',dest_container=per)
###)
InitializeClass(Student)
def addStudent(container, id, REQUEST=None, **kw):
"""Add a Student."""
ob = Student(id, **kw)
return CPSBase_adder(container, ob, REQUEST=REQUEST)
###)
class StudentAccommodation(CPSDocument): ###(
"""
WAeUP Student container for the various student data
"""
meta_type = 'StudentAccommodation'
portal_type = meta_type
security = ClassSecurityInfo()
security.declareProtected(View,"Title")
def Title(self):
"""compose title"""
content = self.getContent()
#return "Accommodation Data for %s %s" % (content.firstname,content.lastname)
return "Accommodation Data for Session %s" % content.session
InitializeClass(StudentAccommodation)
def addStudentAccommodation(container, id, REQUEST=None, **kw):
"""Add a Students personal data."""
ob = StudentAccommodation(id, **kw)
return CPSBase_adder(container, ob, REQUEST=REQUEST)
###)
class StudentPersonal(CPSDocument): ###(
"""
WAeUP Student container for the various student data
"""
meta_type = 'StudentPersonal'
portal_type = meta_type
security = ClassSecurityInfo()
security.declareProtected(View,"Title")
def Title(self):
"""compose title"""
content = self.getContent()
#return "Personal Data for %s %s" % (content.firstname,content.lastname)
return "Personal Data"
InitializeClass(StudentPersonal)
def addStudentPersonal(container, id, REQUEST=None, **kw):
"""Add a Students personal data."""
ob = StudentPersonal(id, **kw)
return CPSBase_adder(container, ob, REQUEST=REQUEST)
###)
class StudentClearance(CPSDocument): ###(
"""
WAeUP Student container for the various student data
"""
meta_type = 'StudentClearance'
portal_type = meta_type
security = ClassSecurityInfo()
security.declareProtected(View,"Title")
def Title(self):
"""compose title"""
content = self.getContent()
#return "Clearance/Eligibility Record for %s %s" % (content.firstname,content.lastname)
return "Clearance/Eligibility Record"
InitializeClass(StudentClearance)
def addStudentClearance(container, id, REQUEST=None, **kw):
"""Add a Students personal data."""
ob = StudentClearance(id, **kw)
return CPSBase_adder(container, ob, REQUEST=REQUEST)
###)
class StudentStudyLevel(CPSDocument,AzaxBaseView): ###(
"""
WAeUP Student container for the various student data
"""
meta_type = 'StudentStudyLevel'
portal_type = meta_type
security = ClassSecurityInfo()
security.declareProtected(View,"Title")
def Title(self):
"""compose title"""
return "Level %s" % self.aq_parent.getId()
def getCorrespondingSelect(self, value):
""" returns select content """
import pdb;pdb.set_trace()
mapping = {}
mapping['']=[]
mapping['animals']=['dog', 'cat', 'cow']
mapping['machines']=['computer', 'car', 'airplane']
# XXX Note that originally we just used replaceInnerHTML to just put
# the options inside the select, however this is principally broken
# on IE due to an IE bug. Microsoft has confirmed the bug but is not
# giving information on whether it has or it will ever be fixed.
# For further info, see http://support.microsoft.com/default.aspx?scid=kb;en-us;276228
# The current solution, replace the outer node, works solidly.
result = ['')
self.getCommandSet('core').replaceHTML('select#second', ' '.join(result))
return self.render()
def create_course_results(self,cert_id,current_level): ###(
"create all courses in a level"
aq_portal = self.portal_catalog.evalAdvancedQuery
res = self.portal_catalog(portal_type="Certificate", id = cert_id)
l = []
import transaction
if res:
cert = res[0]
path = cert.getPath()
query = Eq("path","%s/%s" % (path,current_level)) &\
Eq('portal_type','CertificateCourse')
courses = aq_portal(query)
#from pdb import set_trace;set_trace()
self_proxy = self.aq_parent
for c in courses:
d = self.getCourseInfo(c.getId)
cr_id = self_proxy.invokeFactory('StudentCourseResult',c.getId)
course_result = getattr(self_proxy,cr_id)
self.portal_workflow.doActionFor(course_result,'open')
d['core_or_elective'] = getattr(c.getObject().getContent(),'core_or_elective')
course_result.getContent().edit(mapping=d)
#transaction.commit()
###)
InitializeClass(StudentStudyLevel)
def addStudentStudyLevel(container, id, REQUEST=None, **kw):
"""Add a Students personal data."""
ob = StudentStudyLevel(id, **kw)
return CPSBase_adder(container, ob, REQUEST=REQUEST)
###)
class StudentStudyCourse(CPSDocument): ###(
"""
WAeUP Student container for the various student data
"""
meta_type = 'StudentStudyCourse'
portal_type = meta_type
security = ClassSecurityInfo()
security.declareProtected(View,"Title")
def Title(self):
"""compose title"""
content = self.getContent()
return "Study Course"
InitializeClass(StudentStudyCourse)
def addStudentStudyCourse(container, id, REQUEST=None, **kw):
"""Add a Students personal data."""
ob = StudentStudyCourse(id, **kw)
return CPSBase_adder(container, ob, REQUEST=REQUEST)
###)
class StudentApplication(CPSDocument): ###(
"""
WAeUP Student container for the various student data
"""
meta_type = 'StudentApplication'
portal_type = meta_type
security = ClassSecurityInfo()
security.declareProtected(View,"Title")
def Title(self):
"""compose title"""
return "Application Data"
InitializeClass(StudentApplication)
def addStudentApplication(container, id, REQUEST=None, **kw):
"""Add a Students eligibility data."""
ob = StudentApplication(id, **kw)
return CPSBase_adder(container, ob, REQUEST=REQUEST)
###)
class StudentPume(CPSDocument): ###(
"""
WAeUP Student container for the various student data
"""
meta_type = 'StudentPume'
portal_type = meta_type
security = ClassSecurityInfo()
security.declareProtected(View,"Title")
def Title(self):
"""compose title"""
return "PUME Results"
InitializeClass(StudentPume)
def addStudentPume(container, id, REQUEST=None, **kw):
"""Add a Students PUME data."""
ob = StudentPume(id, **kw)
return CPSBase_adder(container, ob, REQUEST=REQUEST)
###)
##class StudentSemester(CPSDocument): ###(
## """
## WAeUP StudentSemester containing the courses and students
## """
## meta_type = 'StudentSemester'
## portal_type = meta_type
## security = ClassSecurityInfo()
##
##InitializeClass(StudentSemester)
##
##def addStudentSemester(container, id, REQUEST=None, **kw):
## """Add a StudentSemester."""
## ob = StudentSemester(id, **kw)
## return CPSBase_adder(container, ob, REQUEST=REQUEST)
##
#####)
##class Semester(CPSDocument): ###(
## """
## WAeUP Semester containing the courses and students
## """
## meta_type = 'Semester'
## portal_type = meta_type
## security = ClassSecurityInfo()
##
##InitializeClass(Semester)
##
##def addSemester(container, id, REQUEST=None, **kw):
## """Add a Semester."""
## ob = Semester(id, **kw)
## return CPSBase_adder(container, ob, REQUEST=REQUEST)
##
#####)
class StudentCourseResult(CPSDocument): ###(
"""
WAeUP StudentCourseResult
"""
meta_type = 'StudentCourseResult'
portal_type = meta_type
security = ClassSecurityInfo()
def getCourseEntry(self,cid):
res = self.portal_catalog({'meta_type': "Course",
'id': cid})
if res:
return res[-1]
else:
return None
security.declareProtected(View,"Title")
def Title(self):
"""compose title"""
cid = self.aq_parent.getId()
ce = self.getCourseEntry(cid)
if ce:
return "%s" % ce.Title
return "No course with id %s" % cid
InitializeClass(StudentCourseResult)
def addStudentCourseResult(container, id, REQUEST=None, **kw):
"""Add a StudentCourseResult."""
ob = StudentCourseResult(id, **kw)
return CPSBase_adder(container, ob, REQUEST=REQUEST)
###)
# Backward Compatibility StudyLevel
from Products.WAeUP_SRP.Academics import StudyLevel
from Products.WAeUP_SRP.Academics import addStudyLevel