
    siTO                     6   d Z ddlZddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZmZ dd	lmZ 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! ddl"m#Z# d Z$ G d de       Z% G d de       Z& G d de       Z' G d de       Z(y)zD
models.py

This module is used to register models for project app

    N)date)apps)ValidationError)models)static)reversereverse_lazy)timezone)format_html)gettext_lazy)HorillaCompanyManager)Company)Employee)horilla_middlewares)_thread_locals)HorillaModelupload_pathrender_templatec                    t        |       dkD  rt        t        d            	 | j                  d      \  }}t        |      dk  st        |      dk  rt        t        d            t	        |      }t        |      dkD  s|t        d      vrt        t        d            y# t        $ r}t        t        d            |d}~ww xY w)	zM
    this method is used to validate the format of duration like fields.
       z)Invalid format, it should be HH:MM format:   <   zInvalid timezInvalid formatN)lenr   _splitintrange
ValueError)valuehourminuteerrors       2/var/www/python-projects/worksol/project/models.pyvalidate_time_formatr&      s     5zA~a KLMM
>{{3'ft9q=CK!O!!$O"PQQVt9q=F%)3!!N"344 4 >a 012=>s   A>B# #	C,CCc            	            e Zd Zd ed      fd ed      fd ed      fd ed      fd	 ed
      fd ed      fgZ ej                  dd ed            Z ej                  e	dd ed            Z
 ej                  e	dd ed            Z ej                  edd ed            Z ej                   ed            Z ej                  dd ed            Z ej                   edd ed            Z ej&                   ed            Z ej*                  edd ej.                  !      Z ed"      Zd5d#Zd$ Zd% Zd& Zd' Zd( Z d) Z!d* Z"d+ Z#d, Z$d- Z%d. Z&d/ Z'd6d0Z( fd1Z)d2 Z* G d3 d4      Z+ xZ,S )7ProjectnewNewin_progressIn Progress	completed	Completedon_holdzOn Hold	cancelled	CancelledexpiredExpired   TName)
max_lengthuniqueverbose_nameproject_managerszProject Managersblankrelated_namer8   project_memberszProject Members   Statuschoicesr6   defaultr8   
Start Dater8   End Datenullr;   r8   zProject File	upload_tor;   rG   r8   DescriptionF)rG   editable	on_delete
company_idc                 n    t        | j                        |k  r| j                  S | j                  d| dz   S )z
        Returns a truncated version of the description attribute.

        Parameters:
        length (int): The maximum length of the returned description.
        Nz...)r   description)selflengths     r%   get_descriptionzProject.get_descriptionV   sC     4##$. 	
 !!'6*U2	
    c                     | j                   j                         }|r*dj                  |D cg c]  }t        |       c}      }|S yc c}w )z!
        managers column
        <br>N)managersalljoinstrrP   	employeesemployeeemployee_names_strings       r%   get_managerszProject.get_managersc   sJ     MM%%'	$*KK/898X9%! )(	 9   Ac                     | j                   j                         }|r*dj                  |D cg c]  }t        |       c}      }|S yc c}w )z 
        members column
        rU   N)membersrW   rX   rY   rZ   s       r%   get_memberszProject.get_membersn   sJ     LL$$&	$*KK/898X9%! )(	 9r_   c                 &    d| j                    d}|S zV
        Method will retun the api to the avatar or path to the profile image
        z!https://ui-avatars.com/api/?name=z&background=randomtitlerP   urls     r%   
get_avatarzProject.get_avatary        2$**=OP
rS   c                 x    | j                   r.| j                   j                  }t        d      }t        d||      S y )Nzimages/ui/project/document.pngz<a href="{0}" style="text-decoration: none" rel="noopener noreferrer" class="oh-btn oh-btn--light" target="_blank" onclick="event.stopPropagation();"><span class="oh-file-icon oh-file-icon--pdf"></span>&nbsp View</a>)documentrh   r   r   )rP   document_url	image_urls      r%   get_document_htmlzProject.get_document_html   sB    ====,,L?@I   rS   c                    t        t        dd      }|j                  j                  t	        dd| j
                  i      }| j                  j                         v s| j                  j                         v sst        fd| j                  j                         D              sGt        fd| j                  j                         D              s|j                  j                  d      rd	| d
S y)zH
        This method generates an onclick URL for task viewing.
        requestNz	task-view
project_idkwargsc              3   V   K   | ]   }|j                   j                         v  " y wN)task_managersrW   .0taskr\   s     r%   	<genexpr>z#Project.redirect.<locals>.<genexpr>   s%     XD8t115577X   &)c              3   V   K   | ]   }|j                   j                         v  " y wrv   )task_membersrW   rx   s     r%   r{   z#Project.redirect.<locals>.<genexpr>   s%     W48t004466Wr|   zproject.view_projectzonclick="window.location.href='z?view=list'" )getattrr   useremployee_getr	   pkrV   rW   ra   anytask_sethas_perm)rP   rq   rh   r\   s      @r%   redirectzProject.redirect   s     .)T:<<,,;dgg/FG ))++4<<++--XDMMDUDUDWXXW4==CTCTCVWW||$$%;<5cU-HHrS   c                 8    t        dd| j                  i      }|S )z0
        This method to get detail  url
        zproject-detailed-viewr   rs   r	   r   rg   s     r%   get_detail_urlzProject.get_detail_url   s     2D$''?K
rS   c                 8    t        dd| j                  i      }|S )/
        This method to get update url
        zupdate-projectr   rs   r   rg   s     r%   get_update_urlzProject.get_update_url   s     +T477OD
rS   c                 8    t        dd| j                  i      }|S )z0
        This method to get archive url
        zproject-archiverr   rs   r   rg   s     r%   get_archive_urlzProject.get_archive_url   s     ,lDGG5LM
rS   c                 h    | j                   j                         }| j                  }t        d||      S )Na  <div style="display: flex; align-items: center;">    <div class="oh-tabs__input-badge-container">        <span class="oh-badge oh-badge--secondary oh-badge--small oh-badge--round mr-1" title="{1} Tasks">            {1}        </span>    </div>    <div>{0}</div></div>)r   countrf   r   )rP   
task_countrf   s      r%   get_task_badge_htmlzProject.get_task_badge_html   s7    ]]((*


 
 	
rS   c                 j    t        dd| j                  i      }t        d      }d| ddz   d| dz   S )/
        This method to get delete url
        zdelete-projectrr   rs   z-Are you sure you want to delete this project?',r	   r   r   rP   rh   messages      r%   get_delete_urlzProject.get_delete_url   sE     +\4774KLCD3%qzCAgYa.00rS   c                      t        dd| i      S )?
        This method for get custom column for action.
        zcbv/projects/actions.htmlinstancepathcontextr   rP   s    r%   actionszProject.actions   s    
 ,&
 	
rS   c                     | j                   ryyz 
        archive status
        Archivez
Un-Archive	is_activer   s    r%   archive_statuszProject.archive_status        >>rS   c                     | j                   P| j                   | j                  k  rt        ddi      | j                   t        j                         k  rd| _        y y y )Nrl   z End date is less than start dater2   )end_date
start_dater   r   todaystatusr   s    r%   cleanzProject.clean   sP    ==$}}t.%z3U&VWW}}tzz|+' , %rS   c                 >   | j                   d u t        t        j                  dd       }}|r<|j                  j                  d      x}r|dk7  rt        j                  |      | _        t        | (  |i | |r$t        j                  j                  d| dd       y y )Nrq   selected_companyrW   Todo   F)rf   projectsequenceis_end_stage)r   r   r   r   sessiongetr   findrM   supersaveProjectStageobjectscreate)rP   argsrt   is_newrq   cid	__class__s         r%   r   zProject.save   s    ''T/7..	4,
 goo112DEEsE3RW<%ll3/DOd%f%  ''dQU (  rS   c                     | j                   S rv   re   r   s    r%   __str__zProject.__str__   s    zzrS   c                   0    e Zd ZdZ ed      Z ed      Zy)Project.Meta7
        Meta class to add the additional info
        r(   ProjectsN)__name__
__module____qualname____doc__r   r8   verbose_name_plural rS   r%   Metar      s    	 |
mrS   r   )2   returnN)-r   r   r   r   PROJECT_STATUSr   	CharFieldrf   ManyToManyFieldr   rV   ra   r   	DateFieldr   r   	FileFieldr   rl   	TextFieldrO   
ForeignKeyr   PROTECTrM   r   r   rR   r^   rb   ri   ro   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r   s   @r%   r(   r(   2   s   	%	-()	an%	AiL!	an%	AiL!N FDqyQE%v%%')*	H %f$$&()	G V3AhKF "!!q?JvTAjMRHvT1^CTH #&""-0@AK"""dUfnnJ $L1G
	)	)$
 1
 (
, ,rS   r(   c            
       F    e Zd ZdZ ej
                  d ed            Z ej                  e	ej                  ddd ed            Z ej                  ddd	
      Z ej                  d	 ed            Z ed      ZdefdZddZ fdZ fdZ G d d      Z xZS )r   z
    ProjectStage model
    r4   Titler6   r8   Tproject_stagesr(   )rL   rG   r;   r<   r8   F)rG   r;   rK   zIs end stagerB   r8   project__company_idr   c                     | j                    S rv   re   r   s    r%   r   zProjectStage.__str__      **rS   c                 >   | j                   r| j                  }|j                  j                  d      j	                  | j
                        }|rL|j                  j                  d      j                         }t        t        d|j                   d            y y )NT)r   )idzAlready exist an end stage - .)
r   r   r   filterexcluder   firstr   r   rf   )rP   r   existing_end_stage	end_stages       r%   r   zProjectStage.clean  s    llG!(!7!7!>!>! "? "gg!  "#2299t9LRRT	%5ioo5FaHI  " rS   c                     | j                   ]t        j                  j                  | j                        j                  d      j                         }|r|j                   dz   | _         t        |    |i | y )Nr   r   r   )	r   r   r   r   r   order_bylastr   r   )rP   r   rt   
last_stager   s       r%   r   zProjectStage.save!  sf    == $$++DLL+A*% 
  * 3 3a 7d%f%rS   c                     t         j                  j                  | j                  | j                        }|D ]'  }|xj                  dz  c_        |j                          ) t        |   |i | y )N)r   sequence__gtr   )r   r   r   r   r   r   r   delete)rP   r   rt   project_stages_afterstager   s        r%   r   zProjectStage.delete,  sg    +33::LLt}}  ;  

 * 	ENNaNJJL	 	''rS   c                   8    e Zd ZdZddgZ ed      Z ed      Zy)ProjectStage.Metar   r   rf   Project StagezProject StagesNr   r   r   r   unique_togetherr   r8   r   r   rS   r%   r   r   8  s)    	 %g.) 01rS   r   r   )r   r   r   r   r   r   r   rf   r   r(   CASCADEr   IntegerFieldr   BooleanFieldr   r   r   rY   r   r   r   r   r   r   r   s   @r%   r   r      s     F!G*EEf..%y\G #v""D5IH&6&&u1^CTUL#$9:G 	&
(2 2rS   r   c            	       L   e Zd ZdZd ed      fd ed      fd ed      fd ed	      fgZ ej                  d
 ed            Z ej                  e
ej                  d ed            Z ej                  eej                  dd ed            Z ej                  ed ed            Z ej                  edd ed            Z ej                  edd ed            Z ej(                  dd ed            Z ej(                  dd ed            Z ej.                  edd ed            Z ej4                   ed             Z ej8                  d!"      Z ed#      Zd6d%Z  G d& d'      Z!d( Z"d) Z#d* Z$d+ Z%d, Z&d- Z'd. Z(d/ Z)d0 Z*d1 Z+d2 Z,d3 Z-d4 Z.d5 Z/y$)7Taskz
    Task model
    to_dozTo Dor+   r,   r-   r.   r2   r3   r4   r   r   Tr(   )rL   rG   r8   tasksr   rL   rG   r<   r8   zTask Managers)r;   r8   zTask Membersr:   r>   r?   r@   rC   rF   rE   z	Task FilerH   rJ   rD   r   )rB   r   Nc                 R   | j                   r| j                  j                   \| j                  j                   | j                   k  s#| j                  j                  | j                   kD  rt        dt	        d      i      | j                   t        j                         k  rd| _        y y )Nr   zDThe task end date must be between the project's start and end dates.r2   )r   r   r   r   r   r   r   r   r   s    r%   r   z
Task.cleanl  s    ==$)>)>)J%%5<<**T]]:%"Ab%  ==4::<'#DK (rS   c                   8    e Zd ZdZddgZ ed      Z ed      Zy)	Task.Metar   r   rf   r  TasksNr   r   rS   r%   r   r  |  s&    	 %g.yjrS   r   c                     | j                    S rv   re   r   s    r%   r   zTask.__str__  r   rS   c                 6    | j                   r| j                   S dS )z>
        Return project if have,otherwise return none
        Noner   r   s    r%   
if_projectzTask.if_project  s    
  $||t||77rS   c                 8    t        dd| j                  i      }|S )z%
        detail view of task
        ztask-detail-viewr   rs   r   r   rg   s     r%   task_detail_viewzTask.task_detail_view  s    
 ($A
rS   c                 ^    t        | j                        j                  | j                        S )z
        to get status
        )dictTASK_STATUSr   r   r   s    r%   status_columnzTask.status_column  s$     D$$%))$++66rS   c                     | j                   j                         }|r*dj                  |D cg c]  }t        |       c}      }|S yc c}w )z&
        return task managers
        rU   r   )rw   rW   rX   rY   )rP   rV   managermanagers_name_strings       r%   r^   zTask.get_managers  sH     %%))+#);;H/UG/U#V '' 0Vr_   c                     | j                   j                         }|r*dj                  |D cg c]  }t        |       c}      }|S yc c}w )z%
        return task members
        rU   r   )r~   rW   rX   rY   )rP   ra   membermembers_name_strings       r%   rb   zTask.get_members  sH     ##'')"(++.Qvs6{.Q"R&& /Rr_   c                      t        dd| i      S )r   zcbv/tasks/task_actions.htmlr   r   r   r   s    r%   r   zTask.actions  s    & .&
 	
rS   c                 &    d| j                    d}|S rd   re   rg   s     r%   ri   zTask.get_avatar  rj   rS   c                      t        dd| i      S )z?
        This method for get custom document coloumn .
        zcbv/tasks/task_document.htmlr   r   r   r   s    r%   document_colzTask.document_col  s    
 /&
 	
rS   c                      t        dd| i      S )z:
        This method for get detail view actions.
        z"cbv/tasks/task_detail_actions.htmlr   r   r   r   s    r%   detail_view_actionszTask.detail_view_actions      
 5&
 	
rS   c                 8    t        dd| j                  i      }|S )z'
        to get the update url
        zupdate-task-allr   rs   r  rg   s     r%   r   zTask.get_update_url  s     'tww@
rS   c                     | j                   ryyr   r   r   s    r%   r   zTask.archive_status  r   rS   c                 8    t        dd| j                  i      }|S )z$
        to get archive url
        ztask-all-archivetask_idrs   r  rg   s     r%   r   zTask.get_archive_url  s    
 ()TWW1EF
rS   c                 t    t        dd| j                  i      }| d}t        d      }d| ddz   d| dz   S )z#
        to get delete url
        zdelete-taskr$  rs   z?task_all=truez*Are you sure you want to delete this task?r   r   )r   r   r   )rP   rh   url_with_paramsr   s       r%   r   zTask.get_delete_url  sR    
 mY,@A E0@A?#1%+'!n<<rS   r   )0r   r   r   r   r   r  r   r   rf   r   r(   r   r   r   r   r   r   rw   r~   r   r   r   r   r   r   rl   r   rO   r   r   r   r   r   r   r   r  r  r  r^   rb   r   ri   r  r  r   r   r   r   r   rS   r%   r  r  B  s   
 
!G*	-()	an%	AiL!	K F!G*EEf6>>1Y<G F..'E +F**'M
 *6))7>ARL VW1X;F "!!t4aoVJvTAjMRHvT1[>H #&""-0@AK"v""1-H#$9:G$ ) )87		
0

 =rS   r  c            	       ~   e Zd ZdZd ed      fd ed      fgZ ej                  eej                  dd ed      	      Z
 ej                  eej                  dd
 ed      	      Z ej                  eej                   ed            Z ej                  ej"                   ed            Z ej&                  dddeg ed            Z ej&                  edd ed            Z ej.                  dd ed            Z ed      Z G d d      Zd Zd Zd Zd Zd  Z d! Z!d" Z"d# Z#d$ Z$ G d% d      Zy&)'	TimeSheetz
    TimeSheet model
    in_Progressr,   r-   r.   Tproject_timesheetr(   r  task_timesheetr  r   )rL   r8   Dater   z00:00
   zHours Spent)rG   rB   r6   
validatorsr8   r>   r?   r@   rJ   )r;   rG   r8   project_id__company_idc                       e Zd ZdZy)TimeSheet.Meta)z-idN)r   r   r   orderingr   rS   r%   r   r1  6  s    rS   r   c                    | j                   t        ddi      | j                  | j                  dk(  rt        ddi      | j                  rx| j                  }| j                  r| j                  }||j
                  j                         vr||j                  j                         vr||j                  j                  j                         vr||j                  j                  j                         vrt        t        d            | j                   r`|| j                   j                  j                         vr:|| j                   j                  j                         vrt        t        d            | j                  t        j                  j                         j                         kD  rt        dt        d	      i      y y )
Nrr   zProject name is Required.r   rO   z/Please provide a description to your Time sheetz"Employee not included in this taskz%Employee not included in this projectr   z You cannot choose a future date.)rr   r   rO   employee_idr$  rw   rW   r~   r   rV   ra   r   r   datetimer   )rP   r\   rz   s      r%   r   zTimeSheet.clean9  sy   ??"!<1L"MNN#t'7'72'=! QR  ''H|||| D$6$6$:$:$<<$(9(9(=(=(??$(=(=(A(A(CC$(<(<(@(@(BB)!,P*QRR DOO$<$<$@$@$BB$(?(?(C(C(EE)!,S*TUUyy8,,22499;;%vq1S/T&UVV <# rS   c           	          | j                    d| j                   d| j                   d| j                   d| j                   	S )N )r4  rr   r$  r   
time_spentr   s    r%   r   zTimeSheet.__str__T  sB    ""#1T__$5Qt||nAdii[PQRVRaRaQbccrS   c                 ^    t        | j                        j                  | j                        S rv   )r  TIME_SHEET_STATUSr   r   r   s    r%   r  zTimeSheet.status_columnW  s"    D**+//<<rS   c                      t        dd| i      S )r   zcbv/timesheet/actions.htmlr   r   r   r   s    r%   r   zTimeSheet.actionsZ  s    
 -&
 	
rS   c                      t        dd| i      S )r   z"cbv/timesheet/description_col.htmlr   r   r   r   s    r%   get_description_colzTimeSheet.get_description_cold  r   rS   c                      t        dd| i      S )r   z!cbv/timesheet/detail_actions.htmlr   r   r   r   s    r%   detail_actionszTimeSheet.detail_actionsn  s    
 4&
 	
rS   c                 8    t        dd| j                  i      }|S )r   zupdate-time-sheetr   rs   r   rg   s     r%   r   zTimeSheet.get_update_urlx  s     .dggG
rS   c                 j    t        dd| j                  i      }t        d      }d| ddz   d| dz   S )r   zdelete-time-sheettime_sheet_idrs   z0Are you sure you want to delete this time sheet?r   r   r   r   s      r%   r   zTimeSheet.get_delete_url  sE     .7QRFG3%qzCAgYa.00rS   c                 8    t        dd| j                  i      }|S )z)
        for detail view of page
        ztime-sheet-detail-viewr   rs   r  rg   s     r%   detail_viewzTimeSheet.detail_view  s     .dggG
rS   c                   ,    e Zd Z ed      Z ed      Zy)r1  z
Time SheetzTime SheetsN)r   r   r   r   r8   r   r   rS   r%   r   zTimeSheet.Meta  s    .rS   N)%r   r   r   r   r   r:  r   r   r(   r   rr   r  r$  r   r4  r   r
   nowr   r   r&   r8  r   r   rO   r   r   r   r   r   r  r   r=  r?  r   r   rD  r   rS   r%   r(  r(  	  s{   
 
-()	an% #""..(y\J  f..%vYG $&##..z]K
 6HLLqyID!!!()}%J V!x[	F #&""DqGWXK#$<=G W6d=


1/ /rS   r(  ))r   r5  r   django.appsr   django.core.exceptionsr   	django.dbr   django.templatetags.staticr   django.urlsr   r	   django.utilsr
   django.utils.htmlr   django.utils.translationr   r   base.horilla_company_managerr   base.modelsr   employee.modelsr   horillar   horilla.horilla_middlewaresr   horilla.modelsr   r   horilla_views.cbv_methodsr   r&   r(   r   r  r(  r   rS   r%   <module>rV     s       2  - - ! ) 6 >  $ ' 6 4 5
>&J,l J,Z@2< @2FD=< D=NG/ G/rS   