Skip to content

Commit 53e594a

Browse files
committed
Merge branch 'main' into feat-group-mark-revoked
2 parents 891d4af + 6a9b19f commit 53e594a

File tree

5 files changed

+112
-29
lines changed

5 files changed

+112
-29
lines changed

Access/models.py

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,20 @@ def get_accesses_by_access_tag_and_status(self, access_tag, status):
251251
access__access_tag=access_tag,
252252
status__in=status)
253253

254+
def update_revoker(self, revoker):
255+
self.revoker = revoker
256+
self.save()
257+
258+
def offboard(self, revoker):
259+
self.change_state("offboarding")
260+
self.update_revoker(revoker)
261+
self.offbaord_date = datetime.datetime.now()
262+
self.user.is_active = False
263+
self.save()
264+
265+
def revoke_all_memberships(self):
266+
self.membership_user.filter(status__in=["Pending", "Approved"]).update(status="Revoked")
267+
254268
def __str__(self):
255269
return "%s" % (self.user)
256270

@@ -345,7 +359,7 @@ def revoke_membership(self):
345359
@staticmethod
346360
def get_membership(membership_id):
347361
return MembershipV2.objects.get(membership_id=membership_id)
348-
362+
349363
def __str__(self):
350364
return self.group.name + "-" + self.user.email + "-" + self.status
351365

@@ -884,13 +898,23 @@ class Meta:
884898
)
885899

886900
def deactivate(self):
887-
self.status = 0
901+
self.status = "Inactive"
888902
self.save()
889903

890904
def get_active_access_mapping(self):
891905
return self.user_access_mapping.filter(
892906
status__in=["Approved", "Pending"], access__access_tag=self.access_tag
893907
)
908+
909+
def get_all_granted_access_mappings(self):
910+
return self.user_access_mapping.filter(status__in=["Approved", "Processing", "Offboarding"], access__access_tag=self.access_tag)
911+
912+
def get_all_non_approved_access_mappings(self):
913+
return self.user_access_mapping.filter(status__in=[ 'approvefailed', 'pending', 'secondarypending', 'grantfailed' ], access__access_tag=self.access_tag)
914+
915+
def decline_all_non_approved_access_mappings(self):
916+
user_mapping = self.get_all_non_approved_access_mappings()
917+
user_mapping.update(status="Declined")
894918

895919
def get_granted_access_mapping(self, access):
896920
return self.user_access_mapping.filter(

Access/userlist_helper.py

Lines changed: 59 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
import json
12
from Access import helpers
2-
from Access.models import User
3+
from Access.background_task_manager import background_task
4+
from Access.models import MembershipV2, User
35
import logging
46
from . import helpers as helper
57
from django.db import transaction
@@ -41,25 +43,25 @@ def get_identity_templates(auth_user):
4143
context["configured_identity_template"] = []
4244
context["unconfigured_identity_template"] = []
4345
all_modules = helper.get_available_access_modules()
44-
# for user_identity in user_identities:
45-
# is_identity_configured = _is_valid_identity_json(identity=user_identity.identity)
46-
# if is_identity_configured:
47-
# module = all_modules[user_identity.access_tag]
48-
# context["configured_identity_template"].append(
49-
# {
50-
# "accessUserTemplatePath": module.get_identity_template(),
51-
# "identity" : user_identity.identity
52-
# }
53-
# )
54-
# all_modules.pop(user_identity.access_tag)
46+
for user_identity in user_identities:
47+
is_identity_configured = _is_valid_identity_json(identity=user_identity.identity)
48+
if is_identity_configured:
49+
module = all_modules[user_identity.access_tag]
50+
context["configured_identity_template"].append(
51+
{
52+
"accessUserTemplatePath": module.get_identity_template(),
53+
"identity" : user_identity.identity
54+
}
55+
)
56+
all_modules.pop(user_identity.access_tag)
5557

56-
# for mod in all_modules.values():
57-
# context["unconfigured_identity_template"].append(
58-
# {
59-
# "accessUserTemplatePath": mod.get_identity_template(),
60-
# }
61-
# )
62-
# context["aws_username"] = "some name"
58+
for mod in all_modules.values():
59+
context["unconfigured_identity_template"].append(
60+
{
61+
"accessUserTemplatePath": mod.get_identity_template(),
62+
}
63+
)
64+
context["aws_username"] = "some name"
6365
return context
6466

6567
def _is_valid_identity_json(identity):
@@ -166,7 +168,7 @@ def getallUserList(request):
166168
"last_name": each_user.user.last_name,
167169
"email": each_user.email,
168170
"username": each_user.user.username,
169-
"git_username": each_user.gitusername,
171+
# "git_username": each_user.gitusername,
170172
"is_active": each_user.user.is_active,
171173
"offbaord_date": each_user.offbaord_date,
172174
"state": each_user.current_state(),
@@ -185,3 +187,40 @@ def getallUserList(request):
185187
json_response = {}
186188
json_response["error"] = {"error_msg": str(e), "msg": ERROR_MESSAGE}
187189
return json_response
190+
191+
192+
def offboard_user(request):
193+
if not (request.user.user.has_permission("VIEW_USER_LIST") and request.user.user.has_permission("ALLOW_USER_OFFBOARD")):
194+
raise Exception("Requested User is unauthorised to offboard user.")
195+
try:
196+
offboard_user_email = request.POST.get("offboard_email")
197+
if not offboard_user_email:
198+
raise Exception("Invalid request, attribute not found")
199+
200+
user = User.objects.filter(email=offboard_user_email).first()
201+
if not user:
202+
raise Exception("User not found")
203+
204+
except Exception as e:
205+
logger.debug("Error in request, not found or Invalid request type")
206+
logger.exception(str(e))
207+
return {"error": ERROR_MESSAGE}
208+
209+
user.offboard(request.user.user)
210+
211+
module_identities = user.get_all_active_identity()
212+
213+
for module_identity in module_identities:
214+
module_identity.decline_all_non_approved_access_mappings()
215+
access_mappings = module_identity.get_all_granted_access_mappings()
216+
217+
for access_mapping in access_mappings:
218+
module_identity.offboarding_approved_access_mapping(access_mapping.access)
219+
background_task("run_access_revoke", json.dumps({"request_id": access_mapping.request_id, "revoker_email": request.user.user.email}))
220+
221+
module_identity.deactivate()
222+
223+
user.revoke_all_memberships()
224+
225+
return {"message": "Successfully initiated Offboard user"}
226+

Access/views.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,15 @@
2222
create_request,
2323
)
2424
from Access.models import User
25-
from Access.userlist_helper import getallUserList, get_identity_templates, create_identity, NEW_IDENTITY_CREATE_ERROR_MESSAGE, IDENTITY_UNCHANGED_ERROR_MESSAGE, IdentityNotChangedException
25+
from Access.userlist_helper import (
26+
getallUserList,
27+
get_identity_templates,
28+
create_identity,
29+
offboard_user,
30+
NEW_IDENTITY_CREATE_ERROR_MESSAGE,
31+
IDENTITY_UNCHANGED_ERROR_MESSAGE,
32+
IdentityNotChangedException
33+
)
2634
from Access.views_helper import render_error_message
2735
from BrowserStackAutomation.settings import PERMISSION_CONSTANTS
2836

@@ -141,6 +149,16 @@ def allUsersList(request):
141149
return render(request, "BSOps/allUsersList.html", context)
142150

143151

152+
def user_offboarding(request):
153+
try:
154+
response = offboard_user(request)
155+
if "error" in response:
156+
return JsonResponse(response, status=400)
157+
return JsonResponse(response)
158+
except Exception as e:
159+
logger.exception(str(e))
160+
return JsonResponse({"error": "Failed to offboard User"})
161+
144162
@login_required
145163
def requestAccess(request):
146164
if request.POST:

BrowserStackAutomation/urls.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from django.urls import re_path, include
2020
from Access.views import (
2121
revoke_group_access,
22+
user_offboarding,
2223
showAccessHistory,
2324
pendingRequests,
2425
pendingFailure,
@@ -39,7 +40,7 @@
3940
update_group_owners,
4041
remove_group_member,
4142
)
42-
# from Access.helpers import getAvailableAccessModules
43+
from Access.helpers import get_available_access_modules
4344

4445
urlpatterns = [
4546
re_path(r"^admin/", admin.site.urls),
@@ -58,6 +59,7 @@
5859
re_path(r"^group/dashboard/$", groupDashboard, name="groupDashboard"),
5960
re_path(r"^access/userAccesses$", all_user_access_list, name="allUserAccessList"),
6061
re_path(r"^access/usersList$", allUsersList, name="allUsersList"),
62+
re_path(r"^user/offboardUser$", user_offboarding, name="offboarding_user"),
6163
re_path(r"^access/requestAccess$", requestAccess, name="requestAccess"),
6264
re_path(r"^group/requestAccess$", group_access, name="groupRequestAccess"),
6365
re_path(
@@ -85,5 +87,5 @@
8587
re_path(r"^group/revokeAccess", revoke_group_access, name="revoke_group_access")
8688
]
8789

88-
# for each_module in getAvailableAccessModules():
89-
# urlpatterns.extend(each_module.urlpatterns)
90+
for tag, each_module in get_available_access_modules().items():
91+
urlpatterns.extend(each_module.urlpatterns)

templates/BSOps/allUsersList.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
message_text_div.append("Offboarding user with email " + offboard_email + ". Please wait");
4949
$('#alert-space').html(custom_alert);
5050

51-
$.ajax("{% url 'allUsersList' %}", {
51+
$.ajax("{% url 'offboarding_user' %}", {
5252
type: "POST",
5353
data: { "offboard_email": offboard_email, 'csrfmiddlewaretoken': '{{ csrf_token }}' },
5454
success: function(data) {
@@ -175,7 +175,7 @@ <h4 class="modal-title"></h4>
175175
<tr>
176176
<th data-placeholder="Search">Name</th>
177177
<th data-placeholder="Search">Email</th>
178-
<th data-placeholder="Search">Github Username</th>
178+
<!-- <th data-placeholder="Search">Github Username</th> -->
179179
<th class="filter-select filter-exact" data-placeholder="ALL">Is Active</th>
180180
<th class="filter-select filter-exact" data-placeholder="ALL">Current State</th>
181181
<th data-placeholder="Search">Accesses List</th>
@@ -210,7 +210,7 @@ <h4 class="modal-title"></h4>
210210
<tr class="userList">
211211
<td>{{ item.first_name }} {{ item.last_name }}</td>
212212
<td>{{ item.email }}</td>
213-
<td>{{ item.git_username }}</td>
213+
<!-- <td>{{ item.git_username }}</td> -->
214214
<td>{{ item.is_active }}</td>
215215
<td>{{ item.state }}</td>
216216
<td>

0 commit comments

Comments
 (0)