
    J3i,                     b   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 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mZ  e	       Z G d de
j<                        Z G d de
j<                        Z  G d de
j<                        Z! G d de      Z"y)    status)Response)APIView)IsAuthenticated)get_user_model)genericspermissionsfiltersr   CompanyPermission)Concat)UserCompanyRole)Company)CompanyUserSerializerUserCompanyWithRoleSerializer)r	   )OurLimitOffsetPagination)FValuec                        e Zd ZdZeZeZej                  ej                  gZg dZdgZg dZd Zd Z fdZd Z xZS )	CompanyUsersViewz$List all users in a specific company)	full_nameemailprofile__phone_numbercompanies_countz-created_at)r   r   r   c                     t        d      gS N
view_usersr   selfs    D/var/www/html/dp2/backend_v2.1/server/apps/core/views/companyuser.pyget_permissionsz CompanyUsersView.get_permissions"       !,/00    c                 *   | j                   j                  }| j                   j                  j                  d      }|xs t	        |j
                  dd      }|st        d      t        j                  j                  |      }|st        d      |dfS )z.Get company based on user type and parameters.
company_ididNz5No company id provided or user has no active company.r'   zCompany not found.)	requestuserquery_paramsgetgetattractive_company	Exceptionr   objects)r    r*   r&   target_company_idcompanys        r!   get_companyzCompanyUsersView.get_company%   s    ||  \\..22<@
&R'$2E2EtT*R STT//%%):%;011}r$   c                 t    t         |          }| j                  j                  j	                  d      |d<   |S )Nr&   )superget_serializer_contextr)   r+   r,   )r    context	__class__s     r!   r6   z'CompanyUsersView.get_serializer_context5   s4    '02 $ 9 9 = =l Kr$   c           	         | j                   j                  }| j                   j                  j                  d      }t	        |dd      dk(  r/|-t
        j                  j                  d      j                         S | j                         \  }}|j                  j                  d      j                         j                  t        t        d      t        d      t        d            	      }|r|j                  r|j!                  |
      }|S )z?Get users from the specified company - assumes company is validr&   	user_typeNsuper_adminprofileprofile__first_name profile__last_name)r   )	companies)r)   r*   r+   r,   r-   Userr0   select_relatedallr3   usersannotater   r   r   r'   filter)r    r*   r&   r2   _querysets         r!   get_querysetzCompanyUsersView.get_querysetL   s    ||  \\..22<@
4d+}<AS<<..y9==??%%'
==//	:>>@II'(c
&' J 
 wzz9Hr$   )__name__
__module____qualname____doc__r   serializer_classr   pagination_classr   OrderingFilterSearchFilterfilter_backendsordering_fieldsorderingsearch_fieldsr"   r3   r6   rI   __classcell__)r8   s   @r!   r   r      sO    .,/--w/C/CDOXOHM1 .r$   r   c                   (    e Zd ZdZegZd Zd Zd Zy)SingleUserCompaniesViewzList all companies a user belongs to
    
    Usage:
    - GET /api/core/user-companies/?user_id=2 - Returns companies for user with ID 2
    
    Required Parameters:
    - user_id: ID of the user to get companies for
    c                     | j                   }|j                  j                  d      }|st        d      	 t        j
                  j                  |d      }|S # t        j                  $ r t        d| d      w xY w)z)Get the target user based on query paramsuser_idzuser_id parameter is requiredT)r'   	is_activezUser with ID z
 not found)r)   r+   r,   r/   rA   r0   DoesNotExist)r    r)   rZ   target_users       r!   get_target_userz'SingleUserCompaniesView.get_target_user   s    ,,&&**95;<<	A,,**g*FK     	AmG9J?@@	As   !A #A<c                 t    | j                         }|j                  j                         j                  d      S )z,Get all companies the target user belongs tousers__profile)r^   r@   rF   prefetch_related)r    r*   s     r!   rI   z$SingleUserCompaniesView.get_queryset   s/    ##%~~$$&778HIIr$   c                    	 | j                         }| j                         }t        |dd|i      }t        |j                        S # t        $ r0}t        dt        |      it        j
                        cY d}~S d}~ww xY w)z*Return list of companies with user contextdetailr   NTr*   manyr7   )	r^   r/   r   strr   HTTP_403_FORBIDDENrI   r   data)r    r)   argskwargsr]   erH   
serializers           r!   listzSingleUserCompaniesView.list   s    	1..0K $$& 3[)

 
((  	1#a&//1 1	1s   A 	B %A;5B ;B N)	rJ   rK   rL   rM   r   permission_classesr^   rI   rm    r$   r!   rX   rX      s"     **$J)r$   rX   c                   ,    e Zd ZdZeZegZd Zd Z	d Z
y)AllCompaniesUsersViewz2List all users from all companies (superuser only)c                     t        d      gS r   r   r   s    r!   r"   z%AllCompaniesUsersView.get_permissions   r#   r$   c                     | j                   j                  j                  st        j                  j                         S t        j                  j                  d      j                  d      j                         S )z Get all users from all companiesr<   r@   )	r)   r*   is_superuserrA   r0   nonerB   ra   rC   r   s    r!   rI   z"AllCompaniesUsersView.get_queryset   sQ    ||  --<<$$&&||**95FF{SWWYYr$   c                 X   |j                   j                  st        ddit        j                        S t
        j                  j                  d      j                  d      }g }|D ]  }|j                  j                  d      j                         }| j                  |d|j                  |j                  d	      }|j                  |j                  |j                  d
|j                   |j#                         d        t        |t%        |      t'        d |D              d      S )z+Handle the response for all companies userserrorz(Only superusers can access this endpointr   T)r[   r`   r<   )r&   company_namerd   )r'   name)r2   rD   total_usersc              3   &   K   | ]	  }|d      yw)rz   Nro   ).0r2   s     r!   	<genexpr>z-AllCompaniesUsersView.list.<locals>.<genexpr>   s     LV'w}5Vs   )r@   total_companiesrz   )r*   rt   r   r   rg   r   r0   rF   ra   rD   rB   rC   get_serializerr'   ry   appendrh   countlensum)	r    r)   ri   rj   r@   resultr2   rD   rl   s	            r!   rm   zAllCompaniesUsersView.list   s   ||((DE00  OO**T*:KKL\]	 GMM00;??AE ,,U%jj 'H, J
 MM!**#LL $${{}  !$ "6{LVLL
  	r$   N)rJ   rK   rL   rM   r   rN   r   rn   r"   rI   rm   ro   r$   r!   rq   rq      s$    <,+,1Z"r$   rq   c                   "    e Zd ZdZegZd Zd Zy)UserStatusViewz,Simple endpoint to set user is_active statusc                     t        d      gS )N
edit_usersr   r   s    r!   r"   zUserStatusView.get_permissions   r#   r$   c                    |j                   j                  d      }|j                   j                  d      }|j                   j                  d      }|st        ddit        j                        S ||t        ddit        j                        S 	 t
        j                  j                  |      }|j                  j                  sB|j                  |j                  j                        st        dd
it        j                        S |du r)|j                  rt        ddit        j                        S |du r@|j                  |j                  j                  k(  rt        ddit        j                        S g }|!||_        |rdnd}|j!                  d|        |!||_        |rdnd}|j!                  d|        |j%                          t        dj'                  |       d|j                  |j                  |j"                  dt        j(                        S # t
        j                  $ r  t        dd	it        j                        cY S w xY w)z-Set user is_active and/or is_available statusrZ   r[   is_availablerw   zuser_id is requiredr   zBAt least one of is_active or is_available is required (true/false)r(   zUser not foundz+You can only manage users from your companyFz$Cannot deactivate superuser accountsz&You cannot deactivate your own account	activateddeactivatedzUser zmade availablezmade unavailablez, z successfully)messagerZ   r[   r   )rh   r,   r   r   HTTP_400_BAD_REQUESTrA   r0   r\   HTTP_404_NOT_FOUNDr*   rt   belongs_to_companyr.   rg   r'   r[   r   r   savejoinHTTP_200_OK)r    r)   rZ   r[   r   r*   status_changesactions           r!   postzUserStatusView.post   sO   ,,""9-LL$$[1	||''7.113 3
 !5]113 3	1<<##w#/D ||((**7<<+F+FGJ! 335 5
 $"3"3?//1 1
 $''W\\__"<A//1 1
  &DN$-[=F!!E&"23# ,D)5%;MF!!E&"23		))N34MBww --	

 $$& 	&O    	1)//1 1	1s    H$ $0IIN)rJ   rK   rL   rM   r   rn   r"   r   ro   r$   r!   r   r      s    6+,1?&r$   r   N)#rest_frameworkr   rest_framework.responser   rest_framework.viewsr   rest_framework.permissionsr   django.contrib.authr   r	   r
   r   apps.permissions.permissionsr   django.db.models.functionsr   apps.permissions.modelsr   apps.companies.modelsr   %apps.core.serializers.companyuserlistr   r   utils.paginationsr   django.db.modelsr   r   rA   ListAPIViewr   rX   rq   r   ro   r$   r!   <module>r      s    ! , ( 6 . A A : - 3 ) f # 6 %Jx++ Jr5)h22 5)p1H00 1hF&W F&r$   