Ñò
ë{½Jc           @   sÿ  d  d k  Z  d  d k l Z d  d k Z d  d k Z d  d k Z y d  d k Z Wn e j
 o d Z n Xy d  d k	 Z	 Wn e j
 o d Z	 n Xd  d k
 Z
 d  d k l Z d  d k l Z d  d k l Z d  d k l Z d  d k l Z d  d k l Z e i d	 ƒ Z d
 i ƒ  Z d i ƒ  Z d a d d" d „  ƒ  YZ d d# d „  ƒ  YZ d d d d d d d „ Z d „  Z  e i! e  ƒ d d$ d „  ƒ  YZ" d d „ Z# d „  Z$ d „  Z% d „  Z& d „  Z' e( d „ Z) e( d „ Z* e+ d  „ Z, e+ d! „ Z- d S(%   iÿÿÿÿN(   t   ceil(   t   redirect(   t   weak_signature_decorator(   t   variable_providers(   t   variable_encode(   t   PaginateDataGrid(   t   add_tg_argss   turbogears.paginates   mssql maxdb sybases   mssql maxdb accesst   attrwrapperc           B   s    e  Z d  Z d „  Z d „  Z RS(   s,   Helper class for accessing objec attributes.c         C   s   | |  _  d  S(   N(   t   name(   t   selfR   (    (    sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pyt   __init__(   s    c         C   s0   x) |  i  i d ƒ D] } t | | ƒ } q W| S(   Nt   .(   R   t   splitt   getattr(   R	   t   objR   (    (    sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pyt   __call__*   s     (   t   __name__t
   __module__t   __doc__R
   R   (    (    (    sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pyR   &   s   	t   itemwrapperc           B   s    e  Z d  Z d „  Z d „  Z RS(   s$   Helper class for dicitionary access.c         C   s   | |  _  d  S(   N(   R   (   R	   R   (    (    sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pyR
   1   s    c         C   s   | |  i  S(   N(   R   (   R	   R   (    (    sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pyR   3   s    (   R   R   R   R
   R   (    (    (    sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pyR   /   s   	t    i
   i    i   iè  c            s+   ‡  ‡ ‡ ‡ ‡ ‡ ‡ f d †  } t  | ƒ S(   s%	  The famous TurboGears paginate decorator.

    @param var_name: the variable name that the paginate decorator will try
    to control. This key must be present in the dictionnary returned from your
    controller in order for the paginate decorator to be able to handle it.
    @type var_name: string

    @param default_order: The column name(s) that will be used to orde
    pagination results. Due to the way pagination is implemented specifying a
    default_order will override any result ordering performed in the controller.
    @type default_order: string or a list of strings. Any string starting with
    "-" (minus sign) indicates a reverse order for that field/column.

    @param limit: The hard-coded limit that the paginate decorator will impose
    on the number of "var_name" to display at the same time. This value can be
    overridden by the use of the dynamic_limit keyword argument.
    @type limit: integer

    @param max_limit: The maximum number to which the imposed limit can be
    increased using the "var_name"_tgp_limit keyword argument in the URL.
    If this is set to 0, no dynamic change at all will be allowed;
    if it is set to None, any change will be allowed.
    @type max_limit: int

    @param max_pages: Used to generate the tg.paginate.pages variable. If the
    page count is larger than max_pages, tg.paginate.pages will only contain
    the page numbers surrounding the current page at a distance of max_pages/2.
    A zero value means that all pages will be shown, no matter how much.
    @type max_pages: integer

    @param max_sort: The maximum number of records that will be sorted in
    memory if the data cannot be sorted using SQL. If set to 0, sorting in
    memory will never be performed; if set to None, no limit will be imposed.
    @type max_sort: integer

    @param dynamic_limit: If specified, this parameter must be the name
    of a key present in the dictionary returned by your decorated
    controller. The value found for this key will be used as the limit
    for our pagination and will override the other settings, the hard-coded
    one declared in the decorator itself AND the URL parameter one.
    This enables the programmer to store a limit settings inside the
    application preferences and then let the user manage it.
    @type dynamic_limit: string

    c      	      se   t  i i ‰  ‡ ‡ ‡ ‡  ‡ ‡ ‡ ‡ f d †  } ˆ  d t ƒ p! t |  ‡ f d †  d Dƒ ƒ n | S(	   Nc      %      s  d  ‡ ‡  f d † } | d ƒ } | d  j o
 d } nŸ | d j o
 d  } nˆ y' t | ƒ } | d j  o
 t ‚ n Wn] t t f j
 oK d } ˆ d ƒ o1 | t i i ˆ d <t t i i t i i ƒ qÖ n XyM t | d ƒ ƒ } ˆ d  j	 o* ˆ d j o
 t ‚ n t	 | ˆ ƒ } n Wn t t f j
 o ˆ } n X| d	 ƒ } | d
 ƒ } t
 i d | | | ƒ |  | ˆ  Ž  } t | t ƒ p | Sy | ˆ }	 Wn# t j
 o t d ˆ ƒ ‚ n Xt |	 d ƒ o: t |	 ƒ o- |	 ƒ  }	 t |	 d ƒ p t d ƒ ‚ qn ˆ o> y | ˆ }
 Wn# t j
 o t d ˆ ƒ ‚ n X|
 } n | o t | ƒ i d ƒ } n+ ˆ p g  } t | t ƒ o | g } n | o0 t | ƒ } t
 i d | | ƒ t | | ƒ n t
 i d | ƒ y t |	 ƒ } WnX t j
 oL y |	 i ƒ  p d } WqWt j
 o t |	 ƒ }	 t |	 ƒ } qWXn X| o: t |	 | ˆ d  j p d | j  o
 ˆ j n ƒ }	 n | p | p d } n t t t | ƒ | ƒ ƒ } | d  j oQ t | d ƒ } ˆ d ƒ o1 | t i i ˆ d <t t i i t i i ƒ qˆn_ | | j oQ t | d ƒ } ˆ d ƒ o1 | t i i ˆ d <t t i i t i i ƒ qˆn | d | } t | | ˆ ƒ } t t i i i ƒ  ƒ } | i  d d  ƒ x3 | i! ƒ  D]% } | i" ˆ d ƒ o | | =qÝqÝWt# d | d | d | d | d | d	 | d
 | d | d ˆ ƒ 	} | t i _$ t t i d ƒ p t ƒ  t i _% n | t i i% ˆ <| | } t
 i d | | ƒ t& d  j o™ ˆ d d  ƒ a& t& d  j oy t' a& ˆ d d  ƒ i d! d ƒ d } ˆ d" d  ƒ i d! d ƒ d } | t( j p | t) j o t* a& t
 i+ d# ƒ qFqJn t& oE t, |	 |  ƒ }	 x t- | ƒ D] } |	 i. ƒ  qnWt |	 ƒ | ˆ <n y |	 | | !| ˆ <Wnh t j
 o\ x t- | ƒ D] } |	 i. ƒ  qÉWg  } t- | | ƒ D] } | |	 i. ƒ  qñ~ | ˆ <n X| S($   Nc            s   ˆ i  ˆ  d |  | ƒ S(   Nt   _tgp_(   t   pop(   R   t   default(   t   var_namet   kw(    sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pyt   kwpopm   s    t   noi   t   lasts!   paginate.redirect_on_out_of_ranget   _tgp_not   limiti    t   ordert   orderings,   paginate params: page=%s, limit=%s, order=%ss0   paginate: var_name (%s) not found in output dictt   __getitem__s#   Paginate variable is not a sequences5   paginate: dynamic_limit (%s) not found in output dictt   ,s%   paginate: ordering was %s, sort is %ss   paginate: ordering is %ss   paginate.redirect_on_last_pageR	   R   t   current_paget   pagest
   page_countt   input_valuest	   row_countR   t	   paginatess(   paginate: slicing data between %d and %ds   paginate.simulate_offsets   sqlobject.dburis   NOMATCH:t   :s   sqlalchemy.dburis_   paginate: simulating OFFSET, paginate may be slow (disable with paginate.simulate_offset=False)(/   t   Nonet   intt
   ValueErrort	   TypeErrort   cherrypyt   requestt   paramsR   t	   path_infot   mint   logt   debugt
   isinstancet   dictt   KeyErrort   hasattrt   callablet   strR   t
   basestringt   sort_orderingt   lent   countt   AttributeErrort   listt	   sort_dataR    t   floatt   maxt   _select_pages_to_showR   t   copyR   t   keyst
   startswitht   Paginatet   paginateR(   t   _simulate_offsett   Falset   _so_no_offsett   _sa_no_offsett   Truet   warningt   itert   xranget   next(   t   funct   argsR   R   t   paget   limit_R   R    t   outputt   var_datat	   dyn_limitR'   R%   t   offsett   pages_to_showR&   t	   input_keyt   paginate_instancet   endpointt   so_dbt   sa_dbt   it   _[1](   t	   max_limitR   R   t   gett	   max_pagest   max_sortt   default_ordert   dynamic_limit(   R   sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pyt	   decoratedk   s   

"
		
	
	1!! 	
	
  2s   tg.strict_parametersc         3   s!   x |  ] } ˆ  d  | Vq Wd S(   R   N(    (   t   .0t   arg(   R   (    sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pys	   <genexpr>  s   	R   R   R   R    (   s   nos   limits   orders   ordering(   t
   turbogearst   configRd   RK   R   (   RS   Ri   (   Re   Rc   Rg   Rf   R   R   Rh   (   Rd   sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pyt   entangleg   s    $¦(   R   (   R   Rg   R   Rc   Re   Rf   Rh   Rn   (    (   Re   Rc   Rg   Rf   R   R   Rh   sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pyRI   7   s    0!°c         C   sp   t  t i d d ƒ } | o |  i t d | ƒ ƒ n t  t i d d ƒ } | o |  i t d | ƒ ƒ n d S(   s7   Auxiliary function for providing the paginate variable.RI   R(   N(   R   R.   R/   R*   t   updateR6   (   t   dRI   R(   (    (    sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pyt   _paginate_var_provider  s    RH   c           B   s&   e  Z d  Z d „  Z d d d „ Z RS(   s%   Class for paginate variable provider.c
   
      C   sM  |	 |  _  | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ | o | d | d p d |  _	 t
 | | | ƒ |  _ | o | d d d j |  _ h | |	 d 6} | o d i | ƒ | |	 d <n |  i i | ƒ | | j  o |  i i h | d |	 d 6| |	 d 6ƒ t i t i i |  i ƒ |  _ |  i i h d |	 d 6| |	 d 6ƒ t i t i i |  i ƒ |  _ n d  |  _ d  |  _ | d j o |  i i h | d |	 d 6| |	 d 6ƒ t i t i i |  i ƒ |  _ |  i i h d |	 d 6| |	 d 6ƒ t i t i i |  i ƒ |  _ n d  |  _ d  |  _ d  S(	   Ni   i    t   -t
   _tgp_limitR"   t   _tgp_orderingR   R   (   R   R$   R   R%   R#   R&   R   R    R'   t
   first_itemR2   t	   last_itemt   reversedt   joinRo   Rl   t   urlR.   R/   R1   t	   href_nextt	   href_lastR*   t	   href_prevt
   href_first(
   R	   R#   R$   R%   R&   R   R   R    R'   R   (    (    sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pyR
   (  sT    									#			c         C   sY   | p d  } |  i i ƒ  } | | |  i d <| o | | |  i d <n t i d | ƒ S(   NR   t
   _tgp_orderR   (   R*   R&   RE   R   Rl   Ry   (   R	   RU   R   t   reverse_orderR&   (    (    sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pyt   get_hrefa  s    N(   R   R   R   R
   R*   R€   (    (    (    sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pyRH   %  s   	9c         C   sº   | d j	 o | d j o‚ |  | d | d d } | | d } | d j  o d t | | ƒ } } q© | | j o" t d | | d ƒ | } } q© n d | } } t | | d ƒ S(   s:   Auxiliary function for getting the range of pages to show.i    i   i   N(   R*   R2   RC   RQ   (   R#   R%   Re   t   startt   end(    (    sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pyRD   m  s    &c         C   s½   y |  i  | ƒ } Wny t j
 om y |  i  d | ƒ } Wn# t j
 o |  i d | ƒ q¹ X|  | =|  i d | o d p d | ƒ n, X|  | =|  i d | o d p d | ƒ d S(   s&   Rearrange ordering based on sort_name.Rr   i    R   N(   t   indexR,   t   insert(   R    t	   sort_nameRƒ   (    (    sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pyR<   }  s    'c         C   sØ   y | i  } WnE t j
 o9 y | i ƒ  } WqU t j
 o | i i  } qU Xn X|  i d ƒ } | i ƒ  t | i p d ƒ }  x> | D]6 } | i | d t	 d t
 ƒ} | p Pn | i  } q‹ Wt | i |  d ƒ S(   s:   Return a column from sqlalchemy var_data based on colname.R   R   t   resolve_synonymst   raiseerrN(   t   mapperR?   t   _mapper_zerot   _queryR   R   R=   t   column_prefixt   get_propertyRN   RK   R   t   cR*   (   t   colnameRX   Rˆ   t	   propnamest   propnamet   prop(    (    sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pyt   sqlalchemy_get_column  s"      c         C   s   t  | i i |  d ƒ S(   s9   Return a column from sqlobject var_data based on colname.N(   R   t   sourceClasst   qR*   (   RŽ   RX   (    (    sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pyt   sqlobject_get_column   s    c      	   C   st   t  o+ y t |  | ƒ SWq2 t j
 o q2 Xn t o+ y t |  | ƒ SWqd t j
 o qd Xn t d ƒ ‚ d S(   s/   Return a column from var_data based on colname.s(   Cannot find columns of paginate variableN(   t
   sqlalchemyR’   R?   t	   sqlobjectR•   R-   (   RŽ   RX   (    (    sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pyt   sql_get_column¤  s    		c         C   s,   | o t  i i |  ƒ St  i i |  ƒ Sd S(   s,   Return an sqlalchemy ordered column for col.N(   R–   t   sqlt   desct   asc(   t   colt
   descending(    (    sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pyt   sqlalchemy_order_col²  s    c         C   s   | o t  i |  ƒ S|  Sd S(   s+   Return an sqlobject ordered column for col.N(   R—   t   DESC(   Rœ   R   (    (    sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pyt   sqlobject_order_col¹  s    c         C   sm   t  o$ t |  t  i i ƒ o t |  | ƒ St o! t |  t i ƒ o t |  | ƒ St	 d t
 |  ƒ ƒ ‚ d S(   s!   Return an ordered column for col.s   Expected Column, but got %sN(   R–   R5   R™   t   ColumnElementRž   R—   t   typest   InstanceTypeR    R-   t   type(   Rœ   t	   ascending(    (    sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pyt   sql_order_colÀ  s
    c            sÏ  y ˆ i  } t t } } WnI t j
 o= y ˆ i } t t } } Wqf t j
 o d
 } qf Xn Xg  } g  } d } }	 x´ | D]¬ }
 |
 d d j o |
 d }
 t } n t	 } | o7 | |
 ˆ ƒ } | o | i
 | | | ƒ ƒ qƒ qò n | p6 | i
 |
 | f ƒ | o |	 d 7}	 q/| d 7} qƒ qƒ W| o | o | | ƒ ‰ n | os| o[t ˆ ƒ ‰ ˆ p ˆ St ˆ d t ƒ o t p t } g  } | D]! } | | | d ƒ | d f q£~ ‰  | d j p |	 d j oe | d j ‰ g  } ˆ  D] } | | d qþ~ ‰  t | ƒ d j o ˆ  d } q ‡  f d †  } nU |	 | j ‰ ‡ ‡ f d †  } g  } ˆ  D] } | | | Œ  qu~ ‰  ‡  f d †  } ˆ i d | d ˆ ƒ qËt i d	 ƒ n ˆ S(   s¥   Sort data based on ordering.

    Tries to sort the data using SQL whenever possible,
    otherwise sorts the data as list in memory unless in_memory is false.

    i    Rr   i   c            s%   g  } ˆ  D] } | | |  ƒ q ~ S(    (    (   t   rowRb   t   key(   RF   (    sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pyt   <lambda>ü  s    c            sž   ˆ | j o ˆ St  ˆ ˆ ƒ ‰  y t t ˆ  ƒ ƒ ‰  Wn* t j
 o ˆ  i ƒ  ‡  ‡ f d †  SXˆ  i ƒ  t d „  t ˆ  ƒ Dƒ ƒ ‰  ‡  ‡ f d †  Sd  S(   Nc            s   ˆ  i  ˆ |  ƒ ƒ S(    (   Rƒ   (   R§   (   RF   R¨   (    sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pyR©     s    c         s   s&   x |  ] \ } } | | f Vq Wd  S(   N(    (   Rj   t   nt   k(    (    sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pys	   <genexpr>  s   	 c            s   ˆ  ˆ |  ƒ S(    (    (   R§   (   RF   R¨   (    sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pyR©     s    (   t   mapR@   t   setR-   t   sortR6   t	   enumerate(   R¨   R   (   t   reverset   data(   RF   R¨   sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pyt   reverse_keyÿ  s    

c            s%   g  } ˆ  D] } | | |  ƒ q ~ S(    (    (   R§   Rb   R¨   (   RF   (    sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pyR©     s    R¨   R°   s'   paginate: sorting in memory not allowedN(   t   order_byR’   Rž   R?   t   orderByR•   R    R*   RN   RK   t   appendR@   R5   R6   R   R   R=   R®   R3   R4   (   R±   R    t	   in_memoryR³   t
   get_columnt	   order_colt
   order_colst   key_colst   num_ascendingt   num_descendingR   R   Rœ   t   wrapperRb   t   _[2]R¨   R²   t   _[3](    (   RF   R±   R°   sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pyRA   É  sd    		
 

!5%'(    (    (    (.   R¢   t   mathR    t   loggingt   warningsR.   R—   t   ImportErrorR*   R–   Rl   t   turbogears.controllersR   t   turbogears.decoratorR   t   turbogears.viewR   t   formencode.variabledecodeR   t   turbogears.widgetsR   t   turbogears.utilR   t	   getLoggerR3   R   RL   RM   RJ   R   R   RI   Rq   Rµ   RH   RD   R<   R’   R•   R˜   RK   Rž   R    RN   R¦   RA   (    (    (    sq   /afs/athena.mit.edu/user/x/a/xavid/lib/python2.6/site-packages/TurboGears-1.1rc1-py2.6.egg/turbogears/paginate.pyt   <module>   sN   	â	H					