Edgewall Software

Ticket #7267: fix-report-pagination-r7157.diff

File fix-report-pagination-r7157.diff, 6.1 KB (added by cboos, 4 years ago)

Should fix the scoping issues for report pagination

  • trac/ticket/report.py

     
    287287                'title': title, 'description': description, 
    288288                'args': args, 'message': None, 'paginator':None} 
    289289 
    290         self.page = int(req.args.get('page', '1')) 
     290        page = int(req.args.get('page', '1')) 
     291        limit = self.items_per_page 
    291292        if req.args.get('format', '') == 'rss': 
    292             self.limit = self.items_per_page_rss 
    293         else: 
    294             self.limit = self.items_per_page 
    295         self.offset = (self.page - 1) * self.limit 
     293            limit = self.items_per_page_rss 
     294        offset = (page - 1) * limit 
     295        user = req.args.get('USER', None) 
    296296 
    297297        try: 
    298             cols, results = self.execute_report(req, db, id, sql, args) 
     298            cols, results, num_items = self.execute_paginated_report( 
     299                    req, db, id, sql, args, limit, offset) 
    299300            results = [list(row) for row in results] 
    300301            numrows = len(results) 
    301302 
     
    304305                                error=to_unicode(e)) 
    305306            return 'report_view.html', data, None 
    306307        paginator = None 
    307         if id != -1 and self.limit > 0: 
    308             self.asc = req.args.get('asc', None) 
    309             self.sort = req.args.get('sort', None) 
    310             self.USER = req.args.get('USER', None) 
    311             paginator = Paginator(results, self.page - 1, self.limit, 
    312                                   self.num_items) 
     308        if id != -1 and limit > 0: 
     309            asc = req.args.get('asc', None) 
     310            sort_col = req.args.get('sort', None) 
     311            paginator = Paginator(results, page - 1, limit, num_items) 
    313312            data['paginator'] = paginator 
    314313            if paginator.has_next_page: 
    315                 next_href = req.href.report(id, asc=self.asc, sort=self.sort, 
    316                                             USER=self.USER, page=self.page + 1) 
     314                next_href = req.href.report(id, asc=asc, sort=sort_col, 
     315                                            USER=user, page=page + 1) 
    317316                add_link(req, 'next', next_href, _('Next Page')) 
    318317            if paginator.has_previous_page: 
    319                 prev_href = req.href.report(id, asc=self.asc, sort=self.sort, 
    320                                             USER=self.USER, page=self.page - 1) 
     318                prev_href = req.href.report(id, asc=asc, sort=sort_col, 
     319                                            USER=user, page=page - 1) 
    321320                add_link(req, 'prev', prev_href, _('Previous Page')) 
    322321 
    323322            pagedata = [] 
    324323            shown_pages = paginator.get_shown_pages(21) 
    325             for page in shown_pages: 
    326                 pagedata.append([req.href.report(id, asc=self.asc, 
    327                                  sort=self.sort, USER=self.USER, page=page), 
    328                                  None, str(page), _('Page %(num)d', num=page)])           
     324            for p in shown_pages: 
     325                pagedata.append([req.href.report(id, asc=asc, sort=sort_col,  
     326                                                 USER=user, page=p), 
     327                                 None, str(p), _('Page %(num)d', num=p)])           
    329328            fields = ['href', 'class', 'string', 'title'] 
    330329            paginator.shown_pages = [dict(zip(fields, p)) for p in pagedata] 
    331330            paginator.current_page = {'href': None, 'class': 'current', 
     
    489488                                  for rg in row_groups for row in rg[1]]) 
    490489                    #FIXME: I am not sure the extra args are necessary 
    491490                    req.session['query_href'] = \ 
    492                         req.href.report(id, asc=self.asc, sort=self.sort, 
    493                                         USER=self.USER, page=self.page) 
     491                        req.href.report(id, asc=asc, sort=sort_col, 
     492                                        USER=user, page=page) 
    494493                    # Kludge: we have to clear the other query session 
    495494                    # variables, but only if the above succeeded  
    496495                    for var in ('query_constraints', 'query_time'): 
     
    520519                     'text/plain') 
    521520 
    522521    def execute_report(self, req, db, id, sql, args): 
     522        """Execute given sql report (0.10 backward compatibility method) 
     523         
     524        :see: ``execute_paginated_report`` 
     525        """ 
     526        return self.execute_paginated_report(req, db, id, sql, args)[:2] 
     527 
     528    def execute_paginated_report(self, req, db, id, sql, args,  
     529                                 limit=0, offset=0): 
    523530        sql, args = self.sql_sub_vars(sql, args, db) 
    524531        if not sql: 
    525532            raise TracError(_('Report %(num)s has no SQL query.', num=id)) 
     
    527534        self.log.debug('Request args' + str(req.args)) 
    528535        cursor = db.cursor() 
    529536 
    530         if id != -1 and self.limit > 0: 
     537        num_items = 0 
     538        if id != -1 and limit > 0: 
    531539            # The number of tickets is obtained. 
    532540            count_sql = 'SELECT COUNT(*) FROM (' + sql + ') AS tab' 
    533541            cursor.execute(count_sql, args) 
    534542            self.env.log.debug("Query SQL(Get num items): " + count_sql) 
    535543            for row in cursor: 
    536544                pass 
    537             self.num_items = row[0] 
     545            num_items = row[0] 
    538546     
    539547            # The column name is obtained. 
    540548            get_col_name_sql = 'SELECT * FROM ( ' + sql + ' ) AS tab LIMIT 1' 
     
    565573                order = dlmt.join(order_cols) 
    566574                order_by = " ".join([' ORDER BY' ,order, asc_str[asc_idx]]) 
    567575            sql = " ".join(['SELECT * FROM (', sql, ') AS tab', order_by]) 
    568             sql =" ".join([sql, 'LIMIT', str(self.limit), 'OFFSET', 
    569                            str(self.offset)]) 
     576            sql =" ".join([sql, 'LIMIT', str(limit), 'OFFSET', str(offset)]) 
    570577            self.env.log.debug("Query SQL: " + sql) 
    571578        cursor.execute(sql, args) 
    572579        self.env.log.debug("Query SQL: " + sql) 
     
    576583 
    577584        db.rollback() 
    578585 
    579         return cols, info 
     586        return cols, info, num_items 
    580587 
    581588    def get_var_args(self, req): 
    582589        report_args = {}