source: WAeUP_SRP/trunk/Students.py @ 612

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

fixed loggin bug

  • Property svn:keywords set to Id
File size: 28.3 KB
Line 
1#-*- mode: python; mode: fold -*-
2# $Id: Students.py 606 2006-10-01 22:35:38Z joachim $
3from Globals import InitializeClass
4from AccessControl import ClassSecurityInfo
5from AccessControl.SecurityManagement import newSecurityManager
6from zExceptions import BadRequest
7from Products.ZCatalog.ZCatalog import ZCatalog
8from Products.CMFCore.utils import UniqueObject, getToolByName
9from Products.CMFCore.permissions import View
10from Products.CMFCore.permissions import ModifyPortalContent
11from Products.CPSCore.CPSBase import CPSBase_adder, CPSBaseFolder
12#from Products.CPSCore.CPSBase import CPSBaseDocument as BaseDocument
13from Products.CPSDocument.CPSDocument import CPSDocument
14from Products.CPSCore.CPSBase import CPSBaseBTreeFolder as BaseBTreeFolder
15from Products.CPSCore.CPSMembershipTool import CPSUnrestrictedUser
16from Products.WAeUP_SRP.Academics import makeCertificateCode
17import logging
18import csv,re
19import Globals
20p_home = Globals.package_home(globals())
21i_home = Globals.INSTANCE_HOME
22MAX_TRANS = 1000
23
24def generateStudentId(letter):
25    import random
26    r = random
27    if letter not in ('ABCDEFGIHKLMNOPQRSTUVWXY'):
28        letter= r.choice('ABCDEFGHKLMNPQRSTUVWXY')
29    return "%c%d" % (letter,r.randint(99999,1000000))
30    #return "%c%d" % (r.choice('ABCDEFGHKLMNPQRSTUVWXY'),r.randint(99999,1000000))
31
32def getStudentByRegNo(self,reg_no):
33    """search student by JAMB Reg No and return StudentFolder"""
34    search = ZCatalog.searchResults(self.portal_catalog,{'meta_type': 'StudentApplication',
35                                  'SearchableText': reg_no,
36                                  })
37    if len(search) < 1:
38        return None
39    return search[0].getObject().aq_parent
40
41class StudentsFolder(CPSDocument): ###(
42    """
43    WAeUP container for the various WAeUP containers data
44    """
45    meta_type = 'StudentsFolder'
46    portal_type = meta_type
47    security = ClassSecurityInfo()
48
49    security.declareProtected(ModifyPortalContent,"loadFullTimeStudentsFromCSV")###(
50    def loadFullTimeStudentsFromCSV(self):
51        """load Fulltime Studentdata from CSV values"""
52        #return
53        import transaction
54        tr_count = 0
55        name = 'short_full_time'
56        no_import = False
57        if not no_import:
58            no_import = open("%s/import/%s_not_imported.csv" % (i_home,name),"w")
59            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')
60        logger = logging.getLogger('%s_import' % name)
61        logger.info('Start loading from %s.csv' % name)
62        students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
63        try:
64            students = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
65        except:
66            logger.error('Error reading %s.csv' % name)
67            return
68        l = self.portal_catalog({'meta_type': "StudentClearance",})
69        matrics = []
70        for s in l:
71            matrics.append(s.getObject().getContent().matric_no)
72        print matrics
73        l = self.portal_catalog({'meta_type': "Certificate"})
74        certs = {}
75        for c in l:
76            certs[c.id] = c.getObject()
77        for student in students:
78            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)
79            sid = student.get('MatricNo')
80            if sid == "":
81                em = 'Empty MatricNo\n'
82                logger.info(em)
83                no_import.write(em)
84                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)
85                continue
86            certcode = makeCertificateCode(student.get('CourseMajor'))
87            if certcode not in certs.keys():
88                em = 'Certificate with ID %s %s not found\n' % (certcode, student.get('CourseMajor'))
89                logger.info(em)
90                no_import.write(em)
91                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)
92                continue
93            level = student.get('StudentLevel')
94            try:
95                int(level)
96            except:
97                em = 'Student with ID %(MatricNo)s StudentLevel is empty\n' % student
98                logger.info(em)
99                no_import.write(em)
100                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)
101                continue
102            matric_no = student.get('MatricNo')
103            if matric_no not in matrics:
104                matrics.append(matric_no)
105                sid = generateStudentId()
106                #self.log('Creating Faculty %(id)s = %(Title)s' % faculty)
107                logger.info('%(tr_count)s: Creating Student with ID %(sid)s Matric_no %(matric_no)s ' % vars())
108                not_created = True
109                while not_created:
110                    try:
111                        students_folder.invokeFactory('Student', sid)
112                        not_created = False
113                    except BadRequest:
114                        sid = generateStudentId()
115                logger.info('%(tr_count)s: Creating Student with ID %(sid)s Matric_no %(matric_no)s ' % vars())
116                s = getattr(self,sid)
117                self.portal_registration.addMember(sid,
118                                                   'uNsEt' ,
119                                                   roles=('Member',
120                                                          'Student',))
121                s.invokeFactory('StudentApplication','application')
122                da = {'Title': 'Application Data'}
123                s.invokeFactory('StudentPersonal','personal')
124                da['jamb_reg_no'] = student.get('EntryRegNo')
125                sp = s.personal
126                d = {'Title': 'Personal Data'}
127                s.invokeFactory('StudentClearance','clearance')
128                sc = s.clearance
129                dc = {'Title': 'Clearance Data'}
130                dc['matric_no'] = matric_no
131                lga = student.get('State') + ' / ' + student.get('LGA')
132                dc['lga'] = lga
133                dc['nationality'] = student.get('Nationality')
134                dc['email'] = student.get('Emailaddress')
135                d['firstname'] = student.get('FirstName')
136                d['middlename'] = student.get('MiddleName')
137                d['lastname'] = student.get('Lastname')
138                d['former_surname'] = student.get('FormerSurname')
139                d['sex'] = student.get('Sex') == 'F'
140                d['perm_address'] = student.get('PermanentAddress')
141                d['perm_city'] = student.get('PermanentAddressCity')
142                d['campus_address'] = student.get('CampusAddress')
143                d['phone'] = student.get('PhoneNumber')
144                s.application.getContent().edit(mapping=da)
145                sp.getContent().edit(mapping=d)
146                sc.getContent().edit(mapping=dc)
147                #
148                # Study Course
149                #
150                s.invokeFactory('StudentStudyCourse','study_course')
151                sc = s.study_course
152                d = {}
153                #d['matricel_no'] = student.get('MatricNo')
154                #d['entry_reg_no'] = student.get('EntryRegNo')
155                #d['faculty'] = student.get('Faculty')
156                #d['department'] = student.get('Dept')
157                d['study_course'] = certcode
158                css = student.get('CurrentSession') or '2004-2005'
159                cs = int(css.split('-')[0]) - 2000
160                cl = int(student.get('StudentLevel'))/100
161                d['entry_session'] = "200%s" % (cs - cl)
162                sc.getContent().edit(mapping=d)
163                #
164                # Level
165                #
166                l = getattr(sc,level,None)
167                if l is None:
168                    #self.log('Creating Department %(DeptCode)s = %(Description)s' % dep)
169                    logger.info('Creating Level %(StudentLevel)s for %(fullname)s' % student)
170                    sc.invokeFactory('StudentStudyLevel', level)
171                    l = getattr(sc, level)
172                    certificate = certs[certcode]
173                    cert_level = getattr(certificate,level,None)
174                    if cert_level is None:
175                        logger.info('Level %(level)s not in %(certcode)s' % vars())
176                    l.getContent().edit(mapping={'Title': "Level %s" % level})
177                    l.invokeFactory('StudentSemester','first')
178                    l.invokeFactory('StudentSemester','second')
179                    first_s = getattr(l,'first')
180                    first_s.getContent().edit(mapping={'Title': 'First Semester'})
181                    second_s = getattr(l,'second')
182                    second_s.getContent().edit(mapping={'Title': 'Second Semester'})
183            else:
184                em = 'Student with ID %(MatricNo)s %(fullname)s already exists\n' % student
185                logger.info(em)
186                no_import.write(em)
187                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)
188            if tr_count > MAX_TRANS:
189                transaction.commit()
190                em = 'Transaction commited\n' % student
191                logger.info(em)
192                tr_count = 0
193            tr_count += 1
194        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
195    ###)
196
197    security.declareProtected(ModifyPortalContent,"loadFullTimeStudentsResultsFromCSV") ###(
198    def loadFullTimeStudentsResultsFromCSV(self):
199        """load Fulltime Studentdata from CSV values"""
200        #return
201        import transaction
202        tr_count = 0
203        name = 'short_full_time_results_2004_2005'
204        no_import = False
205        if not no_import:
206            no_import = open("%s/import/%s_not_imported.csv" % (i_home,name),"w")
207            no_import.write('"Matnumber","CosCode","Ansbook","CosStuatus","Session","Mat_Cos","Score","CarryLevel","Grade","Weight","Semster","Verdict","Level","id","GPA"\n')
208        logger = logging.getLogger('%s_import' % name)
209        logger.info('Start loading from %s.csv' % name)
210        students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
211        try:
212            results = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
213        except:
214            logger.error('Error reading %s.csv' % name)
215            return
216        l = self.portal_catalog({'meta_type': "Course"})
217        courses = {}
218        for c in l:
219            courses[c.id] = c.getObject()
220        for result in results:
221            sid = result.get('Matnumber')
222            res = self.portal_catalog({'meta_type': "StudentClearance",
223                                     'matric_no': sid })
224            if not res:
225                em = 'Student with ID %(Matnumber)s not found\n' % result
226                logger.info(em)
227                no_import.write(em)
228                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)
229                continue
230            sf = res[0].getObject().aq_parent
231            result['StudentId'] = sf.getId()
232            course = result.get('CosCode')
233            if course not in courses.keys():
234                em = 'Course with ID %(CosCode)s not found\n' % result
235                logger.info(em)
236                no_import.write(em)
237                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)
238                continue
239            level = result.get('Level')
240            try:
241                int(level)
242            except:
243                em = 'Result for result with ID %(Matnumber)s Course %(CosCode)s Level is empty\n' % result
244                logger.info(em)
245                no_import.write(em)
246                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)
247                continue
248            sc = getattr(sf,'study_course')
249            l = getattr(sc,level,None)
250            if l is None:
251                #self.log('Creating Department %(DeptCode)s = %(Description)s' % dep)
252                logger.info('Creating Level %(Level)s for %(StudentId)s %(Matnumber)s' % result)
253                sc.invokeFactory('StudentStudyLevel', level)
254                l = getattr(sc, level)
255                l.invokeFactory('StudentSemester','first')
256                l.invokeFactory('StudentSemester','second')
257                first_s = getattr(l,'first')
258                first_s.getContent().edit(mapping={'Title': 'First Semester'})
259                second_s = getattr(l,'second')
260                second_s.getContent().edit(mapping={'Title': 'Second Semester'})
261            snr = result.get('Semster')
262            semester = getattr(l,'first')
263            if snr == "2":
264                semester = getattr(l,'second')
265            logger.info('Creating StudentCourseResult %(CosCode)s in Level %(Level)s for %(StudentId)s %(Matnumber)s' % result)
266            semester.invokeFactory('StudentCourseResult',course)
267            ct = getattr(semester,course)
268            d = {}
269            dlev = {}
270            d['ansbook'] = result.get('Ansbook')
271            d['status'] = result.get('CosStuatus')
272            d['score'] = result.get('Score')
273            dlev['session'] = result.get('Session')
274            dlev['carry_level'] = result.get('CarryLevel')
275            d['grade'] = result.get('Grade')
276            #d['weight'] = result.get('Weight')
277            dlev['verdict'] = result.get('Verdict')
278            #d['import_id'] = result.get('id')
279            #gpa = result.get('GPA').replace(',','.')
280            #d['gpa'] = float(gpa)
281            ct.getContent().edit(mapping = d)
282            l.getContent().edit(mapping = dlev)
283            if tr_count > MAX_TRANS:
284                transaction.commit()
285                tr_count = 0
286            tr_count += 1
287        return self.students.academics_contents()
288
289###)
290
291    security.declareProtected(ModifyPortalContent,"loadJAMBFromCSV")###(
292    def loadJAMBFromCSV(self):
293        """load JAMB data from CSV values"""
294        #return
295        students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
296        import transaction
297        tr_count = 0
298        name = 'SampleJAMBDataII'
299        wftool = self.portal_workflow
300        no_import = False
301        if not no_import:
302            no_import = open("%s/import/%s_not_imported.csv" % (i_home,name),"w")
303            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')
304        logger = logging.getLogger('%s_import' % name)
305        logger.info('Start loading from %s.csv' % name)
306        try:
307            result = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
308        except:
309            logger.error('Error reading %s.csv' % name)
310            return
311        for jamb in result:
312            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)
313            jamb_reg_no = jamb.get('REG-NO')
314            res = self.portal_catalog({'meta_type': "StudentApplication",
315                                     'jamb_reg_no': jamb_reg_no })
316            if res:
317                em = 'Student with REG-NO %(REG-NO)s already exists\n' % jamb
318                logger.info(em)
319                no_import.write(em)
320                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)
321                continue
322            jamb_name = jamb.get("NAME")
323            jamb_name.replace('>','')
324            names = jamb_name.split()
325            letter = names[-1][0].upper()
326            sid = generateStudentId(letter)
327            #self.log('Creating Faculty %(id)s = %(Title)s' % faculty)
328            not_created = True
329            while not_created:
330                try:
331                    students_folder.invokeFactory('Student', sid)
332                    not_created = False
333                except BadRequest:
334                    sid = generateStudentId(letter)
335            logger.info('%(tr_count)s: Creating Student with ID %(sid)s REG-NO %(jamb_reg_no)s ' % vars())
336            student = getattr(self,sid)
337            student.manage_setLocalRoles(sid, ['Owner',])
338            student.invokeFactory('StudentApplication','application')
339            da = {'Title': 'Application Data'}
340            da["jamb_reg_no"] = jamb.get("REG-NO")
341            da["jamb_lastname"] = jamb_name
342            da["jamb_sex"] = jamb.get("SEX")
343            da["jamb_state"] = jamb.get("STATE")
344            da["jamb_lga"] = jamb.get("LGA")
345            da["jamb_score"] = jamb.get("AGGREGATE")
346            da["jamb_first_cos"] = jamb.get("COURSE1")
347            da["jamb_second_cos"] = jamb.get("COURSE2")
348            da["jamb_first_uni"] = jamb.get("UNIV1")
349            da["jamb_second_uni"] = jamb.get("UNIV2")
350            app = student.application
351            app_doc = app.getContent()
352            app_doc.edit(mapping=da)
353            #wftool.doActionFor(app,'open',dest_container=app)
354            app.manage_setLocalRoles(sid, ['Owner',])
355            student.getContent().createSubObjects()
356        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
357    ###)
358
359
360    security.declareProtected(View,"fixOwnership")
361    def fixOwnership(self):
362        """fix Ownership"""
363        for s in self.portal_catalog(meta_type = 'Student'):
364            student = s.getObject()
365            sid = s.getId
366            import pdb;pdb.set_trace()
367            student.application.manage_setLocalRoles(sid, ['Owner',])
368            student.personal.manage_setLocalRoles(sid, ['Owner',])
369
370    security.declareProtected(View,"Title")
371    def Title(self):
372        """compose title"""
373        return "Student Section"
374
375InitializeClass(StudentsFolder)
376
377def addStudentsFolder(container, id, REQUEST=None, **kw):
378    """Add a Student."""
379    ob = StudentsFolder(id, **kw)
380    return CPSBase_adder(container, ob, REQUEST=REQUEST)
381###)
382
383class Student(CPSDocument): ###(
384    """
385    WAeUP Student container for the various student data
386    """
387    meta_type = 'Student'
388    portal_type = meta_type
389    security = ClassSecurityInfo()
390
391    security.declareProtected(View,"Title")
392    def Title(self):
393        """compose title"""
394        reg_nr = self.getId()[1:]
395        data = getattr(self,'personal',None)
396        if data:
397            content = data.getContent()
398            return "%s %s" % (content.firstname,content.lastname)
399        data = getattr(self,'application',None)
400        if data:
401            content = data.getContent()
402            return "%s" % (content.jamb_lastname)
403        return self.title
404
405    security.declarePrivate('makeStudentMember') ###(
406    def makeStudentMember(self,sid,password='uNsEt'):
407        """make the student a member"""
408        membership = self.portal_membership
409        membership.addMember(sid,
410                             password ,
411                             roles=('Member',
412                                     'Student',
413                                     ),
414                             domains='',
415                             properties = {'memberareaCreationFlag': False,},)
416        member = membership.getMemberById(sid)
417        self.portal_registration.afterAdd(member, sid, password, None)
418        self.manage_setLocalRoles(sid, ['Owner',])
419
420###)
421
422    security.declareProtected(View,'createSubObjects') ###(
423    def createSubObjects(self):
424        """make the student a member"""
425        dp = {'Title': 'Personal Data'}
426        app_doc = self.application.getContent()
427        names = app_doc.jamb_lastname.split()
428        if len(names) == 3:
429            dp['firstname'] = names[0].capitalize()
430            dp['middlename'] = names[1].capitalize()
431            dp['lastname'] = names[2].capitalize()
432        elif len(names) == 2:
433            dp['firstname'] = names[0].capitalize()
434            dp['lastname'] = names[1].capitalize()
435        else:
436            dp['lastname'] = app_doc.jamb_lastname
437        dp['sex'] = app_doc.jamb_sex == 'F'
438        dp['lga'] = "%s/%s" % (app_doc.jamb_state,app_doc.jamb_lga )
439        proxy = self.aq_parent
440        proxy.invokeFactory('StudentPersonal','personal')
441        per = proxy.personal
442        per_doc = per.getContent()
443        per_doc.edit(mapping = dp)
444        per.manage_setLocalRoles(self.getId(), ['Owner',])
445        #self.portal_workflow.doActionFor(per,'open',dest_container=per)
446
447###)
448
449InitializeClass(Student)
450
451def addStudent(container, id, REQUEST=None, **kw):
452    """Add a Student."""
453    ob = Student(id, **kw)
454    return CPSBase_adder(container, ob, REQUEST=REQUEST)
455
456###)
457
458class StudentPersonal(CPSDocument): ###(
459    """
460    WAeUP Student container for the various student data
461    """
462    meta_type = 'StudentPersonal'
463    portal_type = meta_type
464    security = ClassSecurityInfo()
465
466    security.declareProtected(View,"Title")
467    def Title(self):
468        """compose title"""
469        content = self.getContent()
470        #return "Personal Data for %s %s" % (content.firstname,content.lastname)
471        return "Personal Data"
472
473
474InitializeClass(StudentPersonal)
475
476def addStudentPersonal(container, id, REQUEST=None, **kw):
477    """Add a Students personal data."""
478    ob = StudentPersonal(id, **kw)
479    return CPSBase_adder(container, ob, REQUEST=REQUEST)
480
481###)
482
483class StudentClearance(CPSDocument): ###(
484    """
485    WAeUP Student container for the various student data
486    """
487    meta_type = 'StudentClearance'
488    portal_type = meta_type
489    security = ClassSecurityInfo()
490
491    security.declareProtected(View,"Title")
492    def Title(self):
493        """compose title"""
494        content = self.getContent()
495        #return "Clearance Data for %s %s" % (content.firstname,content.lastname)
496        return "Clearance Data"
497
498
499InitializeClass(StudentClearance)
500
501def addStudentClearance(container, id, REQUEST=None, **kw):
502    """Add a Students personal data."""
503    ob = StudentClearance(id, **kw)
504    return CPSBase_adder(container, ob, REQUEST=REQUEST)
505
506###)
507
508class StudentStudyLevel(CPSDocument): ###(
509    """
510    WAeUP Student container for the various student data
511    """
512    meta_type = 'StudentStudyLevel'
513    portal_type = meta_type
514    security = ClassSecurityInfo()
515
516    security.declareProtected(View,"Title")
517    def Title(self):
518        """compose title"""
519        return "Level %s" % self.aq_parent.getId()
520
521    security.declareProtected(View,"gpa")
522    def gpa(self):
523        """calculate the gpa"""
524        sum = 0
525        course_count = 0
526        for semester in ('first','second'):
527            sf=getattr(self,semester)
528            for sc in sf.objectValues():
529                result = sc.getContent()
530                res = self.portal_catalog({'meta_type': 'Course',
531                                              'id': sc.aq_parent.id})
532                if len(res) != 1:
533                    continue
534                course = res[0].getObject().getContent()
535                sum += course.credits * ['F','E','D','C','B','A'].index(result.grade)
536                course_count += 1
537        if course_count:
538            return sum/course_count
539        return 0.0
540
541InitializeClass(StudentStudyLevel)
542
543def addStudentStudyLevel(container, id, REQUEST=None, **kw):
544    """Add a Students personal data."""
545    ob = StudentStudyLevel(id, **kw)
546    return CPSBase_adder(container, ob, REQUEST=REQUEST)
547
548###)
549
550class StudentStudyCourse(CPSDocument): ###(
551    """
552    WAeUP Student container for the various student data
553    """
554    meta_type = 'StudentStudyCourse'
555    portal_type = meta_type
556    security = ClassSecurityInfo()
557
558    security.declareProtected(View,"Title")
559    def Title(self):
560        """compose title"""
561        content = self.getContent()
562        return "Study Course"
563
564
565InitializeClass(StudentStudyCourse)
566
567def addStudentStudyCourse(container, id, REQUEST=None, **kw):
568    """Add a Students personal data."""
569    ob = StudentStudyCourse(id, **kw)
570    return CPSBase_adder(container, ob, REQUEST=REQUEST)
571
572###)
573
574class StudentApplication(CPSDocument): ###(
575    """
576    WAeUP Student container for the various student data
577    """
578    meta_type = 'StudentApplication'
579    portal_type = meta_type
580    security = ClassSecurityInfo()
581
582    security.declareProtected(View,"Title")
583    def Title(self):
584        """compose title"""
585        return "Application Data"
586
587
588InitializeClass(StudentApplication)
589
590def addStudentApplication(container, id, REQUEST=None, **kw):
591    """Add a Students eligibility data."""
592    ob = StudentApplication(id, **kw)
593    return CPSBase_adder(container, ob, REQUEST=REQUEST)
594
595###)
596
597##class StudentSemester(CPSDocument): ###(
598##    """
599##    WAeUP StudentSemester containing the courses and students
600##    """
601##    meta_type = 'StudentSemester'
602##    portal_type = meta_type
603##    security = ClassSecurityInfo()
604##
605##InitializeClass(StudentSemester)
606##
607##def addStudentSemester(container, id, REQUEST=None, **kw):
608##    """Add a StudentSemester."""
609##    ob = StudentSemester(id, **kw)
610##    return CPSBase_adder(container, ob, REQUEST=REQUEST)
611##
612#####)
613
614class Semester(CPSDocument): ###(
615    """
616    WAeUP Semester containing the courses and students
617    """
618    meta_type = 'Semester'
619    portal_type = meta_type
620    security = ClassSecurityInfo()
621
622InitializeClass(Semester)
623
624def addSemester(container, id, REQUEST=None, **kw):
625    """Add a Semester."""
626    ob = Semester(id, **kw)
627    return CPSBase_adder(container, ob, REQUEST=REQUEST)
628
629###)
630
631class StudentCourseResult(CPSDocument): ###(
632    """
633    WAeUP StudentCourseResult
634    """
635    meta_type = 'StudentCourseResult'
636    portal_type = meta_type
637    security = ClassSecurityInfo()
638
639    def getCourseEntry(self,cid):
640        res = self.portal_catalog({'meta_type': "StudentCourse",
641                                           'id': cid})
642        if res:
643            return res[-1]
644        else:
645            return None
646
647    security.declareProtected(View,"Title")
648    def Title(self):
649        """compose title"""
650        cid = self.getId()
651        ce = self.getCourseEntry(cid)
652        if ce:
653            return "%s" % ce.Title
654        return "No course with id %s" % cid
655
656InitializeClass(StudentCourseResult)
657
658def addStudentCourseResult(container, id, REQUEST=None, **kw):
659    """Add a StudentCourseResult."""
660    ob = StudentCourseResult(id, **kw)
661    return CPSBase_adder(container, ob, REQUEST=REQUEST)
662###)
663
664# Backward Compatibility StudyLevel
665
666from Products.WAeUP_SRP.Academics import StudyLevel
667
668from Products.WAeUP_SRP.Academics import addStudyLevel
669
Note: See TracBrowser for help on using the repository browser.