a
    xd3                     @   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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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 }|jD ]}|jr"t||js"|j|vrDq"|durX|j|vrXq"|rh|j|v rhq"|	 r| |j j
j| j| j| |jr||j| |j j
jv rq"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;   K/var/www/html/Ranjet/env/lib/python3.9/site-packages/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urB|j|vrBq|rR|j|v 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)r7   r'   r8   r9   r/   r:   r;   r;   r<   r   I   s    r   c                 C   s6   t | dr2t | dr2|  }|dur2| j|| _dS )z=Apply limit_choices_to to the formfield's queryset if needed.querysetget_limit_choices_toN)hasattrrC   rB   Zcomplex_filter)	formfieldlimit_choices_tor;   r;   r<   #apply_limit_choices_to_to_formfieldb   s    rG   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urB|j	|v rBdu sx|j	vrBt
d|j	| jf qB|dur|j	|vrqBr|j	v rqBi }|r|j	|v r||j	 |d	< |tks|r|j	|v rd
|d< |r|j	|v r||j	 |d< |r0|j	|v r0||j	 |d< |rP|j	|v rP||j	 |d< |	rp|j	|	v rp|	|j	 |d< |du r|jf i |}n$t|stdn||fi |}|r|
rt| ||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)   .0r:   )
ModelFieldr;   r<   
<listcomp>       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| vr|vr| |qS r;   )r2   rJ   )r8   
field_dictignoredr;   r<   
<dictcomp>   s   z$fields_for_model.<locals>.<dictcomp>)r%   django.db.modelsr   r?   sortedr   r>   r@   rA   r+   r   __name__r   rE   callable	TypeErrorrG   r4   )modelr'   r8   widgetsformfield_callbacklocalized_fieldslabels
help_textsrQ   field_classesrI   r9   Zsortable_private_fieldsr:   kwargsrE   r;   )rL   r8   rS   rT   r<   r   j   sd    "


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 )
Nr[   r'   r8   r\   r^   r_   r`   rQ   ra   )
rA   r[   r'   r8   r\   r^   r_   r`   rQ   ra   )selfoptionsr;   r;   r<   __init__   s    zModelFormOptions.__init__)N)rX   
__module____qualname__rf   r;   r;   r;   r<   rc      s   rc   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 u r|jd u rtd| |jtkrd |_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Metar]   )r'   r8   r^   zP%(model)s.Meta.%(opt)s cannot be a string. Did you mean to type: ('%(value)s',)?)r[   optvaluez|Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is prohibited; form %s needs updating.FrH   c                 S   s   h | ]\}}|s|qS r;   r;   )rK   kvr;   r;   r<   	<setcomp>  rN   z-ModelFormMetaclass.__new__.<locals>.<setcomp>z&Unknown field(s) (%s) specified for %sz, )!rD   rj   r]   popsuper__new__r   rc   rA   r%   r)   strr   rX   rZ   r[   r'   r8   r   r   r\   r^   r_   r`   rQ   ra   items
differenceZdeclared_fieldsjoinr   updateZbase_fields)Zmcsr+   basesattrsZbase_formfield_callbackbr]   	new_classr9   rk   rl   msgr'   Znone_model_fieldsZmissing_fieldsmessage	__class__r;   r<   rr      s^    




	
zModelFormMetaclass.__new__)rX   rg   rh   rr   __classcell__r;   r;   r~   r<   ri      s   ri   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 u rtd|	d u r0| | _i }n|	| _t|	|j|j}|d urX|| d| _t	 j
|||||||||
|d
 | j D ]}t| qd S )Nz'ModelForm has no model class specified.F)use_required_attributerenderer)r%   r[   
ValueErrorr7   r   r'   r8   rw   _validate_uniquerq   rf   valuesrG   )rd   r/   r0   auto_idprefixinitialerror_classZlabel_suffixZempty_permittedr7   r   r   r9   Zobject_datarE   r~   r;   r<   rf     s$    


zBaseModelForm.__init__c                 C   s   g }| j jjD ]}|j}|| jvr0||j q| jjrR|| jjvrR||j q| jjrt|| jjv rt||j q|| jv r||j q| j| }| j|}|j	s|j
s||jv r||j q|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   )rd   r8   r:   r-   Z
form_fieldZfield_valuer;   r;   r<   _get_validation_exclusions6  s     

	
z(BaseModelForm._get_validation_exclusionsc                 C   s   d| _ | jS )NT)r   r&   rd   r;   r;   r<   clean_  s    zBaseModelForm.cleanc                 C   s   | j }t|dr|j}nt|i}| D ]p\}}|tkrT|jrTt|jv rT|jt }n|| jv r(| j| j}nq(|D ]$}t|trr|j	|v rr||j	 |_
qrq(| d | d S )N
error_dict)r%   rD   r   r   rt   rQ   r'   r)   r   coder}   Z	add_error)rd   errorsr9   r   r-   messagesrQ   r}   r;   r;   r<   _update_errorsc  s$    


zBaseModelForm._update_errorsc              
   C   s   | j }|  }| j D ]\}}t|tr|| qzt| | j|j|j	| _W n. t
y~ } z| | W Y d }~n
d }~0 0 z| jj|dd W n. t
y } z| | W Y d }~n
d }~0 0 | jr|   d S )NF)r8   validate_unique)r%   r   r'   rt   r)   InlineForeignKeyFieldr4   r=   r7   r8   r   r   Z
full_cleanr   r   )rd   r9   r8   r+   r-   er;   r;   r<   _post_clean  s    	
  zBaseModelForm._post_cleanc              
   C   sN   |   }z| jj|d W n. tyH } z| | W Y d}~n
d}~0 0 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   )rd   r8   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	|vrLq,|r\|j	|v r\q,|j	|v r,|
| j||j	  q,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?   rD   r+   r5   )rd   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)rd   commitr;   r;   r<   r     s    

zBaseModelForm.save)T)rX   rg   rh   r   rf   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)rX   rg   rh   r;   r;   r;   r<   r     s   r   )	metaclassc                 C   s  d| i}|dur||d< |dur(||d< |dur8||d< |durH||d< |durX||d< |durh||d< |	durx|	|d	< |
dur|
|d
< t |dr|jfnd}td||}|rt||_| jd }||d}t|dddu rt|dddu 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.
    r[   Nr'   r8   r\   r^   r_   r`   rQ   ra   rj   r;   ZForm)rj   r]   zZCalling modelform_factory without defining 'fields' or 'exclude' explicitly is prohibited.)rD   rj   typestaticmethodr]   rX   rA   r   )r[   r6   r'   r8   r]   r\   r^   r_   r`   rQ   ra   ry   rx   rj   
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                   s0   || _ || _t jf i ||||d| d S )N)r/   r0   r   r   )rB   initial_extrarq   rf   )rd   r/   r0   r   r   rB   r   rb   r~   r;   r<   rf   9  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_querysetrq   initial_form_countr   r~   r;   r<   r   ?  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;   pkrK   or;   r;   r<   rU   G  rN   z5BaseModelFormSet._existing_object.<locals>.<dictcomp>)rD   r   r   r2   )rd   r   r;   r;   r<   _existing_objectE  s    
z!BaseModelFormSet._existing_objectc                 C   s   |j du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rd   r-   r;   r;   r<   _get_to_pythonJ  s    
zBaseModelFormSet._get_to_pythonc                    s
  ||   k }|r| jrd| || jjjjf }z| j| }W n tyP   Y q0 | 	| jjj}z||}W n t
y   Y q0 | ||d< q|  | |d< n4| jrz| j||     |d< W n ty   Y n0 t j|fi |}|rd|j| jjjj _|S )Nz%s-%sr7   r   T)r   r   r1   r[   r%   r   r+   r/   KeyErrorr   r   r   r   r   
IndexErrorrq   _construct_formr'   r   )rd   irb   Zpk_requiredZpk_keyr   r   r6   r~   r;   r<   r   S  s0    z BaseModelFormSet._construct_formc                 C   sL   t | dsF| jd ur| j}n| jj }|js@|| jjjj	}|| _
| j
S )N	_queryset)rD   rB   r[   _default_managerr   ZorderedZorder_byr%   r   r+   r   )rd   qsr;   r;   r<   r   u  s    

zBaseModelFormSet.get_querysetTc                 C   s   |j |dS )z8Save and return a new model instance for the given form.r   r   rd   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   )rd   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)rd   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   )r6   r   r;   r<   r     s    
z'BaseModelFormSet.save.<locals>.save_m2m)r   r   save_existing_objectssave_new_objects)rd   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 |vrx||
v r|	|	 
 g jt< |	D ]}| jv r j|= q|
| qxqf|D ]}t  }
|\}}}}|D ]  jr$ j| d ur$ j| d ur$|dkrv j| }|j|j|jf}nt j| |f} j| f| }||
v r|| 
 g jt<  j|= |
| q$q
|rt|d S )Nc                    s    g | ]}|  r| vr|qS r;   )Zis_valid)rK   r6   )forms_to_deleter;   r<   rM     rN   z4BaseModelFormSet.validate_unique.<locals>.<listcomp>r   c                 3   s0   | ](}| j v r|jv r|n j | V  qd S r   )r&   unique_fieldsrK   r-   )r6   rd   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)rD   r   r)   listtuple)rK   dr;   r;   r<   r     s   date)setdeleted_formsZformsr   r7   Z_get_unique_checksrw   r   r4   get_unique_error_messager   get_form_errorr   r   r&   addyearmonthdayrA   get_date_error_messager   )rd   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   rd   r<   r     s\    





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   _rd   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   rs   )rd   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 u r<q&||v r`| j| | j||d q&| r&| j ||j	f || j
|||d |s&| j| q&|S Nr   )Zchanged_objectsZdeleted_objectsZinitial_formsr   r7   r   r4   r   has_changedZchanged_datar   r   )rd   r   Zsaved_instancesr   r6   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_formr4   r   r   )rd   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	vr|j
rf|jjjr\dn|jj}n8z |dur|  | j}nd}W n ty   d}Y n0 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_linkr[   r%   r   r   r*   pk_is_not_editabler;   r<   r   :  s    z7BaseModelFormSet.add_fields.<locals>.pk_is_not_editableNF)r   r   r.   )rV   r*   r   r   r[   r%   r   	_pk_fieldr+   r'   r   r7   r   r   r   r   r)   r   r   Zusingdbr\   r2   r   r   rq   
add_fields)	rd   r6   indexr   r   r   Zpk_valuer   r.   r~   r   r<   r   0  s*    
zBaseModelFormSet.add_fields)NNr   NN)T)T)T)T)T)T)rX   rg   rh   __doc__r[   r   r   rf   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r;   r;   r~   r<   r   0  s4     	"



I



r   r   Fc                 C   sv   t |dd}t |d|du r4t |d|	du r4tdt| |||	||
|||||d}t|||||||||d	}| |_|S )z8Return a FormSet class for the given Django model class.rj   Nr'   r8   z]Calling modelformset_factory without defining 'fields' or 'exclude' explicitly is prohibited.)
r6   r'   r8   r]   r\   r^   r_   r`   rQ   ra   )extramin_nummax_num	can_orderr   validate_minvalidate_max)rA   r   r"   r   r[   )r[   r6   r]   formsetr   r   r   r   r'   r8   r\   r   r^   r_   r`   rQ   r   r   ra   metaFormSetr;   r;   r<   r   \  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 u r| j j | _n|| _|| _|d u r4| jj}| jjd ur\|jf i | j j| ji}n|	 }| j jh| _
t j||f||d| | jjjr| j j| jjjvrt| jjjtrt| jjj| jj_| jjj| j j d S )N)r   rB   )fkr   r[   r7   save_as_newr   r   filterr+   noner   rq   rf   r6   r%   r'   r)   r   r   r4   )	rd   r/   r0   r7   r   r   rB   rb   r   r~   r;   r<   rf   {  s    zBaseInlineFormSet.__init__c                    s   | j r
dS t  S )Nr   )r   rq   r   r   r~   r;   r<   r     s    z$BaseInlineFormSet.initial_form_countc                    s   t  j|fi |}| jrpt|jdd }|d ur8d|j_d |j|| jj< d |j|| j	j< |d urp||j_| j
j}| j	jj| j	jjjjjkrt| j
| j	jj}t|d|}t|j
| j	 | |S )N_mutableTr   )rq   r   r   rA   r/   r   r1   r   r+   r   r7   r   r   r   r[   r%   setattrZget_attname)rd   r   rb   r6   ZmutableZfk_valuer~   r;   r<   r     s    z!BaseInlineFormSet._construct_formc                 C   s   | j jj| jdddS )N)r[   + )r   r   Zget_accessor_namer[   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   r7   r   r+   rq   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 ur| jj|d }n
| jjj}| rt| j|jd  t| jfi ||j|< d S )Npk_fieldTrO   to_field)rq   r   r   r   r+   rA   r'   r2   r   Zverbose_namer   r   r[   r%   r   r7   r   r   	get_fieldr,   r   Zattnamer   )rd   r6   r   r+   rb   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<   rM     rN   z>BaseInlineFormSet.get_unique_error_message.<locals>.<listcomp>)rq   r   r   r~   r   r<   r     s    z*BaseInlineFormSet.get_unique_error_message)NNNFNN)T)rX   rg   rh   r   rf   r   r   classmethodr  r   r   r   r   r;   r;   r~   r<   r    y  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 v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+   rJ   fk_namer;   r<   rM     rN   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 v r|qS r;   )r)   r   r[   r%   get_parent_listrJ   )r   parent_modelr;   r<   rM     s
   
Nz'%s' has no ForeignKey to '%s'.zR'%s' has more than one ForeignKey to '%s'. You must specify a 'fk_name' attribute.)rV   r   r%   r'   r   r)   r   r[   r  r   rO   )r  r[   r  Zcan_failr9   Zfks_to_parentr   r;   )r   r  r  r<   _get_foreign_key  sP    	


r  r   c                 C   s\   t | ||d}|jrd}
|||||	|||||
||||||||d}t|fi |}||_|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^   r_   r`   rQ   ra   )r  uniquer   r   )r  r[   r6   r   r  r'   r8   r   r   r   r   r]   r\   r   r^   r_   r`   rQ   r   r   ra   r   rb   r   r;   r;   r<   r!     s2    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 urB| jr6t| j | j|d< n| j j|d< d|d< t j|i | d S )Nr   Fr   )parent_instancer  r  rA   r   rq   rf   )rd   r  r  r  argsrb   r~   r;   r<   rf   K  s    
zInlineForeignKeyField.__init__c                 C   s`   || j v 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   r   rs   r   rQ   )rd   rl   origr;   r;   r<   r   W  s    
zInlineForeignKeyField.cleanc                 C   s   dS )NFr;   )rd   r   r/   r;   r;   r<   r   f  s    z!InlineForeignKeyField.has_changed)rX   rg   rh   r   r   r.   r   default_error_messagesrf   r   r   r   r;   r;   r~   r<   r   A  s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )ModelChoiceIteratorValuec                 C   s   || _ || _d S r   )rl   r7   )rd   rl   r7   r;   r;   r<   rf   k  s    z!ModelChoiceIteratorValue.__init__c                 C   s
   t | jS r   )rs   rl   r   r;   r;   r<   __str__o  s    z ModelChoiceIteratorValue.__str__c                 C   s   t |tr|j}| j|kS r   )r)   r  rl   )rd   otherr;   r;   r<   __eq__r  s    
zModelChoiceIteratorValue.__eq__N)rX   rg   rh   rf   r  r  r;   r;   r;   r<   r  j  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-   rB   r   r;   r;   r<   rf   y  s    zModelChoiceIterator.__init__c                 c   sH   | j jd urd| j jfV  | j}|js.| }|D ]}| |V  q2d S )Nr  )r-   empty_labelrB   Z_prefetch_related_lookupsiteratorchoice)rd   rB   r   r;   r;   r<   __iter__}  s    zModelChoiceIterator.__iter__c                 C   s   | j  | jjd urdnd S )Nr   r   )rB   countr-   r  r   r;   r;   r<   __len__  s    zModelChoiceIterator.__len__c                 C   s   | j jd up| j S r   )r-   r  rB   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rd   r   r;   r;   r<   r    s    
zModelChoiceIterator.choiceN)rX   rg   rh   rf   r  r   r"  r  r;   r;   r;   r<   r  x  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.   rO   r   rP   to_field_namerF   r   c       	         K   s^   t j| f|||||d| |r*|d us:t| jtrB|
sBd | _n|| _|| _|	| _|| _d S )N)r   r.   rO   r   rP   )	r   rf   r)   r.   r   r  rB   rF   r&  )rd   rB   r  r   r.   rO   r   rP   r&  rF   r   rb   r;   r;   r<   rf     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.
        )rY   rF   r   r;   r;   r<   rC     s    
z%ModelChoiceField.get_limit_choices_toc                    s*   t t| |}| jd ur&| j |_|S r   )rq   r   __deepcopy__rB   all)rd   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 u rd n|  | _| j| j_d S r   )r(  r   choicesr.   )rd   rB   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.
        rs   r%  r;   r;   r<   r$    s    z$ModelChoiceField.label_from_instancec                 C   s   t | dr| jS | | S )N_choices)rD   r/  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%   )rD   r&  Zserializable_valuer   rq   r#  rd   rl   r~   r;   r<   r#    s
    
zModelChoiceField.prepare_valuec              
   C   s   || j v rd S z<| jpd}t|| jjr2t||}| jjf i ||i}W n0 tt| jjj	fyz   t
| jd ddY n0 |S )Nr   r  r  )r3   r&  r)   rB   r[   rA   r2   r   rZ   ZDoesNotExistr   rQ   )rd   rl   keyr;   r;   r<   r     s    


zModelChoiceField.to_pythonc                 C   s   t | |S r   )r   validater2  r;   r;   r<   r4    s    zModelChoiceField.validatec                 C   s@   | j r
dS |d ur|nd}|d ur&|nd}t| |t|kS )NFr  )disabledrs   r#  )rd   r   r/   initial_valueZ
data_valuer;   r;   r<   r     s
    zModelChoiceField.has_changed)rX   rg   rh   r   r   r  r  r  rf   rC   r'  r+  r-  propertyrB   r$  r0  r   Z_set_choicesr,  r#  r   r4  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 u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   )
stacklevelr8  )rq   rf   rQ   r2   warningswarnr   )rd   rB   rb   r~   r;   r<   rf     s    z!ModelMultipleChoiceField.__init__c                 C   s   |sg S t | |S r   )r   _check_valuesr2  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  r8  )r#  r   r   rQ   rB   r   r)   r   r   r=  Zrun_validators)rd   rl   r   r;   r;   r<   r   $  s    





zModelMultipleChoiceField.cleanc              
      s   | j pd zt|}W n$ ty:   t| jd ddY n0 |D ]N}z| jjf i  |i W q@ ttfy   t| jd dd|idY q@0 q@| jjf i d  |i} fdd|D }|D ](}t||vrt| 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.)
        r   r8  r  r9  )r   paramsz%s__inc                    s   h | ]}t t| qS r;   )rs   rA   r   r3  r;   r<   ro   P  rN   z9ModelMultipleChoiceField._check_values.<locals>.<setcomp>r  rl   )	r&  	frozensetrZ   r   rQ   rB   r   r   rs   )rd   rl   r   r   Zpksvalr;   r?  r<   r=  5  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;   )rK   rn   r#  r;   r<   rM   _  rN   z:ModelMultipleChoiceField.prepare_value.<locals>.<listcomp>)rD   r)   rs   rq   r#  r2  r~   rB  r<   r#  Z  s    
z&ModelMultipleChoiceField.prepare_valuec                 C   s`   | j r
dS |d u rg }|d u r"g }t|t|kr6dS dd | |D }dd |D }||kS )NFTc                 S   s   h | ]}t |qS r;   r.  rK   rl   r;   r;   r<   ro   k  rN   z7ModelMultipleChoiceField.has_changed.<locals>.<setcomp>c                 S   s   h | ]}t |qS r;   r.  rC  r;   r;   r<   ro   l  rN   )r5  r   r#  )rd   r   r/   Zinitial_setZdata_setr;   r;   r<   r   b  s    z$ModelMultipleChoiceField.has_changed)rX   rg   rh   r   r   r.   r   Zhidden_widgetr   r  rf   r   r   r=  r#  r   r   r;   r;   r~   r<   r   
  s   
%r   c                 C   s"   t | do | jjd up | jjd uS r1  )rD   r%   r'   r8   )rR   r;   r;   r<   modelform_defines_fieldsp  s    

rD  )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   rG   r   rc   ri   r   r   r"   r   r   r    r  r!   r   r  r  r   r   rD  r;   r;   r;   r<   <module>   sv   
)
    YH @
U  .
d
8
,)sf