
    si                       d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZ 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mZ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# 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/m0Z0 d dl1m2Z2 d dl3m4Z4m5Z5m6Z6m7Z7m8Z8 ddl9 ddl:m;Z;m<Z<m=Z=m>Z> ddl? ddl@mAZAmBZBmCZCmDZDmEZE ddlF  ej                  eH      ZIe)d        ZJe)d        ZKe)d        ZLe)d        ZMe) eBd      d               ZN e*d      e)d                ZOe) eP       d!               ZQe) eP       d"               ZRe) eS       d#               ZTe)d$        ZUd% ZVe)d&        ZWe)d'        ZXe)d(        ZYe)d)        ZZe) eS       d*               Z[e) eP       d+               Z\e)e(d,               Z]e)d-        Z^e)d.        Z_e) e`       d/               Zae) eb       d0               Zce)d1        Zde) eP       d2               Zee)d3        Zfe)d4        Zge)d5        Zhe)d6        Zie)d7        Zje)d8        Zke)d9        Zle)d:        Zme)d;        Zne)d<        Zoe)d=        Zpe)d>        Zqe)d?        Zre) eS       e(d@                      Zse) et       dA               Zue) ev       dB               Zwe)dC        Zxe)dD        Zye)dE        Zze)dF        Z{dG Z|dH Z}dI Z~e)dJ        Ze)dK        Ze)dL        Ze)dM        Ze)dN        ZdO Ze)dP        Z|dQ ZdR ZdS ZdT Zy)U    N)defaultdict)parse_qsurlparse)messages)serializers)ValidationError)	Paginator)Http404HttpResponseHttpResponseRedirectJsonResponse)get_object_or_404redirectrender)render_to_string)reverse)gettext_lazy)filtersubordinatesget_key_instances)hx_request_requiredlogin_requiredpermission_required)notify)DynamicProjectCreationFormView)DynamicTaskCreateFormView)TimeSheetFormView)generate_colorspaginator_qrystrtime_secondstime_sheet_delete_permissionstime_sheet_update_permissions   )*)ProjectFilterTaskAllFilter
TaskFilterTimeSheetFilter) is_project_manager_or_super_user$is_projectmanager_or_member_or_permsis_task_manageris_task_memberyou_dont_have_permissionc                    t         j                  j                         }t        j                  |j
                  |j                        d   }t        j                  |j
                  |j                  |      }t        j                  j                         j                         }t        j                  j                  d      j                         }t        j                  j                  d      j                         }d|i}t        |      j                  }g }	|D ]#  }
|
j                  dk7  s|	j                  |
       % ||||	d}t!        | d|	      S )
zW
    Dashboard view of project
    Returns:
        it will redirect to dashboard.
    r"   newstatusin_progressend_tillexpired)total_projectsnew_projectsprojects_in_progressunexpired_projectz dashboard/project_dashboard.htmlcontext)datetimedatetodaycalendar
monthrangeyearmonthProjectobjectsallcountfilterr$   qsr0   appendr   )requestr<   last_day	last_dater4   r5   r6   
date_rangeprojects_due_in_this_monthr7   projectr9   s               1/var/www/python-projects/worksol/project/views.pydashboard_viewrO   4   s    MM!E""5::u{{;A>Hejj%++x@I__((*002N??)))7==?L"??111GMMOi(J!.z!:!=!=- .>>Y&$$W-.
 )$ 4.	G '=wOO    c                    g }g }t         j                  }|D cg c]  }|d   	 }}|D ]  }|j                  |d   g d        |D ]  }t         j                  j	                  |d         j                         }g }	t        |      D ]6  \  }
}|d   ||
   d   k(  r|	j                  |       &|	j                  d       8 |j                  |d   |	d        t        ||d      S c c}w zH
    This method is used generate project dataset for the dashboard
    r"   )labeldatar   r/   rS   dataSetlabels)rA   PROJECT_STATUSrG   rB   rE   rD   	enumerater   rH   initial_datadata_setchoicestyperW   rS   r0   rD   rT   indexs              rN   project_status_chartr`   V   s   
 LH$$G")*$d1g*F* 
q	

  
&&fQi&8>>@%l3 	LE5ayL/88E"A		
 		

 H?@@/ +   C(c                    g }g }t         j                  }|D cg c]  }|d   	 }}|D ]  }|j                  |d   g d        |D ]  }t         j                  j	                  |d         j                         }g }	t        |      D ]6  \  }
}|d   ||
   d   k(  r|	j                  |       &|	j                  d       8 |j                  |d   |	d        t        ||d      S c c}w rR   )TaskTASK_STATUSrG   rB   rE   rD   rY   r   rZ   s              rN   task_status_chartre   x   s    LHG")*$d1g*F* 
q	

  
##6!9#5;;=%l3 	LE5ayL/88E"A		
 		

 H?@@3 +ra   c                     t         j                  j                  |      }|j                  j	                         }||d}t        | d|      S )Nid)rM   
task_countzdashboard/project_details.htmlr8   )rA   rB   gettask_setrD   r   )rH   
project_idrM   ri   r9   s        rN   project_detailed_viewrm      sL    oo!!Z!0G!!'')J G ';WMMrP   zproject.view_project)permc                    t               }d}| j                  j                  d      dk(  rd}t        j                  j                         }| j                  j                  d      t        | j                        j                  }| j                  d   }| j                  j                  d      }|t        ||      ||d}t        | d|      S )	z3
    Overall view of project, the default view
    cardviewlistsearchQUERY_STRINGpage)	view_typeprojectspdfzproject/new/overall.html)
r$   GETrj   rA   rB   rC   rF   environr   r   )rH   formrv   rw   previous_datapage_numberr9   s          rN   project_viewr      s     ?DI{{v&(	""$H{{x , -00OON3M++//&)K!(K8	G '5w??rP   zproject.add_projectc                    t               }| j                  dk(  rt        | j                  | j                        }|j	                         rf|j                          t        j                  | t        d             t        | dd|i      }t        |j                  j                  d      dz         S t        | dd|i      S )z"
    For creating new project
    POSTzNew project createdz'project/new/forms/project_creation.htmlr|   r8   utf-8#<script>location.reload();</script>)ProjectFormmethodr   FILESis_validsaver   success_r   r   contentdecoderH   r|   responses      rN   create_projectr      s     =D~~7<<7==?IIKWa(=&>?9H    ''03XX  :VTN rP   c                    t         j                  j                  |      }t        |      }| j                  dk(  rt        | j
                  | j                  |      }|j                         rf|j                          t        j                  | t        d             t        | d||d      }t        |j                  j                  d      dz         S t        | d||d      S )	a6  
    Update an existing project.

    Args:
        request: The HTTP request object.
        project_id: The ID of the project to update.

    Returns:
        If the request method is POST and the form is valid, redirects to the project overall view.
        Otherwise, renders the project update form.

    rg   instancer   zProject updatedz%project/new/forms/project_update.htmlr|   rl   r   r   )rA   rB   rj   r   r   r   r   r   r   r   r   r   r   r   r   r   )rH   rl   rM   project_formr   s        rN   project_updater      s     oo!!Z!0G0L~~"7<<Q  "Wa(9&:;7%Z@H
    ''03XX  /Z8 rP   c                    | j                   j                  d      }	 t        t        |      }|r|j                  |k7  rQ||_        |j                          t        j                  | t        | d|j                          d             |j                  j                         |j                  j                         z  j                         }|D ]  }	 t        j                  | j                   j"                  |j$                  d| d|j                          dd| d|j                          dd	| d
|j                          dd| d|j                          dd| d|j                          dt'        dd|j(                  i              nSt        j0                  | t        | d|j                          d             nt        j.                  | t        d             t5        d      S # t*        $ r }t,        j/                  |       Y d}~Dd}~ww xY w# t2        $ r, t        j.                  | t        d             Y t5        d      S w xY w)zp
    HTMX function to update the status of a project.
    Args:
    - project_id: ID of the Project object.
    r0   rg   z status updated to .zThe status of the project 'z' has been changed to u)   تم تغيير حالة المشروع 'u	   ' إلى zDer Status des Projekts 'z' wurde auf u    geändert.zEl estado del proyecto 'z' ha sido cambiado a zLe statut du projet 'u   ' a été changé en 	task-viewrl   kwargs)	recipientverbverb_arverb_deverb_esverb_frr   Nz status is already set to zInvalid status or missing data.z%The specified project does not exist.4<script>$('#reloadMessagesButton').click();</script>)r   rj   r   rA   r0   r   r   r   r   get_status_displaymanagersrC   membersdistinctr   senduseremployee_getemployee_user_idr   rh   	Exceptionloggererrorinfor
   r   )rH   rl   r0   rM   	employeesemployeees          rN   change_project_statusr     sE    \\h'F(L#G
;~~'!'  	!4W5O5O5Q4RRSTU
 %--113goo6I6I6KKUUW	 ) (H(#LL55&.&?&?#>wiG]^e^x^x^z]{{|!}&OPWyXabib|b|b~a  @A  %B&?yU\UoUoUqTrr}$~&>wiG\]d]w]w]y\zz{$|&;G9DYZaZtZtZvYwwx$y%, +(4gjj'A&($ ")#=g>X>X>Z=[[\] NN7A&G$HI NOO % (Q(  Lw"I JKNOOLs>   B6H B;G0AH 0	H9HH HH (IIc                     | j                   j                  d      }t        d      }| d| }t        j                  j                  |      j                          t        |      S )z'
    For deleting existing project
    rq   zproject-view?view=rg   )rz   rj   r   rA   rB   deleter   )rH   rl   rv   project_view_urlredirected_urls        rN   project_deleter   7  s[     'I~.()	{;NOO:&--/N##rP   c                 N   t        | j                        j                  }d}| j                  j                  d      dk(  rd}| j                  d   }| j                  j                  d      }|}t        |      }t        t        |       t        ||      |||d}t        | ||      S )z 
    For filtering projects
    z$project/new/project_kanban_view.htmlrq   rr   z"project/new/project_list_view.htmlrt   ru   )rw   rx   ry   filter_dict)
r$   rz   rF   rj   r{   r   r   rA   r   r   )rH   rw   templeter}   r~   
filter_obj	data_dictr9   s           rN   project_filterr   E  s    
 W[[),,H5H{{v&(7OON3M++//&)KJ'Igy)!(K8 	G '8W--rP   c                 `    |j                  |       }	 t        |       y# t        $ r |cY S w xY w)z4
    This method is returns None or field value
    N)rj   float
ValueError)fielddictsfield_values      rN   convert_nanr   \  s7     ))E"Kk s    --c                 
   t        j                  g d      }t        d      }d|d<   |j                  |d       | j                  d	k(  r| j
                  j                  d
      | j
                  d
   }t        j                  |      }|j                  d      }g }|D ]  }	 |d   }t        d|      }t        d|      }	|d   }
|d   }|d   }|d   }d}|r|j                  d      }g }g }|D ]  }t        j                  j                  |      j                         r@t        j                  j                  |      j                         }|j!                  |       q|j!                  |       d} |r'dj#                  t%        t&        |            }| d|d<   |	r|	j                  d      }g }g }|D ]  }t        j                  j                  |      j                         r@t        j                  j                  |      j                         }|j!                  |       q|j!                  |       d} |r'dj#                  t%        t&        |            }| d|d<   |
r0|
t(        j*                  D cg c]  \  }}|	 c}}vr|
 d|d<   d}nd|d<   d}d}|rF	 t-        t.        j.                  j1                  |j3                  d      |            }|dk(  rd|d<   d}nd |d<   d}|rQ	 t-        t.        j.                  j1                  |j3                  d      |            }||k  rd!|d"<   d}|dk(  rd|d"<   d}|dk(  rt(        j                  j                  |#      j                         r/t(        j                  j                  |#      j                         }nt)        |#      }|j3                  d      |_        |j3                  d      |_        |
|_        ||_        |jA                          D ]  }|jB                  jE                  |        |jA                          D ]  }|jF                  jE                  |        |jA                          n|j!                  |        |rtI        tJ              }|D ]   }|D ]  }||   j!                  ||           " t        j                  ||d$   jM                               }t        d      }d%|d<   |j                  |d       |S t        d&      S |S c c}}w # t4        $ r}d}Y d}~Ad}~ww xY w# t6        $ r d}Y w xY w# t4        $ r}|j!                  |       Y d}~d}~ww xY w)'zU
    This method is used to import Project instances and creates related objects
    )TitleManager Badge idMember Badge idStatus
Start DateEnd DateDescriptioncolumnsapplication/ms-excelcontent_typez,attachment; filename="project_template.xlsx"Content-DispositionF)r_   r   fileNrecordsr   r   r   r   r   r   r   T,)badge_idz - This id not existszManager errorzMember errorz  not available in Project statuszStatus errorzStatus is a required field%Y-%m-%dz#Date must be in 'YYYY-MM-DD' formatzStart date errorzStart date is a required fieldz(End date must be greater than Start datezend date error)titler   z'attachment; filename="ImportError.xlsx"zImported successfully)'rx   	DataFramer   to_excelr   r   rj   
read_excelto_dictr   splitEmployeerB   rE   existsfirstrG   joinmapstrrA   rX   boolr:   strptimestrftimer   r   
start_dateend_dater0   descriptionr   r   addr   r   rr   keys)rH   
data_framer   r   project_dictserror_listsrM   r   manager_badge_idmember_badge_idr0   r   r   r   is_saveids	error_idsr   rh   r   r   statr   formatresr   project_objmanagermembersubkeys                                  rN   project_importr   h  s   
 

J )?@H&TH"#.~~GMM$5$5f$=$I}}V$]]4(
"**95$ 	,G~,(#./A7#K "-.?"I *$\2
":.%m4 #*005C "I!H! ,#++22B2?FFH'/'7'7'>'>'>'K'Q'Q'SH$OOH5%,,R0&+G, !!hhs3	':;69U:O3P0 #)//4C "I "I! ,#++22B2?FFH'/'7'7'>'>'>'K'Q'Q'SH%,,X6%,,R0&+G, !!hhs3	':;58E9N2O/':P:P%QwtQd%QQ%h&FG  / #(.JGN+#G#$"$--66 * 3 3J ? e|A   23 #(2RG./#G$"$--66 ( 1 1* =v
 $j0 J $$45 ',G e|A   01 #(d?--E-:AAC&-oo&<&<5&<&I&O&O&Q&-E&:-7-@-@-LK*+3+<+<Z+HK()/K&.9K+$$&#+ :#,,009:$$&"+ 8#++//78$$&&&w/y	,@ d#C" . .CHOOCH-.. k;q>;N;N;PQJ#1GHH.WH*+6O344Ok &R& % $#$0 & $#$8  ,""7++,s{   'GT; T

T;(8T T;7AT);D;T;
T;	T&T!T;!T&&T;)T84T;7T88T;;	U UU c           
         | j                   d   }t        j                  |      }g }g d}|D ]y  }t        j                  j                  |      }|j                   |j                  j                         rQdj                  |j                  j                         D cg c]  }|j                  dz   |j                  z     c}      nd |j                  j                         rQdj                  |j                  j                         D cg c]  }|j                  dz   |j                  z     c}      nd |j                   |j                  j!                  d       |j"                  r|j"                  j!                  d      nd |j$                   d}|j'                  |       | t)        j*                  ||      }	t-        d	
      }
d|
d<   t)        j.                  |
d      }|	j1                  |ddd       |j2                  }|j4                  d   }t7              }|j9                  ddddddd      }|j9                  ddddddd      }|j;                  dd       |j=                  ddd|dz
  d |       t?        |	j@                  jB                        D ]  \  }}|jE                  d|||       tG        d!|z         }tI        t7        |      d"z   t7        |	|   jK                  tL              jI                               d"z         }|jO                  | d#| |        |jQ                          |
S c c}w c c}w )$zA
    This method is used to export bulk of Project instances
    r   )r   ManagersMembersr   r   r   r   rg   r     r   r   r   r   z+attachment; filename="project details.xlsx"r   
xlsxwriter)enginezProject detailsF   )
sheet_namer_   startrowz#ffd0ccT   centervcenter   )bg_colorbold	font_sizealignvalignr  z#EDF1FF   r"   )r  r  	text_wrapr  r  borderr      zProject details A      :))r   jsonloadsrA   rB   rj   r   r   r   r   rC   employee_first_nameemployee_last_namer   r0   r   r   r   r   rG   rx   r   r   ExcelWriterr   booksheetslen
add_formatset_rowmerge_rangerY   r   valueswritechrmaxastyper   
set_columnclose)rH   r   	data_listheadersrl   rM   r   r   rT   r   r   writerworkbook	worksheetmax_columnsheading_formatheader_formatcol_numvalue
col_letterheader_widths                        rN   project_bulk_exportr5    s    ,,u
C
**S/CIG  
//%%%4 QX  Qa  Qa  Qh  Qh  Qj399t{  uE  uE  uI  uI  uK  &Lipg&A&AC&G'JdJd&d  &L  M  pr  s LS  L[  L[  Lb  Lb  Ld#))pwpp  qD  qD  qF  %GflV%?%?#%EHaHa%a  %G  H  jl  m ($//88DEDKDTDT7++44Z@Z\]%112
 	 i9J)?@H&SH"#^^H\:F$	   {{H/0Id)K((!	
	N ''!	
	M a			a $J$6$6$=$=> I7E=9g&
3u:>3z%/@/G/G/L/P/P/R+SVW+WX
|1ZL9<H	I LLNO} &L %Gs   #L9#L>c                    	 | j                   j                  d      }| j                  j                  dd      j                         }|dv rd}d}n3|d	v rd
}d}n*t        j                  | t        d             t        d      S |D ]  }t        j                  j                  |      j                         }|r@t        | |      r4||_        |j!                          t        j"                  | | d| d       st        j$                  | d|         t        d      S # t        $ r- t        j                  | t        d             t        d      cY S w xY w)Nr   Could not retrieve project IDs.+<script>$('#applyFilter').click();</script>	is_activer  )trueTzUn-Archived)falseFArchivedz5Invalid value for 'is_active'. Use 'true' or 'false'.rg    is z successfully.z+Permission denied or project not found: ID )r   getlistr   r   r   r   r   rz   rj   lowerrA   rB   rE   r   r(   r9  r   r   warning)rH   r   is_active_rawr9  messagerl   rM   s          rN   project_bulk_archiverC  l  sJ   Kll""5)
 KKOOK4::<M 		)	#	QNO	
 IJJ 	
//((J(7==?7I )GLLNW	gYn&MNFzlS	 EFF;  Kw"C DEIJJKs   D 3EEc                    	 | j                   j                  d      }|s*t        j                  | t	        d             t        d      S 	 t        j                  j                  |      }g }g }|D ]:  }t        | |      r|j                  |       !|j                  t        |             < |r8t        j                  | t	        d      j                  t!        |                   |r3t        j                  | t	        d      d	d
j#                  |      iz         t        d      S # t        $ r- t        j                  | t	        d             t        d      cY S w xY w)z^
    This method deletes a set of Project instances in bulk, after verifying permissions.
    r   zNo project IDs were provided.r8  r7  )id__inz({count} project(s) deleted successfully.)rD   z/Permission denied or skipped for: %(projects)s.rw   z, )r   r>  r   r@  r   r   r   r   rA   rB   rE   r(   rG   r   r   r   r  r   )rH   r   rw   deletable_projectsskipped_projectsrM   s         rN   project_bulk_deleterH    sT   Kll""5)Wa(G&HI MNN  %%S%1H 2+GW=%%g.##CL1	2 89@@,- A 	
 ?@499%5678	
 EFF?  Kw"C DEIJJKs   AD' '3EEc                 J   t         j                  j                  |      }|j                   |_        |j	                          t        | d      }|j                  st        | d      }t        j                  | |       t        | j                  j                  d            S )zp
    This method is used to archive project instance
    Args:
            project_id : Project instance id
    rg   z Un-Archived successfully.z Archived successfully.HTTP_REFERER)
rA   rB   rj   r9  r   r   r   r   r   META)rH   rl   rM   rB  s       rN   project_archiverL    s     oo!!Z!0G#---GLLN7)567Gwi678Wg& 0 0 @AArP   c                    t               j                  }|j                  j                         D ]  \  }}|j                  j	                  |      s"|j                  |   j
                  j                  j	                  d      sU|j                  |   j
                  j                  d= d|j                  |   j
                  j                  d<    d}t        j                  j	                  |      }t        j                  j                  |      j                  d      }t        j                  j                  |      }	t        j                  j                  |j                        |j                  d   _        | j                  j	                  d	      d
k(  s| j                  j	                  d	      dk(  rd
}||	|||t         j                   j#                         j%                         |d}
t'        | d|
      S )z
    For showing tasks
    rh   zw-100 oh-select oh-select2classrp   rg   rM   sequencestagerq   rr   N)rv   tasksstagesrl   rM   r<   r|   ztask/new/overall.html)r%   r|   fieldsitemsrj   widgetattrsrA   rB   ProjectStagerE   order_byrc   rh   querysetrz   r:   r<   r;   r   )rH   rl   r   r|   r   r2  rv   rM   rS  rR  r9   s              rN   	task_viewr[    s    ?D))+ Tu;;??5!dkk%&8&?&?&E&E&I&I$&OE"))//57SDKK%%++G4T Ioo!!Z!0G!!(((9BB:NFLL0E$0$8$8$?$?

$?$SDKK!{{v&(GKKOOF,Ct,K	 ""((*//1G '2G<<rP   c           	         t         j                  j                  |      }| j                  j                  d      }| j                  j
                  |j                  j                  j                         v s| j                  j                  d      rt        ||j                  |j                  j                  d      }| j                  dk(  rwt        | j                        }|j                         rR|j                          t!        j"                  | t%        d             t'        d|j                  j(                   d	      S t+        | d
|||j                  j(                  |d      S t!        j,                  | d       t'        d      S )Nrg   HTTP_HX_TARGETzproject.add_task)rQ  rM   r   initialr   z'The task has been created successfully!#<span hx-get='/project/task-filter/zA/?view=card' hx-trigger='load' hx-target='#viewContainer'></span>z*task/new/forms/quick_create_task_form.html)r|   stage_idrl   	hx_targetr8   You dont have permission.z)<script>window.location.reload()</script>)rX  rB   rj   rK  r   r   rM   r   rC   has_permQuickTaskFormr   r   r   r   r   r   r   r   r   rh   r   r   )rH   ra  project_stagerb  r|   s        rN   quick_create_taskrg    sW    !((,,,9M  !12I!!]%:%:%C%C%G%G%II<<  !34&(00)11::
 >>V# .D}}		  !,U*VW#9-:O:O:R:R9S  TU  V  8$+3366&		
 		
 MM'67CDDrP   c                 "   t         j                  j                  |      }|j                  }| j                  j
                  |j                  j                         v s| j                  j                  d      rt        d|i      }| j                  dk(  rt        | j                  | j                        }|j                         r|j                  d      }||_        |j                          t!        j"                  | t%        d             t'        | d	||d
      }t)        |j*                  j-                  d      dz         S t'        | d	||d
      S t!        j.                  | d       t1        | j2                  j                  dd            S )/
    For creating new task in project view
    rg   project.delete_projectrM   r^  r   FcommitNew task createdztask/new/forms/create_task.htmlr|   ra  r8   r   r   rc  rJ  /)rX  rB   rj   rM   r   r   r   rC   rd  TaskFormr   r   r   r   r   rQ  r   r   r   r   r   r   r   r   r   rK  )rH   ra  rf  rM   r|   r   r   s          rN   create_taskrq    sZ   
 !((,,,9M##G||  G$4$4$8$8$::gll>S>S ? G 45>>V#GLL'--8D}}99E92!.  !,>*?@!5%)x@
 $$$++G4;<  -!x8
 	

 MM'67 0 0 EFFrP   c                 >   t         j                  j                  |      }|j                  j	                         }t        j                  d|      }| j                  j                  |j                  j	                         v s| j                  j                  d      rt        d|i      }| j                  dk(  rt        | j                  | j                        }|j                         rg|j!                          t#        j$                  | t'        d             t)        | d||d	
      }t+        |j,                  j/                  d      dz         S |||d}t)        | d|
      S t#        j0                  | d       t3        | j4                  j                  dd            S )ri  rg   r  rj  rM   r^  r   rm  z'task/new/forms/create_task_project.htmlr   r8   r   r   )r|   rl   rS  rc  rJ  ro  )rA   rB   rj   project_stagesrC   r   	serializer   r   r   rd  TaskFormCreater   r   r   r   r   r   r   r   r   r   r   r   r   r   rK  )rH   rl   rM   rS  serialized_datar|   r   r9   s           rN   create_task_in_projectrw  ;  sj   
 oo!!Z!0G##'')F "++FF;O||  G$4$4$8$8$::gll>S>S ? y'&:;>>V#!',,>D}}		  !,>*?@!=%)D
 $$$++G4;< 
 $%

 >
 	
 MM'67 0 0 EFFrP   c                    t         j                  j                  |      }|j                  }t	        |      }| j
                  dk(  rt	        | j                  | j                  |      }|j                         rf|j                          t        j                  | t        d             t        | d||d      }t        |j                  j!                  d      dz         S t        | d||d      S )	z+
    For updating task in project view
    rg   r   r   zTask updatedztask/new/forms/update_task.htmlr|   task_idr   r   )rc   rB   rj   rM   rp  r   r   r   r   r   r   r   r   r   r   r   r   )rH   rz  taskrM   	task_formr   s         rN   update_taskr}  d  s     <<w'DllG$'I~~W\\7==4H	NNWa&781"w7H
    ''03XX  )	
 rP   c                    | j                   j                  d      }t        | j                  d         j                  }|j                  d      d   j                  d      }|j                  d      }|d   }t        |      dkD  r|d   nd}|dk(  st        |d	|i
      }nt        d      }| d| }	t        j                  j                  |      }
|
j                  j                  }|
j                          t        j                  | t!        d             | j                  j                  d      rt#        d| d| d      S t%        |	      S )z
    For delete task
    rq   rJ  zproject/r"   ro  r   Nztask-allrl   r   r   rg   z'The task has been deleted successfully.HTTP_HX_REQUESTr`  /?view=6' hx-trigger='load' hx-target='#viewContainer'></span>)rz   rj   r   rK  pathr   rstripr  r   rc   rB   rM   rh   r   r   r   r   r   r   )rH   rz  rv   r  url_after_projectparts	view_name	object_idtask_view_urlr   r{  rl   s               rN   delete_taskr    s9    'IGLL0166D

:.q188=##C(EaIJNaI
"	<2KL
+%fYK8N<<w'DJKKMWa IJK||)*1*WYK  PF  G
 	
 N##rP   c                 b    t         j                  j                  |      }t        | dd|i      S )z,
    For showing all details about task
    rg   ztask/new/task_details.htmlr{  r8   )rc   rB   rj   r   )rH   rz  r{  s      rN   task_detailsr    s/    
 <<w'D'7&$PPrP   c                 l   d}| j                   j                  d      dk(  s<| j                   j                  d      dk(  s| j                   j                  d      dk(  rd}t        | j                         j                  j	                  |      }t
        j                  j	                  |      j                  d      }| j                  d	   }t        |      }t        t        |       |j                  d
      r|d
= |j                         || j                   j                         ||d}t        | ||      S )z
    For filtering task
    ztask/new/task_kanban_view.htmlrq   rr   Nr  ztask/new/task_list_view.html)rl   rP  rt   rM   )rR  rS  rx   rl   r   )rz   rj   r&   rF   rE   rX  rB   rY  r{   r   r   rc   r   	urlencoder   )rH   rl   r   rR  rS  r}   r   r9   s           rN   task_filterr    s	    0H6);;??6"d*;;??6"b(1w{{#&&---DE##z#:CCJO  OON3M'IdI&}}Yi !kk##%  G '8W--rP   c                    | j                   d   }| j                   d   }t        j                  j                  |      }t        j                  j                  |      j                  |       t        dt        d      d      S )zC
    This method is used to change the current stage of a task
    r{  rQ  rg   rQ  r   zTask stage updated)r^   rB  )	r   rX  rB   rj   rc   rE   updater   r   )rH   rz  ra  rQ  s       rN   task_stage_changer    sz    
 ll6"G||G$H  $$$1ELL7#***7-.	
 rP   c                     t         j                  j                  |      }|j                  j	                         }||d}t        | d|      S )z3
    For showing all timesheet related to task
    rg   )time_sheetsrz  ztask/new/task_timesheet.htmlr8   )rc   rB   rj   task_timesheetrC   r   )rH   rz  r{  r  r9   s        rN   r  r    sO    
 <<w'D%%))+K)g>G& rP   c                    t         j                  j                  |      }|j                  }t	        ||d      }| j
                  dk(  rt	        | j                        }|j                         rf|j                          t        j                  | t        d             t        | d||d      }t        |j                  j                  d      d	z         S ||d}t        | d|
      S )Nrg   )rl   rz  r^  r   zTimesheet createdz$task/new/forms/create_timesheet.htmlry  r   r   r8   )rc   rB   rj   rM   TimesheetInTaskFormr   r   r   r   r   r   r   r   r   r   r   )rH   rz  r{  rM   r|   r   r9   s          rN   create_timesheet_taskr    s    <<w'DllGg$'OPD~~"7<<0==?IIKWa(;&<=6'2H
    ''03XX  G 'A7SSrP   c                    t         j                  j                  |      }t        |      }| j                  dk(  rt        | j
                  |      }|j                         rf|j                          t        j                  | t        d             t        | d||d      }t        |j                  j                  d      dz         S ||d}t        | d|	      S )
Nrg   r   r   zTimesheet updatedz$task/new/forms/update_timesheet.html)r|   timesheet_idr   r   r8   )	TimeSheetrB   rj   r  r   r   r   r   r   r   r   r   r   r   r   )rH   r  	timesheetr|   r   r9   s         rN   update_timesheet_taskr  	  s    !!%%%6I	2D~~"7<<)D==?IIKWa(;&<=6|<H
    ''03XX  $G 'A7SSrP   c                 *   | j                   d   }| j                   d   }| j                   d   }d}t        j                  j                  |      }|j                  }| j
                  j                  d      s| j
                  j                  d      s| j
                  j                  |j                  j                         v s| j
                  j                  |j                  j                         v sa| j
                  j                  |j                  j                         v s1| j
                  j                  |j                  j                         v r||k7  r7t        j                  j                  |      |_        |j                          d}t!        j"                  | j                   d	         }|j%                         D ]e  \  }}	t        j                  j                  |      j&                  |	k7  s4t        j                  j)                  |      j+                  |	
       d}g ||k7  rt-        d      n
t-        d      }
t/        j0                  | |
       t3        d|i      S d}t/        j4                  | t-        d             t3        d|i      S )z/
    For drag and drop task into new stage
    updated_stage_idprevious_task_idprevious_stage_idFrg   zproject.change_taskproject.change_projectTrP  rP  z)Task stage has been successfully updated.z*Tasks order has been successfully updated.changerc  )r   rc   rB   rj   rM   r   rd  r   task_managersrC   task_membersr   r   rX  rQ  r   r  r  rU  rP  rE   r  r   r   r   r   r   )rH   r  r  r  r  r{  rM   rP  r   valrB  s              rN   drag_and_drop_taskr  !  s   
 ||$67||$67%89F<</0DllG34<<  !9:<<$$(:(:(>(>(@@<<$$(9(9(=(=(??<<$$(8(8(<(<(>><<$$(;(;(== 00%--115E1FDJIIKF::gll:67 ( 	HC||3'00C7##s#+22C2@	 !$44 9:?@ 	
 	'*Xv.//FMM'189:6*++rP   c                 8   t               }d}t        | j                        j                  }| j                  j                  d      dk(  rd}t	        || j                  j                  d            | j                  j                         ||d}t        | d|      S )z
    For showing all task
    rp   rq   rr   ru   )rR  rx   ry   rv   ztask_all/task_all_overall.htmlr8   )r%   rz   rF   rj   r   r  r   )rH   r|   rv   rR  r9   s        rN   task_allr  L  s    
 ?DI'++&))E{{v&(	ugkkoof&=>kk##%	G ';WMMrP   c                    t               }| j                  dk(  rt        | j                  | j                        }|j	                         rf|j                          t        j                  | t        d             t        | dd|i      }t        |j                  j                  d      dz         S t        | dd|i      S )z0
    For creating new task in task all view
    r   rm  z"task_all/forms/create_taskall.htmlr|   r8   r   r   )TaskAllFormr   r   r   r   r   r   r   r   r   r   r   r   r   s      rN   task_all_creater  _  s    
 =D~~7<<7==?IIKWa(:&;<4DH    ''03XX  ,D
 rP   c                    | j                   j                  d      }t        t        |      }|j                  rK|j                  t
        j                         k  r*t        j                  | t        d             t        d      S ||_        |j                          t        j                  | t        d             t        d      S )Nr0   rg   z/Cannot update status. Task has already expired.r   z)Task status has been updated successfully)rz   rj   r   rc   r   r;   r<   r   r@  r   r   r0   r   r   )rH   rz  r0   r{  s       rN   update_project_task_statusr  }  s    [[__X&FTg.D}}5!$U"VWRSSDKIIKWa KLMNOOrP   c                    t         j                  j                  |      }t        |      }| j                  dk(  rt        | j
                  | j                  |      }|j                         rg|j                         }t        j                  | t        d             t        | d||d      }t        |j                  j                  d      d	z         S t        | d||d      S )
Nrg   r   r   zTask updated successfullyz"task_all/forms/update_taskall.htmlry  r8   r   r   )rc   rB   rj   r  r   r   r   r   r   r   r   r   r   r   r   r   )rH   rz  r{  r|   r   s        rN   update_task_allr    s    <<w'D%D~~7<<F==?99;DWa(C&DE4!%':H
    ''03XX  ,'2 rP   c                 R   d}d}| j                   j                  d      dk(  rd}d}t        | j                         j                  }| j                   j                  d      }| j                  d   }t        |      }t        t        |       t        ||      |||d}t        | ||      S )	z.
    For filtering tasks in task all view
    rp   ztask_all/task_all_card.htmlrq   rr   ztask_all/task_all_list.htmlru   rt   )rR  rv   rx   r   )
rz   rj   r%   rF   r{   r   r   rc   r   r   )rH   rv   r   rR  r~   r}   r   r9   s           rN   task_all_filterr    s    
 I,H{{v&(	0'++&))E++//&)KOON3M'IdI& uk2 	G '8W--rP   c                    | j                   d   }t        j                  |      }d}| j                  j	                  d      dk(  rd}|D ]l  }t
        j                  j	                  |      }||_        |j                          t        d      }|rt        d      }t        j                  | | d	|        n t        d
di      S )z?
    This method is used to archive bulk of Task instances
    r   Fr9  TrueTrg   archivedzun-archivedr=  rB  Success)r   r  r  rz   rj   rc   rB   r9  r   r   r   r   r   )rH   r   r9  rz  r{  rB  s         rN   task_all_bulk_archiver    s     ,,u
C
**S/CI{{{#v-	 :||7+"		J-&GTF$wi"89: I.//rP   c           
         | j                   d   }t        j                  |      }g }|D ]D  }t        j                  j                  |      }	 |j                          |j                  |       F t        j                  | t        dj                  t        |                         t        ddi      S # t        $ rD}t        j                  | |       t        j                  | t        d      d|iz         Y d}~d}~ww xY w)	=
    This method is used to delete set of Task instances
    r   rg   zYou cannot delete %(task)s.r{  Nz	{} tasks.rB  r  )r   r  r  rc   rB   rj   r   rG   r   r   r   r   r   r   r  r   )rH   r   del_idsrz  r{  r   s         rN   task_all_bulk_deleter    s     ,,u
C
**S/CG W||7+	WKKMNN4 	W Wa 2 23w< @ABI.//	  	WNN7E*NN7A&C$DPT~$UVV	Ws   !B44	D=:C<<Dc                 J   t         j                  j                  |      }|j                   |_        |j	                          t        | d      }|j                  st        | d      }t        j                  | |       t        | j                  j                  d            S )zj
    This method is used to archive project instance
    Args:
            task_id : Task instance id
    rg   z un-archivedz	 archivedrJ  )
rc   rB   rj   r9  r   r   r   r   r   rK  )rH   rz  r{  rB  s       rN   task_all_archiver    s     <<w'D'DNIIK4&%&G>>tfI&'Wg&   0 0 @AArP   c                    t         j                  j                  |      }t        d|i      }| j                  dk(  rt        | j
                        }|j                         rz|j                  d      }|j                          ||d}t        j                  | t        d             t        | d	|      }t        |j                  j                  d
      dz         S ||d}t        | d	|      S )z"
    For create project stage
    rg   rM   r^  r   Frk  r   zNew project stage createdz-project_stage/forms/create_project_stage.htmlr   r   )rA   rB   rj   ProjectStageFormr   r   r   r   r   r   r   r   r   r   r   )rH   rl   rM   r|   r   r9   r   s          rN   create_project_stager    s     oo!!Z!0GY$89D~~LL
 ==?yyy.HMMO#:>GWa(C&DE?H
    ''03XX  :6G'JGTTrP   c                    t         j                  j                  |      }t        |      }| j                  dk(  rt        | j
                  |      }|j                         rg|j                          t        j                  | t        d             t        | d||d      }t        |j                  j                  d      d	z         S t        | d||d      S )
z"
    For update project stage
    rg   r   r   z"Project stage updated successfullyz-project_stage/forms/update_project_stage.htmlrn  r8   r   r   )rX  rB   rj   r  r   r   r   r   r   r   r   r   r   r   r   )rH   ra  rQ  r|   r   s        rN   update_project_stager     s       $$$1EU+D~~u===?IIKWa(L&MN?!%8<H
    ''03XX  784 rP   c                 .   | j                   j                  d      }|dk(  rd}t        j                  j                  |      }t        j                  j                  |      }|j                  j                  }|s0|j                          t        j                  | t        d             nt        j                  | t        d             | j                  j                  d      rt        d	| d
| d      S t        d|g      }| d| }t!        |      S )z"
    For delete project stage
    rq   Nrr   rg   r  zStage deleted successfullyz+Can't Delete. This stage contain some tasksr  r`  r  r  r   )argsr   )rz   rj   rX  rB   rc   rE   rM   rh   r   r   r   r   r@  rK  r   r   r   )rH   ra  rv   rQ  rR  rl   r  r   s           rN   delete_project_stager  <  s     'ID	  $$$1ELLe,E!!J!$@"AB!$Q"RS||)*1*WYK  PF  G
 	
 Kzl;M%fYK8NN##rP   c                    | j                   j                  d      }t               }g |j                  d   _        |rvt
        j                  j                  |      }dt        d      fg|D cg c]  }|j                  |j                  f c}z   dt        d      fgz   |j                  d   _        t        | d| |d	      S c c}w )
z
    This is an ajax method to return json response to take only stages related
    to the project in the task-all form fields
    rl   rQ  rO  r  zSelect Stagedynamic_createzDynamic Createzcbv/tasks/task_form.html)rH   r|   )rz   rj   r  rT  r]   rX  rB   rE   r   rh   r   r   )rH   rl   r|   rS  rQ  s        rN   
get_stagesr  W  s     .J=D#%DKK %%,,Z,@!N#$%4:;5%++&;< !$4"5678 	G$ +$-O  <s   -Cc                    | j                   dk(  r=| j                  d   }t        j                  j	                  |      }t        d|i      }| j                   dk(  r~t        | j                        }|j                         r2|j                         }t        |j                  |j                  d      S |j                  j                         }t        d|i      S t        | d	d
i      S )z
    This is an ajax method to return json response to create stage related
    to the project in the task-all form fields
    rz   rl   rg   rM   r^  r   rh   nameerrorsz0task_all/forms/create_project_stage_taskall.htmlr|   r8   )r   rz   rA   rB   rj   r  r   r   r   r   rh   r   r  as_jsonr   )rH   rl   rM   r|   r   r  s         rN   create_stage_taskallr  r  s     ~~[[.
//%%%4G(<=~~-==?yy{Hx{{HNN KLL$$&Xv.//: rP   c                 t   | j                   d   }t        j                  |      }t        |j	                               d   }t
        j                  j                  |      j                  }d}| j                  j                  d      s`| j                  j                  |j                  j                         v s0| j                  j                  |j                  j                         v r|j                         D ]e  \  }}|t
        j                  j                  |      j                   k7  s4d}t
        j                  j#                  |      j%                  |       g |rt'        j(                  | t+        d             t-        d	|i      S t'        j.                  | t+        d
             t-        d|i      S )z;
    For drag and drop project stage into new sequence
    rP  r   rg   Fr  Tr  z9The project stage sequence has been successfully updated.r  zYou don't have permission.r^   )r   r  r  rr   r   rX  rB   rj   rM   r   rd  r   r   rC   r   rU  rP  rE   r  r   r   r   r   r@  )rH   rP  ra  rM   r  r   r  s          rN   drag_and_drop_stager    ss   
 ||J'Hzz(#HHMMO$Q'H""&&(&3;;GF67<<$$(8(8(<(<(>><<$$(;(;(== ( 	IHCl**..#.6???$$++s+3::C:H	I VW &
 	

 Wa <=>())rP   c                    t               }d}| j                  j                  d      dk(  rd}t        | j                        j                  }t	        | |d      }t        |      }t        j                  j                  | j                  j                        D ]  }||vs|j                  |        t        || j                  j                  d            }|||d}t        | d|	      S )
ay  
    View function to display time sheets based on user permissions.

    If the user is a superuser, all time sheets will be shown.
    Otherwise, only the time sheets for the current user will be displayed.

    Parameters:
        request (HttpRequest): The HTTP request object.

    Returns:
        HttpResponse: The rendered HTTP response displaying the time sheets.
    rp   rq   rr   project.view_timesheetemployee_idru   )r  ry   rv   ztime_sheet/time_sheet_view.htmlr8   )r'   rz   rj   rF   r   rr   r  rB   rE   r   r   rG   r   r   )rH   r|   rv   time_sheet_filteritemr  r9   s          rN   time_sheet_viewr    s     DI{{v&(	'477*"$< ./!!((W\\5N5N(O +(($$T*+   17;;??63JKK)9MG) rP   c                     | j                   d   }t        j                  j                  |      j	                  dd      }t        dt        |      i      S z
    This is an ajax method to return json response to take only tasks related
    to the project in the timesheet form fields
    rl   rO  r   rh   rT   rz   rc   rB   rE   r"  r   rr   rH   rl   rR  s      rN   time_sheet_initialr    sJ    
 \*JLL
3::7DIEe-..rP   c           	         | j                   j                  d      }| j                   j                  d      }t               }|r|r|dk7  r|dk7  rt        j                  j                  |      j                         }t        j                  j                  |      j                         }t        j                  j                  | j                  j                  j                        }|j                         |j                  j                         v rb||j                  j                         z  |j                  j                         z  |j                   j                         z  j#                         }nX|j                         |j                  j                         v r,||j                   j                         z  j#                         }n|}||j$                  d   _        n0t        j                  j)                         |j$                  d   _        t+        d|d|j$                  d   ||d      }t-        |      S )Nrl   rz  r  rg   r  z!cbv/timesheet/employee_field.html)r|   
field_namer   rz  rl   )rz   rj   TimeSheetFormrA   rB   rE   r   rc   r   r   r   rh   r   rC   r   r  r  r   rT  rZ  noner   r   )	rH   rl   rz  r|   rM   r{  r   r   employee_field_htmls	            rN   get_membersr    s   .Jkkooi(G?Dg&&:9I+Ioo,,
,;AACG<<&&'&288:D''..',,2K2K2N2N.OH~~7#3#3#7#7#99oo))+,((,,./ ''++-. (*  !T%7%7%;%;%==#d&7&7&;&;&==GGI"29DKK&/.6.>.>.C.C.EM"+*+'[[/$	
	 +,,rP   c                    | j                   j                  d      }t               }|r|dk7  rt        j                  j                  |      }| j
                  j                  }t        j                  j                  |      }||j                  j                         v s7||j                  j                         v s| j
                  j                  d      r|}nQt        j                  j                  ||      j                         rt        j                  j                  ||      j                         rRt        j                  j                  ||      t        j                  j                  ||      z  j                         }nt        j                  j                  ||      j                         r"t        j                  j                  ||      }nPt        j                  j                  ||      j                         r!t        j                  j                  ||      }|j                  d   _        t#        |j                  d   j$                        |j                  d   _        ||j                  j                         v s| j
                  j&                  r(|j                  d   j$                  j)                  d	       | j                   j                  d      }|rE||j                  d   _        n0t        j                  j-                         |j                  d   _        t/        d
|d|j                  d   d      }t1        |      S )Nrl   r  rg   rO  zproject.add_timesheet)rM   r  )rM   r  rz  )r  zDynamic createzcbv/timesheet/task_field.html)r|   r  r   )rz   rj   r  rA   rB   r   r   rc   rE   r   rC   r   rd  r   r   rT  rZ  rr   r]   is_superuserrG   r_  r  r   r   )	rH   rl   r|   rM   r   	all_tasksrR  rz  task_field_htmls	            rN   get_tasks_in_timesheetr    s   .J?Dj$44//%%%4<<,,LL'''8	 ((,,..7??..00||$$%<=E LL
(KRRT##JX#NUUW ##Jh#O,,%%jx%PQhj 
 \\  8 LSSULL''
('SE\\  ( KRRTLL''
'RE*/I')-dkk).D.L.L)MI&w''++--1J1JKK	"**112VW++//),-4DKK	"**.,,*;*;*=I'&'#[[+	
O ((rP   c                    | j                   j                  }t        d|i|       }| j                  dk(  rt        | j                  | j
                  |       }|j                         rf|j                          t        j                  | t        d             t        | dd|i      }t        |j                  j                  d	      d
z         S t        | dd|i      S )a  
    View function to handle the creation of a new time sheet.

    If the request method is POST and the submitted form is valid,
    a new time sheet will be created and saved.

    Parameters:
        request (HttpRequest): The HTTP request object.

    Returns:
        HttpResponse: The rendered HTTP response displaying the form or
        redirecting to a new page after successful time sheet creation.
    r  )r_  rH   r   )rH   zTime sheet createdztime_sheet/form-create.htmlr|   r8   r   r   )r   r   r  r   r   r   r   r   r   r   r   r   r   r   r   )rH   r   r|   r   s       rN   time_sheet_creationr  A  s     <<$$D-!6HD~~W\\7=='J==?IIKWa(<&=>6H    ''03XX  '864.QQrP   c                 f   t               }| j                  dk(  rt        | j                  | j                        }|j	                         r2|j                         }t        |j                  |j                  d      S |j                  j                         }t        d|i      S t        | dd|i      S )a  
    View function to handle the creation of a new project from time sheet form.

    If the request method is POST and the submitted form is valid,
    a new project will be created and saved.

    Returns:
        HttpResponse or JsonResponse: Depending on the request type, it returns
        either an HTTP response rendering the form or a JSON response with the
        created project ID and name in case of successful creation,
        or the validation errors in case of an invalid form submission.
    r   r  r  z'time_sheet/form_project_time_sheet.htmlr|   r8   )ProjectTimeSheetFormr   r   r   r   r   r   rh   r   r  r  r   )rH   r|   r   r  s       rN   time_sheet_project_creationr  a  s      !D~~#GLL'--@==?yy{Hx{{HNN KLL$$&Xv.//:VTN rP   c                 T   | j                   dk(  rq| j                  d   }t        j                  j	                  |      }t
        j                  j                  |      }t        d|i      }||j                  d   _	        | j                   dk(  rt        | j                  | j                        }|j                         r2|j                         }t        |j                  |j                   d	      S |j"                  j%                         }t        d
|i      S t'        | dd      S )a  
    View function to handle the creation of a new task from time sheet form.

    If the request method is GET, it initializes the task form with the
    provided project ID as an initial value.
    If the request method is POST and the submitted form is valid,
    a new task time sheet will be created and saved.

    Returns:
        HttpResponse or JsonResponse: Depending on the request type, it returns
        either an HTTP response rendering the form or a JSON response with the
        created task time sheet's ID and name in case of successful creation,
        or the validation errors in case of an invalid form submission.
    rz   rl   rg   )project__idrM   r^  rQ  r   r  r  z$time_sheet/form_task_time_sheet.htmlr   r8   )r   rz   rA   rB   rj   rX  rE   TaskTimeSheetFormrT  rZ  r   r   r   r   r   rh   r   r  r  r   )rH   rl   rM   rS  r|  r   r  s          rN   time_sheet_task_creationr  |  s      ~~[[.
//%%%4%%,,,D%y'.BC	-3	!*~~%gllGMMB	 ~~'Hx{{HNN KLL!!))+Xv.//."*= rP   c                 d   t        | |      rt        j                  j                  |      }t	        ||       }|j
                  j                  j                         |j                  d   _	        | j                  dk(  rt	        | j                  |      }|j                         rp|j                          t        j                  | t!        d             t	               }t#        | dd|i	      }t%        |j&                  j)                  d
      dz         S t#        | dd|i      S t#        | d      S )a=  
    Update an existing time sheet.

    Args:
        request: The HTTP request object.
        time sheet_id: The ID of the time sheet to update.

    Returns:
        If the request method is POST and the form is valid, redirects to the time sheet view.
        Otherwise, renders the time sheet update form.

    rg   )r   rH   rz  r   r   zTime sheet updatedz./time_sheet/form-create.htmlr|   r8   r   r   z./time_sheet/form-update.html
error.html)r!   r  rB   rj   r  rl   rk   rC   rT  rZ  r   r   r   r   r   r   r   r   r   r   r   )rH   time_sheet_id
time_sheetupdate_formr|   r   s         rN   time_sheet_updater    s    %Wm<&&**m*<
#ZI1;1F1F1O1O1S1S1U9%.>>V#'zJK##%  "  !,@*AB$!<vtn $$$++G4;<  +
 	
 g|,,rP   c                    t        | |      rt        j                  j                  |      j	                          t        j                  | t        d             d}| j                  j                  d      dk(  rd}| j                  j                  d      }|rt        d| d      S t        d	|z         S t        |       S )
a*  
    View function to handle the deletion of a time sheet.

    Parameters:
        request (HttpRequest): The HTTP request object.
        time_sheet_id (int): The ID of the time sheet to be deleted.

    Returns:
        HttpResponseRedirect: A redirect response to the time sheet view page.
    rg   z,The time sheet has been deleted successfullyrp   rq   rr   rz  z/project/task-timesheet/ro  z/project/view-time-sheet?view=)r    r  rB   rj   r   r   r   r   rz   r   r,   )rH   r  rv   rz  s       rN   time_sheet_deleter    s     %Wm</668!$R"ST	;;??6"f,I++//),6wiqABB=	IJJ'00rP   c                    | j                   j                  j                  }t        | j                        j
                  }t        | |d      }|j                  |      j                         rZt        |      }t        j                  j                  | j                   j                        D ]  }||vs|j                  |        t        || j                  j                  d            }| j                  d   }t!        |      }t#        t        |       | j                  j                  d      }d}	|dk(  rd	}	n|d
k(  rt%        d|z         S t'        | |	||d      S )z
    Filter Time sheet based on the provided query parameters.

    Args:
        request: The HTTP request object containing the query parameters.

    Returns:
        Renders the Time sheet list template with the filtered Time sheet.

    r  )employee_id__idr  ru   rt   rq   z$time_sheet/time_sheet_list_view.htmlrp   z$time_sheet/time_sheet_card_view.htmlchartzpersonal-time-sheet-view?view=)r  r   )r   r   rh   r'   rz   rF   r   rE   r   rr   r  rB   rG   r   rj   r{   r   r   r   r   )
rH   emp_idfiltered_time_sheetr  r  r  r}   r   rv   templates
             rN   r  r    sG    \\&&))F)'++699*$&> !!&!9@@B !23%%,,9R9R,S 	/D,,!((.	/   17;;??63JKKOON3M'Ii+'I5HF9	g	=FGG&$	
 rP   c                     | j                   d   }t        j                  j                  |      j	                  dd      }t        dt        |      i      S r  r  r  s      rN   r  r    sJ     \*JLL
3::7DIEe-..rP   c                 :   | j                   d   }| j                   d   }| j                   d   }| j                   d   }| j                   d   }g }g }t        j                  j                  |      j	                         }t
        j                  j                  |      j                  d      }	|	j                  |	      }	|dk(  rt        j                  j                  t        |      t        |      d
      }
g }g }t        d      D ]N  }|
t        j                  |      z   }|j                  |       |j                  d      }|j                  |       P n|dk(  rt        j                   t        |      t        |      d
z         d
   }t        j                  t        |      t        |      d
z   d
      j                         }
g }g }t        |      D ]N  }|
t        j                  |      z   }|j                  |       |j                  d      }|j                  |       P t#        t%        |            }t'        ||      D ]$  \  }}|j                  |j(                  g |d       & t+        d       }D ]f  }t
        j                  j                  ||      }	|	D ]>  }t-        |j.                        dz  }||j0                  j(                     |xx   |z  cc<   @ h |D ]   }|d   }|D cg c]
  }||   |    c}|d<   " |d}t3        |      S c c}w )z`
    This is an ajax method to return json response for generating bar charts to employees.
    r  selectedr@   r?   week)project_timesheet__employee_idr  r;   )
date__weekr"      )daysz%d-%m-%Y %Az%d-%m-%Y)rS   rT   backgroundColorc                       t        t              S )N)r   r    rP   rN   <lambda>z%personal_time_sheet.<locals>.<lambda>Q  s    +e:L rP   )r  r;   i  rS   rT   rU   )rz   rA   rB   rE   r   r  rY  r:   r;   fromisocalendarintrange	timedeltarG   r   r=   r>   r   r  zipr   r   r   
time_spentrl   r   )rH   r  r  month_numberr?   week_numberr  datasetrw   r  r   	date_listrW   idaydays_in_monthcolorsrM   colortotal_hours_by_project_and_daterS   timerT   project_titler   s                            rN   personal_time_sheetr    s    [["F{{:&H;;w'L;;vD++f%KJG%%V%LUUWH##**v*>GGOK$$$<K 6]]223t9c+>NPQR
	q 	Ax11q99CS!,,}-CMM#		 
W	 ++CIs<7H17LMaP&&s4y#l2Ca2GKPPR
	}% 	Ax11q99CS!,,z*CMM#		
 S]+Fh/ 
 #(	

 '22L&M#  X''..6.N 	XD(9D@J+DOO,A,AB5IZWI	XX
  
WOX
FK+M:5A
V
 H !!
s   1Lc                    	 t         j                  j                  |       t         j                  j                  |      j                  dk7  r*t         j                  j                  |      j                  nd}t         j                  j                  |      j
                   d| }||d}t        | d|      S #  t        | d      cY S xY w)	a  
    Function for viewing the barcharts for timesheet of a specific employee.

    Args:
        emp_id: id of the employee whose barchat to be rendered.

    Returns:
        Renders the chart.html template containing barchat of the specific employee.

    rg   r  Nr  z  )r  emp_nameztime_sheet/chart.htmlr8   )r   rB   rj   r   r  r  )rH   r  emp_last_nameemployee_namer9   s        rN   personal_time_sheet_viewr#  f  s    -'
 6*==E 	'::  6*>>
?r-Q  !G
 '2GDD-g|,,s    B= =Cc                 d    t         j                  j                  |      }d|i}t        | d|      S )z
    Renders a single timesheet view page.

    Parameters:
    - request (HttpRequest): The HTTP request object.
    - time_sheet_id (int): The ID of the timesheet to view.

    Returns:
        The rendered timesheet single view page.

    rg   r  z&time_sheet/time_sheet_single_view.html)r  rB   rj   r   )rH   r  r  r9   s       rN   time_sheet_single_viewr%    s7     !!%%%7IY'G'CWMMrP   c                    | j                   d   }t        j                  |      }|D ]W  }t        j                  j                  |      }	 |j                          t        j                  | t        d      d|iz         Y t        ddi      S # t        $ rD}t        j                  | |       t        j                  | t        d      d|iz         Y d}~d}~ww xY w)	r  r   rg   z%(timesheet)s deleted.r  z You cannot delete %(timesheet)s.NrB  r  )r   r  r  r  rB   rj   r   r   r   r   r   r   r   )rH   r   r  r  r   s        rN   time_sheet_bulk_deleter'    s     ,,u
C
**S/C %%))\):	
	34Y7OO	 I.//  	NN7E*NN45i8PP 	s   4B	C:CC)r=   r:   r  loggingcollectionsr   urllib.parser   r   pandasrx   r  django.contribr   django.corer   django.core.exceptionsr   django.core.paginatorr	   django.httpr
   r   r   r   django.shortcutsr   r   r   django.template.loaderr   django.urlsr   django.utils.translationr   r   base.methodsr   r   horilla.decoratorsr   r   r   notifications.signalsr   project.cbv.projectsr   project.cbv.tasksr   project.cbv.timesheetr   project.methodsr   r   r   r    r!   	decoratorfiltersr$   r%   r&   r'   formsmethodsr(   r)   r*   r+   r,   models	getLogger__name__r   rO   r`   re   rm   r   r   project_update_permissionr   r   project_delete_permissionr   r   r   r   r5  rC  rH  rL  r[  rg  rq  rw  task_update_permissionr}  task_delete_permissionr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  project_stage_update_permissionr  project_stage_delete_permissionr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r#  r%  r'  r
  rP   rN   <module>rI     sx       # +   # # 2 + Q Q @ @ 3  6 > W W ( ? 7 3   N N   			8	$ P PB A AB !A !AH N N %+AB@ C @, /0  10     F 0P  0Pf 	$  	$ . .,	 e eP U Up  G  GF (G (GV B  B& =  =8 !E  !EH !G !GH %G %GP   > $  $8 Q Q .  .D      T T0 T T. $, $,T N N$  : P P  . . .4 0 0( 0 0& B B( U   U8  " # 4  "$ # $2  4  . * *F    F/0"-J/)d R R>  4 ! !H (- (-V 1 12'T / /G"TE>N"0rP   