Ticket #349: catwalk-multiple-joins-pages.diff

File catwalk-multiple-joins-pages.diff, 3.5 kB (added by bbockelm@math.unl.edu, 3 years ago)

Patch to catwalk python file

  • turbogears/toolbox/catwalk/__init__.py

    old new  
    384384            values.append(list(tmp)) 
    385385        return labels,values 
    386386 
    387     def object_joins(self,objectName,id,join,joinType,joinObjectName=''): 
     387    def get_selected_joins(self, objectName, id, join, joinType, joinObjectName, start, page_size): 
     388        start = int(start) 
     389        page_size = int(page_size) 
     390        columnObject = getattr( self.model, joinObjectName ) 
     391        try: 
     392            for clm in columnObject.sqlmeta.columnList: 
     393                 if type(clm) == sqlobject.SOForeignKey: 
     394                     if objectName == clm.foreignKey: 
     395                         fk = clm 
     396            fkName = fk.name 
     397            fkQuery = getattr( columnObject.q, str( fkName ) ) 
     398            selectResults = columnObject.select( fkQuery == id) 
     399            count = selectResults.count() 
     400            end = min(start+page_size,count) 
     401            return count, selectResults[start:end] 
     402        except Exception, e: 
     403            count = len(getattr(columnObject.get(id),join)) 
     404            end = min(start+page_size,count) 
     405            return count, getattr(columnObject.get(id),join)[start:end] 
     406 
     407    def object_joins(self,objectName,id,join,joinType,joinObjectName='', start=-1,page_size=10): 
    388408        """Collect the joined instances into a dictionary 
    389409 
    390410           @param objectName: name of the object  
     
    401421        hostObject = objectName 
    402422        obj = self.load_object(objectName) 
    403423        try: 
    404             rows = getattr(obj.get(id),join) 
    405         except: 
     424            if start >= 0: 
     425                count, rows = self.get_selected_joins( objectName, id, join, joinType, joinObjectName, start, page_size ) 
     426            else: 
     427                count, rows = getattr(obj.get(id),join) 
     428        except Exception, e: 
     429            print e 
    406430            msg='Error, joins objectName: %s, id: %s, join: %s'% (objectName,id,join) 
    407431            raise cherrypy.HTTPRedirect(turbogears.url('error', msg=msg)) 
    408432         
     433 
    409434        view = '%s_%s'% (hostObject,joinObjectName) 
    410435        hidden_columns = self.load_columns_visibility_state(view) 
    411436 
     
    417442                         joinType=joinType, 
    418443                         joinObjectName=joinObjectName, 
    419444                         hostObject=hostObject, 
     445                         total = count, 
    420446                         hidden_columns=hidden_columns) 
    421447        if not rows: 
    422448            return joinsDict 
     
    888914        return self.object_joins(objectName,id,join,joinType,joinObjectName) 
    889915    updateColumnsJoinView = turbogears.expose(format="json")(updateColumnsJoinView) 
    890916 
    891     def joins(self,objectName,id,join,joinType,joinObjectName): 
     917    def joins(self,objectName,id,join,joinType,joinObjectName,start): 
    892918        """Return a JSON structure containing a list joins for  
    893919           the requested object's joinMethodName 
    894920 
     
    904930           @type joinObjectName: string 
    905931        """ 
    906932        self.check_access() 
    907         return self.object_joins(objectName,id,join,joinType,joinObjectName) 
     933        start = int(start) 
     934        myDict = self.object_joins(objectName,id,join,joinType,joinObjectName, start = start) 
     935        myDict['objectName'] = objectName 
     936        myDict['id'] = id 
     937        myDict['joinName'] = join 
     938        myDict['joinType'] = joinType 
     939        myDict['joinObjectName'] = joinObjectName 
     940        myDict['start'] = start 
     941        myDict['page_size'] = 10 
     942        return myDict 
    908943    joins = turbogears.expose(format="json")(joins) 
    909944 
    910945    def instance(self,objectName,id):