source: WAeUP_SRP/trunk/Students.py @ 765

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

pume import addopted
searchStudents-results now sorted by student_id

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