3
(h@                 @   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 eG dd deZG d	d
 d
ejeZG dd deZG dd deZdS )    N)import_module)router)QuerySet)six)python_2_unicode_compatiblec                   s   e Zd 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dZedd Zdd Zdd Zdd Zd d! Zd"d# Z  ZS )&BaseManagerr   Fc                s   t t| j| }||f|_|S )N)superr   __new___constructor_args)clsargskwargsobj)	__class__ </tmp/pip-install-q3hcpn_q/Django/django/db/models/manager.pyr	      s    
zBaseManager.__new__c                s2   t t| j  | j  d | _d | _d | _i | _d S )N)r   r   __init___set_creation_countermodelname_db_hints)self)r   r   r   r      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   _metalabelr   )r   r   r   r   __str__%   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 dd||f d| jd | jd fS d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      )	_queryset_classgetattr
__module____name__r   r   hasattr
ValueErrorr
   )r   Zqs_classmodule_namer   moduler   r   r   deconstruct)   s&    

zBaseManager.deconstructc             K   s   g S )Nr   )r   r   r   r   r   checkN   s    zBaseManager.checkc             C   s|   dd }i }t jrtjntj}xXtj||dD ]F\}}t| |rBq.t|dd }|s.|d krf|jdrfq.|||||< q.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_methodT   s    zPBaseManager._get_queryset_methods.<locals>.create_method.<locals>.manager_method)r    __doc__)r   methodr(   r   )r   r   create_methodS   s    z8BaseManager._get_queryset_methods.<locals>.create_method)	predicatequeryset_only_)	r   PY3inspect
isfunctionismethod
getmembersr!   r   
startswith)r   queryset_classr+   Znew_methodsr,   r   r*   r-   r   r   r   _get_queryset_methodsQ   s    
z!BaseManager._get_queryset_methodsNc             C   s>   |d krd| j |j f }d|i}|j| j| t|| f|S )Nz%sFrom%sr   )r    updater6   type)r   r5   
class_name
class_dictr   r   r   from_queryseti   s
    zBaseManager.from_querysetc             C   s2   | j s|| _ || _t||t|  |jj|  d S )N)r   r   setattrManagerDescriptorr   Zadd_manager)r   r   r   r   r   r   contribute_to_classs   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   creation_counter)r   r   r   r   r   |   s    z!BaseManager._set_creation_counterc             C   s&   t j | }|p| j|_|p| j|_|S )N)copyr   r   )r   usinghintsr   r   r   r   
db_manager   s    
zBaseManager.db_managerc             C   s   | j ptj| jf| jS )N)r   r   Zdb_for_readr   r   )r   r   r   r   db   s    zBaseManager.dbc             C   s   | j | j| j| jdS )z
        Returns a new QuerySet object.  Subclasses can override this method to
        easily customize the behavior of the Manager.
        )r   rA   rB   )r   r   r   r   )r   r   r   r   r'      s    zBaseManager.get_querysetc             C   s   | j  S )N)r'   )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   rG   r   r   r   __ne__   s    zBaseManager.__ne__c             C   s   t | S )N)id)r   r   r   r   __hash__   s    zBaseManager.__hash__)N)NN)r    r   __qualname__r?   Zauto_createdZuse_in_migrationsr	   r   r   r%   r&   classmethodr6   r;   r>   r   rC   propertyrD   r'   rE   rH   rI   rK   __classcell__r   r   )r   r   r      s(   %		
	r   c               @   s   e Zd ZdS )ManagerN)r    r   rL   r   r   r   r   rP      s   rP   c               @   s   e Zd Zdd ZdddZdS )r=   c             C   s
   || _ d S )N)manager)r   rQ   r   r   r   r      s    zManagerDescriptor.__init__Nc             C   sf   |d k	rt d|j |jjr0t d|jjf |jjrVt d|jj|jj|jjf |jj| jj	 S )Nz)Manager isn't accessible via %s instancesz'Manager isn't available; %s is abstractz:Manager isn't available; '%s.%s' has been swapped for '%s')
AttributeErrorr    r   ZabstractZobject_nameZswappedZ	app_labelZmanagers_maprQ   r   )r   instancer   r   r   r   __get__   s    zManagerDescriptor.__get__)N)r    r   rL   r   rT   r   r   r   r   r=      s   r=   c                   s(   e Zd Z fddZ fddZ  ZS )EmptyManagerc                s   t t| j  || _d S )N)r   rU   r   r   )r   r   )r   r   r   r      s    zEmptyManager.__init__c                s   t t| j j S )N)r   rU   r'   none)r   )r   r   r   r'      s    zEmptyManager.get_queryset)r    r   rL   r   r'   rO   r   r   )r   r   rU      s   rU   )r@   r0   	importlibr   Z	django.dbr   Zdjango.db.models.queryr   Zdjango.utilsr   Zdjango.utils.encodingr   objectr   r;   rP   r=   rU   r   r   r   r   <module>   s    $