
    si!                        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 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mZ d dlmZ  eee      d        Zd Z  eeejB                  jD                        d        Z# e jH                  d      Z%i Z&i Z'ejP                  jS                  d      Z* ee      d        Z+ G d d      Z,ejZ                  j]                  d       y)    N)datetime)apps)settings)messages)user_login_failed)MaxQ)m2m_changedpost_migrate	post_save)receiver)Http404)redirectrender)AnnouncementPenaltyAccounts)get_horilla_model_class)senderc                    |r]|j                   }t        j                  d      rX|rUt        dd      } |       }|j                  rH|j                  j                          d|_        |j                  j                  j                  |_	        n{|j                  r:d|j                  j                   |_        |j                  j                  |_	        n5dt        j                          |_        t        j                         |_	        d|_        d|_        |j                   |_        d|_        |j%                          d|_        |j&                  j)                  |j*                         |j%                          t        j                  d	      r|j,                  r|j.                  r|j*                  j0                  j3                  |j,                  
      j5                         }t7        |j.                  dz        dz  }|j8                  st;        d|j<                  |z
        |_        nt;        d|j>                  |z
        |_        |j%                          yyyyy)zY
    This is post save method, used to create deduction and cut available leave days
    payroll	deduction)	app_labelmodelz penaltyzLeave penalty zPenalty on FTleave)leave_type_id   r   N) penalty_amountr   is_installedr   late_early_idget_type_displaytitleattendance_idattendance_dateone_time_dateleave_request_idend_dater   todayinclude_active_employeesis_fixedamountonly_show_under_employeesavespecific_employeesaddemployee_idr   minus_leavesavailable_leavefilterfirstrounddeduct_from_carry_forwardmaxavailable_dayscarryforward_days)	r   instancecreatedkwargsr   	Deductionpenalty	availableunits	            0/var/www/python-projects/worksol/base/signals.py&create_deduction_cutleave_from_penaltyrA      s    !00Y'N/);WIkG%%#+#9#9#J#J#L"MX V**88HH % **"01J1J1S1S0T U(0(A(A(J(J%"-hnn.>-? @(0(8%/4G,#G%44GN/3G,LLN/4G,&&**8+?+?@LLN g&&&%% ,,<<CC&44 D eg  ..23a7D55+.q93K3Kd3R+T	(.1	33d:/	+ NN & ' '5     c                 ^   | j                   dvry ddlm} |j                  j	                  d      j                  dd      j                  t        d      	      }d}|D ]L  }||j                  j                  |d   |d   
      j	                  |d         j                         d   z  }N y )N)
attendancer   )WorkRecordsDFT)work_record_typer/   dateid)	latest_id)r/   rH   rJ   )rI   )
labelattendance.modelsrE   objectsexcludevaluesannotater   r2   delete)r   r;   rE   latest_recordsdeleted_countrecords         r@   clean_work_recordsrU   G   s    ||>)- 	##U#;	v	&	CI	&  M  
&&"=1v '  W{+W,VXa		

rB   c                    |dvryt        |j                  j                  dd            }t        |j                  j                  dd            }t        |j                  j                  dd            }|j
                  j                  j                  t        |      t        |      z  t        |      z        }|j                  j                  |       y)	z
    filtered employees
    )post_addpost_remove
post_clearNrI   T)flat)id__in)%employee_work_info__department_id__in)'employee_work_info__job_position_id__in)list	employeesvalues_list
departmentjob_positionmodel_employeerM   r2   r	   filtered_employeesset)r   r9   actionr;   employee_idsdepartment_idsjob_position_idsr_   s           r@   rd   rd   ^   s    
 >>**66t$6GHL(--99$T9JKNH11==d=NO''//66	
.
A	B
4D
E	FI ##I.rB   zdjango.securityzsecurity.logc                    t         syt        t        dd      }t        t        dd      }|j                  dd      }|j                  j                  dd      }|j
                  j                  xs |j
                  j                         }|t        v rst        |   t        j                         kD  rUt        j                  d	t        j                  t        |               }	t        j                  |d
|	 d       t        d      S |t        v r4t        |   t        j                         k  rt        |= |t        v rt        |= |t        vr	dt        |<   t        |xx   dz  cc<   |t        |   z
  }
t         j#                  d| d|        t        |   |k\  rFt        j                         |z   t        |<   t        j                  |d|dz   d       t        d      S t        j                  |d|
 d       t        d      S )ak  
    To ban the IP of user that enter wrong credentials for multiple times
    you should add this section in your settings.py file. And also it creates the security file for deatils of wrong logins.


    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'security_file': {
                'level': 'WARNING',
                'class': 'logging.FileHandler',
                'filename': '/var/log/django/security.log', # File Path for view the log details.
                                                            # Give the same path to the section FAIL2BAN_LOG_ENABLED = os.path.exists('security.log') in signals.py in Base.
            },
        },
        'loggers': {
            'django.security': {
                'handlers': ['security_file'],
                'level': 'WARNING',
                'propagate': False,
            },
        },
    }

    # This section is for giving the maxtry and bantime

    FAIL2BAN_MAX_RETRY = 3        # Same as maxretry in jail.local
    FAIL2BAN_BAN_TIME = 300       # Same as bantime in jail.local (in seconds)

    NFAIL2BAN_MAX_RETRY   FAIL2BAN_BAN_TIMEi,  usernameunknownREMOTE_ADDR%H:%MYou are banned until . Please try again later./r      z Invalid login attempt for user 'z' from zYou have been banned for <   z/ minutes due to multiple failed login attempts.z	You have z. login attempt(s) left before a temporary ban.login)FAIL2BAN_LOG_ENABLEDgetattrr   getMETAsessionsession_key_get_or_create_session_keyban_timetimestrftime	localtimer   infor   failed_attemptsloggerwarning)r   credentialsrequestr;   max_attemptsban_durationrn   ipr}   banned_untilattempts_lefts              r@   log_login_failedr      s   F  8%91=L8%8#>Lz95H			-	3B##Sw'Q'Q'S 
 h8K#8499;#F}}WdnnXk=R.ST,\N:ST	
 } h8K#8DIIK#G[!/), /)'($K A%  ?;#??M
NN5hZwrdKL{#|3 $		l :'(:';;jk	
 }MM
M?"PQ GrB   c                       e Zd ZdZd Zd Zy)Fail2BanMiddlewarez@
    Middleware to force password change for new employees.
    c                     || _         y )N)get_response)selfr   s     r@   __init__zFail2BanMiddleware.__init__   s
    (rB   c                    |j                   j                  }|s|j                   j                          |t        v rtt        |   t	        j                         kD  rVt	        j
                  dt	        j                  t        |               }t        j                  |d| d       t        |d      S |t        v r4t        |   t	        j                         k  rt        |= |t        v rt        |= | j                  |      S )Nrq   rr   rs   z403.html)r|   r}   creater   r   r   r   r   r   r   r   r   )r   r   r}   r   s       r@   __call__zFail2BanMiddleware.__call__   s    oo11OO""$ ("x'<tyy{'J==$..+AV2WXLMM0>WX ':.. ("x'<		'K%o-#K0  ))rB   N)__name__
__module____qualname____doc__r   r    rB   r@   r   r      s    )*rB   r   zbase.signals.Fail2BanMiddleware)/loggingosr   r   django.appsr   django.confr   django.contribr   django.contrib.auth.signalsr   django.db.modelsr   r	   django.db.models.signalsr
   r   r   django.dispatchr   django.httpr   django.shortcutsr   r   base.modelsr   r   horilla.methodsr   rA   rU   r_   throughrd   	getLoggerr   r   r   pathexistsrx   r   r   
MIDDLEWAREappendr   rB   r@   <module>r      s     	      # 9 # I I $  - 5 3 
)O,. -.d
. 
+l44<<=/ >/( 
		,	- ww~~  

Q Qh* *< 	    < =rB   