Changeset 3526

Show
Ignore:
Timestamp:
10/19/07 15:14:37 (1 year ago)
Author:
roger
Message:

Fixed pagination of Query objects (sqlalchemy), thanks to Jonathan Hitchcock and Remi Jolin (#1434).

Paginate can now order a SA Query object by attributes from related objects (#1582).
Notice that it only works with SQLAlchemy 0.3.x at the moment... (see: #1591).

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/1.1/CHANGELOG.txt

    r3511 r3526  
    99*Features* 
    1010    * "tg-admin sql" is now more powerful for SQLAlchemy. Ticket #1418 
     11    * Paginate allows ordering by attributes from related objects (SQLAlchemy 
     12      Query objects only). Ticket #1582. 
    1113 
    1214*Fixes* 
     
    1820      error when paginating Query objects (sqlalchemy) and ordering by 4 or more 
    1921      columns. 
     22    * Ticket #1434: Fixed pagination of Query objects (SQLAlchemy). The first 
     23      patch assumed that Query objects have a _query attribute which holds the 
     24      query object, which is only true for SelectResults objects. 
    2025 
    2126*Contributors* 
    2227 
    23 Paul Johnston, Roger Demetrescu 
     28Paul Johnston, Remi Jolin, Jonathan Hitchcock, Roger Demetrescu 
    2429 
    2530 
  • branches/1.1/turbogears/paginate.py

    r3511 r3526  
    342342        col = getattr(var_data.sourceClass.q, colname, None) 
    343343 
    344     elif isinstance(var_data, SASelectResults) or isinstance(var_data, Query)
     344    elif isinstance(var_data, SASelectResults)
    345345        col = getattr( 
    346346                var_data._query.mapper.c, 
     
    348348                None) 
    349349 
     350    elif isinstance(var_data, Query): 
     351        col = getattr( 
     352                var_data.mapper.c, 
     353                colname[len(var_data.mapper.column_prefix or ''):], 
     354                None) 
     355        #if no attribute is found, let's try searching for 'foreign' objects... 
     356        # eg.: address.user.occupation.name 
     357        if not col and colname.find('.'): 
     358            seq = colname.split('.') 
     359            mapper = var_data.mapper 
     360            for propname in seq[:-1]: 
     361                prop = mapper.properties.get(propname) 
     362                if not prop: 
     363                    break 
     364                mapper = prop.mapper 
     365            # last item from split should be a simple attribute 
     366            col = getattr( 
     367                    mapper.c, 
     368                    seq[-1][len(mapper.column_prefix or ''):], 
     369                    None) 
    350370    else: 
    351371        raise StandardError, 'expected SelectResults' 
     
    372392 
    373393# Ordering re: 
    374 ordering_expr = re.compile(r"('\w+'): ?\[(\d+), ?(True|False)\]") 
     394ordering_expr = re.compile(r"('\w+(\.\w+)*'): ?\[(\d+), ?(True|False)\]") 
    375395 
    376396def convert_ordering(ordering): 
     
    392412            for ordering_info in ordering_info_find: 
    393413                ordering_key = str(ordering_info[0]).strip("'") 
    394                 ordering_order = int(ordering_info[1]) 
    395                 ordering_reverse = bool(ordering_info[2] == 'True') 
     414                ordering_order = int(ordering_info[2]) 
     415                ordering_reverse = bool(ordering_info[3] == 'True') 
    396416                new_ordering[ordering_key] = [ordering_order, 
    397417                                              ordering_reverse]