source: WAeUP_SRP/trunk/Students.py @ 1157

Last change on this file since 1157 was 1151, checked in by joachim, 18 years ago

ask for email and password

  • Property svn:keywords set to Id
File size: 77.0 KB
RevLine 
[57]1#-*- mode: python; mode: fold -*-
[200]2# $Id: Students.py 1151 2006-12-29 22:05:53Z joachim $
[708]3from string import Template
[45]4from Globals import InitializeClass
5from AccessControl import ClassSecurityInfo
[164]6from AccessControl.SecurityManagement import newSecurityManager
[429]7from zExceptions import BadRequest
[502]8from Products.ZCatalog.ZCatalog import ZCatalog
[47]9from Products.CMFCore.utils import UniqueObject, getToolByName
[45]10from Products.CMFCore.permissions import View
11from Products.CMFCore.permissions import ModifyPortalContent
[154]12from Products.CPSCore.CPSBase import CPSBase_adder, CPSBaseFolder
13#from Products.CPSCore.CPSBase import CPSBaseDocument as BaseDocument
14from Products.CPSDocument.CPSDocument import CPSDocument
15from Products.CPSCore.CPSBase import CPSBaseBTreeFolder as BaseBTreeFolder
[164]16from Products.CPSCore.CPSMembershipTool import CPSUnrestrictedUser
[361]17from Products.WAeUP_SRP.Academics import makeCertificateCode
[362]18import logging
[971]19import csv,re,os
[362]20import Globals
21p_home = Globals.package_home(globals())
22i_home = Globals.INSTANCE_HOME
[981]23MAX_TRANS = 1000
[966]24import DateTime
[971]25import PIL.Image
26from StringIO import StringIO
[154]27
[958]28def makeCertificateCode(code): ###(
29    code = code.replace('.','')
30    code = code.replace('(','')
31    code = code.replace(')','')
32    code = code.replace('/','')
33    code = code.replace(' ','')
34    code = code.replace('_','')
35    return code
36
37###)
38
39def getInt(s): ###(
[723]40    try:
41        return int(s)
42    except:
43        return 0
[422]44
[725]45def getFloat(s):
46    try:
47        return float(s)
48    except:
49        return 0.0
50
[958]51###)
52
[714]53def getStudentByRegNo(self,reg_no): ###(
[502]54    """search student by JAMB Reg No and return StudentFolder"""
55    search = ZCatalog.searchResults(self.portal_catalog,{'meta_type': 'StudentApplication',
[606]56                                  'SearchableText': reg_no,
[502]57                                  })
58    if len(search) < 1:
59        return None
60    return search[0].getObject().aq_parent
61
[714]62###)
63
[1111]64def checkJambNo(jnr):
65    try:
66        if len(jnr) != 10:
67            return False
68    except:
69        return False
70    try:
71        int(jnr[:8])
72        return True
73    except:
74        return False
[1119]75
[361]76class StudentsFolder(CPSDocument): ###(
77    """
78    WAeUP container for the various WAeUP containers data
79    """
[362]80    meta_type = 'StudentsFolder'
[361]81    portal_type = meta_type
82    security = ClassSecurityInfo()
[154]83
[361]84    security.declareProtected(ModifyPortalContent,"loadFullTimeStudentsFromCSV")###(
85    def loadFullTimeStudentsFromCSV(self):
86        """load Fulltime Studentdata from CSV values"""
[398]87        import transaction
[708]88        import random
[398]89        tr_count = 0
[361]90        name = 'short_full_time'
91        no_import = False
[395]92        if not no_import:
93            no_import = open("%s/import/%s_not_imported.csv" % (i_home,name),"w")
94            no_import.write('"MatricNo","EntryRegNo","CurrentSession","StudentLevel","fullname","FirstName","MiddleName","Lastname","FormerSurname","Sex","Nationality","State","LGA","PermanentAddress","PermanentAddressCity","CampusAddress","PhoneNumber","Emailaddress","Mode","CourseMajor","Faculty","Dept"\n')
[1082]95        logger = logging.getLogger('Import.%s' % name)
[361]96        logger.info('Start loading from %s.csv' % name)
[708]97        pwlist  = []
98        pwlist.append('"student_id","firstname","middlename","lastname","matric_no","jamb_reg_no","access_code"')
99        pwl_template = Template('"$student_id","$firstname","$middlename","$lastname","$matric_no","$jamb_reg_no","$access_code"')
[361]100        students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
101        try:
102            students = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
103        except:
104            logger.error('Error reading %s.csv' % name)
105            return
[422]106        l = self.portal_catalog({'meta_type': "StudentClearance",})
107        matrics = []
[361]108        for s in l:
[422]109            matrics.append(s.getObject().getContent().matric_no)
[423]110        print matrics
[361]111        l = self.portal_catalog({'meta_type': "Certificate"})
112        certs = {}
113        for c in l:
[727]114            ca,ac,fa,dep_id,co,certcode = c.relative_path.split('/')
115            cid = "%(dep_id)s_%(certcode)s" % vars()
116            certs[cid] = c.getObject()
[361]117        for student in students:
[393]118            logger.info('processing "%(MatricNo)s","%(EntryRegNo)s","%(CurrentSession)s","%(StudentLevel)s","%(fullname)s","%(FirstName)s","%(MiddleName)s","%(Lastname)s","%(FormerSurname)s","%(Sex)s","%(Nationality)s","%(State)s","%(LGA)s","%(PermanentAddress)s","%(PermanentAddressCity)s","%(CampusAddress)s","%(PhoneNumber)s","%(Emailaddress)s","%(Mode)s","%(CourseMajor)s","%(Faculty)s","%(Dept)s"\n' % student)
[361]119            sid = student.get('MatricNo')
[396]120            if sid == "":
121                em = 'Empty MatricNo\n'
122                logger.info(em)
123                no_import.write(em)
124                no_import.write('"%(MatricNo)s","%(EntryRegNo)s","%(CurrentSession)s","%(StudentLevel)s","%(fullname)s","%(FirstName)s","%(MiddleName)s","%(Lastname)s","%(FormerSurname)s","%(Sex)s","%(Nationality)s","%(State)s","%(LGA)s","%(PermanentAddress)s","%(PermanentAddressCity)s","%(CampusAddress)s","%(PhoneNumber)s","%(Emailaddress)s","%(Mode)s","%(CourseMajor)s","%(Faculty)s","%(Dept)s"\n' % student)
125                continue
[361]126            certcode = makeCertificateCode(student.get('CourseMajor'))
[727]127            dep_id = student.get('Dept')
128            fac_id = student.get('Faculty')
129            cid = "%(dep_id)s_%(certcode)s" % vars()
130            if cid not in certs.keys():
[393]131                em = 'Certificate with ID %s %s not found\n' % (certcode, student.get('CourseMajor'))
[361]132                logger.info(em)
[393]133                no_import.write(em)
134                no_import.write('"%(MatricNo)s","%(EntryRegNo)s","%(CurrentSession)s","%(StudentLevel)s","%(fullname)s","%(FirstName)s","%(MiddleName)s","%(Lastname)s","%(FormerSurname)s","%(Sex)s","%(Nationality)s","%(State)s","%(LGA)s","%(PermanentAddress)s","%(PermanentAddressCity)s","%(CampusAddress)s","%(PhoneNumber)s","%(Emailaddress)s","%(Mode)s","%(CourseMajor)s","%(Faculty)s","%(Dept)s"\n' % student)
[361]135                continue
[727]136            certificate_doc = certs[cid].getContent()
[395]137            level = student.get('StudentLevel')
[426]138            try:
[395]139                int(level)
140            except:
141                em = 'Student with ID %(MatricNo)s StudentLevel is empty\n' % student
142                logger.info(em)
143                no_import.write(em)
144                no_import.write('"%(MatricNo)s","%(EntryRegNo)s","%(CurrentSession)s","%(StudentLevel)s","%(fullname)s","%(FirstName)s","%(MiddleName)s","%(Lastname)s","%(FormerSurname)s","%(Sex)s","%(Nationality)s","%(State)s","%(LGA)s","%(PermanentAddress)s","%(PermanentAddressCity)s","%(CampusAddress)s","%(PhoneNumber)s","%(Emailaddress)s","%(Mode)s","%(CourseMajor)s","%(Faculty)s","%(Dept)s"\n' % student)
145                continue
[422]146            matric_no = student.get('MatricNo')
147            if matric_no not in matrics:
148                matrics.append(matric_no)
[714]149                sid = self.generateStudentId(student.get('Lastname')[0])
[361]150                #self.log('Creating Faculty %(id)s = %(Title)s' % faculty)
[714]151                students_folder.invokeFactory('Student', sid)
[426]152                logger.info('%(tr_count)s: Creating Student with ID %(sid)s Matric_no %(matric_no)s ' % vars())
[714]153                student_obj = getattr(self,sid)
[708]154                access_code = "%d" % random.randint(1000000000,9999999999)
[746]155                student_obj.getContent().makeStudentMember(sid,access_code,)
[708]156                pwl_dict = {'student_id': sid,'access_code':access_code}
[714]157                student_obj.invokeFactory('StudentApplication','application')
158                application = student_obj.application
[472]159                da = {'Title': 'Application Data'}
[714]160                student_obj.invokeFactory('StudentPersonal','personal')
[446]161                da['jamb_reg_no'] = student.get('EntryRegNo')
[714]162                personal = student_obj.personal
[708]163                dp = {'Title': 'Personal Data'}
[714]164                student_obj.invokeFactory('StudentClearance','clearance')
165                clearance = student_obj.clearance
[840]166                dc = {'Title': 'Clearance/Eligibility Record'}
[422]167                dc['matric_no'] = matric_no
[714]168                state = student.get('State')
169                lga = student.get('LGA')
170                if state and lga:
171                    lga =  state + ' / ' + lga
172                else:
173                    lga = "None"
[427]174                dc['lga'] = lga
[422]175                dc['nationality'] = student.get('Nationality')
176                dc['email'] = student.get('Emailaddress')
[708]177                dp['firstname'] = student.get('FirstName')
178                dp['middlename'] = student.get('MiddleName')
179                dp['lastname'] = student.get('Lastname')
180                dp['former_surname'] = student.get('FormerSurname')
181                dp['sex'] = student.get('Sex') == 'F'
182                dp['perm_address'] = student.get('PermanentAddress')
183                dp['perm_city'] = student.get('PermanentAddressCity')
184                dp['campus_address'] = student.get('CampusAddress')
185                dp['phone'] = student.get('PhoneNumber')
[714]186                application.getContent().edit(mapping=da)
187                personal.getContent().edit(mapping=dp)
188                clearance.getContent().edit(mapping=dc)
[362]189                #
190                # Study Course
191                #
[714]192                student_obj.invokeFactory('StudentStudyCourse','study_course')
193                studycourse = student_obj.study_course
[708]194                dsc = {}
[727]195                from_certificate = ['title',
196                                   'max_elect',
197                                   'max_pass',
198                                   'n_core',
199                                   'nr_years',
200                                   'probation_credits',
201                                   'promotion_credits',
202                                   'start_level',
203                                  ]
204                for f in from_certificate:
205                    dsc[f] = getattr(certificate_doc,f)
206                dsc['faculty'] = fac_id
207                dsc['department'] = dep_id
[708]208                dsc['study_course'] = certcode
[454]209                css = student.get('CurrentSession') or '2004-2005'
210                cs = int(css.split('-')[0]) - 2000
[714]211                cl = int(student.get('StudentLevel') or '100')/100
[708]212                dsc['entry_session'] = "200%s" % (cs - cl)
213                dsc['clr_ac_pin'] = access_code
[714]214                studycourse.getContent().edit(mapping=dsc)
[364]215                #
216                # Level
217                #
[723]218##                l = getattr(studycourse,level,None)
219##                if 0 and l is None:
220##                    #self.log('Creating Department %(DeptCode)s = %(Description)s' % dep)
221##                    logger.info('Creating Level %(StudentLevel)s for %(fullname)s' % student)
222##                    studycourse.invokeFactory('StudentStudyLevel', level)
223##                    l = getattr(studycourse, level)
224##                    certificate = certs[certcode]
225##                    cert_level = getattr(certificate,level,None)
226##                    if cert_level is None:
227##                        logger.info('Level %(level)s not in %(certcode)s' % vars())
228##                    l.getContent().edit(mapping={'Title': "Level %s" % level})
[361]229            else:
[393]230                em = 'Student with ID %(MatricNo)s %(fullname)s already exists\n' % student
[361]231                logger.info(em)
[393]232                no_import.write(em)
233                no_import.write('"%(MatricNo)s","%(EntryRegNo)s","%(CurrentSession)s","%(StudentLevel)s","%(fullname)s","%(FirstName)s","%(MiddleName)s","%(Lastname)s","%(FormerSurname)s","%(Sex)s","%(Nationality)s","%(State)s","%(LGA)s","%(PermanentAddress)s","%(PermanentAddressCity)s","%(CampusAddress)s","%(PhoneNumber)s","%(Emailaddress)s","%(Mode)s","%(CourseMajor)s","%(Faculty)s","%(Dept)s"\n' % student)
[714]234                continue
[398]235            if tr_count > MAX_TRANS:
[422]236                transaction.commit()
237                em = 'Transaction commited\n' % student
[398]238                logger.info(em)
239                tr_count = 0
240            tr_count += 1
[708]241            pwl_dict.update(dc)
242            pwl_dict.update(da)
243            pwl_dict.update(dp)
[714]244            wftool = self.portal_workflow
[708]245            pwlist.append(pwl_template.substitute(pwl_dict))
[714]246            wftool.doActionFor(student_obj,'clear_and_validate')
[742]247            student_obj.manage_setLocalRoles(sid, ['Owner',])
[714]248            wftool.doActionFor(application,'close')
[742]249            application.manage_setLocalRoles(sid, ['Owner',])
[714]250            wftool.doActionFor(clearance,'close')
[742]251            clearance.manage_setLocalRoles(sid, ['Owner',])
[714]252            wftool.doActionFor(personal,'close')
[742]253            personal.manage_setLocalRoles(sid, ['Owner',])
[727]254            wftool.doActionFor(studycourse,'close_for_edit')
[742]255            studycourse.manage_setLocalRoles(sid, ['Owner',])
[714]256        open("%s/import/pwlist-%s.csv" % (i_home,name),"w+").write('\n'.join(pwlist))
[423]257        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
[361]258    ###)
[382]259
[742]260    security.declareProtected(ModifyPortalContent,"loadPumeResultsFromCSV")###(
261    def loadPumeResultsFromCSV(self):
[966]262        """load Fulltime Studentdata from CSV values into pumeresults catalog"""
263        import transaction
264        import random
[1111]265##        csv_d = {'jamb_reg_no': "RegNumber", ###(
266##                 'status': "Admission Status",
267##                 'name': "Name",
268##                 'score': "Score",
269##                 'sex': "Sex",
270##                 'faculty': "Faculty",
271##                 'department': "Dept",
272##                 'course': "Course",
273##                 'course_code_org': "Course Code",
274##                 }
275###)
276        csv_d = {'jamb_reg_no': "JAMBRegno",
[966]277                 'name': "Name",
278                 'score': "Score",
279                 'sex': "Sex",
[1119]280                 'course': "Course",
[966]281                 'faculty': "Faculty",
282                 'department': "Dept",
283                 'course_code_org': "Course Code",
[1111]284                 'status': "Admission Status",
285                 'result_type': None,
[966]286                 }
[1111]287        csv_fields = [f[1] for f in csv_d.items() if f[1]]
[966]288        tr_count = 0
289        total = 0
[1111]290        name = 'pup_new'
291        #name = 'pup_update'
[971]292        update = name.endswith('update')
[966]293        no_import = []
[1111]294        ok_import = []
295        ok_import.append('%s' % ','.join(['"%s"' % fn for fn in csv_d.keys()]))
296        no_import.append('%s' % ','.join(['"%s"' % fn for fn in csv_fields]))
[1005]297        current = DateTime.DateTime().strftime("%d-%m-%y_%H_%M_%S")
[1111]298        ok_import_name = "%s/import/%s_imported_%s.csv" % (i_home,name,current)
299        #open(ok_import_name,"w").write('\n'.join(no_import))
[1005]300        no_import_name = "%s/import/%s_not_imported_%s.csv" % (i_home,name,current)
[1111]301        #open(no_import_name,"w").write('\n'.join(no_import))
[1082]302        logger = logging.getLogger('Import.%s' % name)
[966]303        starttime = DateTime.now()
304        logger.info('Start loading from %s.csv' % name)
305        try:
306            result = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
307        except:
308            logger.error('Error reading %s.csv' % name)
309            return
310        pume = self.portal_pumeresults
311        format = ','.join(['"%%(%s)s"' % fn for fn in csv_fields])
[1111]312        import_format = ','.join(['"%%(%s)s"' % fn for fn in csv_d.keys()])
[1119]313        eduplicate = '%s,"duplicate"' % format
314        einvalidjamb = '%s,"invalid JambRegNo"' % format
[1005]315        added = 'added ,%s' % format
[1111]316        #from pdb import set_trace;set_trace()
[966]317        for jamb in result:
318            dict = {}
319            for f,fn in csv_d.items():
320                dict[f] = jamb.get(csv_d[f])
[1111]321            dict['result_type'] = 'DE'
322            jnr = jamb.get(csv_d['jamb_reg_no'])
323            if not checkJambNo(jnr):
324                logger.info(einvalidjamb % jamb)
325                dd = {}
326                for f,fn in csv_d.items():
327                    dd[fn] = getattr(data,f)
328                    no_import.append(eduplicate % dd)
329                    no_import.append(eduplicate % jamb)
330                continue
331            res = pume(jamb_reg_no=jnr)
[971]332            if len(res) > 0:
333                if update:
[1005]334                    try:
335                        pume.modifyRecord(**dict)
336                    except ValueError:
337                        logger.info(eduplicate % jamb)
338                        continue
339                    except KeyError:
340                        pume.addRecord(**dict)
341                        logger.info(added % jamb)
342                        continue
[971]343                else:
344                    data = res[0]
345                    if data.name != jamb.get(csv_d['name']):
346                        #set_trace()
347                        logger.info(eduplicate % jamb)
348                        #em = 'Student with REG-NO %(jamb_reg_no)s already exists\n' % dict
349                        #logger.info(em)
350                        dd = {}
351                        for f,fn in csv_d.items():
352                            dd[fn] = getattr(data,f)
353                        no_import.append(eduplicate % dd)
354                        no_import.append(eduplicate % jamb)
355                    continue
[966]356            try:
357                pume.addRecord(**dict)
[1111]358                ok_import.append(import_format % dict)
[966]359            except ValueError:
360                logger.info(eduplicate % jamb)
361                #em = 'Student with REG-NO %(jamb_reg_no)s already exists\n' % dict
362                #logger.info(em)
363                no_import.append(eduplicate % jamb)
364        logger.info('End loading from %s.csv' % name)
365        if len(no_import) > 1:
[1005]366            open(no_import_name,"w+").write('\n'.join(no_import))
[1111]367        open(ok_import_name,"w+").write('\n'.join(ok_import))
[966]368        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
[971]369    ###)
[966]370
[1121]371    security.declareProtected(ModifyPortalContent,"createDEStudents")###(
372    def createDEStudents(self):
373        """load Fulltime Studentdata from CSV values"""
374        import transaction
375        import random
376        #from pdb import set_trace
377        wftool = self.portal_workflow
378        students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
379        csv_d = {'jamb_reg_no': "RegNumber",
380                 'jamb_lastname': "Name",
381                 'session': "Session",
382                 'pume_tot_score': "PUDE SCORE",
383                 ##'jamb_score': "JambScore",
384                 'entry_mode': "EntryMode",
385                 'jamb_sex': "Sex",
386                 'jamb_state': "State",
387                 'jamb_first_cos': "AdminCourse",
388                 'faculty': "AdminFaculty",
389                 'course_code': "AdmitCoscode",
390                 'stud_status':"AdmitStatus",
391                 'department': "AdmitDept",
392                 'jamb_lga': "LGA",
393                 'app_email': "email",
394                 'app_mobile': "PhoneNumbers",
395                 }
396        csv_fields = [f[1] for f in csv_d.items()]
397        tr_count = 0
398        total = 0
399        #name = 'pume_results'
400        name = 'DE_Admitted'
401        no_import = []
402        s = ','.join(['"(%s)"' % fn for fn in csv_fields])
403        no_import.append('"Error",%s' % s)
404        format = '"%(Error)s",' + ','.join(['"%%(%s)s"' % fn for fn in csv_fields])
405        no_certificate = "no certificate %s" % format
406        open("%s/import/%s_not_imported.csv" % (i_home,name),"w").write('\n'.join(no_import))
407        logger = logging.getLogger('Import.%s' % name)
408        logger.info('start loading from %s.csv' % name)
409        l = self.portal_catalog({'meta_type': "Certificate"})
410        certs = {}
411        cert_docs = {}
412        for f in l:
413            certs[f.getId] = f.getObject().getContent()
414        try:
415            result = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
416        except:
417            logger.error('Error reading %s.csv' % name)
418            return
419        for jamb in result:
420            jamb['Error'] = "Processing "
421            logger.info(format % jamb)
422            jamb_reg_no = jamb.get(csv_d['jamb_reg_no'])
423            res = self.portal_catalog({'portal_type': "StudentApplication",
424                                     'SearchableText': jamb_reg_no })
425            if res:
426                em = 'Student with RegNo %s already exists\n' % jamb_reg_no
427                logger.info(em)
428                jamb['Error'] = "Student exists"
429                no_import.append(format % jamb)
430                continue
431            cert_id = makeCertificateCode(jamb.get(csv_d['course_code']))
432            if cert_id not in certs.keys():
433                em = 'No Certificate with ID %s \n' % cert_id
434                logger.info(em)
435                jamb['Error'] = "No Certificate %s" % cert_id
436                no_import.append( format % jamb)
437                continue
438            jamb_reg_no =jamb.get(csv_d['jamb_reg_no'])
439            cert_doc = certs[cert_id]
440            catalog_entry = {}
441            catalog_entry['jamb_reg_no'] = jamb_reg_no
442            jamb_name = jamb.get(csv_d['jamb_lastname'])
443            jamb_name.replace('>','')
444            jamb_name.replace('<','')
445            names = jamb_name.split()
446            letter = names[-1][0].upper()
447            sid = self.generateStudentId(letter)
448            not_created = True
449            while not_created:
450                try:
451                    students_folder.invokeFactory('Student', sid)
452                    not_created = False
453                except BadRequest:
454                    sid = self.generateStudentId(letter)
455            catalog_entry['id'] = sid
456            tr_count += 1
457            logger.info('%(total)s+%(tr_count)s: Creating Student with ID %(sid)s REG-NO %(jamb_reg_no)s ' % vars())
458            student = getattr(self,sid)
459            student.manage_setLocalRoles(sid, ['Owner',])
460            student.invokeFactory('StudentPume','pume')
461            dp = {'Title': 'Pume Data'}
462            student.invokeFactory('StudentApplication','application')
463            da = {'Title': 'Application Data'}
464            da["jamb_lastname"] = jamb_name
465            da_fields = ('jamb_reg_no',
466                         'jamb_sex',
467                         'entry_mode',
468                         #'jamb_score',
469                         'jamb_first_cos',
470                         'jamb_sex',
471                         'jamb_state',
472                         'jamb_lga',
473                         'app_email',
474                         'app_mobile',
475                         )
476            for f in da_fields:
477                da[f] = jamb.get(csv_d[f])
478            catalog_entry['email'] = jamb.get(csv_d['app_email'])
479            app = student.application
480            app_doc = app.getContent()
481            picture ="%s/import/pictures/%s.jpg" % (i_home,jamb_reg_no)
482            #import pdb;pdb.set_trace()
483            if os.path.exists(picture):
484                file = open(picture)
485                if False:
486                    img = PIL.Image.open(file)
487                    img.thumbnail((150,200),
488                                  resample=PIL.Image.ANTIALIAS)
489                    # We now need a buffer to write to. It can't be the same
490                    # as the inbuffer as the PNG writer will write over itself.
491                    outfile = StringIO()
492                    img.save(outfile, format=img.format)
493                else:
494                    outfile = file.read()
495                app_doc.manage_addFile('passport',
496                                       file=outfile,
497                                       title="%s.jpg" % jamb_reg_no)
498            app.getContent().edit(mapping=da)
499            app.manage_setLocalRoles(sid, ['Owner',])
500            #wftool.doActionFor(app,'close')
501            dp_fields = (
502                         #'pume_eng_score',
503                         #'pume_gen_score',
504                         'pume_tot_score',
505                         )
506            dp['pume_tot_score'] = jamb.get(csv_d['pume_tot_score']) or "No Option Shaded"
507            pume = student.pume
508            pume.getContent().edit(mapping=dp)
509            #wftool.doActionFor(pume,'close')
510            pume.manage_setLocalRoles(sid, ['Owner',])
511            #student.getContent().createSubObjects()
512            dp = {}
513            if len(names) == 3:
514                dp['firstname'] = names[0].capitalize()
515                dp['middlename'] = names[1].capitalize()
516                dp['lastname'] = names[2].capitalize()
517            elif len(names) == 2:
518                dp['firstname'] = names[0].capitalize()
519                dp['middlename'] = ''
520                dp['lastname'] = names[1].capitalize()
521            else:
522                dp['firstname'] = ''
523                dp['middlename'] = ''
524                dp['lastname'] = jamb_name
525            dp['sex'] = jamb.get(csv_d['jamb_sex']) == 'F'
526            catalog_entry['sex'] = dp['sex']
527            catalog_entry['name'] = "%(firstname)s %(middlename)s %(lastname)s" % dp
528            student.invokeFactory('StudentPersonal','personal')
529            per = student.personal
530            per_doc = per.getContent()
531            per_doc.edit(mapping = dp)
532            per.manage_setLocalRoles(sid, ['Owner',])
533            if jamb.get(csv_d['stud_status']) == "Admitted":
534                wftool.doActionFor(student,'pume_pass')
535                wftool.doActionFor(student,'admit')
536            else:
537                wftool.doActionFor(student,'pume_fail')
538                wftool.doActionFor(student,'reject_admission')
539                continue
540            #
541            # Clearance
542            #
543            student.invokeFactory('StudentClearance','clearance')
544            #wftool.doActionFor(student.clearance,'open')
545            dp = {'Title': 'Clearance/Eligibility Record'}
546            student.clearance.manage_setLocalRoles(sid, ['Owner',])
547            #
548            # Study Course
549            #
550            student.invokeFactory('StudentStudyCourse','study_course')
551            study_course = student.study_course
552            dsc = {}
553            from_certificate = ['title',
554                               'max_elect',
555                               'max_pass',
556                               'n_core',
557                               'nr_years',
558                               'probation_credits',
559                               'promotion_credits',
560                               'start_level',
561                              ]
562            for f in from_certificate:
563                dsc[f] = getattr(cert_doc,f)
564            dsc['faculty'] = jamb.get(csv_d['faculty'])
565            dsc['department'] = jamb.get(csv_d['department'])
566            catalog_entry['faculty'] = jamb.get(csv_d['faculty'])
567            catalog_entry['department'] = jamb.get(csv_d['department'])
568            catalog_entry['course'] = cert_id
569            catalog_entry['level'] = getattr(cert_doc,'start_level')
570            dsc['study_course'] = cert_id
571            dsc['entry_session'] = jamb.get(csv_d['session'])
572            study_course.getContent().edit(mapping=dsc)
573            self.students_catalog.addRecord(**catalog_entry)
[1124]574            if tr_count > 10:
[1121]575                if len(no_import) > 1:
[1127]576                    open("%s/import/%s_not_imported.csv" % (i_home,name),"a").write(
[1121]577                             '\n'.join(no_import))
578                    no_import = []
579                em = '%d transactions commited\n' % tr_count
580                transaction.commit()
581                logger.info(em)
582                total += tr_count
583                tr_count = 0
[1127]584        open("%s/import/%s_not_imported.csv" % (i_home,name),"a").write(
[1125]585                                               '\n'.join(no_import))
[1121]586        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
587    ###)
588
[966]589    security.declareProtected(ModifyPortalContent,"createNewStudents")###(
590    def createNewStudents(self):
[742]591        """load Fulltime Studentdata from CSV values"""
592        import transaction
593        import random
[971]594        #from pdb import set_trace
[763]595        wftool = self.portal_workflow
[757]596        students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
[971]597        csv_d = {'jamb_reg_no': "RegNumber",
[958]598                 'jamb_lastname': "Name",
[971]599                 'session': "Session",
600                 'pume_tot_score': "PUME SCORE",
601                 'jamb_score': "JambScore",
[958]602                 'jamb_sex': "Sex",
[971]603                 'jamb_state': "State",
[980]604##                 'jamb_first_cos': "AdminCourse",
[971]605                 'faculty': "AdminFaculty",
606                 'course_code': "AdmitCoscode",
607                 'stud_status':"AdmitStatus",
608                 'department': "AdmitDept",
609                 'jamb_lga': "LGA",
610                 'app_email': "email",
[980]611                 'app_mobile': "PhoneNumbers",
[958]612                 }
613        csv_fields = [f[1] for f in csv_d.items()]
614        tr_count = 0
[961]615        total = 0
[958]616        #name = 'pume_results'
[971]617        name = 'Admitted'
[958]618        no_import = []
619        s = ','.join(['"(%s)"' % fn for fn in csv_fields])
[971]620        no_import.append('"Error",%s' % s)
621        format = '"%(Error)s",' + ','.join(['"%%(%s)s"' % fn for fn in csv_fields])
622        no_certificate = "no certificate %s" % format
[1121]623        open("%s/import/%s_not_imported.csv" % (i_home,name),"w").write('\n'.join(no_import))
[1082]624        logger = logging.getLogger('Import.%s' % name)
[1121]625        logger.info('start loading from %s.csv' % name)
[971]626        l = self.portal_catalog({'meta_type': "Certificate"})
627        certs = {}
628        cert_docs = {}
629        for f in l:
630            certs[f.getId] = f.getObject().getContent()
[958]631        try:
632            result = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
633        except:
634            logger.error('Error reading %s.csv' % name)
635            return
636        for jamb in result:
[971]637            jamb['Error'] = "Processing "
638            logger.info(format % jamb)
[958]639            jamb_reg_no = jamb.get(csv_d['jamb_reg_no'])
640            res = self.portal_catalog({'portal_type': "StudentApplication",
[959]641                                     'SearchableText': jamb_reg_no })
[958]642            if res:
[980]643                em = 'Student with RegNo %s already exists\n' % jamb_reg_no
[958]644                logger.info(em)
[971]645                jamb['Error'] = "Student exists"
[958]646                no_import.append(format % jamb)
647                continue
[971]648            cert_id = makeCertificateCode(jamb.get(csv_d['course_code']))
649            if cert_id not in certs.keys():
[958]650                em = 'No Certificate with ID %s \n' % cert_id
651                logger.info(em)
[971]652                jamb['Error'] = "No Certificate %s" % cert_id
653                no_import.append( format % jamb)
[958]654                continue
[1121]655            res = self.portal_pumeresults(jamb_reg_no = jamb_reg_no)
656            if len(res) == 1:
657                self.portal_pumeresults.modifyRecord(jamb_reg_no = jamb_reg_no,
658                                                     status = jamb.get(csv_d['stud_status']),
659                                                     )
660            jamb_reg_no =jamb.get(csv_d['jamb_reg_no'])
[971]661            cert_doc = certs[cert_id]
662            catalog_entry = {}
663            catalog_entry['jamb_reg_no'] = jamb_reg_no
[958]664            jamb_name = jamb.get(csv_d['jamb_lastname'])
665            jamb_name.replace('>','')
[966]666            jamb_name.replace('<','')
[958]667            names = jamb_name.split()
668            letter = names[-1][0].upper()
669            sid = self.generateStudentId(letter)
670            not_created = True
671            while not_created:
672                try:
673                    students_folder.invokeFactory('Student', sid)
674                    not_created = False
675                except BadRequest:
676                    sid = self.generateStudentId(letter)
[971]677            catalog_entry['id'] = sid
[958]678            tr_count += 1
[961]679            logger.info('%(total)s+%(tr_count)s: Creating Student with ID %(sid)s REG-NO %(jamb_reg_no)s ' % vars())
[958]680            student = getattr(self,sid)
681            student.manage_setLocalRoles(sid, ['Owner',])
682            student.invokeFactory('StudentPume','pume')
683            dp = {'Title': 'Pume Data'}
684            student.invokeFactory('StudentApplication','application')
685            da = {'Title': 'Application Data'}
686            da["jamb_lastname"] = jamb_name
687            da_fields = ('jamb_reg_no',
688                         'jamb_sex',
689                         #'jamb_state',
[966]690                         'jamb_score',
[980]691##                         'jamb_first_cos',
[958]692                         'jamb_sex',
[971]693                         'jamb_state',
694                         'jamb_lga',
695                         'app_email',
[980]696                         'app_mobile',
[958]697                         )
698            for f in da_fields:
699                da[f] = jamb.get(csv_d[f])
[971]700            catalog_entry['email'] = jamb.get(csv_d['app_email'])
[958]701            app = student.application
[971]702            app_doc = app.getContent()
[975]703            picture ="%s/import/pictures/%s.jpg" % (i_home,jamb_reg_no)
[971]704            #import pdb;pdb.set_trace()
705            if os.path.exists(picture):
706                file = open(picture)
[974]707                if False:
708                    img = PIL.Image.open(file)
709                    img.thumbnail((150,200),
710                                  resample=PIL.Image.ANTIALIAS)
711                    # We now need a buffer to write to. It can't be the same
712                    # as the inbuffer as the PNG writer will write over itself.
713                    outfile = StringIO()
714                    img.save(outfile, format=img.format)
715                else:
716                    outfile = file.read()
[971]717                app_doc.manage_addFile('passport',
718                                       file=outfile,
719                                       title="%s.jpg" % jamb_reg_no)
[958]720            app.getContent().edit(mapping=da)
721            app.manage_setLocalRoles(sid, ['Owner',])
722            #wftool.doActionFor(app,'close')
723            dp_fields = (
724                         #'pume_eng_score',
725                         #'pume_gen_score',
726                         'pume_tot_score',
727                         )
[964]728            dp['pume_tot_score'] = jamb.get(csv_d['pume_tot_score']) or "No Option Shaded"
[958]729            pume = student.pume
730            pume.getContent().edit(mapping=dp)
731            #wftool.doActionFor(pume,'close')
732            pume.manage_setLocalRoles(sid, ['Owner',])
[966]733            #student.getContent().createSubObjects()
[975]734            dp = {}
[966]735            if len(names) == 3:
736                dp['firstname'] = names[0].capitalize()
737                dp['middlename'] = names[1].capitalize()
738                dp['lastname'] = names[2].capitalize()
739            elif len(names) == 2:
740                dp['firstname'] = names[0].capitalize()
[971]741                dp['middlename'] = ''
[966]742                dp['lastname'] = names[1].capitalize()
743            else:
[971]744                dp['firstname'] = ''
745                dp['middlename'] = ''
[966]746                dp['lastname'] = jamb_name
747            dp['sex'] = jamb.get(csv_d['jamb_sex']) == 'F'
[971]748            catalog_entry['sex'] = dp['sex']
749            catalog_entry['name'] = "%(firstname)s %(middlename)s %(lastname)s" % dp
[966]750            student.invokeFactory('StudentPersonal','personal')
751            per = student.personal
752            per_doc = per.getContent()
753            per_doc.edit(mapping = dp)
754            per.manage_setLocalRoles(sid, ['Owner',])
[958]755            if jamb.get(csv_d['stud_status']) == "Admitted":
756                wftool.doActionFor(student,'pume_pass')
757                wftool.doActionFor(student,'admit')
758            else:
759                wftool.doActionFor(student,'pume_fail')
760                wftool.doActionFor(student,'reject_admission')
761                continue
[964]762            #
[966]763            # Clearance
764            #
765            student.invokeFactory('StudentClearance','clearance')
766            #wftool.doActionFor(student.clearance,'open')
767            dp = {'Title': 'Clearance/Eligibility Record'}
768            student.clearance.manage_setLocalRoles(sid, ['Owner',])
769            #
[964]770            # Study Course
771            #
[958]772            student.invokeFactory('StudentStudyCourse','study_course')
773            study_course = student.study_course
774            dsc = {}
775            from_certificate = ['title',
776                               'max_elect',
777                               'max_pass',
778                               'n_core',
779                               'nr_years',
780                               'probation_credits',
781                               'promotion_credits',
782                               'start_level',
783                              ]
784            for f in from_certificate:
785                dsc[f] = getattr(cert_doc,f)
[971]786            dsc['faculty'] = jamb.get(csv_d['faculty'])
787            dsc['department'] = jamb.get(csv_d['department'])
788            catalog_entry['faculty'] = jamb.get(csv_d['faculty'])
789            catalog_entry['department'] = jamb.get(csv_d['department'])
790            catalog_entry['course'] = cert_id
791            catalog_entry['level'] = getattr(cert_doc,'start_level')
[958]792            dsc['study_course'] = cert_id
[971]793            dsc['entry_session'] = jamb.get(csv_d['session'])
[958]794            study_course.getContent().edit(mapping=dsc)
[971]795            self.students_catalog.addRecord(**catalog_entry)
[1126]796            if tr_count > 10:
797                if len(no_import) > 0:
[1127]798                    open("%s/import/%s_not_imported.csv" % (i_home,name),"a").write(
[966]799                             '\n'.join(no_import))
800                    no_import = []
[961]801                em = '%d transactions commited\n' % tr_count
[958]802                transaction.commit()
803                logger.info(em)
[961]804                total += tr_count
[958]805                tr_count = 0
[1127]806        open("%s/import/%s_not_imported.csv" % (i_home,name),"a").write(
[1126]807                                                '\n'.join(no_import))
[958]808        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
809    ###)
810
[1151]811    security.declareProtected(ModifyPortalContent,"importReturningStudents")###(
812    def importReturningStudents(self):
813        """load Returning Studentdata from CSV values"""
[1146]814        import transaction
815        import random
816        #from pdb import set_trace
817        wftool = self.portal_workflow
818        current = DateTime.DateTime().strftime("%d-%m-%y_%H_%M_%S")
819        students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
820        tr_count = 1
821        total = 0
822        #name = 'pume_results'
[1151]823        name = 'Returning'
824        table = self.returning_import
[1146]825        no_import = []
826        imported = []
827        logger = logging.getLogger('Import.%s' % name)
828        try:
[1151]829            returning = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
[1146]830        except:
831            logger.error('Error reading %s.csv' % name)
832            return
833        l = self.portal_catalog({'meta_type': "Certificate"})
834        certs = {}
835        cert_docs = {}
836        for f in l:
837            certs[f.getId] = f.getObject().getContent()
838        start = True
839        res = table()
840        regs = []
841        if len(res) > 0:
842            regs = [s.matric_no for s in res]
[1151]843        for student in returning:
[1146]844            if start:
845                start = False
846                logger.info('start loading from %s.csv' % name)
847                s = ','.join(['"(%s)"' % fn for fn in student.keys()])
848                imported.append(s)
849                no_import.append('%s,"Error"' % s)
850                format = ','.join(['"%%(%s)s"' % fn for fn in student.keys()])
851                format_error = format + ',"%(Error)s"'
852                no_certificate = "no certificate %s" % format
853            if student.get('matric_no') == '':
854                student['Error'] = "Empty matric_no" 
855                no_import.append( format_error % student)
856                continue
857            if student.get('matric_no') in regs:
858                student['Error'] = "Duplicate" 
859                no_import.append( format_error % student)
860                continue
861            cert_id = makeCertificateCode(student.get('Coursemajorcode'))
862            if cert_id not in certs.keys():
863                student['Error'] = "No Certificate %s" % cert_id
864                no_import.append( format_error % student)
865                continue
866            try:
867                table.addRecord(**student)
868            except ValueError:
869                import pdb;pdb.set_trace()
870                student['Error'] = "Duplicate" 
871                no_import.append( format_error % student)
872                continue
873            regs.append(student.get('matric_no'))
874            imported.append(format % student)
875            tr_count += 1
876            if tr_count > 1000:
877                if len(no_import) > 0:
878                    open("%s/import/%s_not_imported%s.csv" % (i_home,name,current),"a").write(
[1151]879                             '\n'.join(no_import) + '\n')
[1146]880                    no_import = []
881                open("%s/import/%simported%s.csv" % (i_home,name,current),"a").write(
[1151]882                                            '\n'.join(no_import) + "\n")
883                imported = []
[1146]884                em = '%d transactions commited total %s\n' % (tr_count,total)
885                transaction.commit()
886                logger.info(em)
887                total += tr_count
888                tr_count = 0
889        open("%s/import/%simported%s.csv" % (i_home,name,current),"a").write(
890                                            '\n'.join(no_import))
891        open("%s/import/%s_not_imported%s.csv" % (i_home,name,current),"a").write(
892                                                '\n'.join(no_import))
893        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
894    ###)
895
896    security.declareProtected(ModifyPortalContent,"importResults")###(
897    def importResults(self):
[1151]898        """load Returning Students Results from CSV"""
[1146]899        import transaction
900        import random
901        #from pdb import set_trace
902        wftool = self.portal_workflow
903        current = DateTime.DateTime().strftime("%d-%m-%y_%H_%M_%S")
904        students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
905        tr_count = 1
906        total = 0
907        #name = 'pume_results'
908        name = 'Results'
909        table = self.results_import
910        no_import = []
911        imported = []
912        logger = logging.getLogger('Import.%s' % name)
913        try:
914            results = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
915        except:
916            logger.error('Error reading %s.csv' % name)
917            return
918        l = self.portal_catalog({'meta_type': "Course"})
919        courses = [f.getId for f in l]
920        start = True
921        res = table()
922        regs = []
923        if len(res) > 0:
924            regs = [s.key for s in res]
925        no_course = []
926        no_course_list = []
927        course_count = 0
928        for result in results:
929            if start:
930                start = False
931                logger.info('start loading from %s.csv' % name)
932                s = ','.join(['"(%s)"' % fn for fn in result.keys()])
933                imported.append(s)
934                no_import.append('%s,"Error"' % s)
935                format = ','.join(['"%%(%s)s"' % fn for fn in result.keys()])
936                format_error = format + ',"%(Error)s"'
937                no_certificate = "no certificate %s" % format
938            course_id = result.get('CosCode')
939            key = result.get('matric_no')+course_id
940            if key == '':
941                result['Error'] = "Empty matric_no" 
942                no_import.append( format_error % result)
943                continue
944            if key in regs:
945                result['Error'] = "Duplicate" 
946                no_import.append( format_error % result)
947                continue
948            if course_id not in courses:
949                if course_id not in no_course:
950                    course_count +=1
951                    no_course.append(course_id)
952                    no_course_list.append('"%s"' % course_id)
953                    #result['Error'] = "No Course"
954                    #logger.info(format_error % result)
955            result['key'] = key
956            try:
957                table.addRecord(**result)
958            except ValueError:
959                import pdb;pdb.set_trace()
960                result['Error'] = "Duplicate" 
961                no_import.append( format_error % result)
962                continue
963            regs.append(key)
964            imported.append(format % result)
965            tr_count += 1
966            if tr_count > 1000:
967                if len(no_import) > 0:
968                    open("%s/import/%s_not_imported%s.csv" % (i_home,name,current),"a").write(
[1151]969                             '\n'.join(no_import)+'\n')
[1146]970                    no_import = []
971                open("%s/import/%simported%s.csv" % (i_home,name,current),"a").write(
[1151]972                                            '\n'.join(imported) + '\n')
[1146]973                imported = []
974                if no_course_list:
975                    open("%s/import/%sno_courses%s.csv" % (i_home,name,current),"a").write(
[1151]976                                            '\n'.join(no_course_list) + '\n')
[1146]977                    no_course_list = []
978                em = '%d transactions commited total %s\n courses not found %s' % (tr_count,total,course_count)
979                transaction.commit()
980                logger.info(em)
981                total += tr_count
982                tr_count = 0
983        open("%s/import/%simported%s.csv" % (i_home,name,current),"a").write(
984                                            '\n'.join(imported))
985        open("%s/import/%s_not_imported%s.csv" % (i_home,name,current),"a").write(
986                                                '\n'.join(no_import))
987        if no_course_list:
988            open("%s/import/%sno_courses%s.csv" % (i_home,name,current),"a").write(
989                                    '\n'.join(no_course_list))
990        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
991    ###)
992
[1065]993    security.declareProtected(ModifyPortalContent,"updateStudyCourse")###(
994    def updateStudyCourse(self):
995        """update StudyCourse from CSV values"""
996        import transaction
997        import random
998        from pdb import set_trace
999        wftool = self.portal_workflow
1000        students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
1001        csv_d = {'jamb_reg_no': "RegNumber",
1002                 'jamb_lastname': "Name",
1003                 'session': "Session",
1004                 'pume_tot_score': "PUME SCORE",
1005                 'jamb_score': "JambScore",
1006                 'jamb_sex': "Sex",
1007                 'jamb_state': "State",
1008##                 'jamb_first_cos': "AdminCourse",
1009                 'faculty': "AdminFaculty",
1010                 'course_code': "AdmitCoscode",
1011                 'stud_status':"AdmitStatus",
1012                 'department': "AdmitDept",
1013                 'jamb_lga': "LGA",
1014                 'app_email': "email",
1015                 'app_mobile': "PhoneNumbers",
1016                 }
1017        csv_fields = [f[1] for f in csv_d.items()]
1018        tr_count = 0
1019        total = 0
1020        #name = 'pume_results'
1021        name = 'StudyCourseChange'
1022        no_import = []
1023        s = ','.join(['"(%s)"' % fn for fn in csv_fields])
1024        no_import.append('"Error",%s' % s)
1025        format = '"%(Error)s",' + ','.join(['"%%(%s)s"' % fn for fn in csv_fields])
1026        no_certificate = "no certificate %s" % format
1027        open("%s/import/%s_not_imported.csv" % (i_home,name),"w").write(
1028                    '\n'.join(no_import))
[1082]1029        logger = logging.getLogger('Import.%s' % name)
[1065]1030        logger.info('Start loading from %s.csv' % name)
1031        l = self.portal_catalog({'meta_type': "Certificate"})
1032        try:
1033            result = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
1034        except:
1035            logger.error('Error reading %s.csv' % name)
1036            return
1037        for jamb in result:
1038            jamb['Error'] = "Processing "
1039            logger.info(format % jamb)
1040            jamb_reg_no = jamb.get(csv_d['jamb_reg_no'])
1041            res = self.portal_catalog({'portal_type': "StudentApplication",
1042                                     'SearchableText': jamb_reg_no })
1043            if not res:
1044                em = 'Student with RegNo %s does not exists\n' % jamb_reg_no
1045                logger.info(em)
1046                jamb['Error'] = "Student not exists"
1047                no_import.append(format % jamb)
1048                continue
1049            sid = res[0].getPath().split('/')[-2]
1050            cert_id = makeCertificateCode(jamb.get(csv_d['course_code']))
1051            res = self.portal_catalog(portal_type = "Certificate", id = cert_id)
1052            if not res:
1053                em = 'No Certificate with ID %s \n' % cert_id
1054                logger.info(em)
1055                jamb['Error'] = "No Certificate %s" % cert_id
1056                no_import.append( format % jamb)
1057                continue
1058            cert_brain = res[0]
1059            catalog_entry = {}
1060            student = getattr(self,sid)
1061            #
1062            # Study Course
1063            #
1064            study_course = student.study_course
1065            dsc = {}
1066            cert_pl = cert_brain.getPath().split('/')
1067            catalog_entry['id'] = sid
1068            catalog_entry['faculty'] = cert_pl[-4]
1069            catalog_entry['department'] = cert_pl[-3]
1070            catalog_entry['course'] = cert_id
1071            dsc['study_course'] = cert_id
1072            study_course.getContent().edit(mapping=dsc)
1073            self.students_catalog.modifyRecord(**catalog_entry)
1074            if tr_count > 10:
1075                if len(no_import) > 1:
1076                    open("%s/import/%s_not_imported.csv" % (i_home,name),"w+").write(
1077                             '\n'.join(no_import))
1078                    no_import = []
1079                em = '%d transactions commited\n' % tr_count
1080                transaction.commit()
1081                logger.info(em)
1082                total += tr_count
1083                tr_count = 0
1084            tr_count += 1
1085        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
1086    ###)
1087
[958]1088    security.declareProtected(ModifyPortalContent,"OLDloadPumeResultsFromCSV")###(
1089    def OLDloadPumeResultsFromCSV(self):
1090        """load Fulltime Studentdata from CSV values"""
1091        import transaction
1092        import random
1093        wftool = self.portal_workflow
1094        students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
1095        csv_d = {'jamb_reg_no': "JAMBRegno",
1096                 'jamb_lastname': "Name",
[757]1097                 'pume_options': "Options",
1098                 'session': "Session",
1099                 'days': "Days",
1100                 'response': "Responce",
1101                 'wrong': "Wrong",
1102                 'pume_eng_score': "EngScore",
[775]1103                 'pume_gen_score': "GenScore",
[958]1104                 'pume_tot_score': "Score",
[757]1105                 'batch': "Batch",
1106                 'serial': "SerialNo",
1107                 'jamb_score': "JambScore",
1108                 'omitted':"Omitted",
1109                 'search_key': "SearchKey",
1110                 'jamb_sex': "Sex",
1111                 'fac1': "Fac1",
1112                 'fac2': "Fac2",
1113                 'jamb_first_cos': "CourseofStudy",
1114                 'stud_status':"StudStatus",
1115                 'registered': "Registered",
1116                 'jamb_state': "State",
1117                 'eng_fail': "EngFail",
1118                 'gen_fail': "GenFail",
1119                 'un_ans_eng': "UnAnsEng",
1120                 'un_ans_eng': "UnAnsGen",
1121                 'total_ans': "TotalUnAns",
1122                 'dept': "Dept",
1123                 'jamb_second_cos': "Course2",
1124                 'jamb_third_cos': "course3",
1125                 }
1126        csv_fields = [f[1] for f in csv_d.items()]
[742]1127        tr_count = 0
1128        name = 'pume_results'
[757]1129        no_import = []
1130        s = ','.join(['"(%s)"' % fn for fn in csv_fields])
1131        no_import.append('%s\n' % s)
[1082]1132        logger = logging.getLogger('Import.%s' % name)
[742]1133        logger.info('Start loading from %s.csv' % name)
1134        try:
[757]1135            result = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
[742]1136        except:
1137            logger.error('Error reading %s.csv' % name)
1138            return
[757]1139        for jamb in result:
1140            format = ','.join(['"%%(%s)s"' % fn for fn in csv_fields])
1141            processing = "processing %s" % format
1142            logger.info(processing % jamb)
1143            jamb_reg_no = jamb.get(csv_d['jamb_reg_no'])
[763]1144            #import pdb;pdb.set_trace()
1145            res = self.portal_catalog({'portal_type': "StudentApplication",
[757]1146                                     'jamb_reg_no': jamb_reg_no })
1147            if res:
1148                em = 'Student with REG-NO %s already exists\n' % jamb_reg_no
[742]1149                logger.info(em)
[757]1150                no_import.append(em)
1151                no_import.append(format % jamb)
[742]1152                continue
[785]1153            cert_id = jamb.get(csv_d['jamb_first_cos']).upper()
1154            res = self.portal_catalog({'portal_type': "Certificate",
1155                                     'id': cert_id })
1156            if len(res) < 1:
1157                em = 'No Certificate with ID %s \n' % cert_id
1158                logger.info(em)
1159                no_import.append(em)
1160                no_import.append(format % jamb)
1161                continue
1162            cert = res[0].getObject()
1163            cert_path = res[0].getPath()
1164            cert_doc = cert.getContent()
[757]1165            jamb_name = jamb.get(csv_d['jamb_lastname'])
1166            jamb_name.replace('>','')
1167            names = jamb_name.split()
1168            letter = names[-1][0].upper()
1169            sid = self.generateStudentId(letter)
1170            not_created = True
1171            while not_created:
1172                try:
1173                    students_folder.invokeFactory('Student', sid)
1174                    not_created = False
1175                except BadRequest:
1176                    sid = self.generateStudentId(letter)
1177            logger.info('%(tr_count)s: Creating Student with ID %(sid)s REG-NO %(jamb_reg_no)s ' % vars())
1178            student = getattr(self,sid)
1179            student.manage_setLocalRoles(sid, ['Owner',])
[766]1180            student.invokeFactory('StudentClearance','clearance')
[775]1181            #wftool.doActionFor(student.clearance,'open')
[840]1182            dp = {'Title': 'Clearance/Eligibility Record'}
[766]1183            student.clearance.manage_setLocalRoles(sid, ['Owner',])
[763]1184            student.invokeFactory('StudentPume','pume')
1185            dp = {'Title': 'Pume Data'}
[757]1186            student.invokeFactory('StudentApplication','application')
1187            da = {'Title': 'Application Data'}
1188            da["jamb_lastname"] = jamb_name
1189            da_fields = ('jamb_reg_no',
1190                         'jamb_sex',
1191                         'jamb_state',
1192                         'jamb_score',
1193                         'jamb_first_cos',
1194                         'jamb_sex',
1195                         'jamb_state',
1196                         'jamb_first_cos',
1197                         'jamb_second_cos',
1198                         )
[763]1199            for f in da_fields:
1200                da[f] = jamb.get(csv_d[f])
[757]1201            app = student.application
[763]1202            app.getContent().edit(mapping=da)
[757]1203            app.manage_setLocalRoles(sid, ['Owner',])
[780]1204            #wftool.doActionFor(app,'close')
[763]1205            dp_fields = (
1206                         'pume_eng_score',
[764]1207                         'pume_gen_score',
[763]1208                         'pume_tot_score',
1209                         )
1210            for f in dp_fields:
[775]1211                dp[f] = float(jamb.get(csv_d[f]))
[765]1212            pume = student.pume
1213            pume.getContent().edit(mapping=dp)
[780]1214            #wftool.doActionFor(pume,'close')
[763]1215            pume.manage_setLocalRoles(sid, ['Owner',])
[785]1216            #
1217            # Study Course
1218            #
1219            student.invokeFactory('StudentStudyCourse','study_course')
1220            study_course = student.study_course
1221            dsc = {}
1222            from_certificate = ['title',
1223                               'max_elect',
1224                               'max_pass',
1225                               'n_core',
1226                               'nr_years',
1227                               'probation_credits',
1228                               'promotion_credits',
1229                               'start_level',
1230                              ]
1231            for f in from_certificate:
1232                dsc[f] = getattr(cert_doc,f)
1233            cpl = cert_path.split('/')
1234            dsc['faculty'] = cpl[-4]
1235            dsc['department'] = cpl[-3]
1236            dsc['study_course'] = cert_id
1237            dsc['entry_session'] = jamb.get(csv_d['session'])
1238            study_course.getContent().edit(mapping=dsc)
[757]1239            student.getContent().createSubObjects()
[775]1240            if dp['pume_tot_score']>49:
[780]1241                wftool.doActionFor(student,'pume_pass')
[785]1242                wftool.doActionFor(student,'admit')
[775]1243            else:
[780]1244                wftool.doActionFor(student,'pume_fail')
[790]1245                wftool.doActionFor(student,'reject_admission')
[757]1246            if len(no_import) > 1:
1247                open("%s/import/%s_not_imported.csv" % (i_home,name),"w").write(
1248                     '\n'.join(no_import))
[742]1249        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
1250    ###)
1251
[398]1252    security.declareProtected(ModifyPortalContent,"loadFullTimeStudentsResultsFromCSV") ###(
[396]1253    def loadFullTimeStudentsResultsFromCSV(self):
1254        """load Fulltime Studentdata from CSV values"""
1255        #return
[723]1256        level_wf_actions = {}
1257        level_wf_actions["SUCCESSFUL STUDENT"] = "pass_A"
1258        level_wf_actions["STUDENT WITH CARRYOVER COURSES"] = "pass_B"
[727]1259        level_wf_actions["STUDENT FOR PROBATION"] = "probate_C"
1260        level_wf_actions["STUDENT ON PROBATION/TRANSFER"] = "reject_D"
[398]1261        import transaction
[723]1262        wftool = self.portal_workflow
[398]1263        tr_count = 0
1264        name = 'short_full_time_results_2004_2005'
[396]1265        no_import = False
1266        if not no_import:
1267            no_import = open("%s/import/%s_not_imported.csv" % (i_home,name),"w")
1268            no_import.write('"Matnumber","CosCode","Ansbook","CosStuatus","Session","Mat_Cos","Score","CarryLevel","Grade","Weight","Semster","Verdict","Level","id","GPA"\n')
[1146]1269        logger = logging.getLogger('import.%s' % name)
[396]1270        logger.info('Start loading from %s.csv' % name)
1271        students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
1272        try:
1273            results = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
1274        except:
1275            logger.error('Error reading %s.csv' % name)
1276            return
[398]1277        l = self.portal_catalog({'meta_type': "Course"})
1278        courses = {}
1279        for c in l:
1280            courses[c.id] = c.getObject()
[723]1281        level_changed = False
1282        student_changed = False
1283        sid = ''
1284        #import pdb;pdb.set_trace()
[396]1285        for result in results:
[723]1286            temp_sid = result.get('Matnumber')
1287            if temp_sid != sid:
1288                student_changed = True
1289                res = self.portal_catalog({'meta_type': "StudentClearance",
1290                                         'SearchableText': temp_sid })
1291                if not res:
1292                    em = 'Student with ID %(Matnumber)s not found\n' % result
1293                    logger.info(em)
1294                    no_import.write(em)
1295                    no_import.write('"%(Matnumber)s","%(CosCode)s","%(Ansbook)s","%(CosStuatus)s","%(Session)s","%(Mat_Cos)s","%(Score)s","%(CarryLevel)s","%(Grade)s","%(Weight)s","%(Semster)s","%(Verdict)s","%(Level)s","%(id)s","%(GPA)s"\n' % result)
1296                    continue
1297                elif len(res) > 1:
1298                    em = 'More than one Student with ID %(Matnumber)s found\n' % result
1299                    logger.info(em)
1300                    no_import.write(em)
1301                    no_import.write('"%(Matnumber)s","%(CosCode)s","%(Ansbook)s","%(CosStuatus)s","%(Session)s","%(Mat_Cos)s","%(Score)s","%(CarryLevel)s","%(Grade)s","%(Weight)s","%(Semster)s","%(Verdict)s","%(Level)s","%(id)s","%(GPA)s"\n' % result)
1302                    continue
1303                sid = temp_sid
1304                sf = res[0].getObject().aq_parent
1305                sc = getattr(sf,'study_course')
1306                level = ''
1307            else:
1308                student_changed = False
[398]1309            course = result.get('CosCode')
1310            if course not in courses.keys():
1311                em = 'Course with ID %(CosCode)s not found\n' % result
[396]1312                logger.info(em)
1313                no_import.write(em)
[398]1314                no_import.write('"%(Matnumber)s","%(CosCode)s","%(Ansbook)s","%(CosStuatus)s","%(Session)s","%(Mat_Cos)s","%(Score)s","%(CarryLevel)s","%(Grade)s","%(Weight)s","%(Semster)s","%(Verdict)s","%(Level)s","%(id)s","%(GPA)s"\n' % result)
[396]1315                continue
[727]1316            course_doc = courses[course].getContent()
[723]1317            temp_level = result.get('Level')
[742]1318            student_id = sf.getId()
1319            result['StudentId'] = student_id
[723]1320            if temp_level != level:
1321                try:
1322                    int(temp_level)
1323                except:
1324                    em = 'Result with ID %(Matnumber)s Course %(CosCode)s Level is empty\n' % result
1325                    logger.info(em)
1326                    no_import.write(em)
1327                    no_import.write('"%(Matnumber)s","%(CosCode)s","%(Ansbook)s","%(CosStuatus)s","%(Session)s","%(Mat_Cos)s","%(Score)s","%(CarryLevel)s","%(Grade)s","%(Weight)s","%(Semster)s","%(Verdict)s","%(Level)s","%(id)s","%(GPA)s"\n' % result)
1328                    continue
[727]1329                level_changed = True
1330                if 'dlev' in vars().keys():
[723]1331                    wftool.doActionFor(l,level_wf_actions[dlev['verdict']])
1332                level = temp_level
1333                l = getattr(sc,level,None)
1334                if l is None:
1335                    logger.info('Creating Level %(Level)s for %(StudentId)s %(Matnumber)s' % result)
1336                    sc.invokeFactory('StudentStudyLevel', level)
1337                    l = getattr(sc, level)
[742]1338                    l.manage_setLocalRoles(student_id, ['Owner',])
[723]1339            else:
1340                level_changed = False
1341            cr = getattr(l,course,None)
1342            if cr is None:
1343                logger.info('Creating Course %(CosCode)s for %(StudentId)s %(Matnumber)s in Level %(Level)s' % result)
1344                l.invokeFactory('StudentCourseResult',course)
1345            cr = getattr(l,course)
1346            dcr = {}
[727]1347            from_course = ['title',
1348                           'credits',
1349                           'passmark',
1350                           ]
1351            for f in from_course:
1352                dcr[f] = getattr(course_doc,f)
[454]1353            dlev = {}
[723]1354            dcr['ansbook'] = result.get('Ansbook')
1355            dcr['semester'] = getInt(result.get('Semster'))
1356            dcr['status'] = result.get('CosStuatus')
1357            dcr['score'] = getInt(result.get('Score'))
[454]1358            dlev['session'] = result.get('Session')
[723]1359            dcr['carry_level'] = result.get('CarryLevel')
1360            dcr['grade'] = result.get('Grade')
[725]1361            dcr['weight'] = result.get('Weight')
[454]1362            dlev['verdict'] = result.get('Verdict')
[725]1363            dcr['import_id'] = result.get('id')
1364            gpa = result.get('GPA').replace(',','.')
1365            dlev['imported_gpa'] = getFloat(gpa)
[723]1366            cr.getContent().edit(mapping = dcr)
[742]1367            cr.manage_setLocalRoles(student_id, ['Owner',])
[454]1368            l.getContent().edit(mapping = dlev)
[398]1369            if tr_count > MAX_TRANS:
1370                transaction.commit()
1371                tr_count = 0
1372            tr_count += 1
[723]1373            wftool.doActionFor(cr,'close')
1374        wftool.doActionFor(l,level_wf_actions[dlev['verdict']])
[681]1375        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
[426]1376
[398]1377###)
[396]1378
[457]1379    security.declareProtected(ModifyPortalContent,"loadJAMBFromCSV")###(
1380    def loadJAMBFromCSV(self):
1381        """load JAMB data from CSV values"""
1382        #return
1383        students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
1384        import transaction
1385        tr_count = 0
[572]1386        name = 'SampleJAMBDataII'
[511]1387        wftool = self.portal_workflow
[457]1388        no_import = False
1389        if not no_import:
1390            no_import = open("%s/import/%s_not_imported.csv" % (i_home,name),"w")
1391            no_import.write('REG-NO,NAME,SEX,STATE,LGA,ENG-SCORE,SUBJ1,SUBJ1-SCORE,SUBJ2,SUBJ2-SCORE,SUBJ3,SUBJ3-SCORE,AGGREGATE,UNIV1,FACULTY1,COURSE1,UNIV2,FACULTY2,COURSE2')
[1082]1392        logger = logging.getLogger('Import.%s' % name)
[457]1393        logger.info('Start loading from %s.csv' % name)
1394        try:
1395            result = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
1396        except:
1397            logger.error('Error reading %s.csv' % name)
1398            return
1399        for jamb in result:
1400            logger.info('processing %(REG-NO)s,%(NAME)s,%(SEX)s,%(STATE)s,%(LGA)s,%(ENG-SCORE)s,%(SUBJ1)s,%(SUBJ1-SCORE)s,%(SUBJ2)s,%(SUBJ2-SCORE)s,%(SUBJ3)s,%(SUBJ3-SCORE)s,%(AGGREGATE)s,%(UNIV1)s,%(FACULTY1)s,%(COURSE1)s,%(UNIV2)s,%(FACULTY2)s,%(COURSE2)s\n' % jamb)
1401            jamb_reg_no = jamb.get('REG-NO')
[472]1402            res = self.portal_catalog({'meta_type': "StudentApplication",
[457]1403                                     'jamb_reg_no': jamb_reg_no })
1404            if res:
1405                em = 'Student with REG-NO %(REG-NO)s already exists\n' % jamb
1406                logger.info(em)
1407                no_import.write(em)
1408                no_import.write('%(REG-NO)s,%(NAME)s,%(SEX)s,%(STATE)s,%(LGA)s,%(ENG-SCORE)s,%(SUBJ1)s,%(SUBJ1-SCORE)s,%(SUBJ2)s,%(SUBJ2-SCORE)s,%(SUBJ3)s,%(SUBJ3-SCORE)s,%(AGGREGATE)s,%(UNIV1)s,%(FACULTY1)s,%(COURSE1)s,%(UNIV2)s,%(FACULTY2)s,%(COURSE2)s\n' % jamb)
1409                continue
[511]1410            jamb_name = jamb.get("NAME")
[584]1411            jamb_name.replace('>','')
[511]1412            names = jamb_name.split()
1413            letter = names[-1][0].upper()
[714]1414            sid = self.generateStudentId(letter)
[457]1415            not_created = True
1416            while not_created:
1417                try:
1418                    students_folder.invokeFactory('Student', sid)
1419                    not_created = False
1420                except BadRequest:
[714]1421                    sid = self.generateStudentId(letter)
[457]1422            logger.info('%(tr_count)s: Creating Student with ID %(sid)s REG-NO %(jamb_reg_no)s ' % vars())
[511]1423            student = getattr(self,sid)
[519]1424            student.manage_setLocalRoles(sid, ['Owner',])
[511]1425            student.invokeFactory('StudentApplication','application')
[472]1426            da = {'Title': 'Application Data'}
[457]1427            da["jamb_reg_no"] = jamb.get("REG-NO")
[511]1428            da["jamb_lastname"] = jamb_name
[457]1429            da["jamb_sex"] = jamb.get("SEX")
1430            da["jamb_state"] = jamb.get("STATE")
1431            da["jamb_lga"] = jamb.get("LGA")
1432            da["jamb_score"] = jamb.get("AGGREGATE")
1433            da["jamb_first_cos"] = jamb.get("COURSE1")
1434            da["jamb_second_cos"] = jamb.get("COURSE2")
1435            da["jamb_first_uni"] = jamb.get("UNIV1")
1436            da["jamb_second_uni"] = jamb.get("UNIV2")
[511]1437            app = student.application
1438            app_doc = app.getContent()
1439            app_doc.edit(mapping=da)
[658]1440            #wftool.doActionFor(app,'open',dest_container=app)
[511]1441            app.manage_setLocalRoles(sid, ['Owner',])
1442            student.getContent().createSubObjects()
[457]1443        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
1444    ###)
[426]1445
[472]1446
[511]1447    security.declareProtected(View,"fixOwnership")
1448    def fixOwnership(self):
1449        """fix Ownership"""
1450        for s in self.portal_catalog(meta_type = 'Student'):
1451            student = s.getObject()
1452            sid = s.getId
1453            import pdb;pdb.set_trace()
1454            student.application.manage_setLocalRoles(sid, ['Owner',])
1455            student.personal.manage_setLocalRoles(sid, ['Owner',])
[603]1456
[364]1457    security.declareProtected(View,"Title")
1458    def Title(self):
1459        """compose title"""
[382]1460        return "Student Section"
[361]1461
[714]1462    def generateStudentId(self,letter): ###(
1463        import random
1464        r = random
1465        if letter not in ('ABCDEFGIHKLMNOPQRSTUVWXY'):
1466            letter= r.choice('ABCDEFGHKLMNPQRSTUVWXY')
1467        students = self.portal_catalog(meta_type = "StudentsFolder")[-1]
1468        sid = "%c%d" % (letter,r.randint(99999,1000000))
1469        while hasattr(students, sid):
1470            sid = "%c%d" % (letter,r.randint(99999,1000000))
[758]1471        return sid
[714]1472        #return "%c%d" % (r.choice('ABCDEFGHKLMNPQRSTUVWXY'),r.randint(99999,1000000))
1473    ###)
1474
[361]1475InitializeClass(StudentsFolder)
1476
1477def addStudentsFolder(container, id, REQUEST=None, **kw):
1478    """Add a Student."""
1479    ob = StudentsFolder(id, **kw)
1480    return CPSBase_adder(container, ob, REQUEST=REQUEST)
1481###)
1482
[57]1483class Student(CPSDocument): ###(
1484    """
[154]1485    WAeUP Student container for the various student data
[57]1486    """
1487    meta_type = 'Student'
1488    portal_type = meta_type
1489    security = ClassSecurityInfo()
[154]1490
[152]1491    security.declareProtected(View,"Title")
1492    def Title(self):
1493        """compose title"""
[153]1494        reg_nr = self.getId()[1:]
[362]1495        data = getattr(self,'personal',None)
[152]1496        if data:
1497            content = data.getContent()
[1143]1498            return "%s %s %s" % (content.firstname,content.middlename,content.lastname)
[472]1499        data = getattr(self,'application',None)
[464]1500        if data:
1501            content = data.getContent()
1502            return "%s" % (content.jamb_lastname)
[152]1503        return self.title
[154]1504
[511]1505    security.declarePrivate('makeStudentMember') ###(
1506    def makeStudentMember(self,sid,password='uNsEt'):
1507        """make the student a member"""
1508        membership = self.portal_membership
[603]1509        membership.addMember(sid,
[511]1510                             password ,
1511                             roles=('Member',
1512                                     'Student',
[522]1513                                     ),
[511]1514                             domains='',
[904]1515                             properties = {'memberareaCreationFlag': False,
1516                                           'homeless': True},)
[511]1517        member = membership.getMemberById(sid)
1518        self.portal_registration.afterAdd(member, sid, password, None)
1519        self.manage_setLocalRoles(sid, ['Owner',])
1520
1521###)
1522
[764]1523    security.declareProtected(View,'createSubObjects') ###(
1524    def createSubObjects(self):
1525        """make the student a member"""
1526        dp = {'Title': 'Personal Data'}
1527        app_doc = self.application.getContent()
1528        names = app_doc.jamb_lastname.split()
1529        if len(names) == 3:
1530            dp['firstname'] = names[0].capitalize()
1531            dp['middlename'] = names[1].capitalize()
1532            dp['lastname'] = names[2].capitalize()
1533        elif len(names) == 2:
1534            dp['firstname'] = names[0].capitalize()
1535            dp['lastname'] = names[1].capitalize()
1536        else:
1537            dp['lastname'] = app_doc.jamb_lastname
1538        dp['sex'] = app_doc.jamb_sex == 'F'
1539        dp['lga'] = "%s/%s" % (app_doc.jamb_state,app_doc.jamb_lga )
1540        proxy = self.aq_parent
1541        proxy.invokeFactory('StudentPersonal','personal')
1542        per = proxy.personal
1543        per_doc = per.getContent()
1544        per_doc.edit(mapping = dp)
[927]1545        per.manage_setLocalRoles(proxy.getId(), ['Owner',])
[764]1546        #self.portal_workflow.doActionFor(per,'open',dest_container=per)
[603]1547
[511]1548###)
1549
[57]1550InitializeClass(Student)
1551
1552def addStudent(container, id, REQUEST=None, **kw):
1553    """Add a Student."""
1554    ob = Student(id, **kw)
1555    return CPSBase_adder(container, ob, REQUEST=REQUEST)
1556
1557###)
[91]1558
[639]1559class StudentAccommodation(CPSDocument): ###(
1560    """
1561    WAeUP Student container for the various student data
1562    """
1563    meta_type = 'StudentAccommodation'
1564    portal_type = meta_type
1565    security = ClassSecurityInfo()
1566
1567    security.declareProtected(View,"Title")
1568    def Title(self):
1569        """compose title"""
1570        content = self.getContent()
1571        #return "Accommodation Data for %s %s" % (content.firstname,content.lastname)
1572        return "Accommodation Data for Session %s" % content.session
1573
1574
1575InitializeClass(StudentAccommodation)
1576
1577def addStudentAccommodation(container, id, REQUEST=None, **kw):
1578    """Add a Students personal data."""
1579    ob = StudentAccommodation(id, **kw)
1580    return CPSBase_adder(container, ob, REQUEST=REQUEST)
1581
1582###)
1583
[89]1584class StudentPersonal(CPSDocument): ###(
1585    """
[154]1586    WAeUP Student container for the various student data
[89]1587    """
1588    meta_type = 'StudentPersonal'
1589    portal_type = meta_type
1590    security = ClassSecurityInfo()
[152]1591
1592    security.declareProtected(View,"Title")
1593    def Title(self):
1594        """compose title"""
1595        content = self.getContent()
[364]1596        #return "Personal Data for %s %s" % (content.firstname,content.lastname)
1597        return "Personal Data"
[152]1598
[154]1599
[89]1600InitializeClass(StudentPersonal)
1601
1602def addStudentPersonal(container, id, REQUEST=None, **kw):
1603    """Add a Students personal data."""
1604    ob = StudentPersonal(id, **kw)
1605    return CPSBase_adder(container, ob, REQUEST=REQUEST)
1606
1607###)
1608
[423]1609class StudentClearance(CPSDocument): ###(
1610    """
1611    WAeUP Student container for the various student data
1612    """
1613    meta_type = 'StudentClearance'
1614    portal_type = meta_type
1615    security = ClassSecurityInfo()
1616
1617    security.declareProtected(View,"Title")
1618    def Title(self):
1619        """compose title"""
1620        content = self.getContent()
[840]1621        #return "Clearance/Eligibility Record for %s %s" % (content.firstname,content.lastname)
1622        return "Clearance/Eligibility Record"
[423]1623
1624
1625InitializeClass(StudentClearance)
1626
1627def addStudentClearance(container, id, REQUEST=None, **kw):
1628    """Add a Students personal data."""
1629    ob = StudentClearance(id, **kw)
1630    return CPSBase_adder(container, ob, REQUEST=REQUEST)
1631
1632###)
1633
[454]1634class StudentStudyLevel(CPSDocument): ###(
1635    """
1636    WAeUP Student container for the various student data
1637    """
1638    meta_type = 'StudentStudyLevel'
1639    portal_type = meta_type
1640    security = ClassSecurityInfo()
1641
1642    security.declareProtected(View,"Title")
1643    def Title(self):
1644        """compose title"""
1645        return "Level %s" % self.aq_parent.getId()
1646
[723]1647##    security.declarePublic("gpa")
1648##    def gpa(self):
1649##        """calculate the gpa"""
1650##        sum = 0
1651##        course_count = 0
1652##        for sc in self.objectValues():
1653##            result = sc.getContent()
1654##            if not result.grade:
1655##                continue
1656##            res = self.portal_catalog({'meta_type': 'Course',
1657##                                          'id': sc.aq_parent.id})
1658##            if len(res) != 1:
1659##                continue
1660##            course = res[0].getObject().getContent()
1661##            sum += course.credits * ['F','E','D','C','B','A'].index(result.grade)
1662##            course_count += 1
1663##        if course_count:
1664##            return sum/course_count
1665##        return 0.0
[472]1666
[454]1667InitializeClass(StudentStudyLevel)
1668
1669def addStudentStudyLevel(container, id, REQUEST=None, **kw):
1670    """Add a Students personal data."""
1671    ob = StudentStudyLevel(id, **kw)
1672    return CPSBase_adder(container, ob, REQUEST=REQUEST)
1673
1674###)
1675
[362]1676class StudentStudyCourse(CPSDocument): ###(
1677    """
1678    WAeUP Student container for the various student data
1679    """
1680    meta_type = 'StudentStudyCourse'
1681    portal_type = meta_type
1682    security = ClassSecurityInfo()
1683
[364]1684    security.declareProtected(View,"Title")
1685    def Title(self):
1686        """compose title"""
1687        content = self.getContent()
[453]1688        return "Study Course"
[362]1689
1690
1691InitializeClass(StudentStudyCourse)
1692
1693def addStudentStudyCourse(container, id, REQUEST=None, **kw):
1694    """Add a Students personal data."""
1695    ob = StudentStudyCourse(id, **kw)
1696    return CPSBase_adder(container, ob, REQUEST=REQUEST)
1697
1698###)
1699
[472]1700class StudentApplication(CPSDocument): ###(
[179]1701    """
1702    WAeUP Student container for the various student data
1703    """
[472]1704    meta_type = 'StudentApplication'
[179]1705    portal_type = meta_type
1706    security = ClassSecurityInfo()
1707
[181]1708    security.declareProtected(View,"Title")
1709    def Title(self):
1710        """compose title"""
[472]1711        return "Application Data"
[179]1712
[181]1713
[472]1714InitializeClass(StudentApplication)
[179]1715
[472]1716def addStudentApplication(container, id, REQUEST=None, **kw):
[179]1717    """Add a Students eligibility data."""
[472]1718    ob = StudentApplication(id, **kw)
[179]1719    return CPSBase_adder(container, ob, REQUEST=REQUEST)
[763]1720###)
[179]1721
[758]1722class StudentPume(CPSDocument): ###(
1723    """
1724    WAeUP Student container for the various student data
1725    """
1726    meta_type = 'StudentPume'
1727    portal_type = meta_type
1728    security = ClassSecurityInfo()
1729
1730    security.declareProtected(View,"Title")
1731    def Title(self):
1732        """compose title"""
1733        return "PUME Results"
1734
1735
1736InitializeClass(StudentPume)
1737
1738def addStudentPume(container, id, REQUEST=None, **kw):
1739    """Add a Students PUME data."""
1740    ob = StudentPume(id, **kw)
1741    return CPSBase_adder(container, ob, REQUEST=REQUEST)
[179]1742###)
[181]1743
[565]1744##class StudentSemester(CPSDocument): ###(
1745##    """
1746##    WAeUP StudentSemester containing the courses and students
1747##    """
1748##    meta_type = 'StudentSemester'
1749##    portal_type = meta_type
1750##    security = ClassSecurityInfo()
1751##
1752##InitializeClass(StudentSemester)
1753##
1754##def addStudentSemester(container, id, REQUEST=None, **kw):
1755##    """Add a StudentSemester."""
1756##    ob = StudentSemester(id, **kw)
1757##    return CPSBase_adder(container, ob, REQUEST=REQUEST)
1758##
1759#####)
[464]1760
[758]1761##class Semester(CPSDocument): ###(
1762##    """
1763##    WAeUP Semester containing the courses and students
1764##    """
1765##    meta_type = 'Semester'
1766##    portal_type = meta_type
1767##    security = ClassSecurityInfo()
1768##
1769##InitializeClass(Semester)
1770##
1771##def addSemester(container, id, REQUEST=None, **kw):
1772##    """Add a Semester."""
1773##    ob = Semester(id, **kw)
1774##    return CPSBase_adder(container, ob, REQUEST=REQUEST)
1775##
1776#####)
[464]1777
1778class StudentCourseResult(CPSDocument): ###(
[89]1779    """
[464]1780    WAeUP StudentCourseResult
[89]1781    """
[464]1782    meta_type = 'StudentCourseResult'
[89]1783    portal_type = meta_type
1784    security = ClassSecurityInfo()
[472]1785
[454]1786    def getCourseEntry(self,cid):
[723]1787        res = self.portal_catalog({'meta_type': "Course",
[454]1788                                           'id': cid})
1789        if res:
1790            return res[-1]
1791        else:
1792            return None
[154]1793
[454]1794    security.declareProtected(View,"Title")
1795    def Title(self):
1796        """compose title"""
[723]1797        cid = self.aq_parent.getId()
[454]1798        ce = self.getCourseEntry(cid)
1799        if ce:
1800            return "%s" % ce.Title
1801        return "No course with id %s" % cid
[152]1802
[464]1803InitializeClass(StudentCourseResult)
[454]1804
[464]1805def addStudentCourseResult(container, id, REQUEST=None, **kw):
1806    """Add a StudentCourseResult."""
1807    ob = StudentCourseResult(id, **kw)
[89]1808    return CPSBase_adder(container, ob, REQUEST=REQUEST)
[139]1809###)
1810
[579]1811# Backward Compatibility StudyLevel
1812
1813from Products.WAeUP_SRP.Academics import StudyLevel
1814
1815from Products.WAeUP_SRP.Academics import addStudyLevel
1816
Note: See TracBrowser for help on using the repository browser.