
    six!                        d 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 ddlmZ ddlmZmZ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Z' G d d      Z( G d d      Z) G d d      Z*y)z
middleware.py
    )apps)messages)logout)cache)Q)redirect)gettext_lazy)ConfiguredEmailBackend)
AllCompany)HorillaCompanyManager)CompanyShiftRequestWorkTypeRequest)DisciplinaryActionEmployeeEmployeeBankDetailsEmployeeWorkInformation)TWO_FACTORS_AUTHENTICATION)APPS)get_horilla_model_class)DocumentRequest horilla_company_models_cache_keyc                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	CompanyMiddlewarezE
    Middleware to handle company-specific filtering for models.
    c                     || _         y Nget_responseselfr   s     3/var/www/python-projects/worksol/base/middleware.py__init__zCompanyMiddleware.__init__$   
    (    c                 f   t        |dd      r|j                  j                  s	 |j                  j	                  dd      x}r5|dk7  r.t
        j                  j                  |      j                         S dS t        |j                  j                  j                  dd      S y# t        $ r Y yw xY w)zF
        Retrieve the company ID from the request or session.
        userFselected_companyNall)id
company_id)getattrr&   is_anonymoussessiongetr   objectsfilterfirstemployee_getemployee_work_infoAttributeError)r    requestcom_ids      r!   _get_company_idz!CompanyMiddleware._get_company_id'   s     7FE*7<<3L3L$__001CTJJ6J "U?  ..&.9??A " #11DDlTX 
  " s   AB$ 6B$ 8*B$ $	B0/B0c                    	 |j                   j                  }t        t        |dd      dd      }|r|j                  j                  d      dk7  rq|dk(  rd}n
||k(  rd	}nd
}t        |j                        |j                  d<   |j                  |j                  j                  ||j                  d|j                  d<   yd|j                  d<   t!               }|j                  |j                  j                  |j"                  |j                  d|j                  d<   y# t        $ r8 t        |       t	        j
                  |t        d             t        d      cY S w xY w)zG
        Set the company session data based on the company ID.
        z>An employee related to this user's credentials does not exist.loginr3   Nr*   r'   r(   zAll companiesz
My CompanyzOther Company)companyicontextr)   selected_company_instance)r&   r2   	Exceptionr   r   error_r   r+   r-   r.   strr)   r:   r;   urlr   r<   )r    r5   r*   r&   user_company_idr<   all_companys          r!   _set_company_sessionz&CompanyMiddleware._set_company_session;   sE   	%<<,,D "D.5|T
 '//--.@AUJU"&.#&25jmm2DGOO./%--"++ mm	<GOO78 38GOO./$,K&..#((,,#((!nn	<GOO789  	%7ONNRS G$$	%s   D! !>E"!E"c           
         || j                         v }t        |dd      }t        |j                  t              }t        |j                  dd      }|rC|r|j                  dt        |             y|r!|r|j                  dt        d	i ||i       yyy|r*|j                  dt        |      t        d      z         y|r2|r/|j                  dt        d	i ||it        d	i | ddiz         yyy)
z@
        Add company filter to the model if applicable.
        r*   Nrelated_company_fieldcompany_filter)r*   T)company_id__isnull__isnull )_get_company_modelsr+   
isinstancer/   r   add_to_classr   )r    modelr*   is_company_modelcompany_fieldis_horilla_managerrG   s          r!   _add_company_filterz%CompanyMiddleware._add_company_filterd   s    !D$<$<$>>|T:'7LM '7NPT U""#3Q*5MN#(=""$a&N+@**M&N )>#
 ""$,qD/II $(=""$<.
;<E34H=tDEF )>#r$   c           
         t        j                  t              }|t        t        t
        t        t        t        t        g}ddgg dddgg dg ddgd	gd
gd}|j                         D ]D  \  }}t        j                  |      s|j                  |D cg c]  }t        ||       c}       F t        j                  t        |       |S c c}w )zH
        Retrieve the list of models that are company-specific.
        recruitment	candidate)leaverequestrestrictleaveavailableleaveleaveallocationrequestcompensatoryleaverequestassetassignmentassetrequest)
attendanceattendanceactivityattendanceovertimeworkrecords)contractloanaccountpayslipreimbursementticketoffboardingemployeeobjective)rU   leaveassetr^   payrollhelpdeskrg   pms)r   r.   	CACHE_KEYr   r   r   r   r   r   r   itemsr   is_installedextendr   set)r    company_modelsapp_model_mappings	app_labelmodelsrO   s         r!   rL   z%CompanyMiddleware._get_company_models   s     9-!"#'N !.{; ,^< &J -+,1"6 &8%=%=%? !	6$$Y/"))PVWu0EBW IIi0 Xs   C
c                 l   t        |dd      r|j                  j                  sz| j                  |      }| j	                  ||       t        j                         D cg c]!  }|j                  j                  t        v s |# }}|D ]  }| j                  ||        | j                  |      }|S c c}w )Nr&   F)r+   r&   r,   r7   rE   r   
get_models_metaru   r   rS   r   )r    r5   r*   rO   
app_modelsresponses         r!   __call__zCompanyMiddleware.__call__   s    7FE*7<<3L3L--g6J%%gz: $(??#48M8MQU8UJ  $ <((
;< $$W-s   !B1?B1N)
__name__
__module____qualname____doc__r"   r7   rE   rS   rL   r|   rK   r$   r!   r   r      s'    )('R:4lr$   r   c                       e Zd ZdZd Zd Zy)ForcePasswordChangeMiddlewarez@
    Middleware to force password change for new employees.
    c                     || _         y r   r   r   s     r!   r"   z&ForcePasswordChangeMiddleware.__init__   r#   r$   c                    g d}|j                   j                  d      |v r| j                  |      S t        |d      r8|j                  j
                  r"t        |j                  dd      rt        d      S | j                  |      S )N)/change-password/login/logout/r&   is_new_employeeFzchange-password)pathrstripr   hasattrr&   is_authenticatedr+   r   )r    r5   excluded_pathss      r!   r|   z&ForcePasswordChangeMiddleware.__call__   ss    B<<s#~5$$W--7F#(E(Ew||%6> 122  ))r$   Nr}   r~   r   r   r"   r|   rK   r$   r!   r   r      s    )	*r$   r   c                       e Zd ZdZd Zd Zy)TwoFactorAuthMiddlewarezM
    Middleware to enforce two-factor authentication for specific users.
    c                     || _         y r   r   r   s     r!   r"   z TwoFactorAuthMiddleware.__init__   r#   r$   c                    g d}|j                   j                  d      |v r| j                  |      S t        ro	 t	               j
                  It        |d      rN|j                  j                  r8|j                  j                  dd      st        d      S | j                  |      S | j                  |      S # t        $ r}| j                  |      cY d }~S d }~ww xY w)N)r   r   r   /two-factorz	/send-otpr   r&   otp_code_verifiedFr   )r   r   r   r   r
   configurationr   r&   r   r-   r.   r   r>   )r    r5   r   es       r!   r|   z TwoFactorAuthMiddleware.__call__   s    
 <<s#~5$$W--%2)+99Ew/GLL4Q4Q&223FN#+M#::,,W55   ))  2((112s$   AB9 B9 9	CCCCNr   rK   r$   r!   r   r      s    )*r$   r   N)+r   django.appsr   django.contribr   django.contrib.authr   django.core.cacher   django.db.modelsr   django.shortcutsr   django.utils.translationr	   r@   base.backendsr
   base.context_processorsr   base.horilla_company_managerr   base.modelsr   r   r   employee.modelsr   r   r   r   horilla.horilla_appsr   horilla.horilla_settingsr   horilla.methodsr   horilla_documents.modelsr   rn   r   r   r   rK   r$   r!   <module>r      sn     # & #  % 6 0 . > > >  < ) 3 4.	d dN* *(* *r$   