
    9i(m                        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 d/ d0e      ZPy1)2    )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r8   )requestquery_paramsgetr   objectsfilterprefetch_related)selfr5   s     C/var/www/html/dp2/backend_v2.1/server/apps/companies/views/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_classesrC    rD   rB   r3   r3   #   s    
 1)*[rD   r3   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#   rA   s    rB   get_permissionsz)CompanyBotSettingsViewSet.get_permissions:   s-    ;;..%&9:;;%&9:;;rD   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?   rA   r[   s     rB   rC   z&CompanyBotSettingsViewSet.get_querysetA   sC    ||  ""&((!))009L9L0MMrD   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 changerY   createdr   zCreated bot settings: ''rZ   r[   r   
model_name	object_iddetailsN)r;   r[   r\   r)   saver&   r7   )rA   
serializerrZ   r9   s       rB   perform_createz(CompanyBotSettingsViewSet.perform_createH   sd    ,,##22&((!w7""+"oo-l^1=	
rD   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 settingsr`   updatedr   zUpdated bot settings from  to ra   N)
get_objectre   r&   r;   r[   r\   r7   )rA   rf   old_instanceold_detailsr9   new_detailss         rB   perform_updatez(CompanyBotSettingsViewSet.perform_updateY   s}    (,q)!( ,q)LL%%44""+"oo0T+O	
rD   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: 'r`   ra   N)r&   r;   r[   r\   r7   deleterA   instances     rB   perform_destroyz)CompanyBotSettingsViewSet.perform_destroyk   sQ     	LL%%44""+kk-hZq9	
 	rD   N)rE   rF   rG   rH   r    rI   r#   rJ   rW   rC   rg   ro   ru   rK   rD   rB   rM   rM   5   s.    O3+,<N
"
$rD   rM   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)rx   
created_atr8   
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 )rO   createupdatepartial_updateedit_companydestroydelete_companyview_company)r   r.   r#   rV   s    rB   rW   zCompanyViewSet.get_permissions   s^    ;;(""$%%[[88%n566[[I%%&6788%n566rD   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   r8   F)r   r8   is_available)r|   active_users_countinactive_users_countavailable_users_count)
r;   r[   is_superuserr   r>   r@   select_relatedannotater/   	companiesr]   s     rB   rC   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

	
rD   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.r8   )      ri   zCall SettingszUpdated call settings)rZ   
updated_byr   rb   rc   rd   NTcompany_status_changedis_now_activeFforce_session_refresh)rk   r[   r8   datar=   superr   status_coder   r>   r~   r7   
isinstancestrboolintr\   'handle_users_after_company_deactivation)rA   r;   argskwargsrt   r[   rZ   
old_status
new_statusresponse	__class__s             rB   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)rE   rF   rG   rH   r   rI   r#   rJ   r%   pagination_classr   r   filter_backendssearch_fieldsordering_fieldsorderingrW   rC   r   __classcell__)r   s   @rB   rw   rw   z   sJ    B(+,/%|4O0MGOH	7
<% %rD   rw   c                 d   t               }|j                  j                  |       }|D ]  }|j                  j                  d      j	                  | j
                        }|j                         r&|j                         |_        |j                          od |_        |j                           y )N)r\   Tr:   r7   )
r   r>   r?   r   excluder7   existsfirstr\   re   )rZ   Userr   r[   other_active_companiess        rB   r   r      s    DLLw7E!%!6!6!6!F!N!NRYR\R\!N!]!((*"8">">"@DIIK"&DIIK rD   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 )rO   r~   r   r   r   r   )r   r.   r#   r$   rV   s    rB   rW   z#ActiveCompaniesView.get_permissions   sZ    ;;(""$%%[[88%n566[[I%%&6788J<rD   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_atrY   )id__in)r;   r[   r<   r=   r   r   r>   r@   r   r?   order_byr   has_company_permissionappendr7   )rA   r[   permission_codenamequerysetfiltered_companiesrZ   s         rB   rC   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 $ ??*<?==rD   c                 $    |j                          y)z$Custom logic when creating a companyNre   rA   rf   s     rB   rg   z"ActiveCompaniesView.perform_create      rD   c                 $    |j                          y)z$Custom logic when updating a companyNr   r   s     rB   ro   z"ActiveCompaniesView.perform_update  r   rD   c                 2    d|_         |j                          y)z8Soft delete - set is_active to False instead of deletingFN)r8   re   rs   s     rB   ru   z#ActiveCompaniesView.perform_destroy   s    "rD   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: Tr6   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 )usernamerx   yearzYou are added to zauth/user_added_to_company.html)subjecthtml_contentrecipient_listkeyzUser "z" added to company "")messager   r5   zDEBUG: Exception occurred: N)r[   r   r   r
   r   HTTP_403_FORBIDDENprintr   r>   r=   rx   DoesNotExistHTTP_404_NOT_FOUNDr   HTTP_400_BAD_REQUESTr   r   r   addr\   re   emailr(   todayr   r'   r7   	Exceptionr   HTTP_500_INTERNAL_SERVER_ERROR)	rA   r;   pkr5   rZ   r   r[   r   es	            rB   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)rE   rF   rG   rH   r   rI   r#   rJ   r%   r   rW   rC   rg   ro   ru   r   r   rK   rD   rB   r   r      sS    &(+,/	  D
 4&*J +JrD   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   )rA   r;   rf   s      rB   r=   zUserCompaniesView.getw  s&    ,W\\IwCWX

((rD   N)rE   rF   rG   rH   r   rJ   r=   rK   rD   rB   r   r   s  s    5)*)rD   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: r7   rx   r   rZ   r   r   N)r   r   is_validswitch_companyr[   r
   rx   r7   r   HTTP_200_OKr   r   r   rA   r;   rf   rZ   r   s        rB   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rE   rF   rG   rH   r   rJ   r   rK   rD   rB   r   r   }  s    &)*3rD   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
   rx   r7   r   r   r   r   r   r   s        rB   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   rK   rD   rB   r   r     s    $)*3rD   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 )rO   rP   view_officehoursedit_officehoursrU   rV   s    rB   rW   z"OfficeHoursViewSet.get_permissions  -    ;;..%&89::%&89::rD   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 companyrY   day
start_time)r;   r[   r\   r)   r   r>   r?   r   r]   s     rB   rC   zOfficeHoursViewSet.get_queryset  R    ||  ""&((""))$2E2E)FOOPUWcddrD   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 changerY   r_   r   zCreated  office hours:  - ra   N)	re   r;   r[   r\   r&   r7   r  r  end_time)rA   rf   office_hours      rB   rg   z!OfficeHoursViewSet.perform_create  s     oodll.?.?.N.NoO 	LL%%44""$!nn{/{?U?U>VVYZeZnZnYop	
rD   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	  ri   r   zUpdated office hours from '' to 'r`   ra   N)
rk   r  r  r
  re   r&   r;   r[   r\   r7   )rA   rf   rl   rm   r  rn   s         rB   ro   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	
rD   c                    t        | j                  j                  j                  | j                  j                  dd|j                  d|j
                   d|j                   d|j                          |j                          y)z&Log changes when deleting office hoursrq   r   zDeleted r  r	  ra   N)	r&   r;   r[   r\   r7   r  r  r
  rr   rs   s     rB   ru   z"OfficeHoursViewSet.perform_destroy  so     	LL%%44""$kkx||nOH<O<O;PPST\TeTeSfg	
 	rD   Fr   r   c                 0    t        |t        dt              S )z<Apply current company's office hours to all user's companiesr   r;   model_classrb   validation_func)r*   r   r+   rA   r;   s     rB   apply_to_all_companiesz)OfficeHoursViewSet.apply_to_all_companies  s     +#$1	
 	
rD   N)rE   rF   rG   rH   r   rI   r#   rJ   rW   rC   rg   ro   ru   r   r  rK   rD   rB   r   r     sK    8,+,;e

$ 56(+
 ,
rD   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 )rO   rP   view_salestimeedit_salestimerU   rV   s    rB   rW   z"SalesTimingViewSet.get_permissions  s-    ;;..%&6788%&6788rD   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 companyrY   botr  )r;   r[   r\   r)   r   r>   r?   r   r]   s     rB   rC   zSalesTimingViewSet.get_queryset  r  rD   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 changerY   r_   r   zCreated sales timing for bot '': r	  ra   N)	re   r;   r[   r\   r&   r7   r  r  r
  )rA   rf   sales_timings      rB   rg   z!SalesTimingViewSet.perform_create  s    !t||/@/@/O/OP 	LL%%44""$"oo4\5E5E4Fc,JaJaIbbefrf{f{e|}	
rD   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	  ri   r   zUpdated sales timing from 'r  r`   ra   N)
rk   r  r  r
  re   r&   r;   r[   r\   r7   )rA   rf   rl   rm   r  rn   s         rB   ro   z!SalesTimingViewSet.perform_update  s    (l../s<3J3J2K3|OdOdNef!( l../s<3J3J2K3|OdOdNefLL%%44""$"oo1+f[MQRS	
rD   c                    t        | j                  j                  j                  | j                  j                  dd|j                  d|j
                   d|j                   d|j                          |j                          y)z&Log changes when deleting sales timingrq   r   zDeleted sales timing for bot 'r  r	  ra   N)	r&   r;   r[   r\   r7   r  r  r
  rr   rs   s     rB   ru   z"SalesTimingViewSet.perform_destroy,  so     	LL%%44""$kk4X\\N#hFYFYEZZ]^f^o^o]pq	
 	rD   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     rB   r  z)SalesTimingViewSet.apply_to_all_companies:  s     +#$2	
 	
rD   N)rE   rF   rG   rH   r   rI   r#   rJ   rW   rC   rg   ro   ru   r   r  rK   rD   rB   r  r    sK    8,+,9e

$ 56(+
 ,
rD   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 )rO   rP   view_catchphraseedit_catchphraserU   rV   s    rB   rW   z"CatchPhraseViewSet.get_permissionsJ  r  rD   c                     | j                   j                  }|j                  s
t               t        j
                  j                  |j                        j                  d      S )z;Filter to show only catch phrases for user's active companyrY   phrase)r;   r[   r\   r)   r   r>   r?   r   r]   s     rB   rC   zCatchPhraseViewSet.get_querysetQ  sO    ||  ""&((""))$2E2E)FOOPXYYrD   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 changerY   r_   r   zCreated catch phrase: 'r`   ra   N)re   r;   r[   r\   r&   r7   r(  )rA   rf   catch_phrases      rB   rg   z!CatchPhraseViewSet.perform_createX  sl    !t||/@/@/O/OP 	LL%%44""$"oo-l.A.A-B!D	
rD   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 phraser`   ri   r   zUpdated catch phrase from rj   ra   N)rk   r(  re   r&   r;   r[   r\   r7   )rA   rf   rl   rm   r*  rn   s         rB   ro   z!CatchPhraseViewSet.perform_updatef  s    (,--.a0!( ,--.a0LL%%44""$"oo0T+O	
rD   c           
          t        | j                  j                  j                  | j                  j                  dd|j                  d|j
                   d       |j                          y)z&Log changes when deleting catch phraserq   r   zDeleted catch phrase: 'r`   ra   N)r&   r;   r[   r\   r7   r(  rr   rs   s     rB   ru   z"CatchPhraseViewSet.perform_destroyx  sV     	LL%%44""$kk-hoo->a@	
 	rD   N)rE   rF   rG   rH   r   rI   r#   rJ   rW   rC   rg   ro   ru   rK   rD   rB   r#  r#  E  s.    9,+,;Z

$rD   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__usernamerb   r   rd   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     rB   rC   z"CompanyHistoryViewSet.get_queryset  sJ    ||  ""!))..00""**..00rD   c                     t        d      gS )z(Explicitly check view_company permissionr   )r#   rV   s    rB   rW   z%CompanyHistoryViewSet.get_permissions  s    !.122rD   N)rE   rF   rG   rH   r   rI   r#   rJ   r%   r   r   r   r   r   rC   rW   rK   rD   rB   r.  r.    s5    G/+,/#^4OM13rD   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 )rO   rP   view_holidaysedit_holidaysrU   rV   s    rB   rW   zHolidayViewSet.get_permissions  s+    ;;..%o677%o677rD   c                     | j                   j                  }|j                  s
t               t        j
                  j                  |j                        j                  d      j                  d      S )z6Filter to show only holidays for user's active companyrY   bots
start_date)	r;   r[   r\   r)   r   r>   r?   r@   r   r]   s     rB   rC   zHolidayViewSet.get_queryset  sY    ||  ""&((%%d.A.A%BSSTZ[ddeqrrrD   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 changerY   r_   r   zCreated holiday '' from rj   ra   N)	re   r;   r[   r\   r&   r7   rx   r=  end_date)rA   rf   holidays      rB   rg   zHolidayViewSet.perform_create  s    //$,,*;*;*J*J/K 	LL%%44"" jj'~WW=O=O<PPTU\UeUeTfg	
rD   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 holidayr`   r?  rj   ri   r   zUpdated holiday from ra   N)
rk   rx   r=  r@  re   r&   r;   r[   r\   r7   )rA   rf   rl   rm   rA  rn   s         rB   ro   zHolidayViewSet.perform_update  s    (,++,GL4K4K3LDQ]QfQfPgh//# ',,ww/A/A.B$wGWGWFXYLL%%44"" jj+K=[MJ	
rD   c                    t        | j                  j                  j                  | j                  j                  dd|j                  d|j
                   d|j                   d|j                          |j                          y)z!Log changes when deleting holidayrq   r   zDeleted holiday 'r?  rj   ra   N)	r&   r;   r[   r\   r7   rx   r=  r@  rr   rs   s     rB   ru   zHolidayViewSet.perform_destroy  so     	LL%%44"" kk'gh>Q>Q=RRVW_WhWhVij	
 	rD   Fr   r   c                     t        |      S )z8Apply current company's holidays to all user's companies)r-   r  s     rB   r  z%HolidayViewSet.apply_to_all_companies  s     /w77rD   N)rE   rF   rG   rH   r   rI   r#   rJ   rW   rC   rg   ro   ru   r   r  rK   rD   rB   r7  r7    sK    3(+,8s

$ 56(+8 ,8rD   r7  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   apps.companies.modelsr   r   r   r   r   r   r   apps.companies.serializersr   r   r   r   r   r   r   r   r   r    r!   r"   apps.permissions.permissionsr#   r$   utils.paginations.paginationr%   apps.companies.utilsr&   utils.threads.email_threadr'   datetimer(   apps.companies.exceptionsr)   r*   r+   r,   r-   r.   django.db.modelsr/   rest_framework_simplejwt.tokensr0   r1   r   ListAPIViewr3   rM   rw   r   r   r   r   r   r   r  r#  ReadOnlyModelViewSetr.  r7  rK   rD   rB   <module>rZ     s)   ; 0 ( ? C , ! , # . } } }    $ D A 3 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8rD   