
    'i5                        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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 d dl m!Z! d dl"Z" e       Z# e"jH                  e"jJ                  d        e"jL                  e'      Z( G d de      Z) G d de      Z* G d de      Z+ G d de      Z, G d de      Z-y)    )ListAPIView)IsAdminUser)ModelViewSet)APIView)Response)statusserializers)action)get_user_model)IntegrityError   )Role
PermissionUserCompanyRole)RoleSerializerPermissionSerializerUserSerializerCompanyPermission)Company)SuperAdminOnly)filters)OurLimitOffsetPaginationNz"%(levelname)s %(name)s %(message)s)levelformatc                   T    e Zd ZdZej
                  j                         ZeZ	e
gZdgZy)PermissionViewSetz%Manage permissions (super admin only)nameN)__name__
__module____qualname____doc__r   objectsallquerysetr   serializer_classr   permission_classesordering     ?/var/www/html/dp2/backend_v2.1/server/apps/permissions/views.pyr   r      s/    /!!%%'H+()xHr*   r   c                   &    e Zd ZdZeZegZd Zd Z	y)CompanyRolesViewz!List roles for a specific companyc                     | j                   j                  d      }t        j                  j	                  |      j                         }t        d|      xs t        d|      gS ),Return different permissions based on action
company_idid
view_rolescreate_users)kwargsgetr   r#   filterfirstr   )selfr0   companys      r+   get_permissionsz CompanyRolesView.get_permissions&   sR    [[__\2
//((J(7==?!,8f<Mn^e<fggr*   c                    |j                   }|j                  d      }	 t        j                  j                  |d      }|j                  s)|j                  st        ddit        j                        S t        j                  j                  |d      }| j                  |d	      }t        |j                        S # t        j                  $ r  t        ddit        j                        cY S w xY w)
z.Override list to return proper error responsesr0   Tr2   	is_activedetailzCompany not found.r   zNo active company.r:   r>   many)userr6   r   r#   DoesNotExistr   r   HTTP_404_NOT_FOUNDis_superuseractive_companyHTTP_400_BAD_REQUESTr   r7   get_serializerdata)	r9   requestargsr5   rD   r0   r:   roles
serializers	            r+   listzCompanyRolesView.list-   s    ||ZZ-
	oo))Z4)HG   &&34!66  ##Gt#D((T(:

((1 ## 	/000 	s   !B> >0C10C1N)
r   r    r!   r"   r   r&   r   r'   r;   rP   r)   r*   r+   r-   r-   !   s    +%+,h )r*   r-   c                   x    e Zd ZdZeZegZej                  gZ
g dZdgZd Zd Zd Z eddg	      dd       Zy
)RoleViewSetz"Manage roles and their permissions)r   descriptioncompany__name-created_atc                     | j                   dk(  rt        d      gS | j                   dv rt        d      gS | j                   dk(  rt        d      gS | j                   dk(  rt        d      gS t        d	      gS )
r/   createcreate_roles)updatepartial_update
edit_rolesdestroydelete_rolesassign_to_userassign_rolesr3   )r
   r   r9   s    r+   r;   zRoleViewSet.get_permissions\   sz    ;;("%n566[[88%l344[[I%%n566[[,,%n566%l344r*   c                    | j                   j                  }|j                  rh| j                   j                  j	                  d      }|r!t
        j                  j                  |d      S t
        j                  j                  d      S |j                  r+t
        j                  j                  |j                  d      S t
        j                  j                         S )z&Filter roles based on user permissionsr0   T)r0   r>   r>   rA   )
rL   rD   rG   query_paramsr6   r   r#   r7   rH   none)r9   rD   r0   s      r+   get_querysetzRoleViewSet.get_queryseti   s    ||  2266|DJ||**jD*QQ||**T*::<<&&t/B/Bd&SS||  ""r*   c                 2   	 | j                   j                  j                  d      }|r	 t        j                  j                  |d      }| j                   j
                  j                  s<| j                   j
                  j                  |      st        j                  ddi      |j                  |       y |j                  | j                   j
                  j                         y # t        j                  $ r t        j                  dd| di      w xY w# t        $ rp}dt        |      j                         v rOd	t        |      j                         v r4t        j                  d	d
|j                   j                  d	       di       d }~ww xY w)Nr:   Tr=   z6You can only create roles for companies you belong to.)r:   Company with ID  not found or inactive.uniquer   zRole with name z) already exists in the specified company.)rL   rK   r6   r   r#   rD   rG   belongs_to_companyr	   ValidationErrorsaverE   rH   r   strlowervalidated_data)r9   rO   r0   r:   es        r+   perform_createzRoleViewSet.perform_createy   sl   	**..y9J
%oo11Z41PG<<,,99$,,BSBSBfBfgnBo)99%)_;   OOGO4 (9(9(H(HI ++ %55!%5j\AX#Y7    	3q6<<>)fA.F!11oj.G.G.K.KF.S-TT}~3   	s0   'D BC+ :0D +/DD 	F&A+FFTpost)r?   methodsNc                    	 |}	 t         j                  j                  |d      }|j                  j	                         dk(  r+t        dd|j                   dit        j                        S 	 |j                  j                  d
      }|st        ddit        j                        S 	 t        j                  j                  |      }|j                  j                  rM|j                  j                  d      }|r#	 t        j                  j                  |d      }nV|j                   }nI|j                  j"                  st        ddit        j                        S |j                  j"                  }|j                   |k7  r8t        dd|j                   d|j                   dit        j                        S |j%                  |      sXt        d|j&                  j(                   d|j&                  j*                   d|j                   dit        j                        S t,        j                  j/                  ||      j1                         }	t2        j5                  d       t,        j                  j/                  ||j"                  d      j7                         }
t2        j5                  d|
 d|j"                          |
s||_        |j9                          |	r|	j:                  |k(  ret        d|j&                  j(                   d|j&                  j*                   d|j                   d|j                   dit        j                        S ||	_        |	j9                          t        d|j&                  j(                   d|j&                  j*                   d|j                   d|j                   d	|j<                  |j<                  |j<                  ddt        j>                        S t,        j                  jA                  |||       }t        d|j                   d!|j&                  j(                   d|j&                  j*                   d|j                   d	|j<                  |j<                  |j<                  dd"t        jB                        S # t         j                  $ r$ 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# t        j                  $ r$ t        dd| d	it        j                        cY S w xY w# tD        $ r3}t        dd#tG        |       it        jH                        cY d$}~S d$}~ww xY w)%zAssign this role to a userTr=   r   r?   zRole zJ has no permissions. Please assign some permissions or choose another one.r@   zRole with ID rh   user_idzuser_id is required.r1   zUser with ID z not found.r0   rg   z0You must have an active company to assign roles.z does not belong to company . )rD   r:   z&=============Permissions==============F)rD   r:   role__isnullz
has_role: z in company: z already has role z in company z	Role for z updated to )r?   ru   role_idr0   replaced)rD   r:   rolez assigned to )r?   ru   ry   r0   createdzAn error occurred: N)%r   r#   r6   permissionscountr   r   r   rI   rE   rF   rK   UserrD   rG   r   r:   rH   rj   profile
first_name	last_namer   r7   r8   loggerinfoexistsrl   r{   r2   HTTP_200_OKrW   HTTP_201_CREATED	Exceptionrm   HTTP_500_INTERNAL_SERVER_ERROR)r9   rL   pkry   r{   ru   rD   r0   target_companyexisting_user_rolehas_role	user_rolerp   s                r+   r^   zRoleViewSet.assign_to_user   s   }	G||''7d'C$$**,1#$dii[  9C  'DE%::  2 ll&&y1G56!66 
||''7'3 ||(($\\--l;
)0)<)<
VZ)<)[ &*\\N ||22#!#UV%::  ")!<!< ||~-tyyk1MnNaNaMbbcde!66  **>: T\\%<%<$=Qt||?U?U>VVr  tB  tG  tG  sH  HI  #JK!66  "1!8!8!?!?& "@ " eg  KK@A&..554I\I\CH 6 JJP&( KK*XJmD<O<O;PQR&4#		!%**d2#$)@)@(A4<<CYCYBZZlmqmvmvlw  xD  ES  EX  EX  DY  YZ  '[\%::  /3&+&++-#$-dll.E.E-FaH^H^G__klplulukv  wC  DR  DW  DW  CX  XY  #Z#'77#'77&4&7&7$(% %002 2 (//66& 7 I !$))M$,,:Q:Q9RRSTXT`T`TjTjSkkw  yG  yL  yL  xM  MN  O7777,// --/ /M $$ wi7NOP!44   $$ wi{CD!44  #// '%)9*E\']^#)#<#<  b  	0Q9:<< 	s   U A(R" .:U * S 
3U >!T A U  AU =A(U &D2U BU 8B)U "4SU SU 4TU TU 4U
U UU 	V(VVV)N)r   r    r!   r"   r   r&   r   r'   r   SearchFilterfilter_backendssearch_fieldsr(   r;   re   rq   r
   r^   r)   r*   r+   rR   rR   P   s`    ,%+,++,OM
 H5# 2 4&* +r*   rR   c                   p    e Zd ZdZegZeZeZ	e
j                  e
j                  gZg dZg dZdgZd Zd Zy)RoleUserListViewzList users with a specific role)emailprofile__first_nameprofile__last_name)r   r   r   
created_atrU   c                     t        d      gS z1Return permissions with specific permission checkr3   r   r`   s    r+   r;   z RoleUserListView.get_permissions      !,/00r*   c                    | j                   j                  d      }| j                  j                  }	 t        j
                  j                  |      }|j                  sC|j                  r|j                  |j                  k7  rt        j
                  j                         S t        j
                  j                  ||j                  d      j                  dd      }t        j
                  j                  |      j                  d      S # t        j                  $ r! t        j
                  j                         cY S w xY w)	z Get users for the specified rolery   r1   T)r{   r:   r>   ru   )flat)id__inr   )r5   r6   rL   rD   r   r#   rE   r   rd   rG   rH   r:   r   r7   values_listselect_related)r9   ry   rD   r{   user_role_idss        r+   re   zRoleUserListView.get_queryset#  s   ++//),||  	'<<##w#/D   &&$,,$:M:M*M||((**'//66LL 7 
 +id+
+	 	 ||""  # 

.
#	$    	'<<$$&&	's    D 1EEN)r   r    r!   r"   r   r'   r   r&   r   pagination_classr   r   OrderingFilterr   r   ordering_fieldsr(   r;   re   r)   r*   r+   r   r     sK    )+,%/++W-C-CDOJMZOH1$r*   r   c                   "    e Zd ZdZegZd Zd Zy)PermissionListViewzList all available permissionsc                     t        d      gS r   r   r`   s    r+   r;   z"PermissionListView.get_permissions@  r   r*   c                    t         j                  j                  d      }|j                  j                  r t        t        |d      j                        S |j                  j                  rct         j                  j                  d|j                  j                        j                         }t        t        |d      j                        S t        g       S )NTrb   rB   )r>   roles__company)
r   r#   r7   rD   rG   r   r   rK   rH   distinct)r9   rL   r}   company_permissionss       r+   r6   zPermissionListView.getD  s     !((//$/? <<$$04HMMNN <<&&","4"4";";&||:: #< # hj   01D4PUUVV|r*   N)r   r    r!   r"   r   r'   r;   r6   r)   r*   r+   r   r   <  s    (+,1r*   r   ).rest_framework.genericsr   rest_framework.permissionsr   rest_framework.viewsetsr   rest_framework.viewsr   rest_framework.responser   rest_frameworkr   r	   rest_framework.decoratorsr
   django.contrib.authr   	django.dbr   modelsr   r   r   r   r   r   r}   r   apps.companies.modelsr   r   r   utils.paginationsr   loggingr   basicConfigINFO	getLoggerr   r   r   r-   rR   r   r   r)   r*   r+   <module>r      s    / 2 0 ( , . , . $ 5 5 M M * ) ' " 6    ',,/S T			8	$ ,){ ,)^B, BJ$${ $$N r*   