
    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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  ej,                  e      Zg Zg Zd
 Zy)z
pms/signals.py
    N)date)m2m_changedpost_delete	post_savepre_save)receiver)&check_relationship_with_employee_model)_thread_locals)pre_bulk_update)BonusPointSettingc                      ddl mm}  t        t        t
              t        t        t
              fd              }d fdfd                  y)	z
    Automation signals
    r   )get_model_classsplit_query_stringsenderc                 "                      y)z>
        signal method to handle automation post save
        N )r   instancekwargsstart_connectiontrack_previous_instances      /var/www/horilla/pms/signals.pyautomation_pre_createz/start_automation.<locals>.automation_pre_create    s     	!    c                      t         D ]#  } t        j                  | | j                         % t         j	                          y)z2
        Method to clear signals handlers
        r   N)SIGNAL_HANDLERSr   
disconnectmodel_classclearhandlers    r   clear_connectionz*start_automation.<locals>.clear_connection)   s7     ' 	FG  1D1DE	Fr   c                              t         j                  j                  d      } | D ]  }|j                  } |      t	              }d}d}|D ]I  \  }}|j
                  dk(  r|dk(  r|}|} n,|j
                  dk(  s|j
                  dk(  s?|dk(  sE|}|} n dfd		}|j                   d
}	 ||	|||      }
t        j                  |
       t        j                  |
|
j                          y)zQ
        Method to start signal connection accordingly to the automation
        T	is_activeNmembersManyToManyFieldmanagersowner
ForeignKeyc                 d    fd}| |_         |_        |_        |_        |_        |S )Nc                    dk(  r0t        t        j                  j                        
fd       }yt	        j
                         }|j                  }
j                  |j                  k(  rdrVrTt        |      }dk(  r,|j                         }|D ]  }	
j                  |	|||        y|}	
j                  |	|||       yt        d       yy)ze
                    Signal handler for post-save events of the model instances.
                    r'   r   c                 X   |dk(  s|dk(  s
|dk(  s|dk(  rt        j                         }|j                  }	j                  |j                  k(  rP
rBr@t        |
      }dk(  r|j                         }n|}|D ]  }	j                  ||||        yt        d       yyt        d       y)	zw
                            Handle m2m_changed signal for the members field in YourModel.
                            post_addpost_remove
post_clearr   r'   No type and fieldzNot post add.N)	r   todayend_date	bonus_forstatusgetattrallcreate_employee_bonuslogger)r   r   actionr   field_1field_2field_value	employeesemployeebonus_point_settingfieldtypes            r   members_changedzzstart_automation.<locals>.start_connection.<locals>.create_signal_handler.<locals>.signal_handler.<locals>.members_changedU   s     !'* 4#)]#:#)\#9#)[#8 +/**,*2*;*;#6#@#@HOO#S',6=h6N+/3D+D8C8II8CI8A ).H,?,U,U08'7H-.).
 )//B(C $T !' 7r   r1   N)r   r   r&   throughr   r2   r3   r4   r5   r6   r7   r8   r9   )r   r   argsr   rC   r;   r<   r=   r>   r?   r@   rA   r   rB   s             r   signal_handlerzastart_automation.<locals>.start_connection.<locals>.create_signal_handler.<locals>.signal_handlerO   s     00!+k6I6I6Q6QR8 S8> #'**,"*"3"3.88HOOK$.5h.F#'+<#<0;0AI4= %*(;(Q(Q,4gw)*%*
 0;H$7$M$M(0'7H%& !'': ;! Lr   )__name__r   rB   rA   r@   )namer@   rB   rA   rF   r   s    ``` r   create_signal_handlerzIstart_automation.<locals>.start_connection.<locals>.create_signal_handlerN   s9    8<t +/'-8*&*#',$5H2%%r   _signal_handler)rB   rA   r   )NN)r   objectsfiltermodelr	   applicable_foridr   appendr   connectr   )bonus_point_settingsr@   
model_pathrelated_fieldsrA   rB   
field_namerelation_typerI   handler_namedynamic_signal_handlerr   r"   r   s              @r   r   z*start_automation.<locals>.start_connection1   s&    	088??$?O#7 a	,22J)*5KCKPNED-; )
M'66)C%)::&E(D'66*D*99WD%5&E(D"@&F 2445_EL%:1E&" ""#9:&/E/Q/Qa	r   c                     d }  |         t         j                  j                  d      }|D ]R   j                        t	        t
              fd       _        _        t        j                         T 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   r   r   r   r    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.
                requestN)rO   )bonus_settingr   _instance_handler)	r6   r
   pkrK   rL   firstprevious_recordrO   rG   )r   r   r   r^   r_   instance_handlerr   s       r   rd   zKstart_automation.<locals>.track_previous_instance.<locals>.instance_handler   ss     ".)TB;;*2299X[[9IOOQH)6$,6N2 0=/?/?.@@Q,R )''r   N)
r   rK   rL   rM   r   r   r   r_   r[   rP   )r\   rR   r_   rd   r   r   s     @@@r   r   z1start_automation.<locals>.track_previous_instance   s    
	& 	)*088??$?O1 	7M)-*=*=>Kh{3( 4(" ,7(-:*$$%561	7r   N)#horilla_automations.methods.methodsr   r   r   r   r   r   )r   r   r"   r   r   r   s     @@@@r   start_automationrf      sS     Xk"34i 12" 3 5" gR(7T r   )__doc__copylogging	threadingtypesdatetimer   django.db.models.signalsr   r   r   r   django.dispatchr   employee.methods.methodsr	   horilla.horilla_middlewaresr
   horilla.signalsr   
pms.modelsr   	getLoggerrG   r9   r   r[   rf   r   r   r   <module>rt      sU         R R $ K 6 + (			8	$  kr   