U
     5øi/å  ã                   @   s  d 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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dfd'd(„Z+G d)d*„ d*e*ƒZ,d?d+d,„Z-e(e,dddd-d&ddddd&dddddd&ddddfd.d/„Z.G d0d1„ d1e
ƒZ/G d2d3„ d3ƒZ0G d4d5„ d5ƒZ1G d6d7„ d7e	ƒZ2G d8d9„ d9e2ƒZ3d:d;„ Z4dS )@z[
Helper functions for creating Form classes from Django models
and database field objects.
é    )Úchain)ÚNON_FIELD_ERRORSÚ
FieldErrorÚImproperlyConfiguredÚValidationError)ÚChoiceFieldÚField)ÚBaseFormÚDeclarativeFieldsMetaclass)ÚBaseFormSetÚformset_factory)Ú	ErrorList)ÚHiddenInputÚMultipleHiddenInputÚRadioSelectÚSelectMultiple)Ú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__Nc           	      C   sü   ddl m} |j}| j}g }|jD ]¸}|jr"t||jƒs"|j|krDq"|dk	rX|j|krXq"|rh|j|krhq"| 	¡ r°| |j j
j | j| j|  |j¡¡r°| |j¡| |j j
jkr°q"t||jƒrÈ| |¡ q"| |||j ¡ q"|D ]}| |||j ¡ qà|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-unpacked-wheel-gcyiijx6/django/forms/models.pyÚconstruct_instance   s4    
ÿÿ"þýr<   c                 C   sh   | j }i }t|j|j|jƒD ]F}t|ddƒs.q|dk	rB|j|krBq|rR|j|krRq| | ¡||j< q|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)r6   r&   r7   r8   r.   r9   r:   r:   r;   r   G   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©rF   N)Údjango.db.modelsrA   rB   rC   ÚhasattrrE   r(   rD   ÚfilterÚmodelZ_base_manager)Ú	formfieldrA   rB   rC   Úlimit_choices_toZcomplex_filterr:   r:   r;   Ú#apply_limit_choices_to_to_formfield`   s    

ÿrN   T©Úapply_limit_choices_toc
                   sö  i ‰g ‰| j }ddlm‰  ‡ fdd„|jD ƒ}tt|j||jƒƒD �]�}t|ddƒsŽ|dk	rB|j	|krBˆdksx|j	ˆkrBt
d|j	| jf ƒ‚qB|dk	r¢|j	|kr¢qBˆr²|j	ˆkr²qBi }|rÒ|j	|krÒ||j	 |d	< |tksè|rð|j	|krðd
|d< |�r|j	|k�r||j	 |d< |�r0|j	|k�r0||j	 |d< |�rP|j	|k�rP||j	 |d< |	�rp|j	|	k�rp|	|j	 |d< |dk�rˆ|jf |Ž}n t|ƒ�sœtdƒ‚n||f|Ž}|�rÈ|
�r¼t|ƒ |ˆ|j	< qBˆ |j	¡ qB|�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(   ©Ú.0r9   )Ú
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:   )r1   rQ   )r7   Ú
field_dictÚignoredr:   r;   Ú
<dictcomp>Â   s     ÿ z$fields_for_model.<locals>.<dictcomp>)r$   rH   r   r>   Úsortedr   r=   r?   r@   r*   r   Ú__name__r   rL   ÚcallableÚ	TypeErrorrN   r3   )rK   r&   r7   ÚwidgetsÚformfield_callbackÚlocalized_fieldsÚlabelsÚ
help_textsrW   Úfield_classesrP   r8   Zsortable_private_fieldsr9   ÚkwargsrL   r:   )rS   r7   rY   rZ   r;   r   p   sf    "ÿÿ ÿÿ


ÿ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&   r7   r`   rb   rc   rd   rW   re   )
r@   rK   r&   r7   r`   rb   rc   rd   rW   re   )ÚselfÚoptionsr:   r:   r;   Ú__init__Ê   s    zModelFormOptions.__init__)N)r]   Ú
__module__Ú__qualname__rj   r:   r:   r:   r;   rg   É   s   rg   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚModelFormMetaclassc                    s~  d }|D ]&}t |dƒrt |jdƒr|jj} q0q| d|¡}tƒ  | |||¡}|tfkr\|S tt|dd ƒƒ }|_	dD ]:}	t||	ƒ}
t
|
tƒrv|
tkrvd|j|	|
dœ }t|ƒ‚qv|j�rn|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¡}|�r`d}|d |¡|jjf }t|ƒ‚| |j¡ n|j}||_ |S )NÚMetara   )r&   r7   rb   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.FrO   c                 S   s   h | ]\}}|s|’qS r:   r:   )rR   ÚkÚvr:   r:   r;   Ú	<setcomp>  s      z-ModelFormMetaclass.__new__.<locals>.<setcomp>z&Unknown field(s) (%s) specified for %sz, )!rI   rn   ra   ÚpopÚsuperÚ__new__r   rg   r@   r$   r(   Ústrr   r]   r_   rK   r&   r7   r   r   r`   rb   rc   rd   rW   re   ÚitemsÚ
differenceZdeclared_fieldsÚjoinr   ÚupdateZbase_fields)Zmcsr*   ÚbasesÚattrsZbase_formfield_callbackÚbra   Ú	new_classr8   ro   rp   Úmsgr&   Znone_model_fieldsZmissing_fieldsÚmessage©Ú	__class__r:   r;   rv   ×   sl    

ýÿ
þÿ
       û	
ÿzModelFormMetaclass.__new__)r]   rk   rl   rv   Ú__classcell__r:   r:   r‚   r;   rm   Ö   s   rm   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   Nú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�
 | j ¡ D ]}t|ƒ qˆd S )Nz'ModelForm has no model class specified.F)Úuse_required_attributeÚrenderer)r$   rK   Ú
ValueErrorr6   r   r&   r7   r{   Ú_validate_uniqueru   rj   ÚvaluesrN   )rh   r.   r/   Úauto_idÚprefixÚinitialÚerror_classZlabel_suffixZempty_permittedr6   r†   r‡   r8   Zobject_datarL   r‚   r:   r;   rj     s2    


       ýzBaseModelForm.__init__c                 C   sÊ   g }| j jjD ]¶}|j}|| jkr0| |j¡ q| jjrR|| jjkrR| |j¡ q| jjrt|| jjkrt| |j¡ q|| jkrŒ| |j¡ q| j| }| j |¡}|j	s|j
s||jkr| |j¡ q|S )z‘
        For backwards-compatibility, exclude several types of fields from model
        validation. See tickets #12507, #12521, #12553.
        )r6   r$   r&   r*   r3   r7   Ú_errorsr%   r1   ÚblankÚrequiredr2   )rh   r7   r9   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%   ©rh   r:   r:   r;   Úcleane  s    zBaseModelForm.cleanc                 C   sª   | j }t|dƒr|j}nt|i}| ¡ D ]p\}}|tkrT|jrTt|jkrT|jt }n|| jkr(| j| j}nq(|D ]$}t|tƒrr|j	|krr||j	 |_
qrq(|  d |¡ d S )NÚ
error_dict)r$   rI   r•   r   rx   rW   r&   r(   r   Úcoder�   Z	add_error)rh   Úerrorsr8   r•   r,   ÚmessagesrW   r�   r:   r:   r;   Ú_update_errorsi  s$    
ÿ

ÿzBaseModelForm._update_errorsc              
   C   sÒ   | j }|  ¡ }| j ¡ D ]\}}t|tƒr| |¡ qzt| | j|j|j	ƒ| _W n, t
k
r| } z|  |¡ W 5 d }~X Y nX z| jj|dd� W n, t
k
r¾ } z|  |¡ W 5 d }~X Y nX | jrÎ|  ¡  d S )NF)r7   Úvalidate_unique)r$   r’   r&   rx   r(   ÚInlineForeignKeyFieldr3   r<   r6   r7   r   r™   Z
full_cleanr‰   rš   )rh   r8   r7   r*   r,   Úer:   r:   r;   Ú_post_clean…  s    	
zBaseModelForm._post_cleanc              
   C   sL   |   ¡ }z| jj|d� W n, tk
rF } z|  |¡ W 5 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.
        ©r7   N)r’   r6   rš   r   r™   )rh   r7   rœ   r:   r:   r;   rš   £  s
    zBaseModelForm.validate_uniquec                 C   s€   | j }| jj}| jj}| jj}t|j|jƒD ]N}t|dƒs<q,|rL|j	|krLq,|r\|j	|kr\q,|j	|kr,| 
| j||j	 ¡ q,dS )zS
        Save the many-to-many fields and generic relations for this form.
        r4   N)r%   r$   r7   r&   r6   r   r?   r>   rI   r*   r4   )rh   r%   r7   r&   r8   r9   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ˆ   r6   r$   Zobject_nameÚ_stateÚaddingÚsaverŸ   Úsave_m2m)rh   Úcommitr:   r:   r;   r¤   Ã  s    þÿ

zBaseModelForm.save)T)r]   rk   rl   r   rj   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]   rk   rl   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&   r7   r`   rb   rc   rd   rW   re   rn   r:   ZForm)rn   ra   zZCalling modelform_factory without defining 'fields' or 'exclude' explicitly is prohibited.)rI   rn   ÚtypeÚstaticmethodra   r]   r@   r   )rK   r5   r&   r7   ra   r`   rb   rc   rd   rW   re   r}   r|   rn   Ú
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.
    Nr…   )r�   c                   s,   || _ || _tƒ jf ||||dœ|–Ž d S )N)r.   r/   r‹   rŒ   )rD   Úinitial_extraru   rj   )rh   r.   r/   r‹   rŒ   rD   r�   rf   r‚   r:   r;   rj   ?  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_querysetru   Úinitial_form_countr“   r‚   r:   r;   r°   E  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   ©rR   Úor:   r:   r;   r[   M  s      z5BaseModelFormSet._existing_object.<locals>.<dictcomp>)rI   r¯   r±   r1   )rh   rF   r:   r:   r;   Ú_existing_objectK  s    
z!BaseModelFormSet._existing_objectc                 C   s   |j dk	r|j  ¡ }q |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©rh   r,   r:   r:   r;   Ú_get_to_pythonP  s    
zBaseModelFormSet._get_to_pythonc                    s  ||   ¡ k }|r¨| jr–d|  |¡| jjjjf }z| j| }W n tk
rR   Y q¦X |  	| jjj¡}z||ƒ}W n t
k
r„   Y q¦X |  |¡|d< qÞ|  ¡ | |d< n6| jrÞz| j||   ¡   |d< W n tk
rÜ   Y nX tƒ j|f|Ž}|�rd|j| jjjj _|S )Nz%s-%sr6   r�   T)r°   r­   r0   rK   r$   rF   r*   r.   ÚKeyErrorr¸   r   r´   r¯   r¬   Ú
IndexErrorru   Ú_construct_formr&   r‘   )rh   Úirf   Zpk_requiredZpk_keyrF   r¶   r5   r‚   r:   r;   r»   Y  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   rD   rK   Ú_default_managerr¯   ZorderedZorder_byr$   rF   r*   r½   )rh   Ú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¤   ©rh   r5   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Á   )rh   r5   r6   r¦   r:   r:   r;   Úsave_existing’  s    zBaseModelFormSet.save_existingc                 C   s   |r|  ¡  dS )z#Deletes an existing model instance.N)Údelete)rh   Ú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   ˆ j D ]} |  ¡  qd S ©N)Úsaved_formsr¥   )r5   r“   r:   r;   r¥   £  s    
z'BaseModelFormSet.save.<locals>.save_m2m)rÉ   r¥   Úsave_existing_objectsÚsave_new_objects)rh   r¦   r¥   r:   r“   r;   r¤   ›  s
    zBaseModelFormSet.savec                 C   s   |   ¡  d S rÈ   )rš   r“   r:   r:   r;   r”   «  s    zBaseModelFormSet.cleanc                    s  t ƒ }t ƒ }ˆj‰‡fdd„ˆjD ƒ}|D ]2‰ ˆ  ¡ }ˆ jj|d�\}}| |¡ | |¡ q*g }|D ]¦\}}	t ƒ }
|D ]’‰ ‡ ‡fdd„|	D ƒ}tdd„ |D ƒƒ}|rxd |krx||
k�r | ˆ 	|	¡¡ ˆj
ˆ ¡ gˆjd�ˆ jt< |	D ]}|ˆ jkrèˆ j|= qè|
 |¡ qxqf|D ]Ü}t ƒ }
|\}}}}|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
ˆ ¡ gˆjd�ˆ jt< ˆ j|= |
 |¡ �q,�q|�rþt|ƒ‚d S )	Nc                    s    g | ]}|  ¡ r|ˆ kr|‘qS r:   )Zis_valid)rR   r5   )Úforms_to_deleter:   r;   rT   ³  s       z4BaseModelFormSet.validate_unique.<locals>.<listcomp>rž   c                 3   s0   | ](}|ˆ j kr|ˆjkr|nˆ j | V  qd S rÈ   )r%   Úunique_fields©rR   r,   )r5   rh   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)rR   Údr:   r:   r;   rÏ   Å  s   ý)r‡   Údate)ÚsetÚdeleted_formsZformsr’   r6   Z_get_unique_checksr{   rÒ   r3   Úget_unique_error_messagerŽ   Úget_form_errorr‡   r�   r   r%   ÚaddÚyearÚmonthÚdayr@   Úget_date_error_messager   )rh   Zall_unique_checksZall_date_checksZvalid_formsr7   Zunique_checksZdate_checksr—   ZuclassÚunique_checkZ	seen_dataZrow_datar,   Ú
date_checkÚlookupZ
unique_forrÔ   Z	date_datar.   r:   )r5   rÌ   rh   r;   rš   ®  sh    
þü
þ

ÿ


þ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   Ú_©rh   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   rw   )rh   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   r“   r:   r:   r;   rØ     s    zBaseModelFormSet.get_form_errorc                 C   s¦   g | _ g | _| jsg S g }| j}| jD ]z}|j}|jd kr<q&||kr`| j |¡ | j||d� q&| ¡ r&| j  ||j	f¡ | | j
|||d�¡ |s&| j |¡ q&|S ©NrÀ   )Zchanged_objectsZdeleted_objectsZinitial_formsrÖ   r6   rF   r3   rÇ   Úhas_changedZchanged_datarÄ   rÉ   )rh   r¦   Zsaved_instancesrÌ   r5   rÆ   r:   r:   r;   rÊ     s&    

z&BaseModelFormSet.save_existing_objectsc                 C   sZ   g | _ | jD ]F}| ¡ sq| jr,|  |¡r,q| j  | j||d�¡ |s| j |¡ q| j S rè   )Znew_objectsZextra_formsré   Ú
can_deleteZ_should_delete_formr3   rÃ   rÉ   )rh   r¦   r5   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:z |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 rÈ   )r'   Zauto_createdr(   rµ   Zparent_linkrK   r$   rF   rG   ©r)   Úpk_is_not_editabler:   r;   rî   F  s    ýz7BaseModelFormSet.add_fields.<locals>.pk_is_not_editableNF)r�   r‘   r-   )rH   r)   rë   rì   rK   r$   rF   Ú	_pk_fieldr*   r&   r­   r6   r¢   r£   r¯   rº   r(   rµ   r¾   ZusingÚdbr`   r1   r   r   ru   Ú
add_fields)	rh   r5   Úindexrë   rì   rF   Zpk_valuer¿   r-   r‚   rí   r;   rñ   <  s*    
zBaseModelFormSet.add_fields)NNr…   NN)T)T)T)T)T)T)r]   rk   rl   Ú__doc__rK   rÕ   rÍ   rj   r°   r´   r¸   r»   r¯   rÃ   rÄ   rÇ   r¤   r§   r”   rš   r×   rÝ   rØ   rÊ   rË   rñ   r„   r:   r:   r‚   r;   r   6  s4     ÿÿ	"



O



r   rá   Fc                 C   s|   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.rn   Nr&   r7   z]Calling modelformset_factory without defining 'fields' or 'exclude' explicitly is prohibited.)
r5   r&   r7   ra   r`   rb   rc   rd   rW   re   )
ÚextraÚmin_numÚmax_numÚ	can_orderrê   Úvalidate_minÚvalidate_maxÚabsolute_maxÚcan_delete_extrar‡   )r@   r   r!   r   rK   )rK   r5   ra   Úformsetrô   rê   r÷   rö   r&   r7   r`   rù   rb   rc   rd   rW   rõ   rø   re   rú   rû   r‡   ÚmetaÚFormSetr:   r:   r;   r   h  s6    ÿÿ
   ü   ü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Œ   rD   )Úfkrµ   rK   r6   Úsave_as_newr¾   rF   rJ   r*   ÚnonerÍ   ru   rj   r5   r$   r&   r(   rÒ   rÑ   r3   )	rh   r.   r/   r6   r   rŒ   rD   rf   r¿   r‚   r:   r;   rj   Š  s    zBaseInlineFormSet.__init__c                    s   | j r
dS tƒ  ¡ S )Nr   )r   ru   r°   r“   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Ú_mutableTrF   )ru   r»   r   r@   r.   r  r0   rï   r*   rÿ   r6   rF   rµ   rç   rK   r$   ÚsetattrZget_attname)rh   r¼   rf   r5   ZmutableZfk_valuer‚   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 rè   )r  r6   rÿ   r*   ru   rÃ   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_fieldTrU   Úto_field)ru   rñ   rï   rÿ   r*   r@   r&   r1   r   Zverbose_namerµ   rç   rK   r$   rF   r6   r¢   r£   Ú	get_fieldr+   r  Zattnamer›   )rh   r5   rò   r*   rf   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*   rÎ   r“   r:   r;   rT   è  s      z>BaseInlineFormSet.get_unique_error_message.<locals>.<listcomp>)ru   r×   rä   r‚   r“   r;   r×   ç  s    z*BaseInlineFormSet.get_unique_error_message)NNNFNN)T)r]   rk   rl   ró   rj   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 }ˆj ¡ ‰t|ˆ ƒr’|jjjj	rn|jjjj
ˆks’|jjjj	sÀ|jjˆkrÀ|jjˆkrÀtdˆˆjjf ƒ‚n|sÀtd|jjˆf ƒ‚nzˆj ¡ ‰‡ ‡‡fdd„|jD ƒ}t|ƒdkrú|d }nB|�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*   rQ   ©Úfk_namer:   r;   rT   ø  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                    sN   g | ]F}t |ˆ ƒr|jjˆksF|jjˆksF|jjjjr|jjjjˆkr|‘qS r:   )r(   rµ   rK   r$   ÚproxyÚproxy_for_modelrQ   )rë   Úparent_listÚparent_modelr:   r;   rT     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®   Zget_parent_listr(   rµ   rK   r  r  rˆ   rU   )r  rK   r  Zcan_failr8   Zfks_to_parentrÿ   r:   )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á   )r5   ra   rü   rô   rê   r÷   r&   r7   rõ   rö   r`   rø   rù   rb   rc   rd   rW   re   rú   rû   r‡   )r  Úuniquer   rÿ   )r  rK   r5   rü   r  r&   r7   rô   r÷   rê   rö   ra   r`   rù   rb   rc   rd   rW   rõ   rø   re   rú   rû   r‡   rÿ   rf   rþ   r:   r:   r;   r    0  s8    ë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
  r@   rF   ru   rj   )rh   r  r	  r
  Úargsrf   r‚   r:   r;   rj   j  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–   )	r2   r	  r  r
  r@   rF   rw   r   rW   )rh   rp   Úorigr:   r:   r;   r”   v  s    
zInlineForeignKeyField.cleanc                 C   s   dS )NFr:   )rh   r�   r.   r:   r:   r;   ré   …  s    z!InlineForeignKeyField.has_changed)r]   rk   rl   ró   r   r-   rã   Údefault_error_messagesrj   r”   ré   r„   r:   r:   r‚   r;   r›   `  s    ÿr›   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚModelChoiceIteratorValuec                 C   s   || _ || _d S rÈ   )rp   r6   )rh   rp   r6   r:   r:   r;   rj   Š  s    z!ModelChoiceIteratorValue.__init__c                 C   s
   t | jƒS rÈ   )rw   rp   r“   r:   r:   r;   Ú__str__Ž  s    z ModelChoiceIteratorValue.__str__c                 C   s
   t | jƒS rÈ   )Úhashrp   r“   r:   r:   r;   Ú__hash__‘  s    z!ModelChoiceIteratorValue.__hash__c                 C   s   t |tƒr|j}| j|kS rÈ   )r(   r  rp   )rh   Úotherr:   r:   r;   Ú__eq__”  s    
zModelChoiceIteratorValue.__eq__N)r]   rk   rl   rj   r  r  r   r:   r:   r:   r;   r  ‰  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 rÈ   )r,   rD   r·   r:   r:   r;   rj   ›  s    zModelChoiceIterator.__init__c                 c   sH   | j jd k	rd| j jfV  | j}|js.| ¡ }|D ]}|  |¡V  q2d S )Nr  )r,   Úempty_labelrD   Z_prefetch_related_lookupsÚiteratorÚchoice)rh   rD   rÆ   r:   r:   r;   Ú__iter__Ÿ  s    zModelChoiceIterator.__iter__c                 C   s   | j  ¡ | jjd k	rdnd S )Nrá   r   )rD   Úcountr,   r"  r“   r:   r:   r;   Ú__len__©  s    zModelChoiceIterator.__len__c                 C   s   | j jd k	p| j ¡ S rÈ   )r,   r"  rD   Úexistsr“   r:   r:   r;   Ú__bool__¯  s    zModelChoiceIterator.__bool__c                 C   s   t | j |¡|ƒ| j |¡fS rÈ   )r  r,   Úprepare_valueÚlabel_from_instance©rh   rÆ   r:   r:   r;   r$  ²  s    
þzModelChoiceIterator.choiceN)r]   rk   rl   rj   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-   rU   r�   rV   Ú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-   rU   r�   rV   )	r   rj   r(   r-   r   r"  rD   rM   r-  )rh   rD   r"  r‘   r-   rU   r�   rV   r-  rM   r�   rf   r:   r:   r;   rj   Ã  s0    ÿ   þþÿÿ
þþ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   r“   r:   r:   r;   rE   Ø  s    
z%ModelChoiceField.get_limit_choices_toc                    s*   t t| ƒ |¡}| jd k	r&| j ¡ |_|S rÈ   )ru   r   Ú__deepcopy__rD   Úall)rh   ÚmemoÚresultr‚   r:   r;   r.  â  s    
zModelChoiceField.__deepcopy__c                 C   s   | j S rÈ   )r½   r“   r:   r:   r;   Ú_get_queryseté  s    zModelChoiceField._get_querysetc                 C   s$   |d krd n|  ¡ | _| j| j_d S rÈ   )r/  r½   Úchoicesr-   )rh   rD   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.
        ©rw   r,  r:   r:   r;   r+  ô  s    z$ModelChoiceField.label_from_instancec                 C   s   t | dƒr| jS |  | ¡S )NÚ_choices)rI   r6  r#  r“   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_valuerF   ru   r*  ©rh   rp   r‚   r:   r;   r*    s
    
zModelChoiceField.prepare_valuec              
   C   s„   || j krd S z8| jpd}t|| jjƒr2t||ƒ}| jjf ||iŽ}W n8 tt| jjj	fk
r~   t
| jd dd|id�‚Y nX |S )NrF   r  rp   ©r–   Úparams)r2   r-  r(   rD   rK   r@   r1   rˆ   r_   ZDoesNotExistr   rW   )rh   rp   Úkeyr:   r:   r;   r¶     s    


ýzModelChoiceField.to_pythonc                 C   s   t  | |¡S rÈ   )r   Úvalidater9  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  )Údisabledrw   r*  )rh   r�   r.   Úinitial_valueZ
data_valuer:   r:   r;   ré   (  s
    zModelChoiceField.has_changed)r]   rk   rl   ró   rã   r  r!  r#  rj   rE   r.  r2  r4  ÚpropertyrD   r+  r7  r   Z_set_choicesr3  r*  r¶   r=  ré   r„   r:   r:   r‚   r;   r   ¹  s6    ÿ     ý

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                    s   t ƒ j|fdd i|—Ž d S )Nr"  )ru   rj   )rh   rD   rf   r‚   r:   r;   rj   ;  s    z!ModelMultipleChoiceField.__init__c                 C   s   |sg S t |  |¡ƒS rÈ   )rÑ   Ú_check_valuesr9  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  rA  )r*  r‘   r   rW   rD   r  r(   rÑ   rÒ   rC  Zrun_validators)rh   rp   r¿   r:   r:   r;   r”   C  s    



þ

zModelMultipleChoiceField.cleanc              
      sê   | j pd‰ zt|ƒ}W n& tk
r<   t| jd dd�‚Y nX |D ]L}z| jjf ˆ |iŽ W qB ttfk
rŒ   t| jd dd|id�‚Y qBX qB| jjf dˆ  |iŽ}‡ fdd„|D ƒ}|D ](}t|ƒ|kr¼t| jd	 d	d
|id�‚q¼|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.)
        rF   rA  r  rB  r:  z%s__inc                    s   h | ]}t t|ˆ ƒƒ’qS r:   )rw   r@   r²   ©r<  r:   r;   rs   o  s     z9ModelMultipleChoiceField._check_values.<locals>.<setcomp>r  rp   )	r-  Ú	frozensetr_   r   rW   rD   rJ   rˆ   rw   )rh   rp   rF   r¿   ZpksÚvalr:   rD  r;   rC  T  s6    
þýý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:   )rR   rr   ©r*  r:   r;   rT   ~  s     z:ModelMultipleChoiceField.prepare_value.<locals>.<listcomp>)rI   r(   rw   ru   r*  r9  r‚   rG  r;   r*  y  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:   r5  ©rR   rp   r:   r:   r;   rs   Š  s     z7ModelMultipleChoiceField.has_changed.<locals>.<setcomp>c                 S   s   h | ]}t |ƒ’qS r:   r5  rH  r:   r:   r;   rs   ‹  s     )r>  r®   r*  )rh   r�   r.   Zinitial_setZdata_setr:   r:   r;   ré   �  s    z$ModelMultipleChoiceField.has_changed)r]   rk   rl   ró   r   r-   r   Zhidden_widgetrã   r  rj   r¶   r”   rC  r*  ré   r„   r:   r:   r‚   r;   r   0  s   ü%r   c                 C   s"   t | dƒo | jjd k	p | jjd k	S r8  )rI   r$   r&   r7   )rX   r:   r:   r;   Úmodelform_defines_fields�  s    

þrI  )NN)NN)	NNNNNNNNN)NF)5ró   Ú	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.textr   r   Zdjango.utils.translationr   r   rã   r"   r   r<   r   rN   r   rg   rm   r   r   r!   r   r   r   r  r    r›   r  r!  r   r   rI  r:   r:   r:   r;   Ú<module>   sº   
)
          ýýYH @    ý
U  4             ú
 d
D              ù
0)w_