
    93il                        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 d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ ddlmZmZmZmZmZmZmZ ddlmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( d dlm)Z) d dl*m+Z+m,Z, d dl-m.Z. ddl/m0Z0 d dl1m2Z2 d dl3m4Z4 ddl5m6Z6 ddl/m7Z7m8Z8m9Z9m:Z: d dl*m;Z; d dl<m=Z= d dl>m?Z?m@Z@  e       ZA G d de)j                        ZC G d de      ZD G d de      ZEd ZF G d  d!e      ZG G d" d#e      ZH G d$ d%e      ZI G d& d'e      ZJ G d( d)e      ZK G d* d+e      ZL G d, d-e      ZM G d. d/ej                        ZO G d0 d1e      ZPy2)3    )LimitOffsetPagination)ModelViewSet)APIView)OrderingFilterSearchFilter)IsAuthenticatedIsAdminUser)Responsestatus)action)viewsets)get_user_model   )CompanyOfficeHoursSalesTimingCatchPhraseCompanyHistoryHolidayCompanyBotSettings)CompanySerializerUserCompaniesSerializerSwitchCompanySerializerSetDefaultCompanySerializerOfficeHoursSerializerSalesTimingSerializerCatchPhraseSerializerCompanyHistorySerializerHolidaySerializerCompanyBotSettingsSerializerCompanyBotsListSerializer)generics)CompanyPermissionAllowAny)OurLimitOffsetPagination)log_company_change)	send_mail)date)NoActiveCompanyError)apply_to_all_companies_bulkvalidate_office_hoursvalidate_sales_timingsapply_holidays_to_all_companies)SuperAdminOnly)Count)RefreshTokenAccessTokenc                        e Zd ZdZeZegZd Zy)CompanyBotsListViewz
    Simple list view that returns company bots
    - No company_id parameter: returns ALL companies' bots
    - With company_id parameter: returns only that company's bots
    c                    | j                   j                  j                  dd       }|r0t        j                  j                  |d      j                  d      S t        j                  j                  d      j                  d      S )N
company_idTid	is_activebot_settingsr9   )requestquery_paramsgetr   objectsfilterprefetch_related)selfr6   s     =/var/www/html/dp2/backend_v2.1/server/apps/companies/views.pyget_querysetz CompanyBotsListView.get_queryset,   sj    \\..22<F
??))Z4)HYYZhii??))D)9JJ>ZZ    N)	__name__
__module____qualname____doc__r"   serializer_classr   permission_classesrD    rE   rC   r4   r4   #   s    
 1)*[rE   r4   c                   8    e Zd ZdZeZegZd Zd Z	d Z
d Zd Zy)CompanyBotSettingsViewSetzECompany Bot Settings management ViewSet - handles all CRUD operationsc                 N    | j                   dv rt        d      gS t        d      gS ),Return different permissions based on actionlistretrieveview_company_botsedit_company_botsr   r$   rB   s    rC   get_permissionsz)CompanyBotSettingsViewSet.get_permissions:   s-    ;;..%&9:;;%&9:;;rE   c                     | j                   j                  }|j                  s
t               t        j
                  j                  |j                        S )z:Filter to show only bot settings for user's active companycompany)r<   useractive_companyr*   r   r?   r@   rB   r\   s     rC   rD   z&CompanyBotSettingsViewSet.get_querysetA   sC    ||  ""&((!))009L9L0MMrE   c           
          | j                   j                  j                  }|s
t               |j	                  |      }t        || j                   j                  dd|j                  d| d       y)z9Set company when creating bot settings and log the changerZ   createdr   zCreated bot settings: ''r[   r\   r   
model_name	object_iddetailsN)r<   r\   r]   r*   saver'   r8   )rB   
serializerr[   r:   s       rC   perform_createz(CompanyBotSettingsViewSet.perform_createH   sd    ,,##22&((!w7""+"oo-l^1=	
rE   c                    | j                         }d| d}|j                         }d| d}t        | j                  j                  j
                  | j                  j                  dd|j                  d| d|        y)z&Log changes when updating bot settingsra   updatedr   zUpdated bot settings from  to rb   N)
get_objectrf   r'   r<   r\   r]   r8   )rB   rg   old_instanceold_detailsr:   new_detailss         rC   perform_updatez(CompanyBotSettingsViewSet.perform_updateY   s}    (,q)!( ,q)LL%%44""+"oo0T+O	
rE   c           
          t        | j                  j                  j                  | j                  j                  dd|j                  d| d       |j                          y)z&Log changes when deleting bot settingsdeletedr   zDeleted bot settings: 'ra   rb   N)r'   r<   r\   r]   r8   deleterB   instances     rC   perform_destroyz)CompanyBotSettingsViewSet.perform_destroyk   sQ     	LL%%44""+kk-hZq9	
 	rE   N)rF   rG   rH   rI   r!   rJ   r$   rK   rX   rD   rh   rp   rv   rL   rE   rC   rN   rN   5   s.    O3+,<N
"
$rE   rN   c                   Z     e Zd ZdZeZegZeZ	e
egZg dZg dZdgZd Zd Z fdZ xZS )CompanyViewSetz8Company management ViewSet - handles all CRUD operations)namephonewebsite)ry   
created_atr9   
user_countz-created_atc                     | j                   dk(  rt               gS | j                   dv rt        d      gS | j                   dk(  rt        d      gS t        d      gS )rP   createupdatepartial_updateedit_companydestroydelete_companyview_company)r   r/   r$   rW   s    rC   rX   zCompanyViewSet.get_permissions   s^    ;;(""$%%[[88%n566[[I%%&6788%n566rE   c                    | j                   j                  }|j                  rtt        j                  j                  dddd      j                  d      j                  t        dd      t        ddd	      t        ddd
	      t        dddd            S |j                  j                  dddd      j                  d      j                  t        dd      t        ddd	      t        ddd
	      t        dddd            S )z1Filter to show only companies the user belongs tomissing_call_notify_tooffice_hourssales_timingscatch_phrasesdefault_transfer_staffusersT)distinct)r   r9   F)r   r9   is_available)r}   active_users_countinactive_users_countavailable_users_count)
r<   r\   is_superuserr   r?   rA   select_relatedannotater0   	companiesr^   s     rC   rD   zCompanyViewSet.get_queryset   s    ||   ??33(	
 n56xx 48#(44#P%*7TU%S&+Gddae&f	 8@ 8
 ~~..$	

 .1
288Wt4$WttL!&w!O"'$$]a"b	 4< 4

	
rE   c                 f   | j                         }|j                  }|}|j                  }|j                  j	                  d      }t        
|   |g|i |}	|	j                  dv r/t        j                  j                  ||dd|j                  d       |	 t        |t              rt        t        |            n
t        |      }||k7  rd|	j                  d	<   ||	j                  d
<   |du r|j                   |k(  rd|	j                  d<   |du rt#        |       |	S y#  |j                  }Y gxY w)z&Handle PATCH requests and log changes.r9   )      rj   zCall SettingszUpdated call settings)r[   
updated_byr   rc   rd   re   NTcompany_status_changedis_now_activeFforce_session_refresh)rl   r\   r9   datar>   superr   status_coder   r?   r   r8   
isinstancestrboolintr]   'handle_users_after_company_deactivation)rB   r<   argskwargsru   r\   r[   
old_status
new_statusresponse	__class__s             rC   r   zCompanyViewSet.partial_update   s6   ??$||''
\\%%k2
7)'CDCFC:-"")) *!**/ *  !06@S6QT#j/2W[\fWg
 Z':>671;o.U"t':':g'E9=56U"7@O! "0%//
s   /D   D0)rF   rG   rH   rI   r   rJ   r$   rK   r&   pagination_classr   r   filter_backendssearch_fieldsordering_fieldsorderingrX   rD   r   __classcell__)r   s   @rC   rx   rx   z   sJ    B(+,/%|4O0MGOH	7
<% %rE   rx   c                 d   t               }|j                  j                  |       }|D ]  }|j                  j                  d      j	                  | j
                        }|j                         r&|j                         |_        |j                          od |_        |j                           y )N)r]   Tr;   r8   )
r   r?   r@   r   excluder8   existsfirstr]   rf   )r[   Userr   r\   other_active_companiess        rC   r   r      s    DLLw7E!%!6!6!6!F!N!NRYR\R\!N!]!((*"8">">"@DIIK"&DIIK rE   c                   `    e Zd ZdZeZegZeZ	d Z
d Zd Zd Zd Z eddg	      dd       Zy
)ActiveCompaniesViewzReturn only active companiesc                     | j                   dk(  rt               gS | j                   dv rt        d      gS | j                   dk(  rt        d      gS t               gS )rP   r   r   r   r   r   )r   r/   r$   r%   rW   s    rC   rX   z#ActiveCompaniesView.get_permissions   sZ    ;;(""$%%[[88%n566[[I%%&6788J<rE   c                    | j                   j                  }| j                   j                  j                  dd       }|j                  rQt
        j                  j                  dddd      j                  d      j                  d      j                  d	      }nL|j                  j                  dddd      j                  d      j                  d      j                  d	      }|rV|j                  sJg }|D ]1  }|j                  ||
      s|j                  |j                         3 |j                  |      S |S )N
permissionr   r   r   r   r   Tr;   
updated_atrZ   )id__in)r<   r\   r=   r>   r   r   r?   rA   r   r@   order_byr   has_company_permissionappendr8   )rB   r\   permission_codenamequerysetfiltered_companiesr[   s         rC   rD   z ActiveCompaniesView.get_queryset   s-   ||  "ll77;;L$O 77(	
 n56vv 8> 8h|$  ~~66(	
 n56vv 8> 8h|$  t'8'8!##../BG.T&--gjj9 $ ??*<?==rE   c                 $    |j                          y)z$Custom logic when creating a companyNrf   rB   rg   s     rC   rh   z"ActiveCompaniesView.perform_create      rE   c                 $    |j                          y)z$Custom logic when updating a companyNr   r   s     rC   rp   z"ActiveCompaniesView.perform_update  r   rE   c                 2    d|_         |j                          y)z8Soft delete - set is_active to False instead of deletingFN)r9   rf   rt   s     rC   rv   z#ActiveCompaniesView.perform_destroy   s    "rE   TpostdetailmethodsNc                    |j                   j                  s8|j                   j                  d      st        ddit        j
                        S 	 |}t        d|        	 t        j                  j                  |d      }t        d|j                          |j                  j                  d      }t        d|        |st        ddit        j                        S 	 t        j                  j                  |      }t        d|j                           |j"                  j%                  |       |j&                  s||_        |j)                          |j*                  r]|j                   |j                  t-        j.                         j0                  d}t3        d|j                   d|j*                  g|       t        d|j                    d|j                   d|j4                  |j4                  d      S # t        j                  $ r3 t        d	| d
       t        dd| dit        j                        cY S w xY w# t        j                  $ r$ t        dd| d
it        j                        cY S w xY w# t6        $ rG}t        dt9        |              t        dt9        |      it        j:                        cY d}~S d}~ww xY w)zAdd a user to this companymanage_userserrorz7You do not have permission to manage users in companiesr   z$DEBUG: Looking for company with ID: Tr7   zDEBUG: Found company: zDEBUG: Company with ID z
 not foundzCompany with ID z not found or inactiveuser_idzDEBUG: Adding user ID: zuser_id is requiredr   zDEBUG: Found user: zUser with ID )usernamery   yearzYou are added to zauth/user_added_to_company.html)subjecthtml_contentrecipient_listkeyzUser "z" added to company "")messager   r6   zDEBUG: Exception occurred: N)r\   r   r   r
   r   HTTP_403_FORBIDDENprintr   r?   r>   ry   DoesNotExistHTTP_404_NOT_FOUNDr   HTTP_400_BAD_REQUESTr   r   r   addr]   rf   emailr)   todayr   r(   r8   	Exceptionr   HTTP_500_INTERNAL_SERVER_ERROR)	rB   r<   pkr6   r[   r   r\   r   es	            rC   add_userzActiveCompaniesView.add_user%  s    ||((1T1TUc1dST00 
A	J8EF!//--t-L.w||n=> ll&&y1G+G95634!66 
||''7'3+DMM?;< NNw' &&&-#		 zz $#LL JJL--
 /~>!B$(JJ<	 #DMM?2Fw||nTUV77%jj  _ '' /
|:FG 0<RST!44 & $$ gYjAB!44 D  	/Ax89#a&!<< 	si   J !9H  AJ #8I	 C$J  AIJ IJ 	4J =J ?J  J 	K<KKK)N)rF   rG   rH   rI   r   rJ   r$   rK   r&   r   rX   rD   rh   rp   rv   r   r   rL   rE   rC   r   r      sS    &(+,/	  D
 4&*J +JrE   r   c                       e Zd ZdZegZd Zy)UserCompaniesViewz+List all companies that the user belongs toc                 ^    t        |j                  d|i      }t        |j                        S )z'Get user's companies and active companyr<   )context)r   r\   r
   r   )rB   r<   rg   s      rC   r>   zUserCompaniesView.getw  s&    ,W\\IwCWX

((rE   N)rF   rG   rH   rI   r   rK   r>   rL   rE   rC   r   r   s  s    5)*)rE   r   c                       e Zd ZdZegZd Zy)SwitchCompanyViewzSwitch user's active companyc                    t        |j                  d|i      }|j                  d       	 |j                  |j                        }t        d|j                   |j                  |j                  ddt        j                        S # t        $ r0}t        d	t        |      it        j                        cY d
}~S d
}~ww xY w)zSwitch to a different companyr<   r   r   Traise_exceptionz"Successfully switched to company: r8   ry   r   r[   r   r   N)r   r   is_validswitch_companyr\   r
   ry   r8   r   HTTP_200_OKr   r   r   rB   r<   rg   r[   r   s        rC   r   zSwitchCompanyView.post  s    ,',,T[H\]
D1	3 //=G?~N!**#LL ((* *  	3Q113 3	3s   AB
 
	C%B>8C>CNrF   rG   rH   rI   r   rK   r   rL   rE   rC   r   r   }  s    &)*3rE   r   c                       e Zd ZdZegZd Zy)SetDefaultCompanyViewzSet user's default companyc                    t        |j                  d|i      }|j                  d       	 |j                  |j                        }t        d|j                   d|j                  |j                  ddt        j                  	      S # t        $ r0}t        d
t        |      it        j                  	      cY d}~S d}~ww xY w)zSet default companyr<   r   Tr   zSuccessfully set z as default companyr   r   r   r   N)r   r   r   set_default_companyr\   r
   ry   r8   r   r   r   r   r   r   s        rC   r   zSetDefaultCompanyView.post  s    0gllYX_L`a
D1	3 44W\\BG.w||n<OP!**#LL ((* *  	3Q113 3	3s   AB 	C%B?9C?CNr   rL   rE   rC   r   r     s    $)*3rE   r   c                   Z    e Zd ZdZeZegZd Zd Z	d Z
d Zd Z eddg	      d
        Zy)OfficeHoursViewSetz.Office hours management - full CRUD operationsc                 N    | j                   dv rt        d      gS t        d      gS )rP   rQ   view_officehoursedit_officehoursrV   rW   s    rC   rX   z"OfficeHoursViewSet.get_permissions  -    ;;..%&89::%&89::rE   c                     | j                   j                  }|j                  s
t               t        j
                  j                  |j                        j                  dd      S )z:Filter to show only office hours for user's active companyrZ   day
start_time)r<   r\   r]   r*   r   r?   r@   r   r^   s     rC   rD   zOfficeHoursViewSet.get_queryset  R    ||  ""&((""))$2E2E)FOOPUWcddrE   c                 L   |j                  | j                  j                  j                        }t	        | j                  j                  j                  | j                  j                  dd|j
                  d|j                   d|j                   d|j                          y)	z9Set company when creating office hours and log the changerZ   r`   r   zCreated  office hours:  - rb   N)	rf   r<   r\   r]   r'   r8   r  r  end_time)rB   rg   office_hours      rC   rh   z!OfficeHoursViewSet.perform_create  s     oodll.?.?.N.NoO 	LL%%44""$!nn{/{?U?U>VVYZeZnZnYop	
rE   c                    | j                         }|j                   d|j                   d|j                   }|j	                         }|j                   d|j                   d|j                   }t        | j                  j                  j                  | j                  j                  dd|j                  d| d| d       y	)
z&Log changes when updating office hoursz: r
  rj   r   zUpdated office hours from '' to 'ra   rb   N)
rl   r  r  r  rf   r'   r<   r\   r]   r8   )rB   rg   rm   rn   r  ro   s         rC   rp   z!OfficeHoursViewSet.perform_update  s    (%))*"\-D-D,ESI^I^H_` oo' %)K,B,B+C3{G[G[F\]LL%%44""$!nn1+f[MQRS	
rE   c                    t        | j                  j                  j                  | j                  j                  dd|j                  d|j
                   d|j                   d|j                          |j                          y)z&Log changes when deleting office hoursrr   r   zDeleted r	  r
  rb   N)	r'   r<   r\   r]   r8   r  r  r  rs   rt   s     rC   rv   z"OfficeHoursViewSet.perform_destroy  so     	LL%%44""$kkx||nOH<O<O;PPST\TeTeSfg	
 	rE   Fr   r   c                 0    t        |t        dt              S )z<Apply current company's office hours to all user's companiesr   r<   model_classrc   validation_func)r+   r   r,   rB   r<   s     rC   apply_to_all_companiesz)OfficeHoursViewSet.apply_to_all_companies  s     +#$1	
 	
rE   N)rF   rG   rH   rI   r   rJ   r$   rK   rX   rD   rh   rp   rv   r   r  rL   rE   rC   r   r     sK    8,+,;e

$ 56(+
 ,
rE   r   c                   Z    e Zd ZdZeZegZd Zd Z	d Z
d Zd Z eddg	      d
        Zy)SalesTimingViewSetz.Sales timing management - full CRUD operationsc                 N    | j                   dv rt        d      gS t        d      gS )rP   rQ   view_salestimeedit_salestimerV   rW   s    rC   rX   z"SalesTimingViewSet.get_permissions  s-    ;;..%&6788%&6788rE   c                     | j                   j                  }|j                  s
t               t        j
                  j                  |j                        j                  dd      S )z;Filter to show only sales timings for user's active companyrZ   botr  )r<   r\   r]   r*   r   r?   r@   r   r^   s     rC   rD   zSalesTimingViewSet.get_queryset  r  rE   c                 L   |j                  | j                  j                  j                        }t	        | j                  j                  j                  | j                  j                  dd|j
                  d|j                   d|j                   d|j                          y)	z9Set company when creating sales timing and log the changerZ   r`   r   zCreated sales timing for bot '': r
  rb   N)	rf   r<   r\   r]   r'   r8   r  r  r  )rB   rg   sales_timings      rC   rh   z!SalesTimingViewSet.perform_create  s    !t||/@/@/O/OP 	LL%%44""$"oo4\5E5E4Fc,JaJaIbbefrf{f{e|}	
rE   c                    | j                         }d|j                   d|j                   d|j                   }|j	                         }d|j                   d|j                   d|j                   }t        | j                  j                  j                  | j                  j                  dd|j                  d| d| d	       y
)z&Log changes when updating sales timingzBot 'r  r
  rj   r   zUpdated sales timing from 'r  ra   rb   N)
rl   r  r  r  rf   r'   r<   r\   r]   r8   )rB   rg   rm   rn   r  ro   s         rC   rp   z!SalesTimingViewSet.perform_update  s    (l../s<3J3J2K3|OdOdNef!( l../s<3J3J2K3|OdOdNefLL%%44""$"oo1+f[MQRS	
rE   c                    t        | j                  j                  j                  | j                  j                  dd|j                  d|j
                   d|j                   d|j                          |j                          y)z&Log changes when deleting sales timingrr   r   zDeleted sales timing for bot 'r  r
  rb   N)	r'   r<   r\   r]   r8   r  r  r  rs   rt   s     rC   rv   z"SalesTimingViewSet.perform_destroy,  so     	LL%%44""$kk4X\\N#hFYFYEZZ]^f^o^o]pq	
 	rE   Fr   r   c                 0    t        |t        dt              S )z=Apply current company's sales timings to all user's companiesr   r  )r+   r   r-   r  s     rC   r  z)SalesTimingViewSet.apply_to_all_companies:  s     +#$2	
 	
rE   N)rF   rG   rH   rI   r   rJ   r$   rK   rX   rD   rh   rp   rv   r   r  rL   rE   rC   r  r    sK    8,+,9e

$ 56(+
 ,
rE   r  c                   8    e Zd ZdZeZegZd Zd Z	d Z
d Zd Zy)CatchPhraseViewSetz/Catch phrases management - full CRUD operationsc                 N    | j                   dv rt        d      gS t        d      gS )rP   rQ   view_catchphraseedit_catchphraserV   rW   s    rC   rX   z"CatchPhraseViewSet.get_permissionsJ  r  rE   c                     | j                   j                  }|j                  s
t               t        j
                  j                  |j                        j                  d      S )z;Filter to show only catch phrases for user's active companyrZ   phrase)r<   r\   r]   r*   r   r?   r@   r   r^   s     rC   rD   zCatchPhraseViewSet.get_querysetQ  sO    ||  ""&((""))$2E2E)FOOPXYYrE   c           
         |j                  | j                  j                  j                        }t	        | j                  j                  j                  | j                  j                  dd|j
                  d|j                   d       y)z9Set company when creating catch phrase and log the changerZ   r`   r   zCreated catch phrase: 'ra   rb   N)rf   r<   r\   r]   r'   r8   r)  )rB   rg   catch_phrases      rC   rh   z!CatchPhraseViewSet.perform_createX  sl    !t||/@/@/O/OP 	LL%%44""$"oo-l.A.A-B!D	
rE   c                 *   | j                         }d|j                   d}|j                         }d|j                   d}t        | j                  j
                  j                  | j                  j
                  dd|j                  d| d|        y)z&Log changes when updating catch phrasera   rj   r   zUpdated catch phrase from rk   rb   N)rl   r)  rf   r'   r<   r\   r]   r8   )rB   rg   rm   rn   r+  ro   s         rC   rp   z!CatchPhraseViewSet.perform_updatef  s    (,--.a0!( ,--.a0LL%%44""$"oo0T+O	
rE   c           
          t        | j                  j                  j                  | j                  j                  dd|j                  d|j
                   d       |j                          y)z&Log changes when deleting catch phraserr   r   zDeleted catch phrase: 'ra   rb   N)r'   r<   r\   r]   r8   r)  rs   rt   s     rC   rv   z"CatchPhraseViewSet.perform_destroyx  sV     	LL%%44""$kk-hoo->a@	
 	rE   N)rF   rG   rH   rI   r   rJ   r$   rK   rX   rD   rh   rp   rv   rL   rE   rC   r$  r$  E  s.    9,+,;Z

$rE   r$  c                   :    e Zd ZdZeZegZeZ	e
egZg dZd Zd Zy)CompanyHistoryViewSetz=Company history viewset - read-only access to company history)company__nameupdated_by__usernamerc   r   re   c                     | j                   j                  }|j                  st        j                  j                         S |j                  j                  j                         S )z5Filter to show only history for user's active company)r<   r\   r]   r   r?   nonehistoryallr^   s     rC   rD   z"CompanyHistoryViewSet.get_queryset  sJ    ||  ""!))..00""**..00rE   c                     t        d      gS )z(Explicitly check view_company permissionr   )r$   rW   s    rC   rX   z%CompanyHistoryViewSet.get_permissions  s    !.122rE   N)rF   rG   rH   rI   r   rJ   r$   rK   r&   r   r   r   r   r   rD   rX   rL   rE   rC   r/  r/    s5    G/+,/#^4OM13rE   r/  c                   Z    e Zd ZdZeZegZd Zd Z	d Z
d Zd Z eddg	      d
        Zy)HolidayViewSetz)Holiday management - full CRUD operationsc                 N    | j                   dv rt        d      gS t        d      gS )rP   rQ   view_holidaysedit_holidaysrV   rW   s    rC   rX   zHolidayViewSet.get_permissions  s+    ;;..%o677%o677rE   c                     | j                   j                  }|j                  s
t               t        j
                  j                  |j                        j                  d      j                  d      S )z6Filter to show only holidays for user's active companyrZ   bots
start_date)	r<   r\   r]   r*   r   r?   r@   rA   r   r^   s     rC   rD   zHolidayViewSet.get_queryset  sY    ||  ""&((%%d.A.A%BSSTZ[ddeqrrrE   c                 L   |j                  | j                  j                  j                        }t	        | j                  j                  j                  | j                  j                  dd|j
                  d|j                   d|j                   d|j                          y)	z4Set company when creating holiday and log the changerZ   r`   r   zCreated holiday '' from rk   rb   N)	rf   r<   r\   r]   r'   r8   ry   r>  end_date)rB   rg   holidays      rC   rh   zHolidayViewSet.perform_create  s    //$,,*;*;*J*J/K 	LL%%44"" jj'~WW=O=O<PPTU\UeUeTfg	
rE   c                    | j                         }d|j                   d|j                   d|j                   }|j	                         }d|j                   d|j                   d|j                   }t        | j                  j                  j                  | j                  j                  dd|j                  d| d|        y)	z!Log changes when updating holidayra   r@  rk   rj   r   zUpdated holiday from rb   N)
rl   ry   r>  rA  rf   r'   r<   r\   r]   r8   )rB   rg   rm   rn   rB  ro   s         rC   rp   zHolidayViewSet.perform_update  s    (,++,GL4K4K3LDQ]QfQfPgh//# ',,ww/A/A.B$wGWGWFXYLL%%44"" jj+K=[MJ	
rE   c                    t        | j                  j                  j                  | j                  j                  dd|j                  d|j
                   d|j                   d|j                          |j                          y)z!Log changes when deleting holidayrr   r   zDeleted holiday 'r@  rk   rb   N)	r'   r<   r\   r]   r8   ry   r>  rA  rs   rt   s     rC   rv   zHolidayViewSet.perform_destroy  so     	LL%%44"" kk'gh>Q>Q=RRVW_WhWhVij	
 	rE   Fr   r   c                     t        |      S )z8Apply current company's holidays to all user's companies)r.   r  s     rC   r  z%HolidayViewSet.apply_to_all_companies  s     /w77rE   N)rF   rG   rH   rI   r    rJ   r$   rK   rX   rD   rh   rp   rv   r   r  rL   rE   rC   r8  r8    sK    3(+,8s

$ 56(+8 ,8rE   r8  N)Qrest_framework.paginationr   rest_framework.viewsetsr   rest_framework.viewsr   rest_framework.filtersr   r   rest_framework.permissionsr   r	   rest_framework.responser
   rest_frameworkr   rest_framework.decoratorsr   r   django.contrib.authr   modelsr   r   r   r   r   r   r   serializersr   r   r   r   r   r   r   r   r    r!   r"   r#   apps.permissions.permissionsr$   r%   utils.paginations.paginationr&   utilsr'   utils.threads.email_threadr(   datetimer)   
exceptionsr*   r+   r,   r-   r.   r/   django.db.modelsr0   rest_framework_simplejwt.tokensr1   r2   r   ListAPIViewr4   rN   rx   r   r   r   r   r   r   r  r$  ReadOnlyModelViewSetr/  r8  rL   rE   rC   <module>r[     s)   ; 0 ( ? C , ! , # . o o o    $ D A % 0  ,$ $ 7 " E [(.. [$B BJX\ Xt"K, K\) )3 303G 30I
 I
XI
 I
X? ?D3H99 36D8\ D8rE   