
    siS                        d dl Z d dlZd dl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mZmZ d dlmZ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&m'Z' d dl(m)Z) d dl*m+Z+ d dl,m-Z. d dl/m0Z0 d dl1m2Z2m3Z3 d dl4m5Z5 d dl6m7Z7m8Z8m9Z9m-Z-m:Z:m;Z;m<Z< d dl=m>Z> d dl?m@Z@mAZA d dlBmCZC  e e-d       G d de"             ZD e e-d       G d d e"             ZE e e-d       G d! d"e"             ZF e e-d       G d# d$e"             ZG e e-d       G d% d&e@             ZH e e-d       G d' d(e"             ZI e e-d       G d) d*e"             ZJ e e-d       e e$d       G d+ d,e"                    ZK e e-d       G d- d.e"             ZL G d/ d0eA      ZM G d1 d2e"      ZNd3 ZOd4 ZPd5 ZQd6 ZReCZSd7 ZTd8 ZUe.d9        ZV G d: d;e"      ZWy)<    N)defaultdict)BeautifulSoup)forms)apps)messages)NestedObjects)cache)router)ManyToManyRelManyToOneRelOneToOneRel)HttpResponseHttpResponseForbiddenJsonResponse)render)method_decorator)View)csrf_protect)fields	resources)pisa)eval_validate)login_required)_thread_locals)post_generic_deletepre_generic_delete)models)export_xlsxget_nested_fieldget_short_uuidr   merge_dictsrender_to_stringset_nested_attr)SavedFilterForm)HorillaFormViewHorillaListView)getattribute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
             7/var/www/python-projects/worksol/horilla_views/views.pygetzToggleColumn.get6   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__rE        rD   r,   r,   0   s    'rL   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 modelr@   r   )rV   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)r2   rsplit	importlibimport_modulegetattrCACHErE   sessionsession_keyr   r5   allquerysetidinsertappendr   ChoiceField
isinstanceModelMultipleChoiceFieldMultipleChoiceFieldr   r1   r^   r_   widgetoption_template_nameattrsinitialr    r   )r;   r1   r<   r=   
class_pathreload_fieldmodule_name
class_namemoduleparent_formdynamic_cacherU   rW   r@   cache_fieldra   rk   rC   r]   
form_fieldrY   rb   s                         rD   rE   zReloadField.getU   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,NrF   rK   rL   rD   rN   rN   O   s    ;
rL   rN   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)r1   r2   rE   r7   r   r   r5   r6   r8   r.   
tab_targetr:   r   )r;   r<   r=   r.   r   rB   rC   s          rD   rE   zActiveTab.get   s     ||##F+!!%%h/Ft||00 & 0 0 8 8 ? ?<<,,4 !@ !eg 
 +<  "AR  !HM"(HMMOY	233rL   NrG   rH   rI   rE   rK   rL   rD   r   r      s    4rL   r   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.   r   ra   )r   r.   group_by_fieldr   r   )r1   r2   rE   r7   r   r   r5   r6   r8   r.   r   group_targetr:   r   )r;   r<   r=   r.   r   group_fieldrB   rC   s           rD   rE   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3rL   Nr   rK   rL   rD   r   r      s    4rL   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referrerrV   r.   /r   F)commitzFilter Saved)r1   POSTrE   r2   listsis_validr:   pkr.   r   r6   	urlencoder   r0   r   super
form_valid)	r;   r   r   r.   r?   r@   result_dictrC   	__class__s	           rD   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   rV   r      r.   rK   )r   get_context_datar1   r2   rE   joinsplit)r;   r=   contextr   r   s       rD   r   zSavedFilter.get_context_data   s    '*4V4<<##''
B7SXXhnnS&9!"&=>>H,,**..vr:&
rL   )rG   rH   rI   rJ   r   r   rW   r$   
form_classnew_display_titletemplate_nameform_disaply_attrr   r   r3   r   __classcell__)r   s   @rD   r   r      sO     E J-4M( (< ( D  rL   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   )r   r   rV   )r   r   r5   r6   r1   r7   deleter   )r;   r<   r=   r   s       rD   rE   zDeleteSavedFilter.get   sH    D\""))T\\5F5F2)NUUWBrL   NrF   rK   rL   rD   r   r      s     rL   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.   r   rV   )r1   r2   r   r   r5   r6   r7   r8   r.   typer:   r   )r;   r<   r=   r.   	view_typeactive_views         rD   rE   zActiveView.get   s    ||'LL$$V,	''//66$,,"3"3 7 

%' 	 &1kf6G6G6I$BrL   NrF   rK   rL   rD   r   r      s     rL   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)r1   rh   ri   rg   rE   r2   qsr   )r;   r<   r=   	cache_keyr   s        rD   rE   zSearchInIds.get  sj     ||++7788NO			),6w~6t||7G7GHKKdll$@'JJrL   NrF   rK   rL   rD   r   r   
  s    KrL   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  )timeoutr0   )r1   r2   rE   rg   setrh   ri   r   )r;   r<   r=   nav_paths       rD   rE   zLastAppliedFilter.get!  sm    
 <<##''
 II$$003HH8S  
 I&&rL   NrF   rK   rL   rD   r   r     s    'rL   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searchrV   c                 :    t        |       j                         v S NstrlowerrC   r   s    rD   _search_filterz3DynamiListView.get_queryset.<locals>._search_filter<  s    S]00222rL   )r1   r2   rE   r6   r   )r;   r   r   s     @rD   get_querysetzDynamiListView.get_queryset9  s7    !!%%h3	3 ndnn55rL   N)rG   rH   rI   rJ   r   r   rK   rL   rD   r   r   2  s     I6rL   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=              |t?        |jA                               ||d}| jC                         j/                         D ]
  \  }}|||<    t        | j                  d|      S c c}w c c}}w )z
        GET method
        r   )r.   urlpatternsr   rW   rR   .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_fieldsrp   r   
ForeignKeyOneToOneFieldrf   r*   remote_field	on_deleterG   rW   rn   verbose_name)objrelated_instancera   field_valueMODEL_RELATED_FIELD_MAP!MODEL_RELATED_PROTECTED_FIELD_MAPrC   s       rD   find_related_fieldzVHorillaDeleteConfirmationView.get.<locals>.format_callback.<locals>.find_related_fieldf  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 %

rL   _r   zgeneric-delete
   )prefixlengthc                   h     e Zd ZdZg ZdgZdZd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   F	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   rS   r   z
                            z;
                            <i style="color:#989898;">(In z")</i>
                            z
                        rV   z>
                            <i style="color:red;">(Record in r[   )r   rG   r   	app_labelr   get_app_configr   rE   rW   r   r   r   	get_model	get_fieldrf   listr   r   r   )r;   is_protected	classnamer   app_verbose_name	protectedrC   ids
field_nameobject_field_namerW   ra   
indicationiverbose_namesr   PROTECTED_MODEL_MAPs                  rD   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 )NrK   )r   __init__r1   r2   _saved_filters)r;   r=   r   s     rD   r	  z[HorillaDeleteConfirmationView.get.<locals>.format_callback.<locals>.DynamiListView.__init__  s%    (262.2ll.>.>+rL   c                 J    t        |   di |}d| j                  z   |d<   |S )Nr   
search_urlrK   )r   r   r  )r;   r=   r   r   s      rD   r   zcHorillaDeleteConfirmationView.get.<locals>.format_callback.<locals>.DynamiListView.get_context_data  s-    "''":"DV"D03doo0E-&rL   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   rV   c                 :    t        |       j                         v S r   r   r   s    rD   r   zwHorillaDeleteConfirmationView.get.<locals>.format_callback.<locals>.DynamiListView.get_queryset.<locals>._search_filter  s    #)S]-@-@-B#BBrL   )pk__in)r1   r2   rE   r   r   r   r   r   rW   r   r   r   r5   r6   r   )r;   r   rC   rk   r   	MODEL_MAPr  s       @rD   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)rG   rH   rI   rJ   r   columnsrecords_per_pagefilter_selectedquick_exportselected_instances_key_idr   r	  r   r   r   )r   r  r   r  r   s   @rD   r   r     sR     !#IG ()$&+O#(L0;i0G-/*b?'
 (  (rL   r   r)   )rE   r   rW   r   r   r   r   rG   r   r    r&   r   r   bulk_update_fieldsr   r  r  rn   as_view)rC   r   r   rW   	model_mapr   r   DYNAMIC_PATH_MAPr  
MODEL_NAMEr   r   r  delete_objectr.   r   s   `     @rD   format_callbackz:HorillaDeleteConfirmationView.get.<locals>.format_callbacka  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l( l(_ l(^ #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OrL   Tr   rS   )r  dynamic_list_pathr  r   model_count_sumrelated_objects_countprotected_objects_countz generic/delete_confirmation.htmlF)"horilla.urlsr.   r   r1   r2   r   r7   has_permr   r   r   r   r5   rE   r
   db_for_writer   rW   r   collectnestedr   
model_objsr4   verbose_name_plurallenr   intr   r3   r!   sumvaluesr   )r;   r<   r=   r   apprW   objsr   	collectorr  
_to_deleter   r   model_countprotected_model_countr   r?   r@   r  r  r  r   r   r  r  r.   r   s                     @@@@@@@@@rD   rE   z!HorillaDeleteConfirmationView.getI  s_    	3\\d#,,**7399#>Z||  ))#
*:Z=M=M=O*OP$,,77sJ/))R)0##M$7$7$=$=>!d;	$	 "$,.)q	 q	f %%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 !%%: ;$Y0CD!1*"";#5#5#78%0'<
 //1779 	!JC GCL	! dll$FPP7

s   I9*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'        j(                         S )z2
        Post method to handle the delete
        r   rW   rR   r   r   r   r   c                    	 j                   j                  j                  | j                  j                   d| j                  j
                  j                  j                                rt        j                  | j                  j
                  |        | j                          t        j                  | j                  j
                  |        t        j                  j                   d|         y t        j                  j                   d|         y #  t        j                  j                   d|         Y y xY w)Nr   )senderrC   r<   view_instancer=   zDeleted z$You don't have permission to delete zCannot delete : )r1   r7   r$  r   r   rW   rG   r   r   sendr   r   r   r0   infoerror)rC   r   r<   r=   r;   s     rD   delete_callbackz;HorillaDeleteConfirmationView.post.<locals>.delete_callbackA  s   L<<$$--~~//09M9M9V9V9\9\9^8_` '++'~~33!)!&*% OO%',,'~~33!)!&*% $$T\\XhZ3HIMM(LXJ&WLt||/?z-JKs   C9D! =#D! !%ETr  r"  )r1   r2   r   r7   r$  r   r   r   r   r5   rE   r
   r%  r   rW   r   r&  r   r'  r%   r   )r;   r<   r=   r   r.  r  rW   r  r/  r   r0  r;  r   s   ```          rD   postz"HorillaDeleteConfirmationView.post2  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 	)++--rL   r   c                 (    i }| j                   |d<   |S )Nconfirmation_target)r>  )r;   r=   r   s      rD   r   z.HorillaDeleteConfirmationView.get_context_datae  s    )-)A)A%&rL   N)	rG   rH   rI   rJ   r>  rE   r<  r3   r   rK   rL   rD   r   r   B  s)     3gQR1.fD rL   r   c                 d   | j                   j                  dd      }| j                   j                  d      }| j                   j                  d      }| j                   j                  d      }t        j                  |      }| j                   j                  d      }|st	        ddid	
      S |st	        i       S 	 |j                  d      \  }}t        j                  ||      }	t        |	|      st	        dd| di      S i }
|rk|rit        |	|      st	        dd| did	
      S t        |	|      }|j                  r-	 |j                  j                  j                  |      }||
|<   n||
|<   t         |	j                  j                   dd|i|
      }|D ci c]  }t#        |j$                        | }}g }t'        |      D ]@  \  }}|j                  t#        |            }|s#t)        |||       |j+                  |       B |r!d|vr|	j                  j-                  ||g       t	        dt/        |      d      S # t        $ r t	        ddid	
      cY S w xY w# |j                  j                  $ r, t	        d|j                  j                   d| did
      cY S w xY wc c}w )a  
    generic method to update the 'sequence' in kanban view.

    GET params:
    - model: 'app_label.ModelName'
    - order: list of IDs (in the desired order)
    - groupKey: optional grouping field (e.g., stage_id)
    - groupId: optional value of the grouping field
    rW   rV   ordergroupKeygroupIdorderByr:  zMissing 'model' or 'order'.  statusrR   zInvalid model path.r9  zModel does not have a z field.zModel does not have field 'z'.r   z	 with ID z not found.i  id__in__r0   rF  updatedrK   )r2   rE   jsonloadsr   r   r   r   	Exceptionr   is_relationrelated_modelr5   DoesNotExistrG   r   r6   r   rl   	enumerater#   rn   bulk_updater*  )r1   
model_pathr@  	group_keygroup_id
order_listorder_byr   
model_namerW   filtersra   group_instancer/  r   	obj_by_idupdated_objsindexobj_ids                      rD   update_kanban_sequencer_  k  s    "-JKKOOG$E
+I{{y)HE"J{{y)HW&CDSQQBJ * 0 0 5	:y*5 E8,V'=hZw%OPQQGXy17	{"EFs  !	2!&!4!4!<!<!@!@H!@!M "0GI!)GI$$$BJB'BCD-12cSVVc!2I2L":. %vmmCK(C51$	% H,!!,
;9\9JKLLS  JW&;<SIIJ" &&33 #E$7$7$@$@#A8*T_!` 	  3s+   =*I &I% J-I"!I"%AJ*)J*c                     | j                   j                  d      }| j                   j                  d      }| j                   j                  d      }| j                   j                  d      }| j                   j                  d      }| j                   j                  d      }t        j                  |      }t	        |||||g      st        ddid	
      S 	 t        j                  |j                  d       }t        ||      }	t        |	d      r5|	j                  r)|	j                  }
|
j                  j                  |      }n|}t        |j                  j                  |            }|D ci c]  }t        |j                         | }}g }t#               }t%        |      D ]_  \  }}|j                  t        |            }|s#t'        |||       d|v rt'        |||       nt)        |||       |j+                  |       a d|vr |j,                  |       |r%|j                  j/                  |t        |             t        dt1        |      d      S c c}w # t2        $ r"}t        dt        |      id
      cY d}~S d}~ww xY w)a]  
    Generic method to update sequence and group kanban objects.

    GET parameters:
    - model: 'app_label.ModelName'
    - groupKey: foreign key field on the model (can be nested: 'stage__stage_id')
    - groupId: ID of the new group to assign
    - objectId: ID of the object being moved
    - order: ordered list of IDs to update sequence
    rW   rA  rB  objectIdr@  rC  r:  zMissing required parametersrD  rE  rR   rO  )rl   rG  rH  r0   rI    N)r2   rE   rK  rL  rj   r   r   r   r   r   hasattrrO  r5   r   r6   r   rl   r   rQ  r#   setattrrn   addrR  r*  rM  )r1   rS  rT  rU  	object_idr@  rW  rV  rW   r   group_modelrZ  r5   r   obj_maprJ  r   r]  r^  es                       rD   update_kanban_item_grouprk    s5    )J
+I{{y)H
+IKKOOG$E{{y)HE"J
IxJGHW&CDSQQ*;
 0 0 56 'ui8;0[5N5N%33K(00444AN &N u}}++:+>?/673svv;#77&z2 	 ME6++c&k*CC51 y Y?Y7NN3	  y FJJy!MM%%gtF|<yS\JKK3 86  ;Wc!f-c::;s2   BI" 1ICI" I" "	J+JJJc                 h   | j                   j                  d      }| j                   j                  d      }| j                   j                  dd      }| j                   j                  d      }	 t        j                  |      }t        j                  |j                  d       }t        ||      }|j                  }g }	t        |      D ]   \  }
} |||
      }|	j                  |       " |j                  j                  |	|g       t        d	d
d      S # t        j                  $ r g }Y w xY w)zA
    Generic method to update the sequence of kanban groups.
    rW   rT  sequencerV   rC  rR   )r   rm  )r   r0   z$Group sequence updated successfully.)rF  r   )r2   rE   rK  rL  JSONDecodeErrorr   r   r   r   rO  rQ  rn   r5   rR  r   )r1   rS  rT  sequence_rawrW  rm  rW   r   rh  	to_updater]  rU  rC   s                rD   update_kanban_group_sequencerq    s    )J,I;;??:r2L{{y)H::l+ NNJ,,S12E"5)4K++KI$X. #x
 	"# ##Ixj#A)OP %  s   /D D10D1c                 V   | j                   j                  d      }| j                   j                  d      }| j                   j                  d      }t        j                  |j	                  d       } |j
                  j                  di ||ij                         }t        |       S )zH
    Generic method to get the count of kanban cards in each group.
    rW   rU  rT  rR   rK   )	r2   rE   r   r   r   r5   r6   countr   )r1   rS  rU  rT  rW   rs  s         rD   get_kanban_card_countrt    s     )J{{z*H,INNJ,,S12E EMM  9Ix#89??AE5'##rL   c                 6    t        j                  dd|       d d S )Nz[<>:"/\\|?*\[\]]+r      )resub)filenames    rD   sanitize_filenamerz  '  s    66&X6t<<rL   c                 d    | j                  dd      \  }}t        ||g      }t        ||      }|S )zI
    method to return the model class from string 'app.models.Model'
    rR   rS   )fromlist)rc   
__import__rf   )rS  ry   rz   r{   model_classs        rD   get_model_classr  +  s;     )//Q7Kzl;F&*-KrL   c                 p   ddl m} t        t        dd      } t	        | j
                  d         }t	        | j
                  d         | j
                  j                  dd      }t        | j                  d	   
      }| j                  j                  | j                  d	   j                  d      d    d|j                         s=t        j                  d|j                  j                            |j"                         S |j$                  j'                  |      }t	        | j
                  d         }| j
                  d   }	t)        |	      }	| G fddt*        j,                        }
 |
       }|j/                  |      }t1        j2                  |j/                  d            }g }D ]u  t5              dk(  rTt7        fd|D              }|r,	 t9        fd|D        i       }|j=                  g |       S|j=                         e|j=                         w g }|D ][  }t5        |      dk\  r"t?        |d   t@              r|d   |d   |d   f}nt5        |      dk\  r
|d   |d   f}|j=                  |       ] |dk(  r-t#        t1        jB                  |d      d      }d|	 d|d<   |S |d k(  r)|j/                  d       }t#        |d!      }d|	 d"|d<   |S |d#k(  r|jD                  }|j@                  }tG        d$||d%      }tI        jJ                         }tM        jN                  ||&      }|jP                  rt#        d'd()      S t#        |jS                         d*      }d|	 d+|d<   |S tU        |||	,      S # t:        $ r}|j=                         Y d}~d}~ww xY w)-z*
    Export list view visible columns
    r   )r%   r1   Nr  r  formatxlsxrW   )rS  rR   z.view_z"You dont have view perm for model rb  export_fieldsexport_file_namec                      e Zd ZdZ ej
                  d      Z G  fdd      Zd ZW  D ]M  Z	de	d    d	e	d    d
e	 dZ
 ee
        e       de	d       Z ej
                  e	d          e       e	d   <   O d Zy)+export_data.<locals>.HorillaListViewResorcez(
        Instant Resource class
        ID)column_namec                   P    e Zd ZdZW ZW D  cg c]  }|d   	 c}} Zyc c}} w )0export_data.<locals>.HorillaListViewResorce.Metaz:
            Meta class for additional option
            rS   N)rG   rH   rI   rJ   rW   r   ).0ra   _columns_models   00rD   Metar  V  s&     E,455eAh5F5s   "r  c                     |j                   S )z7
            Dehydrate method for id field
            r   )r;   rC   s     rD   dehydrate_idz8export_data.<locals>.HorillaListViewResorce.dehydrate_id^  s     ;;rL   zdef dehydrate_rS   zI(self, instance):return self.remove_extra_spaces(getattribute(instance, 'z'),)
dehydrate_r   c                    t        t        |      d      }|j                  d      }|r4|j                  dd      }|r|d   S |j                  d      }|r|d   S dS |j                  d      }|r|j                  dd      S |j                  d	      }|r|j                  j                         S |j                  d
      D ]#  }	|	j                  d       |	j                          % |j                         }|j                         }
|
D cg c]#  }|j                         s|j                         % }}dj                  |      }|S c c}w )a  
            Clean the text:
            - If it's a <select> element, extract the selected option's value.
            - If it's an <input> or <textarea>, extract its 'value'.
            - Otherwise, remove blank spaces, keep line breaks, and handle <li> tags.
            zhtml.parserselectoptionT)selectedr@   rV   inputtextareali
)r   r   findrE   textstripfind_allinsert_beforeunwrapget_text
splitlinesr   )r;   r  field_tuplesoup
select_tagselected_optionfirst_option	input_tagtextarea_tagr  lineslinenon_blank_linescleaned_texts                 rD   remove_extra_spacesz?export_data.<locals>.HorillaListViewResorce.remove_extra_spacesj  s8    !TM:D 8,J",//(T/"J"*733#-??8#<L4@<0HbH 		'*I }}Wb11  99Z0L#((..00 mmD)   &		 ==?DOO%E8=Ntzz|NON99_5L Os   
E EN)rG   rH   rI   rJ   r   Fieldrl   r  r  r  dynamic_fn_strexeclocals
dynamic_fnr  )r  r  s   rD   HorillaListViewResorcer  O  s    	 V\\d+	6 	6	 $ 	PK-k!n-=  >G  HS  TU  HV  GW  WZ  [f  Zg  gh  iN J{1~.>"?@J'3v||A'OFH[^$		P&	 rL   r  rK     c              3   N   K   | ]  }|d    d    k(  xr |d   d   k(    yw)r   rS   NrK   r  export_itemitems     rD   	<genexpr>zexport_data.<locals>.<genexpr>  s;       A$q')Gk!nQ.GGs   "%c              3   T   K   | ]  }|d    d    k(  r|d   d   k(  r|d    ! yw)r   rS   r  NrK   r  s     rD   r  zexport_data.<locals>.<genexpr>  s=       +*1~a8[^tTUw=V (Ns   %(r   rS   r`   )indentzapplication/json)content_typezattachment; filename="z.json"zContent-Dispositioncsvztext/csvz.csv"pdfzgeneric/export_pdf.html)headersrows)destzPDF generation failedrc  rE  zapplication/pdfz.pdf")	file_name)+horilla_views.generic.cbv.viewsr%   rf   r   r   r   rE   r  r2   r7   r$  r   rG   r   r9  r   r   r   r5   r6   rz  r   ModelResourceexportrK  rL  r*  anynextrM  rn   rp   r3   dumpsr  r"   ioBytesIOr   	CreatePDFerrgetvaluer   )r1   r<   r=   r%   r  export_formatrW   rk   r  r  r  book_resourcedataset	json_datamergedmatch_foundmetadatarj  r  columnresponsecsv_datar  r  html_stringresultpisa_statusr  r  r  s                              @@@rD   export_datar  5  s   
 @ni6G
U+
,CW\\)45HLL$$Xv6M!0GKK<P!QE<<  [[!'',Q/0u~~6FI 	:5;;;S;S:TUV+++--}}##3#/H!',,"?@M||$67()9:FA !8!8 A F +,M ""8,G 

7>>&12IF  t9> #0 K
 #/<
  H //h/0d#MM$9 : G v;!
6!9d ;QiF1I6F[AQi+Fv JJy+:L
 %%5$6f= 	&' 	%	>>%(zB$%5$6e< 	&' 	%	//|| '%"
 nn[v>?? 7DD   1@QR$%5$6e< 	&' y'5EFFy ! MM$'s   N	N5N00N5c                       e Zd ZdZd Zy)DynamicViewz
    DynamicView
    c                 h    ||j                   j                  k7  rt        d      S t        |dd|i      S )NzInvalid session key.zdynamic.htmlra   )rh   ri   r   r   )r;   r1   ra   ri   s       rD   rE   zDynamicView.get  s6    '//555()?@@ g~/?@@rL   NrF   rK   rL   rD   r  r    s    ArL   r  )Xrd   r  rK  rw  collectionsr   bs4r   djangor   django.appsr   django.contribr   django.contrib.admin.utilsr   django.core.cacher	   rg   	django.dbr
   'django.db.models.fields.reverse_relatedr   r   r   django.httpr   r   r   django.shortcutsr   django.utils.decoratorsr   django.viewsr   django.views.decorators.csrfr   import_exportr   r   	xhtml2pdfr   base.methodsr   horilla.decoratorsr   func_login_requiredhorilla.horilla_middlewaresr   horilla.signalsr   r   horilla_viewsr   horilla_views.cbv_methodsr   r   r    r!   r"   r#   horilla_views.formsr$   r  r%   r&   3horilla_views.templatetags.generic_template_filtersr'   r,   rN   r   r   r   r   r   r   r   r   r   r_  rk  rq  rt  _getattibuterz  r  r  r  rK   rL   rD   <module>r     s-    	  	 #    # 4 ,  
 J I # 4  5 +  & D 6 C     0 L 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 fD fR	BMJA;HD$ = ~G ~GB
A$ 
ArL   