source: WAeUP_SRP/trunk/Students.py @ 760

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

StudentPume? class added

  • Property svn:keywords set to Id
File size: 37.7 KB
Line 
1#-*- mode: python; mode: fold -*-
2# $Id: Students.py 758 2006-10-27 07:24:22Z 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 Data'}
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        students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
238        csv_d = {'jamb_reg_no': "Matnumber",
239                 'jamb_lastname': "Surname",
240                 'pume_options': "Options",
241                 'session': "Session",
242                 'days': "Days",
243                 'response': "Responce",
244                 'right': "Right",
245                 'wrong': "Wrong",
246                 'pume_eng_score': "EngScore",
247                 'pume_tot_score': "GenScore",
248                 'batch': "Batch",
249                 'serial': "SerialNo",
250                 'jamb_score': "JambScore",
251                 'omitted':"Omitted",
252                 'search_key': "SearchKey",
253                 'jamb_sex': "Sex",
254                 'fac1': "Fac1",
255                 'fac2': "Fac2",
256                 'jamb_first_cos': "CourseofStudy",
257                 'stud_status':"StudStatus",
258                 'registered': "Registered",
259                 'jamb_state': "State",
260                 'eng_fail': "EngFail",
261                 'gen_fail': "GenFail",
262                 'un_ans_eng': "UnAnsEng",
263                 'un_ans_eng': "UnAnsGen",
264                 'total_ans': "TotalUnAns",
265                 'dept': "Dept",
266                 'jamb_second_cos': "Course2",
267                 'jamb_third_cos': "course3",
268                 }
269        csv_fields = [f[1] for f in csv_d.items()]
270        tr_count = 0
271        name = 'pume_results'
272        no_import = []
273        s = ','.join(['"(%s)"' % fn for fn in csv_fields])
274        no_import.append('%s\n' % s)
275        logger = logging.getLogger('%s_import' % name)
276        logger.info('Start loading from %s.csv' % name)
277        try:
278            result = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
279        except:
280            logger.error('Error reading %s.csv' % name)
281            return
282        for jamb in result:
283            format = ','.join(['"%%(%s)s"' % fn for fn in csv_fields])
284            processing = "processing %s" % format
285            logger.info(processing % jamb)
286            jamb_reg_no = jamb.get(csv_d['jamb_reg_no'])
287            res = self.portal_catalog({'meta_type': "StudentApplication",
288                                     'jamb_reg_no': jamb_reg_no })
289            if res:
290                em = 'Student with REG-NO %s already exists\n' % jamb_reg_no
291                logger.info(em)
292                no_import.append(em)
293                no_import.append(format % jamb)
294                continue
295            jamb_name = jamb.get(csv_d['jamb_lastname'])
296            jamb_name.replace('>','')
297            names = jamb_name.split()
298            letter = names[-1][0].upper()
299            sid = self.generateStudentId(letter)
300            not_created = True
301            while not_created:
302                try:
303                    students_folder.invokeFactory('Student', sid)
304                    not_created = False
305                except BadRequest:
306                    sid = self.generateStudentId(letter)
307            logger.info('%(tr_count)s: Creating Student with ID %(sid)s REG-NO %(jamb_reg_no)s ' % vars())
308            student = getattr(self,sid)
309            student.manage_setLocalRoles(sid, ['Owner',])
310            student.invokeFactory('StudentApplication','application')
311            da = {'Title': 'Application Data'}
312            da["jamb_lastname"] = jamb_name
313            da_fields = ('jamb_reg_no',
314                         'jamb_sex',
315                         'jamb_state',
316                         'jamb_score',
317                         'jamb_first_cos',
318                         'jamb_sex',
319                         'jamb_state',
320                         'jamb_first_cos',
321                         'jamb_second_cos',
322                         'pume_eng_score',
323                         'pume_tot_score',
324                         )
325            for daf in da_fields:
326                da[daf] = jamb.get(csv_d[daf])
327            app = student.application
328            app_doc = app.getContent()
329            app_doc.edit(mapping=da)
330            #wftool.doActionFor(app,'open',dest_container=app)
331            app.manage_setLocalRoles(sid, ['Owner',])
332            student.getContent().createSubObjects()
333            if len(no_import) > 1:
334                open("%s/import/%s_not_imported.csv" % (i_home,name),"w").write(
335                     '\n'.join(no_import))
336        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
337    ###)
338
339    security.declareProtected(ModifyPortalContent,"loadFullTimeStudentsResultsFromCSV") ###(
340    def loadFullTimeStudentsResultsFromCSV(self):
341        """load Fulltime Studentdata from CSV values"""
342        #return
343        level_wf_actions = {}
344        level_wf_actions["SUCCESSFUL STUDENT"] = "pass_A"
345        level_wf_actions["STUDENT WITH CARRYOVER COURSES"] = "pass_B"
346        level_wf_actions["STUDENT FOR PROBATION"] = "probate_C"
347        level_wf_actions["STUDENT ON PROBATION/TRANSFER"] = "reject_D"
348        import transaction
349        wftool = self.portal_workflow
350        tr_count = 0
351        name = 'short_full_time_results_2004_2005'
352        no_import = False
353        if not no_import:
354            no_import = open("%s/import/%s_not_imported.csv" % (i_home,name),"w")
355            no_import.write('"Matnumber","CosCode","Ansbook","CosStuatus","Session","Mat_Cos","Score","CarryLevel","Grade","Weight","Semster","Verdict","Level","id","GPA"\n')
356        logger = logging.getLogger('%s_import' % name)
357        logger.info('Start loading from %s.csv' % name)
358        students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
359        try:
360            results = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
361        except:
362            logger.error('Error reading %s.csv' % name)
363            return
364        l = self.portal_catalog({'meta_type': "Course"})
365        courses = {}
366        for c in l:
367            courses[c.id] = c.getObject()
368        level_changed = False
369        student_changed = False
370        sid = ''
371        #import pdb;pdb.set_trace()
372        for result in results:
373            temp_sid = result.get('Matnumber')
374            if temp_sid != sid:
375                student_changed = True
376                res = self.portal_catalog({'meta_type': "StudentClearance",
377                                         'SearchableText': temp_sid })
378                if not res:
379                    em = 'Student with ID %(Matnumber)s not found\n' % result
380                    logger.info(em)
381                    no_import.write(em)
382                    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)
383                    continue
384                elif len(res) > 1:
385                    em = 'More than one Student with ID %(Matnumber)s found\n' % result
386                    logger.info(em)
387                    no_import.write(em)
388                    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)
389                    continue
390                sid = temp_sid
391                sf = res[0].getObject().aq_parent
392                sc = getattr(sf,'study_course')
393                level = ''
394            else:
395                student_changed = False
396            course = result.get('CosCode')
397            if course not in courses.keys():
398                em = 'Course with ID %(CosCode)s not found\n' % result
399                logger.info(em)
400                no_import.write(em)
401                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)
402                continue
403            course_doc = courses[course].getContent()
404            temp_level = result.get('Level')
405            student_id = sf.getId()
406            result['StudentId'] = student_id
407            if temp_level != level:
408                try:
409                    int(temp_level)
410                except:
411                    em = 'Result with ID %(Matnumber)s Course %(CosCode)s Level is empty\n' % result
412                    logger.info(em)
413                    no_import.write(em)
414                    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)
415                    continue
416                level_changed = True
417                if 'dlev' in vars().keys():
418                    wftool.doActionFor(l,level_wf_actions[dlev['verdict']])
419                level = temp_level
420                l = getattr(sc,level,None)
421                if l is None:
422                    logger.info('Creating Level %(Level)s for %(StudentId)s %(Matnumber)s' % result)
423                    sc.invokeFactory('StudentStudyLevel', level)
424                    l = getattr(sc, level)
425                    l.manage_setLocalRoles(student_id, ['Owner',])
426            else:
427                level_changed = False
428            cr = getattr(l,course,None)
429            if cr is None:
430                logger.info('Creating Course %(CosCode)s for %(StudentId)s %(Matnumber)s in Level %(Level)s' % result)
431                l.invokeFactory('StudentCourseResult',course)
432            cr = getattr(l,course)
433            dcr = {}
434            from_course = ['title',
435                           'credits',
436                           'passmark',
437                           ]
438            for f in from_course:
439                dcr[f] = getattr(course_doc,f)
440            dlev = {}
441            dcr['ansbook'] = result.get('Ansbook')
442            dcr['semester'] = getInt(result.get('Semster'))
443            dcr['status'] = result.get('CosStuatus')
444            dcr['score'] = getInt(result.get('Score'))
445            dlev['session'] = result.get('Session')
446            dcr['carry_level'] = result.get('CarryLevel')
447            dcr['grade'] = result.get('Grade')
448            dcr['weight'] = result.get('Weight')
449            dlev['verdict'] = result.get('Verdict')
450            dcr['import_id'] = result.get('id')
451            gpa = result.get('GPA').replace(',','.')
452            dlev['imported_gpa'] = getFloat(gpa)
453            cr.getContent().edit(mapping = dcr)
454            cr.manage_setLocalRoles(student_id, ['Owner',])
455            l.getContent().edit(mapping = dlev)
456            if tr_count > MAX_TRANS:
457                transaction.commit()
458                tr_count = 0
459            tr_count += 1
460            wftool.doActionFor(cr,'close')
461        wftool.doActionFor(l,level_wf_actions[dlev['verdict']])
462        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
463
464###)
465
466    security.declareProtected(ModifyPortalContent,"loadJAMBFromCSV")###(
467    def loadJAMBFromCSV(self):
468        """load JAMB data from CSV values"""
469        #return
470        students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
471        import transaction
472        tr_count = 0
473        name = 'SampleJAMBDataII'
474        wftool = self.portal_workflow
475        no_import = False
476        if not no_import:
477            no_import = open("%s/import/%s_not_imported.csv" % (i_home,name),"w")
478            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')
479        logger = logging.getLogger('%s_import' % name)
480        logger.info('Start loading from %s.csv' % name)
481        try:
482            result = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
483        except:
484            logger.error('Error reading %s.csv' % name)
485            return
486        for jamb in result:
487            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)
488            jamb_reg_no = jamb.get('REG-NO')
489            res = self.portal_catalog({'meta_type': "StudentApplication",
490                                     'jamb_reg_no': jamb_reg_no })
491            if res:
492                em = 'Student with REG-NO %(REG-NO)s already exists\n' % jamb
493                logger.info(em)
494                no_import.write(em)
495                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)
496                continue
497            jamb_name = jamb.get("NAME")
498            jamb_name.replace('>','')
499            names = jamb_name.split()
500            letter = names[-1][0].upper()
501            sid = self.generateStudentId(letter)
502            not_created = True
503            while not_created:
504                try:
505                    students_folder.invokeFactory('Student', sid)
506                    not_created = False
507                except BadRequest:
508                    sid = self.generateStudentId(letter)
509            logger.info('%(tr_count)s: Creating Student with ID %(sid)s REG-NO %(jamb_reg_no)s ' % vars())
510            student = getattr(self,sid)
511            student.manage_setLocalRoles(sid, ['Owner',])
512            student.invokeFactory('StudentApplication','application')
513            da = {'Title': 'Application Data'}
514            da["jamb_reg_no"] = jamb.get("REG-NO")
515            da["jamb_lastname"] = jamb_name
516            da["jamb_sex"] = jamb.get("SEX")
517            da["jamb_state"] = jamb.get("STATE")
518            da["jamb_lga"] = jamb.get("LGA")
519            da["jamb_score"] = jamb.get("AGGREGATE")
520            da["jamb_first_cos"] = jamb.get("COURSE1")
521            da["jamb_second_cos"] = jamb.get("COURSE2")
522            da["jamb_first_uni"] = jamb.get("UNIV1")
523            da["jamb_second_uni"] = jamb.get("UNIV2")
524            app = student.application
525            app_doc = app.getContent()
526            app_doc.edit(mapping=da)
527            #wftool.doActionFor(app,'open',dest_container=app)
528            app.manage_setLocalRoles(sid, ['Owner',])
529            student.getContent().createSubObjects()
530        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
531    ###)
532
533
534    security.declareProtected(View,"fixOwnership")
535    def fixOwnership(self):
536        """fix Ownership"""
537        for s in self.portal_catalog(meta_type = 'Student'):
538            student = s.getObject()
539            sid = s.getId
540            import pdb;pdb.set_trace()
541            student.application.manage_setLocalRoles(sid, ['Owner',])
542            student.personal.manage_setLocalRoles(sid, ['Owner',])
543
544    security.declareProtected(View,"Title")
545    def Title(self):
546        """compose title"""
547        return "Student Section"
548
549    def generateStudentId(self,letter): ###(
550        import random
551        r = random
552        if letter not in ('ABCDEFGIHKLMNOPQRSTUVWXY'):
553            letter= r.choice('ABCDEFGHKLMNPQRSTUVWXY')
554        students = self.portal_catalog(meta_type = "StudentsFolder")[-1]
555        sid = "%c%d" % (letter,r.randint(99999,1000000))
556        while hasattr(students, sid):
557            sid = "%c%d" % (letter,r.randint(99999,1000000))
558        return sid
559        #return "%c%d" % (r.choice('ABCDEFGHKLMNPQRSTUVWXY'),r.randint(99999,1000000))
560    ###)
561
562InitializeClass(StudentsFolder)
563
564def addStudentsFolder(container, id, REQUEST=None, **kw):
565    """Add a Student."""
566    ob = StudentsFolder(id, **kw)
567    return CPSBase_adder(container, ob, REQUEST=REQUEST)
568###)
569
570class Student(CPSDocument): ###(
571    """
572    WAeUP Student container for the various student data
573    """
574    meta_type = 'Student'
575    portal_type = meta_type
576    security = ClassSecurityInfo()
577
578    security.declareProtected(View,"Title")
579    def Title(self):
580        """compose title"""
581        reg_nr = self.getId()[1:]
582        data = getattr(self,'personal',None)
583        if data:
584            content = data.getContent()
585            return "%s %s" % (content.firstname,content.lastname)
586        data = getattr(self,'application',None)
587        if data:
588            content = data.getContent()
589            return "%s" % (content.jamb_lastname)
590        return self.title
591
592    security.declarePrivate('makeStudentMember') ###(
593    def makeStudentMember(self,sid,password='uNsEt'):
594        """make the student a member"""
595        membership = self.portal_membership
596        membership.addMember(sid,
597                             password ,
598                             roles=('Member',
599                                     'Student',
600                                     ),
601                             domains='',
602                             properties = {'memberareaCreationFlag': False,},)
603        member = membership.getMemberById(sid)
604        self.portal_registration.afterAdd(member, sid, password, None)
605        self.manage_setLocalRoles(sid, ['Owner',])
606
607###)
608
609##    security.declareProtected(View,'createSubObjects') ###(
610##   def createSubObjects(self):
611##        """make the student a member"""
612##        dp = {'Title': 'Personal Data'}
613##        app_doc = self.application.getContent()
614##        names = app_doc.jamb_lastname.split()
615##        if len(names) == 3:
616##            dp['firstname'] = names[0].capitalize()
617##            dp['middlename'] = names[1].capitalize()
618##            dp['lastname'] = names[2].capitalize()
619##        elif len(names) == 2:
620##            dp['firstname'] = names[0].capitalize()
621##            dp['lastname'] = names[1].capitalize()
622##        else:
623##            dp['lastname'] = app_doc.jamb_lastname
624##        dp['sex'] = app_doc.jamb_sex == 'F'
625##        dp['lga'] = "%s/%s" % (app_doc.jamb_state,app_doc.jamb_lga )
626##        proxy = self.aq_parent
627##        proxy.invokeFactory('StudentPersonal','personal')
628##        per = proxy.personal
629##        per_doc = per.getContent()
630##        per_doc.edit(mapping = dp)
631##        per.manage_setLocalRoles(self.getId(), ['Owner',])
632##        #self.portal_workflow.doActionFor(per,'open',dest_container=per)
633
634###)
635
636InitializeClass(Student)
637
638def addStudent(container, id, REQUEST=None, **kw):
639    """Add a Student."""
640    ob = Student(id, **kw)
641    return CPSBase_adder(container, ob, REQUEST=REQUEST)
642
643###)
644
645class StudentAccommodation(CPSDocument): ###(
646    """
647    WAeUP Student container for the various student data
648    """
649    meta_type = 'StudentAccommodation'
650    portal_type = meta_type
651    security = ClassSecurityInfo()
652
653    security.declareProtected(View,"Title")
654    def Title(self):
655        """compose title"""
656        content = self.getContent()
657        #return "Accommodation Data for %s %s" % (content.firstname,content.lastname)
658        return "Accommodation Data for Session %s" % content.session
659
660
661InitializeClass(StudentAccommodation)
662
663def addStudentAccommodation(container, id, REQUEST=None, **kw):
664    """Add a Students personal data."""
665    ob = StudentAccommodation(id, **kw)
666    return CPSBase_adder(container, ob, REQUEST=REQUEST)
667
668###)
669
670class StudentPersonal(CPSDocument): ###(
671    """
672    WAeUP Student container for the various student data
673    """
674    meta_type = 'StudentPersonal'
675    portal_type = meta_type
676    security = ClassSecurityInfo()
677
678    security.declareProtected(View,"Title")
679    def Title(self):
680        """compose title"""
681        content = self.getContent()
682        #return "Personal Data for %s %s" % (content.firstname,content.lastname)
683        return "Personal Data"
684
685
686InitializeClass(StudentPersonal)
687
688def addStudentPersonal(container, id, REQUEST=None, **kw):
689    """Add a Students personal data."""
690    ob = StudentPersonal(id, **kw)
691    return CPSBase_adder(container, ob, REQUEST=REQUEST)
692
693###)
694
695class StudentClearance(CPSDocument): ###(
696    """
697    WAeUP Student container for the various student data
698    """
699    meta_type = 'StudentClearance'
700    portal_type = meta_type
701    security = ClassSecurityInfo()
702
703    security.declareProtected(View,"Title")
704    def Title(self):
705        """compose title"""
706        content = self.getContent()
707        #return "Clearance Data for %s %s" % (content.firstname,content.lastname)
708        return "Clearance Data"
709
710
711InitializeClass(StudentClearance)
712
713def addStudentClearance(container, id, REQUEST=None, **kw):
714    """Add a Students personal data."""
715    ob = StudentClearance(id, **kw)
716    return CPSBase_adder(container, ob, REQUEST=REQUEST)
717
718###)
719
720class StudentStudyLevel(CPSDocument): ###(
721    """
722    WAeUP Student container for the various student data
723    """
724    meta_type = 'StudentStudyLevel'
725    portal_type = meta_type
726    security = ClassSecurityInfo()
727
728    security.declareProtected(View,"Title")
729    def Title(self):
730        """compose title"""
731        return "Level %s" % self.aq_parent.getId()
732
733##    security.declarePublic("gpa")
734##    def gpa(self):
735##        """calculate the gpa"""
736##        sum = 0
737##        course_count = 0
738##        for sc in self.objectValues():
739##            result = sc.getContent()
740##            if not result.grade:
741##                continue
742##            res = self.portal_catalog({'meta_type': 'Course',
743##                                          'id': sc.aq_parent.id})
744##            if len(res) != 1:
745##                continue
746##            course = res[0].getObject().getContent()
747##            sum += course.credits * ['F','E','D','C','B','A'].index(result.grade)
748##            course_count += 1
749##        if course_count:
750##            return sum/course_count
751##        return 0.0
752
753InitializeClass(StudentStudyLevel)
754
755def addStudentStudyLevel(container, id, REQUEST=None, **kw):
756    """Add a Students personal data."""
757    ob = StudentStudyLevel(id, **kw)
758    return CPSBase_adder(container, ob, REQUEST=REQUEST)
759
760###)
761
762class StudentStudyCourse(CPSDocument): ###(
763    """
764    WAeUP Student container for the various student data
765    """
766    meta_type = 'StudentStudyCourse'
767    portal_type = meta_type
768    security = ClassSecurityInfo()
769
770    security.declareProtected(View,"Title")
771    def Title(self):
772        """compose title"""
773        content = self.getContent()
774        return "Study Course"
775
776
777InitializeClass(StudentStudyCourse)
778
779def addStudentStudyCourse(container, id, REQUEST=None, **kw):
780    """Add a Students personal data."""
781    ob = StudentStudyCourse(id, **kw)
782    return CPSBase_adder(container, ob, REQUEST=REQUEST)
783
784###)
785
786class StudentApplication(CPSDocument): ###(
787    """
788    WAeUP Student container for the various student data
789    """
790    meta_type = 'StudentApplication'
791    portal_type = meta_type
792    security = ClassSecurityInfo()
793
794    security.declareProtected(View,"Title")
795    def Title(self):
796        """compose title"""
797        return "Application Data"
798
799
800InitializeClass(StudentApplication)
801
802def addStudentApplication(container, id, REQUEST=None, **kw):
803    """Add a Students eligibility data."""
804    ob = StudentApplication(id, **kw)
805    return CPSBase_adder(container, ob, REQUEST=REQUEST)
806
807
808class StudentPume(CPSDocument): ###(
809    """
810    WAeUP Student container for the various student data
811    """
812    meta_type = 'StudentPume'
813    portal_type = meta_type
814    security = ClassSecurityInfo()
815
816    security.declareProtected(View,"Title")
817    def Title(self):
818        """compose title"""
819        return "PUME Results"
820
821
822InitializeClass(StudentPume)
823
824def addStudentPume(container, id, REQUEST=None, **kw):
825    """Add a Students PUME data."""
826    ob = StudentPume(id, **kw)
827    return CPSBase_adder(container, ob, REQUEST=REQUEST)
828
829###)
830
831##class StudentSemester(CPSDocument): ###(
832##    """
833##    WAeUP StudentSemester containing the courses and students
834##    """
835##    meta_type = 'StudentSemester'
836##    portal_type = meta_type
837##    security = ClassSecurityInfo()
838##
839##InitializeClass(StudentSemester)
840##
841##def addStudentSemester(container, id, REQUEST=None, **kw):
842##    """Add a StudentSemester."""
843##    ob = StudentSemester(id, **kw)
844##    return CPSBase_adder(container, ob, REQUEST=REQUEST)
845##
846#####)
847
848##class Semester(CPSDocument): ###(
849##    """
850##    WAeUP Semester containing the courses and students
851##    """
852##    meta_type = 'Semester'
853##    portal_type = meta_type
854##    security = ClassSecurityInfo()
855##
856##InitializeClass(Semester)
857##
858##def addSemester(container, id, REQUEST=None, **kw):
859##    """Add a Semester."""
860##    ob = Semester(id, **kw)
861##    return CPSBase_adder(container, ob, REQUEST=REQUEST)
862##
863#####)
864
865class StudentCourseResult(CPSDocument): ###(
866    """
867    WAeUP StudentCourseResult
868    """
869    meta_type = 'StudentCourseResult'
870    portal_type = meta_type
871    security = ClassSecurityInfo()
872
873    def getCourseEntry(self,cid):
874        res = self.portal_catalog({'meta_type': "Course",
875                                           'id': cid})
876        if res:
877            return res[-1]
878        else:
879            return None
880
881    security.declareProtected(View,"Title")
882    def Title(self):
883        """compose title"""
884        cid = self.aq_parent.getId()
885        ce = self.getCourseEntry(cid)
886        if ce:
887            return "%s" % ce.Title
888        return "No course with id %s" % cid
889
890InitializeClass(StudentCourseResult)
891
892def addStudentCourseResult(container, id, REQUEST=None, **kw):
893    """Add a StudentCourseResult."""
894    ob = StudentCourseResult(id, **kw)
895    return CPSBase_adder(container, ob, REQUEST=REQUEST)
896###)
897
898# Backward Compatibility StudyLevel
899
900from Products.WAeUP_SRP.Academics import StudyLevel
901
902from Products.WAeUP_SRP.Academics import addStudyLevel
903
Note: See TracBrowser for help on using the repository browser.