U
    ߟi,                     @   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   X/var/www/SKSBV.IN/venv/lib/python3.8/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k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                 C   s  i }t |j}||d< |jr4t|| r4t|j|d< |jrD|j|d< t|dd}|dk	r`||d< t|dd}|dk	r|||d< t|tj	r|j
|d< t|tjr|jrtrt|tjsttdrt|tjrd	d
i|d< |jrd|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k	r|j|d< |jdk	r|j|d< |jdk	r|j|d< |jdk	r|j|d< |jr|j|d< ntdd |D d}|dk	r4t|tr4||d< dd |D }tdd |D d}|dk	rtt|trt||d< d d |D }t|tjrd!d |D }t|tj rd"d |D }t|tj	rd#d |D }t|tj!rd$d |D }t|tj"r d%d |D }t|d&d}|dk	rDt|tjtjtj#frD||d&< d'd |D }td(d |D d}	|	dk	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	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   )
isinstancer   MaxValueValidatorlimit_value.0	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   r>   r@   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   MinValueValidatorr?   r@   r   r   r   rC      s   	min_valuec                 S   s   g | ]}t |tjs|qS r   )r=   r   rF   r@   r   r   r   rE      s   c                 S   s   g | ]}t |tjs|qS r   )r=   r   ZURLValidatorr@   r   r   r   rE      s   c                 S   s   g | ]}|t jk	r|qS r   )r   Zvalidate_emailr@   r   r   r   rE      s   
c                 S   s   g | ]}|t jk	r|qS r   )r   Zvalidate_slugr@   r   r   r   rE      s   
c                 S   s   g | ]}|t jk	r|qS r   )r   Zvalidate_ipv46_addressr@   r   r   r   rE      s   
c                 S   s   g | ]}t |tjs|qS r   )r=   r   ZDecimalValidatorr@   r   r   r   rE      s   
max_lengthc                 S   s   g | ]}t |tjs|qS r   )r=   r   ZMaxLengthValidatorr@   r   r   r   rE      s   c                 s   s    | ]}t |tjr|jV  qd S r   )r=   r   MinLengthValidatorr?   r@   r   r   r   rC      s   
min_lengthc                 S   s   g | ]}t |tjs|qS r   )r=   r   rI   r@   r   r   r   rE      s   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.   rD   rG   rH   rJ   rB   r   r   r   get_field_kwargsA   s    









"
r\   c                 C   s~  |\}}}}}}|j t|d}|r,d|d< |r8||d< |oB| }	|	rrt|	tjs`tjf |	}	|d |	|d< |rd|d< |dd |rz|jrt	|| rt
|j|d< |j}
|
r|
|d	< |jsd|d< |dd |jrd|d
< |ddr|S | s|js|jrd|d< |jr,|j|d< t|ddrdt|jj t|d}|dg |g |d< |rz|jszd|d< |S )z@
    Creates a default instance of a flat relational field.
    )rM   	view_nameTmanyto_fieldrM   r3   Nr+   r,   r2   Fr4   r   rK   rL   r6   )rX   r*   Zget_limit_choices_tor=   r   Qfilterpopr"   r%   r   r,   rR   rQ   getrS   rT   r   rP   r   r)   rY   )r$   relation_infor#   Zrelated_modelto_manyr_   Zhas_through_modelreverser[   Zlimit_choices_tor,   rB   r   r   r   get_relation_kwargs   sT    
rg   c                 C   s   ddi}| j rd|d< |S )Nr3   Tr^   )re   )rd   r[   r   r   r   get_nested_relation_kwargs   s    rh   c                 C   s   dt | iS )Nr]   )r*   )r#   r   r   r   get_url_kwargs'  s     ri   c                 C   s,   | j dd }|r(|| jjj| jd }|S )NrK   )r&   Zfield_label)Zerror_messagesrc   r)   r'   r"   )r#   Zunique_error_messager   r   r   rY   -  s    rY   )r   r   Zdjango.corer   Z	django.dbr   Zdjango.utils.textr   Zrest_framework.compatr   Zrest_framework.validatorsr   ZIntegerFieldZ
FloatFieldrW   ZDurationFieldrV   r   r%   r*   r\   rg   rh   ri   rY   r   r   r   r   <module>   s(      	
 '9