source: WAeUP_SRP/trunk/Students.py @ 522

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

student can now loggin, status is displayed

  • Property svn:keywords set to Id
File size: 28.7 KB
Line 
1#-*- mode: python; mode: fold -*-
2# $Id: Students.py 522 2006-09-15 08:36:57Z 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                                  'jamb_reg_no': 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        return self.students.academics_contents()
196    ###)
197
198    security.declareProtected(ModifyPortalContent,"loadFullTimeStudentsResultsFromCSV") ###(
199    def loadFullTimeStudentsResultsFromCSV(self):
200        """load Fulltime Studentdata from CSV values"""
201        #return
202        import transaction
203        tr_count = 0
204        name = 'short_full_time_results_2004_2005'
205        no_import = False
206        if not no_import:
207            no_import = open("%s/import/%s_not_imported.csv" % (i_home,name),"w")
208            no_import.write('"Matnumber","CosCode","Ansbook","CosStuatus","Session","Mat_Cos","Score","CarryLevel","Grade","Weight","Semster","Verdict","Level","id","GPA"\n')
209        logger = logging.getLogger('%s_import' % name)
210        logger.info('Start loading from %s.csv' % name)
211        students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
212        try:
213            results = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
214        except:
215            logger.error('Error reading %s.csv' % name)
216            return
217        l = self.portal_catalog({'meta_type': "Course"})
218        courses = {}
219        for c in l:
220            courses[c.id] = c.getObject()
221        for result in results:
222            sid = result.get('Matnumber')
223            res = self.portal_catalog({'meta_type': "StudentClearance",
224                                     'matric_no': sid })
225            if not res:
226                em = 'Student with ID %(Matnumber)s not found\n' % result
227                logger.info(em)
228                no_import.write(em)
229                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)
230                continue
231            sf = res[0].getObject().aq_parent
232            result['StudentId'] = sf.getId()
233            course = result.get('CosCode')
234            if course not in courses.keys():
235                em = 'Course with ID %(CosCode)s not found\n' % result
236                logger.info(em)
237                no_import.write(em)
238                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)
239                continue
240            level = result.get('Level')
241            try:
242                int(level)
243            except:
244                em = 'Result for result with ID %(Matnumber)s Course %(CosCode)s Level is empty\n' % result
245                logger.info(em)
246                no_import.write(em)
247                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)
248                continue
249            sc = getattr(sf,'study_course')
250            l = getattr(sc,level,None)
251            if l is None:
252                #self.log('Creating Department %(DeptCode)s = %(Description)s' % dep)
253                logger.info('Creating Level %(Level)s for %(StudentId)s %(Matnumber)s' % result)
254                sc.invokeFactory('StudentStudyLevel', level)
255                l = getattr(sc, level)
256                l.invokeFactory('StudentSemester','first')
257                l.invokeFactory('StudentSemester','second')
258                first_s = getattr(l,'first')
259                first_s.getContent().edit(mapping={'Title': 'First Semester'})
260                second_s = getattr(l,'second')
261                second_s.getContent().edit(mapping={'Title': 'Second Semester'})
262            snr = result.get('Semster')
263            semester = getattr(l,'first')
264            if snr == "2":
265                semester = getattr(l,'second')
266            logger.info('Creating StudentCourseResult %(CosCode)s in Level %(Level)s for %(StudentId)s %(Matnumber)s' % result)
267            semester.invokeFactory('StudentCourseResult',course)
268            ct = getattr(semester,course)
269            d = {}
270            dlev = {}
271            d['ansbook'] = result.get('Ansbook')
272            d['status'] = result.get('CosStuatus')
273            d['score'] = result.get('Score')
274            dlev['session'] = result.get('Session')
275            dlev['carry_level'] = result.get('CarryLevel')
276            d['grade'] = result.get('Grade')
277            #d['weight'] = result.get('Weight')
278            dlev['verdict'] = result.get('Verdict')
279            #d['import_id'] = result.get('id')
280            #gpa = result.get('GPA').replace(',','.')
281            #d['gpa'] = float(gpa)
282            ct.getContent().edit(mapping = d)
283            l.getContent().edit(mapping = dlev)
284            if tr_count > MAX_TRANS:
285                transaction.commit()
286                tr_count = 0
287            tr_count += 1
288        return self.students.academics_contents()
289
290###)
291
292    security.declareProtected(ModifyPortalContent,"loadJAMBFromCSV")###(
293    def loadJAMBFromCSV(self):
294        """load JAMB data from CSV values"""
295        #return
296        students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
297        import transaction
298        tr_count = 0
299        name = 'SampleJAMBDataII_short'
300        wftool = self.portal_workflow
301        no_import = False
302        if not no_import:
303            no_import = open("%s/import/%s_not_imported.csv" % (i_home,name),"w")
304            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')
305        logger = logging.getLogger('%s_import' % name)
306        logger.info('Start loading from %s.csv' % name)
307        try:
308            result = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
309        except:
310            logger.error('Error reading %s.csv' % name)
311            return
312        for jamb in result:
313            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)
314            jamb_reg_no = jamb.get('REG-NO')
315            res = self.portal_catalog({'meta_type': "StudentApplication",
316                                     'jamb_reg_no': jamb_reg_no })
317            if res:
318                em = 'Student with REG-NO %(REG-NO)s already exists\n' % jamb
319                logger.info(em)
320                no_import.write(em)
321                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)
322                continue
323            jamb_name = jamb.get("NAME")
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 StudyLevel(CPSDocument): ###(
509    """
510    WAeUP StudyLevel containing the courses and students
511    """
512    meta_type = 'StudyLevel'
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
522InitializeClass(StudyLevel)
523
524def addStudyLevel(container, id, REQUEST=None, **kw):
525    """Add a StudyLevel."""
526    ob = StudyLevel(id, **kw)
527    return CPSBase_adder(container, ob, REQUEST=REQUEST)
528
529###)
530
531class StudentStudyLevel(CPSDocument): ###(
532    """
533    WAeUP Student container for the various student data
534    """
535    meta_type = 'StudentStudyLevel'
536    portal_type = meta_type
537    security = ClassSecurityInfo()
538
539    security.declareProtected(View,"Title")
540    def Title(self):
541        """compose title"""
542        return "Level %s" % self.aq_parent.getId()
543
544    security.declareProtected(View,"gpa")
545    def gpa(self):
546        """calculate the gpa"""
547        sum = 0
548        course_count = 0
549        for semester in ('first','second'):
550            sf=getattr(self,semester)
551            for sc in sf.objectValues():
552                result = sc.getContent()
553                res = self.portal_catalog({'meta_type': 'Course',
554                                              'id': sc.aq_parent.id})
555                if len(res) != 1:
556                    continue
557                course = res[0].getObject().getContent()
558                sum += course.credits * ['F','E','D','C','B','A'].index(result.grade)
559                course_count += 1
560        if course_count:
561            return sum/course_count
562        return 0.0
563
564InitializeClass(StudentStudyLevel)
565
566def addStudentStudyLevel(container, id, REQUEST=None, **kw):
567    """Add a Students personal data."""
568    ob = StudentStudyLevel(id, **kw)
569    return CPSBase_adder(container, ob, REQUEST=REQUEST)
570
571###)
572
573class StudentStudyCourse(CPSDocument): ###(
574    """
575    WAeUP Student container for the various student data
576    """
577    meta_type = 'StudentStudyCourse'
578    portal_type = meta_type
579    security = ClassSecurityInfo()
580
581    security.declareProtected(View,"Title")
582    def Title(self):
583        """compose title"""
584        content = self.getContent()
585        return "Study Course"
586
587
588InitializeClass(StudentStudyCourse)
589
590def addStudentStudyCourse(container, id, REQUEST=None, **kw):
591    """Add a Students personal data."""
592    ob = StudentStudyCourse(id, **kw)
593    return CPSBase_adder(container, ob, REQUEST=REQUEST)
594
595###)
596
597class StudentApplication(CPSDocument): ###(
598    """
599    WAeUP Student container for the various student data
600    """
601    meta_type = 'StudentApplication'
602    portal_type = meta_type
603    security = ClassSecurityInfo()
604
605    security.declareProtected(View,"Title")
606    def Title(self):
607        """compose title"""
608        return "Application Data"
609
610
611InitializeClass(StudentApplication)
612
613def addStudentApplication(container, id, REQUEST=None, **kw):
614    """Add a Students eligibility data."""
615    ob = StudentApplication(id, **kw)
616    return CPSBase_adder(container, ob, REQUEST=REQUEST)
617
618###)
619
620class StudentSemester(CPSDocument): ###(
621    """
622    WAeUP StudentSemester containing the courses and students
623    """
624    meta_type = 'StudentSemester'
625    portal_type = meta_type
626    security = ClassSecurityInfo()
627
628InitializeClass(StudentSemester)
629
630def addStudentSemester(container, id, REQUEST=None, **kw):
631    """Add a StudentSemester."""
632    ob = StudentSemester(id, **kw)
633    return CPSBase_adder(container, ob, REQUEST=REQUEST)
634
635###)
636
637class Semester(CPSDocument): ###(
638    """
639    WAeUP Semester containing the courses and students
640    """
641    meta_type = 'Semester'
642    portal_type = meta_type
643    security = ClassSecurityInfo()
644
645InitializeClass(Semester)
646
647def addSemester(container, id, REQUEST=None, **kw):
648    """Add a Semester."""
649    ob = Semester(id, **kw)
650    return CPSBase_adder(container, ob, REQUEST=REQUEST)
651
652###)
653
654class StudentCourseResult(CPSDocument): ###(
655    """
656    WAeUP StudentCourseResult
657    """
658    meta_type = 'StudentCourseResult'
659    portal_type = meta_type
660    security = ClassSecurityInfo()
661
662    def getCourseEntry(self,cid):
663        res = self.portal_catalog({'meta_type': "StudentCourse",
664                                           'id': cid})
665        if res:
666            return res[-1]
667        else:
668            return None
669
670    security.declareProtected(View,"Title")
671    def Title(self):
672        """compose title"""
673        cid = self.getId()
674        ce = self.getCourseEntry(cid)
675        if ce:
676            return "%s" % ce.Title
677        return "No course with id %s" % cid
678
679InitializeClass(StudentCourseResult)
680
681def addStudentCourseResult(container, id, REQUEST=None, **kw):
682    """Add a StudentCourseResult."""
683    ob = StudentCourseResult(id, **kw)
684    return CPSBase_adder(container, ob, REQUEST=REQUEST)
685###)
686
Note: See TracBrowser for help on using the repository browser.