Changeset 2084


Ignore:
Timestamp:
3 Aug 2007, 05:58:51 (18 years ago)
Author:
joachim
Message:

add course_results catalog

Location:
WAeUP_SRP/trunk
Files:
1 added
1 edited

Legend:

Unmodified
Added
Removed
  • WAeUP_SRP/trunk/WAeUPTables.py

    r2078 r2084  
    3535from Products.AdvancedQuery import Eq, Between, Le,In
    3636
     37ADDING_SHEDULED = "adding_sheduled"
     38OBJECT_CREATED = "object_created"
     39
    3740from interfaces import IWAeUPTable
    3841
     
    6669        #      URL1 +
    6770        #      '/manage_catalogAdvanced?manage_tabs_message=Catalog%20Clearing%20disabled')
    68 
    6971
    7072        self._catalog.clear()
     
    313315    ###)
    314316
    315     def fill_certificates_dict(self):
     317    def fill_certificates_dict(self): ###(
    316318        "return certificate data in  dict"
    317319        certificates_brains = self.portal_catalog(portal_type ='Certificate')
     
    326328            d[cb.getId] = ld
    327329        return d
    328            
     330    ###)
     331
    329332    def get_from_doc_department(self,doc,cached_data={}): ###(
    330333        "return the students department"
     
    442445            pghandler.init('Refreshing catalog: %s' % self.absolute_url(1), num_objects)
    443446        noattr = set(('StudentClearance','StudentPersonal')) & set(reindextypes.keys())
     447        #import pdb;pdb.set_trace()
    444448        for i in xrange(num_objects):
    445449            if pghandler: pghandler.report(i)
    446450            student_brain = students[i]
    447451            student_object = student_brain.getObject()
     452            # query = Eq('path',student_brain.getPath())
     453            # sub_brains_list = aq_portal(query)
     454            # sub_brains = {}
     455            # for sub_brain in sub_brains_list:
     456            #     sub_brains[sub_brain.portal_type] = sub_brain
     457            # student_path = student_brain.getPath()
    448458            data = {}
    449459            modified = False
     
    457467                try:
    458468                    doc = getattr(student_object,self.affected_types[pt]['id']).getContent()
     469                    #doc = sub_brains[pt].getObject().getContent()
     470                    # path = "%s/%s" % (student_path,self.affected_types[pt]['id'])
     471                    # doc = self.unrestrictedTraverse(path).getContent()
    459472                    sub_objects = True
    460473                except:
    461474                    continue
    462                 for field in self.affected_types[pt]['fields']:
     475                for field in set(name).intersection(self.affected_types[pt]['fields']):
    463476                    if hasattr(self,'get_from_doc_%s' % field):
    464477                        data[field] = getattr(self,'get_from_doc_%s' % field)(doc,
     
    640653###)
    641654
    642 class StatisticsCatalog(StudentsCatalog): ###(
    643     security = ClassSecurityInfo()
    644     meta_type = 'WAeUP Statistics Catalog'
    645     name = "statistics"
    646     affected_types = {   ###(
    647                       'StudentApplication':
    648                           {'id': 'application',
    649                            'fields':
    650                              ('jamb_reg_no',
    651                               'entry_mode',
    652                               #'entry_level',
    653                               'entry_session',
    654                               )
    655                               },
    656                       'StudentClearance':
    657                           {'id': 'clearance',
    658                            'fields':
    659                              ('matric_no',
    660                               )
    661                               },
    662                          'StudentPersonal':
    663                           {'id': 'personal',
    664                            'fields':
    665                              ('name',
    666                               'sex',
    667                               'email',
    668                               'phone',
    669                               )
    670                               },
    671                          'StudentStudyCourse':
    672                           {'id': 'study_course',
    673                            'fields':
    674                              ('course',
    675                               'faculty',
    676                               'department',
    677                               'level',
    678                               'mode',
    679                               'session',
    680                               'verdict',
    681                               )
    682                               },
    683                          }
    684     ###)
    685 
    686 
    687 InitializeClass(StudentsCatalog)
    688 ###)
    689 
    690655class CoursesCatalog(WAeUPTable): ###(
    691656    security = ClassSecurityInfo()
     
    821786###)
    822787
    823 class ResultsCatalog(WAeUPTable): ###(
     788class CourseResults(WAeUPTable): ###(
    824789    security = ClassSecurityInfo()
    825790
    826791    meta_type = 'WAeUP Results Catalog'
    827792    name = "course_results"
    828     key = "key"
     793    key = "key" #student_id + level + course_id
    829794    def __init__(self):
    830795        WAeUPTable.__init__(self, 'course_results')
     796        self._queue = []
     797       
     798    def addRecord(self, **data): ###(
     799        # The uid is the same as "bed".
     800        uid = key = "%(student_id)s|%(level_id)s|%(course_id)s" % data
     801        if key in self._queue:
     802            return uid
     803        data['queue_status'] = ADDING_SHEDULED
     804        data['%s' % self.key] = uid
     805        res = self.searchResults({"%s" % self.key : uid})
     806        if len(res) > 0:
     807            raise ValueError("More than one record with uid %s" % uid)
     808        self.catalog_object(dict2ob(data), uid=uid)
     809        if not hasattr(self,'_queue'):
     810            self._queue = []
     811        self._queue.append(key)
     812        self._p_changed = 1
     813        return uid
     814    ###)
     815
     816    def deleteRecord(self, uid): ###(
     817        self.uncatalog_object(uid)
     818        if uid in self._queue:
     819            self._queue.remove(uid)
     820    ###)
     821
     822    def getCourses(self,student_id,level_id): ###(
     823        query = Eq('student_id',student_id) & Eq('level_id', level_id)
     824        carry_overs = []
     825        normal = []
     826        credits = 0
     827        for brain in self.course_results.evalAdvancedQuery(query):
     828            d = {}
     829            credits += int(brain.credits)
     830            for field in self.schema():
     831                d[field] = getattr(brain,field,'')
     832            d['sheduled'] = brain.queue_status == ADDING_SHEDULED
     833            d['coe'] = 'Elective'
     834            if brain.core_or_elective:
     835                d['coe'] = 'Core'
     836            d['title'] = self.courses_catalog.evalAdvancedQuery(Eq('code',brain.code))[0].title
     837            if brain.code.endswith('_co'):
     838                carry_overs.append(d)
     839            else:
     840                normal.append(d)
     841        normal.sort(cmp=lambda x,y: cmp(x['semester'], y['semester']))
     842        carry_overs.sort(cmp=lambda x,y: cmp(x['semester'], y['semester']))
     843        return credits,carry_overs,normal
     844    ###)
     845
     846    def addObject(self,record): ###(
     847        key = record.key
     848        student_id,level_id,course_id = key.split('|')
     849        level = getattr(getattr(self.portal_url.getPortalObject().campus.students,student_id).study_course,level_id)
     850        cr_id = level.invokeFactory('StudentCourseResult', course_id)
     851        course_result = getattr(level,cr_id)
     852        self.portal_workflow.doActionFor(course_result,'open')
     853        d = {}
     854        for field in self.schema():
     855            d[field] = getattr(record,field,'')
     856        course_result.getContent().edit(mapping=d)
     857    ###)
     858       
     859    security.declareProtected(ModifyPortalContent,"process_queue") ###(
     860    def process_queue(self,limit=None):
     861        """adds objects and removes them from the queue.
     862        If limit is specified, at most (limit) events are removed.
     863        """
     864        if not hasattr(self,'_queue'):
     865            return 0
     866        queue= self._queue
     867        if not limit or len(queue) <= limit:
     868            keys = self._queue[:]
     869        else:
     870            keys = queue[:limit]
     871        if not keys:
     872            records = self.evalAdvancedQuery(Eq('queue_status',ADDING_SHEDULED))
     873        else:
     874            records = self.evalAdvancedQuery(In("%s" % self.key,keys))
     875        for record in records:
     876            if record.queue_status == OBJECT_CREATED:
     877                continue
     878            self.addObject(record)
     879            data = {}
     880            data['key'] = record.key
     881            data['queue_status'] = OBJECT_CREATED
     882            self.modifyRecord(**data)
     883        count = 0
     884        for key in keys:
     885            count +=1
     886            if key in self._queue:
     887                self._queue.remove(key)
     888        self._p_changed = 1
     889        return count,len(self._queue)
     890    ###)
     891
     892    def manage_catalogClear(self, REQUEST=None, RESPONSE=None, URL1=None): ###(
     893        """ clears the whole enchilada """
     894        self._catalog.clear()
     895
     896        if REQUEST and RESPONSE:
     897            RESPONSE.redirect(
     898              URL1 +
     899              '/manage_catalogAdvanced?manage_tabs_message=Catalog%20Cleared')
     900    ###)
    831901
    832902    def manage_catalogReindex(self, REQUEST, RESPONSE, URL1): ###(
     
    838908        pgthreshold = self._getProgressThreshold()
    839909        handler = (pgthreshold > 0) and ZLogHandler(pgthreshold) or None
    840         #self.refreshCatalog(clear=1, pghandler=handler)
     910        self.refreshCatalog(clear=1, pghandler=handler)
    841911
    842912        elapse = time.time() - elapse
     
    851921    ###)
    852922
    853 
    854 InitializeClass(ResultsCatalog)
     923    def refreshCatalog(self, clear=1, pghandler=None): ###(
     924        """ re-index everything we can find """
     925        students_folder = self.portal_url.getPortalObject().campus.students
     926        if clear:
     927            self._catalog.clear()
     928        course_results = self.portal_catalog(portal_type="StudentCourseResult")
     929        num_objects = len(course_results)
     930        if pghandler:
     931            pghandler.init('Refreshing catalog: %s' % self.absolute_url(1), num_objects)
     932        #import pdb;pdb.set_trace()
     933        for i in xrange(num_objects):
     934            if pghandler:
     935                pghandler.report(i)
     936            course_result_brain = course_results[i]
     937            path_list = course_result_brain.getPath().split('/')
     938            course_result_object = course_result_brain.getObject()
     939            course_result_doc = course_result_object.getContent()
     940            data = {}
     941            level_id = path_list[-2]
     942            course_id = path_list[-1]
     943            student_id = path_list[-4]
     944            for field in self.schema():
     945                data[field] = getattr(course_result_doc,field,'')
     946            data['key'] = key = "%(student_id)s|%(level_id)s|%(course_id)s" % vars()
     947            data['student_id'] = student_id
     948            data['level_id'] = level_id
     949            data['queue_status'] = OBJECT_CREATED
     950            self.catalog_object(dict2ob(data), uid=key)
     951        if pghandler: pghandler.finish()
     952    ###)
     953
     954    security.declarePrivate('notify_event_listener') ###(
     955    def notify_event_listener(self,event_type,object,infos):
     956        "listen for events"
     957        if not infos.has_key('rpath'):
     958            return
     959        pt = getattr(object,'portal_type',None)
     960        mt = getattr(object,'meta_type',None)
     961        data = {}
     962        rpl = infos['rpath'].split('/')
     963        if mt == 'CPS Proxy Folder':
     964            return
     965        if pt == 'StudentCourseResult' and event_type == "sys_modify_object":
     966            data["%s" % self.key] = uid = "%s|%s|%s" % (rpl[-5],rpl[-3],rpl[-2])
     967            records = self.searchResults({"%s" % self.key : uid})
     968            if len(records) > 1:
     969                # Can not happen, but anyway...
     970                raise ValueError("More than one record with uid %s" % uid)
     971            if len(records) == 0:
     972                raise KeyError("No record for uid %s" % uid)
     973            record = records[0]
     974            #import pdb;pdb.set_trace()
     975            for field in ('core_or_elective','score'):
     976                value = getattr(object,field,None)
     977                data[field] = value
     978            self.modifyRecord(record,**data)
     979    ###)
     980
     981InitializeClass(CourseResults)
    855982###)
    856983
Note: See TracChangeset for help on using the changeset viewer.