source: WAeUP_SRP/trunk/WAeUPTables.py @ 2036

Last change on this file since 2036 was 2033, checked in by joachim, 17 years ago

add course too registered_courses only for current_level

  • Property svn:keywords set to Id
File size: 29.4 KB
Line 
1#-*- mode: python; mode: fold -*-
2# (C) Copyright 2005 AixtraWare <http://aixtraware.de>
3# Author: Joachim Schmitz <js@aixtraware.de>
4#
5# This program is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License version 2 as published
7# by the Free Software Foundation.
8#
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12# GNU General Public License for more details.
13#
14# You should have received a copy of the GNU General Public License
15# along with this program; if not, write to the Free Software
16# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
17# 02111-1307, USA.
18#
19# $Id: WAeUPTables.py 2033 2007-07-18 13:44:13Z joachim $
20
21from zope.interface import implements
22from Globals import InitializeClass
23from Products.ZCatalog.ZCatalog import ZCatalog
24from Products.ZCatalog.ProgressHandler import ZLogHandler
25from AccessControl import ClassSecurityInfo
26from Products.CMFCore.permissions import ModifyPortalContent
27import urllib
28import DateTime,time
29import csv,re
30import logging
31import Globals
32p_home = Globals.package_home(globals())
33i_home = Globals.INSTANCE_HOME
34from Products.CMFCore.CatalogTool import CatalogTool
35from Products.AdvancedQuery import Eq, Between, Le,In
36
37from interfaces import IWAeUPTable
38
39class AttributeHolder(object):
40    pass
41
42def dict2ob(dict):
43    ob = AttributeHolder()
44    for key, value in dict.items():
45        setattr(ob, key, value)
46    return ob
47
48class WAeUPTable(ZCatalog): ###(
49
50    implements(IWAeUPTable)
51    security = ClassSecurityInfo()
52
53    def refreshCatalog(self, clear=0, pghandler=None):
54        """ don't refresh for a normal table """
55
56        if self.REQUEST and self.REQUEST.RESPONSE:
57            self.REQUEST.RESPONSE.redirect(
58              URL1 +
59              '/manage_catalogAdvanced?manage_tabs_message=Catalog%20refresh%20not%20implemented')
60
61    def manage_catalogClear(self, REQUEST=None, RESPONSE=None, URL1=None):
62        """ clears the whole enchilada """
63
64        #if REQUEST and RESPONSE:
65        #    RESPONSE.redirect(
66        #      URL1 +
67        #      '/manage_catalogAdvanced?manage_tabs_message=Catalog%20Clearing%20disabled')
68
69
70        self._catalog.clear()
71        if REQUEST and RESPONSE:
72            RESPONSE.redirect(
73              URL1 +
74              '/manage_catalogAdvanced?manage_tabs_message=Catalog%20cleared')
75
76    def addRecord(self, **data):
77        # The uid is the same as "bed".
78        uid = data[self.key]
79        res = self.searchResults({"%s" % self.key : uid})
80        if len(res) > 0:
81            raise ValueError("More than one record with uid %s" % uid)
82        self.catalog_object(dict2ob(data), uid=uid)
83        return uid
84
85    def deleteRecord(self, uid):
86        self.uncatalog_object(uid)
87
88    def searchAndSetRecord(self, **data):
89        raise NotImplemented
90
91    def modifyRecord(self, **data):
92        #records = self.searchResults(uid=uid)
93        uid = data[self.key]
94        records = self.searchResults({"%s" % self.key : uid})
95        if len(records) > 1:
96            # Can not happen, but anyway...
97            raise ValueError("More than one record with uid %s" % uid)
98        if len(records) == 0:
99            raise KeyError("No record for uid %s" % uid)
100        record = records[0]
101        record_data = {}
102        for field in self.schema() + self.indexes():
103            record_data[field] = getattr(record, field)
104        # Add the updated data:
105        record_data.update(data)
106        self.catalog_object(dict2ob(record_data), uid)
107
108    def reindexIndex(self, name, REQUEST,pghandler=None):
109        if isinstance(name, str):
110            name = (name,)
111        paths = self._catalog.uids.items()
112        i = 0
113        #import pdb;pdb.set_trace()
114        for p,rid in paths:
115            i += 1
116            metadata = self.getMetadataForRID(rid)
117            record_data = {}
118            for field in name:
119                record_data[field] = metadata.get(field)
120            uid = metadata.get(self.key)
121            self.catalog_object(dict2ob(record_data), uid, idxs=name,
122                                update_metadata=0)
123
124    security.declareProtected(ModifyPortalContent,"exportAllRecords")
125    def exportAllRecords(self):
126        "export a WAeUPTable"
127        #import pdb;pdb.set_trace()
128        fields = [field for field in self.schema()]
129        format = ','.join(['"%%(%s)s"' % fn for fn in fields])
130        csv = []
131        csv.append(','.join(['"%s"' % fn for fn in fields]))
132        for uid in self._catalog.uids:
133            records = self.searchResults({"%s" % self.key : uid})
134            if len(records) > 1:
135                # Can not happen, but anyway...
136                raise ValueError("More than one record with uid %s" % uid)
137            if len(records) == 0:
138                raise KeyError("No record for uid %s" % uid)
139            rec = records[0]
140            csv.append(format % rec)
141        current = DateTime.DateTime().strftime("%d-%m-%y_%H_%M_%S")
142        open("%s/import/%s-%s.csv" % (i_home,self.getId(),current),"w+").write('\n'.join(csv))
143    ###)
144
145class AccommodationTable(WAeUPTable): ###(
146
147    meta_type = 'WAeUP Accommodation Tool'
148    name = "accommodation"
149    key = "bed"
150    def __init__(self):
151        WAeUPTable.__init__(self, 'portal_accommodation')
152
153    def searchAndReserveBed(self, student_id,bed_type):
154        records = self.searchResults({'student' : student_id})
155        if len(records) > 0:
156            return -1,"Student with Id %s already booked bed %s." % (student_id,records[0].bed)
157
158        records = [r for r in self.searchResults({'bed_type' : bed_type}) if not r.student]
159        #import pdb;pdb.set_trace()
160        if len(records) == 0:
161            return -2,"No bed available"
162        rec = records[0]
163        self.modifyRecord(bed=rec.bed,student=student_id)
164        s_logger = logging.getLogger('WAeUPTables.AccommodationTable.searchAndReserveBed')
165        s_logger.info('%s reserved bed %s' % (student_id,rec.bed))
166        return 1,rec.bed
167
168
169InitializeClass(AccommodationTable)
170
171###)
172
173class PinTable(WAeUPTable): ###(
174    from ZODB.POSException import ConflictError
175    meta_type = 'WAeUP Pin Tool'
176    name = "pins"
177    key = 'pin'
178    def __init__(self):
179        WAeUPTable.__init__(self, 'portal_pins')
180
181
182    def searchAndSetRecord(self, uid, student_id,prefix):
183        #records = self.searchResults(uid=uid)
184        records = self.searchResults(student = student_id)
185        #import pdb;pdb.set_trace()
186        if len(records) > 0 and prefix in ('CLR','APP'):
187            for r in records:
188                if r.pin != uid and r.prefix_batch.startswith(prefix):
189                    return -2
190        records = self.searchResults({"%s" % self.key : uid})
191        if len(records) > 1:
192            # Can not happen, but anyway...
193            raise ValueError("More than one record with uid %s" % uid)
194        if len(records) == 0:
195            return -1
196        record = records[0]
197        if record.student == "":
198            record_data = {}
199            for field in self.schema() + self.indexes():
200                record_data[field] = getattr(record, field)
201            # Add the updated data:
202            record_data['student'] = student_id
203            try:
204                self.catalog_object(dict2ob(record_data), uid)
205                return 1
206            except ConflictError:
207                return 2
208        if record.student.upper() != student_id.upper():
209            return 0
210        if record.student.upper() == student_id.upper():
211            return 2
212        return -3
213
214InitializeClass(PinTable)
215
216###)
217
218class PumeResultsTable(WAeUPTable): ###(
219
220    meta_type = 'WAeUP PumeResults Tool'
221    name = "pumeresults"
222    key = "jamb_reg_no"
223    def __init__(self):
224        WAeUPTable.__init__(self, 'portal_pumeresults')
225
226
227InitializeClass(PumeResultsTable)
228
229###)
230
231class StudentsCatalog(WAeUPTable): ###(
232    security = ClassSecurityInfo()
233
234    meta_type = 'WAeUP Students Catalog'
235    name = "students_catalog"
236    key = "id"
237    affected_types = {   ###(
238                      'StudentApplication':
239                          {'id': 'application',
240                           'fields':
241                             ('jamb_reg_no',
242                              'entry_mode',
243                              #'entry_level',
244                              'entry_session',
245                              )
246                              },
247                      'StudentClearance':
248                          {'id': 'clearance',
249                           'fields':
250                             ('matric_no',
251                              )
252                              },
253                         'StudentPersonal':
254                          {'id': 'personal',
255                           'fields':
256                             ('name',
257                              'sex',
258                              'email',
259                              'phone',
260                              )
261                              },
262                         'StudentStudyCourse':
263                          {'id': 'study_course',
264                           'fields':
265                             ('course',
266                              'faculty',
267                              'department',
268                              'level',
269                              'mode',
270                              'session',
271                              'verdict',
272                              )
273                              },
274                         }
275    ###)
276
277    def __init__(self):
278        WAeUPTable.__init__(self, 'students_catalog')
279        return
280
281    def manage_catalogClear(self, REQUEST=None, RESPONSE=None, URL1=None):
282        """ clears the whole enchilada """
283        self._catalog.clear()
284
285        if REQUEST and RESPONSE:
286            RESPONSE.redirect(
287              URL1 +
288              '/manage_catalogAdvanced?manage_tabs_message=Catalog%20Cleared')
289
290    def manage_catalogReindex(self, REQUEST, RESPONSE, URL1): ###(
291        """ clear the catalog, then re-index everything """
292
293        elapse = time.time()
294        c_elapse = time.clock()
295
296        pgthreshold = self._getProgressThreshold()
297        handler = (pgthreshold > 0) and ZLogHandler(pgthreshold) or None
298        self.refreshCatalog(clear=1, pghandler=handler)
299
300        elapse = time.time() - elapse
301        c_elapse = time.clock() - c_elapse
302
303        RESPONSE.redirect(
304            URL1 +
305            '/manage_catalogAdvanced?manage_tabs_message=' +
306            urllib.quote('Catalog Updated \n'
307                         'Total time: %s\n'
308                         'Total CPU time: %s' % (`elapse`, `c_elapse`)))
309    ###)
310
311    def get_from_doc_department(self,doc): ###(
312        "return the students department"
313        if doc is None:
314            return None
315        certificate_res = self.portal_catalog(id = doc.study_course)
316        if len(certificate_res) != 1:
317            return None
318        return certificate_res[0].getPath().split('/')[-3]
319
320    def get_from_doc_faculty(self,doc):
321        "return the students faculty"
322        if doc is None:
323            return None
324        certificate_res = self.portal_catalog(id = doc.study_course)
325        if len(certificate_res) != 1:
326            return None
327        return certificate_res[0].getPath().split('/')[-4]
328
329    def get_from_doc_level(self,doc):
330        "return the students level"
331        if doc is None:
332            return None
333        return getattr(doc,'current_level',None)
334
335    def get_from_doc_mode(self,doc):
336        "return the students mode"
337        if doc is None:
338            return None
339        cm = getattr(doc,'current_mode',None)
340        return cm
341
342
343    def get_from_doc_session(self,doc):
344        "return the students current_session"
345        if doc is None:
346            return None
347        return getattr(doc,'current_session',None)
348
349    def get_from_doc_entry_session(self,doc):
350        "return the students entry_session"
351        if doc is None:
352            return None
353        es = getattr(doc,'entry_session',None)
354        if es is not None and len(es) == 2:
355            return es
356        try:
357            digit = int(doc.jamb_reg_no[0])
358        except:
359            return "-1"
360        if digit < 8:
361            return "0%c" % doc.jamb_reg_no[0]
362        return "9%c" % doc.jamb_reg_no[0]
363
364    def get_from_doc_course(self,doc):
365        "return the students study_course"
366        if doc is None:
367            return None
368        return getattr(doc,'study_course',None)
369
370    def get_from_doc_name(self,doc):
371        "return the students name from the personal"
372        if doc is None:
373            return None
374        return "%s %s %s" % (doc.firstname,doc.middlename,doc.lastname)
375
376    def get_from_doc_verdict(self,doc):
377        "return the students study_course"
378        if doc is None:
379            return None
380        return getattr(doc,'current_verdict',None)
381    ###)
382
383    def reindexIndex(self, name, REQUEST,pghandler=None): ###(
384        if isinstance(name, str):
385            name = (name,)
386        reindextypes = {}
387        reindex_special = []
388        for n in name:
389            if n in ("review_state","registered_courses"):
390                reindex_special.append(n)
391            else:
392                for pt in self.affected_types.keys():
393                    if n in self.affected_types[pt]['fields']:
394                        if reindextypes.has_key(pt):
395                            reindextypes[pt].append(n)
396                        else:
397                            reindextypes[pt]= [n]
398                        break
399        students = self.portal_catalog(portal_type="Student")
400        if hasattr(self,'portal_catalog_real'):
401            aq_portal = self.portal_catalog_real.evalAdvancedQuery
402        else:
403            aq_portal = self.portal_catalog.evalAdvancedQuery
404        num_objects = len(students)
405        if pghandler:
406            pghandler.init('Refreshing catalog: %s' % self.absolute_url(1), num_objects)
407        noattr = set(('StudentClearance','StudentPersonal')) & set(reindextypes.keys())
408        for i in xrange(num_objects):
409            if pghandler: pghandler.report(i)
410            student_brain = students[i]
411            student_object = student_brain.getObject()
412            data = {}
413            modified = False
414            sid = data['id'] = student_brain.getId
415            if reindex_special and 'review_state' in reindex_special:
416                modified = True
417                data['review_state'] = student_brain.review_state
418            sub_objects = False
419            for pt in reindextypes.keys():
420                modified = True
421                try:
422                    doc = getattr(student_object,self.affected_types[pt]['id']).getContent()
423                    sub_objects = True
424                except:
425                    continue
426                for field in self.affected_types[pt]['fields']:
427                    if hasattr(self,'get_from_doc_%s' % field):
428                        data[field] = getattr(self,'get_from_doc_%s' % field)(doc)
429                    else:
430                        data[field] = getattr(doc,field)
431            if not sub_objects and noattr:
432                import_res = self.returning_import(id = sid)
433                if not import_res:
434                    continue
435                import_record = import_res[0]
436                data['matric_no'] = import_record.matric_no
437                data['sex'] = import_record.Sex == 'F'
438                data['name'] = "%s %s %s" % (import_record.Firstname,
439                                             import_record.Middlename,
440                                             import_record.Lastname)
441                data['jamb_reg_no'] = import_record.Entryregno
442            if reindex_special and 'registered_courses' in reindex_special:
443                try:
444                    study_course = getattr(student_object,"study_course")
445                    level_ids = study_course.objectIds()
446                except:
447                    continue
448                if not level_ids:
449                    continue
450                modified = True
451                level_ids.sort()
452                course_ids = getattr(study_course,level_ids[-1]).objectIds()
453                courses = []
454                for c in course_ids:
455                    if c.endswith('_co'):
456                        courses.append(c[:-3])
457                    else:
458                        courses.append(c)
459                data['registered_courses'] = courses
460            if modified:
461                self.modifyRecord(**data)
462        if pghandler: pghandler.finish()
463    ###)
464
465    def refreshCatalog(self, clear=0, pghandler=None): ###(
466        """ re-index everything we can find """
467        students_folder = self.portal_url.getPortalObject().campus.students
468        if clear:
469            self._catalog.clear()
470        students = self.portal_catalog(portal_type="Student")
471        num_objects = len(students)
472        if pghandler:
473            pghandler.init('Refreshing catalog: %s' % self.absolute_url(1), num_objects)
474        for i in xrange(num_objects):
475            if pghandler: pghandler.report(i)
476            student_brain = students[i]
477            spath = student_brain.getPath()
478            student_object = student_brain.getObject()
479            data = {}
480            sid = data['id'] = student_brain.getId
481            data['review_state'] = student_brain.review_state
482            sub_objects = False
483            for pt in self.affected_types.keys():
484                modified = True
485                try:
486                    doc = getattr(student_object,self.affected_types[pt]['id']).getContent()
487                    sub_objects = True
488                except:
489                    #from pdb import set_trace;set_trace()
490                    continue
491                for field in self.affected_types[pt]['fields']:
492                    if hasattr(self,'get_from_doc_%s' % field):
493                        data[field] = getattr(self,'get_from_doc_%s' % field)(doc)
494                    else:
495                        data[field] = getattr(doc,field,None)
496            if not sub_objects:
497                import_res = self.returning_import(id = sid)
498                if not import_res:
499                    continue
500                import_record = import_res[0]
501                data['matric_no'] = import_record.matric_no
502                data['sex'] = import_record.Sex == 'F'
503                data['name'] = "%s %s %s" % (import_record.Firstname,
504                                             import_record.Middlename,
505                                             import_record.Lastname)
506                data['jamb_reg_no'] = import_record.Entryregno
507            else:
508                study_course = getattr(student_object,'study_course',None)
509                current_level = data.get('level',None)
510                data['registered_courses'] = []
511                if study_course and current_level and current_level in study_course.objectIds():
512                    level_obj = getattr(study_course,current_level)
513                    courses = []
514                    for c in level_obj.objectIds():
515                        if c.endswith('_co'):
516                            courses.append(c[:-3])
517                        else:
518                            courses.append(c)
519                    data['registered_courses'] = courses
520            self.addRecord(**data)
521        if pghandler: pghandler.finish()
522    ###)
523
524    security.declarePrivate('notify_event_listener') ###(
525    def notify_event_listener(self,event_type,object,infos):
526        "listen for events"
527        if not infos.has_key('rpath'):
528            return
529        pt = getattr(object,'portal_type',None)
530        mt = getattr(object,'meta_type',None)
531        students_catalog = self
532        data = {}
533        if pt == 'Student' and\
534           mt == 'CPS Proxy Folder' and\
535           event_type.startswith('workflow'):
536            data['id'] = object.getId()
537            data['review_state'] = self.portal_workflow.getInfoFor(object,'review_state',None)
538            students_catalog.modifyRecord(**data)
539            return
540        rpl = infos['rpath'].split('/')
541        if pt == 'Student' and mt == 'CPS Proxy Folder'\
542           and event_type == "sys_add_object":
543            student_id = object.id
544            try:
545                self.addRecord(id = student_id)
546            except ValueError:
547                pass
548            return
549        elif pt == 'StudentCourseResult' and mt == 'CPS Proxy Folder':
550            if event_type not in ("sys_add_object","sys_del_object"):
551                return
552            #import pdb;pdb.set_trace()
553            level_session = getattr(object.aq_parent.getContent(),'session','unknown')
554            if level_session not in (self.getSessionId()[-2:],'2006/2007'):
555                return
556            course_id = object.getId()
557            if course_id.endswith('_co'):
558                course_id = course_id[:-3]
559            student_id = object.absolute_url_path().split('/')[-4]
560            res = students_catalog(id = student_id)
561            if not res:
562                return
563            student_rec = res[0]
564            registered_courses = getattr(student_rec,'registered_courses',[])
565            try:
566                x = course_id in registered_courses
567            except TypeError:
568                registered_courses = []
569            if event_type == "sys_add_object":
570                if course_id not in registered_courses:
571                    registered_courses.append(course_id)
572                else:
573                    return
574            elif event_type == "sys_del_object":
575                while course_id in registered_courses:
576                    registered_courses.remove(course_id)
577            data['id'] = student_id
578            data['registered_courses'] = registered_courses
579            self.modifyRecord(**data)
580            return
581        if pt not in self.affected_types.keys():
582            return
583        if event_type not in ('sys_modify_object'):
584            return
585        if mt == 'CPS Proxy Folder':
586            return
587        for field in self.affected_types[pt]['fields']:
588            if hasattr(self,'get_from_doc_%s' % field):
589                data[field] = getattr(self,'get_from_doc_%s' % field)(object)
590            else:
591                data[field] = getattr(object,field)
592        data['id'] = rpl[2]
593        self.modifyRecord(**data)
594    ###)
595
596
597InitializeClass(StudentsCatalog)
598
599###)
600
601class StatisticsCatalog(StudentsCatalog): ###(
602    security = ClassSecurityInfo()
603    meta_type = 'WAeUP Statistics Catalog'
604    name = "statistics"
605    affected_types = {   ###(
606                      'StudentApplication':
607                          {'id': 'application',
608                           'fields':
609                             ('jamb_reg_no',
610                              'entry_mode',
611                              #'entry_level',
612                              'entry_session',
613                              )
614                              },
615                      'StudentClearance':
616                          {'id': 'clearance',
617                           'fields':
618                             ('matric_no',
619                              )
620                              },
621                         'StudentPersonal':
622                          {'id': 'personal',
623                           'fields':
624                             ('name',
625                              'sex',
626                              'email',
627                              'phone',
628                              )
629                              },
630                         'StudentStudyCourse':
631                          {'id': 'study_course',
632                           'fields':
633                             ('course',
634                              'faculty',
635                              'department',
636                              'level',
637                              'mode',
638                              'session',
639                              'verdict',
640                              )
641                              },
642                         }
643    ###)
644
645
646InitializeClass(StudentsCatalog)
647###)
648
649class CoursesCatalog(WAeUPTable): ###(
650    security = ClassSecurityInfo()
651
652    meta_type = 'WAeUP Courses Catalog'
653    name = "students_catalog"
654    key = "code"
655    def __init__(self):
656        WAeUPTable.__init__(self, 'courses_catalog')
657
658    def manage_catalogReindex(self, REQUEST, RESPONSE, URL1): ###(
659        """ clear the catalog, then re-index everything """
660
661        elapse = time.time()
662        c_elapse = time.clock()
663
664        pgthreshold = self._getProgressThreshold()
665        handler = (pgthreshold > 0) and ZLogHandler(pgthreshold) or None
666        self.refreshCatalog(clear=1, pghandler=handler)
667
668        elapse = time.time() - elapse
669        c_elapse = time.clock() - c_elapse
670
671        RESPONSE.redirect(
672            URL1 +
673            '/manage_catalogAdvanced?manage_tabs_message=' +
674            urllib.quote('Catalog Updated \n'
675                         'Total time: %s\n'
676                         'Total CPU time: %s' % (`elapse`, `c_elapse`)))
677    ###)
678
679    def reindexIndex(self, name, REQUEST,pghandler=None): ###(
680        if isinstance(name, str):
681            name = (name,)
682        courses = self.portal_catalog(portal_type="Course")
683        num_objects = len(courses)
684        if pghandler:
685            pghandler.init('Refreshing catalog: %s' % self.absolute_url(1), num_objects)
686        for i in xrange(num_objects):
687            if pghandler: pghandler.report(i)
688            course_brain = courses[i]
689            course_object = course_brain.getObject()
690            pl = course_brain.getPath().split('/')
691            data = {}
692            cid = data[self.key] = course_brain.getId
693            data['faculty'] = pl[-4]
694            data['department'] = pl[-3]
695            doc = course_object.getContent()
696            for field in name:
697                if field not in (self.key,'faculty','department'):
698                    data[field] = getattr(doc,field)
699            self.modifyRecord(**data)
700        if pghandler: pghandler.finish()
701    ###)
702
703    def refreshCatalog(self, clear=0, pghandler=None): ###(
704        """ re-index everything we can find """
705        if clear:
706            self._catalog.clear()
707        courses = self.portal_catalog(portal_type="Course")
708        num_objects = len(courses)
709        if pghandler:
710            pghandler.init('Refreshing catalog: %s' % self.absolute_url(1), num_objects)
711        #from pdb import set_trace;set_trace()
712        for i in xrange(num_objects):
713            if pghandler: pghandler.report(i)
714            course_brain = courses[i]
715            course_doc = course_brain.getObject().getContent()
716            pl = course_brain.getPath().split('/')
717            data = {}
718            for field in self.schema():
719                data[field] = getattr(course_doc,field,None)
720            data[self.key] = course_brain.getId
721            ai = pl.index('academics')
722            data['faculty'] = pl[ai +1]
723            data['department'] = pl[ai +2]
724            if clear:
725                self.addRecord(**data)
726            else:
727                self.modifyRecord(**data)
728        if pghandler: pghandler.finish()
729    ###)
730
731    security.declarePrivate('notify_event_listener') ###(
732    def notify_event_listener(self,event_type,object,infos):
733        "listen for events"
734        if not infos.has_key('rpath'):
735            return
736        pt = getattr(object,'portal_type',None)
737        mt = getattr(object,'meta_type',None)
738        if pt != 'Course':
739            return
740        data = {}
741        rpl = infos['rpath'].split('/')
742        if event_type not in ("sys_add_object","sys_modify_object","sys_del_object"):
743            return
744        course_id = object.getId()
745        data[self.key] = course_id
746        if event_type == "sys_add_object" and mt == 'CPS Proxy Folder':
747            try:
748                self.addRecord(**data)
749            except ValueError:
750                return
751            course_id = object.getId()
752            doc = object.getContent()
753            if doc is None:
754                return
755            for field in self.schema():
756                data[field] = getattr(doc,field,None)
757            data[self.key] = course_id
758            ai = rpl.index('academics')
759            data['faculty'] = rpl[ai +1]
760            data['department'] = rpl[ai +2]
761            self.modifyRecord(**data)
762            return
763        if event_type == "sys_del_object":
764            self.deleteRecord(course_id)
765            return
766        if event_type == "sys_modify_object" and mt == 'Course':
767            #from pdb import set_trace;set_trace()
768            for field in self.schema():
769                data[field] = getattr(object,field,None)
770            course_id = object.aq_parent.getId()
771            data[self.key] = course_id
772            ai = rpl.index('academics')
773            data['faculty'] = rpl[ai +1]
774            data['department'] = rpl[ai +2]
775            self.modifyRecord(**data)
776    ###)
777
778
779InitializeClass(CoursesCatalog)
780###)
781
782class OnlinePaymentsImport(WAeUPTable): ###(
783
784    meta_type = 'WAeUP Online Payment Transactions'
785    name = "online_payments_import"
786    key = "order_id"
787    def __init__(self):
788        WAeUPTable.__init__(self, self.name)
789
790
791InitializeClass(CoursesCatalog)
792###)
793
794class ReturningImport(WAeUPTable): ###(
795
796    meta_type = 'Returning Import Table'
797    name = "returning_import"
798    key = "matric_no"
799    def __init__(self):
800        WAeUPTable.__init__(self, 'returning_import')
801
802
803InitializeClass(ReturningImport)
804###)
805
806class ResultsImport(WAeUPTable): ###(
807
808    meta_type = 'Results Import Table'
809    name = "results_import"
810    key = "key"
811    def __init__(self):
812        WAeUPTable.__init__(self, 'results_import')
813
814
815InitializeClass(ResultsImport)
816
817###)
818
819class PaymentsCatalog(WAeUPTable): ###(
820
821    meta_type = 'WAeUP Payments Catalog'
822    name = "students_catalog"
823    key = "id"
824    def __init__(self):
825        WAeUPTable.__init__(self, 'payments_catalog')
826
827
828InitializeClass(PaymentsCatalog)
829
830###)
831
832# BBB:
833AccomodationTable = AccommodationTable
Note: See TracBrowser for help on using the repository browser.