source: WAeUP_SRP/trunk/Students.py @ 489

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

modified scratch_card_pin widget to include prefix and batch_no
modified schemas and layouts accordingly.

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