Skip to content

Commit fbcd230

Browse files
authored
Merge pull request #95 from browserstack/enhancement-group-flow
Enhancement group flow
2 parents c0731bb + 447e2eb commit fbcd230

File tree

11 files changed

+125
-193
lines changed

11 files changed

+125
-193
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: 50 additions & 32 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
@@ -224,7 +225,7 @@ def get_decline_access_request(request, access_type, request_id):
224225
UserAccessMapping.get_pending_access_mapping(request_id=value)
225226
)
226227
request_ids.extend(current_ids)
227-
access_type = access_type.rsplit("-", 1)[0]
228+
access_type = "moduleAccess"
228229
elif access_type == "clubGroupAccess":
229230
for value in [request_id]: # ready for bulk decline
230231
return_ids.append(value)
@@ -238,6 +239,7 @@ def get_decline_access_request(request, access_type, request_id):
238239
access_type = "groupAccess"
239240
else:
240241
request_ids = [request_id]
242+
241243
for current_request_id in request_ids:
242244
if access_type == "groupAccess":
243245
response = decline_group_access(request, current_request_id, reason)
@@ -283,9 +285,11 @@ def get_pending_accesses_from_modules(access_user):
283285
process_group_requests(pending_accesses["group_requests"], group_requests)
284286

285287
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),
288+
"Time to fetch pending requests of access module: %s - %s " %
289+
(
290+
access_module_tag,
291+
str(time.time() - access_module_start_time)
292+
),
289293
)
290294

291295
return individual_requests, list(group_requests.values())
@@ -297,7 +301,7 @@ def process_individual_requests(
297301
if len(individual_pending_requests):
298302
clubbed_requests = {}
299303
for accessrequest in individual_pending_requests:
300-
club_id = accessrequest["requestId"].rsplit("_", 1)[0]
304+
club_id = accessrequest["requestId"].rsplit("_")[0]
301305
if club_id not in clubbed_requests:
302306
clubbed_requests[club_id] = {
303307
"club_id": club_id,
@@ -326,7 +330,7 @@ def process_group_requests(group_pending_requests, group_requests):
326330
club_id = (
327331
accessrequest["groupName"]
328332
+ "-"
329-
+ accessrequest["requestId"].rsplit("-", 1)[-1].rsplit("_", 1)[0]
333+
+ accessrequest["requestId"].rsplit("-", 1)[-1].rsplit("_")[0]
330334
)
331335
needs_access_approve = GroupV2.objects.get(
332336
name=accessrequest["groupName"], status="Approved"
@@ -382,7 +386,7 @@ def create_request(auth_user, access_request_form):
382386
for index1, access_type in enumerate(access_request["accessRequests"]):
383387
access_labels = validate_access_labels(
384388
access_labels_json=access_request["accessLabel"][index1],
385-
access_type=access_type,
389+
access_tag=access_type,
386390
)
387391
access_reason = access_request["accessReason"][index1]
388392

@@ -399,17 +403,16 @@ def create_request(auth_user, access_request_form):
399403
}
400404

401405
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-
406406
extra_field_labels = get_extra_field_labels(access_module)
407-
408407
if extra_fields and extra_field_labels:
409408
for field in extra_field_labels:
410-
module_access_labels[0][field] = extra_fields[0]
409+
access_labels[0][field] = extra_fields[0]
411410
extra_fields = extra_fields[1:]
412411

412+
module_access_labels = access_module.validate_request(
413+
access_labels, auth_user, is_group=False
414+
)
415+
413416
for index2, access_label in enumerate(module_access_labels):
414417
request_id = request_id + "_" + str(index2)
415418
access_create_error = _create_access(
@@ -511,7 +514,10 @@ def get_extra_field_labels(access_module):
511514
def get_extra_fields(access_request):
512515
if "extraFields" in access_request:
513516
return access_request["extraFields"]
514-
return []
517+
elif "extraFields[]" in access_request:
518+
return [access_request["extraFields[]"]]
519+
else:
520+
return []
515521

516522

517523
def _validate_access_request(access_request_form, user):
@@ -551,7 +557,6 @@ def validate_access_labels(access_labels_json, access_tag):
551557

552558
def _get_approver_permissions(access_tag, access_label=None):
553559
json_response = {}
554-
555560
access_module = helper.get_available_access_module_from_tag(access_tag)
556561
approver_permissions = []
557562
approver_permissions = access_module.fetch_approver_permissions(access_label)
@@ -583,9 +588,9 @@ def accept_user_access_requests(auth_user, request_id):
583588
)
584589
return json_response
585590

586-
requester = access_mapping.user_identity.user.email
587-
if auth_user.username == requester:
588-
json_response["error"] = USER_REQUEST_PERMISSION_DENIED_ERR_MSG
591+
requester = access_mapping.user_identity.user
592+
if auth_user.user == requester:
593+
json_response["error"] = SELF_APPROVAL_ERROR_MSG
589594
return json_response
590595

591596
access_label = access_mapping.access.access_label
@@ -674,37 +679,50 @@ 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+
access_type = access_mapping.access.access_tag
690+
678691
if not is_request_valid(request_id, access_mapping):
679692
json_response["error"] = USER_REQUEST_IN_PROCESS_ERR_MSG.format(
680693
request_id=request_id,
681694
)
682695
return json_response
683696

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

688702
with transaction.atomic():
689703
access_mapping.decline_access(reason)
690704
if hasattr(access_mapping, "approver_1"):
691-
access_mapping.decline_reason = reason
692705
if access_mapping.approver_1 is not None:
693706
access_mapping.approver_2 = request.user.user
694707
else:
695708
access_mapping.approver_1 = request.user.user
696709
else:
697-
access_mapping.reason = reason
698-
access_mapping.approver = request.user.username
710+
access_mapping.approver = request.user.user
699711

700712
access_mapping.save()
701713

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-
)
714+
if not decline_new_group:
715+
access_module = helper.get_available_access_module_from_tag(access_type)
716+
access_labels = [access_mapping.access.access_label]
717+
description = access_module.combine_labels_desc(access_labels)
718+
notifications.send_mail_for_request_decline(
719+
request, description, request_id, reason, access_type
720+
)
721+
else:
722+
MembershipV2.update_membership(access_mapping, reason)
723+
notifications.send_mail_for_request_decline(
724+
request, "Group Creation", request_id, reason, access_type
725+
)
708726

709727
logger.debug(
710728
USER_REQUEST_DECLINE_MSG.format(
@@ -821,7 +839,7 @@ def decline_group_access(request, request_id, reason):
821839
access_type = group_mapping.access.access_tag
822840

823841
json_response = validate_approver_permissions(
824-
group_mapping, access_type, request, request_id
842+
group_mapping, access_type, request
825843
)
826844
if "error" in json_response:
827845
return json_response

Access/background_task_manager.py

Lines changed: 2 additions & 2 deletions
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
)

Access/group_helper.py

Lines changed: 28 additions & 20 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),
@@ -485,10 +490,11 @@ def add_user_to_group(request):
485490
}
486491

487492
else:
493+
membership = MembershipV2.get_membership(membership_id=membership_id)
488494
notifications.send_mulitple_membership_accepted_notification(
489495
users_added,
490496
data["groupName"][0],
491-
data["memberReason"][0],
497+
membership,
492498
)
493499
if len(selected_users) - len(users_added) == 0:
494500
context = {}
@@ -609,6 +615,7 @@ def get_group_access(form_data, auth_user):
609615
)
610616
if validation_error:
611617
context["status"] = validation_error
618+
return context
612619

613620
access_module_list = data["accessList"]
614621
for module_value in access_module_list:
@@ -656,16 +663,17 @@ def save_group_access_request(form_data, auth_user):
656663
extra_fields = accessrequest_helper.get_extra_fields(access_request)
657664
extra_field_labels = accessrequest_helper.get_extra_field_labels(access_module)
658665

659-
module_access_labels = access_module.validate_request(
660-
access_labels, auth_user, is_group=False
661-
)
662666
if extra_fields and extra_field_labels:
663667
for field in extra_field_labels:
664-
module_access_labels[0][field] = extra_fields[0]
668+
access_labels[0][field] = extra_fields[0]
665669
extra_fields = extra_fields[1:]
666670

671+
module_access_labels = access_module.validate_request(
672+
access_labels, auth_user, is_group=False
673+
)
674+
667675
request_id = (
668-
auth_user.username
676+
group.name
669677
+ "-"
670678
+ access_tag
671679
+ "-"
@@ -697,15 +705,15 @@ def save_group_access_request(form_data, auth_user):
697705
"msg": "Access already exists" + json.dumps(access_label),
698706
}
699707
)
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-
)
708+
# email_destination = access_module.get_approvers()
709+
# member_list = group.get_all_approved_members()
710+
# notifications.send_group_access_add_email(
711+
# destination=email_destination,
712+
# group_name=group_name,
713+
# requester=auth_user.user.email,
714+
# request_id=request_id,
715+
# member_list=member_list,
716+
# )
709717
return context
710718

711719

@@ -731,7 +739,7 @@ def validate_group_access_create_request(group, auth_user):
731739
logger.exception("This Group is not yet approved")
732740
return {"title": "Permisison Denied", "msg": "This Group is not yet approved"}
733741

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

0 commit comments

Comments
 (0)