o
    c©Zhü,  ã                   @   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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   úY/var/www/html/lang_env/lib/python3.10/site-packages/rest_framework/utils/field_mapping.pyÚ__init__   s   
zClassLookupDict.__init__c                 C   sN   t |dƒr	|j}n|j}t |¡D ]}|| jv r| j|   S qtd|j ƒ‚)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                 C   s¤  i }t |jƒ}||d< |jrt|| ƒrt|jƒ|d< |jr"|j|d< t|ddƒ}|dur0||d< t|ddƒ}|dur>||d< t|tj	ƒrI|j
|d< t|tjƒrR|jretrZt|tjƒsettdƒrkt|tjƒrkd	d
i|d< |jrrd|d< t|tjƒs{|jsd|d< |S | ¡ s‹|js‹|jrd|d< |jrŸt|tjtjfƒrŸd|d< |js®tr®t|tjƒr®d|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r
t|tƒr
||d< dd„ |D ƒ}tdd„ |D ƒdƒ}|dur*t|tƒr*||d< d d„ |D ƒ}t|tjƒr8d!d„ |D ƒ}t|tj ƒrFd"d„ |D ƒ}t|tj	ƒrTd#d„ |D ƒ}t|tj!ƒrbd$d„ |D ƒ}t|tj"ƒrpd%d„ |D ƒ}t|d&dƒ}|dur’t|tjtjtj#fƒr’||d&< d'd„ |D ƒ}td(d„ |D ƒdƒ}	|	dur³t|tjƒr³|	|d)< d*d„ |D ƒ}t|d+dƒrÉt$|j%j&t'|ƒd,}
| (|
¡ |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   ó"    | ]}t |tjƒr|jV  qd S r   )Ú
isinstancer   ÚMaxValueValidatorÚlimit_value©Ú.0Ú	validatorr   r   r   Ú	<genexpr>ˆ   ó   € 
þ
ÿz#get_field_kwargs.<locals>.<genexpr>Ú	max_valuec                 S   ó   g | ]
}t |tjƒs|‘qS r   )r>   r   r?   rA   r   r   r   Ú
<listcomp>Ž   ó    
þÿz$get_field_kwargs.<locals>.<listcomp>c                 s   r=   r   )r>   r   ÚMinValueValidatorr@   rA   r   r   r   rD   •   rE   Ú	min_valuec                 S   rG   r   )r>   r   rJ   rA   r   r   r   rH   ›   rI   c                 S   rG   r   )r>   r   ZURLValidatorrA   r   r   r   rH   £   rI   c                 S   ó   g | ]	}|t jur|‘qS r   )r   Zvalidate_emailrA   r   r   r   rH   «   ó
    
ÿc                 S   rL   r   )r   Zvalidate_slugrA   r   r   r   rH   ²   rM   c                 S   rL   r   )r   Zvalidate_ipv46_addressrA   r   r   r   rH   ¹   rM   c                 S   rG   r   )r>   r   ZDecimalValidatorrA   r   r   r   rH   ¿   rI   Ú
max_lengthc                 S   rG   r   )r>   r   ZMaxLengthValidatorrA   r   r   r   rH   É   rI   c                 s   r=   r   )r>   r   ÚMinLengthValidatorr@   rA   r   r   r   rD   Ð   rE   Ú
min_lengthc                 S   rG   r   )r>   r   rO   rA   r   r   r   rH   Ö   rI   Úunique©ÚquerysetÚmessager   ))Úlistr   r"   r%   r   r,   Úgetattrr>   r   Z	SlugFieldr/   Z	TextFieldr<   r   r0   r   ÚnullZ	AutoFieldÚeditableÚhas_defaultÚblankZ	CharFieldZ
ArrayFieldZFilePathFieldr7   r8   r9   r:   r;   ÚnextÚNUMERIC_FIELD_TYPESZURLFieldZ
EmailFieldZGenericIPAddressFieldÚDecimalFieldZ	FileFieldr   r)   Ú_default_managerÚget_unique_error_messageÚappend)r$   r#   ÚkwargsZvalidator_kwargr-   r.   rF   rK   rN   rP   rC   r   r   r   Úget_field_kwargsA   sâ   


ÿ
ÿþ
þ








ÿýÿÿýÿÿÿÿÿÿ"ÿÿýÿþ
rb   c                 C   sr  |\}}}}}}|j t|ƒdœ}|rd|d< |r||d< |o!| ¡ }	|	r;t|	tjƒs2tjdi |	¤Ž}	|d  |	¡|d< |rGd|d< | dd¡ |r·|jrXt	|| ƒrXt
|jƒ|d< |j}
|
ra|
|d	< |jsnd|d< | dd¡ |jrud|d
< | dd¡r}|S | ¡ s‡|js‡|jr‹d|d< |jr“|j|d< t|ddƒr®t|jj t|ƒd}| dg ¡|g |d< |r·|js·d|d< |S )z@
    Creates a default instance of a flat relational field.
    )rS   Ú	view_nameTÚmanyÚto_fieldrS   r3   Nr+   r,   r2   Fr4   r   rQ   rR   r6   r   )r^   r*   Zget_limit_choices_tor>   r   ÚQÚfilterÚpopr"   r%   r   r,   rX   rW   ÚgetrY   rZ   r   rV   r   r)   r_   )r$   Úrelation_infor#   Zrelated_modelÚto_manyre   Zhas_through_modelÚreversera   Zlimit_choices_tor,   rC   r   r   r   Úget_relation_kwargsç   sT   þ
þ
rm   c                 C   s   ddi}| j rd|d< |S )Nr3   Trd   )rk   )rj   ra   r   r   r   Úget_nested_relation_kwargs   s   rn   c                 C   s   dt | ƒiS )Nrc   )r*   )r#   r   r   r   Úget_url_kwargs'  s   ÿro   c                 C   s,   | j  dd ¡}|r|| jjj| jdœ }|S )NrQ   )r&   Zfield_label)Zerror_messagesri   r)   r'   r"   )r#   Zunique_error_messager   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
FloatFieldr]   ZDurationFieldr\   r   r%   r*   rb   rm   rn   ro   r_   r   r   r   r   Ú<module>   s$    ÿ	
 '9