o
    "7hc/                     @   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   w/var/www/epreuve.sigeris.cm/public_html/epreuve/venv/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sd|d< |S | s|js|jrd|d< |jrt|tjtjfrd|d< |jstrt|tjrd|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< nt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rt|tjtjtj#fr||d&< d'd |D }td(d |D d}	|	durt|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rd|d< |jr|j|d< t|ddrt|jj t|d}|dg |g |d< |r|jsd|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