
    siH                        d Z ddlZ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mZmZ dd	lmZ dd
lmZ ddlmZmZ ddlmZ  ej:                  e      Ze d        Z! e"ede!       g Z#g Z$i Z%d Z&d Z'd Z(y)z 
horilla_automation/signals.py

    N)BeautifulSoup)template)EmailMessage)models)QuerySet)post_delete	post_savepre_save)receiver)_thread_locals)post_bulk_updatepre_bulk_update)notifyc                 `     | |d   j                         }t        |      |_        d|_        |S )Nr   )model )	__class__list_result_cache_prefetch_related_lookups)clsobject_listqueryset_like_objects      ?/var/www/python-projects/worksol/horilla_automations/signals.py	from_listr      s6     [^%=%=>)-k):&572    r   c                  f  	
 ddl m}  ddlmm ddlm t        t              t        t              	
fd              }t        t        |       t        t        |       	
fd              }d t        d	<   d
 fd		t        d<   d fd
 
         	        y)z
    Automation signals
    r   )HorillaMailTemplate)get_model_classsplit_query_string)MailAutomationsenderc                 "                      yz>
        signal method to handle automation post save
        Nr   r#   instancekwargsstart_connectiontrack_previous_instances      r   automation_signalz+start_automation.<locals>.automation_signal3        	!r   c                 "                      yr%   r   r&   s      r   template_signalz)start_automation.<locals>.template_signal<   r,   r   c                      t         D ]D  } t        j                  | | j                         t	        j                  | | j                         F t         j                          y)z2
        Method to clear signals handlers
        r"   N)SIGNAL_HANDLERSr	   
disconnectmodel_classr   clearhandlers    r   clear_connectionz*start_automation.<locals>.clear_connectionE   sO     ' 	MG  1D1DE''8K8KL	M 	r   r6   c                       fd} j                    d}t        j                  |j                  t	               ||j
                  |j                        }||_         |_        |S )Nc                     
fd}t        t        dd       }g }|r$|j                  dd       }|j                  dg       }t        j                  |||	f      }|j                          y )Nc           	      v    t        | dd       }|r)t        |       D ]  \  }}||   }t        |d|||        y y )NrequestF)getattr	enumeratesend_automated_mail)querysetprevious_queryset_copy
automationr:   indexr'   previous_instancequery_stringss          r   _bulk_update_thread_handlerzstart_automation.<locals>.create_post_bulk_update_handler.<locals>.post_bulk_update_handler.<locals>._bulk_update_thread_handlerR   sX     "(It<+4X+> 	x,B5,I)+#!&)$-	 r   previous_bulk_recordr>   queryset_copy)targetargs)r;   r   get	threadingThreadstart)r#   r>   rH   r(   rD   rE   r?   previous_querysetbulk_threadr@   rC   s            r   post_bulk_update_handlerz[start_automation.<locals>.create_post_bulk_update_handler.<locals>.post_bulk_update_handlerQ   sw    " $+>;QSW#X %'"#$8$<$<Z$N!)=)A)A/SU)V&#**2 6
CK r   _post_bulk_signal_handlernameargdefsclosure	method_titletypesFunctionType__code__globals__defaults____closure__r2   r@   )r@   r2   rC   rO   	func_namer5   s   ` `   r   create_post_bulk_update_handlerz9start_automation.<locals>.create_post_bulk_update_handlerP   sj    	 < "..//HI	 $$$--I,99,88
 *'r   c                    	          
j                   j                  d      } | D ]  }|j                  j                  dd      } |      }|j                  } |      	 |	|      }t
        j                  |       t        j                  |	       	fd}|j                   d} ||||      }t
        j                  |       t        j                  ||j                          y)	zQ
        Method to start signal connection accordingly to the automation
        T	is_activeautomation_multiple_ r"   c                 B    fd}| |_         |_        |_        |S )Nc                     t        t        dd      }t        t        dd      }d}|r|d   }||	
||ft        j                  fd      }|j	                          y)ze
                    Signal handler for post-save events of the model instances.
                    r:   Nprevious_recordr'   c                      t          S N)r=   )rH   s   r   <lambda>zsstart_automation.<locals>.start_connection.<locals>.create_signal_handler.<locals>.signal_handler.<locals>.<lambda>   s    ':D'A r   rG   )r;   r   rJ   rK   rL   )r#   r'   createdr(   r:   rf   rB   threadrH   r@   rC   s           @r   signal_handlerzastart_automation.<locals>.start_connection.<locals>.create_signal_handler.<locals>.signal_handler   sr     &niFG&-n>OQU&VO(,%&,;J,G)  "% )D '--AF LLNr   )__name__r2   r@   )rR   r@   rC   rm   r2   s    `` r   create_signal_handlerzIstart_automation.<locals>.start_connection.<locals>.create_signal_handler   s(    #. +/'-8*,6)%%r   _signal_handlerN)objectsfiltercondition_querystringreplacer   r0   appendr   connectrV   r	   r2   )automationsr@   rs   rC   
model_pathr5   ro   handler_namedynamic_signal_handlerr2   r!   r6   r^   r   r    s            @r   r)   z*start_automation.<locals>.start_connection   s     	$,,33d3C% 7	J$.$D$D$L$L&%! //DEM#))J)*5K5KG ""7+$$W[A&< )556oFL%:j-&" ""#9:&/E/Q/Qk7	r   r)   c                       fd} j                    d}t        j                  |j                  t	               ||j
                  |j                        }||_         |_        |S )Nc                     t        t        dd       }|ra|j                         }|j                         r1t	        j
                  t        j                  t        |                  }||dt        _	        y y )Nr:   )r@   r>   rF   )
r;   r   nonecountr   r   copydeepcopyr   rE   )r#   r>   rH   r(   r:   rF   r@   s         r   pre_bulk_update_handlerzYstart_automation.<locals>.create_pre_bulk_update_handler.<locals>.pre_bulk_update_handler   s^    ni>G (>>#$,$6$6t}}T(^7T$UM", (%273	 r   _pre_bulk_signal_handlerrQ   rU   )r@   r2   r   r]   r5   s   `    r   create_pre_bulk_update_handlerz8start_automation.<locals>.create_pre_bulk_update_handler   sj    
	 "..//GH	 $$#,,I+88+77
 *'r   c                  p   d }  |         j                   j                  d      }|D ]   j                               }t        j	                  |       t        j                  |       t        t              fd       _	        _
        t        j	                          y)zX
        method to add signal to track the automations model previous instances
        c                      t         D ]D  } t        j                  | | j                         t	        j                  | | j                         F t         j                          y)zB
            Method to clear instance handler signals
            r"   N)INSTANCE_HANDLERSr
   r1   r2   r   r3   r4   s    r    clear_instance_signal_connectionz[start_automation.<locals>.track_previous_instance.<locals>.clear_instance_signal_connection   sO     - P##GG4G4GH**77;N;NOP ##%r   Tr`   r"   c                     t        t        dd      }|j                  r4j                  j	                  |j                        j                         }|r|dt        _        j                   d_        S )z]
                Signal handler for pres-save events of the model instances.
                r:   N)id)r@   r'   _instance_handler)	r;   r   pkrq   rr   firstrf   rV   rn   )r#   r'   r(   r:   r@   instance_handlerr2   s       r   r   zKstart_automation.<locals>.track_previous_instance.<locals>.instance_handler   sw     ".)TB;;*2299X[[9IOOQH&0$,6N2
 "..//@A !) ('r   N)rq   rr   r   r   ru   r   rv   r   r
   r2   r@   )	r   rw   r5   r@   r   r2   r!   r   r   s	      @@@r   r*   z1start_automation.<locals>.track_previous_instance   s    
	& 	)*$,,33d3C% 	7J)**:*:;K4ZMG$$W-##GK@h{3( 4(& ,7(*4'$$%56=	7r   N)base.modelsr   #horilla_automations.methods.methodsr   r    horilla_automations.modelsr!   r   r   r	   REFRESH_METHODS)r   r+   r.   r!   r6   r^   r   r   r    r)   r*   s      @@@@@@@@r   start_automationr   +   s     0W9k.1i/" 0 2" k"56i 34" 5 7"  +;O&'.`= =~ +;O&'<.7` r   c           	         ddl m}m} ddlm} d}	d}
d}g }g }|D ]  }|j                  d      s|j                  d      d   }|j                  d      d   }|j                  d      d   }|dk(  rd	}n|d
k(  rd} |||      } |||      }t        |dd       rGt        |t        j                        r-t        t        |dd             }t        t        |dd             }nHt        |t              r8t        |j                  dd	            }t        |j                  dd	            }|j                  |       |j                  |       |j                  d      s
 ||||      }	|j                  d      }|r ||   |	 ||||            }	|	sd	}|dk(  rd	}
|s|
sd}	 n |	rU|r|j                   dk(  rt#        | ||       y |j                   dk(  r&t%        |      t%        |      k7  rt#        | ||       y y y y )Nr   )evaluate_conditionoperator_mapgetattributeF	condition      onToffr   )flatlogicand	on_create	on_update)r   r   r   3horilla_views.templatetags.generic_template_filtersr   getlistr;   
isinstancer   Modelstrr   r   values_listru   rI   trigger	send_mailset)r:   rk   r@   rC   r'   rB   r   r   r   
applicable
and_existsfalse_existsinstance_valuesprevious_instance_valuesr   attroperatorvalueinstance_valueprevious_instance_valuer   s                        r   r=   r=     s1    UPJJLO!" /	[)$$[1!4D ((5a8H%%k215E}%)(D9N&23Dd&K# ~tT2z8 "%W^T4%H!I*-3T4@+' NH5!%n&@&@D&@&Q!R*.+7747H+' "">2$++,CD==)/%P
MM'*E0\%0&~xG
 #~!

"
_/` z))[8gz84  K/()S-AA gz84 B 0 r   c           
      p   )*+,-. ddl m} ddlm}m} ddlm} ddlm}m	} ddl
m}	 j                  }
g }g }|j                  rOt        j                  d       |j                   j"                  j$                  j'                  |j                        } |	|j(                        } |j"                        } ||j(                        }d	}t+        |t,              r*|j$                  j/                  |      j1                         } |j2                        D ]>  } |	||      }t+        |t4              r|j7                  |       .|j9                  |       @ t5        t/        d	t;        |                  }|j$                  j/                  t=        j>                  |
      t=        j>                  |      z        jA                  d      }t5        |      }	 jB                  jA                  d      jE                         }|jG                         r|j7                  d |D               D cg c]/  }|s|jO                         stQ        |jO                               1 }}|D cg c]  }|jR                   c}.|}|} |       }|jT                  }|}|g} r^tW         d      rRtW         jX                  d      r<	  jX                  jZ                  }|j]                          d|j^                   d}|}|g}|rH rD|r@g }	  jX                  jZ                  -|rj`                  jE                         x}ry|D ]t  } tc        jd                  | jf                        }!tc        jh                  |-| d      }"|!jk                  |"      }#|j9                  d ||#i dd      jl                  df       v tc        jd                  |
jf                        }!ntc        jd                  |      }!tc        jh                  |-| d      }"|!jk                  |"      }#tc        jd                  jn                        }$tc        jh                  |- d      }%|$jk                  |%      }&tq        |#d      }'|'js                  d      ,tu        |&|#||||      +d+_;        |+_<         fd) -.fd*jz                  d k7  r*t}        j~                  )+fd!"      }(|(j                          jz                  d#k7  r*t}        j~                  *,fd$"      }(|(j                          tJ        j                  d%j                          d&        y	y	y	y	# tH        $ r }tJ        jM                  |       Y d	}~@d	}~ww xY wc c}w c c}w # tH        $ r#}tJ        jM                  d|        Y d	}~d	}~ww xY w#  d	-Y xY w)'z
    mail sending method
    r   )ConfiguredEmailBackend)eval_validategenerate_pdf)Employee)r   get_related_field_modelr   g?)r   N)	email__in)employee_work_info__email__inemployee_work_infoc              3   &   K   | ]	  }|s|  y wrh   r   ).0emps     r   	<genexpr>zsend_mail.<locals>.<genexpr>  s     @SCS@s   useremployee_getz <>z0Error generating user-based email display name: )r'   selfmodel_instancer:   DocumentF)pathtitlezapplication/pdf)r'   r   r:   zhtml.parser
)	separator)subjectbodytocc
from_emailreply_tohtmlc                     	 | j                          t        j                  dj                   dj                  j
                          y # t        $ r}t        j                  |       Y d }~y d }~ww xY w)NzAutomation <Mail>  is triggered by )sendloggerinfor   r   r   	Exceptionerror)emailer@   r:   s     r   
_send_mailzsend_mail.<locals>._send_mail  s_     

()9)9(::KGLLLeLeKfg   Q s   A	A 	A5A00A5c                     t        j                  |  dd       t        j                  dj                   dj
                  j                          y )Nzperson-removerc   )	recipientverbiconredirectzAutomation <Notification> r   )r   r   r   r   r   r   r   )textr@   r:   r#   user_idss    r   _send_notificationz%send_mail.<locals>._send_notification  sT    KK"v$ KK,Z-=-=,>>OPWP\P\PiPiOjkr   notificationc                              S rh   r   )r   r   s   r   ri   zsend_mail.<locals>.<lambda>  s    z%0 r   rj   r   c                              S rh   r   )r   
plain_texts   r   ri   zsend_mail.<locals>.<lambda>  s    1*= r   zAutomation Triggered | z | )Cbase.backendsr   base.methodsr   r   employee.modelsr   r   r   r   r   r   mail_templater   timesleep_metar   rq   rI   mail_detailsr   intrr   r   mail_tor   extendru   r   r   Qselect_relatedalso_sent_toallexistsr   r   r   get_mailr   employee_user_id$dynamic_from_email_with_display_namehasattrr   r   get_full_namer   template_attachmentsr   Templater   Contextrendercontentr   r   get_textr   content_subtypeattachmentsdelivery_channelrJ   rK   rL   r   get_delivery_channel_display)/r:   r@   r'   r   r   r   r   r   r   r   r   	employees	to_emails
pk_or_textr2   context_instancemappingresultr   r   r   	cc_emailsr   r   email_backenddefault_emailr   r   r   display_email_namer  r   template_attachmenttemplate_bdycontext
render_bdytitle_templatetitle_contextrender_titlesouprl   r   r   r   r   r#   r   s/   ``                                       @@@@@@r   r   r   ]  s4    58( Q,,MII{{

3>>''//33x{{3Ch
(?(?@J!*"2"23K)+z7N7NOK*c"&..555DJJL !3!34 %h0fd#V$V$% VD#i.12I  ''9%
((
;	< n)* 
 YI!..== 

#% 	  @L@@ 1=WS\\^$WIW09:$$:H	B	B*,M!FFMJH77F+n0U	Q<<,,D$($6$6$8#9DJJ<q!I+J*+H g)	\\..F '1'F'F'J'J'LL#L+? '#+#4#45H5M5M#NL&..(8$*.6'.	G ".!4!4W!=J&&&( *BU*%g-* $,,]-?-?@L#,,Z8L"","*"	
 "((1
!**:+;+;< ((!6gF
 &,,];Z7]]T]2
 !
 !''	 
	 &&.8%%0F LLN&&'1%%=F LLN%j&M&M&O%PPST^S_`	
} #,gz1  Q X:"  	QLLKA3OPP	Q	FsU   AU	 1U59U5
U5+U:;U? 	V. 		U2U--U2?	V+V&&V+.V5))__doc__r   loggingrJ   r   rW   bs4r   djangor   django.core.mailr   	django.dbr   django.db.models.queryr   django.db.models.signalsr   r	   r
   django.dispatchr   horilla.horilla_middlewaresr   horilla.signalsr   r   notifications.signalsr   	getLoggerrn   r   classmethodr   setattrr0   r   r   r   r=   r   r   r   r   <module>r)     s   
        )  + E E $ 6 = (			8	$     +y ) ePG5Tj
r   