o
    ˷e*                     @   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 i dddddddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*iZd+Ze d,d- Zd.d/ Z e	d0d1 Z!d2d3 Z"G d4d5 d5eZ#dXd7d8Z$d9d: Z%d;d< Z&d=d> Z'd?d@ Z(dAdB Z)dCdD Z*dEdF Z+G dGdH dHe
Z,G dIdJ dJeeZ-G dKdL dLe
Z.G dMdN dNeeZ/G dOdP dPeZ0G dQdR dReZ1G dSdT dTe
Z2G dUdV dVe
Z3dWS )Yz.
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IntegerField)NintBigIntegerFieldPositiveIntegerFieldSmallIntegerField	CharField)Nstr	TextField
EmailFieldGenericIPAddressFieldURLField
FloatField)NfloatBinaryField)NbytesBooleanField)NboolDecimalField)decimalDecimal	TimeField)datetimetimeDurationField)r'   	timedelta	DateField)r'   dateDateTimeField)r'   r'   	UUIDField)uuidUUID)createfilterexcludeupdategetget_or_createupdate_or_createc                 C   s   |  dd S )N)djangodbmodelsquery_utilsDeferredAttribute)import_modulepy__getattribute__execute_annotation)inference_state rA   J/var/www/ideatree/venv/lib/python3.10/site-packages/jedi/plugins/django.py_get_deferred_attributes,   s
   
rC   c                 C   sp   z
t |  \}}W n
 ty   Y d S w |st| S |d u r#| j}n| |f}||D ]}|   S d S N)mapping
py__name__KeyErrorrC   builtins_moduler=   r>   execute_with_values)r@   
field_namefield_tree_instanceis_instancemodule_nameattribute_namemodule	attributerA   rA   rB   _infer_scalar_field3   s   rQ   c           	      c   s    t |trF|j }t|d\}}|d u rH|d urJ| D ]-}| dkr>| }|  }|	|D ]	}|
 r<|V  q3q|
 rE|V  qd S d S d S d S )N)NNr   )
isinstancer   
_argumentsunpacknextinferrF   get_safe_valueget_root_contextr>   is_class)	clsrK   argument_iteratorkeylazy_valuesvalueforeign_key_class_namerO   vrA   rA   rB   _get_foreign_key_valuesE   s(   

ra   c           
      C   s   | j }| }|D ]B}t||||}|d ur|  S | }|dk}|dv s(|rK|s0t|  S t| |}	|rEttd dd |	D   S |	   S q	t	
d|j|   |S )NManyToManyField)
ForeignKeyOneToOneFieldc                 S   s   g | ]}t |d qS )RelatedManager)_create_manager_for.0r`   rA   rA   rB   
<listcomp>h   s    
z _infer_field.<locals>.<listcomp>z1django plugin: fail to infer `%s` from class `%s`)r@   rV   rQ   rF   rC   ra   r   r2   rI   r   dbgstring_name)
rZ   rJ   rL   r@   resultrK   scalar_fieldnameis_many_to_manyvaluesrA   rA   rB   _infer_fieldW   s0   

rq   c                       $   e Zd Z fddZdd Z  ZS )DjangoModelNamec                    s   t  | || _|| _d S rD   )super__init___cls_is_instance)selfrZ   rn   rL   	__class__rA   rB   ru   t   s   
zDjangoModelName.__init__c                 C   s   t | j| j| jS rD   )rq   rv   _wrapped_namerw   rx   rA   rA   rB   rV   y   s   zDjangoModelName.infer)__name__
__module____qualname__ru   rV   __classcell__rA   rA   ry   rB   rs   s   s    rs   BaseManagerc                 C   sV   | j d|}|D ]}| r(tt| gf}t|| D ]}|    S qd S )N)r8   r9   r:   manager)r@   r=   r>   is_class_mixinr   r   r   r?   )rZ   manager_clsmanagersmgenerics_managercrA   rA   rB   rf   }   s   rf   c                    sH   t  jddd} fddt|D }r t jd|d< t|S )NF)rL   include_metaclassesinclude_type_when_classc                    s*   i | ]}|  D ]
}|jt |qqS rA   )rp   rk   rs   )rh   filter_rn   rZ   rL   rA   rB   
<dictcomp>   s    z$_new_dict_filter.<locals>.<dictcomp>objects)listget_filtersreversedr   r@   r   )rZ   rL   filtersdctrA   r   rB   _new_dict_filter   s   r   c                 C   s   |   dko|    dkS )N	ModelBasezdjango.db.models.base)rF   rX   )r^   rA   rA   rB   is_django_model_base   s   r   c                        fdd}|S )Nc                    s.   |D ]}t |rt| |g  S q | ||S rD   )r   r   )rZ   metaclassesrL   	metaclassfuncrA   rB   wrapper   s
   z&get_metaclass_filters.<locals>.wrapperrA   r   r   rA   r   rB   get_metaclass_filters   s   r   c                    r   )Nc                    s   | ||}|j tv rD|D ]4   d|j fkrA j rA j dkrA| }| }t|dkrAt	 fdd|d D   S q|S |j dkr\| r\| dkr\t	d	d |D S |j d
krt| rt| dkrtt	dd |D S |S )N_BaseQuerySetzdjango.db.models.query   c                 3   s    | ]}t  |V  qd S rD   )QuerySetMethodWrapper)rh   modelr`   rA   rB   	<genexpr>   s    z7tree_name_to_values.<locals>.wrapper.<locals>.<genexpr>r   r   zdjango.db.models.managerc                 s       | ]}t |V  qd S rD   )ManagerWrapperrh   rrA   rA   rB   r          Fieldzdjango.db.models.fieldsc                 s   r   rD   )FieldWrapperr   rA   rA   rB   r      r   )
r^   _FILTER_LIKE_METHODSget_qualified_namesparent_context	is_modulerF   	get_valueget_genericslenr   )r@   context	tree_namerl   qsgenericsr   r   rB   r      s,   

z$tree_name_to_values.<locals>.wrapperrA   r   rA   r   rB   tree_name_to_values   s   r   c                 c   sB    t | dd D ]}| D ]}|jjdddkr|V  qq	d S )NF)rL   T)include_module_names)r8   r9   r:   r;   r<   )r   rp   rV   rn   r   )rZ   rn   r^   rA   rA   rB   _find_fields   s   r   c                 C   s   t | tt| dgS )N)field_names)DjangoModelSignaturer   r   )rZ   rA   rA   rB   _get_signatures   s   r   c                    r   )Nc                    s(   |D ]}t |rt|   S q | |S rD   )r   r   )rZ   r   r   r   rA   rB   r      s
   
z)get_metaclass_signatures.<locals>.wrapperrA   r   rA   r   rB   get_metaclass_signatures   s   r   c                   @      e Zd Zdd ZdS )r   c                 C      t dd | j||D S )Nc                 s   r   rD   )GenericManagerWrapperrh   genericrA   rA   rB   r      
    
z/ManagerWrapper.py__getitem__.<locals>.<genexpr>r   _wrapped_valuepy__getitem__rx   index_value_setcontextualized_noderA   rA   rB   r      
   zManagerWrapper.py__getitem__Nr}   r~   r   r   rA   rA   rA   rB   r          r   c                   @   s   e Zd Zdd Zdd ZdS )r   c                 C   s   |j t|hf|jS rD   )class_valuewith_genericsr   
py__call__rS   rx   calling_instanceinstancer   rA   rA   rB   py__get__on_class   s
   
z'GenericManagerWrapper.py__get__on_classc                 C   s   | j |S rD   )r   r   )rx   generics_tuplerA   rA   rB   r      s   z#GenericManagerWrapper.with_genericsN)r}   r~   r   r   r   rA   rA   rA   rB   r      s    r   c                   @   r   )r   c                 C   r   )Nc                 s   r   rD   )GenericFieldWrapperr   rA   rA   rB   r      r   z-FieldWrapper.py__getitem__.<locals>.<genexpr>r   r   rA   rA   rB   r      r   zFieldWrapper.py__getitem__Nr   rA   rA   rA   rB   r      r   r   c                   @   r   )r   c                 C   s
   t |hS rD   )r   r   rA   rA   rB   r      s   
z%GenericFieldWrapper.py__get__on_classN)r}   r~   r   r   rA   rA   rA   rB   r      r   r   c                       s&   e Zd Z fddZdddZ  ZS )r   c                       t  | || _d S rD   )rt   ru   _field_names)rx   r^   r   ry   rA   rB   ru        
zDjangoModelSignature.__init__Fc                 C   s   dd | j D S )Nc                 S   s   g | ]}t |qS rA   )DjangoParamName)rh   rn   rA   rA   rB   ri   	  s    z8DjangoModelSignature.get_param_names.<locals>.<listcomp>)r   )rx   resolve_starsrA   rA   rB   get_param_names  s   z$DjangoModelSignature.get_param_names)F)r}   r~   r   ru   r   r   rA   rA   ry   rB   r     s    r   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 rD   )rt   ru   r   r   _field_name)rx   rJ   ry   rA   rB   ru     s   
zDjangoParamName.__init__c                 C   s   t jS rD   )r   KEYWORD_ONLYr|   rA   rA   rB   get_kind  s   zDjangoParamName.get_kindc                 C   s
   | j  S rD   )r   rV   r|   rA   rA   rB   rV        
zDjangoParamName.infer)r}   r~   r   ru   r   rV   r   rA   rA   ry   rB   r     s    r   c                       rr   )r   c                    r   rD   rt   ru   
_model_clsrx   method	model_clsry   rA   rB   ru     r   zQuerySetMethodWrapper.__init__c                    s    t  fdd j||D S )Nc                    s   h | ]}t | jqS rA   )QuerySetBoundMethodWrapperr   rg   r|   rA   rB   	<setcomp>  s    z2QuerySetMethodWrapper.py__get__.<locals>.<setcomp>)r   r   	py__get__)rx   r   r   rA   r|   rB   r     s   zQuerySetMethodWrapper.py__get__)r}   r~   r   ru   r   r   rA   rA   ry   rB   r         r   c                       rr   )r   c                    r   rD   r   r   ry   rA   rB   ru   #  r   z#QuerySetBoundMethodWrapper.__init__c                 C   s
   t | jS rD   )r   r   r|   rA   rA   rB   get_signatures'  r   z)QuerySetBoundMethodWrapper.get_signatures)r}   r~   r   ru   r   r   rA   rA   ry   rB   r   "  r   r   N)r   )4__doc__inspectr   jedir   jedi.inference.cacher   jedi.inference.base_valuer   r   r   jedi.inference.filtersr   r	   jedi.inference.namesr
   r   jedi.inference.compiled.valuer   jedi.inference.value.instancer   jedi.inference.value.klassr   jedi.inference.gradual.baser   jedi.inference.gradual.genericsr   jedi.inference.signaturer   rE   r   rC   rQ   ra   rq   rs   rf   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rA   rA   rA   rB   <module>   s    	




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