
    siԺ                        d 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 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 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/m0Z0m1Z1m2Z2m3Z3m4Z4 d Z5d Z6 G d de      Z7 G d de      Z8 G d de      Z9 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@ G d( d)e      ZA G d* d+e      ZB G d, d-e      ZC G d. d/e      ZD G d0 d1e      ZE G d2 d3e      ZF G d4 d5e      ZG G d6 d7e      ZH G d8 d9e      ZIy):zD
forms.py

This module is used to register the forms for pms models
    N)Any)forms)ValidationError)File)Model)	ModelForm)	ErrorListrender_to_string)gettext_lazy)filtersubordinatesemployeemodelis_reportingmanagerreload_queryset)EmployeeFilter)horilla_middlewares)HorillaMultiSelectField)HorillaMultiSelectWidget)AnonymousFeedbackBonusPointSettingCommentEmployeeEmployeeBonusPointEmployeeKeyResultEmployeeObjectiveFeedback	KeyResultMeetings	ObjectivePeriodQuestionQuestionOptionsQuestionTemplatec                 D    | r|r| |kD  rt        j                  d      yyy)zK
    Validates that the start date is before or equal to the end date.
    z+The start date must be before the end date.N)r   r   
start_dateend_dates     -/var/www/python-projects/worksol/pms/forms.pyvalidate_dater(   2   s+     h:#8##$QRR $9hz    c                     i }| j                   | j                   j                  d      |d<   | j                  | j                  j                  d      |d<   |S )z3this is used to update change the date value formatz%Y-%m-%dr%   r&   )r%   strftimer&   )instanceinitials     r'   set_date_field_initialr.   :   sZ    G& ( 3 3 < <Z H$&//88D
Nr)   c            	           e Zd ZdZ ej
                  d ej                  ddd            Z ej                  d      Z	 ej                  d      Z
 ej                  ej                  j                         j                  d	
       ed       ej"                  ddd            Z G d d      Z fdZ fdZd Z xZS )ObjectiveFormzG
    A form to create or update instances of the Objective, model.
    Foh-input w-100dateclasstypeattrsrequiredwidget)r9   Tarchive
Key result/oh-select oh-select-2 select2-hidden-accessiblekeyResultChange($(this))r4   onchangequerysetlabelr:   c                   "    e Zd ZdZeZg dZdgZy)ObjectiveForm.Metab
        A nested class that specifies the model,fields and style of fields for the form.
        )titlemanagersduration_unitdurationkey_result_iddescriptionadd_assignees	assigneesr%   r<   self_employee_progress_update	is_activeN)__name__
__module____qualname____doc__r   modelfieldsexclude r)   r'   MetarF   Z   s    	 
 -r)   rZ   c                 z   |j                  dd      }t        |   |i | t        t        j
                  j                         t        dt        ddd| j                        d	      | j                  d
<   t        t        j
                  j                         t        dt        ddd| j                        d	      | j                  d<   t        | j                         t        | j                  d   j                        | j                  d   _        | j                  d   j                  j                  d       y)zo
        Constructor for ObjectiveForm. If an instance is provided, set initial values for date fields
        employeeNemployee-widget-filterfemployee_filters.htmlF)filter_route_namefilter_classfilter_instance_contex_namefilter_template_pathr9   r,   	AssigneesrC   r:   rD   rO   ManagersrI   rL   create_new_key_resultzCreate new Key result)popsuper__init__r   r   objectsallr   r   r,   rW   r   listchoicesappend)selfargskwargsr\   	__class__s       r'   rk   zObjectiveForm.__init__o   s   
 ::
 	$)&)#:%%))++":+,/%< $
K  #:%%))++":+,/%< #
J 	$/3KK(000
O$, 	O$,,33>	
r)   c                    t         
|          }|j                  d      }| j                  j	                         D ]  \  }}t        |t              s| j                  j                  |d       |r@t        | j                  j                  |            dk  r|rt        j                  |di      t         
|          }| j                  |   j                  j                  | j                  j                  |            }|||<    t         
|          }|j                  d      }|j                  d      }|j                  d      }|j                  d      }|r|dk(  rt        j                  d	      |r'|j!                         r|t        j                  d
      |j                  d      }|j                  d      }	t#        ||	       |S )z_
        Validates form fields and raises a validation error if any fields are invalid
        rN   N   This field is requiredid__inrO   r%   rI   zManagers is a required fieldzAssign employees and start dater&   )rj   cleangetrW   items
isinstancer   errorsri   lendatagetlistr   r   rC   filterexistsr(   )rq   cleaned_datarN   
field_namefield_instancer   rO   r%   rI   r&   rt   s             r'   rz   zObjectiveForm.clean   s    w}$((9*.++*;*;*= 	0&J.*AB
D1!DII--j9:Q>%//=U0VWW$w}{{:.77>>99,,Z8 ?  ,0Z(	0 w}$((9 $$[1	!%%l3
##J/8t+''(FGG##%);++,MNN!%%l3
##J/j(+r)   c                 &    d| i}t        d|      }|S S
        Render the form fields as HTML table rows with Bootstrap styling.
        formzcommon_form.htmlr
   rq   context
table_htmls      r'   as_pzObjectiveForm.as_p         4.%&8'B
r)   )rR   rS   rT   rU   r   	DateField	DateInputr%   BooleanFieldrN   r<   ModelMultipleChoiceFieldr   rl   rm   rX   _SelectMultiplerL   rZ   rk   rz   r   __classcell__rt   s   @r'   r0   r0   D   s     !u/?%PQJ 'E&&6M e  %0G2E22""&&(000>o#u##J6
	M   *)
V"Hr)   r0   c                        e Zd ZdZ ej
                  d ej                  ddd            Z G d d	      Zd
 Z	 fdZ
 fdZ xZS )AddAssigneesFormO
    A form to create or update instances of the EmployeeObjective, model.
    Fr1   r2   r3   r6   r8   c                       e Zd ZdZeZdgZy)AddAssigneesForm.MetarG   rO   N)rR   rS   rT   rU   r   rV   rW   rY   r)   r'   rZ   r      s    	 
r)   rZ   c                 &    d| i}t        d|      }|S r   r
   r   s      r'   r   zAddAssigneesForm.as_p   r   r)   c                     t        |   |i | | j                  r^| j                  d   j                  j                  | j                  j                  j                               | j                  d   _        y y )NrO   rx   )rj   rk   r,   rW   rC   rX   rO   rm   rq   rr   rs   rt   s      r'   rk   zAddAssigneesForm.__init__   sd    $)&)==041hwwdmm&=&=&A&A&CwD KK$- r)   c                     t         |          }|j                  d      }t        |      dk(  r t	        j
                  dt        d      i      |S )NrO   r   zThis field is required.)rj   rz   r{   r   r   r   r   )rq   r   rO   rt   s      r'   rz   zAddAssigneesForm.clean   sL    w} $$[1	y>Q''a8Q6R(STTr)   )rR   rS   rT   rU   r   r   r   r%   rZ   r   rk   rz   r   r   s   @r'   r   r      sP     !u/?%PQJ

 
E r)   r   c            	            e Zd ZdZ ej
                  ej                  j                          e	d       ej                  ddd            Z G d d	      Z fd
Zd Z xZS )EmployeeObjectiveFormr   r=   r>   r?   r@   r6   rB   c                       e Zd ZdZeZg dZdgZ ej                          ej                  ddd       ej                  ddd      dZy	)
EmployeeObjectiveForm.MetarG   )objective_idr%   r&   statusr<   rQ   r1   r2   r3   r6   )r   r%   r&   N)rR   rS   rT   rU   r   rV   rW   rX   r   HiddenInputr   widgetsrY   r)   r'   rZ   r     sa    	 "
 --E--/)%// 0&A ( 0&A
r)   rZ   c                     t        |   |i | t        | j                         	 | j                  d= y # t        $ r
}Y d }~y d }~ww xY w)NrL   )rj   rk   r   rW   	Exception)rq   rr   rs   _errrt   s       r'   rk   zEmployeeObjectiveForm.__init__  sE    $)&)$	O, 		s   5 	AAc                 &    d| i}t        d|      }|S r   r
   r   s      r'   r   zEmployeeObjectiveForm.as_p"  r   r)   )rR   rS   rT   rU   r   ModelChoiceFieldr   rl   rm   r   SelectrL   rZ   rk   r   r   r   s   @r'   r   r      sb     +E**""&&(ou||J6
	M
 
0r)   r   c                       e Zd ZdZ ej
                  ej                  j                         j                  d       e
d      d ej                  ddd	      
      Z ej                  ej                  j                         j                  d      d e
d       ej                  ddddddd	            Z G d d      Z fdZd Z xZS )EmployeeObjectiveCreateFormr   Tr;   r=   Fr>   r?   r@   r6   rC   rD   r9   r:   r   z#empObjectiveCreateFormz#id_key_result_id_parent_div	outerHTMLchangez/pms/get-objective-keyresult)z
hx-includez	hx-targetz	hx-selectzhx-swapz
hx-triggerzhx-get)rC   r9   rD   r:   c                   L    e Zd ZdZeZg dZd ej                  ddd      iZ	y)	 EmployeeObjectiveCreateForm.MetarG   )employee_idr   rL   r%   r   r<   r%   r1   r2   r3   r6   N)
rR   rS   rT   rU   r   rV   rW   r   r   r   rY   r)   r'   rZ   r   K  s6    	 "
 /%// 0&A
r)   rZ   c                 l   t        |   |i | t        t        j                  dd       }|j
                  j                  d      r\t        | j                  d   j                        | j                  d   _	        | j                  d   j                  j                  d       |j
                  j                  d      st        |      rlt        |t        j                  j                  d      d      }|t        j                  j                  |j
                  	      z  | j                  d
   _        y y )Nrequestpms.add_keyresultrL   rg   zpms.add_employeeobjectiveTrQ   )rC   permemployee_user_idr   )rj   rk   getattrr   _thread_localsuserhas_permrn   rW   ro   rp   r   r   r   rl   r   rC   )rq   rr   rs   r   	employeesrt   s        r'   rk   z$EmployeeObjectiveCreateForm.__init___  s   $)&)-<<iN<<  !4537O,444DKK(0 KK(0077B <<  !<=ATB
 8!))0040@0I
 3<h>N>N>U>U!( ?V ? 3DKK&/B
r)   c                 &    d| i}t        d|      }|S r   r
   r   s      r'   r   z EmployeeObjectiveCreateForm.as_pv  r   r)   )rR   rS   rT   rU   r   r   r   rl   rm   rX   r   r   rL   r   r   r   r   rZ   rk   r   r   r   s   @r'   r   r   +  s     3E22""&&(000>o#u##J6
	
M *5))""&&(000>nu||7;;&&8	
	L 
 
(.r)   r   c            	            e Zd ZdZ ej
                  ej                  j                         j                  d       e
d       ej                  ddd      	      Z G d
 d      Zd Z fdZ xZS )EmployeeKeyResultFormzO
    A form to create or update instances of the EmployeeKeyResult, model.
    Tr;   r=   r>   r?   r@   r6   rB   c                       e Zd ZdZeZg dZ ej                          ej                  ddddd       ej                  ddd	      d
Z
y)EmployeeKeyResultForm.MetarG   )employee_objective_idrL   start_valuecurrent_valuetarget_valuer%   r&   r1   r2   TzstartDateChange())r4   r5   r9   rA   r6   r3   )r   r%   r&   N)rR   rS   rT   rU   r   rV   rW   r   r   r   r   rY   r)   r'   rZ   r     sc    	 "
 &7U%6%6%8)%//-" $ 3	 ( 0&A
r)   rZ   c                 &    d| i}t        d|      }|S r   r
   r   s      r'   r   zEmployeeKeyResultForm.as_p  r   r)   c                 :   t        |   |i | t        t        j                  dd       }| j
                  j                  d      rt        | j
                  j                  d            t        k(  s+t        | j
                  j                  d            t        k(  rRt        j                  j                  t        | j
                  j                  d                  j                  | _        n*| j
                  j                  d      j                  | _        |j                  j                  d      st!        |      r]t#        | j$                  d   j&                        | j$                  d   _        | j$                  d   j&                  j)                  d       y y )Nr   r   idr   rL   rg   )rj   rk   r   r   r   r-   r{   r5   intstrr   rl   r   verbose_namer   r   r   rn   rW   ro   rp   )rq   rr   rs   r   rt   s       r'   rk   zEmployeeKeyResultForm.__init__  sG   $)&)-<<iN<<34T\\%%&=>?3F(()@ABcI$5$=$=$A$A4<<++,CDE %B %+ ! %)LL$4$4+%+ ! <<  !459LW9U37O,444DKK(0 KK(0077B	 :Vr)   )rR   rS   rT   rU   r   r   r   rl   rm   rX   r   r   rL   rZ   r   rk   r   r   s   @r'   r   r     su     +E**""&&(000>ou||J6
	M
 
< r)   r   c                   <     e Zd ZdZ G d d      Zd Z fdZ xZS )KRFormz3
    A form used for creating KeyResult object
    c                   $    e Zd ZdZeZg dZddgZy)KRForm.Metaa
        A nested class that specifies the model,fields and exclude fields for the form.
        )rH   rM   progress_typer   rK   
company_idr<   historyrl   N)rR   rS   rT   rU   r   rV   rW   rX   rY   r)   r'   rZ   r     s$    	 
 
r)   rZ   c                 &    d| i}t        d|      }|S r   r
   r   s      r'   r   zKRForm.as_p  r   r)   c                 P   t         |          }|j                  d      }|j                  d      }|j                  d      }||dk(  rt        ddi      ||dk(  rt        ddi      |dk  rt        ddi      |dk  rt        ddi      |dk(  r|d	kD  rt        dd
i      y y )NrK   r   r    rw   r   z-Duration cannot be less than or equal to zero%d   zJTarget value cannot be greater than hundred for progress type "percentage"rj   rz   r{   r   )rq   r   rK   r   r   rt   s        r'   rz   zKRForm.clean  s    w}##J/#''7$((9x2~!:/G"HII<2#5!>3K"LMMq=!LM  1!!PQ  CL3$6!"$p  %7r)   )rR   rS   rT   rU   rZ   r   rz   r   r   s   @r'   r   r     s!    
 
( r)   r   c                        e Zd ZdZ ej
                  ej                  j                         d ej                  ddi      d      Z
 G d d	      Z fd
Zd Z fdZ xZS )KeyResultFormaW  
    A form used for creating and updating EmployeeKeyResult objects.

    Includes fields for title, description, current value, target value,
    start date, end date, progress type, and the associated period and employee.

    Excludes fields for status, progress_boolean, progress_integer,
    employee_objective_id, and start value.

    r   stylewidth:100%; display:none;r6   F)rC   empty_labelr:   r9   c                      e Zd ZdZeZdZg dZ ej                   e
d      ddd       ej                   e
d	      d
dddd       ej                  ddd       ej                  ddd       ej                  ddd       ej                  dddd       ej                  dddd       ej                  ddd      dZy)KeyResultForm.Metar   __all__)r   progress_booleanprogress_integerr   r   Enter a titler1   T)placeholderr4   r9   r6   zEnter a descriptionz!oh-input oh-input--textarea w-100   (   )r   r4   r9   rowscolsr>   zdisplay:none;)r4   r   r4   r9   r2   )r5   r4   r9   z1oh-select oh-select--lg oh-select-no-search w-100)
key_resultkey_result_descriptionr   r   r   r%   r&   r   N)rR   rS   rT   rU   r   rV   rW   rX   r   	TextInputr   Textarear   NumberInputr   r   rY   r)   r'   rZ   r     s   	 "
 *%//#$_#5- $ '5enn#$%:#;@ $' (5<<N, /U.. 0dC .E-- 0dC *%//%0@dS (%0@dS *U\\P $G)
r)   rZ   c                    |j                  d      }|rt        |      |d<   |j                  dd       }t        |   |i | t        | j                         t        j                  j                  d|      }|r|r|| j                  d   _
        | j                  d   j                  j                  j                  dt        t        j                                i       y )Nr,   r-   r\   TrQ   (employee_work_info__reporting_manager_idr   r   )r{   r.   ri   rj   rk   r   rW   r   rl   r   rC   r:   r7   updater   uuiduuid4)rq   rr   rs   r,   r\   r   rt   s         r'   rk   zKeyResultForm.__init__U  s    ::j) 6x @F9::
 	$)&)$$$++X , 
	 	2;DKK&/ 	M"))//66c$**,>O7PQr)   c                    | j                   j                  |      }| j                   j                  |dk(  rdnd      }|!||dk(  r||kD  rt        j                  d      |!||dk(  r||k  rt        j                  d      |S )zc
        Validate the 'current_value' and 'target_value' field of model EmployeeKeyResult.
        r   r   1Current value cannot be greater than target valuez.Target value cannot be less than current value)r   r{   r   r   )rq   
value_typevalueother_values       r'   clean_valuezKeyResultForm.clean_valueh  s     !!%%j1''++)^;O
 'o-#''C  'n,#''@  r)   c                    t         |          }| j                  j                  d      }|j                  d      }|j                  d      }|j                  d      }|j                  d      }t	        ||       |r8|r6|r4||j
                  k  rt        d      ||j                  kD  r t        d      t        j                  d      |d	k  rt        d
      ||kD  rt        j                  d      |S )Nr   r%   r&   r   r   z/Start date should be after Objective start datez+End date should be below Objective end datezEmployee Objective not foundr   z(Target value should be greater than zeror   )	rj   rz   r-   r{   r(   r%   r   r&   r   )rq   r   r   r%   r&   r   r   rt   s          r'   rz   zKeyResultForm.clean  s    w} $ 0 01H I!%%l3
##J/#''7$((9j(+ ZH1<<<%&WXX/888%&STT''(FGG1!"LMM<'''C  r)   )rR   rS   rT   rU   r   r   r   rl   rm   r   periodrZ   rk   r  rz   r   r   s   @r'   r   r     sf    	 $U####%u||7,G"HI	F8
 8
tR&8 r)   r   c            	            e Zd ZdZ ej
                  ej                  j                          e	d      d ej                  ddi      d      Z G d	 d
      Z fdZ fdZ xZS )FeedbackFormz.
    FeedbackForm for better performance.
    r   r   r4   zoh-select--period-changer6   F)rC   rD   r   r:   r9   c            	       b   e Zd ZeZg dZg dZ ed       ed       ed       ed       ed       ed      d	Z e	j                  d
dddd       e	j                   ed      dd       e	j                  ddd       e	j                  ddd       e	j                  ddd      dZy)FeedbackForm.Meta)review_cycler   
manager_idsubordinate_idcolleague_idr%   r&   question_template_idemployee_key_results_idcyclic_feedbackcyclic_feedback_days_countcyclic_feedback_period)r   r<   rQ   cyclic_next_start_datecyclic_next_end_dateManagerr   	ColleaguezQuestion Templatez
Key ResultzIs Cyclic Feedback)r
  r   r  r  r  r  oh-select oh-select-2 w-100multipler   F)r4   r  r   r9   r6   r   r1   r   r4   r2   r5   r4   oh-switch__checkboxzchangeCyclicFeedback(this)r@   )r  r	  r%   r&   r  N)rR   rS   rT   r   rV   rW   rX   r   labelsr   r   r   r   CheckboxInputr   rY   r)   r'   rZ   r    s    

 I,Z=kN$%&9$:'( !56
 (<u';';: *8 %	( ,EOO&'&8CST *%//%0@A (%0@A  3u222 < %
r)   rZ   c                    t        t        j                  dd      }t        |   |i | |r|j
                  nd}|r|j                         n	t               }t        j                  j                         | j                  d   _        | j                  d   j                  j                  j                  ddi       |r>d|v st!        |      r/g | j                  d   j"                  d| j                  d   _        t$        j                  j'                         }|r9d|v st!        |      r*t)        |t$        j                  j                         d	      }|t$        j                  j+                  |j
                  
      z  | j                  d   _        d| j                  d   j                  j                  d<   t-        | j                         | j.                  rr| j.                  j0                  rZ| j.                  j2                  }|r/t5        |d      r#|j6                  rt        |j6                  dd      nd}t$        j                  j+                  d|      }	|j9                         }
|j:                  g}|r|j=                  |j:                         t$        j                  j+                  d|
      j?                  |      }|| j                  d   _        |	| j                  d   _        |r*t$        j                  j+                  |j:                        nt$        j                  j'                         | j                  d   _        yyy)z>
        Initializes the form and queryset filtering.
        r   Nr  r4   zw-100zpms.add_period)create_new_periodzCreate new periodzpms.add_feedback)r   r   r   zget_collegues($(this))rA   employee_work_inforeporting_manager_idTr   )rQ   !employee_work_info__department_idrx   r  r  r   r
  ) r   r   r   rj   rk   r   get_all_permissionssetr   rl   rm   rW   rC   r:   r7   r   r   ro   r   noner   r   r   r,   pkr   hasattrr  get_departmentr   rp   rX   )rq   rr   rs   r   r   
user_permsemployee_querysetr\   reporting_managersubordinates
departmentexclude_ids
colleaguesrt   s                r'   rk   zFeedbackForm.__init__  s    -<<iN$)&)  'w||D37T--/SU
)/););)=H&H$$**117G2DE%37J77S-X&..-:-DKK!)
 %,,113':59LW9U ?  $$&'!  0 0 7 7 7 VV 	M"+ ?WM"))//
;$==T]]--}}00H H&:;// 335KTR   $++22 3 L "002J#;;-K ""#4#7#78!))00* 1 g[g)  4>DKK'05ADKK()2 %   ''+<+?+?'@%%**, KK%.1 .=r)   c                 "   t         |           | j                  j                  dd       t         |          }|j	                  d      }|j	                  d      }d| j                  v r| j                  d= | j
                   t        ||       |S )z
        Cleans and validates the feedback form data.
        Ensures that the start date is before the end date and validates the start date.
        r  Nr%   r&   r  )rj   rz   r~   ri   r{   r,   r(   rq   r   r%   r&   rt   s       r'   rz   zFeedbackForm.clean:  s|    
 	($/w}!%%l3
##J/$356j(+r)   )rR   rS   rT   rU   r   r   r   rl   r$  r   r   r  rZ   rk   rz   r   r   s   @r'   r  r    si     $U##$$&ku||7,F"GHF;
 ;
z@` r)   r  c                        e Zd ZdZdddZ ej                   ej                  d ed      d            Z	 G d	 d
      Z
d fdZd Z xZS )QuestionTemplateFormzD
    Form for creating or updating a question template instance
       )question_templater   3oh-input oh-input--small oh-input--res-height w-100zFor Developerr4   r   r6   r:   c                       e Zd ZdZeZdZdgZy)QuestionTemplateForm.MetazR
        A nested class that specifies the model and fields for the form.
        r   rQ   N)rR   rS   rT   rU   r"   rV   rW   rX   rY   r)   r'   rZ   r9  ]  s    	 !-r)   rZ   c                     t        |   |i | t        | j                         d| j                  d   _        | j                  d   j
                  j                  j                  ddi       y )NTr   r4   r  )rj   rk   r   rW   r9   r:   r7   r   r   s      r'   rk   zQuestionTemplateForm.__init__f  s`    $)&)$-1L!*L!((..556	
r)   c                 &    d| i}t        d|      }|S r   r
   r   s      r'   r   zQuestionTemplateForm.as_pp  r   r)   returnN)rR   rS   rT   rU   r   r   	CharFieldr   r   r4  rZ   rk   r   r   r   s   @r'   r2  r2  M  sW     "$26D'uN 1
   
r)   r2  c                   2    e Zd ZdZ ej
                   ej                  d ed      d      d      Z ej                  e
j                  j                         d	      Z ej
                   ej                  d
dd      dd      Z ej
                   ej                  d
dd      dd      Z ej
                   ej                  d
dd      dd      Z ej
                   ej                  d
dd      dd      Z G d d      Z fdZ xZS )QuestionFormz<
    Form for creating or updating a question  instance
    r5  zEnter questionr6  r6   T)r:   r9   FrC   r9   z#oh-input oh-input--res-height w-100textr3      )r:   
max_lengthr9   c                   P    e Zd ZdZeZg dZd ej                  ddd      iZ	dZ
y	)
QuestionForm.Metaj
        A nested class that specifies the model,exclude fields and style of fields for the form.
        )question_option_idtemplate_idrQ   question_typezFoh-select oh-select--sm oh-select-no-search oh-select--qa-change w-100Tr   r6   r   N)rR   rS   rT   rU   r    rV   rX   r   r   r   rW   rY   r)   r'   rZ   rF    s<    	 D\U\\e $
 r)   rZ   c                    t        |   |i | t        | j                         | j                  d   j                  j
                  j                  dt        t        j                               i       | j                  j                  rB| j                  j                  dk(  r'| j                  j                  j                         r| j                  j                  j                         j                  | j                  d   _        | j                  j                  j                         j"                  | j                  d   _        | j                  j                  j                         j$                  | j                  d   _        | j                  j                  j                         j&                  | j                  d   _        y y y y )NrJ  r   4option_aoption_boption_coption_d)rj   rk   r   rW   r:   r7   r   r   r   r   r,   r%  rJ  question_optionsfirstrM  r-   rN  rO  rP  r   s      r'   rk   zQuestionForm.__init__  sT   $)&)$O$++1188$DJJL@Q9RSMM++s2..446 ..446?? KK
#+ ..446?? KK
#+ ..446?? KK
#+ ..446?? KK
#+ 7 3 r)   )rR   rS   rT   rU   r   r>  r   r   questionr   r!   rl   rm   optionsrM  rN  rO  rP  rZ   rk   r   r   s   @r'   r@  r@  y  s:    uuN !12
 H %e$$ ((,,.G uuA6R
 H uuA6R
 H uuA6R
 H uuA6R
 H " r)   r@  c                   8     e Zd ZdZ G d d      Zd fdZ xZS )ObjectiveCommentFormz
    A form used to add a comment to an employee's objective.
    Excludes fields for the employee and employee objective and uses a textarea widget for the comment field.
    c                   Z    e Zd ZdZeZddgZd ej                  dd e	d      d	      iZ
y
)ObjectiveCommentForm.MetarG  r   r   commentz+oh-input oh-input--small oh-input--textarearL  zAdd a comment...)r4   r   r   r6   N)rR   rS   rT   rU   r   rV   rX   r   r   r   r   rY   r)   r'   rZ   rX    sD    	  "9:~u~~J#$%7#8
r)   rZ   c                 N    t        |   |i | t        | j                         y )N)rj   rk   r   rW   r   s      r'   rk   zObjectiveCommentForm.__init__  s!    $)&)$r)   r<  )rR   rS   rT   rU   rZ   rk   r   r   s   @r'   rV  rV    s    

 
"% %r)   rV  c                   F     e Zd ZdZ G d d      Z fdZd Z fdZ xZS )
PeriodFormz:
    A form for creating or updating a Period object.
    c                       e Zd ZdZeZdZdgZ ej                  ddd       ej                  dd	d
       ej                  dd	d
      dZy)PeriodForm.MetarG   r   rQ   zQ1.r1   r  r6   r2   zoh-input  w-100r  )period_namer%   r&   N)rR   rS   rT   rU   r   rV   rW   rX   r   r   r   r   rY   r)   r'   rZ   r^    sj    	 -*5??&+6FG *%//%0AB (%0AB

r)   rZ   c                     |j                  d      x}rt        |      |d<   t        |   |i | t	        | j
                         d| j
                  d   _        | j
                  d   j                  j                  j                  ddi       y)z
        django forms not showing value inside the date, time html element.
        so here overriding default forms instance method to set initial value
        r,   r-   Tr   r4   r  N)
r{   r.   rj   rk   r   rW   r9   r:   r7   r   )rq   rr   rs   r,   rt   s       r'   rk   zPeriodForm.__init__  s    
 zz*--8- 6x @F9$)&)$-1L!*L!((..556	
r)   c                 &    d| i}t        d|      }|S r   r
   r   s      r'   r   zPeriodForm.as_p  r   r)   c                 ~    t         |          }|j                  d      }|j                  d      }t        ||       y )Nr%   r&   )rj   rz   r{   r(   r0  s       r'   rz   zPeriodForm.clean  s8    w}!%%l3
##J/j(+r)   )	rR   rS   rT   rU   rZ   rk   r   rz   r   r   s   @r'   r\  r\    s&    
 
(
 , ,r)   r\  c                   2    e Zd ZdddddddZ G d d      Zy)AnonymousFeedbackFormr3  )feedback_subjectbased_onfeedback_descriptionr   department_idjob_position_idc                       e Zd ZeZdZddgZy)AnonymousFeedbackForm.Metar   r   r<   N)rR   rS   rT   r   rV   rW   rX   rY   r)   r'   rZ   rk  -  s    !Y'r)   rZ   N)rR   rS   rT   r   rZ   rY   r)   r'   rd  rd  #  s%     "D( (r)   rd  c                        e Zd ZdddddZ ej
                   ej                  ddd            Z G d d	      Zd
 Z	 fdZ
 fdZ xZS )MeetingsFormr3  )r   manageranswer_employeesr4  r1   zdatetime-localr3   r6   r7  c                       e Zd ZeZdZddgZy)MeetingsForm.Metar   responserQ   N)rR   rS   rT   r   rV   rW   rX   rY   r)   r'   rZ   rq  A  s    {+r)   rZ   c                 &    d| i}t        d|      }|S )r   r   zhorilla_form.htmlr
   r   s      r'   r   zMeetingsForm.as_pF  s      4.%&97C
r)   c                    t         |          }| j                  j                  dg       }t        j
                  j                  |      }||d<   | j                  j                  dg       }t        j
                  j                  |      }||d<   t        | j                  d   t              r9| j                  j                  d      }|r| j                  j                  dd        |d   r|d   st        dt        d      i      |S )Nro  rx   r   r4  z?Question template is required when answer employees are choosed)rj   rz   r   r   r   rl   r   r}   rW   r   r~   ri   r   r   )rq   r   answerable_employeesr   r   idsrt   s         r'   rz   zMeetingsForm.cleanN  s    w}#yy001CRH$$++3G+H	+4'(ii''r:$$++;+?	&/]#dkk-02IJ))##M2Ct4*+LAT4U!'Y*  r)   c                    t        |   |i | t        t        j                  j                  d      t        dt        dd| | j                        t        d            | j                  d	<   	 | j                  j                  d	      rNt        j                  j                  | j                  j                  d	      
      }|| j                  d   _        y y #  Y y xY w)NFemployee_work_info__isnullr]   r^   r_   r`   ra   rb   rc   r   r,   	Employeesre   r   rx   ro  )rj   rk   r   r   rl   r   r   r   r,   r   rW   r   r   rC   )rq   rr   rs   r   rt   s       r'   rk   zMeetingsForm.__init__i  s    $)&)%<%%,,,N+":+,/%< K.&
M"	yy  /$,,3399,,]; 4 	 <E./8	 0
	s   1A(C C)rR   rS   rT   r   r   DateTimeFieldDateTimeInputr2   rZ   r   rz   rk   r   r   s   @r'   rm  rm  3  sc     	D 5"u"",6FG
D, ,
6 r)   rm  c                   ,    e Zd ZdZddiZ G d d      Zy)MeetingResponseFormz
    Meeting response form
    rr  r3  c                   D    e Zd ZeZdgZd ej                  ddi      iZy)MeetingResponseForm.Metarr  zdata-summernoter   r6   N)	rR   rS   rT   r   rV   rW   r   r   r   rY   r)   r'   rZ   r    s+    .?-DE
r)   rZ   N)rR   rS   rT   rU   r   rZ   rY   r)   r'   r  r    s     D
 
r)   r  c                        e Zd ZdZ ej
                  ej                   ej                  ddd            Z	 G d d      Z
 fd	Z xZS )
BonusPointSettingFormz 
    BonusPointSetting form
    ModelChange($(this))oh-select oh-select-2)rA   r4   r6   )ro   r:   c                   \   e Zd ZeZdZ ej                  ddd       ej                  ddi       ej                  ddi       ej                  ddi       ej                  ddi       ej                  ddi       ej                  ddi       ej                  ddi      d	Z
y
)BonusPointSettingForm.Metar   r  r  r@   r6   r4   zoh-inputr  )rV   applicable_for	bonus_forfield_1
conditionsfield_2pointsrQ   N)rR   rS   rT   r   rV   rW   r   r   r   r  r   rY   r)   r'   rZ   r    s    !!U\\2IWm(no*ell';R1ST%W6M,NO#u||74K*LM&%,,g7N-OP#u||74K*LM'e''w
.CD,,,G=R3ST	
r)   rZ   c                 b   t         |          }|j                  d      }|j                  d      }|j                  d      }|dv r,|dvrt        d| d|       |dk7  r,t        d	| d
| d      |dv r|dvrt        d	| d| d      |j                  dd      }|dk  rt        d      |S )NrV   r  r  )zpms.models.EmployeeObjectivezpms.models.EmployeeKeyResult)ownermembersrI   zInvalid applicable_for value 'z' for ClosedzFor z#, bonus_for must be 'Closed', not '')zproject.models.Taskzproject.models.Project)r  rI   z7, applicable_for must be 'members' or 'managers', not 'r  r   z%Bonus point must be greater than zeror   )rq   r   rV   r  r  r  rt   s         r'   rz   zBonusPointSettingForm.clean  s    w}  )%))*:; $$[1	 TT%EE%4^4DF5'R  H$%5'!DYKqQ  GG%<<%5'!XYgXhhij 
 !!(A.Q;!"IJJr)   )rR   rS   rT   rU   r   ChoiceFieldr   MODEL_CHOICESr   rV   rZ   rz   r   r   s   @r'   r  r    sR     E!//u||20
E
 
 r)   r  c                   @     e Zd ZdZ G d d      Z fdZ fdZ xZS )EmployeeBonusPointFormz!
    EmployeeBonusPoint form
    c                       e Zd ZeZdZg dZy)EmployeeBonusPointForm.Metar   )bonus_point_idr,   rQ   N)rR   rS   rT   r   rV   rW   rX   rY   r)   r'   rZ   r    s    "=r)   rZ   c                 T   t        t        j                  dd       }t        |   |i | |j
                  j                  d      rbt        j                  j                  |j
                  d         }|r2|| j                  d   _        |j                         | j                  d<   y y y )Nr   r   r   )r   r   r   rj   rk   GETr{   r   rl   r   rW   rC   rR  r-   )rq   rr   rs   r   r\   rt   s        r'   rk   zEmployeeBonusPointForm.__init__  s    -<<iN$)&);;??=)''..'++m2L.MH6>M*3.6nn.>]+  *r)   c                     t         |          }|j                  d      }|dk  r t        j                  dt        d      i      |S )Nbonus_pointr   z"Point should be greater than zero.)rj   rz   r{   r   r   r   )rq   r   r  rt   s      r'   rz   zEmployeeBonusPointForm.clean  sO    w}"&&}5!''"F GH  r)   )rR   rS   rT   rU   rZ   rk   rz   r   r   s   @r'   r  r    s!    > >
? r)   r  c                   D     e Zd ZddiZ G d d      Z fdZ fdZ xZS )EmployeeFeedbackForm	others_idr3  c                       e Zd ZeZdgZy)EmployeeFeedbackForm.Metar  N)rR   rS   rT   r   rV   rW   rY   r)   r'   rZ   r    s    r)   rZ   c                     t        |   |i | t        t        j                  j                  d      t        dt        dd| | j                        t        d            | j                  d	<   y )
NFrx  r]   r^   r_   rz  r{  re   r  )rj   rk   r   r   rl   r   r   r   r,   r   rW   r   s      r'   rk   zEmployeeFeedbackForm.__init__  sf    $)&)#:%%,,,N+":+,/%< K.$
K r)   c                 $   t         |          }t        | j                  d   t              rc| j
                  j                  dd        | j                  d   j                  j                  | j                  j                  d            }||d<   |S )Nr  rx   rj   rz   r}   rW   r   r~   ri   rC   r   r   r   rq   r   employee_datart   s      r'   rz   zEmployeeFeedbackForm.clean  s}    w}dkk+.0GHKKOOK. KK4==DDyy((5 E M )6L%r)   )rR   rS   rT   r   rZ   rk   rz   r   r   s   @r'   r  r    s&    D 
 r)   r  c            	           e Zd ZdZ ej
                  d ed            Z ej                  e	j                  j                  d      d      Z ej                  e	j                  j                  d      d ed       ed	      
      Z ej                  dd      Z ej                  dd ed            Z ej                  dd ed            Z ej                  dd ed       ed            Z ej&                  ej                  j+                          ed      d ej,                  ddi            Z G d d      Z fdZ fdZ xZS )BulkFeedbackFormz"Form for creating feedback in bulkTTitle)r9   rD   r   rA  FzOther employeesz(Employees need to sent feedback request.)rC   r9   rD   	help_text)r-   r9   zInclude all subordinates)r-   r9   rD   zInclude all colleagueszInclude all keyresultsz0Include all keyresults assigned to the employee.)r-   r9   rD   r  r   rA   zperiodChange($(this))r6   r   c                   r    e Zd ZeZg dZ ej                  ddd       ej                  ddd      dZy)BulkFeedbackForm.Meta)rH   employee_idsr   other_employeesinclude_managerinclude_subordinatesinclude_colleaguesinclude_keyresultr  r  r  r  r  r%   r&   r2   r1   r  r6   r$   N)	rR   rS   rT   r   rV   rW   r   r   r   rY   r)   r'   rZ   r  9  sG    
$ *%//%0@A (%0@A	
r)   rZ   c                    t        |   |i | t        t        j                  j                  d      t        dt        dd| | j                  d      t        d      	      | j                  d
<   d| j                  d   _        d| j                  d   j                  j                  d<   d| j                  d   j                  j                  d<   y )NFrx  r]   r^   r_   T)r`   ra   rb   rc   r   r,   r9   r{  re   r  zNot Startedr   zcyclicFeedback()r  rA   offrH   autocomplete)rj   rk   r   r   rl   r   r   r   r,   r   rW   r-   r:   r7   r   s      r'   rk   zBulkFeedbackForm.__init__U  s    $)&)&=%%,,,N+":+,/%< K.'
N# )6H%BT%&--33J?<AG##)).9r)   c                 $   t         |          }t        | j                  d   t              rc| j
                  j                  dd        | j                  d   j                  j                  | j                  j                  d            }||d<   |S )Nr  rx   r  r  s      r'   rz   zBulkFeedbackForm.cleanh  s}    w}dkk.13JKKKOOND1 KK7@@GGyy((8 H M ,9L(r)   )rR   rS   rT   rU   r   r>  r   rH   r   r   rl   r   r  r  r   r  r  r  r  r   r   rm   r   r  rZ   rk   rz   r   r   s   @r'   r  r    ss   ,EOOT7<E1511!!((4(84L 5e44!!((4(8!">?	O )e((O .5--uA.H,I ,++uA.F,G +**()FG	 $U####%ku||3
		F
 
8B& r)   r  )JrU   datetimer   typingr   djangor   django.core.exceptionsr   django.core.files.baser   django.db.models.baser   django.formsr   django.forms.utilsr	   django.template.loaderr   django.utils.translationr   r   
base.formsBaseFormHorillaModelFormbase.methodsr   r   r   employee.filtersr   horillar   2horilla_widgets.widgets.horilla_multi_select_fieldr   &horilla_widgets.widgets.select_widgetsr   
pms.modelsr   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r(   r.   r0   r   r   r   r   r   r   r  r2  r@  rV  r\  rd  rm  r  r  r  r  r  rY   r)   r'   <module>r     sw       2 ' ' " ( 3 6 , 4 
 , ' V K    &S@H @F(x (V6H 6rQ( QhKH K\8 8vUI Upj# jZ)9 )XS9 Sl%9 %85, 5,p(H ( K8 K\
) 
<, <~- :"+ "Jb' br)   