
    vgQ                        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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" d dl#m$Z$ d dl%m&Z&m'Z'  ee!d       G d de             Z( ee!d       G d de             Z) ee!d       G d de             Z* ee!d       G d de             Z+ ee!d       G d de&             Z, ee!d       G d d e             Z- ee!d       G d! d"e             Z. ee!d       eed       G d# d$e                    Z/ ee!d       G d% d&e             Z0 G d' d(e'      Z1 G d) d*e      Z2y)+    N)defaultdict)forms)apps)messages)NestedObjects)cache)router)HttpResponseJsonResponse)render)method_decorator)View)csrf_protect)eval_validate)models)get_short_uuidlogin_requiredmerge_dicts)SavedFilterForm)HorillaFormViewHorillaListViewdispatchnamec                       e Zd ZdZd Zy)ToggleColumnz
    ToggleColumn
    c                    | j                   j                  }|d   }t        |      }|d= |j                         D cg c]  \  }}|d   s| }}}t        j
                  j                  j                  | j                   j                  |      j                         }|st	        j
                         n|}	||	_
        ||	_        |	j                          t        d      S c c}}w )z*
        method to toggle columns
        pathr   )user_idr   success)requestGETdictitemsr   r   objectsfilteruserfirstr   excluded_columnssaver
   )
selfargskwargs
query_dictr   keyvaluehidden_fieldsexisting_instanceinstances
             '/var/www/horilla/horilla_views/views.pygetzToggleColumn.get   s    
 \\%%
&!*%
v/9/?/?/ANeU1XNN"//77>>LL%%D ? 

%' 	 1B6&&(GX$1!I&& Os   C C N__name__
__module____qualname____doc__r5        r4   r   r      s    'r<   r   c                       e Zd ZdZd Zy)ReloadFieldz
    ReloadField
    c                    |j                   d   }|j                   d   }|j                  dd      \  }}t        j                  |      } t	        ||             }	t        j                  |j                  j                  dz   |z         }
t        j                  |j                  j                  dz   |z   dz         }|sd}|
d   }|
j                  d	d      }|
d   }||k7  r|}|	j                  |   }|j                  j                         }|j                  }|D cg c]  }|j                  |f }}|j                  d
d       |j                  d       t         j"                  }t%        |t         j&                        rBt         j(                  }|j                   j                  dg       }t+        d|
d	    d| d      }nU|sS| j,                  j                   j                  d      r.t+        | j,                  j                   j                  d            } |||j.                  |j0                        |	j                  |<   d|	j                  |   j2                  _        |j2                  j6                  |	j                  |   j2                  _        ||	j                  |   _        ||	j                  |   j2                  j6                  d<   |	|   }t;        d      }t=        |d||d      S c c}w )z=
        Http method to reload dynamic create fields
        form_class_pathdynamic_field.   cbvonchange modelr0   r   )rF   zSelect option)dynamic_createzDynamic createdynamic_initial[,])choiceslabelrequired)z"horilla_widgets/select_option.html   z generic/reload_select_field.html)field
dynamic_id)r"   rsplit	importlibimport_modulegetattrCACHEr5   sessionsession_keyfieldsr%   allquerysetidinsertappendr   ChoiceField
isinstanceModelMultipleChoiceFieldMultipleChoiceFieldr   r!   rN   rO   widgetoption_template_nameattrsinitialr   r   )r+   r!   r,   r-   
class_pathreload_fieldmodule_name
class_namemoduleparent_formdynamic_cacherE   rG   r0   cache_fieldrQ   r\   r3   rM   
form_fieldrI   rR   s                         r4   r5   zReloadField.get>   s    [[!23
{{?3","3"3C";Z((51gfj13		'//"="="E"TU99OO''%/,>K
 H%27%;!!'2.#O4,&&K"";/==$$&>>;CDxHKK*DDq/0;<&&
eU;;<22J%kkoo.?DO!ag(>'?q@QQR"UVET\\--112CD%dll&6&6&:&:;L&MN*4++^^+
;'
G
;'..C 8=||7I7I;'..427;'/CK;'..44Z@K((+
.:6
 	
7 Es   K,Nr6   r;   r<   r4   r>   r>   8   s    ;
r<   r>   c                       e Zd Zd Zy)	ActiveTabc                    | j                   j                  j                  d      }| j                   j                  j                  d      }|r|r| j                   j                  rt        j
                  j                  j                  | j                   j                  |      j                         }|st	        j
                         n|}||_	        ||_
        |j                          t        ddi      S )z1
        CBV method to handle active tab
        r   target)
created_byr   messageSuccess)r!   r"   r5   r'   r   rr   r%   r&   r(   r   
tab_targetr*   r   )r+   r,   r-   r   rt   r2   r3   s          r4   r5   zActiveTab.get~   s     ||##F+!!%%h/Ft||00 & 0 0 8 8 ? ?<<,,4 !@ !eg 
 +<  "AR  !HM"(HMMOY	233r<   Nr7   r8   r9   r5   r;   r<   r4   rr   rr   |   s    4r<   rr   c                       e Zd Zd Zy)ActiveGroupc                 H   | j                   j                  j                  d      }| j                   j                  j                  d      }| j                   j                  j                  d      }|r|r|r| j                   j                  rt        j
                  j                  j                  | j                   j                  ||      j                         }|st	        j
                         n|}||_	        ||_
        ||_        |j                          t        ddi      S )z
        ActiveGroup
        r   rt   rQ   )ru   r   group_by_fieldrv   rw   )r!   r"   r5   r'   r   r{   r%   r&   r(   r   r}   group_targetr*   r   )r+   r,   r-   r   rt   group_fieldr2   r3   s           r4   r5   zActiveGroup.get   s     ||##F+!!%%h/ll&&**73F{t||/@/@ & 2 2 : : A A<<,,* !B ! eg	  ->""$CT  !HM&1H#$*H!MMOY	233r<   Nry   r;   r<   r4   r{   r{      s    4r<   r{   c                   d     e Zd ZdZej
                  ZeZdZ	dZ
dZdedef fdZdef fdZ xZS )	SavedFilterz
    SavedFilter
    zSave Applied Filterzgeneric/saved_filter_form.htmlBlahformreturnc                    | j                   j                  j                  dd      }| j                   j                  j                  dd      }| j                   j                  j	                         D ci c]  \  }}||d    }}}|j                         r|j                  d      }|j                  s>||_        ||_	        ||_
        | j                   j                  j                         |_        |j                          t        j                  | j                   d       | j                         S t        | A  |      S c c}}w )	NreferrerrF   r   /r   F)commitzFilter Saved)r!   POSTr5   r"   listsis_validr*   pkr   r   r&   	urlencoder   r    r
   super
form_valid)	r+   r   r   r   r/   r0   result_dictr3   	__class__s	           r4   r   zSavedFilter.form_valid   s    <<$$((R8||  $$VS17;||7G7G7M7M7OPesE!H}PP==?+/99E9+BH;; $$,!"-%)\\%5%5%?%?%A"MMOT\\>:$$&&w!$'' Qs   5Ec                    t        |   di |}| j                  j                  j	                  dd      }|r&ddj                  |j                  d      dd        z   }| j                  j                  j	                  dd      |d<   ||d<   |S )Nr   rF   r      r   r;   )r   get_context_datar!   r"   r5   joinsplit)r+   r-   contextr   r   s       r4   r   zSavedFilter.get_context_data   s    '*4V4<<##''
B7SXXhnnS&9!"&=>>H,,**..vr:&
r<   )r7   r8   r9   r:   r   r   rG   r   
form_classnew_display_titletemplate_nameform_disaply_attrr
   r   r#   r   __classcell__)r   s   @r4   r   r      sO     E J-4M( (< ( D  r<   r   c                       e Zd ZdZd Zy)DeleteSavedFilterz
    Delete saved filter
    c                     |d   }t         j                  j                  j                  | j                  j
                  |      j                          t        d      S )Nr   )ru   r   rF   )r   r   r%   r&   r!   r'   deleter
   )r+   r,   r-   r   s       r4   r5   zDeleteSavedFilter.get   sH    D\""))T\\5F5F2)NUUWBr<   Nr6   r;   r<   r4   r   r      s     r<   r   c                       e Zd ZdZd Zy)
ActiveViewz
    ActiveView CBV
    c                    | j                   j                  d   }| j                   j                  d   }t        j                  j                  j                  || j                   j                        j                         }|r|nt        j                         }||_        ||_	        |j                          t        d      S )Nr   view)r   ru   rF   )r!   r"   r   r   r%   r&   r'   r(   r   typer*   r
   )r+   r,   r-   r   	view_typeactive_views         r4   r5   zActiveView.get   s    ||'LL$$V,	''//66$,,"3"3 7 

%' 	 &1kf6G6G6I$Br<   Nr6   r;   r<   r4   r   r      s     r<   r   c                       e Zd ZdZd Zy)SearchInIdsz
    Search in ids view
    c                     | j                   j                  j                   d}t        j                  |      } |d   | j                   j
                        j                  |d<   t        | j                   d|      S )z/
        Search in instance ids method
        search_in_instance_idsfilter_class	instanceszgeneric/filter_result.html)r!   rX   rY   rW   r5   r"   qsr   )r+   r,   r-   	cache_keyr   s        r4   r5   zSearchInIds.get   sj     ||++7788NO			),6w~6t||7G7GHKKdll$@'JJr<   Nr6   r;   r<   r4   r   r      s    Kr<   r   c                       e Zd ZdZd Zy)LastAppliedFilterz2
    Class view to handle last applied filter
    c                    | j                   j                  j                  d      }|rPt        j                  | j                   j
                  j                  dz   |z   | j                   j                  d       t        d      S )z
        Get method
        nav_urlzlast-applied-filteriX  )timeoutr    )r!   r"   r5   rW   setrX   rY   r
   )r+   r,   r-   nav_paths       r4   r5   zLastAppliedFilter.get
  sm    
 <<##''
 II$$003HH8S  
 I&&r<   Nr6   r;   r<   r4   r   r     s    'r<   r   c                       e Zd ZdZg Zd Zy)DynamiListViewz,
    DynamicListView for Generic Delete
    c                     | j                   j                  j                  dd      fd}t        || j                        S )NsearchrF   c                 :    t        |       j                         v S Nstrlowerr3   r   s    r4   _search_filterz3DynamiListView.get_queryset.<locals>._search_filter%  s    S]00222r<   )r!   r"   r5   r&   r   )r+   r   r   s     @r4   get_querysetzDynamiListView.get_queryset"  s7    !!%%h3	3 ndnn55r<   N)r7   r8   r9   r:   r   r   r;   r<   r4   r   r     s     I6r<   r   c                   ,    e Zd ZdZdZd Zd ZdefdZy)HorillaDeleteConfirmationViewz*
    Generic Delete Confirmation View
    deleteConfirmationBodyc                    ddl mm | j                  j                  d   }| j                  j                  d   j                  d      \  }| j                  j                  j                  |dz   j                         z         st        | j                  d      S t        j                  |      }|j                  j                  |      g}t        j                  j                   j"                        }t%        ||	      }|j'                  |       i i i i i df	d
	}	|j)                  |	      }
|j*                  D cg c]  } |	|d       }}|j,                  j/                         D ci c]%  \  }}|j                   j0                  t3        |      ' }}}t5        t6              }|j*                  D ].  }t9        |      }||j                   j0                  xx   dz  cc<   0 t;        |      }t        | j                  dt=              |t?        |jA                               ||d| jC                         z        S c c}w c c}}w )z
        GET method
        r   )r   urlpatternsr   rG   rB   .delete_no_perm.htmlr   usingoriginc                   	  
j                   j                  j                        s2g 
 j                  j                  <   g  j                  j                  <   
 fd} |         j                  j                  t	        j
                        j                   j                  j                  }|j                  j                  d      d   |_        |rn}|vri |<   ||   vrg |   |<   t        dd       |j                  <    G fddt              }|j                  |_        ||_        d|j                  v r	j                         g|_        n
j                  |g       |_        |   |   |_        |j                     |_        |j                   |j                  z   |_        j#                   |j                  |j%                         |j                  	             |   |   j#                           S )
Nc                    | j                   j                         D ]  }t        |t        j                  j                  t        j                  j
                  f      sBt        | |j                        }||k(  s^d|j                  j                  j                  v r>j                   j                     j                  |j                  |j                  f       j                   j                     j                  |j                          y )NPROTECT)_meta
get_fieldsra   r   
ForeignKeyOneToOneFieldrV   r   remote_field	on_deleter7   rG   r_   verbose_name)objrelated_instancerQ   field_valueMODEL_RELATED_FIELD_MAP!MODEL_RELATED_PROTECTED_FIELD_MAPr3   s       r4   find_related_fieldzVHorillaDeleteConfirmationView.get.<locals>.format_callback.<locals>.find_related_fieldO  s     YY113 E! 8 8&--:U:UV '.c5::&>&*::(E,>,>,H,H,Q,QQ A$,NN$8$8!""(&%**e6H6H)I"J3HNN4H4HIPP %

r<   _r   zgeneric-delete
   )prefixlengthc                   `     e Zd ZdZg ZdgZdZdW z   ZfdZ fdZ	 fdZ
fdZ xZS )	RHorillaDeleteConfirmationView.get.<locals>.format_callback.<locals>.DynamiListViewzL
                    DynamicListView for Generic Delete
                    )Record#dynamic_display_name_generic_delete   	storedIdsc                 l   d}| j                   j                  }| j                  j                  }t	        j
                  |      j                  }j                  |i       j                  | j                  j                  g       }|D cg c]  }|j                   }}| j                  |v rd}d|v r|j                  dd      d   }|j                  d      d   }|j                         }	t	        j                  ||      }
|
j                  j                  |      }dt        | |	       d|j                   dS d	|  d	}|rit        t!        j                  | j                  j                  d
                  D cg c]  }t#        |d          }}|ddj%                  |       dz   }|S c c}w c c}w )NFTr   rC   r   z
                            z;
                            <i style="color:#989898;">(In z")</i>
                            z
                        rF   z>
                            <i style="color:red;">(Record in rK   )r   r7   r   	app_labelr   get_app_configr   r5   rG   r   r   r   	get_model	get_fieldrV   listr   r   r   )r+   is_protected	classnamer   app_verbose_name	protectedr3   ids
field_nameobject_field_namerG   rQ   
indicationiverbose_namesr   PROTECTED_MODEL_MAPs                  r4   r   zvHorillaDeleteConfirmationView.get.<locals>.format_callback.<locals>.DynamiListView.dynamic_display_name_generic_delete  s   ',$(NN$;$;	$(JJ$8$8	+/+>+>y+I+V+V($7$;$;<Lb$Q$U$U JJ,,b%	 <EExx{{EE77c>+/L)+)2a)@)CJ(1(<Q(?I090A-$(NN9i$HE$)KK$9$9*$EE($T+<=> ?;;@;M;M:N O$   * &
 ( *.$'(I(M(M,0JJ,<,<b)*%&*"	-$% !$AaD		-M 	- !+'>>Ahh}>U=V W# !  '  *)K F*	-s   	F,;F1c                 Z    t        |   di | | j                  j                  | _        y )Nr;   )r   __init__r!   r"   _saved_filters)r+   r-   r   s     r4   r   z[HorillaDeleteConfirmationView.get.<locals>.format_callback.<locals>.DynamiListView.__init__  s%    (262.2ll.>.>+r<   c                 J    t        |   di |}d| j                  z   |d<   |S )Nr   
search_urlr;   )r   r   r   )r+   r-   r   r   s      r4   r   zcHorillaDeleteConfirmationView.get.<locals>.format_callback.<locals>.DynamiListView.get_context_data  s-    "''":"DV"D03doo0E-&r<   c           
         | j                   j                  j                  dd      fd}t        t	        | j
                  j                  t        j                  | j                  j                  j                        j                  i       j                  | j                  g       z   j                  t        j                  | j                  j                  j                        j                  i       j                  | j                  g       z               | _        | j                  j                  j                  t        || j
                        D cg c]  }|j                   c}      }|S c c}w )Nr   rF   c                 :    t        |       j                         v S r   r   r   s    r4   r   zwHorillaDeleteConfirmationView.get.<locals>.format_callback.<locals>.DynamiListView.get_queryset.<locals>._search_filter  s    #)S]-@-@-B#BBr<   )pk__in)r!   r"   r5   r   r   r   r   r   rG   r   r   r   r%   r&   r   )r+   r   r3   r\   r   	MODEL_MAPr   s       @r4   r   z_HorillaDeleteConfirmationView.get.<locals>.format_callback.<locals>.DynamiListView.get_queryset  s2   !%!1!1!5!5h!CC *.$(NN&/mm(,(;(;,0JJ,<,<,F,F)**6,(*	'&
 '*c$**b&9%: ':&=&=(,(;(;,0JJ,<,<,F,F)**6,(*	'&
 '*c$**b&9%:*( $(::#5#5#<#< 17~t~~0V$$, !)$ $= $  ($s   E5)r7   r8   r9   r:   r   columnsrecords_per_pageselected_instances_key_idr   r   r   r   r   )r   r  r   r   r   s   @r4   r   r   s  sH     !#IG ()$0;i0G-/*b?'
 (  (r<   r   r   )r5   r   rG   r   r   r   r   r7   r   r   r   r   r   bulk_update_fieldsr   r   r  r_   as_view)r3   r   r   rG   	model_mapr   r   DYNAMIC_PATH_MAPr  
MODEL_NAMEr   r   r   delete_objectr   r   s   `     @r4   format_callbackz:HorillaDeleteConfirmationView.get.<locals>.format_callbackJ  s   *..x~~/C/CD@B'(<(<=JL1(..2F2FG$ x7 00I++I6CCINN((E!&!5!5c!:1!=E/8+iI	)')	)$Ii00.0	)$U+%-=RHI !!3!34j( j(_ j(Z #FF 9 (-$%..(9C9I9I9K8LN58O8S8Sr9N5 ,5Y+?+F(,<U=O=O,P)"<<u?Q?QQ 8 ""&11&..0+66 i '..x8Or<   Tr   rC   z generic/delete_confirmation.html)r  dynamic_list_pathr
  r   model_count_sumrelated_objects_countprotected_objects_countF)"horilla.urlsr   r   r!   r"   r   r'   has_permr   r   r   r   r%   r5   r	   db_for_writer   rG   r   collectnestedr   
model_objsr$   verbose_name_plurallenr   intr   r#   r   sumvaluesr   )r+   r,   r-   r   apprG   objsr   	collectorr  
_to_deleter   r   model_countprotected_model_countr  r  r	  r   r   r   r
  r   r   s                  @@@@@@@@@r4   r5   z!HorillaDeleteConfirmationView.get2  sA    	3\\d#,,**7399#>Z||  ))#
*:Z=M=M=O*OP$,,77sJ/))R)0##M$7$7$=$=>!d;	$	 "$,.)o	 o	b %%o6
<E<O<O
58OC40
	 
  )3399;
t KK++SY6
 

 !,C 0&& 	HCIE!%++"A"ABaGB	H !%%: ;LL.(4GH%5!.&#&{'9'9';#<)4+@ ##%	&
 	
!

s   I*I"c                      j                   j                  d   } j                   j                  d   j                  d      \  }} j                   j                  j	                  |dz   |j                         z         st         j                   d      S t        j                  ||      }|j                  j                  |      }|g}t        j                  |j                  j                        }	t        |	|      }
|
j!                  |       d fd	}|
j"                  D ]  } ||d	
        |
j%                  |       t'        d      S )z2
        Post method to handle the delete
        r   rG   rB   r   r   r   r   c                     	 | j                          t        j                  j                  d|         y #  t        j                  j                  d|         Y y xY w)NzDeleted zCannot delete : )r   r   r    r!   error)r3   r   r+   s     r4   delete_callbackz;HorillaDeleteConfirmationView.post.<locals>.delete_callback*  sP    L!  (/DELt||/?z-JKs	   37 %ATr  z
        <script>
            $("#reloadMessagesButton").click();
            $(".oh-modal--show").removeClass("oh-modal--show");
        </script>
        r  )r!   r"   r   r'   r  r   r   r   r   r%   r5   r	   r  r   rG   r   r  r   r  r
   )r+   r,   r-   r   r  r	  rG   r
  r  r   r  r&  r   s   `            r4   postz"HorillaDeleteConfirmationView.post  s%    \\d#,,**7399#>Z||  ))#
*:Z=M=M=O*OP$,,77sJ/))R)0##M$7$7$=$=>!d;	$	L && 	1CC40	1 	)
 	
r<   r   c                 (    i }| j                   |d<   |S )Nconfirmation_target)r)  )r+   r-   r   s      r4   r   z.HorillaDeleteConfirmationView.get_context_data@  s    )-)A)A%&r<   N)	r7   r8   r9   r:   r)  r5   r'  r#   r   r;   r<   r4   r   r   +  s(     3g
R#
JD r<   r   )3rT   collectionsr   djangor   django.appsr   django.contribr   django.contrib.admin.utilsr   django.core.cacher   rW   	django.dbr	   django.httpr
   r   django.shortcutsr   django.utils.decoratorsr   django.viewsr   django.views.decorators.csrfr   base.methodsr   horilla_viewsr   horilla_views.cbv_methodsr   r   r   horilla_views.formsr   horilla_views.generic.cbv.viewsr   r   r   r>   rr   r{   r   r   r   r   r   r   r   r;   r<   r4   <module>r;     s    #   # 4 ,  2 # 4  5 &   Q Q / L
 .z2'4 ' 3'< .z2@
$ @
 3@
F .z24 4 34* .z24$ 4 342 .z2#/ # 3#L .z2    3  .z2    3 & .z2,Z0K$ K 1 3K .z2' ' 3',6_ 6 XD Xr<   