3
=^                @   s<  d dl mZ d dlZd dlZd dlZd dlZd dlZd dl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mZmZmZ d dlmZ d d	lmZ d d
lmZmZ d dlmZm Z m!Z!m"Z" d dl#m$Z$ d dl%m&Z&m'Z' d dl(m)Z)m*Z* d dl+m,Z, d dl-m.Z. d dl/m0Z0 d dl1m2Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@ d dlAmBZBmZ d dlCmDZD d dlEmFZFmGZGmHZHmIZI G dd dZJejKrdd ZLndd ZLdd ZMd d! ZNd"d# ZOd$d% ZPdtd&d'ZQd(d) ZRG d*d+ d+eSZTG d,d- d-eSZUG d.d/ d/eVZWeXejYd0ZZd1Z[d2Z\d3Z]d4Z^d5Z_G d6d7 d7eSZ`G d8d9 d9e`ZaG d:d; d;e`ZbG d<d= d=e`ZcG d>d? d?ecZdG d@dA dAecZeG dBdC dCecZfG dDdE dEecZgG dFdG dGe`ZhG dHdI dIecZiG dJdK dKe`ZjG dLdM dMe`ZkG dNdO dOe`ZlG dPdQ dQe`ZmG dRdS dSe`ZnG dTdU dUe`ZoG dVdW dWe`ZpG dXdY dYe`ZqG dZd[ d[eqZrG d\d] d]eqZG d^d_ d_e`ZsG d`da daesZG dbdc dce`ZtG ddde dee`ZuG dfdg dge`ZvG dhdi dievZwG djdk dke`ZxG dldm dme`ZyG dndo doe`ZzG dpdq dqe`Z{G drds dse`Z|dS )u    )unicode_literalsN)OrderedDict)settings)ObjectDoesNotExist)ValidationError)EmailValidatorRegexValidatorURLValidatorip_address_validators)FilePathField)
ImageField)sixtimezone)
parse_dateparse_datetimeparse_duration
parse_time)duration_string)is_protected_type
smart_text)localize_inputsanitize_separators)lazy)clean_ipv6_address)utc)ugettext_lazy)InvalidTimeError)ISO_8601)MappingMaxLengthValidatorMaxValueValidatorMinLengthValidatorMinValueValidatorProhibitNullCharactersValidatorunicode_reprunicode_to_repr)ErrorDetailr   )api_settings)htmlhumanize_datetimejsonrepresentationc               @   s   e Zd ZdZdS )emptyz
    This class is used to represent no data being provided for a given input
    or output value.

    It is required because `None` may be a valid input or output value.
    N)__name__
__module____qualname____doc__ r1   r1   D/tmp/pip-build-8app2_gc/djangorestframework/rest_framework/fields.pyr,   ,   s   r,   c             C   sJ   t j| pt j| pt| tjs$dS t j| }|jj }t	dd |D S )zK
        True if the object is a callable that takes no arguments.
        Fc             s   s2   | ]*}|j |jkp(|j |jkp(|j|jkV  qd S )N)kindVAR_POSITIONALVAR_KEYWORDdefaultr,   ).0paramr1   r1   r2   	<genexpr>A   s   z%is_simple_callable.<locals>.<genexpr>)
inspect
isfunctionismethod
isinstance	functoolspartial	signature
parametersvaluesall)objsigparamsr1   r1   r2   is_simple_callable7   s     

rG   c       	      C   st   t j| }t j| }|p|s dS |r.| jd k}t j| \}}}}|sH|rPt|n
t|d }|rht|nd}||kS )NF   r   )r:   r;   r<   Zim_self
getargspeclen)	rD   functionmethodZ
is_unboundargs_defaultsZlen_argsZlen_defaultsr1   r1   r2   rG   H   s    


c             C   s   x|D ]}y"t | tr | | } n
t| |} W n tk
r@   dS X t| ry
|  } W q ttfk
r } ztdj||W Y dd}~X qX qW | S )z
    Similar to Python's built in `getattr(instance, attr)`,
    but takes a list of nested attributes, instead of a single attribute.

    Also accepts either attribute lookup on objects or dictionary lookups.
    NzIException raised in callable attribute "{0}"; original exception was: {1})	r=   r   getattrr   rG   AttributeErrorKeyError
ValueErrorformat)instanceattrsattrexcr1   r1   r2   get_attributeY   s    



&rY   c             C   sP   |s| j | dS x,|dd D ]}|| kr4i | |< | | } q W || |d < dS )a1  
    Similar to Python's built in `dictionary[key] = value`,
    but takes a list of nested keys instead of a single key.

    set_value({'a': 1}, [], {'b': 2}) -> {'a': 1, 'b': 2}
    set_value({'a': 1}, ['x'], 2) -> {'a': 1, 'x': 2}
    set_value({'a': 1}, ['x', 'y'], 2) -> {'a': 1, 'x': {'y': 2}}
    NrH   rZ   )update)
dictionarykeysvaluekeyr1   r1   r2   	set_valuet   s    	
r`   c             C   s\   t  }xP| D ]H}t|ttfs(|||< q|\}}t|ttfrLt|||< q|||< qW |S )z
    Convert choices into key/value dicts.

    to_choices_dict([1]) -> {1: 1}
    to_choices_dict([(1, '1st'), (2, '2nd')]) -> {1: '1st', 2: '2nd'}
    to_choices_dict([('Group', ((1, '1st'), 2))]) -> {'Group': {1: '1st', 2: '2'}}
    )r   r=   listtupleto_choices_dict)choicesretchoicer_   r^   r1   r1   r2   rc      s    

rc   c             C   sR   t  }xF| j D ]:\}}t|trBx&|j D ]\}}|||< q,W q|||< qW |S )z
    Convert a group choices dict into a flat dict of choices.

    flatten_choices_dict({1: '1st', 2: '2nd'}) -> {1: '1st', 2: '2nd'}
    flatten_choices_dict({'Group': {1: '1st', 2: '2nd'}}) -> {1: '1st', 2: '2nd'}
    )r   itemsr=   dict)rd   re   r_   r^   sub_key	sub_valuer1   r1   r2   flatten_choices_dict   s    
rk   c             c   s   G dd dt }G dd dt }G dd dt }d}x| j D ]\}}|rT||krTP t|tr||dV  x8|j D ],\}	}
|r||krP ||	|
d	V  |d
7 }qtW | V  q>|||d	V  |d
7 }q>W |r||kr|r|j|d}|d|ddV  dS )zE
    Helper function for options and option groups in templates.
    c               @   s   e Zd ZdZdZdd ZdS )z&iter_options.<locals>.StartOptionGroupTFc             S   s
   || _ d S )N)label)selfrl   r1   r1   r2   __init__   s    z/iter_options.<locals>.StartOptionGroup.__init__N)r-   r.   r/   start_option_groupend_option_grouprn   r1   r1   r1   r2   StartOptionGroup   s   rq   c               @   s   e Zd ZdZdZdS )z$iter_options.<locals>.EndOptionGroupFTN)r-   r.   r/   ro   rp   r1   r1   r1   r2   EndOptionGroup   s   rr   c               @   s   e Zd ZdZdZdddZdS )ziter_options.<locals>.OptionFc             S   s   || _ || _|| _d S )N)r^   display_textdisabled)rm   r^   rs   rt   r1   r1   r2   rn      s    z%iter_options.<locals>.Option.__init__N)F)r-   r.   r/   ro   rp   rn   r1   r1   r1   r2   Option   s   ru   r   )rl   )r^   rs   rH   )countzn/aT)r^   rs   rt   N)objectrg   r=   rh   rT   )grouped_choicescutoffcutoff_textrq   rr   ru   rv   r_   r^   ri   rj   r1   r1   r2   iter_options   s(    	

r{   c                sV   t | ddpd y
| j}W n$ tk
r>    fdd| jD S X  fdd|j D S )zf
    Given a Django ValidationError, return a list of ErrorDetail,
    with the `code` populated.
    codeNinvalidc                s0   g | ](}t |j|jpf  |jr$|jn d qS ))r|   )r&   messagerF   r|   )r7   error)r|   r1   r2   
<listcomp>   s   z$get_error_detail.<locals>.<listcomp>c                s$   i | ]\}} fd d|D |qS )c                s0   g | ](}t |j|jpf  |jr$|jn d qS ))r|   )r&   r~   rF   r|   )r7   r   )r|   r1   r2   r      s   z/get_error_detail.<locals>.<dictcomp>.<listcomp>r1   )r7   kerrors)r|   r1   r2   
<dictcomp>   s   z$get_error_detail.<locals>.<dictcomp>)rP   
error_dictrQ   Z
error_listrg   )exc_infor   r1   )r|   r2   get_error_detail   s    


r   c               @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )CreateOnlyDefaultz
    This class may be used to provide default values that are only used
    for create operations, but that do not return any value for update
    operations.
    c             C   s
   || _ d S )N)r6   )rm   r6   r1   r1   r2   rn     s    zCreateOnlyDefault.__init__c             C   s<   |j jd k	| _t| jr8t| jdr8| j r8| jj| d S )Nset_context)parentrU   	is_updatecallabler6   hasattrr   )rm   serializer_fieldr1   r1   r2   r     s    zCreateOnlyDefault.set_contextc             C   s$   | j rt t| jr| j S | jS )N)r   	SkipFieldr   r6   )rm   r1   r1   r2   __call__  s
    
zCreateOnlyDefault.__call__c             C   s   t d| jjt| jf S )Nz%s(%s))r%   	__class__r-   r$   r6   )rm   r1   r1   r2   __repr__  s    zCreateOnlyDefault.__repr__N)r-   r.   r/   r0   rn   r   r   r   r1   r1   r1   r2   r      s
   r   c               @   s$   e Zd Zdd Zdd Zdd ZdS )CurrentUserDefaultc             C   s   |j d j| _d S )Nrequest)contextuser)rm   r   r1   r1   r2   r     s    zCurrentUserDefault.set_contextc             C   s   | j S )N)r   )rm   r1   r1   r2   r     s    zCurrentUserDefault.__call__c             C   s   t d| jj S )Nz%s())r%   r   r-   )rm   r1   r1   r2   r      s    zCurrentUserDefault.__repr__N)r-   r.   r/   r   r   r   r1   r1   r1   r2   r     s   r   c               @   s   e Zd ZdS )r   N)r-   r.   r/   r1   r1   r1   r2   r   $  s   r    z-May not set both `read_only` and `write_only`z+May not set both `read_only` and `required`z)May not set both `required` and `default`z-Field(read_only=True) should be ReadOnlyFieldzrValidationError raised by `{class_name}`, but error key `{key}` does not exist in the `error_messages` dictionary.c                   s  e Zd ZdZededdZg ZeZdZ	dddeedddddddfddZ
d	d
 Zedd Zejdd Zdd Zdd Zdd Zdd Zdd Zdd ZefddZdd Zdd Zd d! Zd"d# Zed$d% Zed&d' Z fd(d)Zd*d+ Zd,d- Z  ZS ).Fieldr   zThis field is required.zThis field may not be null.)requirednullNFc             C   sR  t j| _t  jd7  _|d kr,|tko*| }|o2| s>tt|oD| sPtt|oZ|tk	 sftt|or| jt k s~tt|| _	|| _
|| _|| _|| _|tkr| jn|| _|| _|| _|	d kri n|	| _|| _| jtk	r|tk	r|| _|d k	rt|| _d | _d | _i }x(t| jjD ]}|jt|di  qW |j|
pDi  || _d S )NrH   default_error_messages)r   _creation_counterr,   AssertionErrorNOT_READ_ONLY_WRITE_ONLYNOT_READ_ONLY_REQUIREDNOT_REQUIRED_DEFAULTr   USE_READONLYFIELD	read_only
write_onlyr   r6   sourceinitialrl   	help_textstyle
allow_nulldefault_empty_htmlra   
validators
field_namer   reversed__mro__r[   rP   error_messages)rm   r   r   r   r6   r   r   rl   r   r   r   r   r   messagesclsr1   r1   r2   rn   ?  s<    

zField.__init__c             C   s   | j |ks$td|| jj|jjf || _|| _| jdkrL|jddj | _| j dkr\|| _ | j dkrng | _	n| j j
d| _	dS )z
        Initializes the field name and parent for the field instance.
        Called when a field is added to the parent serializer instance.
        zIt is redundant to specify `source='%s'` on field '%s' in serializer '%s', because it is the same as the field name. Remove the `source` keyword argument.NrN    *.)r   r   r   r-   r   r   rl   replace
capitalizesource_attrssplit)rm   r   r   r1   r1   r2   bindm  s    	


z
Field.bindc             C   s   t | ds| j | _| jS )N_validators)r   get_validatorsr   )rm   r1   r1   r2   r     s    

zField.validatorsc             C   s
   || _ d S )N)r   )rm   r   r1   r1   r2   r     s    c             C   s
   t | jS )N)ra   default_validators)rm   r1   r1   r2   r     s    zField.get_validatorsc             C   s   t | jr| j S | jS )z
        Return a value to use when the field is being returned as a primitive
        value, without any object instance.
        )r   r   )rm   r1   r1   r2   get_initial  s    
zField.get_initialc             C   s   t j|r| j|kr,t| jddr&tS | jS || j }|dkrX| jrXt| ddrTdS dS |dkr|| j r|t| ddrxdS tS |S |j	| jtS )z
        Given the *incoming* primitive data, return the value for this field
        that should be validated and transformed to a native value.
        r?   Fr   allow_blankN)
r(   is_html_inputr   rP   rootr,   r   r   r   get)rm   r\   re   r1   r1   r2   	get_value  s    


zField.get_valuec             C   s   yt || jS  ttfk
r } z`| jtk	r4| j S | jr>dS | jsJt	 dj
t|j| j| jjj|jj|d}t||W Y dd}~X nX dS )z~
        Given the *outgoing* object instance, return the primitive value
        that should be used for this field.
        NzGot {exc_type} when attempting to get a value for field `{field}` on serializer `{serializer}`.
The serializer field might be named incorrectly and not match any attribute or key on the `{instance}` instance.
Original exception text was: {exc}.)exc_typefield
serializerrU   rX   )rY   r   rR   rQ   r6   r,   get_defaultr   r   r   rT   typer-   r   r   r   )rm   rU   rX   msgr1   r1   r2   rY     s     
zField.get_attributec             C   sN   | j tkst| jddrt t| j rHt| j dr@| j j|  | j  S | j S )a2  
        Return the default value to use when validating data if no input
        is provided for this field.

        If a default has not been set for this field then this will simply
        raise `SkipField`, indicating that no value should be set in the
        validated data for this field.
        r?   Fr   )r6   r,   rP   r   r   r   r   r   )rm   r1   r1   r2   r     s    	
zField.get_defaultc             C   sn   | j rd| j fS |tkrJt| jddr.t | jr>| jd d| j fS |dkrf| jsb| jd dS d|fS )a  
        Validate empty values, and either:

        * Raise `ValidationError`, indicating invalid data.
        * Raise `SkipField`, indicating that the field should be ignored.
        * Return (True, data), indicating an empty value that should be
          returned without any further validation being applied.
        * Return (False, data), indicating a non-empty value, that should
          have validation applied as normal.
        Tr?   Fr   Nr   )TN)	r   r   r,   rP   r   r   r   failr   )rm   datar1   r1   r2   validate_empty_values  s    

zField.validate_empty_valuesc             C   s.   | j |\}}|r|S | j|}| j| |S )a  
        Validate a simple representation and return the internal value.

        The provided data may be `empty` if no representation was included
        in the input.

        May raise `SkipField` if the field should not be included in the
        validated data.
        )r   to_internal_valuerun_validators)rm   r   Zis_empty_valuer^   r1   r1   r2   run_validation
  s    


zField.run_validationc             C   s   g }x| j D ]}t|dr$|j|  y|| W q tk
rl } z t|jtrP |j|j W Y dd}~X q tk
r } z|jt	| W Y dd}~X qX qW |rt|dS )z
        Test the given value against all the validators on the field,
        and either raise a `ValidationError` or simply return.
        r   N)
r   r   r   r   r=   detailrh   extendDjangoValidationErrorr   )rm   r^   r   	validatorrX   r1   r1   r2   r     s    

$zField.run_validatorsc             C   s   t dj| jjddS )zN
        Transform the *incoming* primitive data into a native value.
        z.{cls}.to_internal_value() must be implemented.)r   N)NotImplementedErrorrT   r   r-   )rm   r   r1   r1   r2   r   3  s    zField.to_internal_valuec             C   s   t dj| jj| jddS )zL
        Transform the *outgoing* native value into primitive data.
        z{cls}.to_representation() must be implemented for field {field_name}. If you do not need to support write operations you probably want to subclass `ReadOnlyField` instead.)r   r   N)r   rT   r   r-   r   )rm   r^   r1   r1   r2   to_representation=  s    zField.to_representationc             K   s^   y| j | }W n2 tk
r@   | jj}tj||d}t|Y nX |jf |}t||ddS )zH
        A helper method that simply raises a validation error.
        )
class_namer_   )r|   N)r   rR   r   r-   MISSING_ERROR_MESSAGErT   r   r   )rm   r_   kwargsr   r   Zmessage_stringr1   r1   r2   r   J  s    z
Field.failc             C   s   | }x|j dk	r|j }qW |S )zB
        Returns the top-level serializer for this field.
        N)r   )rm   r   r1   r1   r2   r   W  s    
z
Field.rootc             C   s   t | jdi S )zY
        Returns the context as passed to the root serializer on initialization.
        _context)rP   r   )rm   r1   r1   r2   r   a  s    zField.contextc                s    t t| j| }||_||_|S )z
        When a field is instantiated, we store the arguments that were used,
        so that we can present a helpful representation of the object.
        )superr   __new___args_kwargs)r   rM   r   rU   )r   r1   r2   r   h  s    zField.__new__c             C   s0   dd | j D }dd | jj D }| j||S )z
        When cloning fields we instantiate using the arguments it was
        originally created with, rather than copying the complete state.
        c             S   s$   g | ]}t |tstj|n|qS r1   )r=   
REGEX_TYPEcopydeepcopy)r7   itemr1   r1   r2   r   {  s   z&Field.__deepcopy__.<locals>.<listcomp>c             S   s(   i | ] \}}|dkrt j|n||qS )r   regex)r   r   )r   r   )r7   r_   r^   r1   r1   r2   r   ~  s   z&Field.__deepcopy__.<locals>.<dictcomp>)r   r   rg   r   )rm   memorM   r   r1   r1   r2   __deepcopy__r  s
    	
zField.__deepcopy__c             C   s   t tj| S )z
        Fields are represented using their initial calling arguments.
        This allows us to create descriptive representations for serializer
        instances that show all the declared fields on the serializer.
        )r%   r+   Z
field_repr)rm   r1   r1   r2   r     s    zField.__repr__) r-   r.   r/   r   rN   r   r   r,   r   r   rn   r   propertyr   setterr   r   r   rY   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r1   r1   )r   r2   r   4  s:   +$	


r   c               @   s   e Zd ZdediZdZdZdddddd	d
ddddddddhZdddddddddddddd d!dhZd"d#d$d%d&hZ	d'd( Z
d)d* Zd&S )+BooleanFieldr}   zMust be a valid boolean.FtTyYyesYEStrueTrueTRUEonOnON1rH   TfFnNnoNOfalseFalseFALSEoffOffOFF0r   g        r   NullNULLr   Nc             C   s\   y4|| j krdS || jkrdS || jkr2| jr2d S W n tk
rH   Y nX | jd|d d S )NTFr}   )input)TRUE_VALUESFALSE_VALUESNULL_VALUESr   	TypeErrorr   )rm   r   r1   r1   r2   r     s    

zBooleanField.to_internal_valuec             C   s8   || j krdS || jkrdS || jkr0| jr0d S t|S )NTF)r  r  r  r   bool)rm   r^   r1   r1   r2   r     s    

zBooleanField.to_representation)r-   r.   r/   rN   r   r   r   r  r  r  r   r   r1   r1   r1   r2   r     s$   r   c                   s   e Zd ZdediZdZdddddd	d
ddddddddhZdddddddddddddd d!d"hZd#d$d%d&dhZ fd'd(Z	d)d* Z
d+d, Z  ZS )-NullBooleanFieldr}   zMust be a valid boolean.Nr   r   r   r   r   r   r   r   r   r   r   r   r   rH   Tr   r   r   r   r   r   r   r   r   r   r   r   r   r   g        Fr   r   r  r   c                s.   d|kst dd|d< tt| jf | d S )Nr   z#`allow_null` is not a valid option.T)r   r   r  rn   )rm   r   )r   r1   r2   rn     s    zNullBooleanField.__init__c             C   sV   y.|| j krdS || jkrdS || jkr,d S W n tk
rB   Y nX | jd|d d S )NTFr}   )r  )r  r  r  r  r   )rm   r   r1   r1   r2   r     s    


z"NullBooleanField.to_internal_valuec             C   s2   || j krd S || jkrdS || jkr*dS t|S )NTF)r  r  r  r  )rm   r^   r1   r1   r2   r     s    


z"NullBooleanField.to_representation)r-   r.   r/   rN   r   r   r  r  r  rn   r   r   r   r1   r1   )r   r2   r    s$   r  c                   s^   e Zd ZededededdZdZ fddZef fd	d
	Zdd Z	dd Z
  ZS )	CharFieldzNot a valid string.zThis field may not be blank.z;Ensure this field has no more than {max_length} characters.z7Ensure this field has at least {min_length} characters.)r}   blank
max_length
min_lengthr   c                s   |j dd| _|j dd| _|j dd | _|j dd | _tt| jf | | jd k	rt| j	d j
tj| jd}| jjt| j|d | jd k	rt| j	d j
tj| jd	}| jjt| j|d td k	r| jjt  d S )
Nr   Ftrim_whitespaceTr  r  )r  )r~   )r  )popr   r  r  r  r   r	  rn   r   r   rT   r   	text_typer   appendr   r!   r#   )rm   r   r~   )r   r1   r2   rn     s&    



zCharField.__init__c                sD   |dks | j r4tj|j dkr4| js0| jd dS tt| j|S )Nr   r
  )	r  r   r  stripr   r   r   r	  r   )rm   r   )r   r1   r2   r     s
     
zCharField.run_validationc             C   sJ   t |ts$t |tjtj tf  r.| jd tj|}| jrF|j	 S |S )Nr}   )
r=   r  r   string_typesinteger_typesfloatr   r  r  r  )rm   r   r^   r1   r1   r2   r     s    $

zCharField.to_internal_valuec             C   s
   t j|S )N)r   r  )rm   r^   r1   r1   r2   r   $  s    zCharField.to_representation)r-   r.   r/   rN   r   r   rn   r,   r   r   r   r   r1   r1   )r   r2   r	    s   
	r	  c                   s(   e Zd ZdediZ fddZ  ZS )
EmailFieldr}   zEnter a valid email address.c                s2   t t| jf | t| jd d}| jj| d S )Nr}   )r~   )r   r  rn   r   r   r   r  )rm   r   r   )r   r1   r2   rn   -  s    zEmailField.__init__)r-   r.   r/   rN   r   rn   r   r1   r1   )r   r2   r  (  s   r  c                   s(   e Zd ZdediZ fddZ  ZS )
RegexFieldr}   z/This value does not match the required pattern.c                s4   t t| jf | t|| jd d}| jj| d S )Nr}   )r~   )r   r  rn   r   r   r   r  )rm   r   r   r   )r   r1   r2   rn   8  s    zRegexField.__init__)r-   r.   r/   rN   r   rn   r   r1   r1   )r   r2   r  3  s   r  c                   s0   e Zd ZededdZd fdd	Z  ZS )	SlugFieldzLEnter a valid "slug" consisting of letters, numbers, underscores or hyphens.zUEnter a valid "slug" consisting of Unicode letters, numbers, underscores, or hyphens.)r}   invalid_unicodeFc                sd   t t| jf | || _| jr<ttjdtj| jd d}nttjd| jd d}| j	j
| d S )Nz	^[-\w]+\Zr  )r~   z^[-a-zA-Z0-9_]+$r}   )r   r  rn   allow_unicoder   recompileUNICODEr   r   r  )rm   r  r   r   )r   r1   r2   rn   D  s    zSlugField.__init__)F)r-   r.   r/   rN   r   rn   r   r1   r1   )r   r2   r  >  s   r  c                   s(   e Zd ZdediZ fddZ  ZS )URLFieldr}   zEnter a valid URL.c                s2   t t| jf | t| jd d}| jj| d S )Nr}   )r~   )r   r  rn   r	   r   r   r  )rm   r   r   )r   r1   r2   rn   S  s    zURLField.__init__)r-   r.   r/   rN   r   rn   r   r1   r1   )r   r2   r  N  s   r  c                   s<   e Zd ZdZdediZ fddZd	d
 Zdd Z  Z	S )	UUIDFieldhex_verbosehexinturnr}   zMust be a valid UUID.c                sF   |j dd| _| j| jkr0tdjdj| jtt| jf | d S )NrT   r  z<Invalid format for uuid representation. Must be one of "{0}"z", ")	r  uuid_formatvalid_formatsrS   rT   joinr   r  rn   )rm   r   )r   r1   r2   rn   `  s    zUUIDField.__init__c             C   sv   t |tjsryBt |tjr&tj|dS t |tjr>tj|dS | jd|d W n" tk
rp   | jd|d Y nX |S )N)r!  )r   r}   )r^   )r=   uuidUUIDr   r  r  r   rS   )rm   r   r1   r1   r2   r   i  s    zUUIDField.to_internal_valuec             C   s"   | j dkrt|S t|| j S d S )Nr  )r#  strrP   )rm   r^   r1   r1   r2   r   v  s    
zUUIDField.to_representation)r  r   r!  r"  )
r-   r.   r/   r$  rN   r   rn   r   r   r   r1   r1   )r   r2   r  Y  s
   	r  c                   s:   e Zd ZdZdediZd	 fdd	Z fddZ  ZS )
IPAddressFieldz5Support both IPAddressField and GenericIPAddressFieldr}   z#Enter a valid IPv4 or IPv6 address.bothc                sH   |j  | _| jdk| _tt| jf | t|| j\}}| jj| d S )Nr*  )	lowerprotocolunpack_ipv4r   r)  rn   r
   r   r   )rm   r,  r   r   error_message)r   r1   r2   rn     s
    
zIPAddressField.__init__c                sp   t |tjs| jd|d d|kr`y| jdkr:t|| jS W n" tk
r^   | jd|d Y nX tt	| j
|S )Nr}   )r^   :r*  ipv6)r*  r0  )r=   r   r  r   r,  r   r-  r   r   r)  r   )rm   r   )r   r1   r2   r     s    
z IPAddressField.to_internal_value)r*  )	r-   r.   r/   r0   rN   r   rn   r   r   r1   r1   )r   r2   r)  }  s   r)  c                   sX   e Zd ZededededdZdZejdZ fdd	Z	d
d Z
dd Z  ZS )IntegerFieldzA valid integer is required.z7Ensure this value is less than or equal to {max_value}.z:Ensure this value is greater than or equal to {min_value}.zString value too large.)r}   	max_value	min_valuemax_string_lengthi  z\.0*\s*$c                s   |j dd | _|j dd | _tt| jf | | jd k	rjt| jd jt	j
| jd}| jjt| j|d | jd k	rt| jd jt	j
| jd}| jjt| j|d d S )Nr2  r3  )r2  )r~   )r3  )r  r2  r3  r   r1  rn   r   r   rT   r   r  r   r  r    r"   )rm   r   r~   )r   r1   r2   rn     s    



zIntegerField.__init__c             C   sf   t |tjr$t|| jkr$| jd yt| jjdt	|}W n" t
tfk
r`   | jd Y nX |S )Nr4  r   r}   )r=   r   r  rJ   MAX_STRING_LENGTHr   r!  
re_decimalsubr(  rS   r  )rm   r   r1   r1   r2   r     s    
zIntegerField.to_internal_valuec             C   s   t |S )N)r!  )rm   r^   r1   r1   r2   r     s    zIntegerField.to_representation)r-   r.   r/   rN   r   r5  r  r  r6  rn   r   r   r   r1   r1   )r   r2   r1    s   

r1  c                   sN   e Zd ZededededdZdZ fddZd	d
 Zdd Z  Z	S )
FloatFieldzA valid number is required.z7Ensure this value is less than or equal to {max_value}.z:Ensure this value is greater than or equal to {min_value}.zString value too large.)r}   r2  r3  r4  i  c                s   |j dd | _|j dd | _tt| jf | | jd k	rjt| jd jt	j
| jd}| jjt| j|d | jd k	rt| jd jt	j
| jd}| jjt| j|d d S )Nr2  r3  )r2  )r~   )r3  )r  r2  r3  r   r8  rn   r   r   rT   r   r  r   r  r    r"   )rm   r   r~   )r   r1   r2   rn     s    



zFloatField.__init__c             C   sT   t |tjr$t|| jkr$| jd yt|S  ttfk
rN   | jd Y nX d S )Nr4  r}   )	r=   r   r  rJ   r5  r   r  r  rS   )rm   r   r1   r1   r2   r     s    
zFloatField.to_internal_valuec             C   s   t |S )N)r  )rm   r^   r1   r1   r2   r     s    zFloatField.to_representation)
r-   r.   r/   rN   r   r5  rn   r   r   r   r1   r1   )r   r2   r8    s   
r8  c                   sr   e Zd ZedededededededdZd	Zd fdd	Zdd Zdd Zdd Z	dd Z
  ZS )DecimalFieldzA valid number is required.z7Ensure this value is less than or equal to {max_value}.z:Ensure this value is greater than or equal to {min_value}.z@Ensure that there are no more than {max_digits} digits in total.zGEnsure that there are no more than {max_decimal_places} decimal places.zVEnsure that there are no more than {max_whole_digits} digits before the decimal point.zString value too large.)r}   r2  r3  
max_digitsmax_decimal_placesmax_whole_digitsr4  i  NFc                s0  || _ || _|| _|d k	r || _| jr,d| _|| _|| _| j d k	r\| jd k	r\| j | j | _nd | _tt| j	f | | jd k	rt
| jd jtj| jd}	| jjt| j|	d | jd k	rt
| jd jtj| jd}	| jjt| j|	d |d k	r&dd ttj D }
||
ks&td	||
f || _d S )
NTr2  )r2  )r~   r3  )r3  c             S   s   g | ]\}}|j d r|qS )ZROUND_)
startswith)r7   r   vr1   r1   r2   r     s    z)DecimalField.__init__.<locals>.<listcomp>z=Invalid rounding option %s. Valid values for rounding are: %s)r:  decimal_placeslocalizecoerce_to_stringr2  r3  r<  r   r9  rn   r   r   rT   r   r  r   r  r    r"   varsdecimalrg   r   rounding)rm   r:  r?  rA  r2  r3  r@  rD  r   r~   Zvalid_roundings)r   r1   r2   rn     s<    




zDecimalField.__init__c             C   s   t |j }| jrt|}t|| jkr2| jd ytj|}W n  tj	k
r`   | jd Y nX ||krt| jd |tjdtjdfkr| jd | j
| j|S )zd
        Validate that the input is a decimal number and return a Decimal
        instance.
        r4  r}   ZInfz-Inf)r   r  r@  r   rJ   r5  r   rC  DecimalDecimalExceptionquantizevalidate_precision)rm   r   r^   r1   r1   r2   r     s    


zDecimalField.to_internal_valuec             C   s   |j  \}}}|dkr,t|| }|}d}n>t|t|krZt|}|t| }t|}nt|}d}|}| jdk	r|| jkr| jd| jd | jdk	r|| jkr| jd| jd | jdk	r|| jkr| jd| jd |S )	a  
        Ensure that there are no more than max_digits in the number, and no
        more than decimal_places digits after the decimal point.

        Override this method to disable the precision validation for input
        values or to enhance it in any way you need to.
        r   Nr:  )r:  r;  )r;  r<  )r<  )as_tuplerJ   absr:  r   r?  r<  )rm   r^   signZ
digittupleexponentZtotal_digitsZwhole_digitsr?  r1   r1   r2   rH  =  s&    
zDecimalField.validate_precisionc             C   sX   t | dtj}t|tjs.tjtj|j }| j	|}|s@|S | j
rNt|S dj|S )NrA  z{0:f})rP   r'   ZCOERCE_DECIMAL_TO_STRINGr=   rC  rE  r   r  r  rG  r@  r   rT   )rm   r^   rA  Z	quantizedr1   r1   r2   r   `  s    
zDecimalField.to_representationc             C   sJ   | j dkr|S tj j }| jdk	r,| j|_|jtjd| j  | j|dS )zI
        Quantize the decimal value to the configured precision.
        Nz.1)rD  r   )	r?  rC  
getcontextr   r:  precrG  rE  rD  )rm   r^   r   r1   r1   r2   rG  o  s    

zDecimalField.quantize)NNNFN)r-   r.   r/   rN   r   r5  rn   r   rH  r   rG  r   r1   r1   )r   r2   r9    s    &#r9  c                   sj   e Zd ZededededdZejjZeddf fdd	Z	d	d
 Z
dd Zdd Zdd Z  ZS )DateTimeFieldzFDatetime has wrong format. Use one of these formats instead: {format}.z#Expected a datetime but got a date.z/Invalid datetime for the timezone "{timezone}".zDatetime value out of range.)r}   date
make_awareoverflowNc                s@   |t k	r|| _|d k	r|| _|d k	r*|| _tt| j|| d S )N)r,   rT   input_formatsr   r   rO  rn   )rm   rT   rS  default_timezonerM   r   )r   r1   r2   rn     s    zDateTimeField.__init__c             C   s   t | d| j }|dk	r~tj|rLy
|j|S  tk
rJ   | jd Y nX ytj||S  tk
rz   | jd|d Y qX n|dkrtj|rtj	|t
S |S )z
        When `self.default_timezone` is `None`, always return naive datetimes.
        When `self.default_timezone` is not `None`, always return aware datetimes.
        r   NrR  rQ  )r   )rP   rT  r   Zis_aware
astimezoneOverflowErrorr   rQ  r   Z
make_naiver   )rm   r^   Zfield_timezoner1   r1   r2   enforce_timezone  s    

zDateTimeField.enforce_timezonec             C   s   t jrtj S d S )N)r   ZUSE_TZr   Zget_current_timezone)rm   r1   r1   r2   rT    s    zDateTimeField.default_timezonec             C   s   t | dtj}t|tjr2t|tj r2| jd t|tjrH| j|S x|D ]z}|j t	kryt
|}|d k	rz| j|S W q ttfk
r   Y qX qNy| j||}| j|S  ttfk
r   Y qNX qNW tj|}| jd|d d S )NrS  rP  r}   )rT   )rP   r'   ZDATETIME_INPUT_FORMATSr=   datetimerP  r   rW  r+  r   r   rS   r  datetime_parserr)   Zdatetime_formats)rm   r^   rS  input_formatparsedhumanized_formatr1   r1   r2   r     s(    





zDateTimeField.to_internal_valuec             C   st   |sd S t | dtj}|d ks*t|tjr.|S | j|}|j tkrj|j	 }|j
drf|d d d }|S |j|S )NrT   z+00:00   Zi)rP   r'   ZDATETIME_FORMATr=   r   r  rW  r+  r   	isoformatendswithstrftime)rm   r^   output_formatr1   r1   r2   r     s    

zDateTimeField.to_representation)r-   r.   r/   rN   r   rX  strptimerY  r,   rn   rW  rT  r   r   r   r1   r1   )r   r2   rO    s   	rO  c                   sL   e Zd ZededdZejjZedf fdd	Z	dd Z
d	d
 Z  ZS )	DateFieldzBDate has wrong format. Use one of these formats instead: {format}.z#Expected a date but got a datetime.)r}   rX  Nc                s2   |t k	r|| _|d k	r|| _tt| j|| d S )N)r,   rT   rS  r   rd  rn   )rm   rT   rS  rM   r   )r   r1   r2   rn     s
    zDateField.__init__c             C   s   t | dtj}t|tjr$| jd t|tjr4|S x~|D ]v}|j tkr~yt	|}W n t
tfk
rn   Y qX |d k	r|S q:y| j||}W n t
tfk
r   Y q:X |j S q:W tj|}| jd|d d S )NrS  rX  r}   )rT   )rP   r'   ZDATE_INPUT_FORMATSr=   rX  r   rP  r+  r   r   rS   r  rY  r)   Zdate_formats)rm   r^   rS  rZ  r[  r\  r1   r1   r2   r     s(    


zDateField.to_internal_valuec             C   sb   |sd S t | dtj}|d ks*t|tjr.|S t|tj sDtd|j t	krX|j
 S |j|S )NrT   zExpected a `date`, but got a `datetime`. Refusing to coerce, as this may mean losing timezone information. Use a custom read-only field and deal with timezone issues explicitly.)rP   r'   ZDATE_FORMATr=   r   r  rX  r   r+  r   r_  ra  )rm   r^   rb  r1   r1   r2   r     s    zDateField.to_representation)r-   r.   r/   rN   r   rX  rc  rY  r,   rn   r   r   r   r1   r1   )r   r2   rd    s   rd  c                   sF   e Zd ZdediZejjZedf fdd	Z	dd Z
dd	 Z  ZS )
	TimeFieldr}   zBTime has wrong format. Use one of these formats instead: {format}.Nc                s2   |t k	r|| _|d k	r|| _tt| j|| d S )N)r,   rT   rS  r   re  rn   )rm   rT   rS  rM   r   )r   r1   r2   rn   #  s
    zTimeField.__init__c             C   s   t | dtj}t|tjr|S x~|D ]v}|j tkrhyt|}W n t	t
fk
rX   Y qX |d k	r|S q$y| j||}W n t	t
fk
r   Y q$X |j S q$W tj|}| jd|d d S )NrS  r}   )rT   )rP   r'   ZTIME_INPUT_FORMATSr=   rX  timer+  r   r   rS   r  rY  r)   Ztime_formatsr   )rm   r^   rS  rZ  r[  r\  r1   r1   r2   r   *  s$    

zTimeField.to_internal_valuec             C   sf   |dkrd S t | dtj}|d ks.t|tjr2|S t|tj sHtd|j t	kr\|j
 S |j|S )Nr   rT   zExpected a `time`, but got a `datetime`. Refusing to coerce, as this may mean losing timezone information. Use a custom read-only field and deal with timezone issues explicitly.)Nr   )rP   r'   ZTIME_FORMATr=   r   r  rX  r   r+  r   r_  ra  )rm   r^   rb  r1   r1   r2   r   D  s    zTimeField.to_representation)r-   r.   r/   rN   r   rX  rc  rY  r,   rn   r   r   r   r1   r1   )r   r2   re    s
   re  c                   sD   e Zd ZedededdZ fddZdd Zd	d
 Z  ZS )DurationFieldzFDuration has wrong format. Use one of these formats instead: {format}.z7Ensure this value is less than or equal to {max_value}.z:Ensure this value is greater than or equal to {min_value}.)r}   r2  r3  c                s   |j dd | _|j dd | _tt| jf | | jd k	rjt| jd jt	j
| jd}| jjt| j|d | jd k	rt| jd jt	j
| jd}| jjt| j|d d S )Nr2  r3  )r2  )r~   )r3  )r  r2  r3  r   rg  rn   r   r   rT   r   r  r   r  r    r"   )rm   r   r~   )r   r1   r2   rn   b  s    



zDurationField.__init__c             C   s<   t |tjr|S ttj|}|d k	r*|S | jddd d S )Nr}   z[DD] [HH:[MM:]]ss[.uuuuuu])rT   )r=   rX  	timedeltar   r   r  r   )rm   r^   r[  r1   r1   r2   r   s  s    zDurationField.to_internal_valuec             C   s   t |S )N)r   )rm   r^   r1   r1   r2   r   {  s    zDurationField.to_representation)	r-   r.   r/   rN   r   rn   r   r   r   r1   r1   )r   r2   rg  [  s   rg  c                   sf   e Zd ZdediZdZedZ fddZdd Zd	d
 Z	dd Z
dd Zdd ZeeeZ  ZS )ChoiceFieldinvalid_choicez "{input}" is not a valid choice.NzMore than {count} items...c                sJ   || _ |jd| j| _|jd| j| _|jdd| _tt| jf | d S )Nhtml_cutoffhtml_cutoff_textr   F)rd   r  rk  rl  r   r   ri  rn   )rm   rd   r   )r   r1   r2   rn     s
    zChoiceField.__init__c             C   sJ   |dkr| j rdS y| jtj| S  tk
rD   | jd|d Y nX d S )Nr   rj  )r  )r   choice_strings_to_valuesr   r  rR   r   )rm   r   r1   r1   r2   r     s    zChoiceField.to_internal_valuec             C   s    |dkr|S | j jtj||S )Nr   )r   N)rm  r   r   r  )rm   r^   r1   r1   r2   r     s    zChoiceField.to_representationc             C   s   t | j| j| jdS )zP
        Helper method for use with templates rendering select widgets.
        )ry   rz   )r{   rx   rk  rl  )rm   r1   r1   r2   r{     s    zChoiceField.iter_optionsc             C   s   | j S )N)_choices)rm   r1   r1   r2   _get_choices  s    zChoiceField._get_choicesc             C   s,   t || _t| j| _dd | jD | _d S )Nc             S   s   i | ]}|t j|qS r1   )r   r  )r7   r_   r1   r1   r2   r     s   z,ChoiceField._set_choices.<locals>.<dictcomp>)rc   rx   rk   rn  rd   rm  )rm   rd   r1   r1   r2   _set_choices  s    
zChoiceField._set_choices)r-   r.   r/   rN   r   rk  rl  rn   r   r   r{   ro  rp  r   rd   r   r1   r1   )r   r2   ri    s   		
ri  c                   sT   e Zd ZedededdZg Z fddZdd Z fd	d
Zdd Z	  Z
S )MultipleChoiceFieldz "{input}" is not a valid choice.z5Expected a list of items but got type "{input_type}".z This selection may not be empty.)rj  
not_a_listr,   c                s$   |j dd| _tt| j|| d S )Nallow_emptyT)r  rs  r   rq  rn   )rm   rM   r   )r   r1   r2   rn     s    zMultipleChoiceField.__init__c             C   s@   | j |krt| jddrtS tj|r2|j| j S |j| j tS )Nr?   F)r   rP   r   r,   r(   r   getlistr   )rm   r\   r1   r1   r2   r     s    

zMultipleChoiceField.get_valuec                s^   t |tjst|d r, jdt|jd  j rJt|dkrJ jd  fdd|D S )N__iter__rr  )
input_typer   r,   c                s   h | ]}t tj|qS r1   )r   rq  r   )r7   r   )r   rm   r1   r2   	<setcomp>  s   z8MultipleChoiceField.to_internal_value.<locals>.<setcomp>)	r=   r   r  r   r   r   r-   rs  rJ   )rm   r   )r   )rm   r2   r     s    
z%MultipleChoiceField.to_internal_valuec                s    fdd|D S )Nc                s    h | ]} j jtj||qS r1   )rm  r   r   r  )r7   r   )rm   r1   r2   rw    s   z8MultipleChoiceField.to_representation.<locals>.<setcomp>r1   )rm   r^   r1   )rm   r2   r     s    
z%MultipleChoiceField.to_representation)r-   r.   r/   rN   r   r   rn   r   r   r   r   r1   r1   )r   r2   rq    s   
rq  c                   s*   e Zd ZdediZd fdd	Z  ZS )	r   rj  z%"{input}" is not a valid path choice.NFTc       	         s4   t ||||||d}|j|d< tt| jf | d S )N)match	recursiveallow_filesallow_foldersr   rd   )DjangoFilePathFieldrd   r   r   rn   )	rm   pathrx  ry  rz  r{  r   r   r   )r   r1   r2   rn     s
    

zFilePathField.__init__)NFTFN)r-   r.   r/   rN   r   rn   r   r1   r1   )r   r2   r     s    r   c                   sP   e Zd ZedededededdZ fddZd	d
 Zdd Z  ZS )	FileFieldzNo file was submitted.zGThe submitted data was not a file. Check the encoding type on the form.z No filename could be determined.zThe submitted file is empty.zKEnsure this filename has at most {max_length} characters (it has {length}).)r   r}   no_namer,   r  c                sF   |j dd | _|j dd| _d|kr0|j d| _tt| j|| d S )Nr  allow_empty_fileFuse_url)r  r  r  r  r   r~  rn   )rm   rM   r   )r   r1   r2   rn     s
    zFileField.__init__c             C   s   y|j }|j}W n tk
r.   | jd Y nX |s>| jd | j rV| rV| jd | jrt|| jkr| jd| jt|d |S )Nr}   r  r,   r  )r  length)namesizerQ   r   r  r  rJ   )rm   r   	file_name	file_sizer1   r1   r2   r     s    


zFileField.to_internal_valuec             C   sZ   |sd S t | dtj}|rTt |dd s*d S |j}| jjdd }|d k	rP|j|S |S |jS )Nr  urlr   )rP   r'   ZUPLOADED_FILES_USE_URLr  r   r   Zbuild_absolute_urir  )rm   r^   r  r  r   r1   r1   r2   r     s    
zFileField.to_representation)	r-   r.   r/   rN   r   rn   r   r   r   r1   r1   )r   r2   r~    s   r~  c                   s4   e Zd ZdediZ fddZ fddZ  ZS )r   Zinvalid_imagezYUpload a valid image. The file you uploaded was either not an image or a corrupted image.c                s$   |j dt| _tt| j|| d S )N_DjangoImageField)r  DjangoImageFieldr  r   r   rn   )rm   rM   r   )r   r1   r2   rn   .  s    zImageField.__init__c                s*   t t| j|}| j }| j|_|j|S )N)r   r   r   r  r   clean)rm   r   Zfile_objectZdjango_field)r   r1   r2   r   2  s    zImageField.to_internal_value)r-   r.   r/   rN   r   rn   r   r   r1   r1   )r   r2   r   '  s   r   c                   s,   e Zd Z fddZdd Zdd Z  ZS )_UnvalidatedFieldc                s"   t t| j|| d| _d| _d S )NT)r   r  rn   r   r   )rm   rM   r   )r   r1   r2   rn   ?  s    z_UnvalidatedField.__init__c             C   s   |S )Nr1   )rm   r   r1   r1   r2   r   D  s    z#_UnvalidatedField.to_internal_valuec             C   s   |S )Nr1   )rm   r^   r1   r1   r2   r   G  s    z#_UnvalidatedField.to_representation)r-   r.   r/   rn   r   r   r   r1   r1   )r   r2   r  >  s   r  c                   sd   e Zd Ze Zg ZededededdZ fddZdd	 Z	d
d Z
dd Zdd Z  ZS )	ListFieldz5Expected a list of items but got type "{input_type}".zThis list may not be empty.z5Ensure this field has at least {min_length} elements.z9Ensure this field has no more than {max_length} elements.)rr  r,   r  r  c                s   |j dtj| j| _|j dd| _|j dd | _|j dd | _tj| j sVt	d| jj
d ksjt	dtt| j|| | jjd| d	 | jd k	r| jd j| jd
}| jjt| j|d | jd k	r| jd j| jd}| jjt| j|d d S )Nchildrs  Tr  r  z"`child` has not been instantiated.zvThe `source` argument is not meaningful when applied to a `child=` field. Remove `source=` from the field declaration.r   )r   r   )r  )r~   )r  )r  r   r   r  rs  r  r  r:   isclassr   r   r   r  rn   r   r   rT   r   r  r   r!   )rm   rM   r   r~   )r   r1   r2   rn   U  s    

zListField.__init__c             C   sd   | j |krt| jddrtS tj|rV|j| j g }t|dkrD|S tj|| j tdS |j	| j tS )Nr?   Fr   )prefixr6   )
r   rP   r   r,   r(   r   rt  rJ   parse_html_listr   )rm   r\   valr1   r1   r2   r   j  s    

zListField.get_valuec             C   sp   t j|rt j|g d}t|tjtfs4t|d rH| jdt	|j
d | j rft|dkrf| jd | j|S )zY
        List of dicts of native values <- List of dicts of primitive datatypes.
        )r6   ru  rr  )rv  r   r,   )r(   r   r  r=   r   r  r   r   r   r   r-   rs  rJ   run_child_validation)rm   r   r1   r1   r2   r   y  s    

zListField.to_internal_valuec                s    fdd|D S )zS
        List of object instances -> List of dicts of primitive datatypes.
        c                s$   g | ]}|d k	r j j|nd qS )N)r  r   )r7   r   )rm   r1   r2   r     s    z/ListField.to_representation.<locals>.<listcomp>r1   )rm   r   r1   )rm   r2   r     s    zListField.to_representationc             C   sx   g }t  }xXt|D ]L\}}y|j| jj| W q tk
r^ } z|j||< W Y d d }~X qX qW |sl|S t|d S )N)r   	enumerater  r  r   r   r   )rm   r   resultr   idxr   er1   r1   r2   r    s     zListField.run_child_validation)r-   r.   r/   r  r  r   rN   r   rn   r   r   r   r  r   r1   r1   )r   r2   r  K  s   r  c                   sR   e Zd Ze Zi ZdediZ fddZdd Z	dd Z
d	d
 Zdd Z  ZS )	DictField
not_a_dictz;Expected a dictionary of items but got type "{input_type}".c                sf   |j dtj| j| _tj| j s,td| jjd ks@tdtt	| j
|| | jjd| d d S )Nr  z"`child` has not been instantiated.zvThe `source` argument is not meaningful when applied to a `child=` field. Remove `source=` from the field declaration.r   )r   r   )r  r   r   r  r:   r  r   r   r   r  rn   r   )rm   rM   r   )r   r1   r2   rn     s    zDictField.__init__c             C   s(   t j|rt j|| jdS |j| jtS )N)r  )r(   r   parse_html_dictr   r   r,   )rm   r\   r1   r1   r2   r     s    
zDictField.get_valuec             C   s<   t j|rt j|}t|ts2| jdt|jd | j|S )zI
        Dicts of native values <- Dicts of primitive datatypes.
        r  )rv  )	r(   r   r  r=   rh   r   r   r-   r  )rm   r   r1   r1   r2   r     s
    


zDictField.to_internal_valuec                s    fdd|j  D S )Nc                s0   i | ](\}}|d k	r  j j|nd tj|qS )N)r  r   r   r  )r7   r_   r  )rm   r1   r2   r     s   z/DictField.to_representation.<locals>.<dictcomp>)rg   )rm   r^   r1   )rm   r2   r     s    
zDictField.to_representationc             C   s   i }t  }x`|j D ]T\}}tj|}y| jj|||< W q tk
rf } z|j||< W Y d d }~X qX qW |st|S t|d S )N)r   rg   r   r  r  r   r   r   )rm   r   r  r   r_   r^   r  r1   r1   r2   r    s    
 zDictField.run_child_validation)r-   r.   r/   r  r  r   rN   r   rn   r   r   r   r  r   r1   r1   )r   r2   r    s   
r  c                   s(   e Zd ZedddZ fddZ  ZS )HStoreFieldT)r   r   c                s*   t t| j|| t| jts&tdd S )NzjThe `child` argument must be an instance of `CharField`, as the hstore extension stores values as strings.)r   r  rn   r=   r  r	  r   )rm   rM   r   )r   r1   r2   rn     s    zHStoreField.__init__)r-   r.   r/   r	  r  rn   r   r1   r1   )r   r2   r    s   r  c                   s@   e Zd ZdediZ fddZdd Zdd Zd	d
 Z  Z	S )	JSONFieldr}   zValue must be valid JSON.c                s$   |j dd| _tt| j|| d S )NbinaryF)r  r  r   r  rn   )rm   rM   r   )r   r1   r2   rn     s    zJSONField.__init__c             C   sB   t j|r4| j|kr4G dd dtj}||| j S |j| jtS )Nc               @   s   e Zd Zdd ZdS )z'JSONField.get_value.<locals>.JSONStringc             S   s   t jj| |}d|_|S )NT)r   r  r   is_json_string)rm   r^   re   r1   r1   r2   r     s    z/JSONField.get_value.<locals>.JSONString.__new__N)r-   r.   r/   r   r1   r1   r1   r2   
JSONString  s   r  )r(   r   r   r   r  r   r,   )rm   r\   r  r1   r1   r2   r     s    zJSONField.get_valuec             C   sf   y>| j st|ddr2t|tr(|jd}tj|S tj| W n" tt	fk
r`   | j
d Y nX |S )Nr  Fzutf-8r}   )r  rP   r=   bytesdecoder*   loadsdumpsr  rS   r   )rm   r   r1   r1   r2   r     s    


zJSONField.to_internal_valuec             C   s.   | j r*tj|}t|tjr*t|jd}|S )Nzutf-8)r  r*   r  r=   r   r  r  encode)rm   r^   r1   r1   r2   r     s
    
zJSONField.to_representation)
r-   r.   r/   rN   r   rn   r   r   r   r   r1   r1   )r   r2   r    s
   r  c                   s(   e Zd ZdZ fddZdd Z  ZS )ReadOnlyFieldaw  
    A read-only field that simply returns the field value.

    If the field is a method with no parameters, the method will be called
    and its return value used as the representation.

    For example, the following would call `get_expiry_date()` on the object:

    class ExampleSerializer(Serializer):
        expiry_date = ReadOnlyField(source='get_expiry_date')
    c                s   d|d< t t| jf | d S )NTr   )r   r  rn   )rm   r   )r   r1   r2   rn     s    zReadOnlyField.__init__c             C   s   |S )Nr1   )rm   r^   r1   r1   r2   r     s    zReadOnlyField.to_representation)r-   r.   r/   r0   rn   r   r   r1   r1   )r   r2   r    s   r  c                   s0   e Zd ZdZ fddZdd Zdd Z  ZS )HiddenFieldaL  
    A hidden field does not take input from the user, or present any output,
    but it does populate a field in `validated_data`, based on its default
    value. This is particularly useful when we have a `unique_for_date`
    constraint on a pair of fields, as we need some way to include the date in
    the validated data.
    c                s.   d|kst dd|d< tt| jf | d S )Nr6   zdefault is a required argument.Tr   )r   r   r  rn   )rm   r   )r   r1   r2   rn   *  s    zHiddenField.__init__c             C   s   t S )N)r,   )rm   r\   r1   r1   r2   r   /  s    zHiddenField.get_valuec             C   s   |S )Nr1   )rm   r   r1   r1   r2   r   4  s    zHiddenField.to_internal_value)r-   r.   r/   r0   rn   r   r   r   r1   r1   )r   r2   r  "  s   r  c                   s6   e Zd ZdZd	 fdd	Z fddZdd Z  ZS )
SerializerMethodFielda  
    A read-only field that get its representation from calling a method on the
    parent serializer class. The method called will be of the form
    "get_{field_name}", and should take a single argument, which is the
    object being serialized.

    For example:

    class ExampleSerializer(self):
        extra_info = SerializerMethodField()

        def get_extra_info(self, obj):
            return ...  # Calculate some data to return.
    Nc                s,   || _ d|d< d|d< tt| jf | d S )Nr   r   Tr   )method_namer   r  rn   )rm   r  r   )r   r1   r2   rn   G  s    zSerializerMethodField.__init__c                sT   dj |d}| j|ks.td| j||jjf | jd kr>|| _tt| j|| d S )Nzget_{field_name})r   zIt is redundant to specify `%s` on SerializerMethodField '%s' in serializer '%s', because it is the same as the default method name. Remove the `method_name` argument.)rT   r  r   r   r-   r   r  r   )rm   r   r   Zdefault_method_name)r   r1   r2   r   M  s    
zSerializerMethodField.bindc             C   s   t | j| j}||S )N)rP   r   r  )rm   r^   rL   r1   r1   r2   r   _  s    z'SerializerMethodField.to_representation)N)r-   r.   r/   r0   rn   r   r   r   r1   r1   )r   r2   r  8  s   r  c                   sD   e Zd ZdZdediZ fddZdd Zdd	 Zd
d Z	  Z
S )
ModelFieldz
    A generic field that can be used against an arbitrary model field.

    This is used by `ModelSerializer` when dealing with custom model fields,
    that do not have a serializer field to be mapped to.
    r  z;Ensure this field has no more than {max_length} characters.c                sb   || _ |jdd }tt| jf | |d k	r^t| jd jtj	| j
d}| jjt| j
|d d S )Nr  )r  )r~   )model_fieldr  r   r  rn   r   r   rT   r   r  r  r   r  r   )rm   r  r   r  r~   )r   r1   r2   rn   o  s    
zModelField.__init__c             C   s2   | j j}|d k	r&|jjj|jj|S | j j|S )N)r  Zremote_fieldmodelZ_meta	get_fieldr   Z	to_python)rm   r   relr1   r1   r2   r   |  s    zModelField.to_internal_valuec             C   s   |S )Nr1   )rm   rD   r1   r1   r2   rY     s    zModelField.get_attributec             C   s$   | j j|}t|r|S | j j|S )N)r  Zvalue_from_objectr   Zvalue_to_string)rm   rD   r^   r1   r1   r2   r     s    zModelField.to_representation)r-   r.   r/   r0   rN   r   rn   r   rY   r   r   r1   r1   )r   r2   r  d  s   r  )NN)}
__future__r   r   rX  rC  r>   r:   r  r&  collectionsr   Zdjango.confr   Zdjango.core.exceptionsr   r   r   Zdjango.core.validatorsr   r   r	   r
   Zdjango.formsr   r|  r   r  Zdjango.utilsr   r   Zdjango.utils.dateparser   r   r   r   Zdjango.utils.durationr   Zdjango.utils.encodingr   r   Zdjango.utils.formatsr   r   Zdjango.utils.functionalr   Zdjango.utils.ipv6r   Zdjango.utils.timezoner   Zdjango.utils.translationr   rN   Zpytz.exceptionsr   Zrest_frameworkr   Zrest_framework.compatr   r   r    r!   r"   r#   r$   r%   Zrest_framework.exceptionsr&   Zrest_framework.settingsr'   Zrest_framework.utilsr(   r)   r*   r+   r,   PY3rG   rY   r`   rc   rk   r{   r   rw   r   r   	Exceptionr   r   r  r   r   r   r   r   r   r   r   r  r	  r  r  r  r  r  r)  r1  r8  r9  rO  rd  re  rg  ri  rq  r~  r  r  r  r  r  r  r  r  r  r1   r1   r1   r2   <module>   s   (


/  ].47$)( XC>&9'3O;-,