Show
Ignore:
Timestamp:
03/13/10 12:31:24 (6 months ago)
Author:
erikj
Message:

prepare expanded search and sorting of query proxy models

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/camelot/view/proxy/queryproxy.py

    r1170 r1186  
    3333logger = logging.getLogger('camelot.view.proxy.queryproxy') 
    3434 
    35 from collection_proxy import CollectionProxy, stripped_data_to_unicode, \ 
    36                              strip_data_from_object, tool_tips_from_object, \ 
    37                              background_colors_from_object 
    38 from camelot.view.model_thread import model_function, gui_function 
     35from collection_proxy import CollectionProxy, strip_data_from_object 
     36from camelot.view.model_thread import model_function, gui_function, post 
    3937 
    4038 
     
    5048        logger.debug('initialize query table') 
    5149        self._query_getter = query_getter 
     50        self._sort_decorator = None 
    5251        #rows appended to the table which have not yet been flushed to the 
    5352        #database, and as such cannot be a result of the query 
     
    5655                                 columns_getter, max_number_of_rows=10, edits=None) 
    5756 
     57    def get_query_getter(self): 
     58        if not self._sort_decorator: 
     59            return self._query_getter 
     60        else: 
     61             
     62            def sorted_query_getter(): 
     63                return self._sort_decorator(self._query_getter()) 
     64             
     65            return sorted_query_getter 
     66     
    5867    @model_function 
    5968    def _clean_appended_rows(self): 
     
    6978    def getRowCount(self): 
    7079        self._clean_appended_rows() 
    71         return self._query_getter().count() + len(self._appended_rows) 
     80        return self.get_query_getter()().count() + len(self._appended_rows) 
    7281 
    7382    @gui_function 
     
    8089         
    8190        def collection_getter(): 
    82             return self._query_getter().all() 
     91            return self.get_query_getter()().all() 
    8392         
    8493        return collection_getter 
     
    8695    @gui_function 
    8796    def sort( self, column, order ): 
    88         pass    
     97         
     98        def create_set_sort_decorator(column, order): 
     99 
     100            def set_sort_decorator(): 
     101                from sqlalchemy import orm 
     102                from sqlalchemy.exceptions import InvalidRequestError 
     103                field_name = self._columns[column][0] 
     104                class_attribute = getattr(self.admin.entity, field_name) 
     105                mapper = orm.class_mapper(self.admin.entity) 
     106                try: 
     107                    property = mapper.get_property( 
     108                        field_name, 
     109                        resolve_synonyms=True 
     110                    ) 
     111                except InvalidRequestError: 
     112                    # 
     113                    # If the field name is not a property of the mapper, we cannot 
     114                    # sort it using sql 
     115                    # 
     116                    return self.rows 
     117                 
     118                def create_sort_decorator(class_attribute, order): 
     119                     
     120                    def sort_decorator(query): 
     121                        if order: 
     122                            return query.order_by(class_attribute.desc()) 
     123                        else: 
     124                            return query.order_by(class_attribute) 
     125                     
     126                    return sort_decorator 
     127                 
     128                 
     129                self._sort_decorator = create_sort_decorator(class_attribute, order) 
     130                return self.rows 
     131                     
     132            return set_sort_decorator 
     133             
     134        post( create_set_sort_decorator(column, order), self._refresh_content ) 
    89135 
    90136    def append(self, o): 
     
    103149    def getData(self): 
    104150        """Generator for all the data queried by this proxy""" 
    105         for _i,o in enumerate(self._query_getter().all()): 
     151        for _i,o in enumerate(self.get_query_getter()().all()): 
    106152            yield strip_data_from_object(o, self.getColumns()) 
    107153 
     
    109155    def _extend_cache(self, offset, limit): 
    110156        """Extend the cache around row""" 
    111         q = self._query_getter().offset(offset).limit(limit) 
     157        q = self.get_query_getter()().offset(offset).limit(limit) 
    112158        columns = self.getColumns() 
    113159        for i, o in enumerate(q.all()): 
     
    136182                pass 
    137183            # momentary hack for list error that prevents forms to be closed 
    138             res = self._query_getter().offset(row) 
     184            res = self.get_query_getter()().offset(row) 
    139185            if isinstance(res, list): 
    140186                res = res[0]