σ
Ώb]c           @   sh  d  Z  d d l m Z d d l m Z d d l m Z d d l m Z d d l m Z d d l m Z d d l m	 Z	 d d	 l m
 Z d d
 l m Z d d l m Z d d l 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
   attributes(   t   exc(   t
   interfaces(   t   object_mapper(   t   object_session(   t
   properties(   t
   strategies(   t   util(   t   Queryi   (   t   logt   lazyt   dynamict
   DynaLoaderc           B   s   e  Z d    Z RS(   c         C   s§   t  |  _ |  j s+ t j d |  j   n5 |  j j t j t j	 f k r` t
 j d |  j  n  t j |  j | d t  d t 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.s¬   On relationship %s, 'dynamic' loaders cannot be used with many-to-one/one-to-one relationships and/or uselist=False.  This warning will be an exception in a future release.t	   useobjectt
   impl_classt   target_mappert   order_byt   query_class(   t   Truet   is_class_levelt   uselistR   t   InvalidRequestErrort   parent_propertyt	   directionR   t	   ONETOMANYt
   MANYTOMANYR   t   warnR   t   _register_attributet   DynamicAttributeImplt   mapperR   R   (   t   selfR   (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt   init_class_attribute    s&    			(   t   __name__t
   __module__R   (    (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR      s   R   c           B   s  e  Z 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 d e j d e e 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(    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR#   E   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(    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt   get\   s    c         C   s=   | t  j @s  |  j | |  j S|  j | |  } | j Sd  S(   N(   R    R-   R.   R0   t   added_plus_unchanged(   R   R1   R2   t	   user_dataR3   t   history(    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt   get_collectiond   s    c         C   s   t  j |  t  j  S(   N(   R    t   Eventt	   OP_APPEND(   R   (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt   _append_tokenq   s    c         C   s   t  j |  t  j  S(   N(   R    R9   t	   OP_REMOVE(   R   (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt   _remove_tokenu   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   appendR;   t   trackparentt   sethasparentR    t   instance_stateR   (   R   R1   R2   t   valuet	   initiatort   collection_historyt   fn(    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt   fire_append_eventy   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_removedRB   RC   R    RD   t   FalseR+   t   removeR=   (   R   R1   R2   RE   RF   RG   RH   (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt   fire_remove_event   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   R1   R2   (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR?      s
    c	         C   sM  | r | j  |  j  k r d  S| r2 | d  k r2 d  S| }	 t |	  }
 | j rk t j |  j | |   } n  |  j | |  } | j s | 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(   NRG   (   t   parent_tokenR>   t   listt   has_identityR   t   IdentitySetR4   R?   R0   t   uniont   intersectiont
   differenceRI   RM   (   R   R1   R2   RE   RF   R3   t	   check_oldt   popt   _adaptt   iterablet
   new_valuest   old_collectionRG   t   idsett	   constantst	   additionst   removalst   member(    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt   set‘   s@    			c         O   s   t     d  S(   N(   t   NotImplementedError(   R   t   argst   kwargs(    (    s5   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.(   Rd   (   R   R1   R2   RE   (    (    s5   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   R1   R2   R3   t   c(    (    s5   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    RD   (   R   R1   R2   R3   Rj   t   x(    (    s5   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)   RN   RO   RS   R    t   INIT_OK(   R   R1   R3   Rj   (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR.   ι   s    c         C   s)   | |  k	 r% |  j  | | | |  n  d  S(   N(   RI   (   R   R1   R2   RE   RF   R3   (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRA   τ   s    c         C   s)   | |  k	 r% |  j  | | | |  n  d  S(   N(   RM   (   R   R1   R2   RE   RF   R3   (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRL   ϊ   s    c         C   s    |  j  | | | | d | d  S(   NR3   (   RL   (   R   R1   R2   RE   RF   R3   (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRY      s    N(    R    R!   R   t   uses_objectsRK   t   default_accepts_scalar_loadert   supports_populationt
   collectionR   R>   R#   R    t   PASSIVE_OFFR4   R/   R8   R   t   memoized_propertyR;   R=   RI   RM   R?   Rc   Rg   Rh   Rk   Rn   R.   RA   RL   RY   (    (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR   >   s6   
	-		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 d  k	 r | j j | j f |  _ n  | j | d t |  _ |  j j r· |  j j |  _ n  d  S(   Nt   alias_secondary(   R"   R%   R#   R   R>   t   objt   instancet   attrR   t   _propsR)   t	   secondaryR   t
   selectablet	   _from_objt   _with_parentRK   t
   _criterionR   t	   _order_by(   R   Rz   R1   Ry   R   t   prop(    (    s5   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_utilRS   (   R   t   sess(    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt   session  s    		c         C   s   d  S(   N(   R>   (   t   sRm   (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt   <lambda>-  t    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    RD   Ry   R/   R0   t   _clone(   R   R   (    (    s5   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    RD   Ry   R/   t   indexedR   t   __getitem__(   R   t   indexR   (    (    s5   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    RD   Ry   R/   R0   R   t   count(   R   R   (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR   E  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 | _ |  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   R   Ry   R   (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR   Q  s    	%	c         C   sF   x? | D]7 } |  j  j t j |  j  t j |  j  | d   q Wd  S(   N(   Rz   RA   R    RD   Ry   t   instance_dictR>   (   R   t   iteratort   item(    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt   extendk  s    	c         C   s5   |  j  j t j |  j  t j |  j  | d   d  S(   N(   Rz   RA   R    RD   Ry   R   R>   (   R   R   (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRA   t  s
    	c         C   s5   |  j  j t j |  j  t j |  j  | d   d  S(   N(   Rz   RL   R    RD   Ry   R   R>   (   R   R   (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRL   |  s
    	N(   R    R!   R>   R   R#   R   t   propertyR   R   R   R   R   RA   RL   (    (    (    s5   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__(    (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR$     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(    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR'     s    RO   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   RK   R   t   OrderedIdentitySett   unchanged_itemsR0   t   deleted_itemsR   t   _reconcile_collection(   R   Rz   R1   Ro   t   coll(    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR#     s    c         C   s   t  |  j j |  j   S(   N(   RR   R0   RU   R’   (   R   (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR5     s    c         C   s%   t  |  j j |  j  j |  j   S(   N(   RR   R0   RU   R’   R£   (   R   (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRl   £  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€   R0   RW   R’   R£   RV   R    t   HistoryRR   (   R   t   addedt   deletedt	   unchanged(    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRi   «  s    	c         C   s   t  |  j  | S(   N(   RR   R0   (   R   R   (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR   Έ  s    c         C   s   |  j  j |  d  S(   N(   R0   t   add(   R   RE   (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR@   »  s    c         C   s6   | |  j  k r" |  j  j |  n |  j j |  d  S(   N(   R0   RL   R£   Rͺ   (   R   RE   (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRJ   Ύ  s    N(   R    R!   R   R>   R#   R   R5   Rl   Ri   R   R@   RJ   (    (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRO     s   			N(   R   R   R    R   R   R   R   R   R   R   R   R   R   R   R	   t   class_loggert   RelationshipPropertyt   strategy_fort   AbstractRelationshipLoaderR   t   AttributeImplR   t   objectR%   R$   R'   RO   (    (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt   <module>   s(   Θ	