source: WAeUP_SRP/trunk/Students.py @ 645

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

added

  • Property svn:keywords set to Id
File size: 29.1 KB
Line 
1#-*- mode: python; mode: fold -*-
2# $Id: Students.py 639 2006-10-10 13:48:43Z 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 StudentAccommodation(CPSDocument): ###(
459    """
460    WAeUP Student container for the various student data
461    """
462    meta_type = 'StudentAccommodation'
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 "Accommodation Data for %s %s" % (content.firstname,content.lastname)
471        return "Accommodation Data for Session %s" % content.session
472
473
474InitializeClass(StudentAccommodation)
475
476def addStudentAccommodation(container, id, REQUEST=None, **kw):
477    """Add a Students personal data."""
478    ob = StudentAccommodation(id, **kw)
479    return CPSBase_adder(container, ob, REQUEST=REQUEST)
480
481###)
482
483class StudentPersonal(CPSDocument): ###(
484    """
485    WAeUP Student container for the various student data
486    """
487    meta_type = 'StudentPersonal'
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 "Personal Data for %s %s" % (content.firstname,content.lastname)
496        return "Personal Data"
497
498
499InitializeClass(StudentPersonal)
500
501def addStudentPersonal(container, id, REQUEST=None, **kw):
502    """Add a Students personal data."""
503    ob = StudentPersonal(id, **kw)
504    return CPSBase_adder(container, ob, REQUEST=REQUEST)
505
506###)
507
508class StudentClearance(CPSDocument): ###(
509    """
510    WAeUP Student container for the various student data
511    """
512    meta_type = 'StudentClearance'
513    portal_type = meta_type
514    security = ClassSecurityInfo()
515
516    security.declareProtected(View,"Title")
517    def Title(self):
518        """compose title"""
519        content = self.getContent()
520        #return "Clearance Data for %s %s" % (content.firstname,content.lastname)
521        return "Clearance Data"
522
523
524InitializeClass(StudentClearance)
525
526def addStudentClearance(container, id, REQUEST=None, **kw):
527    """Add a Students personal data."""
528    ob = StudentClearance(id, **kw)
529    return CPSBase_adder(container, ob, REQUEST=REQUEST)
530
531###)
532
533class StudentStudyLevel(CPSDocument): ###(
534    """
535    WAeUP Student container for the various student data
536    """
537    meta_type = 'StudentStudyLevel'
538    portal_type = meta_type
539    security = ClassSecurityInfo()
540
541    security.declareProtected(View,"Title")
542    def Title(self):
543        """compose title"""
544        return "Level %s" % self.aq_parent.getId()
545
546    security.declareProtected(View,"gpa")
547    def gpa(self):
548        """calculate the gpa"""
549        sum = 0
550        course_count = 0
551        for semester in ('first','second'):
552            sf=getattr(self,semester)
553            for sc in sf.objectValues():
554                result = sc.getContent()
555                res = self.portal_catalog({'meta_type': 'Course',
556                                              'id': sc.aq_parent.id})
557                if len(res) != 1:
558                    continue
559                course = res[0].getObject().getContent()
560                sum += course.credits * ['F','E','D','C','B','A'].index(result.grade)
561                course_count += 1
562        if course_count:
563            return sum/course_count
564        return 0.0
565
566InitializeClass(StudentStudyLevel)
567
568def addStudentStudyLevel(container, id, REQUEST=None, **kw):
569    """Add a Students personal data."""
570    ob = StudentStudyLevel(id, **kw)
571    return CPSBase_adder(container, ob, REQUEST=REQUEST)
572
573###)
574
575class StudentStudyCourse(CPSDocument): ###(
576    """
577    WAeUP Student container for the various student data
578    """
579    meta_type = 'StudentStudyCourse'
580    portal_type = meta_type
581    security = ClassSecurityInfo()
582
583    security.declareProtected(View,"Title")
584    def Title(self):
585        """compose title"""
586        content = self.getContent()
587        return "Study Course"
588
589
590InitializeClass(StudentStudyCourse)
591
592def addStudentStudyCourse(container, id, REQUEST=None, **kw):
593    """Add a Students personal data."""
594    ob = StudentStudyCourse(id, **kw)
595    return CPSBase_adder(container, ob, REQUEST=REQUEST)
596
597###)
598
599class StudentApplication(CPSDocument): ###(
600    """
601    WAeUP Student container for the various student data
602    """
603    meta_type = 'StudentApplication'
604    portal_type = meta_type
605    security = ClassSecurityInfo()
606
607    security.declareProtected(View,"Title")
608    def Title(self):
609        """compose title"""
610        return "Application Data"
611
612
613InitializeClass(StudentApplication)
614
615def addStudentApplication(container, id, REQUEST=None, **kw):
616    """Add a Students eligibility data."""
617    ob = StudentApplication(id, **kw)
618    return CPSBase_adder(container, ob, REQUEST=REQUEST)
619
620###)
621
622##class StudentSemester(CPSDocument): ###(
623##    """
624##    WAeUP StudentSemester containing the courses and students
625##    """
626##    meta_type = 'StudentSemester'
627##    portal_type = meta_type
628##    security = ClassSecurityInfo()
629##
630##InitializeClass(StudentSemester)
631##
632##def addStudentSemester(container, id, REQUEST=None, **kw):
633##    """Add a StudentSemester."""
634##    ob = StudentSemester(id, **kw)
635##    return CPSBase_adder(container, ob, REQUEST=REQUEST)
636##
637#####)
638
639class Semester(CPSDocument): ###(
640    """
641    WAeUP Semester containing the courses and students
642    """
643    meta_type = 'Semester'
644    portal_type = meta_type
645    security = ClassSecurityInfo()
646
647InitializeClass(Semester)
648
649def addSemester(container, id, REQUEST=None, **kw):
650    """Add a Semester."""
651    ob = Semester(id, **kw)
652    return CPSBase_adder(container, ob, REQUEST=REQUEST)
653
654###)
655
656class StudentCourseResult(CPSDocument): ###(
657    """
658    WAeUP StudentCourseResult
659    """
660    meta_type = 'StudentCourseResult'
661    portal_type = meta_type
662    security = ClassSecurityInfo()
663
664    def getCourseEntry(self,cid):
665        res = self.portal_catalog({'meta_type': "StudentCourse",
666                                           'id': cid})
667        if res:
668            return res[-1]
669        else:
670            return None
671
672    security.declareProtected(View,"Title")
673    def Title(self):
674        """compose title"""
675        cid = self.getId()
676        ce = self.getCourseEntry(cid)
677        if ce:
678            return "%s" % ce.Title
679        return "No course with id %s" % cid
680
681InitializeClass(StudentCourseResult)
682
683def addStudentCourseResult(container, id, REQUEST=None, **kw):
684    """Add a StudentCourseResult."""
685    ob = StudentCourseResult(id, **kw)
686    return CPSBase_adder(container, ob, REQUEST=REQUEST)
687###)
688
689# Backward Compatibility StudyLevel
690
691from Products.WAeUP_SRP.Academics import StudyLevel
692
693from Products.WAeUP_SRP.Academics import addStudyLevel
694
Note: See TracBrowser for help on using the repository browser.