
    
iP                     @   d dl mZ d dl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mZmZ d d	lmZmZ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"m#Z# d dl$m%Z% d dl&m'Z' d dl(m)Z) d dl*m+Z+  e       Z, e       Z-e,j]                  de       dd ddd ee       ee-      fde/de/de0de0de0dedefd       Z1e,j]                  d        ee      fd!e/defd"       Z2e,jg                  d#       ee       ee-      fd!e/d$ee+   dedefd%       Z4y)&    )defaultdictN)List)	APIRouterDependsHTTPExceptionstatus)Session)JSONResponse)jsonable_encoder)OAuth2PasswordRequestForm
HTTPBearerHTTPAuthorizationCredentials)verify_passwordget_password_hashcreate_access_tokenverify_token)datetimetimezone)get_db)User)RoleBase)jwtJWTError)Role)
Permission)Section)PermissionUpdatez/roles-list)response_model
   idasclimitoffsetsearchsort_by
sort_orderdbcredentialsc                 N  K   |j                   }t        |      }|j                  t              j	                  t        j
                  |k(        j                         }	|	st        t        j                  d      |j                  t              j                  |dk(  rt        t        |      j                         nt        t        |      j                               }
|
j                         }|r2|
j	                  t        j                   j#                  d| d            }
|
j%                  |      j'                  |       j)                         }|st        t        j*                  d      t-        |      }t/        ||t        j0                  ddt        j0                        S w)	z#
    Retrieve a list of roles.
    Invalid user tokenstatus_codedetailr!   %zNo active users foundz#Active roles retrieved successfully)rolecountr,   messagecontentr,   )r(   r   queryr   filterr    firstr   r   HTTP_401_UNAUTHORIZEDr   order_bygetattrr!   descr0   nameiliker#   r"   allHTTP_404_NOT_FOUNDr   r
   HTTP_200_OK)r"   r#   r$   r%   r&   r'   r(   tokenuser_iduserdb_query
role_count
role_users	role_lists                 9/var/www/html/syllabuild_admin/backend/api/routes/role.py	get_rolesrH      sJ     ##E5!G88D>  G!34::<D(D(DMabbxx~&&(2e(;g""$wAWA\A\A^H !J??499??Qvha=#AB(..u599;J(A(AJabb !,I!--<	
 && s   F#F%z!/roles-with-permissions/{role_id}role_idc           	      R   |j                  t              j                  t        j                  | k(        j	                         }|st        t        j                  d      |j                  t              j                         }|j                  t              j                  t        j                  | k(        j                         }i }|D ]e  }|j                  |j                  g       j                  |j                  |j                  |j                   |j"                  |j$                  d       g g }|D ]G  }|j'                  |j                  g       }	|j                  |j                  |j(                  |	d       I |j(                  |j                  d|t+        |      dddS )	NRole not foundr+   )r    createvieweditdelete)r    r;   permissions)r;   r       z6Permissions grouped by sections retrieved successfully)r/   sectionsr0   r,   r1   )r4   r   r5   r    r6   r   r   r>   r   r=   r   rI   
setdefault
section_idappendrL   rM   rN   rO   getr;   len)
rI   r'   r/   rR   role_permissionspermissions_by_sectionpermsections_datasectionsection_permissionss
             rG   get_role_permissionsr^   D   sj    88D>  G!34::<D(A(AJZ[[ xx $$&H 		
""g-	.	     ))$//2>EE''kkIIIIkkG
 	 M 488RH**LL.
 	 $''2!]#K     z/permissions-update/{role_id}rP   c                 4  K   |j                   }t        |      }|j                  t              j	                  t        j
                  |k(        j                         }|st        t        j                  d      |j                  t              j	                  t        j
                  | k(        j                         }|st        t        j                  d      	 |j                  t              j	                  t        j                  | k(        j                          |j                  t              j!                         }|D 	ch c]  }	|	j
                   }
}	|D ci c]  }|j"                  | }}g }|
D ]~  }|j%                  |      }|rI|j'                  t        | ||j(                  |j*                  |j,                  |j                               _|j'                  t        | |dddd              |j/                  |       |j1                          t3        t        j4                  ddt        j4                        S c c}	w c c}w # t6        $ r<}|j9                          t        t        j:                  d	t=        |             d
}~ww xY ww)zz
    Update all permissions of a given role_id.
    Includes sections that are missing from payload (with all False).
    r*   r+   rK   )rI   rT   rL   rM   rN   rO   Fz Permissions updated successfully)r,   r1   r2   zFailed to update permissions: N)r(   r   r4   r   r5   r    r6   r   r   HTTP_400_BAD_REQUESTr   r>   r   rI   rO   r   r=   rT   rV   rU   rL   rM   rN   bulk_save_objectscommitr
   r?   	ExceptionrollbackHTTP_500_INTERNAL_SERVER_ERRORstr)rI   rP   r'   r(   r@   current_user_idcurrent_userr/   all_sectionsr\   section_idsrZ   payload_mapnew_permissionsrT   	perm_dataes                    rG   update_permissionsrp   r   sG     ##E"5)O88D>((O)CDJJLL33'
 	
 88D>  G!34::<D11#
 	

8

##J$6$6'$ABIIK xx(,,.1=>gwzz>> /:
&*DOOT!
 

 % 	J#
3I&&z#)$++""$++(   &&z#)  ( 	2 	_-
		%11= **
 	
K ?
T  

==3CF8<
 	

sJ   CJA*I II I2CI J
I 	J7JJJ)5collectionsr   retypingr   fastapir   r   r   r   sqlalchemy.ormr	   fastapi.responsesr
   fastapi.encodersr   fastapi.securityr   r   r   core.securityr   r   r   r   r   r   
db.sessionr   db.models.userr   db.schemas.roler   joser   r   db.models.roler   db.models.permissionr   db.models.sectionr   db.schemas.permissionr   routersecurityrV   intrg   rH   r^   putrp    r_   rG   <module>r      sg   # 	  = = " * - _ _ ` ` '   %   + % 2	< M(3&/070A*** * 	*
 * 	* .* 4*V /05<V_ +# +7 + 1+Z +, &/070A	T
T
&'T
 	T
 .	T
 -T
r_   