
    vg>                         d 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mZmZ ddlmZ dd	lmZ dd
lmZmZ  ej0                  e      Zed        Z eede       g Zg Zd Z d Z!d Z"y)z 
horilla_automation/signals.py

    N)template)EmailMessage)models)QuerySet)post_delete	post_savepre_save)receiver)_thread_locals)post_bulk_updatepre_bulk_updatec                 `     | |d   j                         }t        |      |_        d|_        |S )Nr   )model )	__class__list_result_cache_prefetch_related_lookups)clsobject_listqueryset_like_objects      //var/www/horilla/horilla_automations/signals.py	from_listr      s6     [^%=%=>)-k):&572    r   c                  B  	
 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 d	 f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_signal/        	!r   c                 "                      yr#   r   r$   s      r   template_signalz)start_automation.<locals>.template_signal8   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_connectionA   sO     ' 	MG  1D1DE''8K8KL	M 	r   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
automationr8   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_handlerL   sX     "(It<+4X+> 	x,B5,I)+#!&)$-	 r   previous_bulk_recordr<   queryset_copy)targetargs)r9   r   get	threadingThreadstart)r!   r<   rF   r&   rB   rC   r=   previous_querysetbulk_threadr>   rA   s            r   post_bulk_update_handlerz[start_automation.<locals>.create_post_bulk_update_handler.<locals>.post_bulk_update_handlerK   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__r0   r>   )r>   r0   rA   rM   	func_namer3   s   ` `   r   create_post_bulk_update_handlerz9start_automation.<locals>.create_post_bulk_update_handlerJ   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.
                    r8   Nprevious_recordr%   c                      t          S N)r;   )rF   s   r   <lambda>zsstart_automation.<locals>.start_connection.<locals>.create_signal_handler.<locals>.signal_handler.<locals>.<lambda>   s    ':D'A r   rE   )r9   r   rH   rI   rJ   )r!   r%   createdr&   r8   rd   r@   threadrF   r>   rA   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__r0   r>   )rP   r>   rA   rk   r0   s    `` r   create_signal_handlerzIstart_automation.<locals>.start_connection.<locals>.create_signal_handler   s(    #. +/'-8*,6)%%r   _signal_handlerN)objectsfiltercondition_querystringreplacer   r.   appendr   connectrT   r   r0   )automationsr>   rq   rA   
model_pathr3   rm   handler_namedynamic_signal_handlerr0   r   r4   r\   r   r   s            @r   r'   z*start_automation.<locals>.start_connectionz   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   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 )Nr8   )r>   r<   rD   )
r9   r   nonecountr   r   copydeepcopyr   rC   )r!   r<   rF   r&   r8   rD   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_handlerrO   rS   )r>   r0   r   r[   r3   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	   r/   r0   r   r1   r2   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.
                r8   N)id)r>   r%   _instance_handler)	r9   r   pkro   rp   firstrd   rT   rl   )r!   r%   r&   r8   r>   instance_handlerr0   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)ro   rp   r   r   rs   r   rt   r
   r	   r0   r>   )	r   ru   r3   r>   r   r0   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   )r   r)   r,   r   r4   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" .`= =~<.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   getlistr9   
isinstancer   Modelstrr   r   values_listrs   rG   trigger	send_mailset)r8   ri   r>   rA   r%   r@   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           
      &  "# ddl m} ddlm}m} ddlm}m} ddlm	} |j                  }	 |||j                        }
 ||j                        } |||j                        }|j                  j                  |
      j                         }g } ||j                         D ]2  } |||      }t#        |t$              r||z   }"|j'                  |       4 t%        t        d|            }|dd }|dd }	 |j(                  j+                  d	      j-                         }|j/                         r|j1                  d
 |D                |       }|j8                  }| rN	 | j:                  j<                  j?                          d| j:                  j<                  j@                   d}|}|g}|r| r|rg }	 | j:                  j<                  }|jB                  j-                         D ]r  }tE        jF                  |jH                        }tE        jJ                  ||d      }|jM                  |      }|j'                  d ||i dd      jN                  df       t tE        jF                  |	jH                        }tE        jJ                  |||d      }|jM                  |      }tE        jF                  |jP                        }tE        jJ                  ||d      }|jM                  |      } tS        | |||      #d#_*        |#_+        d "tY        jZ                  "#fd      }!|!j]                          yyyy# t2        $ r }t4        j7                  |       Y d}~d}~ww xY w#  t4        j7                  t2               Y xY w#  d}Y xY w)z
    mail sending method
    r   )ConfiguredEmailBackend)eval_validategenerate_pdf)r   get_related_field_modelr   )r   Nr   employee_work_infoc              3   n   K   | ]-  }|j                         rt        |j                                / y wrf   )get_mailr   ).0employees     r   	<genexpr>zsend_mail.<locals>.<genexpr>v  s2      $$& H%%'(s   35z <>)r%   selfDocumentF)pathtitlezapplication/pdf)r%   r   model_instance)subjectbodytocc
from_emailreply_tohtmlc                 |    	 | j                          y # t        $ r}t        j                  |       Y d }~y d }~ww xY wrf   )send	Exceptionloggererror)emailes     r   
_send_mailzsend_mail.<locals>._send_mail  s-     

  Q s    	;6;c                              S rf   r   )r   r   s   r   rg   zsend_mail.<locals>.<lambda>  s    :e, r   rh   )/base.backendsr   base.methodsr   r   r   r   r   r   r   mail_templatemail_detailsr   ro   rp   r   mail_tor   r   rs   also_sent_toselect_relatedallexistsextendr   r   r   $dynamic_from_email_with_display_nameuseremployee_getget_full_namer   template_attachmentsr   Templater   Contextrendercontentr   r   content_subtypeattachmentsrH   rI   rJ   )$r8   r>   r%   r   r   r   r   r   r   r   r   r0   mail_to_instancetosmappingresultr   r   r   r   email_backenddisplay_email_namer   r   r   r!   template_attachmenttemplate_bdycontext
render_bdytitle_templatetitle_contextrender_titlerj   r   r   s$                                     @@r   r   r   U  sk    58 Q,,M	h
 7 7	8B!*"2"23K)+z7N7NOK"**11R18>>@
C !3!34 .8fd#,C

6 vdC 
!C	RaB	QRB!..== 

#% 	  II  ,  +,M&KK	$$+LL$=$=$K$K$M#NbQXQ]Q]QjQjQpQpPqqr!s+J*+H G	\\..F $.#B#B#F#F#H 
	#,,-@-E-EFL&&4Df'UVG%,,W5J Re:NVV%	
	  ((););<"")6XV
 "((1
!**:+;+;< ((h)OP%,,]; !
 !''	  !!,
 	a ),G  Q	$LL#	Fs2   6AL< AM( 6N	 <	M%M  M%(N	N)#__doc__r}   loggingrH   rU   djangor   django.core.mailr   	django.dbr   django.db.models.queryr   django.db.models.signalsr   r   r	   django.dispatchr
   horilla.horilla_middlewaresr   horilla.signalsr   r   	getLoggerrl   r   classmethodr   setattrr.   r   r   r;   r   r   r   r   <module>r     s   
      )  + E E $ 6 =			8	$     +y ) aHG5Tbr   