source: WAeUP_SRP/trunk/Students.py @ 466

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

added missing files.

A trunk/profiles/default/layouts/student_check_pin.xml
M trunk/profiles/default/types.xml
M trunk/profiles/default/actionicons.xml
M trunk/profiles/default/workflows.xml
A trunk/profiles/default/types/StudentSemester.xml
D trunk/profiles/default/types/CourseTicket.xml
M trunk/profiles/default/types/StudentsFolder.xml
A trunk/profiles/default/types/StudentCourseResult.xml
M trunk/init.py
M trunk/skins/waeup_academics/academics_content_lib_info_detail_tab.pt
A trunk/skins/waeup_custom/cpsskins_lib.pt
M trunk/skins/waeup_custom/getContentInfo.py
M trunk/Students.py

  • Property svn:keywords set to Id
File size: 27.0 KB
Line 
1#-*- mode: python; mode: fold -*-
2# $Id: Students.py 464 2006-09-01 17:16:18Z 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('StudentAdmission','admission')
105                da = {'Title': 'Admission 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.admission.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': "StudentAdmission",
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('StudentAdmission','admission')
317            da = {'Title': 'Admission 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            d["sex"] = jamb.get("SEX")
329            da["jamb_state"] = jamb.get("STATE")
330            da["jamb_lga"] = jamb.get("LGA")
331            da["jamb_score"] = jamb.get("AGGREGATE")
332            da["jamb_first_cos"] = jamb.get("COURSE1")
333            da["jamb_second_cos"] = jamb.get("COURSE2")
334            da["jamb_first_uni"] = jamb.get("UNIV1")
335            da["jamb_second_uni"] = jamb.get("UNIV2")
336##            s.personal.getContent().edit(mapping=d)
337            s.admission.getContent().edit(mapping=da)
338        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
339    ###)
340
341
342
343    security.declareProtected(View,"Title")
344    def Title(self):
345        """compose title"""
346        return "Student Section"
347
348InitializeClass(StudentsFolder)
349
350def addStudentsFolder(container, id, REQUEST=None, **kw):
351    """Add a Student."""
352    ob = StudentsFolder(id, **kw)
353    return CPSBase_adder(container, ob, REQUEST=REQUEST)
354###)
355
356class Student(CPSDocument): ###(
357    """
358    WAeUP Student container for the various student data
359    """
360    meta_type = 'Student'
361    portal_type = meta_type
362    security = ClassSecurityInfo()
363
364    security.declareProtected(View,"Title")
365    def Title(self):
366        """compose title"""
367        reg_nr = self.getId()[1:]
368        data = getattr(self,'personal',None)
369        if data:
370            content = data.getContent()
371            return "%s %s" % (content.firstname,content.lastname)
372        data = getattr(self,'admission',None)
373        if data:
374            content = data.getContent()
375            return "%s" % (content.jamb_lastname)
376        return self.title
377
378InitializeClass(Student)
379
380def addStudent(container, id, REQUEST=None, **kw):
381    """Add a Student."""
382    ob = Student(id, **kw)
383    return CPSBase_adder(container, ob, REQUEST=REQUEST)
384
385###)
386
387class StudentPersonal(CPSDocument): ###(
388    """
389    WAeUP Student container for the various student data
390    """
391    meta_type = 'StudentPersonal'
392    portal_type = meta_type
393    security = ClassSecurityInfo()
394
395    security.declareProtected(View,"Title")
396    def Title(self):
397        """compose title"""
398        content = self.getContent()
399        #return "Personal Data for %s %s" % (content.firstname,content.lastname)
400        return "Personal Data"
401
402
403InitializeClass(StudentPersonal)
404
405def addStudentPersonal(container, id, REQUEST=None, **kw):
406    """Add a Students personal data."""
407    ob = StudentPersonal(id, **kw)
408    return CPSBase_adder(container, ob, REQUEST=REQUEST)
409
410###)
411
412class StudentClearance(CPSDocument): ###(
413    """
414    WAeUP Student container for the various student data
415    """
416    meta_type = 'StudentClearance'
417    portal_type = meta_type
418    security = ClassSecurityInfo()
419
420    security.declareProtected(View,"Title")
421    def Title(self):
422        """compose title"""
423        content = self.getContent()
424        #return "Clearance Data for %s %s" % (content.firstname,content.lastname)
425        return "Clearance Data"
426
427
428InitializeClass(StudentClearance)
429
430def addStudentClearance(container, id, REQUEST=None, **kw):
431    """Add a Students personal data."""
432    ob = StudentClearance(id, **kw)
433    return CPSBase_adder(container, ob, REQUEST=REQUEST)
434
435###)
436
437class StudyLevel(CPSDocument): ###(
438    """
439    WAeUP StudyLevel containing the courses and students
440    """
441    meta_type = 'StudyLevel'
442    portal_type = meta_type
443    security = ClassSecurityInfo()
444
445    security.declareProtected(View,"Title")
446    def Title(self):
447        """compose title"""
448        return "Level %s" % self.aq_parent.getId()
449   
450
451InitializeClass(StudyLevel)
452
453def addStudyLevel(container, id, REQUEST=None, **kw):
454    """Add a StudyLevel."""
455    ob = StudyLevel(id, **kw)
456    return CPSBase_adder(container, ob, REQUEST=REQUEST)
457
458###)
459
460class StudentStudyLevel(CPSDocument): ###(
461    """
462    WAeUP Student container for the various student data
463    """
464    meta_type = 'StudentStudyLevel'
465    portal_type = meta_type
466    security = ClassSecurityInfo()
467
468    security.declareProtected(View,"Title")
469    def Title(self):
470        """compose title"""
471        return "Level %s" % self.aq_parent.getId()
472
473    security.declareProtected(View,"gpa")
474    def gpa(self):
475        """calculate the gpa"""
476        sum = 0
477        course_count = 0
478        for semester in ('first','second'):
479            sf=getattr(self,semester)
480            for sc in sf.objectValues():
481                result = sc.getContent()
482                res = self.portal_catalog({'meta_type': 'Course',
483                                              'id': sc.aq_parent.id})
484                if len(res) != 1:
485                    continue
486                course = res[0].getObject().getContent()
487                sum += course.credits * ['F','E','D','C','B','A'].index(result.grade)
488                course_count += 1
489        if course_count:
490            return sum/course_count
491        return 0.0
492
493InitializeClass(StudentStudyLevel)
494
495def addStudentStudyLevel(container, id, REQUEST=None, **kw):
496    """Add a Students personal data."""
497    ob = StudentStudyLevel(id, **kw)
498    return CPSBase_adder(container, ob, REQUEST=REQUEST)
499
500###)
501
502class StudentStudyCourse(CPSDocument): ###(
503    """
504    WAeUP Student container for the various student data
505    """
506    meta_type = 'StudentStudyCourse'
507    portal_type = meta_type
508    security = ClassSecurityInfo()
509
510    security.declareProtected(View,"Title")
511    def Title(self):
512        """compose title"""
513        content = self.getContent()
514        return "Study Course"
515
516
517InitializeClass(StudentStudyCourse)
518
519def addStudentStudyCourse(container, id, REQUEST=None, **kw):
520    """Add a Students personal data."""
521    ob = StudentStudyCourse(id, **kw)
522    return CPSBase_adder(container, ob, REQUEST=REQUEST)
523
524###)
525
526class StudentAdmission(CPSDocument): ###(
527    """
528    WAeUP Student container for the various student data
529    """
530    meta_type = 'StudentAdmission'
531    portal_type = meta_type
532    security = ClassSecurityInfo()
533
534    security.declareProtected(View,"Title")
535    def Title(self):
536        """compose title"""
537        return "Admission Data"
538
539
540InitializeClass(StudentAdmission)
541
542def addStudentAdmission(container, id, REQUEST=None, **kw):
543    """Add a Students eligibility data."""
544    ob = StudentAdmission(id, **kw)
545    return CPSBase_adder(container, ob, REQUEST=REQUEST)
546
547###)
548
549class StudentSemester(CPSDocument): ###(
550    """
551    WAeUP StudentSemester containing the courses and students
552    """
553    meta_type = 'StudentSemester'
554    portal_type = meta_type
555    security = ClassSecurityInfo()
556
557InitializeClass(StudentSemester)
558
559def addStudentSemester(container, id, REQUEST=None, **kw):
560    """Add a StudentSemester."""
561    ob = StudentSemester(id, **kw)
562    return CPSBase_adder(container, ob, REQUEST=REQUEST)
563
564###)
565
566class Semester(CPSDocument): ###(
567    """
568    WAeUP Semester containing the courses and students
569    """
570    meta_type = 'Semester'
571    portal_type = meta_type
572    security = ClassSecurityInfo()
573
574InitializeClass(Semester)
575
576def addSemester(container, id, REQUEST=None, **kw):
577    """Add a Semester."""
578    ob = Semester(id, **kw)
579    return CPSBase_adder(container, ob, REQUEST=REQUEST)
580
581###)
582
583class StudentCourseResult(CPSDocument): ###(
584    """
585    WAeUP StudentCourseResult
586    """
587    meta_type = 'StudentCourseResult'
588    portal_type = meta_type
589    security = ClassSecurityInfo()
590   
591    def getCourseEntry(self,cid):
592        res = self.portal_catalog({'meta_type': "StudentCourse",
593                                           'id': cid})
594        if res:
595            return res[-1]
596        else:
597            return None
598
599    security.declareProtected(View,"Title")
600    def Title(self):
601        """compose title"""
602        cid = self.getId()
603        ce = self.getCourseEntry(cid)
604        if ce:
605            return "%s" % ce.Title
606        return "No course with id %s" % cid
607
608InitializeClass(StudentCourseResult)
609
610def addStudentCourseResult(container, id, REQUEST=None, **kw):
611    """Add a StudentCourseResult."""
612    ob = StudentCourseResult(id, **kw)
613    return CPSBase_adder(container, ob, REQUEST=REQUEST)
614###)
615
616class ScratchCardBatchesFolder(CPSDocument): ###(
617    """
618    WAeUP Student container for the various student data
619    """
620    meta_type = 'ScratchCardBatchesFolder'
621    portal_type = meta_type
622    security = ClassSecurityInfo()
623
624    security.declareProtected(View,"Title")
625    def Title(self):
626        """compose title"""
627        return "Pin Batches"
628
629
630InitializeClass(ScratchCardBatchesFolder)
631
632def addScratchCardBatchesFolder(container, id, REQUEST=None, **kw):
633    """Add a Students personal data."""
634    ob = ScratchCardBatchesFolder(id, **kw)
635    return CPSBase_adder(container, ob, REQUEST=REQUEST)
636
637###)
638
639from Products.WAeUP_SRP.WAeUPTables import PinTable
640
641class ScratchCardBatch(CPSDocument): ###(
642    """
643    WAeUP Student container for the various student data
644    """
645    meta_type = 'ScratchCardBatch'
646    portal_type = meta_type
647    security = ClassSecurityInfo()
648
649    security.declareProtected(View,"Title")
650    def Title(self):
651        """compose title"""
652        doc = self.getContent()
653        return "Pin Batch %s BatchNo %d" % (doc.prefix, doc.batch_no)
654
655
656InitializeClass(ScratchCardBatch)
657
658def addScratchCardBatch(container, id, REQUEST=None, **kw):
659    """Add a Students personal data."""
660    ob = ScratchCardBatch(id, **kw)
661    return CPSBase_adder(container, ob, REQUEST=REQUEST)
662
663###)
Note: See TracBrowser for help on using the repository browser.