o
    ÖèFhc/  ã                   @   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   ú[/var/www/html/loop/nvenv/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   ÚkeyÚ
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_nameÚ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)Ú_metaÚ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ƒr| d¡ |s!dS t|ƒ}|jj}|D ]}t|du r4|n| 	|¡|d�V  q+d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   ÚUniqueConstraintÚsetÚfieldsÚ	condition)Ú.0Úc©Ú	field_setr   r   Ú	<setcomp>F   s    
ýþz(get_unique_validators.<locals>.<setcomp>ÚuniqueFN©ÚquerysetÚmessage)
r0   r,   r)   ÚconstraintsÚgetattrÚaddÚget_unique_error_messageÚ_default_managerr   Úfilter)r%   r$   Ú
conditionsÚunique_error_messager:   r2   r   r5   r   Úget_unique_validatorsA   s"   €

þ

þÿrD   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s�d|d< |S | ¡ s‹|js‹|jr�d|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$| |ƒ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Ú	JSONFieldÚ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   )r.   r   ÚMaxValueValidatorÚlimit_value©r3   Ú	validatorr   r   r   Ú	<genexpr>Ÿ   ó   € 
þ
ÿz#get_field_kwargs.<locals>.<genexpr>Ú	max_valuec                 S   ó   g | ]
}t |tjƒs|‘qS r   )r.   r   rY   r[   r   r   r   Ú
<listcomp>¥   ó    
þÿz$get_field_kwargs.<locals>.<listcomp>c                 s   rX   r   )r.   r   ÚMinValueValidatorrZ   r[   r   r   r   r]   ¬   r^   Ú	min_valuec                 S   r`   r   )r.   r   rc   r[   r   r   r   ra   ²   rb   c                 S   r`   r   )r.   r   ÚURLValidatorr[   r   r   r   ra   º   rb   c                 S   ó   g | ]	}|t jur|‘qS r   )r   Úvalidate_emailr[   r   r   r   ra   Â   ó
    
ÿc                 S   rf   r   )r   Úvalidate_slugr[   r   r   r   ra   É   rh   c                 S   rf   r   )r   Úvalidate_ipv46_addressr[   r   r   r   ra   Ð   rh   c                 S   r`   r   )r.   r   ÚDecimalValidatorr[   r   r   r   ra   Ö   rb   Ú
max_lengthc                 S   r`   r   )r.   r   ÚMaxLengthValidatorr[   r   r   r   ra   à   rb   c                 s   rX   r   )r.   r   ÚMinLengthValidatorrZ   r[   r   r   r   r]   ç   r^   Ú
min_lengthc                 S   r`   r   )r.   r   rn   r[   r   r   r   ra   í   rb   r   )%Úlistr   r#   r'   r   rF   r=   r.   r   Ú	SlugFieldrI   Ú	TextFieldrW   r   rJ   r   ÚnullÚ	AutoFieldÚeditableÚhas_defaultÚblankÚ	CharFieldÚ
ArrayFieldÚFilePathFieldrR   rS   rT   rU   rV   ÚnextÚNUMERIC_FIELD_TYPESÚURLFieldÚ
EmailFieldÚGenericIPAddressFieldÚDecimalFieldÚ	FileFieldrD   )
r%   r$   ÚkwargsÚvalidator_kwargrG   rH   r_   rd   rl   ro   r   r   r   Úget_field_kwargsX   sØ   


ÿ
ÿþ
þ








ÿýÿÿýÿÿÿÿÿÿ"ÿÿýÿr„   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.
    )r:   Ú	view_nameTÚmanyÚto_fieldr:   rN   NrE   rF   rM   FrO   r   r8   r9   rQ   r   )r@   r-   Úget_limit_choices_tor.   r   ÚQrA   Úpopr#   r'   r   rF   ru   rs   Úgetrv   rw   r   r=   r   r,   r?   )r%   Úrelation_infor$   Úrelated_modelÚto_manyr‡   Úhas_through_modelÚreverser‚   Úlimit_choices_torF   r\   r   r   r   Úget_relation_kwargsú   sT   þ
þ
r’   c                 C   s   ddi}| j rd|d< |S )NrN   Tr†   )rŽ   )rŒ   r‚   r   r   r   Úget_nested_relation_kwargs3  s   r“   c                 C   s   dt | ƒiS )Nr…   )r-   )r$   r   r   r   Úget_url_kwargs:  s   ÿr”   c                 C   s,   | j  dd ¡}|r|| jjj| jdœ }|S )Nr8   )r(   Úfield_label)Úerror_messagesr‹   r,   r)   r#   )r$   rC   r   r   r   r?   @  s   þr?   )r   r   Údjango.corer   Ú	django.dbr   Údjango.utils.textr   Úrest_framework.compatr   Úrest_framework.validatorsr   ÚIntegerFieldÚ
FloatFieldr€   ÚDurationFieldr|   r   r'   r-   rD   r„   r’   r“   r”   r?   r   r   r   r   Ú<module>   s&    ÿ	
 #9