o
    hH                     @   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 r;||  k r;d| || jjjjf }| j| }|dkr&|  |d< n| jjj}| |}||}| 	||d< ||  k rMd|vrM| 
 | |d< ||  krm| jrmz| j||    |d< W n	 tyl   Y nw tt| j|fi |S )N%s-%s instanceinitial)is_boundinitial_form_count
add_prefixmodel_metapknamedata_get_to_python_existing_objectget_querysetinitial_extra
IndexErrorsuperr   _construct_form)selfikwargspk_keyr   pk_field	to_python	__class__ R/var/www/html/ndineBlogger/venv/lib/python3.10/site-packages/modelcluster/forms.pyr"      s$   


z)BaseTransientModelFormSet._construct_formTc                 C   s   g | _ g | _| jsg S g }| j}| jD ]=}|j}||v r0|jd u r"q| j| | j||d q| rP| j ||j	f || j
|||d |sP| j| q|S )Ncommit)changed_objectsdeleted_objectsinitial_formsdeleted_formsr   r   appenddelete_existinghas_changedchanged_datasave_existing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   rD   r%   r+   r+   r,   transientmodelformset_factoryH   s   rE   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 r-t| j| j	 }t
 j||fd|i| d S )N)related_namequeryset)fkremote_fieldr   r   r   rG   get_accessor_namerel_namegetattrallr!   __init__)r#   r   filesr   rH   r%   r)   r+   r,   rO   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|| q"dd | D }|r>|j|  |j|  |j| j  |   |rS|  |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!   saverM   r   rL   	can_orderhasattrr   	enumerateordered_formssetattrrN   removeaddr0   save_m2mr.   )r#   r.   r9   managerrQ   r$   r;   no_id_instancesr)   r+   r,   rV   \   s   

zBaseChildFormSet.savec                    s   |    t j|i |S rR   )validate_uniquer!   clean)r#   argsr%   r)   r+   r,   rb   }   s   zBaseChildFormSet.cleanc                    s  t  }t  }jfddjD }|D ]  jjdd\}}|| || qg }|D ]O\}}t  }	|D ]E  fdd|D }
tdd |
D }
|
r}d|
vr}|
|	v rx|| 	
 g jt< |D ]}| jv rw j|= ql|	|
 q8q/|rt|dS )	z:This clean method will check for unique_together conditionc                    s    g | ]}|  r| vr|qS r+   is_valid)rS   r;   )r:   r+   r,   rT      s     z4BaseChildFormSet.validate_unique.<locals>.<listcomp>T)include_meta_constraintsc                 3   s2    | ]}| j v r|jv r|n j | V  qd S rR   )cleaned_dataunique_fields)rS   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)rX   rk   )rS   dr+   r+   r,   rj      s    N)setr2   formsr   _get_unique_checksupdatetupler3   get_unique_error_messageerror_classget_form_error_errorsr   rg   r]   r   )r#   all_unique_checksall_date_checksvalid_formsunique_checksdate_checkserrorsuclassunique_check	seen_datarow_datari   r+   )r;   r:   r#   r,   ra      sD   



z BaseChildFormSet.validate_uniqueNNNNr>   )	r?   r@   rA   inherit_kwargsrO   rV   rb   ra   rC   r+   r+   r)   r,   rF   L   s    !rF   N   FTc                 C   s   t | ||d}|jrd}
d}|d u rg }||jg7 }t|trF|d us'|d urFt|dr0|jfnd}td|||d}t|d|fd|i}|||||	|pQt|d|||
||||d	}t|fi |}||_	||_
|S )
N)fk_name   TMetar+   )formsetsexclude_formsets_ClusterFormrQ   )r;   formfield_callbackrD   extra
can_deleterW   fieldsexcludemax_numvalidate_maxwidgetsmin_numvalidate_min)r	   uniquer   
issubclassClusterFormrX   r   typerE   rI   r   )parent_modelr   r;   rD   r   r   r   r   rW   r   r   r   r   r   r   r   r   r   r   rI   basesr   r%   FormSetr+   r+   r,   childformset_factory   s@   r   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)optionsr   r   )r!   rO   rM   r   r   )r#   r   r)   r+   r,   rO      s   zClusterFormOptions.__init__rR   )r?   r@   rA   rO   rC   r+   r+   r)   r,   r      s    r   c                       s,   e Zd ZdZedd Z fddZ  ZS )ClusterFormMetaclassr   c                 C   s   t S rR   )r   )clsr+   r+   r,   
child_form   s   zClusterFormMetaclass.child_formc              	      sj  z	dd |D }W n t y   d }Y nw |d}t | |||}|s'|S tt|dd  }|_|jri }t|jD ]s}	|		 }
|j
d urM|
|j
v rMq<|jd urX|
|jvrXq<|jd u rc|j
d u rcq<z|j|
}W n tyv   d }Y nw | j|  ||	jj||
d}z||j|
 W n	 ty   Y nw |d}t|j|	jjfi |}|||< q<||_|S )Nc                 S   s   g | ]	}t |tr|qS r+   )r   r   )rS   br+   r+   r,   rT      rU   z0ClusterFormMetaclass.__new__.<locals>.<listcomp>r   r   )r   r;   r   r   r   formset_namer   )	NameErrorgetr!   __new__r   rM   r   r   r   rK   r   r   r   AttributeErrorextra_form_countr   ri   r   rp   popr   )r   r   r   attrsparentsr   	new_classoptsr   relrL   r   r%   r   rD   r)   r+   r,   r      sT   


zClusterFormMetaclass.__new__)r?   r@   rA   r   classmethodr   r   rC   r+   r+   r)   r,   r      s
    
r   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 )r   Nc                    s   t  j||f||d| i | _| jj D ].\}}|r$d||f }n|}i }	|jr9|jD ]
}
t| |
d |	|
< q.||||||	d| j|< qd S )N)r   prefixr   )r   r   form_kwargs)r!   rO   r   r*   itemsr   rM   )r#   r   rP   r   r   r%   rL   formset_classformset_prefixchild_form_kwargs
kwarg_namer)   r+   r,   rO   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rS   rD   r+   r+   r,   rT   V  s    z$ClusterForm.as_p.<locals>.<listcomp>)r!   r   r   r   values)r#   	form_as_pr)   r+   r,   r   T  s   
 zClusterForm.as_pc                    s*   t   }tdd | j D }|o|S )Nc                 s       | ]}|  V  qd S rR   rd   r   r+   r+   r,   rj   Z      z'ClusterForm.is_valid.<locals>.<genexpr>)r!   re   rN   r   r   )r#   form_is_validformsets_are_validr)   r+   r,   re   X  s   
zClusterForm.is_validc                    s"   t   ptdd | j D S )Nc                 s   r   rR   )is_multipartr   r+   r+   r,   rj   `  r   z+ClusterForm.is_multipart.<locals>.<genexpr>)r!   r   anyr   r   )r#   r)   r+   r,   r   ]  s   
zClusterForm.is_multipartc                    s&   t  j}| j D ]}||j }q	|S rR   )r!   mediar   r   )r#   r   rD   r)   r+   r,   r   c  s   zClusterForm.mediaTc                    s   d}| j j}| j j}| jj  D ]}|r|j|vrq|r"|j|v r"qt|ddr,d} nqt j|o4| d}|rC| 	  |rC|  | j
 D ]}||_|j|d qH|S )NF_need_commit_after_assignmentTr-   )r   r   r   r   
get_fieldsr   rM   r!   rV   r^   r   r   )r#   r.   save_m2m_nowr   r   fr   rD   r)   r+   r,   rV   j  s*   zClusterForm.savec                 C   s<   | j r| j  D ]}|jD ]
}| r  dS qqt| jS )z)Return True if data differs from initial.T)r   r   rn   r5   boolr6   )r#   rD   r;   r+   r+   r,   r5     s   

zClusterForm.has_changedr   r>   )r?   r@   rA   rO   r   re   r   propertyr   rV   r5   rC   r+   r+   r)   r,   r   @  s    ,r   )	metaclassc           	      K   sl   |}| |d< t |dr|jfnd}td||}|d}|r#t||_| jd }||d}t|||f|S )Nr   r   r+   r   Form)r   r   )rX   r   r   r   staticmethodr   r?   )	r   r;   r%   meta_class_attrsr   r   r   
class_nameform_class_attrsr+   r+   r,   clusterform_factory  s   



r   )
__future__r   django.formsr   django.core.exceptionsr   django.forms.formsetsr   django.forms.modelsr   r   r   r	   r
   r   django.db.models.fields.relatedr   django.utils.htmlr   modelcluster.modelsr   r   rE   rF   r   r   r   r   r   r+   r+   r+   r,   <module>   s*     7c

=Nc