1- from Access .models import User , GroupV2 , MembershipV2 , AccessV2
1+ from Access .models import GroupAccessMapping , User , GroupV2 , MembershipV2 , AccessV2
22from Access import helpers , views_helper , notifications , accessrequest_helper
33from django .db import transaction
44import datetime
2424 "msg" : "Error Occured while loading the page. Please contact admin" ,
2525}
2626
27+ USER_UNAUTHORIZED_MESSAGE = "User unauthorised to perform the action."
28+ GROUP_ACCESS_MAPPING_NOT_FOUND = "Group Access Mapping not found in the database."
29+
2730NEW_GROUP_CREATE_ERROR_GROUP_EXISTS = {
2831 "error_msg" : "Invalid Group Name" ,
2932 "msg" : "A group with name {group_name} already exists. Please choose a new name." ,
@@ -745,6 +748,14 @@ def validate_group_access_create_request(group, auth_user):
745748 return None
746749
747750
751+ def revoke_user_access (user , access , revoker , decline_message ):
752+ user_identity = user .get_active_identity (access .access_tag )
753+ user_identity .decline_non_approved_access_mapping (access , decline_message )
754+ access_mapping = user_identity .get_granted_access_mapping (access ).first ()
755+ if not access_mapping :
756+ return False
757+ revoke_request (access_mapping , revoker )
758+
748759def remove_member (request ):
749760 try :
750761 membership_id = request .POST .get ("membershipId" )
@@ -763,7 +774,7 @@ def remove_member(request):
763774 ]
764775
765776 other_memberships_groups = (
766- user .get_all_memberships ()
777+ user .get_all_approved_memberships ()
767778 .exclude (group = membership .group )
768779 .values_list ("group" , flat = True )
769780 )
@@ -775,16 +786,59 @@ def remove_member(request):
775786
776787 accesses = list (set (group_accesses ) - set (other_group_accesses ))
777788
778- for access in accesses :
779- user_identity = user .get_active_identity (access .access_tag )
780- user_identity .decline_non_approved_access_mapping (access )
781- user_identity .offboarding_approved_access_mapping (access )
782- revoke_request (user_access_mapping = access , revoker = request .user .user )
789+ with transaction .atomic ():
790+ for access in accesses :
791+ revoke_user_access (user , access , request .user .user , "User removed from the group" )
783792
784793 membership .revoke_membership ()
785794
786795 return {"message" : "Successfully removed user from group" }
787796
797+ def access_exist_in_other_groups_of_user (membership , group , access ):
798+ other_memberships = (
799+ membership .user .get_all_approved_memberships ()
800+ .exclude (group = membership .group )
801+ )
802+ for membership in other_memberships :
803+ if membership .group .check_access_exist (access ):
804+ return True
805+
806+ return False
807+
808+
809+ def revoke_access_from_group (request ):
810+ try :
811+ request_id = request .POST .get ("request_id" )
812+ if not request_id :
813+ logger .debug ("Cannot find request_id in the http request." )
814+ return {"error" : ERROR_MESSAGE }
815+
816+ mapping = GroupAccessMapping .get_by_id (request_id )
817+ if not mapping :
818+ logger .debug ("Group Access Mapping not found in the database" )
819+ return {"error" : GROUP_ACCESS_MAPPING_NOT_FOUND }
820+ except Exception as e :
821+ logger .exception (str (e ))
822+ return {"error" : ERROR_MESSAGE }
823+
824+ group = mapping .group
825+ auth_user = request .user
826+ if not (auth_user .user .has_permission ("ALLOW_USER_OFFBOARD" ) or group .member_is_owner (auth_user .user )):
827+ return {"error" : USER_UNAUTHORIZED_MESSAGE }
828+
829+ revoke_access_memberships = []
830+ for membership in group .get_all_approved_members ():
831+ if access_exist_in_other_groups_of_user (membership , group , mapping .access ):
832+ continue
833+ revoke_access_memberships .append (membership )
834+
835+ with transaction .atomic ():
836+ for membership in revoke_access_memberships :
837+ revoke_user_access (membership .user , mapping .access , auth_user .user , "Access revoked for the group" )
838+
839+ mapping .mark_revoked (auth_user .user )
840+
841+ return {"message" : "Successfully initiated the revoke" }
788842
789843def get_selected_users_by_email (user_emails ):
790844 selected_users = User .get_users_by_emails (emails = user_emails )
0 commit comments