Skip to content

Commit 4ef73a4

Browse files
committed
fix: group flow for access requests
1 parent 7f78120 commit 4ef73a4

File tree

8 files changed

+91
-57
lines changed

8 files changed

+91
-57
lines changed

Access/access_modules/base_email_access/access.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,9 @@ def revoke(self, user, label):
174174
def get_extra_fields(self):
175175
return []
176176

177+
def can_auto_approve(self):
178+
return False
179+
177180
# return valid access label array which will be added in db or raise exception
178181
def validate_request(self, access_labels_data, request_user, is_group=False):
179182
valid_access_label_array = []

Access/accessrequest_helper.py

Lines changed: 41 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
User,
1717
GroupV2,
1818
AccessV2,
19+
MembershipV2,
1920
ApprovalType,
2021
)
2122
from Access.background_task_manager import background_task, accept_request
@@ -283,9 +284,11 @@ def get_pending_accesses_from_modules(access_user):
283284
process_group_requests(pending_accesses["group_requests"], group_requests)
284285

285286
logger.info(
286-
"Time to fetch pending requests of access module: %s - %s "
287-
% access_module_tag,
288-
str(time.time() - access_module_start_time),
287+
"Time to fetch pending requests of access module: %s - %s " %
288+
(
289+
access_module_tag,
290+
str(time.time() - access_module_start_time)
291+
),
289292
)
290293

291294
return individual_requests, list(group_requests.values())
@@ -382,7 +385,7 @@ def create_request(auth_user, access_request_form):
382385
for index1, access_type in enumerate(access_request["accessRequests"]):
383386
access_labels = validate_access_labels(
384387
access_labels_json=access_request["accessLabel"][index1],
385-
access_type=access_type,
388+
access_tag=access_type,
386389
)
387390
access_reason = access_request["accessReason"][index1]
388391

@@ -399,17 +402,16 @@ def create_request(auth_user, access_request_form):
399402
}
400403

401404
access_module = helper.get_available_access_modules()[access_type]
402-
module_access_labels = access_module.validate_request(
403-
access_labels, auth_user, is_group=False
404-
)
405-
406405
extra_field_labels = get_extra_field_labels(access_module)
407-
408406
if extra_fields and extra_field_labels:
409407
for field in extra_field_labels:
410-
module_access_labels[0][field] = extra_fields[0]
408+
access_labels[0][field] = extra_fields[0]
411409
extra_fields = extra_fields[1:]
412410

411+
module_access_labels = access_module.validate_request(
412+
access_labels, auth_user, is_group=False
413+
)
414+
413415
for index2, access_label in enumerate(module_access_labels):
414416
request_id = request_id + "_" + str(index2)
415417
access_create_error = _create_access(
@@ -511,7 +513,10 @@ def get_extra_field_labels(access_module):
511513
def get_extra_fields(access_request):
512514
if "extraFields" in access_request:
513515
return access_request["extraFields"]
514-
return []
516+
elif "extraFields[]" in access_request:
517+
return [access_request["extraFields[]"]]
518+
else:
519+
return []
515520

516521

517522
def _validate_access_request(access_request_form, user):
@@ -674,37 +679,49 @@ def run_accept_request_task(
674679

675680
def decline_individual_access(request, access_type, request_id, reason):
676681
json_response = {}
677-
access_mapping = UserAccessMapping.get_access_request(request_id)
682+
access_mapping = {}
683+
decline_new_group = False
684+
if access_type == "declineNewGroup":
685+
access_mapping = GroupV2.get_pending_group(request_id)
686+
decline_new_group = True
687+
else:
688+
access_mapping = UserAccessMapping.get_access_request(request_id)
689+
678690
if not is_request_valid(request_id, access_mapping):
679691
json_response["error"] = USER_REQUEST_IN_PROCESS_ERR_MSG.format(
680692
request_id=request_id,
681693
)
682694
return json_response
683695

684-
json_response = validate_approver_permissions(access_mapping, access_type, request)
685-
if "error" in json_response:
686-
return json_response
696+
if not decline_new_group:
697+
json_response = validate_approver_permissions(access_mapping, access_type, request)
698+
if "error" in json_response:
699+
return json_response
687700

688701
with transaction.atomic():
689702
access_mapping.decline_access(reason)
690703
if hasattr(access_mapping, "approver_1"):
691-
access_mapping.decline_reason = reason
692704
if access_mapping.approver_1 is not None:
693705
access_mapping.approver_2 = request.user.user
694706
else:
695707
access_mapping.approver_1 = request.user.user
696708
else:
697-
access_mapping.reason = reason
698-
access_mapping.approver = request.user.username
709+
access_mapping.approver = request.user.user
699710

700711
access_mapping.save()
701712

702-
access_module = helper.get_available_access_module_from_tag(access_type)
703-
access_labels = [access_mapping.access.access_label]
704-
description = access_module.combine_labels_desc(access_labels)
705-
notifications.send_mail_for_request_decline(
706-
request, description, request_id, reason, access_type
707-
)
713+
if not decline_new_group:
714+
access_module = helper.get_available_access_module_from_tag(access_type)
715+
access_labels = [access_mapping.access.access_label]
716+
description = access_module.combine_labels_desc(access_labels)
717+
notifications.send_mail_for_request_decline(
718+
request, description, request_id, reason, access_type
719+
)
720+
else:
721+
MembershipV2.update_membership(access_mapping, reason)
722+
notifications.send_mail_for_request_decline(
723+
request, "Group Creation", request_id, reason, access_type
724+
)
708725

709726
logger.debug(
710727
USER_REQUEST_DECLINE_MSG.format(

Access/group_helper.py

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242

4343
LIST_GROUP_ACCESSES_GROUP_DONT_EXIST_ERROR = {
4444
"error_msg": "Invalid Group Name",
45-
"msg": "A group with {group_name} doesn't exist.",
45+
"msg": "A group with name {group_name} doesn't exist.",
4646
}
4747

4848
NON_OWNER_PERMISSION_DENIED_ERROR = {
@@ -129,6 +129,7 @@ def create_group(request):
129129
requester=request.user.user,
130130
description=reason,
131131
needsAccessApprove=needs_access_approve,
132+
date_time=base_datetime_prefix,
132133
)
133134

134135
new_group.add_member(
@@ -183,7 +184,9 @@ def get_group_access_list(auth_user, group_name):
183184
context = {
184185
"error": {
185186
"error_msg": LIST_GROUP_ACCESSES_GROUP_DONT_EXIST_ERROR["error_msg"],
186-
"msg": LIST_GROUP_ACCESSES_GROUP_DONT_EXIST_ERROR["msg"],
187+
"msg": LIST_GROUP_ACCESSES_GROUP_DONT_EXIST_ERROR["msg"].format(
188+
group_name=group_name
189+
),
187190
}
188191
}
189192
return context
@@ -236,7 +239,9 @@ def update_owners(request, group_name):
236239
context = {
237240
"error": {
238241
"error_msg": LIST_GROUP_ACCESSES_GROUP_DONT_EXIST_ERROR["error_msg"],
239-
"msg": LIST_GROUP_ACCESSES_GROUP_DONT_EXIST_ERROR["msg"],
242+
"msg": LIST_GROUP_ACCESSES_GROUP_DONT_EXIST_ERROR["msg"].format(
243+
group_name=group_name
244+
),
240245
}
241246
}
242247
return context
@@ -441,8 +446,8 @@ def add_user_to_group(request):
441446
reason=data["memberReason"][0],
442447
date_time=base_datetime_prefix,
443448
)
449+
membership_id = membership.membership_id
444450
if not group.needsAccessApprove:
445-
membership_id = membership.membership_id
446451
context = {}
447452
context["accessStatus"] = {
448453
"msg": REQUEST_PROCESSING.format(requestId=membership_id),
@@ -609,6 +614,7 @@ def get_group_access(form_data, auth_user):
609614
)
610615
if validation_error:
611616
context["status"] = validation_error
617+
return context
612618

613619
access_module_list = data["accessList"]
614620
for module_value in access_module_list:
@@ -656,14 +662,15 @@ def save_group_access_request(form_data, auth_user):
656662
extra_fields = accessrequest_helper.get_extra_fields(access_request)
657663
extra_field_labels = accessrequest_helper.get_extra_field_labels(access_module)
658664

659-
module_access_labels = access_module.validate_request(
660-
access_labels, auth_user, is_group=False
661-
)
662665
if extra_fields and extra_field_labels:
663666
for field in extra_field_labels:
664-
module_access_labels[0][field] = extra_fields[0]
667+
access_labels[0][field] = extra_fields[0]
665668
extra_fields = extra_fields[1:]
666669

670+
module_access_labels = access_module.validate_request(
671+
access_labels, auth_user, is_group=False
672+
)
673+
667674
request_id = (
668675
auth_user.username
669676
+ "-"
@@ -697,15 +704,15 @@ def save_group_access_request(form_data, auth_user):
697704
"msg": "Access already exists" + json.dumps(access_label),
698705
}
699706
)
700-
email_destination = access_module.get_approvers()
701-
member_list = group.get_all_approved_members()
702-
notifications.send_group_access_add_email(
703-
destination=email_destination,
704-
group_name=group_name,
705-
requester=auth_user.user.email,
706-
request_id=request_id,
707-
member_list=member_list,
708-
)
707+
# email_destination = access_module.get_approvers()
708+
# member_list = group.get_all_approved_members()
709+
# notifications.send_group_access_add_email(
710+
# destination=email_destination,
711+
# group_name=group_name,
712+
# requester=auth_user.user.email,
713+
# request_id=request_id,
714+
# member_list=member_list,
715+
# )
709716
return context
710717

711718

@@ -731,7 +738,7 @@ def validate_group_access_create_request(group, auth_user):
731738
logger.exception("This Group is not yet approved")
732739
return {"title": "Permisison Denied", "msg": "This Group is not yet approved"}
733740

734-
if not (group.is_owner(auth_user.user) or auth_user.is_superuser):
741+
if not auth_user.user.is_allowed_admin_actions_on_group(group):
735742
logger.exception("Permission denied, you're not owner of this group")
736743
return {"title": "Permision Denied", "msg": "You're not owner of this group"}
737744
return None

Access/models.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,10 @@ def revoke_membership(self):
400400
self.status = "Revoked"
401401
self.save()
402402

403+
def update_membership(group, reason):
404+
membership = MembershipV2.objects.filter(group=group)
405+
membership.update(status="Declined", decline_reason=reason)
406+
403407
@staticmethod
404408
def get_membership(membership_id):
405409
try:
@@ -500,6 +504,14 @@ def add_members(self, users=None, requested_by=None, reason="", date_time=""):
500504
def getPendingMemberships():
501505
return MembershipV2.objects.filter(status="Pending", group__status="Approved")
502506

507+
def is_already_processed(self):
508+
return self.status in ['Declined','Approved','Processing','Revoked']
509+
510+
def decline_access(self, decline_reason=None):
511+
self.status = "Declined"
512+
self.decline_reason = decline_reason
513+
self.save()
514+
503515
@staticmethod
504516
def getPendingCreation():
505517
new_group_pending = GroupV2.objects.filter(status="Pending")
@@ -597,7 +609,9 @@ def unapprove_memberships(self):
597609

598610
def is_owner(self, user):
599611
return (
600-
self.membership_group.filter(is_owner=True).filter(user=user).first()
612+
self.membership_group.filter(is_owner=True)
613+
.filter(user=user)
614+
.first()
601615
is not None
602616
)
603617

Access/views.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,8 @@ def group_access(request):
232232
return render(request, "BSOps/accessStatus.html", context)
233233

234234
context = group_helper.get_group_access(request.GET, request.user)
235+
if "status" in context:
236+
return render(request, 'BSOps/accessStatus.html',context)
235237
return render(request, "BSOps/groupAccessRequestForm.html", context)
236238

237239

BrowserStackAutomation/settings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@
240240
'disable_existing_loggers': False,
241241
'formatters': {
242242
'verbose': {
243-
'format': "[cid: %(cid)s]:{\"meta\":{\"timestamp\":\"%(asctime)s.%(msecs)03dZ\",\"component\":\"django\",\"application\":\"enigma\",\"team\":\"core\"},\"log\":{\"kind\":\"ENIGMA_APP\",\"dynamic_data\":\"[%(name)s:%(funcName)s:%(lineno)s] --- %(message)s\",\"level\":\"%(levelname)s\"}}",
243+
'format': "{\"meta\":{\"timestamp\":\"%(asctime)s.%(msecs)03dZ\",\"component\":\"django\",\"application\":\"enigma\",\"team\":\"core\"},\"log\":{\"kind\":\"ENIGMA_APP\",\"dynamic_data\":\"[%(name)s:%(funcName)s:%(lineno)s] --- %(message)s\",\"level\":\"%(levelname)s\"}}",
244244
'datefmt': "%Y-%m-%dT%H:%M:%S"
245245
}
246246
},

BrowserStackAutomation/urls.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,27 +63,27 @@
6363
re_path(r"^access/requestAccess$", request_access, name="requestAccess"),
6464
re_path(r"^group/requestAccess$", group_access, name="groupRequestAccess"),
6565
re_path(
66-
r"^group/access/list/(?P<groupName>[\w -]+)$",
66+
r"^group/access/list/(?P<group_name>[\w -]+)$",
6767
group_access_list,
6868
name="groupAccessList",
6969
),
7070
re_path(
7171
r"^group/new/accept/(?P<requestId>.*)$", approve_new_group, name="approveNewGroup"
7272
),
7373
re_path(
74-
r"^group/adduser/(?P<groupName>[\w -]+)$",
74+
r"^group/adduser/(?P<group_name>[\w -]+)$",
7575
add_user_to_group,
7676
name="addUserToGroup",
7777
),
7878
re_path(
79-
r"^group/updateOwners/(?P<groupName>[\w -]+)$",
79+
r"^group/updateOwners/(?P<group_name>[\w -]+)$",
8080
update_group_owners,
8181
name="updateGroupOwners",
8282
),
8383
re_path(r"^access/pendingRequests$", pending_requests, name="pendingRequests"),
8484
re_path(r"^accept_bulk/(?P<selector>[\w-]+)", accept_bulk, name="accept_bulk"),
8585
re_path(
86-
r"^decline/(?P<accessType>[\w-]+)/(?P<requestId>.*)$",
86+
r"^decline/(?P<access_type>[\w-]+)/(?P<request_id>.*)$",
8787
decline_access,
8888
name="decline",
8989
),

templates/BSOps/pendingRequests.html

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -321,15 +321,6 @@
321321

322322
$(".bulkAcceptAll-checkbox").change(function () {
323323
let bulkCheckValue = $(this).prop('checked');
324-
// for ssh
325-
// sshCheckedAllOption = $("#dropdownMenuButton").text()
326-
327-
// if (sshCheckedAllOption === "Production") {
328-
// checkSSHCardWithTitle("prod", bulkCheckValue)
329-
// }
330-
// else if (sshCheckedAllOption === "Staging") {
331-
// checkSSHCardWithTitle("staging", bulkCheckValue)
332-
// }
333324

334325
let selector = $(this).val()
335326
$(`.${selector}`).each(function (idx, elem) {

0 commit comments

Comments
 (0)