source: WAeUP_SRP/trunk/Students.py @ 764

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

PUME fields renamed

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