3
g                 @   s,  d Z ddlZddlmZ ddlmZmZmZmZ ddl	m
Z
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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=Z"dZ#d>ddZ$d?ddZ%dd Z&d@dd d!dZ'G d"d# d#Z(G d$d% d%eZ)G d&d deZ*G d'd de*e)d(Z+e+dddddddddf
d)dZ,G d*d deZ-e+de-d+d,d,ddddd,dddddd,dddfd-dZ.G d.d de-Z/dAd/d0Z0e+e/dddd1d,ddddd,dddddd,dddfd2dZ1G d3d4 d4eZ2G d5d6 d6Z3G d7d8 d8Z4G d9d de
Z5G d:d de5Z6d;d< Z7dS )Bz[
Helper functions for creating Form classes from Django models
and database field objects.
    N)chain)NON_FIELD_ERRORS
FieldErrorImproperlyConfiguredValidationError)ChoiceFieldField)BaseFormDeclarativeFieldsMetaclass)BaseFormSetformset_factory)	ErrorList)HiddenInputMultipleHiddenInputRadioSelectSelectMultiple)RemovedInDjango40Warning)capfirstget_text_list)gettextgettext_lazy	ModelFormBaseModelFormmodel_to_dictfields_for_modelModelChoiceFieldModelMultipleChoiceField
ALL_FIELDSBaseModelFormSetmodelformset_factoryBaseInlineFormSetinlineformset_factorymodelform_factory__all__c       	      C   s  ddl m} |j}| j}g }x|jD ]}|j s$t||js$|j|krHq$|dk	r\|j|kr\q$|rl|j|krlq$|j	 r| |j j
jj| j| j| j|jr|j|j| |j j
jkrq$t||jr|j| q$|j|||j  q$W x|D ]}|j|||j  qW |S )z
    Construct and return a model instance from the bound ``form``'s
    ``cleaned_data``, but do not save the returned instance to the database.
    r   )modelsN)Z	django.dbr$   _metacleaned_datafieldseditable
isinstance	AutoFieldnamehas_defaultfieldwidgetZvalue_omitted_from_datadatafiles
add_prefixgetempty_valuesZ	FileFieldappendsave_form_data)	forminstancer'   excluder$   optsr&   Zfile_field_listf r;   Q/var/www/tester-filtro-web/env/lib/python3.6/site-packages/django/forms/models.pyconstruct_instance    s,    
$
r=   c             C   sl   | j }i }x\t|j|j|jD ]F}t|dds0q|dk	rD|j|krDq|rT|j|krTq|j| ||j< qW |S )a  
    Return a dict containing the data in ``instance`` suitable for passing as
    a Form's ``initial`` keyword argument.

    ``fields`` is an optional list of field names. If provided, return only the
    named.

    ``exclude`` is an optional list of field names. If provided, exclude the
    named from the returned dict, even if they are listed in the ``fields``
    argument.
    r(   FN)r%   r   concrete_fieldsprivate_fieldsmany_to_manygetattrr+   Zvalue_from_object)r7   r'   r8   r9   r/   r:   r;   r;   r<   r   I   s    c             C   s   ddl m}m}m} t| dr|t| dr|| j }|r||}t||sL|f |}|||ddM }| jj|| jj	j
j|| _dS )z=Apply limit_choices_to to the formfield's queryset if needed.r   )ExistsOuterRefQquerysetget_limit_choices_topk)rG   N)django.db.modelsrB   rC   rD   hasattrrF   r)   rE   filtermodelZ_base_manager)	formfieldrB   rC   rD   limit_choices_toZcomplex_filterr;   r;   r<   #apply_limit_choices_to_to_formfieldb   s    

rN   T)apply_limit_choices_toc
               s  i g | j }ddlm   fdd|jD }xtt|j||jD ]}t|dds|dk	rF|j	|krFdks||j	krFt
d|j	| jf qF|dk	r|j	|krqFr|j	krqFi }|r|j	|kr||j	 |d	< |tks|r|j	|krd
|d< |r|j	|kr||j	 |d< |r4|j	|kr4||j	 |d< |rT|j	|krT||j	 |d< |	rt|j	|	krt|	|j	 |d< |dkr|jf |}n t|stdn||f|}|r|
rt| ||j	< qFj|j	 qFW |rfdd|D S )a4  
    Return a dictionary containing form fields for the given model.

    ``fields`` is an optional list of field names. If provided, return only the
    named fields.

    ``exclude`` is an optional list of field names. If provided, exclude the
    named fields from the returned fields, even if they are listed in the
    ``fields`` argument.

    ``widgets`` is a dictionary of model field names mapped to a widget.

    ``formfield_callback`` is a callable that takes a model field and returns
    a form field.

    ``localized_fields`` is a list of names of fields which should be localized.

    ``labels`` is a dictionary of model field names mapped to a label.

    ``help_texts`` is a dictionary of model field names mapped to a help text.

    ``error_messages`` is a dictionary of model field names mapped to a
    dictionary of error messages.

    ``field_classes`` is a dictionary of model field names mapped to a form
    field class.

    ``apply_limit_choices_to`` is a boolean indicating if limit_choices_to
    should be applied to a field's queryset.
    r   )r   c                s   g | ]}t | r|qS r;   )r)   ).0r:   )
ModelFieldr;   r<   
<listcomp>   s    z$fields_for_model.<locals>.<listcomp>r(   FNzH'%s' cannot be specified for %s model form as it is a non-editable fieldr.   TZlocalizelabel	help_texterror_messages
form_classz1formfield_callback must be a function or callablec                s.   i | ]&}  s| kr|krj ||qS r;   )r2   )rP   r:   )r8   
field_dictignoredr;   r<   
<dictcomp>   s   z$fields_for_model.<locals>.<dictcomp>)r%   rH   r   r?   sortedr   r>   r@   rA   r+   r   __name__r   rL   callable	TypeErrorrN   r4   )rK   r'   r8   widgetsformfield_callbacklocalized_fieldslabels
help_textsrU   field_classesrO   r9   Zsortable_private_fieldsr:   kwargsrL   r;   )rQ   r8   rW   rX   r<   r   r   sX    "


c               @   s   e Zd ZdddZdS )ModelFormOptionsNc             C   s   t |dd | _t |dd | _t |dd | _t |dd | _t |dd | _t |dd | _t |dd | _t |dd | _t |d	d | _	d S )
NrK   r'   r8   r^   r`   ra   rb   rU   rc   )
rA   rK   r'   r8   r^   r`   ra   rb   rU   rc   )selfoptionsr;   r;   r<   __init__   s    zModelFormOptions.__init__)N)r[   
__module____qualname__rh   r;   r;   r;   r<   re      s   re   c                   s   e Zd Z fddZ  ZS )ModelFormMetaclassc                s  d }x,|D ]$}t |dr
t |jdr
|jj}P q
W |jd|}t j| |||}|tfkr^|S tt|dd  }|_	xBdD ]:}	t||	}
t
|
trz|
tkrzd|j|	|
d }t|qzW |jrt|jd kr|jd krtd| |jtkrd |_t|j|j|j|j||j|j|j|j|jd	d
}dd |j D }|j|j}|rfd}|dj||jjf }t||j|j n|j}||_ |S )NMetar_   r'   r8   r`   zP%(model)s.Meta.%(opt)s cannot be a string. Did you mean to type: ('%(value)s',)?)rK   optvaluez|Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is prohibited; form %s needs updating.F)rO   c             S   s   h | ]\}}|s|qS r;   r;   )rP   kvr;   r;   r<   	<setcomp>  s    z-ModelFormMetaclass.__new__.<locals>.<setcomp>z&Unknown field(s) (%s) specified for %sz, )r'   r8   r`   )!rI   rl   r_   popsuper__new__r   re   rA   r%   r)   strr   r[   r]   rK   r'   r8   r   r   r^   r`   ra   rb   rU   rc   items
differenceZdeclared_fieldsjoinr   updateZbase_fields)Zmcsr+   basesattrsZbase_formfield_callbackbr_   	new_classr9   rm   rn   msgr'   Znone_model_fieldsZmissing_fieldsmessage)	__class__r;   r<   rt      sR    







zModelFormMetaclass.__new__)r[   ri   rj   rt   __classcell__r;   r;   )r   r<   rk      s   rk   c                   st   e Zd Zdddddedddddf fdd	Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dddZde_  ZS )r   Nzid_%sFc                s   | j }|jd krtd|	d kr0|j | _i }n|	| _t|	|j|j}|d k	rX|j| d| _t	 j
|||||||||
|d
 x| jj D ]}t| qW d S )Nz'ModelForm has no model class specified.F)use_required_attributerenderer)r%   rK   
ValueErrorr7   r   r'   r8   ry   _validate_uniquers   rh   valuesrN   )rf   r/   r0   auto_idprefixinitialerror_classZlabel_suffixZempty_permittedr7   r   r   r9   Zobject_datarL   )r   r;   r<   rh   !  s"    


zBaseModelForm.__init__c             C   s   g }x| j jjD ]}|j}|| jkr2|j|j q| jjrT|| jjkrT|j|j q| jjrv|| jjkrv|j|j q|| jkr|j|j q| j| }| jj|}|j	 r|j
 r||jkr|j|j qW |S )z
        For backwards-compatibility, exclude several types of fields from model
        validation. See tickets #12507, #12521, #12553.
        )r7   r%   r'   r+   r4   r8   _errorsr&   r2   blankrequiredr3   )rf   r8   r:   r-   Z
form_fieldZfield_valuer;   r;   r<   _get_validation_exclusions>  s     

	
z(BaseModelForm._get_validation_exclusionsc             C   s   d| _ | jS )NT)r   r&   )rf   r;   r;   r<   cleang  s    zBaseModelForm.cleanc             C   s   | j }t|dr|j}nt|i}x|j D ]t\}}|tkrV|jrVt|jkrV|jt }n|| jkr*| j| j}nq*x,|D ]$}t|trv|j	|krv||j	 |_
qvW q*W | jd | d S )N
error_dict)r%   rI   r   r   rv   rU   r'   r)   r   coder   Z	add_error)rf   errorsr9   r   r-   messagesrU   r   r;   r;   r<   _update_errorsk  s     





zBaseModelForm._update_errorsc             C   s   | j }| j }x*| jj D ]\}}t|tr|j| qW yt| | j|j|j	| _W n, t
k
r } z| j| W Y d d }~X nX y| jj|dd W n, t
k
r } z| j| W Y d d }~X nX | jr| j  d S )NF)r8   validate_unique)r%   r   r'   rv   r)   InlineForeignKeyFieldr4   r=   r7   r8   r   r   Z
full_cleanr   r   )rf   r9   r8   r+   r-   er;   r;   r<   _post_clean  s    	
zBaseModelForm._post_cleanc             C   sL   | j  }y| jj|d W n, tk
rF } z| j| W Y dd}~X nX dS )z
        Call the instance's validate_unique() method and update the form's
        validation errors if any were raised.
        )r8   N)r   r7   r   r   r   )rf   r8   r   r;   r;   r<   r     s
    zBaseModelForm.validate_uniquec             C   s   | j }| jj}| jj}| jj}x`t|j|jD ]N}t|ds>q.|rN|j	|krNq.|r^|j	|kr^q.|j	|kr.|j
| j||j	  q.W dS )zS
        Save the many-to-many fields and generic relations for this form.
        r5   N)r&   r%   r8   r'   r7   r   r@   r?   rI   r+   r5   )rf   r&   r8   r'   r9   r:   r;   r;   r<   	_save_m2m  s    

zBaseModelForm._save_m2mTc             C   sP   | j r*td| jjj| jjjr dndf |rB| jj  | j  n| j| _	| jS )z
        Save this form's self.instance object if commit=True. Otherwise, add
        a save_m2m() method to the form which can be called after the instance
        is saved manually at a later time. Return the model instance.
        z8The %s could not be %s because the data didn't validate.createdchanged)
r   r   r7   r%   Zobject_name_stateaddingsaver   save_m2m)rf   commitr;   r;   r<   r     s    

zBaseModelForm.save)T)r[   ri   rj   r   rh   r   r   r   r   r   r   r   alters_datar   r;   r;   )r   r<   r      s   )
c               @   s   e Zd ZdS )r   N)r[   ri   rj   r;   r;   r;   r<   r     s   )	metaclassc             C   s  d| i}|dk	r||d< |dk	r(||d< |dk	r8||d< |dk	rH||d< |dk	rX||d< |dk	rh||d< |	dk	rx|	|d	< |
dk	r|
|d
< t |dr|jfnf }td||}|rt||_| jd }||d}t|dddkrt|dddkrtdt|||f|S )al  
    Return a ModelForm containing form fields for the given model. You can
    optionally pass a `form` argument to use as a starting point for
    constructing the ModelForm.

    ``fields`` is an optional list of field names. If provided, include only
    the named fields in the returned fields. If omitted or '__all__', use all
    fields.

    ``exclude`` is an optional list of field names. If provided, exclude the
    named fields from the returned fields, even if they are listed in the
    ``fields`` argument.

    ``widgets`` is a dictionary of model field names mapped to a widget.

    ``localized_fields`` is a list of names of fields which should be localized.

    ``formfield_callback`` is a callable that takes a model field and returns
    a form field.

    ``labels`` is a dictionary of model field names mapped to a label.

    ``help_texts`` is a dictionary of model field names mapped to a help text.

    ``error_messages`` is a dictionary of model field names mapped to a
    dictionary of error messages.

    ``field_classes`` is a dictionary of model field names mapped to a form
    field class.
    rK   Nr'   r8   r^   r`   ra   rb   rU   rc   rl   ZForm)rl   r_   zZCalling modelform_factory without defining 'fields' or 'exclude' explicitly is prohibited.)rI   rl   typestaticmethodr_   r[   rA   r   )rK   r6   r'   r8   r_   r^   r`   ra   rb   rU   rc   r{   rz   rl   
class_nameZform_class_attrsr;   r;   r<   r"     s:    '

c                   s   e Zd ZdZdZe Zd*dd fddZ fddZd	d
 Z	dd Z
 fddZdd Zd+ddZd,ddZd-ddZd.ddZde_dd Zdd Zdd Zd d! Zd"d# Zd/d$d%Zd0d&d'Z fd(d)Z  ZS )1r   zO
    A ``FormSet`` for editing a queryset and/or adding new objects to it.
    Nid_%s)r   c               s,   || _ || _t jf ||||d| d S )N)r/   r0   r   r   )rE   initial_extrars   rh   )rf   r/   r0   r   r   rE   r   rd   )r   r;   r<   rh   A  s    zBaseModelFormSet.__init__c                s   | j st| j S t j S )z=Return the number of forms that are required in this FormSet.)is_boundlenget_querysetrs   initial_form_count)rf   )r   r;   r<   r   G  s    z#BaseModelFormSet.initial_form_countc             C   s*   t | dsdd | j D | _| jj|S )N_object_dictc             S   s   i | ]}||j qS r;   )rG   )rP   or;   r;   r<   rY   O  s    z5BaseModelFormSet._existing_object.<locals>.<dictcomp>)rI   r   r   r2   )rf   rG   r;   r;   r<   _existing_objectM  s    
z!BaseModelFormSet._existing_objectc             C   s    x|j dk	r|j j }qW |jS )z
        If the field is a related field, fetch the concrete field's (that
        is, the ultimate pointed-to field's) to_python.
        N)remote_fieldZget_related_field	to_python)rf   r-   r;   r;   r<   _get_to_pythonR  s    zBaseModelFormSet._get_to_pythonc                s  || j  k }|r| jrd| j|| jjjjf }y| j| }W n tk
rR   Y qX | j	| jjj}y||}W n t
k
r   Y qX | j||d< q| j | |d< n6| jry| j|| j    |d< W n tk
r   Y nX t j|f|}|rd|j| jjjj _|S )Nz%s-%sr7   r   T)r   r   r1   rK   r%   rG   r+   r/   KeyErrorr   r   r   r   r   
IndexErrorrs   _construct_formr'   r   )rf   ird   Zpk_requiredZpk_keyrG   r   r6   )r   r;   r<   r   [  s0    z BaseModelFormSet._construct_formc             C   sL   t | dsF| jd k	r| j}n| jjj }|js@|j| jjjj	}|| _
| j
S )N	_queryset)rI   rE   rK   _default_managerr   ZorderedZorder_byr%   rG   r+   r   )rf   qsr;   r;   r<   r   }  s    

zBaseModelFormSet.get_querysetTc             C   s   |j |dS )z8Save and return a new model instance for the given form.)r   )r   )rf   r6   r   r;   r;   r<   save_new  s    zBaseModelFormSet.save_newc             C   s   |j |dS )z>Save and return an existing model instance for the given form.)r   )r   )rf   r6   r7   r   r;   r;   r<   save_existing  s    zBaseModelFormSet.save_existingc             C   s   |r|j   dS )z#Deletes an existing model instance.N)delete)rf   objr   r;   r;   r<   delete_existing  s    z BaseModelFormSet.delete_existingc                s0   |sg  _  fdd}| _ j| j| S )z
        Save model instances for every form, adding and changing instances
        as necessary, and return the list of instances.
        c                 s   x j D ]} | j  qW d S )N)saved_formsr   )r6   )rf   r;   r<   r     s    z'BaseModelFormSet.save.<locals>.save_m2m)r   r   save_existing_objectssave_new_objects)rf   r   r   r;   )rf   r<   r     s
    zBaseModelFormSet.savec             C   s   | j   d S )N)r   )rf   r;   r;   r<   r     s    zBaseModelFormSet.cleanc                s  t  }t  }jfddjD }x:|D ]2  j } jj|d\}}|j| |j| q,W g }x|D ]\}}	t  }
x|D ]  fdd|	D }tdd |D }|od |kr||
kr|jj	|	 j
j g jt< x|	D ]}| jkr j|= qW |
j| qW qlW x|D ]}t  }
|\}}}}x|D ]  jr: j| d k	r: j| d k	r:|dkr j| }|j|j|jf}nt j| |f} j| f| }||
kr|jj| j
j g jt<  j|= |
j| q:W qW |r
t|d S )Nc                s    g | ]}|j  r| kr|qS r;   )Zis_valid)rP   r6   )forms_to_deleter;   r<   rR     s    z4BaseModelFormSet.validate_unique.<locals>.<listcomp>)r8   c             3   s0   | ](}| j kr|jkr|n j | V  qd S )N)r&   unique_fields)rP   r-   )r6   rf   r;   r<   	<genexpr>  s   z3BaseModelFormSet.validate_unique.<locals>.<genexpr>c             s   s6   | ].}t |d r|j nt|tr*t|n|V  qdS )_get_pk_valN)rI   r   r)   listtuple)rP   dr;   r;   r<   r     s   date)setdeleted_formsZformsr   r7   Z_get_unique_checksry   r   r4   get_unique_error_messager   get_form_errorr   r   r&   addyearmonthdayrA   get_date_error_messager   )rf   Zall_unique_checksZall_date_checksZvalid_formsr8   Zunique_checksZdate_checksr   Zuclassunique_checkZ	seen_dataZrow_datar-   
date_checklookupZ
unique_forr   Z	date_datar/   r;   )r6   r   rf   r<   r     sX    











z BaseModelFormSet.validate_uniquec             C   s>   t |dkr tdd|d i S tddt|tdi S d S )N   z0Please correct the duplicate data for %(field)s.r-   r   zFPlease correct the duplicate data for %(field)s, which must be unique.and)r   r   r   _)rf   r   r;   r;   r<   r     s
    z)BaseModelFormSet.get_unique_error_messagec             C   s$   t d|d |d t|d d S )NzoPlease correct the duplicate data for %(field_name)s which must be unique for the %(lookup)s in %(date_field)s.      r   )
field_nameZ
date_fieldr   )r   ru   )rf   r   r;   r;   r<   r     s
    z'BaseModelFormSet.get_date_error_messagec             C   s   t dS )Nz*Please correct the duplicate values below.)r   )rf   r;   r;   r<   r     s    zBaseModelFormSet.get_form_errorc             C   s   g | _ g | _| jsg S g }| j}x| jD ]z}|j}|jd kr>q(||krb| jj| | j||d q(|j r(| j j||j	f |j| j
|||d |s(| jj| q(W |S )N)r   )Zchanged_objectsZdeleted_objectsZinitial_formsr   r7   rG   r4   r   has_changedZchanged_datar   r   )rf   r   Zsaved_instancesr   r6   r   r;   r;   r<   r     s&    
z&BaseModelFormSet.save_existing_objectsc             C   s^   g | _ xP| jD ]F}|j sq| jr.| j|r.q| j j| j||d |s| jj| qW | j S )N)r   )Znew_objectsZextra_formsr   
can_deleteZ_should_delete_formr4   r   r   )rf   r   r6   r;   r;   r<   r   *  s    z!BaseModelFormSet.save_new_objectsc       	         s(  ddl m m}m} | jjj | _} fdd|sH|j|j	kr|j
rf|jjjr\dn|jj}n:y |dk	r| j | j}nd}W n tk
r   d}Y nX t|||fr|jjjj }n| jjj }|j|jjj}|jjr|jjj| jjt}nt}t||d|d|j	| jj< t j|| dS )z0Add a hidden field for the object's primary key.r   )r*   
ForeignKeyOneToOneFieldc                s6   | j  p4| jp4t|  p4| jo4| jjo4| jjjjS )N)r(   Zauto_createdr)   r   Zparent_linkrK   r%   rG   )rG   )r*   pk_is_not_editabler;   r<   r   B  s    z7BaseModelFormSet.add_fields.<locals>.pk_is_not_editableNF)r   r   r.   )rH   r*   r   r   rK   r%   rG   	_pk_fieldr+   r'   r   r7   r   r   r   r   r)   r   r   Zusingdbr^   r2   r   r   rs   
add_fields)	rf   r6   indexr   r   rG   Zpk_valuer   r.   )r   )r*   r   r<   r   8  s*    
zBaseModelFormSet.add_fields)NNr   NN)T)T)T)T)T)T)r[   ri   rj   __doc__rK   r   r   rh   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r;   r;   )r   r<   r   8  s.    	"



I



r   Fc             C   sz   t |dd}t |d|dkr4t |d|	dkr4tdt| |||	||
|||||d}t|||||||||||d}| |_|S )z8Return a FormSet class for the given Django model class.rl   Nr'   r8   z]Calling modelformset_factory without defining 'fields' or 'exclude' explicitly is prohibited.)
r6   r'   r8   r_   r^   r`   ra   rb   rU   rc   )	extramin_nummax_num	can_orderr   validate_minvalidate_maxabsolute_maxcan_delete_extra)rA   r   r"   r   rK   )rK   r6   r_   formsetr   r   r   r   r'   r8   r^   r   r`   ra   rb   rU   r   r   rc   r   r   metaFormSetr;   r;   r<   r   d  s     


c                   sl   e Zd ZdZd fdd	Z fddZ fdd	Zed
d Zd fdd	Z	 fddZ
 fddZ  ZS )r    z0A formset for child objects related to a parent.NFc       	         s   |d kr| j jj | _n|| _|| _|d kr4| jj}| jjd k	rX|jf | j j| ji}n|j	 }| j jh| _
t j||f||d| | jjjr| j j| jjjkrt| jjjtrt| jjj| jj_| jjjj| j j d S )N)r   rE   )fkr   rK   r7   save_as_newr   rG   rJ   r+   noner   rs   rh   r6   r%   r'   r)   r   r   r4   )	rf   r/   r0   r7   r   r   rE   rd   r   )r   r;   r<   rh     s    zBaseInlineFormSet.__init__c                s   | j r
dS t j S )Nr   )r   rs   r   )rf   )r   r;   r<   r     s    z$BaseInlineFormSet.initial_form_countc                s   t  j|f|}| jrlt|jdd }|d k	r4d|j_d |j|j| jj< d |j|j| j	j< |d k	rl||j_| j
j}| j	jj| j	jjjjjkrt| j
| j	jj}t|d|}t|j
| j	j | |S )N_mutableTrG   )rs   r   r   rA   r/   r   r1   r   r+   r   r7   rG   r   r   rK   r%   setattrZget_attname)rf   r   rd   r6   ZmutableZfk_value)r   r;   r<   r     s    z!BaseInlineFormSet._construct_formc             C   s   | j jj| jdjddS )N)rK   + )r   r   Zget_accessor_namerK   replace)clsr;   r;   r<   get_default_prefix  s    z$BaseInlineFormSet.get_default_prefixTc                s$   t |j| jj| j t j||dS )N)r   )r   r7   r   r+   rs   r   )rf   r6   r   )r   r;   r<   r     s    zBaseInlineFormSet.save_newc                s   t  j|| | j| jkr,| jj}ddi}n(| jj}dt|jj|dt| jj	i}| jj
j| jj
jjjjkr|| jj
j|d< | jjjr|jdd k	r| jjj|d }n
| jjj}|j rt| j|jd  t| jf||j|< d S )Npk_fieldTrS   to_field)rs   r   r   r   r+   rA   r'   r2   r   Zverbose_namer   r   rK   r%   rG   r7   r   r   	get_fieldr,   r   Zattnamer   )rf   r6   r   r+   rd   r   )r   r;   r<   r     s    
 

zBaseInlineFormSet.add_fieldsc                s    fdd|D }t  j|S )Nc                s   g | ]}| j jkr|qS r;   )r   r+   )rP   r-   )rf   r;   r<   rR     s    z>BaseInlineFormSet.get_unique_error_message.<locals>.<listcomp>)rs   r   )rf   r   )r   )rf   r<   r     s    z*BaseInlineFormSet.get_unique_error_message)NNNFNN)T)r[   ri   rj   r   rh   r   r   classmethodr   r   r   r   r   r;   r;   )r   r<   r      s    c                s  ddl m  |j}rfdd|jD }t|dkr~|d }t|  sh|jjkr|jjjj krt	djj
f n|st	d|jj
f nj fdd|jD }t|dkr|d }n>|s|rd	S t	d
|jj
jj
f nt	d|jj
jj
f |S )aD  
    Find and return the ForeignKey from model to parent if there is one
    (return None if can_fail is True and no such field exists). If fk_name is
    provided, assume it is the name of the ForeignKey field. Unless can_fail is
    True, raise an exception if there isn't a ForeignKey from model to
    parent_model.
    r   )r   c                s   g | ]}|j  kr|qS r;   )r+   )rP   r:   )fk_namer;   r<   rR     s    z$_get_foreign_key.<locals>.<listcomp>r   z)fk_name '%s' is not a ForeignKey to '%s'.z'%s' has no field named '%s'.c                s8   g | ]0}t | r|jjks0|jjjj kr|qS r;   )r)   r   rK   r%   get_parent_list)rP   r:   )r   parent_modelr;   r<   rR     s    
Nz'%s' has no ForeignKey to '%s'.zR'%s' has more than one ForeignKey to '%s'. You must specify a 'fk_name' attribute.)rH   r   r%   r'   r   r)   r   rK   r   r   rS   )r   rK   r   Zcan_failr9   Zfks_to_parentr   r;   )r   r   r   r<   _get_foreign_key  s:    	
r  r   c             C   s\   t | ||d}|jrd}
|||||	|||||
||||||||||d}t|f|}||_|S )z
    Return an ``InlineFormSet`` for the given kwargs.

    ``fk_name`` must be provided if ``model`` has more than one ``ForeignKey``
    to ``parent_model``.
    )r   r   )r6   r_   r   r   r   r   r'   r8   r   r   r^   r   r   r`   ra   rb   rU   rc   r   r   )r  uniquer   r   )r   rK   r6   r   r   r'   r8   r   r   r   r   r_   r^   r   r`   ra   rb   rU   r   r   rc   r   r   r   rd   r   r;   r;   r<   r!     s4    c                   sH   e Zd ZdZeZdediZddd fdd
Zd	d
 Z	dd Z
  ZS )r   zw
    A basic integer field that deals with validating the given value to a
    given parent instance in an inline.
    invalid_choicez3The inline value did not match the parent instance.FN)r   r   c               s\   || _ || _|| _| j d k	rB| jr6t| j | j|d< n| j j|d< d|d< t j|| d S )Nr   Fr   )parent_instancer   r   rA   rG   rs   rh   )rf   r  r   r   argsrd   )r   r;   r<   rh   X  s    
zInlineForeignKeyField.__init__c             C   s`   || j kr| jrd S | jS | jr0t| j| j}n| jj}t|t|krZt| jd dd| jS )Nr  )r   )	r3   r   r  r   rA   rG   ru   r   rU   )rf   rn   origr;   r;   r<   r   d  s    
zInlineForeignKeyField.cleanc             C   s   dS )NFr;   )rf   r   r/   r;   r;   r<   r   s  s    z!InlineForeignKeyField.has_changed)r[   ri   rj   r   r   r.   r   default_error_messagesrh   r   r   r   r;   r;   )r   r<   r   N  s   r   c               @   s$   e Zd Zdd Zdd Zdd ZdS )ModelChoiceIteratorValuec             C   s   || _ || _d S )N)rn   r7   )rf   rn   r7   r;   r;   r<   rh   x  s    z!ModelChoiceIteratorValue.__init__c             C   s
   t | jS )N)ru   rn   )rf   r;   r;   r<   __str__|  s    z ModelChoiceIteratorValue.__str__c             C   s   t |tr|j}| j|kS )N)r)   r  rn   )rf   otherr;   r;   r<   __eq__  s    
zModelChoiceIteratorValue.__eq__N)r[   ri   rj   rh   r	  r  r;   r;   r;   r<   r  w  s   r  c               @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )ModelChoiceIteratorc             C   s   || _ |j| _d S )N)r-   rE   )rf   r-   r;   r;   r<   rh     s    zModelChoiceIterator.__init__c             c   sL   | j jd k	rd| j jfV  | j}|js.|j }x|D ]}| j|V  q4W d S )Nr   )r-   empty_labelrE   Z_prefetch_related_lookupsiteratorchoice)rf   rE   r   r;   r;   r<   __iter__  s    
zModelChoiceIterator.__iter__c             C   s   | j j | jjd k	rdnd S )Nr   r   )rE   countr-   r  )rf   r;   r;   r<   __len__  s    zModelChoiceIterator.__len__c             C   s   | j jd k	p| jj S )N)r-   r  rE   exists)rf   r;   r;   r<   __bool__  s    zModelChoiceIterator.__bool__c             C   s   t | jj||| jj|fS )N)r  r-   prepare_valuelabel_from_instance)rf   r   r;   r;   r<   r    s    zModelChoiceIterator.choiceN)r[   ri   rj   rh   r  r  r  r  r;   r;   r;   r<   r    s
   
r  c            
       s   e Zd ZdZdediZeZdddddddddd		d
dZdd Z	 fddZ
dd Zdd ZeeeZdd Zdd ZeeejZ fddZdd Zdd Zdd Z  ZS ) r   z1A ChoiceField whose choices are a model QuerySet.r  zGSelect a valid choice. That choice is not one of the available choices.z	---------TNr   F)	r  r   r.   rS   r   rT   to_field_namerM   r   c   	         K   s`   t j| f|||||d| |r*|d k	s<t| jtrD|
 rDd | _n|| _|| _|	| _|| _d S )N)r   r.   rS   r   rT   )	r   rh   r)   r.   r   r  rE   rM   r  )rf   rE   r  r   r.   rS   r   rT   r  rM   r   rd   r;   r;   r<   rh     s    
zModelChoiceField.__init__c             C   s   t | jr| j S | jS )z
        Return ``limit_choices_to`` for this form field.

        If it is a callable, invoke it and return the result.
        )r\   rM   )rf   r;   r;   r<   rF     s    
z%ModelChoiceField.get_limit_choices_toc                s*   t t| j|}| jd k	r&| jj |_|S )N)rs   r   __deepcopy__rE   all)rf   memoresult)r   r;   r<   r    s    
zModelChoiceField.__deepcopy__c             C   s   | j S )N)r   )rf   r;   r;   r<   _get_queryset  s    zModelChoiceField._get_querysetc             C   s$   |d krd n|j  | _| j| j_d S )N)r  r   choicesr.   )rf   rE   r;   r;   r<   _set_queryset  s    zModelChoiceField._set_querysetc             C   s   t |S )z
        Convert objects into strings and generate the labels for the choices
        presented by this object. Subclasses can override this method to
        customize the display of the choices.
        )ru   )rf   r   r;   r;   r<   r    s    z$ModelChoiceField.label_from_instancec             C   s   t | dr| jS | j| S )N_choices)rI   r  r  )rf   r;   r;   r<   _get_choices  s    
	zModelChoiceField._get_choicesc                s.   t |dr"| jr|j| jS |jS t j|S )Nr%   )rI   r  Zserializable_valuerG   rs   r  )rf   rn   )r   r;   r<   r    s
    
zModelChoiceField.prepare_valuec             C   s~   || j krd S y8| jpd}t|| jjr2t||}| jjf ||i}W n2 tt| jjj	fk
rx   t
| jd ddY nX |S )NrG   r  )r   )r3   r  r)   rE   rK   rA   r2   r   r]   ZDoesNotExistr   rU   )rf   rn   keyr;   r;   r<   r      s    


zModelChoiceField.to_pythonc             C   s   t j| |S )N)r   validate)rf   rn   r;   r;   r<   r"    s    zModelChoiceField.validatec             C   s@   | j r
dS |d k	r|nd}|d k	r&|nd}t| j|t|kS )NFr   )disabledru   r  )rf   r   r/   initial_valueZ
data_valuer;   r;   r<   r     s
    zModelChoiceField.has_changed)r[   ri   rj   r   r   r  r  r  rh   rF   r  r  r  propertyrE   r  r   r   Z_set_choicesr  r  r   r"  r   r   r;   r;   )r   r<   r     s&   

c                   sl   e Zd ZdZeZeZedededdZ	 fddZ
dd	 Zd
d Zdd Z fddZdd Z  ZS )r   z9A MultipleChoiceField whose choices are a model QuerySet.zEnter a list of values.zESelect a valid choice. %(value)s is not one of the available choices.u"   “%(pk)s” is not a valid value.)invalid_listr  invalid_pk_valuec                sL   t  j|fdd i| | jjdd k	rHtjdtdd | jd | jd< d S )Nr  r   zFThe 'list' error message key is deprecated in favor of 'invalid_list'.r   )
stacklevelr&  )rs   rh   rU   r2   warningswarnr   )rf   rE   rd   )r   r;   r<   rh   "  s    
z!ModelMultipleChoiceField.__init__c             C   s   |sg S t | j|S )N)r   _check_values)rf   rn   r;   r;   r<   r   ,  s    z"ModelMultipleChoiceField.to_pythonc             C   sz   | j |}| jr*| r*t| jd ddn| j rB| rB| jj S t|ttfsbt| jd dd| j	|}| j
| |S )Nr   )r   r&  )r  r   r   rU   rE   r   r)   r   r   r+  Zrun_validators)rf   rn   r   r;   r;   r<   r   1  s    



zModelMultipleChoiceField.cleanc                s   | j pd yt|}W n& tk
r<   t| jd ddY nX xT|D ]L}y| jjf  |i W qD ttfk
r   t| jd dd|idY qDX qDW | jjf d  |i} fdd|D }x0|D ](}t||krt| jd	 d	d
|idqW |S )z
        Given a list of possible PK values, return a QuerySet of the
        corresponding objects. Raise a ValidationError if a given value is
        invalid (not a valid PK, not in the queryset, etc.)
        rG   r&  )r   r'  )r   paramsz%s__inc                s   h | ]}t t| qS r;   )ru   rA   )rP   r   )r!  r;   r<   rq   ]  s    z9ModelMultipleChoiceField._check_values.<locals>.<setcomp>r  rn   )	r  	frozensetr]   r   rU   rE   rJ   r   ru   )rf   rn   rG   r   Zpksvalr;   )r!  r<   r+  B  s0    


z&ModelMultipleChoiceField._check_valuesc                sH   t |dr<t|t r<t |d r<t j  fdd|D S t j|S )Nr  r%   c                s   g | ]} |qS r;   r;   )rP   rp   )r  r;   r<   rR   l  s    z:ModelMultipleChoiceField.prepare_value.<locals>.<listcomp>)rI   r)   ru   rs   r  )rf   rn   )r   )r  r<   r  g  s    
z&ModelMultipleChoiceField.prepare_valuec             C   s`   | j r
dS |d krg }|d kr"g }t|t|kr6dS dd | j|D }dd |D }||kS )NFTc             S   s   h | ]}t |qS r;   )ru   )rP   rn   r;   r;   r<   rq   x  s    z7ModelMultipleChoiceField.has_changed.<locals>.<setcomp>c             S   s   h | ]}t |qS r;   )ru   )rP   rn   r;   r;   r<   rq   y  s    )r#  r   r  )rf   r   r/   Zinitial_setZdata_setr;   r;   r<   r   o  s    z$ModelMultipleChoiceField.has_changed)r[   ri   rj   r   r   r.   r   Zhidden_widgetr   r  rh   r   r   r+  r  r   r   r;   r;   )r   r<   r     s   
%c             C   s"   t | do | jjd k	p | jjd k	S )Nr%   )rI   r%   r'   r8   )rV   r;   r;   r<   modelform_defines_fields}  s    
r/  )r   r   r   r   r   r   r   r   r   r    r!   r"   )NN)NN)	NNNNNNNNN)NF)8r   r)  	itertoolsr   Zdjango.core.exceptionsr   r   r   r   Zdjango.forms.fieldsr   r   Zdjango.forms.formsr	   r
   Zdjango.forms.formsetsr   r   Zdjango.forms.utilsr   Zdjango.forms.widgetsr   r   r   r   Zdjango.utils.deprecationr   Zdjango.utils.textr   r   Zdjango.utils.translationr   r   r   r#   r   r=   r   rN   r   re   rk   r   r   r"   r   r   r    r  r!   r   r  r  r   r   r/  r;   r;   r;   r<   <module>   st      
)
   VH @R  .d
8()sf