source: WAeUP_SRP/trunk/Students.py @ 1142

Last change on this file since 1142 was 1127, checked in by joachim, 18 years ago

change open mode to append

  • Property svn:keywords set to Id
File size: 69.1 KB
Line 
1#-*- mode: python; mode: fold -*-
2# $Id: Students.py 1127 2006-12-21 23:48:02Z joachim $
3from string import Template
4from Globals import InitializeClass
5from AccessControl import ClassSecurityInfo
6from AccessControl.SecurityManagement import newSecurityManager
7from zExceptions import BadRequest
8from Products.ZCatalog.ZCatalog import ZCatalog
9from Products.CMFCore.utils import UniqueObject, getToolByName
10from Products.CMFCore.permissions import View
11from Products.CMFCore.permissions import ModifyPortalContent
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
16from Products.CPSCore.CPSMembershipTool import CPSUnrestrictedUser
17from Products.WAeUP_SRP.Academics import makeCertificateCode
18import logging
19import csv,re,os
20import Globals
21p_home = Globals.package_home(globals())
22i_home = Globals.INSTANCE_HOME
23MAX_TRANS = 1000
24import DateTime
25import PIL.Image
26from StringIO import StringIO
27
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): ###(
40    try:
41        return int(s)
42    except:
43        return 0
44
45def getFloat(s):
46    try:
47        return float(s)
48    except:
49        return 0.0
50
51###)
52
53def getStudentByRegNo(self,reg_no): ###(
54    """search student by JAMB Reg No and return StudentFolder"""
55    search = ZCatalog.searchResults(self.portal_catalog,{'meta_type': 'StudentApplication',
56                                  'SearchableText': reg_no,
57                                  })
58    if len(search) < 1:
59        return None
60    return search[0].getObject().aq_parent
61
62###)
63
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
75
76class StudentsFolder(CPSDocument): ###(
77    """
78    WAeUP container for the various WAeUP containers data
79    """
80    meta_type = 'StudentsFolder'
81    portal_type = meta_type
82    security = ClassSecurityInfo()
83
84    security.declareProtected(ModifyPortalContent,"loadFullTimeStudentsFromCSV")###(
85    def loadFullTimeStudentsFromCSV(self):
86        """load Fulltime Studentdata from CSV values"""
87        import transaction
88        import random
89        tr_count = 0
90        name = 'short_full_time'
91        no_import = False
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')
95        logger = logging.getLogger('Import.%s' % name)
96        logger.info('Start loading from %s.csv' % name)
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"')
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
106        l = self.portal_catalog({'meta_type': "StudentClearance",})
107        matrics = []
108        for s in l:
109            matrics.append(s.getObject().getContent().matric_no)
110        print matrics
111        l = self.portal_catalog({'meta_type': "Certificate"})
112        certs = {}
113        for c in l:
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()
117        for student in students:
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)
119            sid = student.get('MatricNo')
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
126            certcode = makeCertificateCode(student.get('CourseMajor'))
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():
131                em = 'Certificate with ID %s %s not found\n' % (certcode, student.get('CourseMajor'))
132                logger.info(em)
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)
135                continue
136            certificate_doc = certs[cid].getContent()
137            level = student.get('StudentLevel')
138            try:
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
146            matric_no = student.get('MatricNo')
147            if matric_no not in matrics:
148                matrics.append(matric_no)
149                sid = self.generateStudentId(student.get('Lastname')[0])
150                #self.log('Creating Faculty %(id)s = %(Title)s' % faculty)
151                students_folder.invokeFactory('Student', sid)
152                logger.info('%(tr_count)s: Creating Student with ID %(sid)s Matric_no %(matric_no)s ' % vars())
153                student_obj = getattr(self,sid)
154                access_code = "%d" % random.randint(1000000000,9999999999)
155                student_obj.getContent().makeStudentMember(sid,access_code,)
156                pwl_dict = {'student_id': sid,'access_code':access_code}
157                student_obj.invokeFactory('StudentApplication','application')
158                application = student_obj.application
159                da = {'Title': 'Application Data'}
160                student_obj.invokeFactory('StudentPersonal','personal')
161                da['jamb_reg_no'] = student.get('EntryRegNo')
162                personal = student_obj.personal
163                dp = {'Title': 'Personal Data'}
164                student_obj.invokeFactory('StudentClearance','clearance')
165                clearance = student_obj.clearance
166                dc = {'Title': 'Clearance/Eligibility Record'}
167                dc['matric_no'] = matric_no
168                state = student.get('State')
169                lga = student.get('LGA')
170                if state and lga:
171                    lga =  state + ' / ' + lga
172                else:
173                    lga = "None"
174                dc['lga'] = lga
175                dc['nationality'] = student.get('Nationality')
176                dc['email'] = student.get('Emailaddress')
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')
186                application.getContent().edit(mapping=da)
187                personal.getContent().edit(mapping=dp)
188                clearance.getContent().edit(mapping=dc)
189                #
190                # Study Course
191                #
192                student_obj.invokeFactory('StudentStudyCourse','study_course')
193                studycourse = student_obj.study_course
194                dsc = {}
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
208                dsc['study_course'] = certcode
209                css = student.get('CurrentSession') or '2004-2005'
210                cs = int(css.split('-')[0]) - 2000
211                cl = int(student.get('StudentLevel') or '100')/100
212                dsc['entry_session'] = "200%s" % (cs - cl)
213                dsc['clr_ac_pin'] = access_code
214                studycourse.getContent().edit(mapping=dsc)
215                #
216                # Level
217                #
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})
229            else:
230                em = 'Student with ID %(MatricNo)s %(fullname)s already exists\n' % student
231                logger.info(em)
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)
234                continue
235            if tr_count > MAX_TRANS:
236                transaction.commit()
237                em = 'Transaction commited\n' % student
238                logger.info(em)
239                tr_count = 0
240            tr_count += 1
241            pwl_dict.update(dc)
242            pwl_dict.update(da)
243            pwl_dict.update(dp)
244            wftool = self.portal_workflow
245            pwlist.append(pwl_template.substitute(pwl_dict))
246            wftool.doActionFor(student_obj,'clear_and_validate')
247            student_obj.manage_setLocalRoles(sid, ['Owner',])
248            wftool.doActionFor(application,'close')
249            application.manage_setLocalRoles(sid, ['Owner',])
250            wftool.doActionFor(clearance,'close')
251            clearance.manage_setLocalRoles(sid, ['Owner',])
252            wftool.doActionFor(personal,'close')
253            personal.manage_setLocalRoles(sid, ['Owner',])
254            wftool.doActionFor(studycourse,'close_for_edit')
255            studycourse.manage_setLocalRoles(sid, ['Owner',])
256        open("%s/import/pwlist-%s.csv" % (i_home,name),"w+").write('\n'.join(pwlist))
257        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
258    ###)
259
260    security.declareProtected(ModifyPortalContent,"loadPumeResultsFromCSV")###(
261    def loadPumeResultsFromCSV(self):
262        """load Fulltime Studentdata from CSV values into pumeresults catalog"""
263        import transaction
264        import random
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",
277                 'name': "Name",
278                 'score': "Score",
279                 'sex': "Sex",
280                 'course': "Course",
281                 'faculty': "Faculty",
282                 'department': "Dept",
283                 'course_code_org': "Course Code",
284                 'status': "Admission Status",
285                 'result_type': None,
286                 }
287        csv_fields = [f[1] for f in csv_d.items() if f[1]]
288        tr_count = 0
289        total = 0
290        name = 'pup_new'
291        #name = 'pup_update'
292        update = name.endswith('update')
293        no_import = []
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]))
297        current = DateTime.DateTime().strftime("%d-%m-%y_%H_%M_%S")
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))
300        no_import_name = "%s/import/%s_not_imported_%s.csv" % (i_home,name,current)
301        #open(no_import_name,"w").write('\n'.join(no_import))
302        logger = logging.getLogger('Import.%s' % name)
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])
312        import_format = ','.join(['"%%(%s)s"' % fn for fn in csv_d.keys()])
313        eduplicate = '%s,"duplicate"' % format
314        einvalidjamb = '%s,"invalid JambRegNo"' % format
315        added = 'added ,%s' % format
316        #from pdb import set_trace;set_trace()
317        for jamb in result:
318            dict = {}
319            for f,fn in csv_d.items():
320                dict[f] = jamb.get(csv_d[f])
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)
332            if len(res) > 0:
333                if update:
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
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
356            try:
357                pume.addRecord(**dict)
358                ok_import.append(import_format % dict)
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:
366            open(no_import_name,"w+").write('\n'.join(no_import))
367        open(ok_import_name,"w+").write('\n'.join(ok_import))
368        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
369    ###)
370
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)
574            if tr_count > 10:
575                if len(no_import) > 1:
576                    open("%s/import/%s_not_imported.csv" % (i_home,name),"a").write(
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
584        open("%s/import/%s_not_imported.csv" % (i_home,name),"a").write(
585                                               '\n'.join(no_import))
586        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
587    ###)
588
589    security.declareProtected(ModifyPortalContent,"createNewStudents")###(
590    def createNewStudents(self):
591        """load Fulltime Studentdata from CSV values"""
592        import transaction
593        import random
594        #from pdb import set_trace
595        wftool = self.portal_workflow
596        students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
597        csv_d = {'jamb_reg_no': "RegNumber",
598                 'jamb_lastname': "Name",
599                 'session': "Session",
600                 'pume_tot_score': "PUME SCORE",
601                 'jamb_score': "JambScore",
602                 'jamb_sex': "Sex",
603                 'jamb_state': "State",
604##                 'jamb_first_cos': "AdminCourse",
605                 'faculty': "AdminFaculty",
606                 'course_code': "AdmitCoscode",
607                 'stud_status':"AdmitStatus",
608                 'department': "AdmitDept",
609                 'jamb_lga': "LGA",
610                 'app_email': "email",
611                 'app_mobile': "PhoneNumbers",
612                 }
613        csv_fields = [f[1] for f in csv_d.items()]
614        tr_count = 0
615        total = 0
616        #name = 'pume_results'
617        name = 'Admitted'
618        no_import = []
619        s = ','.join(['"(%s)"' % fn for fn in csv_fields])
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
623        open("%s/import/%s_not_imported.csv" % (i_home,name),"w").write('\n'.join(no_import))
624        logger = logging.getLogger('Import.%s' % name)
625        logger.info('start loading from %s.csv' % name)
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()
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:
637            jamb['Error'] = "Processing "
638            logger.info(format % jamb)
639            jamb_reg_no = jamb.get(csv_d['jamb_reg_no'])
640            res = self.portal_catalog({'portal_type': "StudentApplication",
641                                     'SearchableText': jamb_reg_no })
642            if res:
643                em = 'Student with RegNo %s already exists\n' % jamb_reg_no
644                logger.info(em)
645                jamb['Error'] = "Student exists"
646                no_import.append(format % jamb)
647                continue
648            cert_id = makeCertificateCode(jamb.get(csv_d['course_code']))
649            if cert_id not in certs.keys():
650                em = 'No Certificate with ID %s \n' % cert_id
651                logger.info(em)
652                jamb['Error'] = "No Certificate %s" % cert_id
653                no_import.append( format % jamb)
654                continue
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'])
661            cert_doc = certs[cert_id]
662            catalog_entry = {}
663            catalog_entry['jamb_reg_no'] = jamb_reg_no
664            jamb_name = jamb.get(csv_d['jamb_lastname'])
665            jamb_name.replace('>','')
666            jamb_name.replace('<','')
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)
677            catalog_entry['id'] = sid
678            tr_count += 1
679            logger.info('%(total)s+%(tr_count)s: Creating Student with ID %(sid)s REG-NO %(jamb_reg_no)s ' % vars())
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',
690                         'jamb_score',
691##                         'jamb_first_cos',
692                         'jamb_sex',
693                         'jamb_state',
694                         'jamb_lga',
695                         'app_email',
696                         'app_mobile',
697                         )
698            for f in da_fields:
699                da[f] = jamb.get(csv_d[f])
700            catalog_entry['email'] = jamb.get(csv_d['app_email'])
701            app = student.application
702            app_doc = app.getContent()
703            picture ="%s/import/pictures/%s.jpg" % (i_home,jamb_reg_no)
704            #import pdb;pdb.set_trace()
705            if os.path.exists(picture):
706                file = open(picture)
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()
717                app_doc.manage_addFile('passport',
718                                       file=outfile,
719                                       title="%s.jpg" % jamb_reg_no)
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                         )
728            dp['pume_tot_score'] = jamb.get(csv_d['pume_tot_score']) or "No Option Shaded"
729            pume = student.pume
730            pume.getContent().edit(mapping=dp)
731            #wftool.doActionFor(pume,'close')
732            pume.manage_setLocalRoles(sid, ['Owner',])
733            #student.getContent().createSubObjects()
734            dp = {}
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()
741                dp['middlename'] = ''
742                dp['lastname'] = names[1].capitalize()
743            else:
744                dp['firstname'] = ''
745                dp['middlename'] = ''
746                dp['lastname'] = jamb_name
747            dp['sex'] = jamb.get(csv_d['jamb_sex']) == 'F'
748            catalog_entry['sex'] = dp['sex']
749            catalog_entry['name'] = "%(firstname)s %(middlename)s %(lastname)s" % dp
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',])
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
762            #
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            #
770            # Study Course
771            #
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)
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')
792            dsc['study_course'] = cert_id
793            dsc['entry_session'] = jamb.get(csv_d['session'])
794            study_course.getContent().edit(mapping=dsc)
795            self.students_catalog.addRecord(**catalog_entry)
796            if tr_count > 10:
797                if len(no_import) > 0:
798                    open("%s/import/%s_not_imported.csv" % (i_home,name),"a").write(
799                             '\n'.join(no_import))
800                    no_import = []
801                em = '%d transactions commited\n' % tr_count
802                transaction.commit()
803                logger.info(em)
804                total += tr_count
805                tr_count = 0
806        open("%s/import/%s_not_imported.csv" % (i_home,name),"a").write(
807                                                '\n'.join(no_import))
808        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
809    ###)
810
811    security.declareProtected(ModifyPortalContent,"updateStudyCourse")###(
812    def updateStudyCourse(self):
813        """update StudyCourse from CSV values"""
814        import transaction
815        import random
816        from pdb import set_trace
817        wftool = self.portal_workflow
818        students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
819        csv_d = {'jamb_reg_no': "RegNumber",
820                 'jamb_lastname': "Name",
821                 'session': "Session",
822                 'pume_tot_score': "PUME SCORE",
823                 'jamb_score': "JambScore",
824                 'jamb_sex': "Sex",
825                 'jamb_state': "State",
826##                 'jamb_first_cos': "AdminCourse",
827                 'faculty': "AdminFaculty",
828                 'course_code': "AdmitCoscode",
829                 'stud_status':"AdmitStatus",
830                 'department': "AdmitDept",
831                 'jamb_lga': "LGA",
832                 'app_email': "email",
833                 'app_mobile': "PhoneNumbers",
834                 }
835        csv_fields = [f[1] for f in csv_d.items()]
836        tr_count = 0
837        total = 0
838        #name = 'pume_results'
839        name = 'StudyCourseChange'
840        no_import = []
841        s = ','.join(['"(%s)"' % fn for fn in csv_fields])
842        no_import.append('"Error",%s' % s)
843        format = '"%(Error)s",' + ','.join(['"%%(%s)s"' % fn for fn in csv_fields])
844        no_certificate = "no certificate %s" % format
845        open("%s/import/%s_not_imported.csv" % (i_home,name),"w").write(
846                    '\n'.join(no_import))
847        logger = logging.getLogger('Import.%s' % name)
848        logger.info('Start loading from %s.csv' % name)
849        l = self.portal_catalog({'meta_type': "Certificate"})
850        try:
851            result = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
852        except:
853            logger.error('Error reading %s.csv' % name)
854            return
855        for jamb in result:
856            jamb['Error'] = "Processing "
857            logger.info(format % jamb)
858            jamb_reg_no = jamb.get(csv_d['jamb_reg_no'])
859            res = self.portal_catalog({'portal_type': "StudentApplication",
860                                     'SearchableText': jamb_reg_no })
861            if not res:
862                em = 'Student with RegNo %s does not exists\n' % jamb_reg_no
863                logger.info(em)
864                jamb['Error'] = "Student not exists"
865                no_import.append(format % jamb)
866                continue
867            sid = res[0].getPath().split('/')[-2]
868            cert_id = makeCertificateCode(jamb.get(csv_d['course_code']))
869            res = self.portal_catalog(portal_type = "Certificate", id = cert_id)
870            if not res:
871                em = 'No Certificate with ID %s \n' % cert_id
872                logger.info(em)
873                jamb['Error'] = "No Certificate %s" % cert_id
874                no_import.append( format % jamb)
875                continue
876            cert_brain = res[0]
877            catalog_entry = {}
878            student = getattr(self,sid)
879            #
880            # Study Course
881            #
882            study_course = student.study_course
883            dsc = {}
884            cert_pl = cert_brain.getPath().split('/')
885            catalog_entry['id'] = sid
886            catalog_entry['faculty'] = cert_pl[-4]
887            catalog_entry['department'] = cert_pl[-3]
888            catalog_entry['course'] = cert_id
889            dsc['study_course'] = cert_id
890            study_course.getContent().edit(mapping=dsc)
891            self.students_catalog.modifyRecord(**catalog_entry)
892            if tr_count > 10:
893                if len(no_import) > 1:
894                    open("%s/import/%s_not_imported.csv" % (i_home,name),"w+").write(
895                             '\n'.join(no_import))
896                    no_import = []
897                em = '%d transactions commited\n' % tr_count
898                transaction.commit()
899                logger.info(em)
900                total += tr_count
901                tr_count = 0
902            tr_count += 1
903        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
904    ###)
905
906    security.declareProtected(ModifyPortalContent,"OLDloadPumeResultsFromCSV")###(
907    def OLDloadPumeResultsFromCSV(self):
908        """load Fulltime Studentdata from CSV values"""
909        import transaction
910        import random
911        wftool = self.portal_workflow
912        students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
913        csv_d = {'jamb_reg_no': "JAMBRegno",
914                 'jamb_lastname': "Name",
915                 'pume_options': "Options",
916                 'session': "Session",
917                 'days': "Days",
918                 'response': "Responce",
919                 'wrong': "Wrong",
920                 'pume_eng_score': "EngScore",
921                 'pume_gen_score': "GenScore",
922                 'pume_tot_score': "Score",
923                 'batch': "Batch",
924                 'serial': "SerialNo",
925                 'jamb_score': "JambScore",
926                 'omitted':"Omitted",
927                 'search_key': "SearchKey",
928                 'jamb_sex': "Sex",
929                 'fac1': "Fac1",
930                 'fac2': "Fac2",
931                 'jamb_first_cos': "CourseofStudy",
932                 'stud_status':"StudStatus",
933                 'registered': "Registered",
934                 'jamb_state': "State",
935                 'eng_fail': "EngFail",
936                 'gen_fail': "GenFail",
937                 'un_ans_eng': "UnAnsEng",
938                 'un_ans_eng': "UnAnsGen",
939                 'total_ans': "TotalUnAns",
940                 'dept': "Dept",
941                 'jamb_second_cos': "Course2",
942                 'jamb_third_cos': "course3",
943                 }
944        csv_fields = [f[1] for f in csv_d.items()]
945        tr_count = 0
946        name = 'pume_results'
947        no_import = []
948        s = ','.join(['"(%s)"' % fn for fn in csv_fields])
949        no_import.append('%s\n' % s)
950        logger = logging.getLogger('Import.%s' % name)
951        logger.info('Start loading from %s.csv' % name)
952        try:
953            result = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
954        except:
955            logger.error('Error reading %s.csv' % name)
956            return
957        for jamb in result:
958            format = ','.join(['"%%(%s)s"' % fn for fn in csv_fields])
959            processing = "processing %s" % format
960            logger.info(processing % jamb)
961            jamb_reg_no = jamb.get(csv_d['jamb_reg_no'])
962            #import pdb;pdb.set_trace()
963            res = self.portal_catalog({'portal_type': "StudentApplication",
964                                     'jamb_reg_no': jamb_reg_no })
965            if res:
966                em = 'Student with REG-NO %s already exists\n' % jamb_reg_no
967                logger.info(em)
968                no_import.append(em)
969                no_import.append(format % jamb)
970                continue
971            cert_id = jamb.get(csv_d['jamb_first_cos']).upper()
972            res = self.portal_catalog({'portal_type': "Certificate",
973                                     'id': cert_id })
974            if len(res) < 1:
975                em = 'No Certificate with ID %s \n' % cert_id
976                logger.info(em)
977                no_import.append(em)
978                no_import.append(format % jamb)
979                continue
980            cert = res[0].getObject()
981            cert_path = res[0].getPath()
982            cert_doc = cert.getContent()
983            jamb_name = jamb.get(csv_d['jamb_lastname'])
984            jamb_name.replace('>','')
985            names = jamb_name.split()
986            letter = names[-1][0].upper()
987            sid = self.generateStudentId(letter)
988            not_created = True
989            while not_created:
990                try:
991                    students_folder.invokeFactory('Student', sid)
992                    not_created = False
993                except BadRequest:
994                    sid = self.generateStudentId(letter)
995            logger.info('%(tr_count)s: Creating Student with ID %(sid)s REG-NO %(jamb_reg_no)s ' % vars())
996            student = getattr(self,sid)
997            student.manage_setLocalRoles(sid, ['Owner',])
998            student.invokeFactory('StudentClearance','clearance')
999            #wftool.doActionFor(student.clearance,'open')
1000            dp = {'Title': 'Clearance/Eligibility Record'}
1001            student.clearance.manage_setLocalRoles(sid, ['Owner',])
1002            student.invokeFactory('StudentPume','pume')
1003            dp = {'Title': 'Pume Data'}
1004            student.invokeFactory('StudentApplication','application')
1005            da = {'Title': 'Application Data'}
1006            da["jamb_lastname"] = jamb_name
1007            da_fields = ('jamb_reg_no',
1008                         'jamb_sex',
1009                         'jamb_state',
1010                         'jamb_score',
1011                         'jamb_first_cos',
1012                         'jamb_sex',
1013                         'jamb_state',
1014                         'jamb_first_cos',
1015                         'jamb_second_cos',
1016                         )
1017            for f in da_fields:
1018                da[f] = jamb.get(csv_d[f])
1019            app = student.application
1020            app.getContent().edit(mapping=da)
1021            app.manage_setLocalRoles(sid, ['Owner',])
1022            #wftool.doActionFor(app,'close')
1023            dp_fields = (
1024                         'pume_eng_score',
1025                         'pume_gen_score',
1026                         'pume_tot_score',
1027                         )
1028            for f in dp_fields:
1029                dp[f] = float(jamb.get(csv_d[f]))
1030            pume = student.pume
1031            pume.getContent().edit(mapping=dp)
1032            #wftool.doActionFor(pume,'close')
1033            pume.manage_setLocalRoles(sid, ['Owner',])
1034            #
1035            # Study Course
1036            #
1037            student.invokeFactory('StudentStudyCourse','study_course')
1038            study_course = student.study_course
1039            dsc = {}
1040            from_certificate = ['title',
1041                               'max_elect',
1042                               'max_pass',
1043                               'n_core',
1044                               'nr_years',
1045                               'probation_credits',
1046                               'promotion_credits',
1047                               'start_level',
1048                              ]
1049            for f in from_certificate:
1050                dsc[f] = getattr(cert_doc,f)
1051            cpl = cert_path.split('/')
1052            dsc['faculty'] = cpl[-4]
1053            dsc['department'] = cpl[-3]
1054            dsc['study_course'] = cert_id
1055            dsc['entry_session'] = jamb.get(csv_d['session'])
1056            study_course.getContent().edit(mapping=dsc)
1057            student.getContent().createSubObjects()
1058            if dp['pume_tot_score']>49:
1059                wftool.doActionFor(student,'pume_pass')
1060                wftool.doActionFor(student,'admit')
1061            else:
1062                wftool.doActionFor(student,'pume_fail')
1063                wftool.doActionFor(student,'reject_admission')
1064            if len(no_import) > 1:
1065                open("%s/import/%s_not_imported.csv" % (i_home,name),"w").write(
1066                     '\n'.join(no_import))
1067        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
1068    ###)
1069
1070    security.declareProtected(ModifyPortalContent,"loadFullTimeStudentsResultsFromCSV") ###(
1071    def loadFullTimeStudentsResultsFromCSV(self):
1072        """load Fulltime Studentdata from CSV values"""
1073        #return
1074        level_wf_actions = {}
1075        level_wf_actions["SUCCESSFUL STUDENT"] = "pass_A"
1076        level_wf_actions["STUDENT WITH CARRYOVER COURSES"] = "pass_B"
1077        level_wf_actions["STUDENT FOR PROBATION"] = "probate_C"
1078        level_wf_actions["STUDENT ON PROBATION/TRANSFER"] = "reject_D"
1079        import transaction
1080        wftool = self.portal_workflow
1081        tr_count = 0
1082        name = 'short_full_time_results_2004_2005'
1083        no_import = False
1084        if not no_import:
1085            no_import = open("%s/import/%s_not_imported.csv" % (i_home,name),"w")
1086            no_import.write('"Matnumber","CosCode","Ansbook","CosStuatus","Session","Mat_Cos","Score","CarryLevel","Grade","Weight","Semster","Verdict","Level","id","GPA"\n')
1087        logger = logging.getLogger('Ímport.%s' % name)
1088        logger.info('Start loading from %s.csv' % name)
1089        students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
1090        try:
1091            results = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
1092        except:
1093            logger.error('Error reading %s.csv' % name)
1094            return
1095        l = self.portal_catalog({'meta_type': "Course"})
1096        courses = {}
1097        for c in l:
1098            courses[c.id] = c.getObject()
1099        level_changed = False
1100        student_changed = False
1101        sid = ''
1102        #import pdb;pdb.set_trace()
1103        for result in results:
1104            temp_sid = result.get('Matnumber')
1105            if temp_sid != sid:
1106                student_changed = True
1107                res = self.portal_catalog({'meta_type': "StudentClearance",
1108                                         'SearchableText': temp_sid })
1109                if not res:
1110                    em = 'Student with ID %(Matnumber)s not found\n' % result
1111                    logger.info(em)
1112                    no_import.write(em)
1113                    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)
1114                    continue
1115                elif len(res) > 1:
1116                    em = 'More than one Student with ID %(Matnumber)s found\n' % result
1117                    logger.info(em)
1118                    no_import.write(em)
1119                    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)
1120                    continue
1121                sid = temp_sid
1122                sf = res[0].getObject().aq_parent
1123                sc = getattr(sf,'study_course')
1124                level = ''
1125            else:
1126                student_changed = False
1127            course = result.get('CosCode')
1128            if course not in courses.keys():
1129                em = 'Course with ID %(CosCode)s not found\n' % result
1130                logger.info(em)
1131                no_import.write(em)
1132                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)
1133                continue
1134            course_doc = courses[course].getContent()
1135            temp_level = result.get('Level')
1136            student_id = sf.getId()
1137            result['StudentId'] = student_id
1138            if temp_level != level:
1139                try:
1140                    int(temp_level)
1141                except:
1142                    em = 'Result with ID %(Matnumber)s Course %(CosCode)s Level is empty\n' % result
1143                    logger.info(em)
1144                    no_import.write(em)
1145                    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)
1146                    continue
1147                level_changed = True
1148                if 'dlev' in vars().keys():
1149                    wftool.doActionFor(l,level_wf_actions[dlev['verdict']])
1150                level = temp_level
1151                l = getattr(sc,level,None)
1152                if l is None:
1153                    logger.info('Creating Level %(Level)s for %(StudentId)s %(Matnumber)s' % result)
1154                    sc.invokeFactory('StudentStudyLevel', level)
1155                    l = getattr(sc, level)
1156                    l.manage_setLocalRoles(student_id, ['Owner',])
1157            else:
1158                level_changed = False
1159            cr = getattr(l,course,None)
1160            if cr is None:
1161                logger.info('Creating Course %(CosCode)s for %(StudentId)s %(Matnumber)s in Level %(Level)s' % result)
1162                l.invokeFactory('StudentCourseResult',course)
1163            cr = getattr(l,course)
1164            dcr = {}
1165            from_course = ['title',
1166                           'credits',
1167                           'passmark',
1168                           ]
1169            for f in from_course:
1170                dcr[f] = getattr(course_doc,f)
1171            dlev = {}
1172            dcr['ansbook'] = result.get('Ansbook')
1173            dcr['semester'] = getInt(result.get('Semster'))
1174            dcr['status'] = result.get('CosStuatus')
1175            dcr['score'] = getInt(result.get('Score'))
1176            dlev['session'] = result.get('Session')
1177            dcr['carry_level'] = result.get('CarryLevel')
1178            dcr['grade'] = result.get('Grade')
1179            dcr['weight'] = result.get('Weight')
1180            dlev['verdict'] = result.get('Verdict')
1181            dcr['import_id'] = result.get('id')
1182            gpa = result.get('GPA').replace(',','.')
1183            dlev['imported_gpa'] = getFloat(gpa)
1184            cr.getContent().edit(mapping = dcr)
1185            cr.manage_setLocalRoles(student_id, ['Owner',])
1186            l.getContent().edit(mapping = dlev)
1187            if tr_count > MAX_TRANS:
1188                transaction.commit()
1189                tr_count = 0
1190            tr_count += 1
1191            wftool.doActionFor(cr,'close')
1192        wftool.doActionFor(l,level_wf_actions[dlev['verdict']])
1193        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
1194
1195###)
1196
1197    security.declareProtected(ModifyPortalContent,"loadJAMBFromCSV")###(
1198    def loadJAMBFromCSV(self):
1199        """load JAMB data from CSV values"""
1200        #return
1201        students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
1202        import transaction
1203        tr_count = 0
1204        name = 'SampleJAMBDataII'
1205        wftool = self.portal_workflow
1206        no_import = False
1207        if not no_import:
1208            no_import = open("%s/import/%s_not_imported.csv" % (i_home,name),"w")
1209            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')
1210        logger = logging.getLogger('Import.%s' % name)
1211        logger.info('Start loading from %s.csv' % name)
1212        try:
1213            result = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
1214        except:
1215            logger.error('Error reading %s.csv' % name)
1216            return
1217        for jamb in result:
1218            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)
1219            jamb_reg_no = jamb.get('REG-NO')
1220            res = self.portal_catalog({'meta_type': "StudentApplication",
1221                                     'jamb_reg_no': jamb_reg_no })
1222            if res:
1223                em = 'Student with REG-NO %(REG-NO)s already exists\n' % jamb
1224                logger.info(em)
1225                no_import.write(em)
1226                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)
1227                continue
1228            jamb_name = jamb.get("NAME")
1229            jamb_name.replace('>','')
1230            names = jamb_name.split()
1231            letter = names[-1][0].upper()
1232            sid = self.generateStudentId(letter)
1233            not_created = True
1234            while not_created:
1235                try:
1236                    students_folder.invokeFactory('Student', sid)
1237                    not_created = False
1238                except BadRequest:
1239                    sid = self.generateStudentId(letter)
1240            logger.info('%(tr_count)s: Creating Student with ID %(sid)s REG-NO %(jamb_reg_no)s ' % vars())
1241            student = getattr(self,sid)
1242            student.manage_setLocalRoles(sid, ['Owner',])
1243            student.invokeFactory('StudentApplication','application')
1244            da = {'Title': 'Application Data'}
1245            da["jamb_reg_no"] = jamb.get("REG-NO")
1246            da["jamb_lastname"] = jamb_name
1247            da["jamb_sex"] = jamb.get("SEX")
1248            da["jamb_state"] = jamb.get("STATE")
1249            da["jamb_lga"] = jamb.get("LGA")
1250            da["jamb_score"] = jamb.get("AGGREGATE")
1251            da["jamb_first_cos"] = jamb.get("COURSE1")
1252            da["jamb_second_cos"] = jamb.get("COURSE2")
1253            da["jamb_first_uni"] = jamb.get("UNIV1")
1254            da["jamb_second_uni"] = jamb.get("UNIV2")
1255            app = student.application
1256            app_doc = app.getContent()
1257            app_doc.edit(mapping=da)
1258            #wftool.doActionFor(app,'open',dest_container=app)
1259            app.manage_setLocalRoles(sid, ['Owner',])
1260            student.getContent().createSubObjects()
1261        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
1262    ###)
1263
1264
1265    security.declareProtected(View,"fixOwnership")
1266    def fixOwnership(self):
1267        """fix Ownership"""
1268        for s in self.portal_catalog(meta_type = 'Student'):
1269            student = s.getObject()
1270            sid = s.getId
1271            import pdb;pdb.set_trace()
1272            student.application.manage_setLocalRoles(sid, ['Owner',])
1273            student.personal.manage_setLocalRoles(sid, ['Owner',])
1274
1275    security.declareProtected(View,"Title")
1276    def Title(self):
1277        """compose title"""
1278        return "Student Section"
1279
1280    def generateStudentId(self,letter): ###(
1281        import random
1282        r = random
1283        if letter not in ('ABCDEFGIHKLMNOPQRSTUVWXY'):
1284            letter= r.choice('ABCDEFGHKLMNPQRSTUVWXY')
1285        students = self.portal_catalog(meta_type = "StudentsFolder")[-1]
1286        sid = "%c%d" % (letter,r.randint(99999,1000000))
1287        while hasattr(students, sid):
1288            sid = "%c%d" % (letter,r.randint(99999,1000000))
1289        return sid
1290        #return "%c%d" % (r.choice('ABCDEFGHKLMNPQRSTUVWXY'),r.randint(99999,1000000))
1291    ###)
1292
1293InitializeClass(StudentsFolder)
1294
1295def addStudentsFolder(container, id, REQUEST=None, **kw):
1296    """Add a Student."""
1297    ob = StudentsFolder(id, **kw)
1298    return CPSBase_adder(container, ob, REQUEST=REQUEST)
1299###)
1300
1301class Student(CPSDocument): ###(
1302    """
1303    WAeUP Student container for the various student data
1304    """
1305    meta_type = 'Student'
1306    portal_type = meta_type
1307    security = ClassSecurityInfo()
1308
1309    security.declareProtected(View,"Title")
1310    def Title(self):
1311        """compose title"""
1312        reg_nr = self.getId()[1:]
1313        data = getattr(self,'personal',None)
1314        if data:
1315            content = data.getContent()
1316            return "%s %s" % (content.firstname,content.lastname)
1317        data = getattr(self,'application',None)
1318        if data:
1319            content = data.getContent()
1320            return "%s" % (content.jamb_lastname)
1321        return self.title
1322
1323    security.declarePrivate('makeStudentMember') ###(
1324    def makeStudentMember(self,sid,password='uNsEt'):
1325        """make the student a member"""
1326        membership = self.portal_membership
1327        membership.addMember(sid,
1328                             password ,
1329                             roles=('Member',
1330                                     'Student',
1331                                     ),
1332                             domains='',
1333                             properties = {'memberareaCreationFlag': False,
1334                                           'homeless': True},)
1335        member = membership.getMemberById(sid)
1336        self.portal_registration.afterAdd(member, sid, password, None)
1337        self.manage_setLocalRoles(sid, ['Owner',])
1338
1339###)
1340
1341    security.declareProtected(View,'createSubObjects') ###(
1342    def createSubObjects(self):
1343        """make the student a member"""
1344        dp = {'Title': 'Personal Data'}
1345        app_doc = self.application.getContent()
1346        names = app_doc.jamb_lastname.split()
1347        if len(names) == 3:
1348            dp['firstname'] = names[0].capitalize()
1349            dp['middlename'] = names[1].capitalize()
1350            dp['lastname'] = names[2].capitalize()
1351        elif len(names) == 2:
1352            dp['firstname'] = names[0].capitalize()
1353            dp['lastname'] = names[1].capitalize()
1354        else:
1355            dp['lastname'] = app_doc.jamb_lastname
1356        dp['sex'] = app_doc.jamb_sex == 'F'
1357        dp['lga'] = "%s/%s" % (app_doc.jamb_state,app_doc.jamb_lga )
1358        proxy = self.aq_parent
1359        proxy.invokeFactory('StudentPersonal','personal')
1360        per = proxy.personal
1361        per_doc = per.getContent()
1362        per_doc.edit(mapping = dp)
1363        per.manage_setLocalRoles(proxy.getId(), ['Owner',])
1364        #self.portal_workflow.doActionFor(per,'open',dest_container=per)
1365
1366###)
1367
1368InitializeClass(Student)
1369
1370def addStudent(container, id, REQUEST=None, **kw):
1371    """Add a Student."""
1372    ob = Student(id, **kw)
1373    return CPSBase_adder(container, ob, REQUEST=REQUEST)
1374
1375###)
1376
1377class StudentAccommodation(CPSDocument): ###(
1378    """
1379    WAeUP Student container for the various student data
1380    """
1381    meta_type = 'StudentAccommodation'
1382    portal_type = meta_type
1383    security = ClassSecurityInfo()
1384
1385    security.declareProtected(View,"Title")
1386    def Title(self):
1387        """compose title"""
1388        content = self.getContent()
1389        #return "Accommodation Data for %s %s" % (content.firstname,content.lastname)
1390        return "Accommodation Data for Session %s" % content.session
1391
1392
1393InitializeClass(StudentAccommodation)
1394
1395def addStudentAccommodation(container, id, REQUEST=None, **kw):
1396    """Add a Students personal data."""
1397    ob = StudentAccommodation(id, **kw)
1398    return CPSBase_adder(container, ob, REQUEST=REQUEST)
1399
1400###)
1401
1402class StudentPersonal(CPSDocument): ###(
1403    """
1404    WAeUP Student container for the various student data
1405    """
1406    meta_type = 'StudentPersonal'
1407    portal_type = meta_type
1408    security = ClassSecurityInfo()
1409
1410    security.declareProtected(View,"Title")
1411    def Title(self):
1412        """compose title"""
1413        content = self.getContent()
1414        #return "Personal Data for %s %s" % (content.firstname,content.lastname)
1415        return "Personal Data"
1416
1417
1418InitializeClass(StudentPersonal)
1419
1420def addStudentPersonal(container, id, REQUEST=None, **kw):
1421    """Add a Students personal data."""
1422    ob = StudentPersonal(id, **kw)
1423    return CPSBase_adder(container, ob, REQUEST=REQUEST)
1424
1425###)
1426
1427class StudentClearance(CPSDocument): ###(
1428    """
1429    WAeUP Student container for the various student data
1430    """
1431    meta_type = 'StudentClearance'
1432    portal_type = meta_type
1433    security = ClassSecurityInfo()
1434
1435    security.declareProtected(View,"Title")
1436    def Title(self):
1437        """compose title"""
1438        content = self.getContent()
1439        #return "Clearance/Eligibility Record for %s %s" % (content.firstname,content.lastname)
1440        return "Clearance/Eligibility Record"
1441
1442
1443InitializeClass(StudentClearance)
1444
1445def addStudentClearance(container, id, REQUEST=None, **kw):
1446    """Add a Students personal data."""
1447    ob = StudentClearance(id, **kw)
1448    return CPSBase_adder(container, ob, REQUEST=REQUEST)
1449
1450###)
1451
1452class StudentStudyLevel(CPSDocument): ###(
1453    """
1454    WAeUP Student container for the various student data
1455    """
1456    meta_type = 'StudentStudyLevel'
1457    portal_type = meta_type
1458    security = ClassSecurityInfo()
1459
1460    security.declareProtected(View,"Title")
1461    def Title(self):
1462        """compose title"""
1463        return "Level %s" % self.aq_parent.getId()
1464
1465##    security.declarePublic("gpa")
1466##    def gpa(self):
1467##        """calculate the gpa"""
1468##        sum = 0
1469##        course_count = 0
1470##        for sc in self.objectValues():
1471##            result = sc.getContent()
1472##            if not result.grade:
1473##                continue
1474##            res = self.portal_catalog({'meta_type': 'Course',
1475##                                          'id': sc.aq_parent.id})
1476##            if len(res) != 1:
1477##                continue
1478##            course = res[0].getObject().getContent()
1479##            sum += course.credits * ['F','E','D','C','B','A'].index(result.grade)
1480##            course_count += 1
1481##        if course_count:
1482##            return sum/course_count
1483##        return 0.0
1484
1485InitializeClass(StudentStudyLevel)
1486
1487def addStudentStudyLevel(container, id, REQUEST=None, **kw):
1488    """Add a Students personal data."""
1489    ob = StudentStudyLevel(id, **kw)
1490    return CPSBase_adder(container, ob, REQUEST=REQUEST)
1491
1492###)
1493
1494class StudentStudyCourse(CPSDocument): ###(
1495    """
1496    WAeUP Student container for the various student data
1497    """
1498    meta_type = 'StudentStudyCourse'
1499    portal_type = meta_type
1500    security = ClassSecurityInfo()
1501
1502    security.declareProtected(View,"Title")
1503    def Title(self):
1504        """compose title"""
1505        content = self.getContent()
1506        return "Study Course"
1507
1508
1509InitializeClass(StudentStudyCourse)
1510
1511def addStudentStudyCourse(container, id, REQUEST=None, **kw):
1512    """Add a Students personal data."""
1513    ob = StudentStudyCourse(id, **kw)
1514    return CPSBase_adder(container, ob, REQUEST=REQUEST)
1515
1516###)
1517
1518class StudentApplication(CPSDocument): ###(
1519    """
1520    WAeUP Student container for the various student data
1521    """
1522    meta_type = 'StudentApplication'
1523    portal_type = meta_type
1524    security = ClassSecurityInfo()
1525
1526    security.declareProtected(View,"Title")
1527    def Title(self):
1528        """compose title"""
1529        return "Application Data"
1530
1531
1532InitializeClass(StudentApplication)
1533
1534def addStudentApplication(container, id, REQUEST=None, **kw):
1535    """Add a Students eligibility data."""
1536    ob = StudentApplication(id, **kw)
1537    return CPSBase_adder(container, ob, REQUEST=REQUEST)
1538###)
1539
1540
1541class StudentPume(CPSDocument): ###(
1542    """
1543    WAeUP Student container for the various student data
1544    """
1545    meta_type = 'StudentPume'
1546    portal_type = meta_type
1547    security = ClassSecurityInfo()
1548
1549    security.declareProtected(View,"Title")
1550    def Title(self):
1551        """compose title"""
1552        return "PUME Results"
1553
1554
1555InitializeClass(StudentPume)
1556
1557def addStudentPume(container, id, REQUEST=None, **kw):
1558    """Add a Students PUME data."""
1559    ob = StudentPume(id, **kw)
1560    return CPSBase_adder(container, ob, REQUEST=REQUEST)
1561###)
1562
1563##class StudentSemester(CPSDocument): ###(
1564##    """
1565##    WAeUP StudentSemester containing the courses and students
1566##    """
1567##    meta_type = 'StudentSemester'
1568##    portal_type = meta_type
1569##    security = ClassSecurityInfo()
1570##
1571##InitializeClass(StudentSemester)
1572##
1573##def addStudentSemester(container, id, REQUEST=None, **kw):
1574##    """Add a StudentSemester."""
1575##    ob = StudentSemester(id, **kw)
1576##    return CPSBase_adder(container, ob, REQUEST=REQUEST)
1577##
1578#####)
1579
1580##class Semester(CPSDocument): ###(
1581##    """
1582##    WAeUP Semester containing the courses and students
1583##    """
1584##    meta_type = 'Semester'
1585##    portal_type = meta_type
1586##    security = ClassSecurityInfo()
1587##
1588##InitializeClass(Semester)
1589##
1590##def addSemester(container, id, REQUEST=None, **kw):
1591##    """Add a Semester."""
1592##    ob = Semester(id, **kw)
1593##    return CPSBase_adder(container, ob, REQUEST=REQUEST)
1594##
1595#####)
1596
1597class StudentCourseResult(CPSDocument): ###(
1598    """
1599    WAeUP StudentCourseResult
1600    """
1601    meta_type = 'StudentCourseResult'
1602    portal_type = meta_type
1603    security = ClassSecurityInfo()
1604
1605    def getCourseEntry(self,cid):
1606        res = self.portal_catalog({'meta_type': "Course",
1607                                           'id': cid})
1608        if res:
1609            return res[-1]
1610        else:
1611            return None
1612
1613    security.declareProtected(View,"Title")
1614    def Title(self):
1615        """compose title"""
1616        cid = self.aq_parent.getId()
1617        ce = self.getCourseEntry(cid)
1618        if ce:
1619            return "%s" % ce.Title
1620        return "No course with id %s" % cid
1621
1622InitializeClass(StudentCourseResult)
1623
1624def addStudentCourseResult(container, id, REQUEST=None, **kw):
1625    """Add a StudentCourseResult."""
1626    ob = StudentCourseResult(id, **kw)
1627    return CPSBase_adder(container, ob, REQUEST=REQUEST)
1628###)
1629
1630# Backward Compatibility StudyLevel
1631
1632from Products.WAeUP_SRP.Academics import StudyLevel
1633
1634from Products.WAeUP_SRP.Academics import addStudyLevel
1635
Note: See TracBrowser for help on using the repository browser.