Skip to content

Commit dc01fe3

Browse files
committed
feat: add resolve pendingFailures
1 parent c0731bb commit dc01fe3

11 files changed

+233
-85
lines changed

Diff for: Access/accessrequest_helper.py

+19-2
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@
7777
- {request_id} - Approver: {approver}"
7878
ERROR_DECLINING_REQUEST_LOG_MSG = "Error in Decline of request {request_id}. \
7979
Error:{error} .Please contact admin."
80+
ERROR_MARKING_RESOLVE_FAIL_LOG_MSG = "Error in resolving request {request_id}. \
81+
Error:{error} ."
8082

8183

8284
def get_request_access(request):
@@ -284,8 +286,7 @@ def get_pending_accesses_from_modules(access_user):
284286

285287
logger.info(
286288
"Time to fetch pending requests of access module: %s - %s "
287-
% access_module_tag,
288-
str(time.time() - access_module_start_time),
289+
% (access_module_tag, str(time.time() - access_module_start_time)),
289290
)
290291

291292
return individual_requests, list(group_requests.values())
@@ -878,6 +879,22 @@ def decline_group_access(request, request_id, reason):
878879
)
879880

880881

882+
def run_ignore_failure_task(auth_user, access_mapping, request_id, selector):
883+
try:
884+
if selector == "decline":
885+
access_mapping.decline_access()
886+
elif selector == "approve":
887+
access_mapping.approve_access()
888+
notifications.send_mail_for_request_resolve(auth_user, selector, request_id)
889+
except Exception as e:
890+
logger.exception(e)
891+
return create_error_response(
892+
error_msg=ERROR_MARKING_RESOLVE_FAIL_LOG_MSG.format(
893+
request_id=request_id, error=str(str(e))
894+
)
895+
)
896+
897+
881898
def create_error_response(error_msg):
882899
json_response = {}
883900
json_response["error"] = error_msg

Diff for: Access/admin.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
GroupV2,
1010
MembershipV2,
1111
GroupAccessMapping,
12-
UserIdentity
12+
UserIdentity,
1313
)
1414

1515

Diff for: Access/background_task_manager.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -60,15 +60,15 @@ def run_access_grant(request_id):
6060
user_access_mapping = UserAccessMapping.get_access_request(request_id=request_id)
6161
access_tag = user_access_mapping.access.access_tag
6262
user = user_access_mapping.user_identity.user
63-
approver = user_access_mapping.approver_1.user.username
63+
approver = user_access_mapping.approver_1.user
6464
message = ""
6565
if not user_access_mapping.user_identity.user.is_active():
6666
user_access_mapping.decline_access(decline_reason="User is not active")
6767
logger.debug(
6868
{
6969
"requestId": request_id,
7070
"status": "Declined",
71-
"by": approver,
71+
"by": approver.username,
7272
"response": message,
7373
}
7474
)
@@ -298,6 +298,7 @@ def run_accept_request(data):
298298

299299
return {"status": False}
300300

301+
301302
def accept_request(user_access_mapping):
302303
try:
303304
result = run_access_grant.delay(user_access_mapping.request_id)

Diff for: Access/group_helper.py

+1
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,7 @@ def add_user_to_group(request):
517517
}
518518
return context
519519

520+
520521
def _check_if_members_in_group(group, selected_members):
521522
group_members_email = group.get_approved_and_pending_member_emails()
522523
duplicate_request_emails = set(selected_members).intersection(

Diff for: Access/models.py

+2-7
Original file line numberDiff line numberDiff line change
@@ -169,14 +169,14 @@ def getPendingApprovalsCount(self, all_access_modules):
169169

170170
def getFailedGrantsCount(self):
171171
return (
172-
UserAccessMapping.objects.filter(status__in=["grantfailed"]).count()
172+
UserAccessMapping.objects.filter(status__in=["GrantFailed"]).count()
173173
if self.isAdminOrOps()
174174
else 0
175175
)
176176

177177
def getFailedRevokesCount(self):
178178
return (
179-
UserAccessMapping.objects.filter(status__in=["revokefailed"]).count()
179+
UserAccessMapping.objects.filter(status__in=["RevokeFailed"]).count()
180180
if self.isAdminOrOps()
181181
else 0
182182
)
@@ -558,7 +558,6 @@ def get_all_approved_members(self):
558558
group_members = self.get_all_members().filter(status="Approved")
559559
return group_members
560560

561-
562561
def get_approved_and_pending_member_emails(self):
563562
group_member_emails = self.membership_group.filter(
564563
status__in=["Approved", "Pending"]
@@ -863,10 +862,6 @@ def decline_access(self, decline_reason=None):
863862
def approve_access(self):
864863
self.status = "Approved"
865864
self.save()
866-
867-
@staticmethod
868-
def get_by_id(request_id):
869-
return UserAccessMapping.objects.get(request_id=request_id)
870865

871866
def revoking(self, revoker):
872867
self.revoker = revoker

Diff for: Access/notifications.py

+16-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
)
2424
USER_ACCESS_REQUEST_GRANT_FAILURE_SUBJECT = "[Enigma][Access Management] {} - {} - {} \
2525
Failed to Approve Request"
26+
USER_REQUEST_RESOLVE_SUBJECT = "[Enigma][Access Management] - Request Resolved - {}"
2627

2728

2829
def send_new_group_create_notification(auth_user, date_time, new_group, member_list):
@@ -70,11 +71,12 @@ def send_membership_accepted_notification(user, group, membership):
7071
destination.append(user.email)
7172
general.emailSES(destination, subject, body)
7273

74+
7375
def send_mulitple_membership_accepted_notification(user_names, group, membership):
7476
subject = MEMBERSHIP_ACCEPTED_SUBJECT.format(user_names, group.name)
7577
body = helpers.generateStringFromTemplate(
7678
filename="membershipAcceptedEmailBody.html",
77-
user_name= ",".join(user_names),
79+
user_name=",".join(user_names),
7880
group_name=group.name,
7981
approver=membership.approver.name,
8082
)
@@ -278,3 +280,16 @@ def send_decline_group_access_failed(destination, request_id, error):
278280
except Exception as e:
279281
logger.exception(str(e))
280282
logger.error("Something when wrong while sending Email.")
283+
284+
285+
def send_mail_for_request_resolve(auth_user, access_type, request_id):
286+
destination = [auth_user.email]
287+
subject = USER_REQUEST_RESOLVE_SUBJECT.format(request_id)
288+
body = helpers.generateStringFromTemplate(
289+
filename="requestResolvedEmail.html",
290+
user=auth_user.email,
291+
request_id=request_id,
292+
access_type=access_type,
293+
)
294+
general.emailSES(destination, subject, body)
295+
logger.debug("Email sent for " + subject + " to " + str(destination))

Diff for: Access/views.py

+114-11
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
get_decline_access_request,
2323
accept_group_access,
2424
run_accept_request_task,
25+
run_ignore_failure_task,
2526
)
2627
from Access.models import User, UserAccessMapping, GroupAccessMapping
2728

@@ -608,7 +609,9 @@ def mark_revoked(request):
608609
for mapping_object in requests:
609610
logger.info(
610611
"Marking access revoke - %s by user %s",
611-
mapping_object.request_id, request.user.user)
612+
mapping_object.request_id,
613+
request.user.user,
614+
)
612615
mapping_object.revoke(revoker=request.user.user)
613616
success_list.append(mapping_object.request_id)
614617
json_response["msg"] = "Success"
@@ -618,23 +621,123 @@ def mark_revoked(request):
618621
json_response["error"] = "Error Revoking User Access"
619622
return JsonResponse(json_response, status=403)
620623

624+
621625
def individual_resolve(request):
622-
json_response = {"status_list":[]}
626+
json_response = {"status_list": []}
623627
try:
624-
request_ids = request.GET.getlist('requestId')
628+
request_ids = request.GET.getlist("requestId")
625629
if not request_ids:
626630
raise Exception("Request id not found in the request")
627-
631+
628632
for request_id in request_ids:
629-
user_access_mapping = UserAccessMapping.get_by_id(request_id)
633+
user_access_mapping = UserAccessMapping.get_access_request(request_id)
630634
if user_access_mapping.status.lower() in ["grantfailed", "approved"]:
631-
response = run_accept_request_task(False, user_access_mapping, request.user, user_access_mapping.request_id, user_access_mapping.access.access_label)
635+
response = run_accept_request_task(
636+
False,
637+
user_access_mapping,
638+
request.user,
639+
user_access_mapping.request_id,
640+
user_access_mapping.access.access_label,
641+
)
632642
json_response["status_list"] += response["status"]
633643
else:
634-
json_response["status_list"].append({'title': 'The Request ('+request_id+') is already resolved.', 'msg': 'The request is already in final state.'})
635-
return render(request,'BSOps/accessStatus.html',json_response)
644+
json_response["status_list"].append(
645+
{
646+
"title": "The Request ("
647+
+ request_id
648+
+ ") is already resolved.",
649+
"msg": "The request is already in final state.",
650+
}
651+
)
652+
return render(request, "BSOps/accessStatus.html", json_response)
636653
except Exception as e:
637654
logger.exception(str(e))
638-
json_response['error'] = {'error_msg': "Bad request", 'msg': "Error in request not found OR Invalid request type"}
639-
return render(request,'BSOps/accessStatus.html',json_response)
640-
655+
json_response["error"] = {
656+
"error_msg": "Bad request",
657+
"msg": "Error in request not found OR Invalid request type",
658+
}
659+
return render(request, "BSOps/accessStatus.html", json_response)
660+
661+
662+
@login_required
663+
@user_with_permission([PERMISSION_CONSTANTS["DEFAULT_APPROVER_PERMISSION"]])
664+
def ignore_failure(request, selector):
665+
try:
666+
json_response = {"status_list": []}
667+
request_ids = request.GET.getlist("requestId")
668+
for request_id in request_ids:
669+
user_access_mapping = UserAccessMapping.get_access_request(request_id)
670+
if user_access_mapping.status.lower() in ["grantfailed", "revokefailed"]:
671+
run_ignore_failure_task(
672+
request.user,
673+
user_access_mapping,
674+
user_access_mapping.request_id,
675+
selector,
676+
)
677+
json_response["status_list"].append(
678+
{
679+
"title": "The Request ("
680+
+ request_id
681+
+ ") is now being ignored. Mark - "
682+
+ selector,
683+
"msg": "A email will be sent after the requested access is ignored",
684+
}
685+
)
686+
else:
687+
logger.debug("Cannot ignore " + request_id)
688+
json_response["status_list"].append(
689+
{
690+
"title": "The Request ("
691+
+ request_id
692+
+ ") is already resolved.",
693+
"msg": "The request is already in final state.",
694+
}
695+
)
696+
return render(request, "BSOps/accessStatus.html", json_response)
697+
except Exception as e:
698+
logger.debug("Error in request not found OR Invalid request type")
699+
logger.exception(e)
700+
json_response = {}
701+
json_response["error"] = {
702+
"error_msg": str(e),
703+
"msg": "Error in request not found OR Invalid request type",
704+
}
705+
return render(request, "BSOps/accessStatus.html", json_response)
706+
707+
708+
@login_required
709+
@user_with_permission([PERMISSION_CONSTANTS["DEFAULT_APPROVER_PERMISSION"]])
710+
def resolve_bulk(request):
711+
try:
712+
json_response = {"status_list": []}
713+
request_ids = request.GET.getlist("requestId")
714+
for request_id in request_ids:
715+
user_access_mapping = UserAccessMapping.get_access_request(request_id)
716+
if user_access_mapping.status.lower() in ["grantfailed"]:
717+
response = run_accept_request_task(
718+
False,
719+
user_access_mapping,
720+
request.user,
721+
user_access_mapping.request_id,
722+
user_access_mapping.access.access_label,
723+
)
724+
json_response["status_list"] += response["status"]
725+
else:
726+
json_response["status_list"].append(
727+
{
728+
"title": "The Request ("
729+
+ request_id
730+
+ ") is already resolved.",
731+
"msg": "The request is already in final state.",
732+
}
733+
)
734+
return render(request, "BSOps/accessStatus.html", json_response)
735+
except Exception as e:
736+
logger.debug("Error in request not found OR Invalid request type")
737+
logger.exception(e)
738+
json_response = {}
739+
json_response["error"] = {
740+
"error_msg": str(e),
741+
"msg": "Error in request not found OR Invalid request type",
742+
}
743+
return render(request, "BSOps/accessStatus.html", json_response)

0 commit comments

Comments
 (0)