U
    e                     @   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	 G dd dZ
G dd	 d	e
e	ZG d
d dZG dd deZdS )    Nwraps)import_module)router)QuerySetc                       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
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  ZS )&BaseManagerr   Fc                    s   t  | }||f|_|S N)super__new___constructor_args)clsargskwargsobj	__class__ </tmp/pip-unpacked-wheel-lctamlir/django/db/models/manager.pyr
      s    
zBaseManager.__new__c                    s.   t    |   d | _d | _d | _i | _d S r   )r	   __init___set_creation_countermodelname_db_hintsselfr   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".%s.%s)r   _metalabelr   r   r   r   r   __str__#   s    zBaseManager.__str__c                 O   s   | S r   r   )r   r   r   r   r   r   __class_getitem__'   s    zBaseManager.__class_getitem__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
        Return a 5-tuple of the form (as_manager (True), manager_class,
        queryset_class, args, kwargs).

        Raise a ValueError if the manager is dynamically generated.
        Z_built_with_as_managerFTNr   zCould 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 r   r   )r   r   r   r   r   checkO   s    zBaseManager.checkc                 C   sh   dd }i }t j|t jdD ]F\}}t| |r0qt|dd }|s|d krT|drTq|||||< q|S )Nc                    s   t | fdd}|S )Nc                    s   t |   ||S r   )r#   get_queryset)r   r   r   r   r   r   manager_methodU   s    zPBaseManager._get_queryset_methods.<locals>.create_method.<locals>.manager_methodr   )r   methodr.   r   r-   r   create_methodT   s    z8BaseManager._get_queryset_methods.<locals>.create_method)	predicatequeryset_only_)inspect
getmembers
isfunctionr&   r#   
startswith)r   queryset_classr0   Znew_methodsr   r/   r2   r   r   r   _get_queryset_methodsR   s     
z!BaseManager._get_queryset_methodsNc                 C   s4   |d krd| j |j f }t|| fd|i| |S )Nz%sFrom%sr"   )r%   typer9   )r   r8   
class_namer   r   r   from_querysetk   s     zBaseManager.from_querysetc                 C   s2   | j p|| _ || _t||t|  |j|  d S r   )r   r   setattrManagerDescriptorr   Zadd_manager)r   r   r   r   r   r   contribute_to_classx   s    zBaseManager.contribute_to_classc                 C   s   t j| _t  jd7  _dS )zn
        Set the creation counter value for this instance and increment the
        class-level copy.
        r!   N)r   creation_counterr   r   r   r   r      s    z!BaseManager._set_creation_counterc                 C   s&   t  | }|p| j|_|p| j|_|S r   )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 r   )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
        Return a new QuerySet object. Subclasses can override this method to
        customize the behavior of the Manager.
        )r   rB   rC   )r"   r   r   r   r   r   r   r   r,      s    zBaseManager.get_querysetc                 C   s   |   S r   )r,   r   r   r   r   all   s    zBaseManager.allc                 C   s   t || jo| j|jkS r   )
isinstancer   r   )r   otherr   r   r   __eq__   s    
zBaseManager.__eq__c                 C   s   t | S r   )idr   r   r   r   __hash__   s    zBaseManager.__hash__)N)NN)r%   r$   __qualname__r@   Zauto_createdZuse_in_migrationsr
   r   r   r    r*   r+   classmethodr9   r<   r?   r   rD   propertyrE   r,   rF   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 r   )manager)r   rQ   r   r   r   r      s    zManagerDescriptor.__init__Nc                 C   s`   |d k	rt d|j |jjr0t d|jjf |jjrPt d|jj|jjf |jj| jj	 S )Nz)Manager isn't accessible via %s instancesz'Manager isn't available; %s is abstractz7Manager isn't available; '%s' has been swapped for '%s')
AttributeErrorr%   r   ZabstractZobject_nameZswappedr   Z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    || _d S r   )r	   r   r   )r   r   r   r   r   r      s    
zEmptyManager.__init__c                    s   t    S r   )r	   r,   noner   r   r   r   r,      s    zEmptyManager.get_queryset)r%   r$   rL   r   r,   rO   r   r   r   r   rU      s   rU   )rA   r4   	functoolsr   	importlibr   Z	django.dbr   Zdjango.db.models.queryr   r   r<   rP   r>   rU   r   r   r   r   <module>   s    '