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

This module contains custom Django filters and filter sets for
the PMS (Performance Management System) app.
    N)	timedelta)relativedelta)forms)timezone)
DateFilterDateFromToRangeFilter)	FilterSet)reload_queryset)HorillaFilterSet)AnonymousFeedbackBonusPointSettingEmployeeBonusPointEmployeeKeyResultEmployeeObjectiveFeedback	KeyResultMeetings	ObjectivePeriodQuestionTemplatec                       e Zd ZdZd Zy)DateRangeFilterz
    A custom Django filter for filtering querysets based on date ranges.

    This filter allows you to filter a queryset based on date ranges such as 'today',
    'yesterday', 'week', or 'month' in the 'created_at' field of model.
    c                 Z   |r|dk(  rOt         j                   j                         j                         }|j                  d      }|j	                  |      }|dk(  rZt         j                  j                         }|t        j                  d      z
  }|j                  d      }|j	                  |      }|dk(  rtt         j                  j                         }|t        j                  |j                               z
  }|t        j                  d      z   }|j	                  ||g	      }|S |d
k(  rvt         j                  j                         }t        j                  |j                  |j                  d      }|t        j                  d      z   }	|j	                  ||	g	      }|S Ntodayz%Y-%m-%d)created_at__startswith	yesterday   daysweek   )created_at__rangemonth   
datetimenowdatestrftimefilterr   r   weekdayyearr$   
selfqsvaluer   formatted_dater   start_of_weekend_of_weekstart_of_monthend_of_months
             //var/www/python-projects/worksol/pms/filters.pyr+   zDateRangeFilter.filter,   a    ))--/446!&
!;YYnYE# ++-!H$6$6A$>>	!*!3!3J!?YYnYE ++- %(:(:(P P+h.@.@a.HHYY-1MYN 	 '! ++-!)uzz5;;!J-0B0B0KKYY.,1OYP	    N)__name__
__module____qualname____doc__r+    r9   r7   r   r   $   s    r9   r   c                        e Zd Z fdZ xZS )CustomFilterSetc                 B   t        |   |i | t        | j                  j                         | j                  j                  j                         D ]  \  }}| j                  |   }|j                  j                  }t        |t        j                  t        j                  t        j                  f      r)|j                  j                  j                  ddi       nt        |t        j                   f      r(|j                  j                  j                  ddi       nt        |t        j"                        r(|j                  j                  j                  ddi       nt        |t        j$                  t        j&                  f      r(|j                  j                  j                  ddi       nAt        |t        j(                        r'|j                  j                  j                  ddi       t        |t*        j,                        sd|_         y )Nclassoh-input w-100z/oh-select oh-select-2 select2-hidden-accessiblezoh-switch__checkbox	icontains)super__init__r
   formfieldsitemsfiltersfieldwidget
isinstancer   NumberInput
EmailInput	TextInputattrsupdateSelectTextareaCheckboxInputCheckboxSelectMultipleModelChoiceFielddjango_filters
CharFilterlookup_expr)r/   argskwargs
field_namerK   filter_widgetrL   	__class__s          r7   rF   zCustomFilterSet.__init__I   s   $)&)		(()!%!1!1!7!7!9 	0J LL4M"((//F**E,<,<eooN ""))74D*EFFU\\O4""))!R
 FU^^5""))74D*EF''00 ""))74I*JKFU%;%;=""))!R
 %!:!:;$/!=	0r9   )r:   r;   r<   rF   __classcell__r_   s   @r7   r@   r@   H   s    !0 !0r9   r@   c                   V    e Zd ZdZ ej
                  d      Z G d d      ZdefdZ	y)	ActualObjectiveFilterz
    ActualObjectiveFilter
    search_methodmethodc                       e Zd ZeZg dZy)ActualObjectiveFilter.Meta)managersarchive	assigneesduration!employee_objective__key_result_idN)r:   r;   r<   r   modelrH   r>   r9   r7   Metarh   t   s    
r9   ro   r1   c                 \   |j                  d      }|j                  j                  j                         }|D ]c  }||j	                  |      |j	                  |      z  |j	                  |      z  |j	                  |      z  |j	                  |      z  z  }e |j                         S )G
        This method is used to search employees and objective
         )(managers__employee_first_name__icontains)'managers__employee_last_name__icontains))assignees__employee_first_name__icontains)(assignees__employee_last_name__icontainstitle__icontainssplitrn   objectsnoner+   distinctr/   queryset_r1   valuesemptyrz   s          r7   rd   z#ActualObjectiveFilter.search_method~   s     S!&&++- 	EO//%/PQ//E/RS //5/QR //5/9	:E	 ~~r9   N
r:   r;   r<   r=   rX   rY   searchro   strrd   r>   r9   r7   rc   rc   m   s1     '^&&o>F
 
   r9   rc   c                      e Zd ZdZ ej
                  d      Z ej
                  d      Z ej
                  d      Z ej
                  d      Z	 ej
                  d      Z
 ed	      Z e ej                  d
dd            Z e ej                  d
dd            Z e ej                  d
dd            Z e ej                  d
dd            Z G d d      ZdefdZy)ObjectiveFilterz
    Custom filter set for EmployeeObjective records.

    This filter set allows to filter EmployeeObjective records based on various criteria.
    idr]   key_result_idprogress_percentageobjective_id__managersrd   re   
created_atr)   oh-input  w-100typerB   rQ   rL   c                       e Zd ZdZeZg dZy)ObjectiveFilter.MetaT
        A nested class that specifies the model and fields for the filter.
        )		objectivestatusemployee_idr   
start_date
updated_atend_daterj   objective_idN)r:   r;   r<   r=   r   rn   rH   r>   r9   r7   ro   r      s    	 "

r9   ro   r1   c                     |j                  d      }|j                  j                  j                         }|D ]=  }||j	                  |      |j	                  |      z  |j	                  |      z  z  }? |S )zI
        This method is used to search in managers and objective
        rr   )objective_id__title__icontains)6objective_id__managers__employee_first_name__icontains)5objective_id__managers__employee_last_name__icontains)rz   rn   r{   r|   r+   r~   s          r7   rd   zObjectiveFilter.search_method   s     S!&&++- 		EuE//KP "  //JO " 	E		 r9   N)r:   r;   r<   r=   rX   rY   employee_objectiverm   'employee_objective__progress_percentageri   r   r   created_at_date_ranger   r   	DateInputr   r   r   r   ro   r   rd   r>   r9   r7   r   r      s    322dC(A(A(A")% /Hn.G.G(/+ )~((4LMH&^&&o>F+|Duf?P%QRJ uf?P%QRJ uf?P%QRJ uf?P%QRH

 
$ r9   r   )) AlloverdueOverdue	due_todayz	Due Todaydue_this_weekzDue This Weekdue_this_monthzDue This Monthc                   V   e Zd ZdZ ej
                  ded ej                               Z	 ej                  d      Z ej                  d      Z ej                  d	      Z ed
ej                   j#                  ddd            Z e ej(                  ddd            Z e ej(                  ddd            Z edej                   j#                  ddd            Z edej                   j#                  ddd            Z G d d      Zd Zd ZdefdZy)FeedbackFilterz
    Custom filter set for Feedback records.

    This filter set allows to filter Feedback records based on various criteria.
    z
Quick Datefilter_due_date)labelchoicesrf   rL   filter_offboarding_employeesre   rd   rD   rZ   r   r)   rC   r   r   )r]   rL   r   r   r   r   c                       e Zd ZdZeZg dZy)FeedbackFilter.Metar   )
manager_idr   colleague_idsubordinate_idquestion_template_idr   rj   r   r   employee_key_results_idcyclic_feedbackcyclic_feedback_days_countcyclic_feedback_periodcyclic_next_start_datecyclic_next_end_datestart_date_rangeend_date_rangeN)r:   r;   r<   r=   r   rn   rH   r>   r9   r7   ro   r     s    	 
r9   ro   c                    |j                  d      }t        j                         j                         }|dk(  r|j	                  |      S |dk(  r|j	                  |      S |dk(  r@|t        |j                               z
  }|t        d	      z   }|j	                  ||f
      S |dk(  rB|j                  d      }|t        d      z   t        d      z
  }|j	                  ||f
      S |S )!
        Filter due date
        Closed)status__iexactr   end_date__ltr   r   r   r   r"   end_date__ranger   r   daymonths)	excluder   r(   r)   r+   r   r,   replacer   )	r/   r   namer1   r   r3   r4   	first_daylast_days	            r7   r   zFeedbackFilter.filter_due_date(  s     ##8#<##%I???66k!??E?22o%!I5==?$CCM')*;;K??M;3O?PP&&!,I!M$;;ya?PPH??Ix3H?IIr9   c                 p    |j                  |       |j                  |       z  }|j                         S )z.
        Filter offboarding employees
        )(employee_id__offboardingemployee__isnull)&employee_id__resignationletter__isnull)r+   r}   r/   r   r   r1   s       r7   r   z+FeedbackFilter.filter_offboarding_employees>  sC     ??9>Y # 
OOu9OMN   ""r9   r1   c                    |j                         }|d   }t        |      dkD  rdj                  |dd       nd}|j                         }|r8|r6|j	                  ||      |j	                  |      z  }|j                         S |r5|j	                  |      |j	                  |      z  }|j                         S |r%|j	                  |	      |j	                  |      z  }|j                         S )

        Search Method
        r   r   rr   Nr   )+employee_id__employee_first_name__icontains*employee_id__employee_last_name__icontains)review_cycle__icontainsr   r   )rz   lenjoinr|   r+   r}   )r/   r   r   r1   parts
first_name	last_nameqrsts           r7   rd   zFeedbackFilter.search_methodG  s     1X
+.u:>CHHU12Y'r	}})??<F;D #  >?D }} ??<F # >?D }}	 ??;D # >?D }}r9   N)r:   r;   r<   r=   rX   ChoiceFilterDUE_DATE_CHOICESr   HiddenInputdue_date_quick_filterBooleanFilteroffboarding_employeesrY   r   review_cycler   widgetsRangeWidgetr   r   r   r   r   r   r   r   ro   r   r   r   rd   r>   r9   r7   r   r      sd    8N77   u  "	 9N88- '^&&o>F,>,,EL+%%11!,<= 2 
 uf?P%QRJ uf?P%QRH
 -%%11!,<= 2 
 +%%11!,<= 2 
N
 
4,# r9   r   c                       e Zd ZdZ ed      Z ej                  dd ej                  ddi            Z
 ej                  dd	 ej                  ddi            Z G d
 d      Zy)AnonymousFeedbackFilterz
    Custom filter set for AnonymousFeedback records.

    This filter set allows to filter AnonymousFeedback records based on various criteria.
    r   r   gter   r)   r   r]   rZ   rL   ltec                       e Zd ZdZeZdZy)AnonymousFeedbackFilter.Metar   __all__Nr:   r;   r<   r=   r   rn   rH   r>   r9   r7   ro   r   r      	 "r9   ro   N)r:   r;   r<   r=   r   r   rX   r   r   r   r   r   ro   r>   r9   r7   r   r   _  sv     ,|D***uff%56J
 )~((uff%56H r9   r   c                   H   e Zd ZdZ ej
                  ddg d      Z ej                  dd      Z ej                  dd	      Z	 ej                  dd
      Z ej                  d	d
      Z ej                  dd      Z ej                  d	d      Zd Z G d d      Zy)KeyResultFilterz
    KeyResult Filter
    r   Duer   r   r   )due_next_monthzDue Next Monthr   rf   r   r   r   r   r]   rZ   r   r   )rZ   r]   r   c                 f   t        j                         j                         }|dk(  r|j                  |      S |dk(  r@|t	        |j                               z
  }|t	        d      z   }|j                  ||f      S |dk(  rB|j                  d	      }|t        d
      z   t	        d      z
  }|j                  ||f      S |dk(  rO|t        d
      z   j                  d	      }|t        d
      z   t	        d      z
  }|j                  ||f      S |dk(  r|j                  |      S |S )r   r   r   r   r   r"   r   r   r   r   r   r   r   r   r   r(   r)   r+   r   r,   r   r   r/   r   r   r1   r   startends          r7   r   zKeyResultFilter.filter_due_date  s+    ##%K??E?22o%I5==?;;E)++C??E3<?@@&&MMaM(E=22iQ6GGC??E3<?@@&&]!44==!=DE=22iQ6GGC??E3<?@@i???66r9   c                       e Zd ZeZdZy)KeyResultFilter.Metar   N)r:   r;   r<   r   rn   rH   r>   r9   r7   ro   r        !r9   ro   N)r:   r;   r<   r=   rX   r   dueNumberFilterkr_progress_percentage__gtekr_progress_percentage__lterY   kr_start_date_fromkr_start_date_tillkr_end_date_fromkr_end_date_tillr   ro   r>   r9   r7   r   r   {  s     &.
%
% 

C #>."="=(e# #>."="=(e# 322l 322l 1~00j 1~00j2 r9   r   c                   V    e Zd ZdZ ej
                  d      Z G d d      ZdefdZ	y)	ActualKeyResultFilterz(
    Filter through KeyResult model
    rd   re   c                       e Zd ZeZg dZy)ActualKeyResultFilter.Meta)progress_typetarget_valuerl   
company_idN)r:   r;   r<   r   rn   rH   r>   r9   r7   ro   r    s    Lr9   ro   r1   c                     |j                  d      }|j                  j                  j                         }|D ]  }||j	                  |      z  } |j                         S )rq   rr   rw   ry   r~   s          r7   rd   z#ActualKeyResultFilter.search_method  s_     S!&&++- 	FEX__e_DEE	F ~~r9   Nr   r>   r9   r7   r  r    s3     '^&&o>FM M	  	 r9   r  c                       e Zd ZdZg dZy)ObjectiveReGroupz:
    Class to keep the field name for group by option
    ))r   select)r   Owner)r   StatusN)r:   r;   r<   r=   rH   r>   r9   r7   r  r    s    Fr9   r  c                      e Zd ZdZ ej
                  d      Z ej                  dd ej                  ddi      	      Z
 ej                  dd
 ej                  ddi      	      Z ej                  dd ej                  ddi      	      Z ej                  dd
 ej                  ddi      	      Z ej                  dd ej                  ddi            Z ej                  dd
 ej                  ddi            Z ej                  dd ej                  ddi            Z ej                  dd
 ej                  ddi            Z ej$                  ddg d      Z ej(                  dd      Z ej(                  dd
      Z ej(                  d      Z ej(                  d      Zd Zd Zd Zd Zd Zd Zd Z G d d       Z d!e!fd"Z"y#)$EmployeeObjectiveFilterz0
    Filter through EmployeeObjective model
    rd   re   r   r   r   r)   r   r   r   r   kr_start_date_till_method)rf   rZ   rL   kr_end_date_from_methodkr_end_date_till_methodr   r   r   r   r   r  kr_progress_gtekr_progress_ltec                 &    |j                  |      S )
        Kr filter
        )$employee_key_result__start_date__gter+   r   s       r7   kr_start_date_from_methodz1EmployeeObjectiveFilter.kr_start_date_from_method$       EJJr9   c                 &    |j                  |      S )r'  )$employee_key_result__start_date__lter)  r   s       r7   r!  z1EmployeeObjectiveFilter.kr_start_date_till_method*  r+  r9   c                 &    |j                  |      S )r'  )"employee_key_result__end_date__gter)  r   s       r7   r"  z/EmployeeObjectiveFilter.kr_end_date_from_method0       %HHr9   c                 &    |j                  |      S )r'  )"employee_key_result__end_date__lter)  r   s       r7   r#  z/EmployeeObjectiveFilter.kr_end_date_till_method6  r0  r9   c                 &    |j                  |      S )#
        Kr prgress filter
        )-employee_key_result__progress_percentage__gter)  r   s       r7   r$  z'EmployeeObjectiveFilter.kr_progress_gte<       USSr9   c                 &    |j                  |      S )r4  )-employee_key_result__progress_percentage__lter)  r   s       r7   r%  z'EmployeeObjectiveFilter.kr_progress_lteB  r6  r9   c                 f   t        j                         j                         }|dk(  r|j                  |      S |dk(  r@|t	        |j                               z
  }|t	        d      z   }|j                  ||f      S |dk(  rB|j                  d	      }|t        d
      z   t	        d      z
  }|j                  ||f      S |dk(  rO|t        d
      z   j                  d	      }|t        d
      z   t	        d      z
  }|j                  ||f      S |dk(  r|j                  |      S |S )r   r   )employee_key_result__end_dater   r   r"   )$employee_key_result__end_date__ranger   r   r   r   r   r   )!employee_key_result__end_date__ltr  r  s          r7   r   z'EmployeeObjectiveFilter.filter_due_dateH  s.    ##%K???GGo%I5==?;;E)++C??PS?UU&&MMaM(E=22iQ6GGC??PS?UU&&]!44==!=DE=22iQ6GGC??PS?UUi??U?KKr9   c                       e Zd ZeZg dZy)EmployeeObjectiveFilter.Meta)r   rj   r   r   r   r   N)r:   r;   r<   r   rn   rH   r>   r9   r7   ro   r>  a  s    !
r9   ro   r1   c                 6   |j                  d      }|j                  j                  j                         }|D ]P  }||j	                  |      z  |j	                  |      z  |j	                  |      z  |j	                  |      z  }R |j                         S )rq   rr   r   r   )objective__icontains)*employee_key_result__key_result__icontainsry   r~   s          r7   rd   z%EmployeeObjectiveFilter.search_methodl  s     S!&&++- 	E??u?UW??e?TV ???>@ ??e?T	V 	 ~~r9   N)#r:   r;   r<   r=   rX   rY   r   r   r   r   start_date_fromstart_date_tillend_date_fromend_date_tillr  r  r  r  r   r
  r  progress_percentage__gteprogress_percentage__lter  r  r*  r!  r"  r#  r$  r%  r   ro   r   rd   r>   r9   r7   r   r     sA    '^&&o>F/n//uff%56O
 0n//uff%56O
 .N--uff%56M
 .N--uff%56M
 322*uff%56
 322*uff%56
 1~00(uff%56
 1~00(uff%56 &.
%
% 

C  ;~::(e   ;~::(e  #>."="=EV"W"=."="=EV"WKKIITT2	
 	
   r9   r   c                   8   e Zd Z ej                  dd      Z ej                  dd ej                  ddi            Z	 ej                  dd ej                  ddi            Z
 ej                  dd	 ej                  ddi            Z G d
 d      Zy)MeetingsFiltertitlerD   r  r)   r   r   r   	date__gte	date__ltec                       e Zd ZeZg dZy)MeetingsFilter.Meta)
r   managerquestion_template	is_active.employee_id__employee_work_info__department_id+employee_id__employee_work_info__company_id0employee_id__employee_work_info__job_position_id-employee_id__employee_work_info__work_type_id)employee_id__employee_work_info__shift_id5employee_id__employee_work_info__reporting_manager_idN)r:   r;   r<   r   rn   rH   r>   r9   r7   ro   rN    s    
r9   ro   N)r:   r;   r<   rX   rY   r   r   r   r   r)   date_greater	date_lessro   r>   r9   r7   rI  rI  ~  s    &^&&'{SF$>$$uff%56D
 ->,,uff%56L
 *))uff%56I
 
r9   rI  c                   &    e Zd ZdZ ej
                  dd      Z ej
                  d      Z ed      Z	 e
 ej                  dd	d
            Z e
 ej                  dd	d
            Zd Z G d d      ZdefdZdddd fdZ xZS )AnonymousFilterz
    Custom filter set for Anonymous records.

    This filter set allows to filter Anonymous records based on various criteria.
    rd   rD   )rf   rZ   r   r   r   r)   r   r   r   r   c                 Z   |r|dk(  rOt         j                   j                         j                         }|j                  d      }|j	                  |      }|dk(  rZt         j                  j                         }|t        j                  d      z
  }|j                  d      }|j	                  |      }|dk(  rtt         j                  j                         }|t        j                  |j                               z
  }|t        j                  d      z   }|j	                  ||g	      }|S |d
k(  rvt         j                  j                         }t        j                  |j                  |j                  d      }|t        j                  d      z   }	|j	                  ||	g	      }|S r   r&   r.   s
             r7   r+   zAnonymousFilter.filter  r8   r9   c                       e Zd ZdZeZdZy)AnonymousFilter.Metar   r   Nr   r>   r9   r7   ro   r^    r   r9   ro   r1   c                 &    |j                  |      S )r   )feedback_subject__icontainsr)  )r/   r   r   r1   s       r7   rd   zAnonymousFilter.search_method  s     5AAr9   N)requestprefixc                4    t         t        |   ||||       y )N)datar   ra  rb  )rE   r[  rF   )r/   rd  r   ra  rb  r_   s        r7   rF   zAnonymousFilter.__init__  s     ot-'& 	. 	
r9   )NN)r:   r;   r<   r=   rX   rY   r   r   r   r   r   r   r   r   r   r+   ro   r   rd   rF   r`   ra   s   @r7   r[  r[    s     '^&&o;WF,>,,EL+|Duf?P%QRJ uf?P%QRH
6 B B
D 
 
r9   r[  c                   H    e Zd Z ej                  dd      Z G d d      Zy)QuestionTemplateFilterrP  rD   r  c                       e Zd ZeZdgZy)QuestionTemplateFilter.MetarP  N)r:   r;   r<   r   rn   rH   r>   r9   r7   ro   rh    s     
r9   ro   Nr:   r;   r<   rX   rY   r   ro   r>   r9   r7   rf  rf    s#    &^&&&KF
 
r9   rf  c                   H    e Zd Z ej                  dd      Z G d d      Zy)PeriodFilterperiod_namerD   r  c                       e Zd ZeZdgZy)PeriodFilter.Metarl  N)r:   r;   r<   r   rn   rH   r>   r9   r7   ro   rn  !  s    
r9   ro   Nri  r>   r9   r7   rk  rk    s#    &^&& kF
 
r9   rk  c                   0    e Zd ZdZ G d d      ZdefdZy)BonusPointSettingFilter0
    Filter through BonusPointSetting model
    c                       e Zd ZeZdZy)BonusPointSettingFilter.Metar   N)r:   r;   r<   r   rn   rH   r>   r9   r7   ro   rs  C  r	  r9   ro   r1   c                     |j                  d      }|j                  j                  j                         }|D ]*  }||j	                  |      z  |j	                  |      z  }, |j                         S rq   rr   r   r   ry   r~   s          r7   rd   z%BonusPointSettingFilter.search_methodG  x     S!&&++- 	E??u?UW??e?TV 	 ~~r9   Nr:   r;   r<   r=   ro   r   rd   r>   r9   r7   rp  rp  (  s    4    r9   rp  c                   0    e Zd ZdZ G d d      ZdefdZy)EmployeeBonusPointFilterrq  c                       e Zd ZeZdZy)EmployeeBonusPointFilter.Metar   N)r:   r;   r<   r   rn   rH   r>   r9   r7   ro   r{  \  s    "r9   ro   r1   c                     |j                  d      }|j                  j                  j                         }|D ]*  }||j	                  |      z  |j	                  |      z  }, |j                         S ru  ry   r~   s          r7   rd   z&EmployeeBonusPointFilter.search_method`  rv  r9   Nrw  r>   r9   r7   ry  ry  W  s        r9   ry  )0r=   r'   r   djangorX   dateutil.relativedeltar   r   django.utilsr   r   r   base.filtersr	   base.methodsr
   horilla.filtersr   
pms.modelsr   r   r   r   r   r   r   r   r   r   r   Filterr   r@   rc   r   r   r   r   r   r  r  r   rI  r[  rf  rk  rp  ry  r>   r9   r7   <module>r     s2       0  ! < " ( ,   !n++ !H"0n.. "0J ,  DDo DN }% }@n66 8@o @F ,  .	 	Z . Z z 
%  
\?
& ?
D

Y 



# 

, i , ^ y  r9   