source: WAeUP_SRP/trunk/Students.py @ 1710

Last change on this file since 1710 was 1710, checked in by Henrik Bettermann, 18 years ago

path name changed
entry_level dictionary extended

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