
    vg%                     "   d Z ddlZ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 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 ddlmZ  G d dej:                        Z G d dej>                        Z  G d dej:                        Z!y)z
horilla_views/forms.py
    N)forms)ContentFile)default_storage)transaction)render_to_string)SafeText)gettext_lazy)_thread_locals)models)BOOLEAN_CHOICESFIELD_WIDGET_MAPMODEL_FORM_FIELD_MAPget_field_class_map
structured)getattributec                   4     e Zd ZdZdef fdZdefdZ xZS )ToggleColumnFormz
    Toggle column form
    hidden_fieldsc                     t        t        di       }|| _        t        |   |i | |D ]7  }d}|d   |v rd}t        j                  |d   |      | j                  |d   <   9 y )NrequestT   Fr   )labelinitial)getattrr
   r   super__init__r   BooleanFieldfields)	selfcolumnsr   argskwargsr   columnr   	__class__s	           '/var/www/horilla/horilla_views/forms.pyr   zToggleColumnForm.__init__    su    .)R8$)&) 	FGayM)%*%7%7Qi&DKKq	"	    returnc                 <    | | j                   d}t        d|      }|S )zA
        Render the form fields as HTML table rows with.
        formr   zgeneric/as_list.html)r   r   )r   context
table_htmls      r%   as_listzToggleColumnForm.as_list-   s%      DLL9%&<gF
r&   )	__name__
__module____qualname____doc__listr   r   r-   __classcell__r$   s   @r%   r   r      s     t  r&   r   c                        e Zd ZdZ ej
                   ej                  dddd            Z G d d	      Zd
 Z	 fdZ
 xZS )SavedFilterFormz
    SavedFilterForm
    oh-input w-100colorzChoose a color)classtypeplaceholderattrs)widgetc                   ,    e Zd Zej                  Zg dZy)SavedFilterForm.Meta)title
is_defaultr8   N)r.   r/   r0   r   SavedFiltermodelr    r&   r%   Metar@   E   s    ""1r&   rF   c                 J    t        t        dd      }| |d}t        d|      }|S )zS
        Render the form fields as HTML table rows with Bootstrap styling.
        r   Nr)   zcommon_form.html)r   r
   r   )r   r   r+   r,   s       r%   r   zSavedFilterForm.structuredI   s4     .)T:
 &&8'B
r&   c                     t        |   |i | | j                  d   j                  j                  }d|d<   d|d<   | j
                  j                  r| j
                  j                  | _        y y )NrA   r7   r9   zSaved filter titler;   )	r   r   r   r>   r=   instancepkrA   verbose_name)r   r!   r"   r=   r$   s       r%   r   zSavedFilterForm.__init__U   sf    $)&)G$++11)g3m== $ 3 3D r&   )r.   r/   r0   r1   r   	CharField	TextInputr8   rF   r   r   r3   r4   s   @r%   r6   r6   6   sO     EOOu)/
E2 2
4 4r&   r6   c                   ~     e Zd ZdZ ed      Zdg g ddej                  j                  dedef fdZ	d	 Z
d
 Z xZS )DynamicBulkUpdateFormz
    DynamicBulkUpdateForm
    zBulk UpdateN)
root_modelbulk_update_fieldsidsrP   rQ   rR   c          	         || _         || _        t        |d       | _        t        | _        t        ||      }t        t        d      | _        t        | (  |i | |j                         D ]X  \  }}t        j                  t        |            }	t        j                  t        |            }
|	sF|
sIt!        |t"        j"                  j$                        rat'        j(                  t*        |	|j,                  j/                         d      | j0                  |<   d| j0                  |   j2                  _        t        |d      st!        |t"        j"                  j6                        r|j8                  rt'        j(                  dg|j8                  D cg c]  }|d	   d
k7  s| c}z   t'        j:                  ddi      |j,                  j/                         d      | j0                  |<   d| j0                  |   j2                  _         |
|	|j,                  j/                         d      | j0                  |<   d| j0                  |   j2                  _        |j<                  j>                  jA                         } |
|	||j,                  d      | j0                  |<   d| j0                  |   j2                  _        [ y c c}w )Nc                 $    | j                  d      S )N__)count)xs    r%   <lambda>z0DynamicBulkUpdateForm.__init__.<locals>.<lambda>p   s    aggdm r&   )keyr   F)choicesr>   r   required)z"horilla_widgets/select_option.htmlrelated_model) z--------r   r]   r9   zoh-select oh-select-2 w-100r<   )r>   r   r[   )r>   querysetr   r[   )!rR   rP   sortedrQ   r   r   r   r
   r   r   r   itemsr   getr:   r   
isinstancer   r   r   ChoiceFieldr   rK   
capitalizer   r>   option_template_namerL   rZ   Selectr\   objectsall)r   rP   rQ   rR   r!   r"   mappingsrY   valr>   fieldchoicer^   r$   s                r%   r   zDynamicBulkUpdateForm.__init__e   se    $"($;#
 %&z3EF#NI>$)&) ( 0	HC%))$s)4F(,,T#Y7E%c6==#=#=>','8'8 /%!..99;!&	(DKK$DDKK$++@ %c?;!#v}}'>'>?CKK+0+<+<%5$647KKS&6!9PR?vS%T#(<<'.0M&N$ #&"2"2"="="?%*,C(HC(//D !',%!..99;!&(DKK$
DDKK$++@ ,,4488:#(!%**"	$C @C ''<]0	& Ts   K&Kc                 
   d}	 t        j                         5  | j                          t        d      # 1 sw Y   |S xY w# t        $ r8}dt	        |      vr d}| j                  d dt	        |              Y d }~|S d }~ww xY w)NT	no_errorsFzForm not valid: )r   atomicsave	Exceptionstr	add_error)r   valides      r%   is_validzDynamicBulkUpdateForm.is_valid   s    
	B##% -		,,	-   	B#a&(t'7Ax%@A	Bs)   A 4>A A 	B
-A==Bc           	         t        | j                  | j                        }i }i }i }i }i }| j                  }	|j                         D ]  \  }
}t	        j
                  t        |            }|s(|j                  |j                        si ||j                  <   |j                  |j                        si ||j                  <   |j                  |j                        si ||j                  <   |j                  |j                        s|j                  | j                  k(  rd||j                  <   nb|
j                  d      d   }t        |	|      }|j                  j                  j                  dz   ||	   z   ||j                  <   |j                  }	| j                  j                  |
      }| j                  j                  |
      }|r|d   s|s|
j                  d      d   }
t        |j                  |
      j                  }t!        |t"        j"                  j$                        r|||j                     |
<   |rt!        |t"        j"                  j&                  t"        j"                  j(                  f      r`t*        j,                  j/                  |j0                  |d   j                        }|||j                     |
<   |d   ||j                     |<   |d   ||j                     |
<    |j                         D ]  \  }} |j2                  j4                  di ||   | j6                  i} |j8                  di | |||<   ||   }|sP|j                         D ]a  \  }}t;        ||      j                  j<                  j2                  j5                  |      }|D ]  }t;        ||      j?                  |        c  |j                         D ]  \  }}|s	|j                         D ]f  \  }}t*        j,                  j/                  |j0                  |j                        }tA        jB                  |tE        |jG                                      h  y)	z"
        Bulk save method
        id__inrU   r   )rx   NrE   )$r   rP   rQ   r`   r   ra   r:   rD   splitr   relatedrk   namefilesgetlistdatarb   r   ManyToManyField	FileField
ImageFieldospathjoin	upload_torg   filterrR   updater   r\   setr   rp   r   read)r   r!   r"   ri   	data_mappdata_m2m_mapprelation_mappmap_querysetfiels_mappingparent_modelrY   rj   rk   related_keyr~   valuemodel_field	file_pathrD   r   r^   m2m_datarR   related_objectsrI   files                             r%   rp   zDynamicBulkUpdateForm.save   s    't8O8OP	 ( *	5HC(,,T#Y7E$((3/1M#)),$((3/1M#)), }}SYY/+-Icii((,,SYY79977?M#))4*-))D/"*=K$0{$KE % 3 3 8 8"&!'"/"=!> *#))4
 ,/99L

**3/		))#.U1Xuiiob)*399c:@@k6==+H+HI49M#)),S1Z//00 !#[-B-BE!HMM RI09Icii(-<A!HM#)),[9,1!H	#))$S)U*	5X %??, 	FKE4+u}}++O}U/CTXX.NOH HOO#d#"*L$U+H"*.."2 FJE3&-u'eMM''&&&2D $ %- F%044_EF	F	F *//1 	NLE5#(;;= NKE4 "U__dii HI#((K		4LMN	Nr&   )r.   r/   r0   r1   _transrK   r   Modelr2   r   rv   rp   r3   r4   s   @r%   rO   rO   ^   s]     -(L
 +/#%B MM''B !	B
 BHJNr&   rO   )"r1   r   djangor   django.core.files.baser   django.core.files.storager   	django.dbr   django.template.loaderr   django.utils.safestringr   django.utils.translationr	   r   horilla.horilla_middlewaresr
   horilla_viewsr   horilla_views.cbv_methodsr   r   r   r   r   3horilla_views.templatetags.generic_template_filtersr   Formr   	ModelFormr6   rO   rE   r&   r%   <module>r      so    
  . 5 ! 3 , ; 6    Muzz 6%4eoo %4PdNEJJ dNr&   