o
    ).h,                     @   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   a/var/www/supernova/superenvnew/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                 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|d+drt$|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	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   )
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   )rB   r   rC   rE   r   r   r   
<listcomp>       
z$get_field_kwargs.<locals>.<listcomp>c                 s   rA   r   )rB   r   MinValueValidatorrD   rE   r   r   r   rH      rI   	min_valuec                 S   rK   r   )rB   r   rN   rE   r   r   r   rL      rM   c                 S   rK   r   )rB   r   URLValidatorrE   r   r   r   rL      rM   c                 S      g | ]	}|t jur|qS r   )r   validate_emailrE   r   r   r   rL      
    
c                 S   rQ   r   )r   validate_slugrE   r   r   r   rL      rS   c                 S   rQ   r   )r   validate_ipv46_addressrE   r   r   r   rL      rS   c                 S   rK   r   )rB   r   DecimalValidatorrE   r   r   r   rL      rM   
max_lengthc                 S   rK   r   )rB   r   MaxLengthValidatorrE   r   r   r   rL      rM   c                 s   rA   r   )rB   r   MinLengthValidatorrD   rE   r   r   r   rH      rI   
min_lengthc                 S   rK   r   )rB   r   rY   rE   r   r   r   rL      rM   uniquequerysetmessager   ))listr   r#   r'   r   r/   getattrrB   r   	SlugFieldr2   	TextFieldr@   r   r3   r   null	AutoFieldeditablehas_defaultblank	CharField
ArrayFieldFilePathFieldr;   r<   r=   r>   r?   nextNUMERIC_FIELD_TYPESURLField
EmailFieldGenericIPAddressFieldDecimalField	FileFieldr   r,   _default_managerget_unique_error_messageappend)r%   r$   kwargsvalidator_kwargr0   r1   rJ   rO   rW   rZ   rG   r   r   r   get_field_kwargsA   s   













"
rw   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]   r7   Nr.   r/   r6   Fr8   r   r[   r\   r:   r   )rr   r-   get_limit_choices_torB   r   Qfilterpopr#   r'   r   r/   re   rc   getrf   rg   r   r`   r   r,   rs   )r%   relation_infor$   related_modelto_manyrz   has_through_modelreverseru   limit_choices_tor/   rG   r   r   r   get_relation_kwargs   sT   

r   c                 C   s   ddi}| j rd|d< |S )Nr7   Try   )r   )r   ru   r   r   r   get_nested_relation_kwargs   s   r   c                 C   s   dt | iS )Nrx   )r-   )r$   r   r   r   get_url_kwargs'  s   r   c                 C   s,   | j dd }|r|| jjj| jd }|S )Nr[   )r(   field_label)error_messagesr   r,   r)   r#   )r$   unique_error_messager   r   r   rs   -  s   rs   )r   r   django.corer   	django.dbr   django.utils.textr   rest_framework.compatr   rest_framework.validatorsr   IntegerField
FloatFieldrp   DurationFieldrl   r   r'   r-   rw   r   r   r   rs   r   r   r   r   <module>   s$    	
 '9