source: WAeUP_SRP/trunk/Students.py @ 10059

Last change on this file since 10059 was 5064, checked in by Henrik Bettermann, 15 years ago

export names

  • Property svn:keywords set to Id
File size: 35.7 KB
RevLine 
[57]1#-*- mode: python; mode: fold -*-
[200]2# $Id: Students.py 5064 2010-03-16 15:58:58Z henrik $
[708]3from string import Template
[45]4from Globals import InitializeClass
5from AccessControl import ClassSecurityInfo
[164]6from AccessControl.SecurityManagement import newSecurityManager
[429]7from zExceptions import BadRequest
[502]8from Products.ZCatalog.ZCatalog import ZCatalog
[47]9from Products.CMFCore.utils import UniqueObject, getToolByName
[45]10from Products.CMFCore.permissions import View
11from Products.CMFCore.permissions import ModifyPortalContent
[154]12from Products.CPSCore.CPSBase import CPSBase_adder, CPSBaseFolder
13#from Products.CPSCore.CPSBase import CPSBaseDocument as BaseDocument
14from Products.CPSDocument.CPSDocument import CPSDocument
15from Products.CPSCore.CPSBase import CPSBaseBTreeFolder as BaseBTreeFolder
[164]16from Products.CPSCore.CPSMembershipTool import CPSUnrestrictedUser
[361]17from Products.WAeUP_SRP.Academics import makeCertificateCode
[2125]18
[1649]19from Products.AdvancedQuery import Eq, Between, Le,In
[1820]20import DateTime
[362]21import logging
[971]22import csv,re,os
[362]23import Globals
24p_home = Globals.package_home(globals())
25i_home = Globals.INSTANCE_HOME
[981]26MAX_TRANS = 1000
[1599]27from urllib import urlencode
28
[966]29import DateTime
[1801]30#import PIL.Image
[971]31from StringIO import StringIO
[154]32
[958]33def makeCertificateCode(code): ###(
34    code = code.replace('.','')
35    code = code.replace('(','')
36    code = code.replace(')','')
37    code = code.replace('/','')
38    code = code.replace(' ','')
39    code = code.replace('_','')
40    return code
41
42###)
43
[1939]44def response_write(response,s): ###(
[1599]45    response.setHeader('Content-type','text/html; charset=ISO-8859-15')
46    while s.find('<') > -1:
47        s = s.replace('<','&lt;')
48    while s.find('>') > -1:
49        #from pdb import set_trace;set_trace()
50        s = s.replace('>','&gt;')
51    response.write("%s<br>\n" % s)
52
[1939]53###)
54
[958]55def getInt(s): ###(
[723]56    try:
57        return int(s)
58    except:
59        return 0
[422]60
[725]61def getFloat(s):
62    try:
63        return float(s)
64    except:
65        return 0.0
66
[958]67###)
68
[714]69def getStudentByRegNo(self,reg_no): ###(
[502]70    """search student by JAMB Reg No and return StudentFolder"""
[1969]71    res = self.students_catalog(jamb_reg_no = reg_no.upper())
[1902]72    if len(res) == 1:
73        return getattr(self.portal_url.getPortalObject().campus.students,res[0].id)
74    else:
[502]75        return None
[1902]76    # don't search in portal_catalog
77    # search = ZCatalog.searchResults(self.portal_catalog_real,{'meta_type': 'StudentApplication',
78    #                               'SearchableText': reg_no,
79    #                               })
80    # if len(search) < 1:
81    #     return None
82    # return search[0].getObject().aq_parent
[502]83
[714]84###)
85
[1939]86def checkJambNo(jnr): ###(
[1111]87    try:
88        if len(jnr) != 10:
89            return False
90    except:
91        return False
92    try:
93        int(jnr[:8])
94        return True
95    except:
96        return False
[1119]97
[1939]98###)
99
[2125]100def formatLGA(lga,voc=None):
101    if voc is not None:
102        if voc.has_key(lga):
103            state,lga = voc[lga].split(' / ')
104        elif lga.find(' / ') > -1:
105            state,lga = lga.split(' / ')
106        else:
107            state,lga = "",lga
108    return state.upper(),lga.upper()
[1939]109
[361]110class StudentsFolder(CPSDocument): ###(
111    """
112    WAeUP container for the various WAeUP containers data
113    """
[362]114    meta_type = 'StudentsFolder'
[361]115    portal_type = meta_type
116    security = ClassSecurityInfo()
[154]117
[1799]118
[1820]119    security.declareProtected(ModifyPortalContent,"transferStudents")###(
120    def transferStudents(self,filename):
121        """
122        load Interfaculty transferStudents Studentdata from CSV values.
123        """
124        import transaction
125        import random
126        current = DateTime.DateTime().strftime("%d-%m-%y_%H_%M_%S")
127        pm = self.portal_membership
128        member = pm.getAuthenticatedMember()
129        logger = logging.getLogger('Students.StudentsFolder.transferStudents')
130        #students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
131        students_folder = self.portal_url.getPortalObject().campus.students
132        csv_fields = ('old_matric_no',
133                      'matric_no',
134                      'study_course',
135                      'current_mode',
136                      'current_level',
137                      )
138        tr_count = 0
139        total = 0
140        total_imported = 0
141        total_not_imported = 0
142        imported = []
143        not_imported = []
144        certs = {}
145        try:
146            results = csv.DictReader(open("%s/import/%s.csv" % (i_home,filename),"rb"))
147        except:
148            logger.error('Error reading %s.csv' % filename)
149            return
150        start = True
151        for result in results:
152            total += 1
153            if start:
154                start = False
155                logger.info('%s starts import from %s.csv' % (member,filename))
156                import_keys = [k for k in result.keys() if not k.startswith('ignore')]
157                diff2schema = set(import_keys).difference(set(csv_fields))
158                if diff2schema:
159                    em = "not ignorable key(s) %s found in heading" % diff2schema
160                    return em
161                s = ','.join(['"%s"' % fn for fn in import_keys])
162                open("%s/import/%s_not_imported%s.csv" % (i_home,filename,current),"a").write(s + ',"Error"'+ '\n')
163                s = '"id",' + s
164                open("%s/import/%s_imported%s.csv" % (i_home,filename,current),"a").write(s + '\n')
165                format = ','.join(['"%%(%s)s"' % fn for fn in import_keys])
166                format_error = format + ',"%(Error)s"'
167                format = '"%(id)s",'+ format
168            old_matric_no = result.get('old_matric_no')
169            res = self.students_catalog(matric_no = old_matric_no)
170            result['id'] = "None"
171            if not res:
[1834]172                em = 'Student with matric_no %s not found' % old_matric_no
[1820]173                logger.info(em)
[1834]174                result['Error'] = "Student does not exist"
[1820]175                not_imported.append(format_error % result)
176                total_not_imported += 1
177                continue
[3164]178            student_record = res[0]
179            if getattr(student_record,'review_state','') in ('courses_registered','courses_validated'):
[3146]180                em = 'already registered course list'
[3164]181                logger.info('%s (%s) %s' % (student_record.id, old_matric_no, em))
[3146]182                result['Error'] = em
183                not_imported.append( format_error % result)
184                total_not_imported += 1
[3164]185                continue
186            student_object = getattr(students_folder,student_record.id)
187            result['id'] = student_record.id
[1820]188            cert_id = makeCertificateCode(result.get('study_course'))
189            if cert_id not in certs.keys():
190                res = self.portal_catalog(meta_type = "Certificate",id = cert_id)
191                if not res:
[1834]192                    em = 'No certificate with ID %s \n' % cert_id
[1820]193                    logger.info(em)
194                    result['Error'] = "No Certificate %s" % cert_id
195                    not_imported.append( format_error % result)
196                    total_not_imported += 1
197                    continue
198                cert = res[0]
199                cert_path = cert.getPath().split('/')
200                certificate = certs[cert_id] = {'faculty': cert_path[-4],
201                                     'department': cert_path[-3]}
202            cert_doc = certs[cert_id]
203            clearance = getattr(student_object,'clearance',None)
204            if clearance is None:
205                em = 'Student has no clearance object'
[3164]206                logger.info('%s (%s) %s' % (student_record.id, old_matric_no, em))
[1820]207                result['Error'] = em
208                not_imported.append( format_error % result)
209                total_not_imported += 1
210                continue
211            clearance_doc = clearance.getContent()
212            study_course = student_object.study_course
213            study_course_doc = study_course.getContent()
214            old_study_course = study_course_doc.study_course
215            old_current_level = study_course_doc.current_level
216            current_level = result.get('current_level',None)
[1834]217            new_study_course = result.get('study_course',None)
[1820]218            try:
219                icl = int(current_level)
220            except:
221                em = 'Invalid new level %s' % current_level
222                logger.info(em)
223                result['Error'] = em
224                not_imported.append( format_error % result)
225                total_not_imported += 1
226                continue
[2662]227            try:
[2912]228                icl = int(old_current_level)
[2662]229                if icl == int(old_current_level) and old_study_course == new_study_course:
230                    em = 'Already transferred'
[3164]231                    logger.info('%s (%s) %s' % (student_record.id, old_matric_no, em))
[2662]232                    result['Error'] = em
233                    not_imported.append( format_error % result)
234                    total_not_imported += 1
235                    continue
236            except:
237                pass
[3146]238
[1820]239            #from pdb import set_trace; set_trace()
240            cd = {}
241            matric_no_history = getattr(clearance_doc,'matric_no_history',[])
242            if not matric_no_history:
243                matric_no_history = []
244            matric_no_history.append(old_matric_no)
245            cd['matric_no_history'] = matric_no_history
246            cd['matric_no'] = result.get('matric_no')
247            clearance_doc.edit(mapping = cd)
248            dsc = {}
249            study_course_history = getattr(study_course_doc,'study_course_history',[])
250            if not study_course_history:
251                study_course_history = []
252            study_course_history.append(old_study_course)
253            dsc['study_course_history'] = study_course_history
[1834]254            dsc['study_course'] = new_study_course
[1820]255            dsc['current_level'] = current_level
256            dsc['current_mode'] = result.get('current_mode')
257            study_course_doc.edit(mapping=dsc)
258            imported.append( format % result)
259            tr_count += 1
260            total_imported += 1
261            if tr_count > 1000:
262                if len(not_imported) > 0:
263                    open("%s/import/%s_not_imported%s.csv" % (i_home,filename,current),"a").write(
264                             '\n'.join(not_imported) + '\n')
265                    not_imported = []
266                if len(imported) > 0:
267                    open("%s/import/%s_imported%s.csv" % (i_home,filename,current),"a").write(
268                             '\n'.join(imported) + '\n')
269                    imported = []
270                em = '%d transactions committed\n' % (tr_count)
271                transaction.commit()
272                regs = []
273                logger.info(em)
274                tr_count = 0
275        if len(imported) > 0:
276            open("%s/import/%s_imported%s.csv" % (i_home,filename,current),"a").write(
277                                                '\n'.join(imported))
278        if len(not_imported) > 0:
279            open("%s/import/%s_not_imported%s.csv" % (i_home,filename,current),"a").write(
280                                                '\n'.join(not_imported))
281        em = "Imported: %d, not imported: %d of total %d" % (total_imported,total_not_imported,total)
282        logger.info(em)
283        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
284    ###)
285
[3453]286    security.declareProtected(ModifyPortalContent,"exportStudents")###(
287    def exportStudents(self):
288        """export Studentsdata to a file"""
289        member = self.portal_membership.getAuthenticatedMember()
290        logger = logging.getLogger('Students.exportStudents')
291        current = DateTime.DateTime().strftime("%d-%m-%y_%H_%M_%S")
292        students_folder = self.portal_url.getPortalObject().campus.students
293        export_file = "%s/export/students_%s.csv" % (i_home,current)
[1146]294
[3453]295        from Products.AdvancedQuery import Eq, Between, Le,In,MatchRegexp
[3454]296        #aq_students = self.students_catalog.evalAdvancedQuery
[3453]297        toexport = {'students_catalog': ("id",
298                                         "matric_no",
299                                         "jamb_reg_no",
300                                         "name",
301                                         #"review_state",
302                                         #"entry_session",
303                                         #"session",
304                                         #"entry_mode",
305                                         #"mode",
306                                         #"verdict",
307                                         #"sex",
308                                         #"email",
309                                         #"phone",
310                                         #"faculty",
311                                         #"department",
312                                         #"course",
313                                         #"level",
314                                        ),
[5064]315                    'personal': ('firstname',
316                                 'middlename',
317                                 'lastname',
[3453]318                    #             'perm_address',
[5064]319                                 ),
320                    #'clearance': (#'state',  # is not an attribute of clearance but is needed for splitting lga
321                    #              #'lga',
322                    #              'birthday',
323                    #             )
[3453]324                  }
325        res_list = []
326        lines = []
327        fields = []
328        with_lga = False
329        for k in toexport.keys():
330            for f in toexport[k]:
331                if f == 'lga' :
332                    with_lga = True
333                fields.append(f)
334        headline = ','.join(fields).replace('level','current_level')
335        open(export_file,"a").write(headline +'\n')
336        format = '"%(' + ')s","%('.join(fields) + ')s"'
337        #query = In('review_state',('cleared_and_validated',
338        #                        'clearance_requested',
339        #                        'school_fee_paid',
340        #                        'courses_registered',
341        #                        'courses_validated'))
342        #query = In('review_state',('clearance_requested'))
343        #students = aq_students(query)
[3454]344        students = self.students_catalog()
[3453]345        nr2export = len(students)
346        logger.info('%s starts exportStudents, %s student records to export' % (member,nr2export))
347        chunk = 1000
348        total = 0
349        start = DateTime.DateTime().timeTime()
350        start_chunk = DateTime.DateTime().timeTime()
351        for student in students:
352            not_all = False
353            d = self.getFormattedStudentEntry(student)
354            student_obj = getattr(students_folder,student.id)
355            for k in toexport.keys()[1:]:
356                try:
357                    object = getattr(student_obj,k)
358                    object_doc = object.getContent()
359                except:
360                    logger.info('%s %s record not found' % (student.id,k))
361                    not_all = True
362                    continue
363                for f in toexport[k]:
364                    d[f] = getattr(object_doc,f,'')
365            if not_all:
366                continue
367            if with_lga:
368                d['state'],d['lga'] = formatLGA(d['lga'],voc = self.portal_vocabularies.local_gov_areas)
369            lines.append(format % d)
370            total += 1
371            if total and not total % chunk or total == len(students):
372                open(export_file,"a").write('\n'.join(lines) +'\n')
373                anz = len(lines)
374                logger.info("wrote %(anz)d  total written %(total)d" % vars())
375                end_chunk = DateTime.DateTime().timeTime()
376                duration = end_chunk-start_chunk
377                per_record = duration/anz
378                till_now = end_chunk - start
379                avarage_per_record = till_now/total
380                estimated_end = DateTime.DateTime(start + avarage_per_record * nr2export)
381                estimated_end = estimated_end.strftime("%H:%M:%S")
382                logger.info('%(duration)4.1f, %(per_record)4.3f,end %(estimated_end)s' % vars())
383                start_chunk = DateTime.DateTime().timeTime()
384                lines = []
385        end = DateTime.DateTime().timeTime()
386        logger.info('total time %6.2f m' % ((end-start)/60))
387        filename, extension = os.path.splitext(export_file)
388        from subprocess import call
389        msg = "wrote %(total)d records to %(export_file)s" % vars()
390        try:
391            retcode = call('gzip %s' % (export_file),shell=True)
392            if retcode == 0:
393                msg = "wrote %(total)d records to %(export_file)s.gz" % vars()
394        except OSError, e:
395            retcode = -99
396            logger.info("zip failed with %s" % e)
397        logger.info(msg)
398        args = {'portal_status_message': msg}
399        url = self.REQUEST.get('URL2')
400        return self.REQUEST.RESPONSE.redirect(url)
401    ###)
402
[1970]403    security.declareProtected(ModifyPortalContent,"dumpStudentsCatalog")###(
404    def dumpStudentsCatalog(self):
405        """dump all data in students_catalog to a csv"""
406        member = self.portal_membership.getAuthenticatedMember()
407        logger = logging.getLogger('Students.dumpStudentsCatalog')
408        current = DateTime.DateTime().strftime("%d-%m-%y_%H_%M_%S")
409        export_file = "%s/export/students_catalog_%s.csv" % (i_home,current)
410        res_list = []
411        lines = []
412        fields = []
413        for f in self.students_catalog.schema():
414            fields.append(f)
[2083]415        fields.append('state')
[1970]416        headline = ','.join(fields)
[2128]417        #open(export_file,"a").write(headline +'\n')
418        out = open(export_file,"wb")
419        out.write(headline +'\n')
420        out.close()
421        out = open(export_file,"a")
422        csv_writer = csv.DictWriter(out,fields,)
[1970]423        format = '"%(' + ')s","%('.join(fields) + ')s"'
424        students = self.students_catalog()
425        nr2export = len(students)
[2012]426        logger.info('%s starts dumpStudentsCatalog, %s student records to export' % (member,nr2export))
[1970]427        chunk = 2000
428        total = 0
429        start = DateTime.DateTime().timeTime()
430        start_chunk = DateTime.DateTime().timeTime()
431        for student in students:
432            not_all = False
433            d = self.getFormattedStudentEntry(student)
[2125]434            d['state'],d['lga'] = formatLGA(d['lga'],voc = self.portal_vocabularies.local_gov_areas)
[2128]435            #lines.append(format % d)
436            lines.append(d)
[1970]437            total += 1
438            if total and not total % chunk or total == len(students):
[2128]439                #open(export_file,"a").write('\n'.join(lines) +'\n')
440                csv_writer.writerows(lines)
[1970]441                anz = len(lines)
442                logger.info("wrote %(anz)d  total written %(total)d" % vars())
443                end_chunk = DateTime.DateTime().timeTime()
444                duration = end_chunk-start_chunk
445                per_record = duration/anz
446                till_now = end_chunk - start
447                avarage_per_record = till_now/total
448                estimated_end = DateTime.DateTime(start + avarage_per_record * nr2export)
449                estimated_end = estimated_end.strftime("%H:%M:%S")
450                logger.info('%(duration)4.1f, %(per_record)4.3f,end %(estimated_end)s' % vars())
451                start_chunk = DateTime.DateTime().timeTime()
452                lines = []
453        end = DateTime.DateTime().timeTime()
454        logger.info('total time %6.2f m' % ((end-start)/60))
455        filename, extension = os.path.splitext(export_file)
456        from subprocess import call
457        msg = "wrote %(total)d records to %(export_file)s" % vars()
458        try:
459            retcode = call('gzip %s' % (export_file),shell=True)
460            if retcode == 0:
461                msg = "wrote %(total)d records to %(export_file)s.gz" % vars()
462        except OSError, e:
463            retcode = -99
464            logger.info("zip failed with %s" % e)
465        logger.info(msg)
466        args = {'portal_status_message': msg}
467        #url = self.REQUEST.get('URL1') + '?' + urlencode(args)
468        url = self.REQUEST.get('URL2')
469        return self.REQUEST.RESPONSE.redirect(url)
470    ###)
471
472
[1146]473    security.declareProtected(ModifyPortalContent,"importResults")###(
474    def importResults(self):
[1151]475        """load Returning Students Results from CSV"""
[1146]476        import transaction
477        import random
478        #from pdb import set_trace
479        wftool = self.portal_workflow
480        current = DateTime.DateTime().strftime("%d-%m-%y_%H_%M_%S")
[1802]481        #students_folder = self.portal_catalog({'meta_type': 'StudentsFolder'})[-1].getObject()
482        students_folder = self.portal_url.getPortalObject().campus.students
[1146]483        tr_count = 1
[2072]484        total = 0
[1146]485        #name = 'pume_results'
486        name = 'Results'
487        table = self.results_import
488        no_import = []
489        imported = []
[1571]490        logger = logging.getLogger('Students.StudentsFolder.importResults')
[1146]491        try:
492            results = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
493        except:
494            logger.error('Error reading %s.csv' % name)
495            return
[2071]496
[1146]497        l = self.portal_catalog({'meta_type': "Course"})
498        courses = [f.getId for f in l]
499        start = True
500        res = table()
501        regs = []
502        if len(res) > 0:
503            regs = [s.key for s in res]
504        no_course = []
505        no_course_list = []
506        course_count = 0
507        for result in results:
508            if start:
509                start = False
[1571]510                logger.info('Start loading from %s.csv' % name)
[1321]511                s = ','.join(['"%s"' % fn for fn in result.keys()])
[1146]512                imported.append(s)
513                no_import.append('%s,"Error"' % s)
514                format = ','.join(['"%%(%s)s"' % fn for fn in result.keys()])
515                format_error = format + ',"%(Error)s"'
516                no_certificate = "no certificate %s" % format
517            course_id = result.get('CosCode')
[1448]518            if not course_id:
519                course_id = 'N/A'
520                result['CosCode'] = course_id
[1168]521            matric_no = result.get('matric_no').upper()
522            result['matric_no'] = matric_no
523            key = matric_no+course_id
524            if matric_no == '':
[1252]525                result['Error'] = "Empty matric_no"
[1146]526                no_import.append( format_error % result)
527                continue
[1168]528            if key in regs or self.results_import(key = key):
[1252]529                result['Error'] = "Duplicate"
[1146]530                no_import.append( format_error % result)
531                continue
532            if course_id not in courses:
533                if course_id not in no_course:
534                    course_count +=1
535                    no_course.append(course_id)
536                    no_course_list.append('"%s"' % course_id)
537                    #result['Error'] = "No Course"
538                    #logger.info(format_error % result)
[1829]539
[1816]540            result['key'] = key
541            try:
542                table.addRecord(**result)
543            except ValueError:
544                #import pdb;pdb.set_trace()
545                result['Error'] = "Duplicate"
546                no_import.append( format_error % result)
547                continue
[1829]548
[1146]549            regs.append(key)
550            imported.append(format % result)
551            tr_count += 1
552            if tr_count > 1000:
553                if len(no_import) > 0:
554                    open("%s/import/%s_not_imported%s.csv" % (i_home,name,current),"a").write(
[1151]555                             '\n'.join(no_import)+'\n')
[1146]556                    no_import = []
557                open("%s/import/%simported%s.csv" % (i_home,name,current),"a").write(
[1151]558                                            '\n'.join(imported) + '\n')
[1146]559                imported = []
560                if no_course_list:
561                    open("%s/import/%sno_courses%s.csv" % (i_home,name,current),"a").write(
[1151]562                                            '\n'.join(no_course_list) + '\n')
[1146]563                    no_course_list = []
564                transaction.commit()
[1168]565                regs = []
[2072]566                total += tr_count
[2080]567                em = '%d transactions totally comitted, %s courses not found ' % (total,course_count)
568                logger.info(em)
[2072]569                tr_count = 0
[1146]570        open("%s/import/%simported%s.csv" % (i_home,name,current),"a").write(
571                                            '\n'.join(imported))
572        open("%s/import/%s_not_imported%s.csv" % (i_home,name,current),"a").write(
573                                                '\n'.join(no_import))
574        if no_course_list:
575            open("%s/import/%sno_courses%s.csv" % (i_home,name,current),"a").write(
576                                    '\n'.join(no_course_list))
[2072]577        em = '%d transactions totally committed, %s courses not found ' % (total,course_count)
[1393]578        logger.info(em)
[1146]579        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
580    ###)
581
[1065]582
[2654]583
[1594]584    security.declareProtected(View,"fixOwnership") ###(
[511]585    def fixOwnership(self):
586        """fix Ownership"""
587        for s in self.portal_catalog(meta_type = 'Student'):
588            student = s.getObject()
589            sid = s.getId
590            import pdb;pdb.set_trace()
591            student.application.manage_setLocalRoles(sid, ['Owner',])
592            student.personal.manage_setLocalRoles(sid, ['Owner',])
[1594]593    ###)
[603]594
[1594]595    security.declareProtected(View,"Title") ###(
[364]596    def Title(self):
597        """compose title"""
[382]598        return "Student Section"
[1594]599    ###)
[361]600
[4302]601    #def generateStudentId(self,letter,students = None): ###(
602    #    import random
603    #    r = random
604    #    if students is None:
605    #        students = self.portal_url.getPortalObject().campus.students
606    #    if letter not in ('ABCDEFGIHKLMNOPQRSTUVWXY'):
607    #        letter= r.choice('ABCDEFGHKLMNPQRSTUVWXY')
608    #    sid = "%c%d" % (letter,r.randint(99999,1000000))
609    #    while hasattr(students, sid):
610    #        sid = "%c%d" % (letter,r.randint(99999,1000000))
611    #    return sid
612    #    #return "%c%d" % (r.choice('ABCDEFGHKLMNPQRSTUVWXY'),r.randint(99999,1000000))
613    ####)
[714]614
[361]615InitializeClass(StudentsFolder)
616
[1594]617def addStudentsFolder(container, id, REQUEST=None, **kw): ###(
[361]618    """Add a Student."""
619    ob = StudentsFolder(id, **kw)
620    return CPSBase_adder(container, ob, REQUEST=REQUEST)
[1594]621    ###)
622
[361]623###)
624
[57]625class Student(CPSDocument): ###(
626    """
[154]627    WAeUP Student container for the various student data
[57]628    """
629    meta_type = 'Student'
630    portal_type = meta_type
631    security = ClassSecurityInfo()
[154]632
[3447]633    # security.declareProtected(View,"Title")
634    # def Title(self):
635    #     """compose title"""
636    #     reg_nr = self.getId()[1:]
637    #     data = getattr(self,'personal',None)
638    #     if data:
639    #         content = data.getContent()
640    #         return "%s %s %s" % (content.firstname,content.middlename,content.lastname)
641    #     data = getattr(self,'application',None)
642    #     if data:
643    #         content = data.getContent()
644    #         return "%s" % (content.jamb_lastname)
645    #     return self.title
[154]646
[511]647    security.declarePrivate('makeStudentMember') ###(
648    def makeStudentMember(self,sid,password='uNsEt'):
649        """make the student a member"""
650        membership = self.portal_membership
[603]651        membership.addMember(sid,
[511]652                             password ,
653                             roles=('Member',
654                                     'Student',
[522]655                                     ),
[511]656                             domains='',
[904]657                             properties = {'memberareaCreationFlag': False,
658                                           'homeless': True},)
[511]659        member = membership.getMemberById(sid)
660        self.portal_registration.afterAdd(member, sid, password, None)
661        self.manage_setLocalRoles(sid, ['Owner',])
662
663###)
664
[764]665    security.declareProtected(View,'createSubObjects') ###(
666    def createSubObjects(self):
667        """make the student a member"""
[3481]668        #dp = {'Title': 'Personal Data'}
[764]669        app_doc = self.application.getContent()
670        names = app_doc.jamb_lastname.split()
671        if len(names) == 3:
672            dp['firstname'] = names[0].capitalize()
673            dp['middlename'] = names[1].capitalize()
674            dp['lastname'] = names[2].capitalize()
675        elif len(names) == 2:
676            dp['firstname'] = names[0].capitalize()
677            dp['lastname'] = names[1].capitalize()
678        else:
679            dp['lastname'] = app_doc.jamb_lastname
680        dp['sex'] = app_doc.jamb_sex == 'F'
681        dp['lga'] = "%s/%s" % (app_doc.jamb_state,app_doc.jamb_lga )
682        proxy = self.aq_parent
683        proxy.invokeFactory('StudentPersonal','personal')
684        per = proxy.personal
685        per_doc = per.getContent()
686        per_doc.edit(mapping = dp)
[927]687        per.manage_setLocalRoles(proxy.getId(), ['Owner',])
[764]688        #self.portal_workflow.doActionFor(per,'open',dest_container=per)
[603]689
[511]690###)
691
[57]692InitializeClass(Student)
693
694def addStudent(container, id, REQUEST=None, **kw):
695    """Add a Student."""
696    ob = Student(id, **kw)
697    return CPSBase_adder(container, ob, REQUEST=REQUEST)
698
699###)
[91]700
[639]701class StudentAccommodation(CPSDocument): ###(
702    """
703    WAeUP Student container for the various student data
704    """
705    meta_type = 'StudentAccommodation'
706    portal_type = meta_type
707    security = ClassSecurityInfo()
708
[3473]709    # security.declareProtected(View,"Title")
710    # def Title(self):
711    #     """compose title"""
712    #     content = self.getContent()
713    #     session_id = content.session
714    #     try:
715    #         y = int(session_id[-2:])
716    #     except:
717    #         return "Accommodation Data for Session %s" % session_id
718    #     session_str = self.portal_vocabularies.sessions.get(y)
719    #     #return "Accommodation Data for %s %s" % (content.firstname,content.lastname)
720    #     return "Accommodation Data for Session %s" % session_str
[639]721
722
723InitializeClass(StudentAccommodation)
724
725def addStudentAccommodation(container, id, REQUEST=None, **kw):
726    """Add a Students personal data."""
727    ob = StudentAccommodation(id, **kw)
728    return CPSBase_adder(container, ob, REQUEST=REQUEST)
729
730###)
731
[89]732class StudentPersonal(CPSDocument): ###(
733    """
[154]734    WAeUP Student container for the various student data
[89]735    """
736    meta_type = 'StudentPersonal'
737    portal_type = meta_type
738    security = ClassSecurityInfo()
[152]739
[3473]740    # security.declareProtected(View,"Title")
741    # def Title(self):
742    #     """compose title"""
743    #     #content = self.getContent()
744    #     #return "Personal Data for %s %s" % (content.firstname,content.lastname)
745    #     return "Personal Data"
[152]746
[154]747
[89]748InitializeClass(StudentPersonal)
749
750def addStudentPersonal(container, id, REQUEST=None, **kw):
751    """Add a Students personal data."""
752    ob = StudentPersonal(id, **kw)
753    return CPSBase_adder(container, ob, REQUEST=REQUEST)
754
755###)
756
[423]757class StudentClearance(CPSDocument): ###(
758    """
759    WAeUP Student container for the various student data
760    """
761    meta_type = 'StudentClearance'
762    portal_type = meta_type
763    security = ClassSecurityInfo()
764
[3473]765    # security.declareProtected(View,"Title")
766    # def Title(self):
767    #     """compose title"""
768    #     #content = self.getContent()
769    #     #return "Clearance/Eligibility Record for %s %s" % (content.firstname,content.lastname)
770    #     return "Clearance/Eligibility Record"
[423]771
772
773InitializeClass(StudentClearance)
774
775def addStudentClearance(container, id, REQUEST=None, **kw):
776    """Add a Students personal data."""
777    ob = StudentClearance(id, **kw)
778    return CPSBase_adder(container, ob, REQUEST=REQUEST)
779
780###)
781
[454]782class StudentStudyLevel(CPSDocument): ###(
783    """
784    WAeUP Student container for the various student data
785    """
786    meta_type = 'StudentStudyLevel'
787    portal_type = meta_type
788    security = ClassSecurityInfo()
789
[3473]790    # security.declareProtected(View,"Title")
791    # def Title(self):
792    #     """compose title"""
793    #     return self.portal_vocabularies.student_levels.get(self.aq_parent.getId())
794    #     #return "Level %s" % self.aq_parent.getId()
[454]795
[1700]796    def create_course_results(self,cert_id,current_level): ###(
[1649]797        "create all courses in a level"
798        aq_portal = self.portal_catalog.evalAdvancedQuery
799        res = self.portal_catalog(portal_type="Certificate", id = cert_id)
800        l = []
801        import transaction
802        if res:
803            cert = res[0]
804            path = cert.getPath()
805            query = Eq("path","%s/%s" % (path,current_level)) &\
806                    Eq('portal_type','CertificateCourse')
807            courses = aq_portal(query)
808            #from pdb import set_trace;set_trace()
809            self_proxy = self.aq_parent
810            for c in courses:
811                d = self.getCourseInfo(c.getId)
812                cr_id = self_proxy.invokeFactory('StudentCourseResult',c.getId)
813                course_result = getattr(self_proxy,cr_id)
814                self.portal_workflow.doActionFor(course_result,'open')
815                d['core_or_elective'] = getattr(c.getObject().getContent(),'core_or_elective')
816                course_result.getContent().edit(mapping=d)
[1820]817                #transaction.commit()
[1700]818    ###)
[472]819
[454]820InitializeClass(StudentStudyLevel)
821
822def addStudentStudyLevel(container, id, REQUEST=None, **kw):
823    """Add a Students personal data."""
824    ob = StudentStudyLevel(id, **kw)
825    return CPSBase_adder(container, ob, REQUEST=REQUEST)
826
827###)
828
[362]829class StudentStudyCourse(CPSDocument): ###(
830    """
831    WAeUP Student container for the various student data
832    """
833    meta_type = 'StudentStudyCourse'
834    portal_type = meta_type
835    security = ClassSecurityInfo()
836
[3473]837    # security.declareProtected(View,"Title")
838    # def Title(self):
839    #     """compose title"""
840    #     #content = self.getContent()
841    #     return "Study Course"
[362]842
843
844InitializeClass(StudentStudyCourse)
845
846def addStudentStudyCourse(container, id, REQUEST=None, **kw):
847    """Add a Students personal data."""
848    ob = StudentStudyCourse(id, **kw)
849    return CPSBase_adder(container, ob, REQUEST=REQUEST)
850
851###)
852
[472]853class StudentApplication(CPSDocument): ###(
[179]854    """
855    WAeUP Student container for the various student data
856    """
[472]857    meta_type = 'StudentApplication'
[179]858    portal_type = meta_type
859    security = ClassSecurityInfo()
860
[3473]861    # security.declareProtected(View,"Title")
862    # def Title(self):
863    #     """compose title"""
864    #     return "Application Data"
[179]865
[181]866
[472]867InitializeClass(StudentApplication)
[179]868
[472]869def addStudentApplication(container, id, REQUEST=None, **kw):
[179]870    """Add a Students eligibility data."""
[472]871    ob = StudentApplication(id, **kw)
[179]872    return CPSBase_adder(container, ob, REQUEST=REQUEST)
[763]873###)
[179]874
[758]875
[464]876class StudentCourseResult(CPSDocument): ###(
[89]877    """
[464]878    WAeUP StudentCourseResult
[89]879    """
[464]880    meta_type = 'StudentCourseResult'
[89]881    portal_type = meta_type
882    security = ClassSecurityInfo()
[472]883
[454]884    def getCourseEntry(self,cid):
[723]885        res = self.portal_catalog({'meta_type': "Course",
[454]886                                           'id': cid})
887        if res:
888            return res[-1]
889        else:
890            return None
[154]891
[3473]892    # security.declareProtected(View,"Title")
893    # def Title(self):
894    #     """compose title"""
895    #     cid = self.aq_parent.getId()
896    #     ce = self.getCourseEntry(cid)
897    #     if ce:
898    #         return "%s" % ce.Title
899    #     return "No course with id %s" % cid
[3481]900
[464]901InitializeClass(StudentCourseResult)
[454]902
[464]903def addStudentCourseResult(container, id, REQUEST=None, **kw):
904    """Add a StudentCourseResult."""
905    ob = StudentCourseResult(id, **kw)
[89]906    return CPSBase_adder(container, ob, REQUEST=REQUEST)
[139]907###)
908
[3682]909
[2912]910class StudentPume(CPSDocument): ###(
911    """
912    WAeUP Student container for the various student data
913    """
914    meta_type = 'StudentPume'
915    portal_type = meta_type
916    security = ClassSecurityInfo()
917
[3473]918    # security.declareProtected(View,"Title")
919    # def Title(self):
920    #     """compose title"""
921    #     return "PUME Results"
[2912]922
923
924InitializeClass(StudentPume)
925
926def addStudentPume(container, id, REQUEST=None, **kw):
927    """Add a Students PUME data."""
928    ob = StudentPume(id, **kw)
929    return CPSBase_adder(container, ob, REQUEST=REQUEST)
[3682]930###)
[2912]931
932
[3682]933class StudentPastoralReport(CPSDocument): ###(
934    """
935    Student Pastoral Report
936    """
937    meta_type = 'StudentPastoralReport'
938    portal_type = meta_type
939    security = ClassSecurityInfo()
[2912]940
[3682]941InitializeClass(StudentPastoralReport)
942
943def addStudentPastoralReport(container, id, REQUEST=None, **kw):
944    """Add a Student Pastoral Report."""
945    ob = StudentPastoralReport(id, **kw)
946    return CPSBase_adder(container, ob, REQUEST=REQUEST)
947###)
948
[579]949# Backward Compatibility StudyLevel
950
951from Products.WAeUP_SRP.Academics import StudyLevel
952
953from Products.WAeUP_SRP.Academics import addStudyLevel
954
Note: See TracBrowser for help on using the repository browser.