

_V)                 @   s  d  d l  Z  d  d l 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   Z e Gd	 d
   d
 e   Z Gd d   d e j e   Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z d S)    N)import_module)router)QuerySet)six)python_2_unicode_compatiblec             C   sC  |  j  j r& t |  d t |    d St |  d d  s t d d   |  j  j D  rm t d |  j   n  |  j	 d t
    |  j |  _ n t |  d d  s?|  j j } | t
 k s t | d d	  r |  j |  _ q?xS | j   d
 d  D]; } | t
 k st | d d	  r |  j	 d |    d Sq Wt d   n  d S)a  
    Ensures that a Model subclass contains a default manager  and sets the
    _default_manager attribute on the class. Also sets up the _base_manager
    points to a plain Manager instance (which could be the same as
    _default_manager if it's not a subclass of Manager).
    objectsN_default_managerc             s   s   |  ] } | j  d  k Vq d S)r   N)name).0f r   :/tmp/pip-build-ghmbqnp_/Django/django/db/models/manager.py	<genexpr>   s    z)ensure_default_manager.<locals>.<genexpr>zNModel %s must specify a custom Manager, because it has a field named 'objects'_base_managerZuse_for_related_fieldsF   zYShould never get here. Please report a bug, including your model and model manager setup.)_metaswappedsetattrSwappedManagerDescriptorgetattranyfields
ValueError__name__Zadd_to_classManagerr   r   r   	__class__mroAssertionError)clsZdefault_mgrZ
base_classr   r   r   ensure_default_manager   s,    r   c                   s  e  Z d  Z d Z d Z   f d d   Z   f d d   Z d d   Z d	 d
   Z d d   Z	 e
 d d    Z e
 d d d   Z d d   Z d d   Z d d   Z d d d d  Z e d d    Z d d   Z d d   Z d  d!   Z d" d#   Z d$ d%   Z   S)&BaseManagerr   Fc                s+   t  t |   j |   } | | f | _ | S)N)superr    __new___constructor_args)r   argskwargsobj)r   r   r   r"   ;   s    zBaseManager.__new__c                sN   t  t |   j   |  j   d  |  _ d  |  _ d |  _ d  |  _ i  |  _ d  S)NF)	r!   r    __init___set_creation_countermodelr	   
_inherited_db_hints)self)r   r   r   r'   A   s    
				zBaseManager.__init__c             C   s   d |  j  j j |  j f S)z. Return "app_label.model_label.manager_name". z%s.%s)r)   r   labelr	   )r-   r   r   r   __str__J   s    zBaseManager.__str__c             C   s   |  j  } t |  d d  r> d d d | j | j f d d f S|  j } |  j j } t |  } t | |  s t d | | f   n  d d | | f d |  j d |  j d f Sd S)	z
        Returns a 5-tuple of the form (as_manager (True), manager_class,
        queryset_class, args, kwargs).

        Raises a ValueError if the manager is dynamically generated.
        Z_built_with_as_managerFTNz%s.%szCould not find manager %s in %s.
Please note that you need to inherit from managers you dynamically generated with 'from_queryset()'.r   r   )	_queryset_classr   
__module__r   r   r   hasattrr   r#   )r-   Zqs_classmodule_namer	   moduler   r   r   deconstructN   s&    		
zBaseManager.deconstructc             K   s   g  S)Nr   )r-   r%   r   r   r   checks   s    zBaseManager.checkc             C   s   d d   } i  } t  j r$ t j n t j } x t j | d | D]m \ } } t |  |  rd qC n  t | d d   } | sC | d  k r | j d  r qC n  | | |  | | <qC W| S)Nc                s.     f d d   } | j  | _  | j | _ | S)Nc                s   t  |  j      | |   S)N)r   get_queryset)r-   r$   r%   )r	   r   r   manager_methody   s    zPBaseManager._get_queryset_methods.<locals>.create_method.<locals>.manager_method)r   __doc__)r	   methodr8   r   )r	   r   create_methodx   s    z8BaseManager._get_queryset_methods.<locals>.create_method	predicatequeryset_only_)	r   PY3inspectZ
isfunctionZismethod
getmembersr2   r   
startswith)r   queryset_classr;   Znew_methodsr<   r	   r:   r=   r   r   r   _get_queryset_methodsv   s    "!z!BaseManager._get_queryset_methodsNc             C   s[   | d  k r% d |  j  | j  f } n  i | d 6} | j |  j |   t | |  f |  S)Nz%sFrom%sr0   )r   updaterD   type)r   rC   
class_nameZ
class_dictr   r   r   from_queryset   s    
zBaseManager.from_querysetc             C   s	  | |  _  |  j s | |  _ n  | j j rC t | | t |   n; | j j rh t | | t |   n t | | t |    t	 | d d   s |  j
 | j j
 k  r |  | _ n  d } | j j s |  j r |  j  j j r d } n  | j j j |  j
 |  | f  d  S)Nr   FT)r)   r	   r   abstractr   AbstractManagerDescriptorr   r   ManagerDescriptorr   creation_counterr   r*   proxyZmanagersappend)r-   r)   r	   rI   r   r   r   contribute_to_class   s    		%	zBaseManager.contribute_to_classc             C   s   t  j |  _ t  j d 7_ d S)zp
        Sets the creation counter value for this instance and increments the
        class-level copy.
        r   N)r    rL   )r-   r   r   r   r(      s    z!BaseManager._set_creation_counterc             C   sG   t  | |  j  s t  t j |   } | j   | | _ d | _ | S)z
        Makes a copy of the manager and assigns it to 'model', which should be
        a child of the existing model (used when inheriting a manager from an
        abstract base class).
        T)
issubclassr)   r   copyr(   r*   )r-   r)   Zmgrr   r   r   _copy_to_model   s    
		zBaseManager._copy_to_modelc             C   s7   t  j  |   } | p |  j | _ | p- |  j | _ | S)N)rQ   r+   r,   )r-   usinghintsr&   r   r   r   
db_manager   s    zBaseManager.db_managerc             C   s   |  j  p t j |  j |  j  S)N)r+   r   Zdb_for_readr)   r,   )r-   r   r   r   db   s    zBaseManager.dbc             C   s%   |  j  d |  j d |  j d |  j  S)z
        Returns a new QuerySet object.  Subclasses can override this method to
        easily customize the behavior of the Manager.
        r)   rS   rT   )r0   r)   r+   r,   )r-   r   r   r   r7      s    zBaseManager.get_querysetc             C   s
   |  j    S)N)r7   )r-   r   r   r   all   s    zBaseManager.allc             C   s"   t  | |  j  o! |  j | j k S)N)
isinstancer   r#   )r-   otherr   r   r   __eq__   s    zBaseManager.__eq__c             C   s   |  | k S)Nr   )r-   rY   r   r   r   __ne__   s    zBaseManager.__ne__c             C   s
   t  |   S)N)id)r-   r   r   r   __hash__   s    zBaseManager.__hash__)r   r1   __qualname__rL   Zuse_in_migrationsr"   r'   r/   r5   r6   classmethodrD   rH   rO   r(   rR   rU   propertyrV   r7   rW   rZ   r[   r]   r   r   )r   r   r    2   s(   	%		r    c               @   s   e  Z d  Z d S)r   N)r   r1   r^   r   r   r   r   r      s   r   c               @   s+   e  Z d  Z d d   Z d d d  Z d S)rK   c             C   s   | |  _  d  S)N)manager)r-   ra   r   r   r   r'      s    zManagerDescriptor.__init__Nc             C   s)   | d  k	 r" t  d | j   n  |  j S)Nz)Manager isn't accessible via %s instances)AttributeErrorr   ra   )r-   instancerF   r   r   r   __get__   s    zManagerDescriptor.__get__)r   r1   r^   r'   rd   r   r   r   r   rK      s   rK   c               @   s+   e  Z d  Z d d   Z d d d  Z d S)rJ   c             C   s   | |  _  d  S)N)r)   )r-   r)   r   r   r   r'     s    z"AbstractManagerDescriptor.__init__Nc             C   s    t  d |  j j j f   d  S)Nz'Manager isn't available; %s is abstract)rb   r)   r   object_name)r-   rc   rF   r   r   r   rd     s    z!AbstractManagerDescriptor.__get__)r   r1   r^   r'   rd   r   r   r   r   rJ      s   rJ   c               @   s+   e  Z d  Z d d   Z d d d  Z d S)r   c             C   s   | |  _  d  S)N)r)   )r-   r)   r   r   r   r'     s    z!SwappedManagerDescriptor.__init__Nc             C   s8   t  d |  j j j |  j j j |  j j j f   d  S)Nz:Manager isn't available; '%s.%s' has been swapped for '%s')rb   r)   r   Z	app_labelre   r   )r-   rc   rF   r   r   r   rd     s
    z SwappedManagerDescriptor.__get__)r   r1   r^   r'   rd   r   r   r   r   r   
  s   r   c                   s4   e  Z d  Z   f d d   Z   f d d   Z   S)EmptyManagerc                s    t  t |   j   | |  _ d  S)N)r!   rf   r'   r)   )r-   r)   )r   r   r   r'     s    zEmptyManager.__init__c                s   t  t |   j   j   S)N)r!   rf   r7   none)r-   )r   r   r   r7     s    zEmptyManager.get_queryset)r   r1   r^   r'   r7   r   r   )r   r   rf     s   rf   )rQ   r@   	importlibr   Z	django.dbr   Zdjango.db.models.queryr   Zdjango.utilsr   Zdjango.utils.encodingr   r   objectr    rH   r   rK   rJ   r   rf   r   r   r   r   <module>   s   '