a
    CgH                     @   s  d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	m
Z
mZmZmZmZ d dlmZ d dlmZ d dlmZ G d	d
 d
e	ZefddZG dd deZe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G dd deZG dd deedZefddZdS )    )unicode_literals)ValidationError)NON_FIELD_ERRORS)TOTAL_FORM_COUNT)BaseModelFormSetmodelformset_factory	ModelForm_get_foreign_keyModelFormMetaclassModelFormOptions)ForeignObjectRel)format_html_join)get_all_child_relationsc                       s*   e Zd ZdZ fddZdddZ  ZS )BaseTransientModelFormSetzX A ModelFormSet that doesn't assume that all its initial data instances exist in the db c                    s   | j rv||  k rvd| || jjjjf }| j| }|dkrL|  |d< n*| jjj}| |}||}| 	||d< ||  k rd|vr| 
 | |d< ||  kr| jrz| j||    |d< W n ty   Y n0 tt| j|fi |S )N%s-%s instanceinitial)Zis_boundZinitial_form_countZ
add_prefixmodel_metapknamedataZ_get_to_pythonZ_existing_objectZget_querysetZinitial_extra
IndexErrorsuperr   _construct_form)selfikwargsZpk_keyr   Zpk_fieldZ	to_python	__class__ Q/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/modelcluster/forms.pyr      s"    


z)BaseTransientModelFormSet._construct_formTc                 C   s   g | _ g | _| jsg S g }| j}| jD ]z}|j}||v r`|jd u rDq&| j| | j||d q&| r&| j ||j	f || j
|||d |s&| j| q&|S )Ncommit)Zchanged_objectsdeleted_objectsZinitial_formsdeleted_formsr   r   appendZdelete_existinghas_changedchanged_dataZsave_existingZsaved_forms)r   r$   saved_instancesforms_to_deleteformobjr!   r!   r"   save_existing_objects,   s&    

z/BaseTransientModelFormSet.save_existing_objects)T)__name__
__module____qualname____doc__r   r.   __classcell__r!   r!   r   r"   r      s   r   c                 K   s   t | fd|i|S )Nformset)r   )r   r4   r   r!   r!   r"   transientmodelformset_factoryH   s    r5   c                       sD   e Zd ZdZd fdd	Zd fdd	Z fddZd	d
 Z  ZS )BaseChildFormSetNc                    sx   |d u r| j j | _n|| _t| j | j jj| j jjd | _|d u rZt| j| j	 }t
 j||fd|i| d S )N)related_namequeryset)fkZremote_fieldr   r   r   r7   get_accessor_namerel_namegetattrallr   __init__)r   r   filesr   r8   r   r   r!   r"   r>   O   s    "zBaseChildFormSet.__init__Tc                    s   t  jdd}t| j| j}| jr\t| jdr\t| jd}t| j	D ]\}}t
|j|| qDdd | D }|r||j|  |j|  |j| j  |   |r|  |S )NFr#   sort_order_fieldc                 S   s   g | ]}|j d u r|qS N)r   ).0r-   r!   r!   r"   
<listcomp>p       z)BaseChildFormSet.save.<locals>.<listcomp>)r   saver<   r   r;   	can_orderhasattrr   	enumerateZordered_formssetattrr=   removeaddr%   save_m2mr$   )r   r$   r*   managerr@   r   r,   Zno_id_instancesr   r!   r"   rE   \   s    

zBaseChildFormSet.savec                    s   |    t j|i |S rA   )validate_uniquer   clean)r   argsr   r   r!   r"   rO   }   s    zBaseChildFormSet.cleanc                    s  t  }t  }jfddjD }|D ]*  jjdd\}}|| || q*g }|D ]\}}t  }	|D ]  fdd|D }
tdd |
D }
|
rpd|
vrp|
|	v r|| 	
 g jt< |D ]}| jv r؈ j|= q|	|
 qpq^|rt|dS )	z:This clean method will check for unique_together conditionc                    s    g | ]}|  r| vr|qS r!   is_valid)rB   r,   )r+   r!   r"   rC      rD   z4BaseChildFormSet.validate_unique.<locals>.<listcomp>T)Zinclude_meta_constraintsc                 3   s0   | ](}| j v r|jv r|n j | V  qd S rA   )cleaned_dataZunique_fields)rB   field)r,   r   r!   r"   	<genexpr>   s   z3BaseChildFormSet.validate_unique.<locals>.<genexpr>c                 s   s$   | ]}t |d r| n|V  qdS )_get_pk_valN)rG   rV   )rB   dr!   r!   r"   rU      s   N)setr&   formsr   Z_get_unique_checksupdatetupler'   Zget_unique_error_messageZerror_classZget_form_error_errorsr   rS   rK   r   )r   Zall_unique_checksZall_date_checksZvalid_formsZunique_checksZdate_checkserrorsZuclassZunique_checkZ	seen_dataZrow_datarT   r!   )r,   r+   r   r"   rN      s<    



z BaseChildFormSet.validate_unique)NNNN)T)	r/   r0   r1   inherit_kwargsr>   rE   rO   rN   r3   r!   r!   r   r"   r6   L   s
   !r6   N   FTc                 C   s   t | ||d}|jrd}
d}|d u r(g }||jg7 }t|tr|d usN|d urt|dr`|jfnd}td|||d}t|d|fd|i}|||||	|pt|d|||
||||d	}t|fi |}||_	||_
|S )
N)fk_name   TMetar!   )formsetsexclude_formsetsZ_ClusterFormr@   )r,   formfield_callbackr4   extra
can_deleterF   fieldsexcludemax_numvalidate_maxwidgetsmin_numvalidate_min)r	   uniquer   
issubclassClusterFormrG   rb   typer5   r9   r^   )Zparent_modelr   r,   r4   r`   rh   ri   rf   rF   rg   rj   rk   re   rl   rm   rn   r^   rc   rd   r9   basesrb   r   ZFormSetr!   r!   r"   childformset_factory   s@    rt   c                       s   e Zd Zd fdd	Z  ZS )ClusterFormOptionsNc                    s.   t  j|d t|dd | _t|dd | _d S )N)optionsrc   rd   )r   r>   r<   rc   rd   )r   rv   r   r!   r"   r>      s    zClusterFormOptions.__init__)N)r/   r0   r1   r>   r3   r!   r!   r   r"   ru      s   ru   c                       s,   e Zd ZdZedd Z fddZ  ZS )ClusterFormMetaclassr_   c                 C   s   t S rA   )rq   )clsr!   r!   r"   
child_form   s    zClusterFormMetaclass.child_formc              	      sr  zdd |D }W n t y(   d }Y n0 |d}t | |||}|sN|S tt|dd  }|_|jrni }t|jD ]}	|		 }
|j
d ur|
|j
v rqzn.|jd ur|
|jvrqzn|jd u r|j
d u rqzz|j|
}W n ty   d }Y n0 | j|  ||	jj||
d}z||j|
 W n ty:   Y n0 |d}t|j|	jjfi |}|||< qz||_|S )Nc                 S   s   g | ]}t |tr|qS r!   )rp   rq   )rB   br!   r!   r"   rC      rD   z0ClusterFormMetaclass.__new__.<locals>.<listcomp>re   rb   )rf   r,   re   r`   rl   formset_namer{   )	NameErrorgetr   __new__ru   r<   r   r   r   r:   rd   rc   rl   AttributeErrorextra_form_country   rT   r   rZ   poprt   )rx   r   rs   attrsparentsre   	new_classoptsrc   relr;   rl   r   r{   r4   r   r!   r"   r~      sN    




zClusterFormMetaclass.__new__)r/   r0   r1   r   classmethodry   r~   r3   r!   r!   r   r"   rw      s   
rw   c                       sh   e Zd Zd fdd	Z fddZ fddZ fdd	Ze fd
dZd fdd	Z	dd Z
  ZS )rq   Nc                    s   t  j||f||d| i | _| jj D ]\\}}|rHd||f }n|}i }	|jrr|jD ]}
t| |
d |	|
< q\||||||	d| j|< q.d S )N)r   prefixr   )r   r   Zform_kwargs)r   r>   rc   r    itemsr^   r<   )r   r   r?   r   r   r   r;   Zformset_classZformset_prefixZchild_form_kwargsZ
kwarg_namer   r!   r"   r>   A  s    

zClusterForm.__init__c                    s*   t   }|tdddd | j D  S )Nr   z{}c                 S   s   g | ]}|  fqS r!   )as_prB   r4   r!   r!   r"   rC   V  rD   z$ClusterForm.as_p.<locals>.<listcomp>)r   r   r   rc   values)r   Z	form_as_pr   r!   r"   r   T  s    
zClusterForm.as_pc                    s*   t   }tdd | j D }|o(|S )Nc                 s   s   | ]}|  V  qd S rA   rQ   r   r!   r!   r"   rU   Z  rD   z'ClusterForm.is_valid.<locals>.<genexpr>)r   rR   r=   rc   r   )r   Zform_is_validZformsets_are_validr   r!   r"   rR   X  s    
zClusterForm.is_validc                    s"   t   p tdd | j D S )Nc                 s   s   | ]}|  V  qd S rA   )is_multipartr   r!   r!   r"   rU   `  rD   z+ClusterForm.is_multipart.<locals>.<genexpr>)r   r   anyrc   r   )r   r   r!   r"   r   ]  s    
zClusterForm.is_multipartc                    s&   t  j}| j D ]}||j }q|S rA   )r   mediarc   r   )r   r   r4   r   r!   r"   r   c  s    zClusterForm.mediaTc                    s   d}| j j}| j j}| jj  D ]8}|r4|j|vr4q |rD|j|v rDq t|ddr d} qZq t j|oh| d}|r| 	  |r|  | j
 D ]}||_|j|d q|S )NFZ_need_commit_after_assignmentTr#   )r   ri   rh   r   Z
get_fieldsr   r<   r   rE   rL   rc   r   )r   r$   Zsave_m2m_nowri   rh   fr   r4   r   r!   r"   rE   j  s(    zClusterForm.savec                 C   s<   | j r2| j  D ] }|jD ]}| r  dS qqt| jS )z)Return True if data differs from initial.T)rc   r   rY   r(   boolr)   )r   r4   r,   r!   r!   r"   r(     s    
zClusterForm.has_changed)NNNN)T)r/   r0   r1   r>   r   rR   r   propertyr   rE   r(   r3   r!   r!   r   r"   rq   @  s   ,rq   )	metaclassc           	      K   sl   |}| |d< t |dr|jfnd}td||}|d}|rFt||_| jd }||d}t|||f|S )Nr   rb   r!   re   ZForm)rb   re   )rG   rb   rr   r}   staticmethodre   r/   )	r   r,   r   Zmeta_class_attrsrs   rb   re   
class_nameZform_class_attrsr!   r!   r"   clusterform_factory  s    



r   )
__future__r   Zdjango.formsr   Zdjango.core.exceptionsr   Zdjango.forms.formsetsr   Zdjango.forms.modelsr   r   r   r	   r
   r   Zdjango.db.models.fields.relatedr   Zdjango.utils.htmlr   Zmodelcluster.modelsr   r   r5   r6   rt   ru   rw   rq   r   r!   r!   r!   r"   <module>   s(    7c

=Nc