a
    còfc/  ã                   @   s®   d 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jejejejfZG dd	„ d	ƒZd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )z”
Helper functions for mapping model fields to a dictionary of default
keyword arguments that should be used for their equivalent serializer fields.
é    N)Ú
validators)Úmodels)Úcapfirst)Úpostgres_fields)ÚUniqueValidatorc                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚClassLookupDicta
  
    Takes a dictionary with classes as keys.
    Lookups against this object will traverses the object's inheritance
    hierarchy in method resolution order, and returns the first matching value
    from the dictionary or raises a KeyError if nothing matches.
    c                 C   s
   || _ d S ©N©Úmapping)Úselfr
   © r   ú_/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/rest_framework/utils/field_mapping.pyÚ__init__   s    zClassLookupDict.__init__c                 C   sR   t |dƒr|j}n|j}t |¡D ]}|| jv r"| j|   S q"td|j ƒ‚d S )NÚ_proxy_classzClass %s not found in lookup.)Úhasattrr   Ú	__class__ÚinspectÚgetmror
   ÚKeyErrorÚ__name__)r   ÚkeyZ
base_classÚclsr   r   r   Ú__getitem__   s    

zClassLookupDict.__getitem__c                 C   s   || j |< d S r   r	   )r   r   Úvaluer   r   r   Ú__setitem__*   s    zClassLookupDict.__setitem__N)r   Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r   r      s   r   c                 C   s   |  dd¡ ¡ }t| jƒ|kS )z•
    Returns `True` if the label based on the model's verbose name
    is not equal to the default label it would have based on it's field name.
    Ú_ú )ÚreplaceÚ
capitalizer   Úverbose_name)Úmodel_fieldÚ
field_nameZdefault_labelr   r   r   Úneeds_label.   s    r%   c                 C   s   dd| j j ¡ i S )zz
    Given a model class, return the view name to use for URL relationships
    that refer to instances of the model.
    z%(model_name)s-detailÚ
model_name)Ú_metaZobject_nameÚlower)Úmodelr   r   r   Úget_detail_view_name7   s    ÿr*   c                 #   s~   t | gƒ‰ ‡ fdd„|jjjD ƒ}t|ddƒr8| d¡ |s@dS t|ƒ}|jj}|D ]$}t|du rf|n| 	|¡|d�V  qTdS )zQ
    Returns a list of UniqueValidators that should be applied to the field.
    c                    s,   h | ]$}t |tjƒrt|jƒˆ kr|j’qS r   )Ú
isinstancer   ZUniqueConstraintÚsetÚfieldsÚ	condition)Ú.0Úc©Z	field_setr   r   Ú	<setcomp>F   s   þz(get_unique_validators.<locals>.<setcomp>ÚuniqueFN©ÚquerysetÚmessage)
r,   r)   r'   ÚconstraintsÚgetattrÚaddÚget_unique_error_messageÚ_default_managerr   Úfilter)r$   r#   Z
conditionsÚunique_error_messager5   r.   r   r1   r   Úget_unique_validatorsA   s    

þ
þr>   c           
      C   s¦  i }t |jƒ}||d< |jr4t|| ƒr4t|jƒ|d< |jrD|j|d< t|ddƒ}|dur`||d< t|ddƒ}|dur|||d< t|tj	ƒr’|j
|d< t|tjƒr¤|jrÊtr´t|tjƒsÊttdƒrÖt|tjƒrÖd	d
i|d< |jräd|d< t|tjƒsø|j�sd|d< |S | ¡ �s|j�s|j�r&d|d< |j�rJt|tjtjfƒ�rJd|d< |j�snt�rnt|tjƒ�rnd|d< t|tjƒ�rÞ|j|d< |jdu�rœ|j|d< |jdu�r²|j|d< |jdu�rÈ|j|d< |jdu�rÞ|j|d< |j�rô|j|d< �ntdd„ |D ƒdƒ}|du�r4t|tƒ�r4||d< dd„ |D ƒ}tdd„ |D ƒdƒ}|du�rtt|tƒ�rt||d< d d„ |D ƒ}t|tjƒ�r�d!d„ |D ƒ}t|tj ƒ�r¬d"d„ |D ƒ}t|tj	ƒ�rÈd#d„ |D ƒ}t|tj!ƒ�räd$d„ |D ƒ}t|tj"ƒ�r d%d„ |D ƒ}t|d&dƒ}|du�rDt|tjtjtj#fƒ�rD||d&< d'd„ |D ƒ}td(d„ |D ƒdƒ}	|	du�r†t|tjƒ�r†|	|d)< d*d„ |D ƒ}|t$| |ƒ7 }|�r¢||d+< |S ),zE
    Creates a default instance of a basic non-relational field.
    r#   ÚlabelÚ	help_textÚ
max_digitsNÚdecimal_placesÚallow_unicodeÚ	JSONFieldZbase_templateztextarea.htmlÚstyleTÚ
allow_nullÚ	read_onlyFÚrequiredÚallow_blankÚallow_emptyÚpathÚmatchÚ	recursiveÚallow_filesÚallow_foldersÚchoicesc                 s   s    | ]}t |tjƒr|jV  qd S r   )r+   r   ÚMaxValueValidatorÚlimit_value©r/   Ú	validatorr   r   r   Ú	<genexpr>Ÿ   s   ÿz#get_field_kwargs.<locals>.<genexpr>Ú	max_valuec                 S   s   g | ]}t |tjƒs|‘qS r   )r+   r   rQ   rS   r   r   r   Ú
<listcomp>¥   s   ÿz$get_field_kwargs.<locals>.<listcomp>c                 s   s    | ]}t |tjƒr|jV  qd S r   )r+   r   ÚMinValueValidatorrR   rS   r   r   r   rU   ¬   s   ÿÚ	min_valuec                 S   s   g | ]}t |tjƒs|‘qS r   )r+   r   rX   rS   r   r   r   rW   ²   s   ÿc                 S   s   g | ]}t |tjƒs|‘qS r   )r+   r   ZURLValidatorrS   r   r   r   rW   º   s   ÿc                 S   s   g | ]}|t jur|‘qS r   )r   Zvalidate_emailrS   r   r   r   rW   Â   s   
ÿc                 S   s   g | ]}|t jur|‘qS r   )r   Zvalidate_slugrS   r   r   r   rW   É   s   
ÿc                 S   s   g | ]}|t jur|‘qS r   )r   Zvalidate_ipv46_addressrS   r   r   r   rW   Ð   s   
ÿc                 S   s   g | ]}t |tjƒs|‘qS r   )r+   r   ZDecimalValidatorrS   r   r   r   rW   Ö   s   ÿÚ
max_lengthc                 S   s   g | ]}t |tjƒs|‘qS r   )r+   r   ZMaxLengthValidatorrS   r   r   r   rW   à   s   ÿc                 s   s    | ]}t |tjƒr|jV  qd S r   )r+   r   ÚMinLengthValidatorrR   rS   r   r   r   rU   ç   s   ÿÚ
min_lengthc                 S   s   g | ]}t |tjƒs|‘qS r   )r+   r   r[   rS   r   r   r   rW   í   s   ÿr   )%Úlistr   r"   r%   r   r@   r8   r+   r   Z	SlugFieldrC   Z	TextFieldrP   r   rD   r   ÚnullZ	AutoFieldÚeditableÚhas_defaultÚblankZ	CharFieldZ
ArrayFieldZFilePathFieldrK   rL   rM   rN   rO   ÚnextÚNUMERIC_FIELD_TYPESZURLFieldZ
EmailFieldZGenericIPAddressFieldÚDecimalFieldZ	FileFieldr>   )
r$   r#   ÚkwargsZvalidator_kwargrA   rB   rV   rY   rZ   r\   r   r   r   Úget_field_kwargsX   sØ    


ÿ
ÿþ
þ




ÿýÿÿýÿÿÿÿÿÿ"ÿÿýÿrf   c                 C   s‚  |\}}}}}}|j t|ƒdœ}|r,d|d< |r8||d< |oB| ¡ }	|	rvt|	tjƒsdtjf i |	¤Ž}	|d  |	¡|d< |rŽd|d< | dd¡ |�r~|jr²t	|| ƒr²t
|jƒ|d< |j}
|
rÄ|
|d	< |jsÞd|d< | dd¡ |jrìd|d
< | dd¡rü|S | ¡ �s|j�s|j�rd|d< |j�r0|j|d< t|ddƒ�rht|jj t|ƒd�}| dg ¡|g |d< |�r~|j�s~d|d< |S )z@
    Creates a default instance of a flat relational field.
    )r5   Ú	view_nameTÚmanyÚto_fieldr5   rG   Nr?   r@   rF   FrH   r   r3   r4   rJ   )r;   r*   Zget_limit_choices_tor+   r   ÚQr<   Úpopr"   r%   r   r@   r_   r^   Úgetr`   ra   r   r8   r   r)   r:   )r$   Úrelation_infor#   Zrelated_modelÚto_manyri   Zhas_through_modelÚreversere   Zlimit_choices_tor@   rT   r   r   r   Úget_relation_kwargsú   sT    þ
þrp   c                 C   s   ddi}| j rd|d< |S )NrG   Trh   )rn   )rm   re   r   r   r   Úget_nested_relation_kwargs3  s    rq   c                 C   s   dt | ƒiS )Nrg   )r*   )r#   r   r   r   Úget_url_kwargs:  s    ÿrr   c                 C   s,   | j  dd ¡}|r(|| jjj| jdœ }|S )Nr3   )r&   Zfield_label)Zerror_messagesrl   r)   r'   r"   )r#   r=   r   r   r   r:   @  s    þr:   )r   r   Zdjango.corer   Z	django.dbr   Zdjango.utils.textr   Zrest_framework.compatr   Zrest_framework.validatorsr   ZIntegerFieldZ
FloatFieldrd   ZDurationFieldrc   r   r%   r*   r>   rf   rp   rq   rr   r:   r   r   r   r   Ú<module>   s$   ÿ	
 #9