3
Ah`f,                 @   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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
   Q/tmp/pip-build-9m32_hle/djangorestframework/rest_framework/utils/field_mapping.py__init__   s    zClassLookupDict.__init__c             C   sR   t |dr|j}n|j}x&tj|D ]}|| jkr$| j| S q$W td|j d S )N_proxy_classzClass %s not found in lookup.)hasattrr   	__class__inspectZgetmror   KeyError__name__)r	   keyZ
base_classclsr
   r
   r   __getitem__   s    

zClassLookupDict.__getitem__c             C   s   || j |< d S )N)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   |j ddj }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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 strt|tjsttdrt|tjrd	d
i|d< t|tjs|j rd|d< |S |j s|js|jrd|d< |jr*d|d< |jrNt|tjtjfrNd|d< |j rttrtt|tjrtd|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	r:t|tr:||d< dd |D }tdd |D d}|dk	rzt|trz||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	rJt|tjtjtj#frJ||d&< d'd |D }td(d |D d}	|	dk	rt|tjr|	|d)< d*d |D }t|d+dr|j$j%d+d}
|
r|
|j&j'j|jd, }
t(|j&j)|
d-}|j*| |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	read_onlyFrequired
allow_nullZallow_blankallow_emptypathmatch	recursiveallow_filesallow_folderschoicesc             s   s    | ]}t |tjr|jV  qd S )N)
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
   )r9   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 )N)r9   r   MinValueValidatorr;   )r<   r=   r
   r
   r   r>      s    	min_valuec             S   s   g | ]}t |tjs|qS r
   )r9   r   rA   )r<   r=   r
   r
   r   r@      s    c             S   s   g | ]}t |tjs|qS r
   )r9   r   ZURLValidator)r<   r=   r
   r
   r   r@      s    c             S   s   g | ]}|t jk	r|qS r
   )r   Zvalidate_email)r<   r=   r
   r
   r   r@      s    c             S   s   g | ]}|t jk	r|qS r
   )r   Zvalidate_slug)r<   r=   r
   r
   r   r@      s    c             S   s   g | ]}|t jk	r|qS r
   )r   Zvalidate_ipv46_address)r<   r=   r
   r
   r   r@      s    c             S   s   g | ]}t |tjs|qS r
   )r9   r   ZDecimalValidator)r<   r=   r
   r
   r   r@      s    
max_lengthc             S   s   g | ]}t |tjs|qS r
   )r9   r   ZMaxLengthValidator)r<   r=   r
   r
   r   r@      s    c             s   s    | ]}t |tjr|jV  qd S )N)r9   r   MinLengthValidatorr;   )r<   r=   r
   r
   r   r>      s    
min_lengthc             S   s   g | ]}t |tjs|qS r
   )r9   r   rD   )r<   r=   r
   r
   r   r@      s    unique)r#   Zfield_label)querysetmessager   )+listr   r   r"   r   r)   getattrr9   r   Z	SlugFieldr,   Z	TextFieldr8   r   r-   r   Z	AutoFieldeditablehas_defaultblanknullZ	CharFieldZ
ArrayFieldZFilePathFieldr3   r4   r5   r6   r7   nextNUMERIC_FIELD_TYPESZURLFieldZ
EmailFieldZGenericIPAddressFieldDecimalFieldZ	FileFieldZerror_messagesgetr&   r$   r   _default_managerappend)r!   r    kwargsZvalidator_kwargr*   r+   r?   rB   rC   rE   Zunique_error_messager=   r
   r
   r   get_field_kwargsA   s    







"
rV   c             C   s|  |\}}}}}}|j t|d}|r,d|d< |r8||d< |oB|j }	|	rrt|	tjs`tjf |	}	|d j|	|d< |rd|d< |jdd |rx|jrt	|| rt
|j|d< |j}
|
r|
|d	< |jsd|d< |jdd |jdd
r|S |j s|js|jrd
|d< |jrd|d< |jr.|j|d< t|dd
r`t|jj d}|jdg |g |d< |rx|j rxd
|d< |S )z@
    Creates a default instance of a flat relational field.
    )rG   	view_nameTmanyto_fieldrG   r/   Nr(   r)   Fr0   r1   r   rF   )rG   r2   )rS   r'   Zget_limit_choices_tor9   r   Qfilterpopr   r"   r   r)   rK   rR   rL   rM   rN   r   rJ   r   r&   )r!   relation_infor    Zrelated_modelto_manyrY   Zhas_through_modelreverserU   Zlimit_choices_tor)   r=   r
   r
   r   get_relation_kwargs   sL    
r`   c             C   s   ddi}| j rd|d< |S )Nr/   TrX   )r^   )r]   rU   r
   r
   r   get_nested_relation_kwargs$  s    ra   c             C   s   dt | iS )NrW   )r'   )r    r
   r
   r   get_url_kwargs+  s    rb   )r   r   Zdjango.corer   Z	django.dbr   Zdjango.utils.textr   Zrest_framework.compatr   Zrest_framework.validatorsr   ZIntegerFieldZ
FloatFieldrQ   ZDurationFieldrP   r   r"   r'   rV   r`   ra   rb   r
   r
   r
   r   <module>   s   	
 -7