3
>^+                 @   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	e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-8app2_gc/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__inspect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| j j| j jj d 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)	app_label
model_name)_metar$   Z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strt|tjrdd	i|d
< t|tjs|j rd|d< |S |j s|js|jrd|d< |jrt|tj rd|d< |jr:t|tjtjfr:d|d< t|tjr|j|d< |jdk	rh|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	r@t|tr@||d< dd |D }t|tjr\dd |D }t|tjrxd d |D }t|tj	rd!d |D }t|tj rd"d |D }t|tj!rd#d |D }t|d$d}|dk	rt|tjtjtj"fr||d$< d%d |D }td&d |D d}	|	dk	rRt|tjrR|	|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_unicodeZbase_templateztextarea.htmlstyleT	read_onlyFrequired
allow_nullZallow_blank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	TextFieldr   Z	JSONFieldZ	AutoFieldeditablehas_defaultblanknullZNullBooleanFieldZ	CharFieldZFilePathFieldr3   r4   r5   r6   r7   r8   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_kwargsB   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   r0   Nr*   r+   Fr1   r2   r   rF   )rG   Zallow_empty)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 )Nr0   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   objectr   r#   r)   rV   r`   ra   rb   r
   r
   r
   r   <module>   s   	 (7