ó
H`¾Tc           @   s  d  Z  d d l m Z m Z m Z d d l m Z d d l m Z m Z m Z	 m
 Z
 m Z m Z m Z d d l m Z e j e j j d d ƒ d	 e
 j f d
 „  ƒ  Yƒ ƒ Z d e j f d „  ƒ  YZ d e f d „  ƒ  YZ d e e f d „  ƒ  YZ d „  Z d e f d „  ƒ  YZ d S(   s‚   Dynamic collection API.

Dynamic collections act like Query() objects for read operations and support
basic add/delete mutation.

i   (   t   logt   utilt   exc(   t	   operatorsi   (   t
   attributest   object_sessionR   t
   strategiest   object_mapperR   t
   properties(   t   Queryt   lazyt   dynamict
   DynaLoaderc           B   s   e  Z d  „  Z RS(   c         C   s   t  |  _ |  j s+ t j d |  j ƒ ‚ n  t j |  | d t  d t  d t d |  j j	 d |  j j
 d |  j j d |  j j ƒd  S(	   Nst   On relationship %s, 'dynamic' loaders cannot be used with many-to-one/one-to-one relationships and/or uselist=False.t	   useobjectt   uselistt
   impl_classt   target_mappert   order_byt   query_classt   backref(   t   Truet   is_class_levelR   R   t   InvalidRequestErrort   parent_propertyR   t   _register_attributet   DynamicAttributeImplt   mapperR   R   t   back_populates(   t   selfR   (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt   init_class_attribute   s    		(   t   __name__t
   __module__R   (    (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR      s   R   c           B   s  e  Z e Z e Z e Z e Z d d  „ Z	 e
 j d „ Z d e
 j d „ Z e j d „  ƒ Z e j d „  ƒ Z d d „ Z d d „ Z d „  Z e
 j d e d „ Z d d	 „ Z d
 „  Z d „  Z e
 j d „ Z e
 j d „ Z e
 j d „ Z e
 j d „ Z e
 j d „ Z e
 j d „ Z RS(   c   	      K   sw   t  t |  ƒ j | | | | |  | |  _ | |  _ | sF t |  _ n- t | j ƒ  k rd | |  _ n t	 | ƒ |  _ d  S(   N(
   t   superR   t   __init__R   R   t   AppenderQueryR   t   AppenderMixint   mrot   mixin_user_query(	   R   t   class_t   keyt   typecallablet   dispatchR   R   R   t   kw(    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR!   5   s    		c         C   s7   | t  j @s# |  j | t  j ƒ j S|  j |  | ƒ Sd  S(   N(   R   t   SQL_OKt   _get_collection_historyt   PASSIVE_NO_INITIALIZEt   added_itemsR   (   R   t   statet   dict_t   passive(    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt   getC   s    c         C   s=   | t  j @s  |  j | | ƒ j S|  j | | ƒ } | j Sd  S(   N(   R   R+   R,   R.   t   added_plus_unchanged(   R   R/   R0   t	   user_dataR1   t   history(    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt   get_collectionJ   s
    	
c         C   s   t  j |  t  j ƒ S(   N(   R   t   Eventt	   OP_APPEND(   R   (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt   _append_tokenS   s    c         C   s   t  j |  t  j ƒ S(   N(   R   R7   t	   OP_REMOVE(   R   (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt   _remove_tokenW   s    c         C   s˜   | d  k r! |  j | | ƒ } n  | j | ƒ x/ |  j j D]! } | | | | pV |  j ƒ } q; W|  j r” | d  k	 r” |  j t j	 | ƒ | t
 ƒ n  d  S(   N(   t   Nonet   _modified_eventt	   add_addedR)   t   appendR9   t   trackparentt   sethasparentR   t   instance_stateR   (   R   R/   R0   t   valuet	   initiatort   collection_historyt   fn(    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt   fire_append_event[   s    c         C   s–   | d  k r! |  j | | ƒ } n  | j | ƒ |  j rb | d  k	 rb |  j t j | ƒ | t ƒ n  x- |  j j	 D] } | | | | pŠ |  j
 ƒ qo Wd  S(   N(   R<   R=   t   add_removedR@   RA   R   RB   t   FalseR)   t   removeR;   (   R   R/   R0   RC   RD   RE   RF   (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt   fire_remove_eventh   s    c         C   s_   |  j  | j k r. t |  | ƒ | j |  j  <n  | j | |  t j ƒ t | |  j  <| j |  j  S(   N(   R'   t   committed_statet   CollectionHistoryR=   R   t	   NEVER_SETR   (   R   R/   R0   (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR=   u   s    	
c         C   sI   | r | j  |  j  k r d  S| r2 | d  k r2 d  S|  j | | | ƒ d  S(   N(   t   parent_tokenR<   t   _set_iterable(   R   R/   R0   RC   RD   R1   t	   check_oldt   pop(    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt   setƒ   s
    c         C   s  t  | ƒ } | j r3 t j |  j | | ƒ ƒ } n  |  j | | ƒ } | j sZ | j } n | j | j ƒ } t j } | j | ƒ }	 | | ƒ j	 |	 ƒ }
 | j	 |	 ƒ } x9 | D]1 } | |
 k r¯ |  j
 | | | d  d | ƒq¯ q¯ Wx* | D]" } |  j | | | d  d | ƒqë Wd  S(   NRE   (   t   listt   has_identityR   t   IdentitySetR2   R=   R.   t   uniont   intersectiont
   differenceRG   R<   RK   (   R   R/   R0   t   iterablet   adaptert
   new_valuest   old_collectionRE   t   idsett	   constantst	   additionst   removalst   member(    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRP      s&    			c         O   s   t  ƒ  ‚ d  S(   N(   t   NotImplementedError(   R   t   argst   kwargs(    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt   delete§   s    c         C   s   t  d ƒ ‚ d  S(   Ns7   Dynamic attributes don't support collection population.(   Rc   (   R   R/   R0   RC   (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt   set_committed_valueª   s    c         C   s   |  j  | | ƒ } | j ƒ  S(   N(   R,   t
   as_history(   R   R/   R0   R1   t   c(    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt   get_history®   s    c         C   s;   |  j  | | ƒ } g  | j D] } t j | ƒ | f ^ q S(   N(   R,   t	   all_itemsR   RB   (   R   R/   R0   R1   Ri   t   x(    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt   get_all_pending²   s    c         C   se   |  j  | j k r% | j |  j  } n t |  | ƒ } | j r] | t j @r] t |  | d | ƒS| Sd  S(   Nt   apply_to(   R'   RL   RM   RU   R   t   INIT_OK(   R   R/   R1   Ri   (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR,   ¼   s    c         C   s)   | |  k	 r% |  j  | | | | ƒ n  d  S(   N(   RG   (   R   R/   R0   RC   RD   R1   (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR?   Ç   s    c         C   s)   | |  k	 r% |  j  | | | | ƒ n  d  S(   N(   RK   (   R   R/   R0   RC   RD   R1   (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRJ   Ì   s    c         C   s    |  j  | | | | d | ƒd  S(   NR1   (   RJ   (   R   R/   R0   RC   RD   R1   (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRR   Ñ   s    N(    R   R   R   t   uses_objectsRI   t   accepts_scalar_loadert   supports_populationt
   collectionR<   R!   R   t   PASSIVE_OFFR2   R-   R6   R   t   memoized_propertyR9   R;   RG   RK   R=   RS   RP   Rf   Rg   Rj   Rm   R,   R?   RJ   RR   (    (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR   /   s0   				R#   c           B   st   e  Z d
 Z d  „  Z d „  Z e e d „  ƒ Z d „  Z d „  Z d „  Z	 d
 d „ Z
 d „  Z d „  Z d	 „  Z RS(   c         C   s   t  t |  ƒ j | j d  ƒ | j ƒ  |  _ } | |  _ t | ƒ } | j	 |  j j
 } | j t j | d t d t ƒ|  _ |  j j r™ |  j j |  _ n  d  S(   Nt   value_is_parentt   alias_secondary(   R    R#   R!   R   R<   t   objt   instancet   attrR   t   _propsR'   t   compareR   t   eqR   RI   t
   _criterionR   t	   _order_by(   R   Rz   R/   Ry   R   t   prop(    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR!   Ù   s    	c         C   sg   t  |  j ƒ } | d  k	 rI |  j rI | j rI |  j | k rI | j ƒ  n  t j |  j ƒ s_ d  S| Sd  S(   N(   R   Ry   R<   t	   autoflusht   flusht   orm_utilRU   (   R   t   sess(    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt   sessioné   s    c         C   s   d  S(   N(   R<   (   t   sRl   (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt   <lambda>ò   s    c         C   sW   |  j  } | d  k r@ t |  j j t j |  j ƒ t j ƒ j	 ƒ St |  j
 | ƒ ƒ Sd  S(   N(   R…   R<   t   iterRz   R,   R   RB   Ry   R-   R.   t   _clone(   R   R„   (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt   __iter__ô   s    	c         C   sZ   |  j  } | d  k r@ |  j j t j |  j ƒ t j ƒ j | ƒ S|  j	 | ƒ j
 | ƒ Sd  S(   N(   R…   R<   Rz   R,   R   RB   Ry   R-   t   indexedR‰   t   __getitem__(   R   t   indexR„   (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRŒ   ý   s    		c         C   sW   |  j  } | d  k r@ t |  j j t j |  j ƒ t j ƒ j	 ƒ S|  j
 | ƒ j ƒ  Sd  S(   N(   R…   R<   t   lenRz   R,   R   RB   Ry   R-   R.   R‰   t   count(   R   R„   (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR     s    	c         C   s³   |  j  } | d  k r[ t | ƒ } | d  k r[ t j d t j | ƒ |  j j f ƒ ‚ q[ n  |  j	 r‚ |  j	 |  j j
 d | ƒ} n | j |  j j
 ƒ } |  j | _ |  j | _ | S(   NsŒ   Parent instance %s is not bound to a Session, and no contextual session is established; lazy load operation of attribute '%s' cannot proceedR…   (   Ry   R<   R   t   orm_exct   DetachedInstanceErrorRƒ   t   instance_strRz   R'   R   R   t   queryR~   R   (   R   R„   Ry   R“   (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR‰     s    	%	c         C   sF   x? | D]7 } |  j  j t j |  j ƒ t j |  j ƒ | d  ƒ q Wd  S(   N(   Rz   R?   R   RB   Ry   t   instance_dictR<   (   R   t   iteratort   item(    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt   extend'  s    	c         C   s5   |  j  j t j |  j ƒ t j |  j ƒ | d  ƒ d  S(   N(   Rz   R?   R   RB   Ry   R”   R<   (   R   R–   (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR?   -  s    	c         C   s5   |  j  j t j |  j ƒ t j |  j ƒ | d  ƒ d  S(   N(   Rz   RJ   R   RB   Ry   R”   R<   (   R   R–   (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRJ   2  s    	N(   R   R   R<   R   R!   R…   t   propertyRŠ   RŒ   R   R‰   R—   R?   RJ   (    (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR#   Ö   s   											R"   c           B   s   e  Z d  Z RS(   sB   A dynamic query that supports basic collection storage operations.(   R   R   t   __doc__(    (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR"   8  s   c         C   s*   d |  j  } t | t |  f i |  d 6ƒ S(   sA   Return a new class with AppenderQuery functionality layered over.t   AppenderR   (   R   t   typeR#   (   t   clst   name(    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR%   <  s    RM   c           B   s\   e  Z d  Z d d „ Z e d „  ƒ Z e d „  ƒ Z d „  Z d „  Z	 d „  Z
 d „  Z RS(	   sD   Overrides AttributeHistory to receive append/remove events directly.c         C   sŽ   | rT t  | | ƒ j t ƒ } t j | ƒ |  _ | j |  _ | j |  _ t |  _	 n6 t j ƒ  |  _ t j ƒ  |  _ t j ƒ  |  _ t |  _	 d  S(   N(
   R"   R   RI   R   t   OrderedIdentitySett   unchanged_itemsR.   t   deleted_itemsR   t   _reconcile_collection(   R   Rz   R/   Rn   t   coll(    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR!   E  s    c         C   s   t  |  j j |  j ƒ ƒ S(   N(   RT   R.   RW   RŸ   (   R   (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR3   R  s    c         C   s%   t  |  j j |  j ƒ j |  j ƒ ƒ S(   N(   RT   R.   RW   RŸ   R    (   R   (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRk   V  s    c         C   sŠ   |  j  rH |  j j |  j ƒ } |  j j |  j ƒ } |  j j | ƒ } n |  j |  j |  j } } } t j t | ƒ t | ƒ t | ƒ ƒ S(   N(	   R¡   R.   RY   RŸ   R    RX   R   t   HistoryRT   (   R   t   addedt   deletedt	   unchanged(    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRh   [  s    			c         C   s   t  |  j ƒ | S(   N(   RT   R.   (   R   R   (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR‹   j  s    c         C   s   |  j  j | ƒ d  S(   N(   R.   t   add(   R   RC   (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR>   m  s    c         C   s6   | |  j  k r" |  j  j | ƒ n |  j j | ƒ d  S(   N(   R.   RJ   R    R§   (   R   RC   (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRH   p  s    N(   R   R   R™   R<   R!   R˜   R3   Rk   Rh   R‹   R>   RH   (    (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRM   B  s   			N(   R™   t    R    R   R   t   sqlR   R   R   Rƒ   R   R   R   R   R“   R	   t   class_loggert   RelationshipPropertyt   strategy_fort   AbstractRelationshipLoaderR   t   AttributeImplR   t   objectR#   R"   R%   RM   (    (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt   <module>   s   4§b	