B
    b*                 @   s  d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
 ddlmZmZ ddlmZ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dddddddddddddddddZdZe dd Zdd Z e	dd  Z!d!d" Z"G d#d$ d$eZ#dGd&d'Z$d(d) Z%d*d+ Z&d,d- Z'd.d/ Z(d0d1 Z)d2d3 Z*d4d5 Z+G d6d7 d7e
Z,G d8d9 d9eeZ-G d:d; d;e
Z.G d<d= d=eeZ/G d>d? d?eZ0G d@dA dAeZ1G dBdC dCe
Z2G dDdE dEe
Z3dFS )Hz.
Module is used to infer Django model fields.
    )	Parameter)debug)inference_state_function_cache)ValueSetiterator_to_value_setValueWrapper)
DictFilterAttributeOverwrite)NameWrapperBaseTreeParamName)EmptyCompiledName)TreeInstance)
ClassMixin)GenericClass)TupleGenericManager)AbstractSignature)Nint)Nstr)Nfloat)Nbytes)Nbool)ZdecimalZDecimal)datetimeZtime)r   Z	timedelta)r   Zdate)r   r   )ZuuidZUUID)ZIntegerFieldZBigIntegerFieldZPositiveIntegerFieldZSmallIntegerFieldZ	CharFieldZ	TextFieldZ
EmailFieldZGenericIPAddressFieldZURLFieldZ
FloatFieldZBinaryFieldZBooleanFieldZDecimalFieldZ	TimeFieldZDurationFieldZ	DateFieldZDateTimeFieldZ	UUIDField)ZcreatefilterZexcludeupdategetZget_or_createZupdate_or_createc             C   s   |  dd S )N)djangodbmodelsquery_utilsDeferredAttribute)import_modulepy__getattribute__execute_annotation)inference_state r$   2lib/python3.7/site-packages/jedi/plugins/django.py_get_deferred_attributes,   s    r&   c             C   sp   yt |  \}}W n tk
r(   d S X |s6t| S |d krF| j}n| |f}x||D ]
}| S W d S )N)mapping
py__name__KeyErrorr&   Zbuiltins_moduler    r!   execute_with_values)r#   
field_namefield_tree_instanceis_instanceZmodule_nameZattribute_namemoduleZ	attributer$   r$   r%   _infer_scalar_field3   s    r/   c       	      c   s   t |tr|j }t|d\}}|d kr|d k	rx^| D ]R}| dkr| }|  }x0|	|D ]}|
 rh|V  qhW q<|
 r<|V  q<W d S )N)NNr   )
isinstancer   
_argumentsunpacknextinferr(   Zget_safe_valueget_root_contextr!   Zis_class)	clsr,   Zargument_iteratorkeyZlazy_valuesvalueZforeign_key_class_namer.   vr$   r$   r%   _get_foreign_key_valuesE   s    

r:   c       
      C   s   | j }| }x||D ]t}t||||}|d k	r2|S | }|dk}|dksN|r|sZt|S t| |}	|rttd dd |	D S |	 S qW t	
d|j|   |S )NZManyToManyField)Z
ForeignKeyZOneToOneFieldc             S   s   g | ]}t |d qS )ZRelatedManager)_create_manager_for).0r9   r$   r$   r%   
<listcomp>i   s    z _infer_field.<locals>.<listcomp>z1django plugin: fail to infer `%s` from class `%s`)r#   r4   r/   r(   r&   r:   r   r   r*   r   Zdbgstring_name)
r6   r+   r-   r#   resultr,   Zscalar_fieldnameZis_many_to_manyvaluesr$   r$   r%   _infer_fieldW   s(    

rB   c                   s$   e Zd Z fddZdd Z  ZS )DjangoModelNamec                s   t  | || _|| _d S )N)super__init___cls_is_instance)selfr6   r@   r-   )	__class__r$   r%   rE   t   s    zDjangoModelName.__init__c             C   s   t | j| j| jS )N)rB   rF   Z_wrapped_namerG   )rH   r$   r$   r%   r4   y   s    zDjangoModelName.infer)__name__
__module____qualname__rE   r4   __classcell__r$   r$   )rI   r%   rC   s   s   rC   BaseManagerc             C   sV   | j d|}x>|D ]6}| rtt| gf}xt|| D ]}|S W qW d S )N)r   r   r   Zmanager)r#   r    r!   Zis_class_mixinr   r   r   r"   )r6   Zmanager_clsZmanagersmZgenerics_managercr$   r$   r%   r;   }   s    

r;   c                sH   t  jddd} fddt|D }r@t jd|d< t|S )NF)r-   Zinclude_metaclassesZinclude_type_when_classc                s*   i | ]"}|  D ]}t ||jqqS r$   )rA   rC   r>   )r<   Zfilter_r@   )r6   r-   r$   r%   
<dictcomp>   s   z$_new_dict_filter.<locals>.<dictcomp>Zobjects)listZget_filtersreversedr   r#   r   )r6   r-   filtersZdctr$   )r6   r-   r%   _new_dict_filter   s    
rU   c             C   s   |   dko|    dkS )NZ	ModelBasezdjango.db.models.base)r(   r5   )r8   r$   r$   r%   is_django_model_base   s    rV   c                s    fdd}|S )Nc                s.   x |D ]}t |rt| |gS qW  | ||S )N)rV   rU   )r6   metaclassesr-   	metaclass)funcr$   r%   wrapper   s    
z&get_metaclass_filters.<locals>.wrapperr$   )rY   rZ   r$   )rY   r%   get_metaclass_filters   s    r[   c                s    fdd}|S )Nc                s   | ||}|j tkrx|D ]d   d|j fkr j r j dkr| }| }t|dkrt	 fdd|d D S qW n`|j dkr| r| dkrt	d	d |D S |j d
kr| r| dkrt	dd |D S |S )NZ_BaseQuerySetzdjango.db.models.query   c             3   s   | ]}t  |V  qd S )N)QuerySetMethodWrapper)r<   Zmodel)r9   r$   r%   	<genexpr>   s   z7tree_name_to_values.<locals>.wrapper.<locals>.<genexpr>r   rN   zdjango.db.models.managerc             s   s   | ]}t |V  qd S )N)ManagerWrapper)r<   rr$   r$   r%   r^      s    ZFieldzdjango.db.models.fieldsc             s   s   | ]}t |V  qd S )N)FieldWrapper)r<   r`   r$   r$   r%   r^      s    )
r8   _FILTER_LIKE_METHODSget_qualified_namesparent_contextZ	is_moduler(   Z	get_valueZget_genericslenr   )r#   context	tree_namer?   ZqsZgenerics)rY   )r9   r%   rZ      s$    


z$tree_name_to_values.<locals>.wrapperr$   )rY   rZ   r$   )rY   r%   tree_name_to_values   s    rh   c             c   sH   xBt | dd D ].}x(| D ]}|jjdddkr |V  q W qW d S )NF)r-   T)Zinclude_module_names)r   r   r   r   r   )rU   rA   r4   r@   rc   )r6   r@   r8   r$   r$   r%   _find_fields   s
    ri   c             C   s   t | tt| dgS )N)field_names)DjangoModelSignaturerR   ri   )r6   r$   r$   r%   _get_signatures   s    rl   c                s    fdd}|S )Nc                s(   x|D ]}t |rt| S qW  | |S )N)rV   rl   )r6   rW   rX   )rY   r$   r%   rZ      s    
z)get_metaclass_signatures.<locals>.wrapperr$   )rY   rZ   r$   )rY   r%   get_metaclass_signatures   s    rm   c               @   s   e Zd Zdd ZdS )r_   c             C   s   t dd | j||D S )Nc             s   s   | ]}t |V  qd S )N)GenericManagerWrapper)r<   genericr$   r$   r%   r^      s   z/ManagerWrapper.py__getitem__.<locals>.<genexpr>)r   _wrapped_valuepy__getitem__)rH   index_value_setcontextualized_noder$   r$   r%   rq      s    zManagerWrapper.py__getitem__N)rJ   rK   rL   rq   r$   r$   r$   r%   r_      s   r_   c               @   s   e Zd Zdd Zdd ZdS )rn   c             C   s   |j t|hf|jS )N)class_valuewith_genericsr   Z
py__call__r1   )rH   calling_instanceinstancert   r$   r$   r%   py__get__on_class   s    z'GenericManagerWrapper.py__get__on_classc             C   s   | j |S )N)rp   ru   )rH   Zgenerics_tupler$   r$   r%   ru      s    z#GenericManagerWrapper.with_genericsN)rJ   rK   rL   rx   ru   r$   r$   r$   r%   rn      s   rn   c               @   s   e Zd Zdd ZdS )ra   c             C   s   t dd | j||D S )Nc             s   s   | ]}t |V  qd S )N)GenericFieldWrapper)r<   ro   r$   r$   r%   r^      s   z-FieldWrapper.py__getitem__.<locals>.<genexpr>)r   rp   rq   )rH   rr   rs   r$   r$   r%   rq      s    zFieldWrapper.py__getitem__N)rJ   rK   rL   rq   r$   r$   r$   r%   ra      s   ra   c               @   s   e Zd Zdd ZdS )ry   c             C   s
   t |hS )N)r   )rH   rv   rw   rt   r$   r$   r%   rx      s    z%GenericFieldWrapper.py__get__on_classN)rJ   rK   rL   rx   r$   r$   r$   r%   ry      s   ry   c                   s&   e Zd Z fddZdddZ  ZS )rk   c                s   t  | || _d S )N)rD   rE   _field_names)rH   r8   rj   )rI   r$   r%   rE     s    zDjangoModelSignature.__init__Fc             C   s   dd | j D S )Nc             S   s   g | ]}t |qS r$   )DjangoParamName)r<   r@   r$   r$   r%   r=   	  s    z8DjangoModelSignature.get_param_names.<locals>.<listcomp>)rz   )rH   Zresolve_starsr$   r$   r%   get_param_names  s    z$DjangoModelSignature.get_param_names)F)rJ   rK   rL   rE   r|   rM   r$   r$   )rI   r%   rk     s   rk   c                   s,   e Zd Z fddZdd Zdd Z  ZS )r{   c                s   t  |j|j || _d S )N)rD   rE   rd   rg   _field_name)rH   r+   )rI   r$   r%   rE     s    zDjangoParamName.__init__c             C   s   t jS )N)r   ZKEYWORD_ONLY)rH   r$   r$   r%   get_kind  s    zDjangoParamName.get_kindc             C   s
   | j  S )N)r}   r4   )rH   r$   r$   r%   r4     s    zDjangoParamName.infer)rJ   rK   rL   rE   r~   r4   rM   r$   r$   )rI   r%   r{     s   r{   c                   s$   e Zd Z fddZdd Z  ZS )r]   c                s   t  | || _d S )N)rD   rE   
_model_cls)rH   method	model_cls)rI   r$   r%   rE     s    zQuerySetMethodWrapper.__init__c                s    t  fdd j||D S )Nc                s   h | ]}t | jqS r$   )QuerySetBoundMethodWrapperr   )r<   r9   )rH   r$   r%   	<setcomp>  s   z2QuerySetMethodWrapper.py__get__.<locals>.<setcomp>)r   rp   	py__get__)rH   rw   rt   r$   )rH   r%   r     s    zQuerySetMethodWrapper.py__get__)rJ   rK   rL   rE   r   rM   r$   r$   )rI   r%   r]     s   r]   c                   s$   e Zd Z fddZdd Z  ZS )r   c                s   t  | || _d S )N)rD   rE   r   )rH   r   r   )rI   r$   r%   rE   #  s    z#QuerySetBoundMethodWrapper.__init__c             C   s
   t | jS )N)rl   r   )rH   r$   r$   r%   get_signatures'  s    z)QuerySetBoundMethodWrapper.get_signatures)rJ   rK   rL   rE   r   rM   r$   r$   )rI   r%   r   "  s   r   N)rN   )4__doc__inspectr   Zjedir   Zjedi.inference.cacher   Zjedi.inference.base_valuer   r   r   Zjedi.inference.filtersr   r	   Zjedi.inference.namesr
   r   Zjedi.inference.compiled.valuer   Zjedi.inference.value.instancer   Zjedi.inference.value.klassr   Zjedi.inference.gradual.baser   Zjedi.inference.gradual.genericsr   Zjedi.inference.signaturer   r'   rb   r&   r/   r:   rB   rC   r;   rU   rV   r[   rh   ri   rl   rm   r_   rn   ra   ry   rk   r{   r]   r   r$   r$   r$   r%   <module>   sh   


		
		
