source: WAeUP_SRP/trunk/WAeUPTables.py @ 1838

Last change on this file since 1838 was 1815, checked in by Henrik Bettermann, 17 years ago

reindex of matric_no and jamb_reg_no fixed

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