B
    CVvgãâ  ã               @   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/d@d,d-„Z0e+e/dddd.d'ddddd'dddddd'dddfd/d0„Z1G d1d2„ d2eƒZ2G d3d4„ d4ƒZ3G d5d6„ d6ƒZ4G d7d8„ d8e
ƒZ5G d9d:„ d:e5ƒZ6d;d<„ Z7dS )Az[
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r$t||jƒs$|j|krFq$|dk	rZ|j|krZq$|rj|j|krjq$| 	¡ r²| |j j
j | j| j|  |j¡¡r²| |j¡| |j j
jkr²q$t||jƒrÊ| |¡ q$| |||j ¡ q$W x|D ]}| |||j ¡ qæW |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;   ú7/tmp/pip-install-o3oxmrkh/Django/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< 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    r   c             C   s€   ddl m}m}m} t| dƒr|t| dƒr||  ¡ }|r||}t||ƒsL|f |Ž}|||dƒd�M }| 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 ƒ}�xªt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r¦qFˆr¶|j	ˆkr¶qFi }|rÖ|j	|krÖ||j	 |d	< |tksì|rô|j	|krôd
|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|ƒ�s tdƒ‚n||f|Ž}|�rÌ|
�rÀt|ƒ |ˆ|j	< qFˆ |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 | ]$}ˆ r|ˆ kr|ˆkrˆ  |¡|“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    "


r   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 | d|¡}tƒ  | |||¡}|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ràtd| ƒ‚|jtkrðd |_t|j|j|j|j||j|j|j|j|jdd�}d	d
„ | ¡ D ƒ}| |j¡}|�rfd}|d |¡|jjf }t|ƒ‚| |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, )!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| ¡ | _i }n|	| _t|	|j|jƒ}|d k	rX| |¡ d| _t	ƒ j
|||||||||
|d�
 x| j ¡ D ]}t|ƒ qŠW 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¡ q| jjrT|| jjkrT| |j¡ q| jjrv|| jjkrv| |j¡ q|| jkrŽ| |j¡ q| j| }| j |¡}|j	s|j
s||jkr| |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€| ¡ 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 |  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 }|  ¡ }x*| j ¡ D ]\}}t|tƒr| |¡ qW yt| | j|j|j	ƒ| _W n, t
k
r€ } z|  |¡ W d d }~X Y nX y| jj|dd� W n, t
k
rÂ } z|  |¡ W d d }~X Y nX | jrÒ|  ¡  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   |   ¡ }y| jj|d� W n, tk
rF } z|  |¡ W dd}~X Y 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	 ¡ 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 ¡  |  ¡  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   )
r   c               @   s   e Zd ZdS )r   N)r[   ri   rj   r;   r;   r;   r<   r   ß  s   r   )Ú	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d}td||ƒ}|r¸t|ƒ|_| jd }||dœ}t|ddƒdkrôt|ddƒdkrôt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   r;   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:    '

r"   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|  ¡ ƒS tƒ  ¡ 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„ |  ¡ D ƒ| _| 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  ¡ }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  ||   ¡ k }|r¨| jr–d|  |¡| jjjjf }y| j| }W n tk
rR   Y q¦X |  	| jjj¡}y||ƒ}W n t
k
r„   Y q¦X |  |¡|d< qÞ|  ¡ | |d< n6| jrÞy| 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s@| | jjjj	¡}|| _
| j
S )NÚ	_queryset)rI   rE   rK   Ú_default_managerrª   Ú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|  ¡  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„}|ˆ _ˆ  |¡ˆ  |¡ 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 ]} |  ¡  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   |   ¡  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|d�\}}| |¡ | |¡ q,W g }x°|D ]¨\}}	t ƒ }
x˜|D ]�‰ ‡ ‡fdd„|	D ƒ}tdd„ |D ƒƒ}|r€d |kr€||
k�r| ˆ 	|	¡¡ ˆ 
ˆ ¡ g¡ˆ jt< x|	D ]}|ˆ jkrìˆ j|= qìW |
 |¡ q€W 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æ| ˆ |¡¡ ˆ 
ˆ ¡ g¡ˆ jt< ˆ j|= |
 |¡ �q:W �qW |�r
t|ƒ‚d S )Nc                s    g | ]}|  ¡ 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| ¡ 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||d� q(| ¡ r(| j  ||j	f¡ | | j
|||d�¡ |s(| 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}| ¡ sq| jr.|  |¡r.q| j  | j||d�¡ |s| 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}nd}W n tk
rž   d}Y nX t|||fƒr¾|jjj ¡ }n| jj ¡ }| |jjj¡}|jjrø|jj | jjt¡}nt}t||d|d�|j	| jj< tƒ  ||¡ 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   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     


r   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 ¡ | _n|| _|| _|d kr4| jj}| jjd k	rX|jf | j j| jiŽ}n| 	¡ }| j jh| _
tƒ j||f||dœ|—Ž | jjjrÜ| j j| jjjkrÜt| jjjtƒrÈt| 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ƒ  ¡ 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¡< d |j| | j	j¡< |d k	rl||j_| j
j}| j	jj| j	jjjjjkr¬t| j
| j	jjƒ}t|d|ƒ}t|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� 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kr,| jj}ddi}n(| jj}dt|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Ê| d¡d k	r¨| jj |d ¡}n
| jjj}| ¡ rÊt| 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 ƒ  |¡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    r    c                s  ddl m‰  |j}ˆr–‡fdd„|jD ƒ}t|ƒdkr||d }t|ˆ ƒrf|jjˆkr”|jjˆj ¡ kr”t	dˆˆjj
f ƒ‚n|s”t	d|jj
ˆf ƒ‚nj‡ ‡fdd„|jD ƒ}t|ƒdkrÂ|d }n>|sè|rÎd	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 ¡ 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    r!   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.| ¡ }x|D ]}|  |¡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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 ¡ S )N)r-   r  rE   Úexists)rf   r;   r;   r<   Ú__bool__š  s    zModelChoiceIterator.__bool__c             C   s   t | 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ƒrB|
sBd | _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|  ¡ 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d k	r&| 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_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 |  | ¡S )NÚ_choices)rI   r   r  )rf   r;   r;   r<   Ú_get_choicesç  s    
	zModelChoiceField._get_choicesc                s.   t |dƒr"| jr| | j¡S |jS tƒ  |¡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  | |¡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|  |¡ƒ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&   

r   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 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 |  |¡ƒS )N)rÆ   Ú_check_values)rf   rn   r;   r;   r<   r°   ,  s    z"ModelMultipleChoiceField.to_pythonc             C   st   |   |¡}| jr(|s(t| jd dd�‚n| js<|s<| j ¡ S t|ttfƒs\t| jd dd�‚|  	|¡}|  
|¡ |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rÂt| jd	 d	d
|id�‚qÂW |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                sD   t |dƒr8t|tƒs8t |dƒs8tƒ j‰ ‡ fdd„|D ƒS tƒ  |¡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„ |  |¡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   
%r   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    
r0  )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   r0  r;   r;   r;   r<   Ú<module>   sn   
)
   VH @R  .d
8()sf