source: WAeUP_SRP/trunk/Students.py @ 886

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

'Clearance/Eligibility? Record' instead of 'Clearance Data'
dynamical view title of StudentClearance? objects

  • Property svn:keywords set to Id
File size: 40.1 KB
Line 
1#-*- mode: python; mode: fold -*-
2# $Id: Students.py 840 2006-11-11 13:17:52Z 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
18import logging
19import csv,re
20import Globals
21p_home = Globals.package_home(globals())
22i_home = Globals.INSTANCE_HOME
23MAX_TRANS = 1000
24
25def getInt(s):
26    try:
27        return int(s)
28    except:
29        return 0
30
31def getFloat(s):
32    try:
33        return float(s)
34    except:
35        return 0.0
36
37def getStudentByRegNo(self,reg_no): ###(
38    """search student by JAMB Reg No and return StudentFolder"""
39    search = ZCatalog.searchResults(self.portal_catalog,{'meta_type': 'StudentApplication',
40                                  'SearchableText': reg_no,
41                                  })
42    if len(search) < 1:
43        return None
44    return search[0].getObject().aq_parent
45
46###)
47
48class StudentsFolder(CPSDocument): ###(
49    """
50    WAeUP container for the various WAeUP containers data
51    """
52    meta_type = 'StudentsFolder'
53    portal_type = meta_type
54    security = ClassSecurityInfo()
55
56    security.declareProtected(ModifyPortalContent,"loadFullTimeStudentsFromCSV")###(
57    def loadFullTimeStudentsFromCSV(self):
58        """load Fulltime Studentdata from CSV values"""
59        import transaction
60        import random
61        tr_count = 0
62        name = 'short_full_time'
63        no_import = False
64        if not no_import:
65            no_import = open("%s/import/%s_not_imported.csv" % (i_home,name),"w")
66            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')
67        logger = logging.getLogger('%s_import' % name)
68        logger.info('Start loading from %s.csv' % name)
69        pwlist  = []
70        pwlist.append('"student_id","firstname","middlename","lastname","matric_no","jamb_reg_no","access_code"')
71        pwl_template = Template('"$student_id","$firstname","$middlename","$lastname","$matric_no","$jamb_reg_no","$access_code"')
72        students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
73        try:
74            students = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
75        except:
76            logger.error('Error reading %s.csv' % name)
77            return
78        l = self.portal_catalog({'meta_type': "StudentClearance",})
79        matrics = []
80        for s in l:
81            matrics.append(s.getObject().getContent().matric_no)
82        print matrics
83        l = self.portal_catalog({'meta_type': "Certificate"})
84        certs = {}
85        for c in l:
86            ca,ac,fa,dep_id,co,certcode = c.relative_path.split('/')
87            cid = "%(dep_id)s_%(certcode)s" % vars()
88            certs[cid] = c.getObject()
89        for student in students:
90            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)
91            sid = student.get('MatricNo')
92            if sid == "":
93                em = 'Empty MatricNo\n'
94                logger.info(em)
95                no_import.write(em)
96                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)
97                continue
98            certcode = makeCertificateCode(student.get('CourseMajor'))
99            dep_id = student.get('Dept')
100            fac_id = student.get('Faculty')
101            cid = "%(dep_id)s_%(certcode)s" % vars()
102            if cid not in certs.keys():
103                em = 'Certificate with ID %s %s not found\n' % (certcode, student.get('CourseMajor'))
104                logger.info(em)
105                no_import.write(em)
106                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)
107                continue
108            certificate_doc = certs[cid].getContent()
109            level = student.get('StudentLevel')
110            try:
111                int(level)
112            except:
113                em = 'Student with ID %(MatricNo)s StudentLevel is empty\n' % student
114                logger.info(em)
115                no_import.write(em)
116                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)
117                continue
118            matric_no = student.get('MatricNo')
119            if matric_no not in matrics:
120                matrics.append(matric_no)
121                sid = self.generateStudentId(student.get('Lastname')[0])
122                #self.log('Creating Faculty %(id)s = %(Title)s' % faculty)
123                students_folder.invokeFactory('Student', sid)
124                logger.info('%(tr_count)s: Creating Student with ID %(sid)s Matric_no %(matric_no)s ' % vars())
125                student_obj = getattr(self,sid)
126                access_code = "%d" % random.randint(1000000000,9999999999)
127                student_obj.getContent().makeStudentMember(sid,access_code,)
128                pwl_dict = {'student_id': sid,'access_code':access_code}
129                student_obj.invokeFactory('StudentApplication','application')
130                application = student_obj.application
131                da = {'Title': 'Application Data'}
132                student_obj.invokeFactory('StudentPersonal','personal')
133                da['jamb_reg_no'] = student.get('EntryRegNo')
134                personal = student_obj.personal
135                dp = {'Title': 'Personal Data'}
136                student_obj.invokeFactory('StudentClearance','clearance')
137                clearance = student_obj.clearance
138                dc = {'Title': 'Clearance/Eligibility Record'}
139                dc['matric_no'] = matric_no
140                state = student.get('State')
141                lga = student.get('LGA')
142                if state and lga:
143                    lga =  state + ' / ' + lga
144                else:
145                    lga = "None"
146                dc['lga'] = lga
147                dc['nationality'] = student.get('Nationality')
148                dc['email'] = student.get('Emailaddress')
149                dp['firstname'] = student.get('FirstName')
150                dp['middlename'] = student.get('MiddleName')
151                dp['lastname'] = student.get('Lastname')
152                dp['former_surname'] = student.get('FormerSurname')
153                dp['sex'] = student.get('Sex') == 'F'
154                dp['perm_address'] = student.get('PermanentAddress')
155                dp['perm_city'] = student.get('PermanentAddressCity')
156                dp['campus_address'] = student.get('CampusAddress')
157                dp['phone'] = student.get('PhoneNumber')
158                application.getContent().edit(mapping=da)
159                personal.getContent().edit(mapping=dp)
160                clearance.getContent().edit(mapping=dc)
161                #
162                # Study Course
163                #
164                student_obj.invokeFactory('StudentStudyCourse','study_course')
165                studycourse = student_obj.study_course
166                dsc = {}
167                from_certificate = ['title',
168                                   'max_elect',
169                                   'max_pass',
170                                   'n_core',
171                                   'nr_years',
172                                   'probation_credits',
173                                   'promotion_credits',
174                                   'start_level',
175                                  ]
176                for f in from_certificate:
177                    dsc[f] = getattr(certificate_doc,f)
178                dsc['faculty'] = fac_id
179                dsc['department'] = dep_id
180                dsc['study_course'] = certcode
181                css = student.get('CurrentSession') or '2004-2005'
182                cs = int(css.split('-')[0]) - 2000
183                cl = int(student.get('StudentLevel') or '100')/100
184                dsc['entry_session'] = "200%s" % (cs - cl)
185                dsc['clr_ac_pin'] = access_code
186                studycourse.getContent().edit(mapping=dsc)
187                #
188                # Level
189                #
190##                l = getattr(studycourse,level,None)
191##                if 0 and l is None:
192##                    #self.log('Creating Department %(DeptCode)s = %(Description)s' % dep)
193##                    logger.info('Creating Level %(StudentLevel)s for %(fullname)s' % student)
194##                    studycourse.invokeFactory('StudentStudyLevel', level)
195##                    l = getattr(studycourse, level)
196##                    certificate = certs[certcode]
197##                    cert_level = getattr(certificate,level,None)
198##                    if cert_level is None:
199##                        logger.info('Level %(level)s not in %(certcode)s' % vars())
200##                    l.getContent().edit(mapping={'Title': "Level %s" % level})
201            else:
202                em = 'Student with ID %(MatricNo)s %(fullname)s already exists\n' % student
203                logger.info(em)
204                no_import.write(em)
205                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)
206                continue
207            if tr_count > MAX_TRANS:
208                transaction.commit()
209                em = 'Transaction commited\n' % student
210                logger.info(em)
211                tr_count = 0
212            tr_count += 1
213            pwl_dict.update(dc)
214            pwl_dict.update(da)
215            pwl_dict.update(dp)
216            wftool = self.portal_workflow
217            pwlist.append(pwl_template.substitute(pwl_dict))
218            wftool.doActionFor(student_obj,'clear_and_validate')
219            student_obj.manage_setLocalRoles(sid, ['Owner',])
220            wftool.doActionFor(application,'close')
221            application.manage_setLocalRoles(sid, ['Owner',])
222            wftool.doActionFor(clearance,'close')
223            clearance.manage_setLocalRoles(sid, ['Owner',])
224            wftool.doActionFor(personal,'close')
225            personal.manage_setLocalRoles(sid, ['Owner',])
226            wftool.doActionFor(studycourse,'close_for_edit')
227            studycourse.manage_setLocalRoles(sid, ['Owner',])
228        open("%s/import/pwlist-%s.csv" % (i_home,name),"w+").write('\n'.join(pwlist))
229        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
230    ###)
231
232    security.declareProtected(ModifyPortalContent,"loadPumeResultsFromCSV")###(
233    def loadPumeResultsFromCSV(self):
234        """load Fulltime Studentdata from CSV values"""
235        import transaction
236        import random
237        wftool = self.portal_workflow
238        students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
239        csv_d = {'jamb_reg_no': "Matnumber",
240                 'jamb_lastname': "Surname",
241                 'pume_options': "Options",
242                 'session': "Session",
243                 'days': "Days",
244                 'response': "Responce",
245                 'wrong': "Wrong",
246                 'pume_eng_score': "EngScore",
247                 'pume_gen_score': "GenScore",
248                 'pume_tot_score': "Right",
249                 'batch': "Batch",
250                 'serial': "SerialNo",
251                 'jamb_score': "JambScore",
252                 'omitted':"Omitted",
253                 'search_key': "SearchKey",
254                 'jamb_sex': "Sex",
255                 'fac1': "Fac1",
256                 'fac2': "Fac2",
257                 'jamb_first_cos': "CourseofStudy",
258                 'stud_status':"StudStatus",
259                 'registered': "Registered",
260                 'jamb_state': "State",
261                 'eng_fail': "EngFail",
262                 'gen_fail': "GenFail",
263                 'un_ans_eng': "UnAnsEng",
264                 'un_ans_eng': "UnAnsGen",
265                 'total_ans': "TotalUnAns",
266                 'dept': "Dept",
267                 'jamb_second_cos': "Course2",
268                 'jamb_third_cos': "course3",
269                 }
270        csv_fields = [f[1] for f in csv_d.items()]
271        tr_count = 0
272        name = 'pume_results'
273        no_import = []
274        s = ','.join(['"(%s)"' % fn for fn in csv_fields])
275        no_import.append('%s\n' % s)
276        logger = logging.getLogger('%s_import' % name)
277        logger.info('Start loading from %s.csv' % name)
278        try:
279            result = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
280        except:
281            logger.error('Error reading %s.csv' % name)
282            return
283        for jamb in result:
284            format = ','.join(['"%%(%s)s"' % fn for fn in csv_fields])
285            processing = "processing %s" % format
286            logger.info(processing % jamb)
287            jamb_reg_no = jamb.get(csv_d['jamb_reg_no'])
288            #import pdb;pdb.set_trace()
289            res = self.portal_catalog({'portal_type': "StudentApplication",
290                                     'jamb_reg_no': jamb_reg_no })
291            if res:
292                em = 'Student with REG-NO %s already exists\n' % jamb_reg_no
293                logger.info(em)
294                no_import.append(em)
295                no_import.append(format % jamb)
296                continue
297            cert_id = jamb.get(csv_d['jamb_first_cos']).upper()
298            res = self.portal_catalog({'portal_type': "Certificate",
299                                     'id': cert_id })
300            if len(res) < 1:
301                em = 'No Certificate with ID %s \n' % cert_id
302                logger.info(em)
303                no_import.append(em)
304                no_import.append(format % jamb)
305                continue
306            cert = res[0].getObject()
307            cert_path = res[0].getPath()
308            cert_doc = cert.getContent()
309            jamb_name = jamb.get(csv_d['jamb_lastname'])
310            jamb_name.replace('>','')
311            names = jamb_name.split()
312            letter = names[-1][0].upper()
313            sid = self.generateStudentId(letter)
314            not_created = True
315            while not_created:
316                try:
317                    students_folder.invokeFactory('Student', sid)
318                    not_created = False
319                except BadRequest:
320                    sid = self.generateStudentId(letter)
321            logger.info('%(tr_count)s: Creating Student with ID %(sid)s REG-NO %(jamb_reg_no)s ' % vars())
322            student = getattr(self,sid)
323            student.manage_setLocalRoles(sid, ['Owner',])
324            student.invokeFactory('StudentClearance','clearance')
325            #wftool.doActionFor(student.clearance,'open')
326            dp = {'Title': 'Clearance/Eligibility Record'}
327            student.clearance.manage_setLocalRoles(sid, ['Owner',])
328            student.invokeFactory('StudentPume','pume')
329            dp = {'Title': 'Pume Data'}
330            student.invokeFactory('StudentApplication','application')
331            da = {'Title': 'Application Data'}
332            da["jamb_lastname"] = jamb_name
333            da_fields = ('jamb_reg_no',
334                         'jamb_sex',
335                         'jamb_state',
336                         'jamb_score',
337                         'jamb_first_cos',
338                         'jamb_sex',
339                         'jamb_state',
340                         'jamb_first_cos',
341                         'jamb_second_cos',
342                         )
343            for f in da_fields:
344                da[f] = jamb.get(csv_d[f])
345            app = student.application
346            app.getContent().edit(mapping=da)
347            app.manage_setLocalRoles(sid, ['Owner',])
348            #wftool.doActionFor(app,'close')
349            dp_fields = (
350                         'pume_eng_score',
351                         'pume_gen_score',
352                         'pume_tot_score',
353                         )
354            for f in dp_fields:
355                dp[f] = float(jamb.get(csv_d[f]))
356            pume = student.pume
357            pume.getContent().edit(mapping=dp)
358            #wftool.doActionFor(pume,'close')
359            pume.manage_setLocalRoles(sid, ['Owner',])
360            #
361            # Study Course
362            #
363            student.invokeFactory('StudentStudyCourse','study_course')
364            study_course = student.study_course
365            dsc = {}
366            from_certificate = ['title',
367                               'max_elect',
368                               'max_pass',
369                               'n_core',
370                               'nr_years',
371                               'probation_credits',
372                               'promotion_credits',
373                               'start_level',
374                              ]
375            for f in from_certificate:
376                dsc[f] = getattr(cert_doc,f)
377            cpl = cert_path.split('/')
378            dsc['faculty'] = cpl[-4]
379            dsc['department'] = cpl[-3]
380            dsc['study_course'] = cert_id
381            dsc['entry_session'] = jamb.get(csv_d['session'])
382            study_course.getContent().edit(mapping=dsc)
383            student.getContent().createSubObjects()
384            if dp['pume_tot_score']>49:
385                wftool.doActionFor(student,'pume_pass')
386                wftool.doActionFor(student,'admit')
387            else:
388                wftool.doActionFor(student,'pume_fail')
389                wftool.doActionFor(student,'reject_admission')
390            if len(no_import) > 1:
391                open("%s/import/%s_not_imported.csv" % (i_home,name),"w").write(
392                     '\n'.join(no_import))
393        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
394    ###)
395
396    security.declareProtected(ModifyPortalContent,"loadFullTimeStudentsResultsFromCSV") ###(
397    def loadFullTimeStudentsResultsFromCSV(self):
398        """load Fulltime Studentdata from CSV values"""
399        #return
400        level_wf_actions = {}
401        level_wf_actions["SUCCESSFUL STUDENT"] = "pass_A"
402        level_wf_actions["STUDENT WITH CARRYOVER COURSES"] = "pass_B"
403        level_wf_actions["STUDENT FOR PROBATION"] = "probate_C"
404        level_wf_actions["STUDENT ON PROBATION/TRANSFER"] = "reject_D"
405        import transaction
406        wftool = self.portal_workflow
407        tr_count = 0
408        name = 'short_full_time_results_2004_2005'
409        no_import = False
410        if not no_import:
411            no_import = open("%s/import/%s_not_imported.csv" % (i_home,name),"w")
412            no_import.write('"Matnumber","CosCode","Ansbook","CosStuatus","Session","Mat_Cos","Score","CarryLevel","Grade","Weight","Semster","Verdict","Level","id","GPA"\n')
413        logger = logging.getLogger('%s_import' % name)
414        logger.info('Start loading from %s.csv' % name)
415        students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
416        try:
417            results = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
418        except:
419            logger.error('Error reading %s.csv' % name)
420            return
421        l = self.portal_catalog({'meta_type': "Course"})
422        courses = {}
423        for c in l:
424            courses[c.id] = c.getObject()
425        level_changed = False
426        student_changed = False
427        sid = ''
428        #import pdb;pdb.set_trace()
429        for result in results:
430            temp_sid = result.get('Matnumber')
431            if temp_sid != sid:
432                student_changed = True
433                res = self.portal_catalog({'meta_type': "StudentClearance",
434                                         'SearchableText': temp_sid })
435                if not res:
436                    em = 'Student with ID %(Matnumber)s not found\n' % result
437                    logger.info(em)
438                    no_import.write(em)
439                    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)
440                    continue
441                elif len(res) > 1:
442                    em = 'More than one Student with ID %(Matnumber)s found\n' % result
443                    logger.info(em)
444                    no_import.write(em)
445                    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)
446                    continue
447                sid = temp_sid
448                sf = res[0].getObject().aq_parent
449                sc = getattr(sf,'study_course')
450                level = ''
451            else:
452                student_changed = False
453            course = result.get('CosCode')
454            if course not in courses.keys():
455                em = 'Course with ID %(CosCode)s not found\n' % result
456                logger.info(em)
457                no_import.write(em)
458                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)
459                continue
460            course_doc = courses[course].getContent()
461            temp_level = result.get('Level')
462            student_id = sf.getId()
463            result['StudentId'] = student_id
464            if temp_level != level:
465                try:
466                    int(temp_level)
467                except:
468                    em = 'Result with ID %(Matnumber)s Course %(CosCode)s Level is empty\n' % result
469                    logger.info(em)
470                    no_import.write(em)
471                    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)
472                    continue
473                level_changed = True
474                if 'dlev' in vars().keys():
475                    wftool.doActionFor(l,level_wf_actions[dlev['verdict']])
476                level = temp_level
477                l = getattr(sc,level,None)
478                if l is None:
479                    logger.info('Creating Level %(Level)s for %(StudentId)s %(Matnumber)s' % result)
480                    sc.invokeFactory('StudentStudyLevel', level)
481                    l = getattr(sc, level)
482                    l.manage_setLocalRoles(student_id, ['Owner',])
483            else:
484                level_changed = False
485            cr = getattr(l,course,None)
486            if cr is None:
487                logger.info('Creating Course %(CosCode)s for %(StudentId)s %(Matnumber)s in Level %(Level)s' % result)
488                l.invokeFactory('StudentCourseResult',course)
489            cr = getattr(l,course)
490            dcr = {}
491            from_course = ['title',
492                           'credits',
493                           'passmark',
494                           ]
495            for f in from_course:
496                dcr[f] = getattr(course_doc,f)
497            dlev = {}
498            dcr['ansbook'] = result.get('Ansbook')
499            dcr['semester'] = getInt(result.get('Semster'))
500            dcr['status'] = result.get('CosStuatus')
501            dcr['score'] = getInt(result.get('Score'))
502            dlev['session'] = result.get('Session')
503            dcr['carry_level'] = result.get('CarryLevel')
504            dcr['grade'] = result.get('Grade')
505            dcr['weight'] = result.get('Weight')
506            dlev['verdict'] = result.get('Verdict')
507            dcr['import_id'] = result.get('id')
508            gpa = result.get('GPA').replace(',','.')
509            dlev['imported_gpa'] = getFloat(gpa)
510            cr.getContent().edit(mapping = dcr)
511            cr.manage_setLocalRoles(student_id, ['Owner',])
512            l.getContent().edit(mapping = dlev)
513            if tr_count > MAX_TRANS:
514                transaction.commit()
515                tr_count = 0
516            tr_count += 1
517            wftool.doActionFor(cr,'close')
518        wftool.doActionFor(l,level_wf_actions[dlev['verdict']])
519        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
520
521###)
522
523    security.declareProtected(ModifyPortalContent,"loadJAMBFromCSV")###(
524    def loadJAMBFromCSV(self):
525        """load JAMB data from CSV values"""
526        #return
527        students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
528        import transaction
529        tr_count = 0
530        name = 'SampleJAMBDataII'
531        wftool = self.portal_workflow
532        no_import = False
533        if not no_import:
534            no_import = open("%s/import/%s_not_imported.csv" % (i_home,name),"w")
535            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')
536        logger = logging.getLogger('%s_import' % name)
537        logger.info('Start loading from %s.csv' % name)
538        try:
539            result = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
540        except:
541            logger.error('Error reading %s.csv' % name)
542            return
543        for jamb in result:
544            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)
545            jamb_reg_no = jamb.get('REG-NO')
546            res = self.portal_catalog({'meta_type': "StudentApplication",
547                                     'jamb_reg_no': jamb_reg_no })
548            if res:
549                em = 'Student with REG-NO %(REG-NO)s already exists\n' % jamb
550                logger.info(em)
551                no_import.write(em)
552                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)
553                continue
554            jamb_name = jamb.get("NAME")
555            jamb_name.replace('>','')
556            names = jamb_name.split()
557            letter = names[-1][0].upper()
558            sid = self.generateStudentId(letter)
559            not_created = True
560            while not_created:
561                try:
562                    students_folder.invokeFactory('Student', sid)
563                    not_created = False
564                except BadRequest:
565                    sid = self.generateStudentId(letter)
566            logger.info('%(tr_count)s: Creating Student with ID %(sid)s REG-NO %(jamb_reg_no)s ' % vars())
567            student = getattr(self,sid)
568            student.manage_setLocalRoles(sid, ['Owner',])
569            student.invokeFactory('StudentApplication','application')
570            da = {'Title': 'Application Data'}
571            da["jamb_reg_no"] = jamb.get("REG-NO")
572            da["jamb_lastname"] = jamb_name
573            da["jamb_sex"] = jamb.get("SEX")
574            da["jamb_state"] = jamb.get("STATE")
575            da["jamb_lga"] = jamb.get("LGA")
576            da["jamb_score"] = jamb.get("AGGREGATE")
577            da["jamb_first_cos"] = jamb.get("COURSE1")
578            da["jamb_second_cos"] = jamb.get("COURSE2")
579            da["jamb_first_uni"] = jamb.get("UNIV1")
580            da["jamb_second_uni"] = jamb.get("UNIV2")
581            app = student.application
582            app_doc = app.getContent()
583            app_doc.edit(mapping=da)
584            #wftool.doActionFor(app,'open',dest_container=app)
585            app.manage_setLocalRoles(sid, ['Owner',])
586            student.getContent().createSubObjects()
587        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
588    ###)
589
590
591    security.declareProtected(View,"fixOwnership")
592    def fixOwnership(self):
593        """fix Ownership"""
594        for s in self.portal_catalog(meta_type = 'Student'):
595            student = s.getObject()
596            sid = s.getId
597            import pdb;pdb.set_trace()
598            student.application.manage_setLocalRoles(sid, ['Owner',])
599            student.personal.manage_setLocalRoles(sid, ['Owner',])
600
601    security.declareProtected(View,"Title")
602    def Title(self):
603        """compose title"""
604        return "Student Section"
605
606    def generateStudentId(self,letter): ###(
607        import random
608        r = random
609        if letter not in ('ABCDEFGIHKLMNOPQRSTUVWXY'):
610            letter= r.choice('ABCDEFGHKLMNPQRSTUVWXY')
611        students = self.portal_catalog(meta_type = "StudentsFolder")[-1]
612        sid = "%c%d" % (letter,r.randint(99999,1000000))
613        while hasattr(students, sid):
614            sid = "%c%d" % (letter,r.randint(99999,1000000))
615        return sid
616        #return "%c%d" % (r.choice('ABCDEFGHKLMNPQRSTUVWXY'),r.randint(99999,1000000))
617    ###)
618
619InitializeClass(StudentsFolder)
620
621def addStudentsFolder(container, id, REQUEST=None, **kw):
622    """Add a Student."""
623    ob = StudentsFolder(id, **kw)
624    return CPSBase_adder(container, ob, REQUEST=REQUEST)
625###)
626
627class Student(CPSDocument): ###(
628    """
629    WAeUP Student container for the various student data
630    """
631    meta_type = 'Student'
632    portal_type = meta_type
633    security = ClassSecurityInfo()
634
635    security.declareProtected(View,"Title")
636    def Title(self):
637        """compose title"""
638        reg_nr = self.getId()[1:]
639        data = getattr(self,'personal',None)
640        if data:
641            content = data.getContent()
642            return "%s %s" % (content.firstname,content.lastname)
643        data = getattr(self,'application',None)
644        if data:
645            content = data.getContent()
646            return "%s" % (content.jamb_lastname)
647        return self.title
648
649    security.declarePrivate('makeStudentMember') ###(
650    def makeStudentMember(self,sid,password='uNsEt'):
651        """make the student a member"""
652        membership = self.portal_membership
653        membership.addMember(sid,
654                             password ,
655                             roles=('Member',
656                                     'Student',
657                                     ),
658                             domains='',
659                             properties = {'memberareaCreationFlag': False,},)
660        member = membership.getMemberById(sid)
661        self.portal_registration.afterAdd(member, sid, password, None)
662        self.manage_setLocalRoles(sid, ['Owner',])
663
664###)
665
666    security.declareProtected(View,'createSubObjects') ###(
667    def createSubObjects(self):
668        """make the student a member"""
669        dp = {'Title': 'Personal Data'}
670        app_doc = self.application.getContent()
671        names = app_doc.jamb_lastname.split()
672        if len(names) == 3:
673            dp['firstname'] = names[0].capitalize()
674            dp['middlename'] = names[1].capitalize()
675            dp['lastname'] = names[2].capitalize()
676        elif len(names) == 2:
677            dp['firstname'] = names[0].capitalize()
678            dp['lastname'] = names[1].capitalize()
679        else:
680            dp['lastname'] = app_doc.jamb_lastname
681        dp['sex'] = app_doc.jamb_sex == 'F'
682        dp['lga'] = "%s/%s" % (app_doc.jamb_state,app_doc.jamb_lga )
683        proxy = self.aq_parent
684        proxy.invokeFactory('StudentPersonal','personal')
685        per = proxy.personal
686        per_doc = per.getContent()
687        per_doc.edit(mapping = dp)
688        per.manage_setLocalRoles(self.getId(), ['Owner',])
689        #self.portal_workflow.doActionFor(per,'open',dest_container=per)
690
691###)
692
693InitializeClass(Student)
694
695def addStudent(container, id, REQUEST=None, **kw):
696    """Add a Student."""
697    ob = Student(id, **kw)
698    return CPSBase_adder(container, ob, REQUEST=REQUEST)
699
700###)
701
702class StudentAccommodation(CPSDocument): ###(
703    """
704    WAeUP Student container for the various student data
705    """
706    meta_type = 'StudentAccommodation'
707    portal_type = meta_type
708    security = ClassSecurityInfo()
709
710    security.declareProtected(View,"Title")
711    def Title(self):
712        """compose title"""
713        content = self.getContent()
714        #return "Accommodation Data for %s %s" % (content.firstname,content.lastname)
715        return "Accommodation Data for Session %s" % content.session
716
717
718InitializeClass(StudentAccommodation)
719
720def addStudentAccommodation(container, id, REQUEST=None, **kw):
721    """Add a Students personal data."""
722    ob = StudentAccommodation(id, **kw)
723    return CPSBase_adder(container, ob, REQUEST=REQUEST)
724
725###)
726
727class StudentPersonal(CPSDocument): ###(
728    """
729    WAeUP Student container for the various student data
730    """
731    meta_type = 'StudentPersonal'
732    portal_type = meta_type
733    security = ClassSecurityInfo()
734
735    security.declareProtected(View,"Title")
736    def Title(self):
737        """compose title"""
738        content = self.getContent()
739        #return "Personal Data for %s %s" % (content.firstname,content.lastname)
740        return "Personal Data"
741
742
743InitializeClass(StudentPersonal)
744
745def addStudentPersonal(container, id, REQUEST=None, **kw):
746    """Add a Students personal data."""
747    ob = StudentPersonal(id, **kw)
748    return CPSBase_adder(container, ob, REQUEST=REQUEST)
749
750###)
751
752class StudentClearance(CPSDocument): ###(
753    """
754    WAeUP Student container for the various student data
755    """
756    meta_type = 'StudentClearance'
757    portal_type = meta_type
758    security = ClassSecurityInfo()
759
760    security.declareProtected(View,"Title")
761    def Title(self):
762        """compose title"""
763        content = self.getContent()
764        #return "Clearance/Eligibility Record for %s %s" % (content.firstname,content.lastname)
765        return "Clearance/Eligibility Record"
766
767
768InitializeClass(StudentClearance)
769
770def addStudentClearance(container, id, REQUEST=None, **kw):
771    """Add a Students personal data."""
772    ob = StudentClearance(id, **kw)
773    return CPSBase_adder(container, ob, REQUEST=REQUEST)
774
775###)
776
777class StudentStudyLevel(CPSDocument): ###(
778    """
779    WAeUP Student container for the various student data
780    """
781    meta_type = 'StudentStudyLevel'
782    portal_type = meta_type
783    security = ClassSecurityInfo()
784
785    security.declareProtected(View,"Title")
786    def Title(self):
787        """compose title"""
788        return "Level %s" % self.aq_parent.getId()
789
790##    security.declarePublic("gpa")
791##    def gpa(self):
792##        """calculate the gpa"""
793##        sum = 0
794##        course_count = 0
795##        for sc in self.objectValues():
796##            result = sc.getContent()
797##            if not result.grade:
798##                continue
799##            res = self.portal_catalog({'meta_type': 'Course',
800##                                          'id': sc.aq_parent.id})
801##            if len(res) != 1:
802##                continue
803##            course = res[0].getObject().getContent()
804##            sum += course.credits * ['F','E','D','C','B','A'].index(result.grade)
805##            course_count += 1
806##        if course_count:
807##            return sum/course_count
808##        return 0.0
809
810InitializeClass(StudentStudyLevel)
811
812def addStudentStudyLevel(container, id, REQUEST=None, **kw):
813    """Add a Students personal data."""
814    ob = StudentStudyLevel(id, **kw)
815    return CPSBase_adder(container, ob, REQUEST=REQUEST)
816
817###)
818
819class StudentStudyCourse(CPSDocument): ###(
820    """
821    WAeUP Student container for the various student data
822    """
823    meta_type = 'StudentStudyCourse'
824    portal_type = meta_type
825    security = ClassSecurityInfo()
826
827    security.declareProtected(View,"Title")
828    def Title(self):
829        """compose title"""
830        content = self.getContent()
831        return "Study Course"
832
833
834InitializeClass(StudentStudyCourse)
835
836def addStudentStudyCourse(container, id, REQUEST=None, **kw):
837    """Add a Students personal data."""
838    ob = StudentStudyCourse(id, **kw)
839    return CPSBase_adder(container, ob, REQUEST=REQUEST)
840
841###)
842
843class StudentApplication(CPSDocument): ###(
844    """
845    WAeUP Student container for the various student data
846    """
847    meta_type = 'StudentApplication'
848    portal_type = meta_type
849    security = ClassSecurityInfo()
850
851    security.declareProtected(View,"Title")
852    def Title(self):
853        """compose title"""
854        return "Application Data"
855
856
857InitializeClass(StudentApplication)
858
859def addStudentApplication(container, id, REQUEST=None, **kw):
860    """Add a Students eligibility data."""
861    ob = StudentApplication(id, **kw)
862    return CPSBase_adder(container, ob, REQUEST=REQUEST)
863###)
864
865
866class StudentPume(CPSDocument): ###(
867    """
868    WAeUP Student container for the various student data
869    """
870    meta_type = 'StudentPume'
871    portal_type = meta_type
872    security = ClassSecurityInfo()
873
874    security.declareProtected(View,"Title")
875    def Title(self):
876        """compose title"""
877        return "PUME Results"
878
879
880InitializeClass(StudentPume)
881
882def addStudentPume(container, id, REQUEST=None, **kw):
883    """Add a Students PUME data."""
884    ob = StudentPume(id, **kw)
885    return CPSBase_adder(container, ob, REQUEST=REQUEST)
886###)
887
888##class StudentSemester(CPSDocument): ###(
889##    """
890##    WAeUP StudentSemester containing the courses and students
891##    """
892##    meta_type = 'StudentSemester'
893##    portal_type = meta_type
894##    security = ClassSecurityInfo()
895##
896##InitializeClass(StudentSemester)
897##
898##def addStudentSemester(container, id, REQUEST=None, **kw):
899##    """Add a StudentSemester."""
900##    ob = StudentSemester(id, **kw)
901##    return CPSBase_adder(container, ob, REQUEST=REQUEST)
902##
903#####)
904
905##class Semester(CPSDocument): ###(
906##    """
907##    WAeUP Semester containing the courses and students
908##    """
909##    meta_type = 'Semester'
910##    portal_type = meta_type
911##    security = ClassSecurityInfo()
912##
913##InitializeClass(Semester)
914##
915##def addSemester(container, id, REQUEST=None, **kw):
916##    """Add a Semester."""
917##    ob = Semester(id, **kw)
918##    return CPSBase_adder(container, ob, REQUEST=REQUEST)
919##
920#####)
921
922class StudentCourseResult(CPSDocument): ###(
923    """
924    WAeUP StudentCourseResult
925    """
926    meta_type = 'StudentCourseResult'
927    portal_type = meta_type
928    security = ClassSecurityInfo()
929
930    def getCourseEntry(self,cid):
931        res = self.portal_catalog({'meta_type': "Course",
932                                           'id': cid})
933        if res:
934            return res[-1]
935        else:
936            return None
937
938    security.declareProtected(View,"Title")
939    def Title(self):
940        """compose title"""
941        cid = self.aq_parent.getId()
942        ce = self.getCourseEntry(cid)
943        if ce:
944            return "%s" % ce.Title
945        return "No course with id %s" % cid
946
947InitializeClass(StudentCourseResult)
948
949def addStudentCourseResult(container, id, REQUEST=None, **kw):
950    """Add a StudentCourseResult."""
951    ob = StudentCourseResult(id, **kw)
952    return CPSBase_adder(container, ob, REQUEST=REQUEST)
953###)
954
955# Backward Compatibility StudyLevel
956
957from Products.WAeUP_SRP.Academics import StudyLevel
958
959from Products.WAeUP_SRP.Academics import addStudyLevel
960
Note: See TracBrowser for help on using the repository browser.