Skip to content

Commit f7820b6

Browse files
feat: group access request - allow user to view new group access request form
User can create request to add access to a group. Added the form to capture the group access request
1 parent c7fc65a commit f7820b6

File tree

9 files changed

+400
-47
lines changed

9 files changed

+400
-47
lines changed

Access/accessrequest_helper.py

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,37 @@
4242
"msg": "User Identity for module {access_tag} not setup by the user",
4343
}
4444

45+
REQUEST_SUCCESS_MSG = {
46+
"title": "{request_id} Request Submitted",
47+
"msg": "Once approved you will receive the update. {access_label}",
48+
}
49+
REQUEST_DUPLICATE_ERR_MSG = {
50+
"title": "{access_tag}: Duplicate Request not submitted",
51+
"msg": "Access already granted or request in pending state. {access_label}",
52+
}
53+
REQUEST_ERR_MSG = {
54+
"error_msg": "Invalid Request",
55+
"msg": "Please Contact Admin",
56+
}
57+
REQUEST_EMPTY_FORM_ERR_MSG = {
58+
"error_msg": "The submitted form is empty. Tried direct access to reqeust access page",
59+
"msg": "Error Occured while submitting your Request. Please contact the Admin",
60+
}
61+
62+
REQUEST_ACCESS_AUTO_APPROVED_MSG = {
63+
"title": "{request_id} Request Approved",
64+
"msg": "Once granted you will receive the update",
65+
}
66+
67+
REQUEST_DB_ERR_MSG = {
68+
"error_msg": "Error Saving Request",
69+
"msg": "Please Contact Admin",
70+
}
71+
REQUEST_IDENTITY_NOT_SETUP_ERR_MSG = {
72+
"error_msg": "Identity not setup",
73+
"msg": "User Identity for module {access_tag} not setup by the user",
74+
}
75+
4576

4677
def requestAccessGet(request):
4778
context = {}
@@ -155,7 +186,10 @@ def get_pending_accesses_from_modules(access_user):
155186
group_requests = {}
156187

157188
logger.info("Start looping all access modules")
158-
for access_module_tag, access_module in helpers.get_available_access_modules().items():
189+
for (
190+
access_module_tag,
191+
access_module,
192+
) in helpers.get_available_access_modules().items():
159193
access_module_start_time = time.time()
160194

161195
try:
@@ -270,10 +304,10 @@ def create_request(auth_user, access_request_form):
270304
json_response = {}
271305
json_response["status"] = []
272306
json_response["status_list"] = []
273-
extra_fields = _get_extra_fields(access_request=access_request)
307+
extra_fields = get_extra_fields(access_request=access_request)
274308

275309
for index1, access_type in enumerate(access_request["accessRequests"]):
276-
access_labels = _validate_access_labels(
310+
access_labels = validate_access_labels(
277311
access_labels_json=access_request["accessLabel"][index1],
278312
access_type=access_type,
279313
)
@@ -296,7 +330,7 @@ def create_request(auth_user, access_request_form):
296330
access_labels, auth_user, is_group=False
297331
)
298332

299-
extra_field_labels = _get_extra_field_labels(access_module)
333+
extra_field_labels = get_extra_field_labels(access_module)
300334

301335
if extra_fields and extra_field_labels:
302336
for field in extra_field_labels:
@@ -395,14 +429,14 @@ def _create_access_mapping(
395429
return access
396430

397431

398-
def _get_extra_field_labels(access_module):
432+
def get_extra_field_labels(access_module):
399433
try:
400434
return access_module.get_extra_fields()
401435
except Exception:
402436
return []
403437

404438

405-
def _get_extra_fields(access_request):
439+
def get_extra_fields(access_request):
406440
if "extraFields" in access_request:
407441
return access_request["extraFields"]
408442
return []
@@ -430,7 +464,7 @@ def _validate_access_request(access_request_form, user):
430464
return {}, access_request
431465

432466

433-
def _validate_access_labels(access_labels_json, access_type):
467+
def validate_access_labels(access_labels_json, access_type):
434468
if access_labels_json is None or access_labels_json == "":
435469
raise Exception("No fields were selected in the request. Please try again.")
436470
access_labels = json.loads(access_labels_json)

Access/group_helper.py

Lines changed: 157 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,15 @@
1-
from Access.models import User, GroupV2, MembershipV2
2-
from Access import helpers, views_helper, notifications
1+
from Access.models import User, GroupV2, MembershipV2, AccessV2
2+
from Access import helpers, views_helper, notifications, accessrequest_helper
33
from django.db import transaction
44
import datetime
55
import logging
66
from bootprocess import general
77
from Access.views_helper import generateUserMappings, executeGroupAccess
8-
from BrowserStackAutomation.settings import (
9-
MAIL_APPROVER_GROUPS,
10-
PERMISSION_CONSTANTS,
11-
)
8+
from BrowserStackAutomation.settings import MAIL_APPROVER_GROUPS, PERMISSION_CONSTANTS
9+
from . import helpers as helper
1210
from Access.background_task_manager import background_task
1311
import json
1412

15-
1613
logger = logging.getLogger(__name__)
1714

1815
NEW_GROUP_CREATE_SUCCESS_MESSAGE = {
@@ -60,6 +57,12 @@
6057
}
6158

6259

60+
class GroupAccessExistsException(Exception):
61+
def __init__(self):
62+
self.message = "Group Access Exists"
63+
super().__init__(self.message)
64+
65+
6366
def create_group(request):
6467
base_datetime_prefix = datetime.datetime.utcnow().strftime("%Y%m%d%H%M%S")
6568
try:
@@ -134,7 +137,9 @@ def create_group(request):
134137

135138
def get_generic_access(group_mapping):
136139
access_details = {}
137-
access_module = helpers.get_available_access_module_from_tag(group_mapping.access.access_tag)
140+
access_module = helpers.get_available_access_module_from_tag(
141+
group_mapping.access.access_tag
142+
)
138143
if not access_module:
139144
return {}
140145

@@ -597,6 +602,150 @@ def accept_member(request, requestId, shouldRender=True):
597602
return context
598603

599604

605+
def get_group_access(form_data, auth_user):
606+
data = dict(form_data.lists())
607+
group_name = data["groupName"][0]
608+
context = {}
609+
context["accesses"] = []
610+
611+
group = GroupV2.get_active_group_by_name(group_name=group_name)
612+
validation_error = validate_group_access_create_request(
613+
group=group, auth_user=auth_user
614+
)
615+
if validation_error:
616+
context["status"] = validation_error
617+
618+
access_module_list = data["accessList"]
619+
for module_value in access_module_list:
620+
module = helper.get_available_access_modules()[module_value]
621+
try:
622+
extra_fields = module.get_extra_fields()
623+
except Exception:
624+
extra_fields = []
625+
626+
context["genericForm"] = True
627+
context["accesses"].append(
628+
{
629+
"formDesc": module.access_desc(),
630+
"accessTag": module.tag(),
631+
"accessTypes": module.access_types(),
632+
"accessRequestData": module.access_request_data(
633+
form_data, is_group=True
634+
),
635+
"extraFields": extra_fields,
636+
"accessRequestPath": module.fetch_access_request_form_path(),
637+
}
638+
)
639+
context["groupName"] = group_name
640+
return context
641+
642+
643+
def save_group_access_request(form_data, auth_user):
644+
access_request = dict(form_data.lists())
645+
group_name = access_request["groupName"][0]
646+
group = GroupV2.get_active_group_by_name(group_name=group_name)
647+
648+
context = {"status_list": []}
649+
validation_error = validate_group_access_create_request(
650+
group=group, auth_user=auth_user
651+
)
652+
if validation_error:
653+
context["status"] = validation_error
654+
655+
for accessIndex, access_type in enumerate(access_request["accessType"]):
656+
access_module = helper.get_available_access_modules()[access_type]
657+
access_labels = accessrequest_helper.validate_access_labels(
658+
access_labels_json=access_request["accessLabel"][accessIndex],
659+
access_type=access_type,
660+
)
661+
extra_fields = accessrequest_helper.get_extra_fields(access_request)
662+
extra_field_labels = accessrequest_helper.get_extra_field_labels(access_module)
663+
664+
module_access_labels = access_module.validate_request(
665+
access_labels, auth_user, is_group=False
666+
)
667+
if extra_fields and extra_field_labels:
668+
for field in extra_field_labels:
669+
module_access_labels[0][field] = extra_fields[0]
670+
extra_fields = extra_fields[1:]
671+
672+
request_id = (
673+
auth_user.username
674+
+ "-"
675+
+ access_type
676+
+ "-"
677+
+ datetime.datetime.utcnow().strftime("%Y%m%d%H%M%S")
678+
)
679+
with transaction.atomic():
680+
for labelIndex, access_label in enumerate(module_access_labels):
681+
request_id = request_id + "_" + str(labelIndex)
682+
try:
683+
_create_group_access_mapping(
684+
group=group,
685+
user=auth_user.user,
686+
request_id=request_id,
687+
access_type=access_type,
688+
access_label=access_label,
689+
access_reason=access_request["accessReason"],
690+
)
691+
context["status_list"].append(
692+
{
693+
"title": request_id + " Request Submitted",
694+
"msg": "Once approved you will receive the update "
695+
+ json.dumps(access_label),
696+
}
697+
)
698+
except GroupAccessExistsException:
699+
context["status_list"].append(
700+
{
701+
"title": request_id + " Request Submitted",
702+
"msg": "Once approved you will receive the update "
703+
+ json.dumps(access_label),
704+
}
705+
)
706+
email_destination = access_module.get_approvers()
707+
member_list = group.get_all_approved_members()
708+
notifications.send_group_access_add_email(
709+
destination=email_destination,
710+
group_name=group_name,
711+
requester=auth_user.user.email,
712+
request_id=request_id,
713+
member_list=member_list,
714+
)
715+
716+
return context
717+
718+
719+
def _create_group_access_mapping(
720+
group, user, request_id, access_type, access_label, access_reason
721+
):
722+
access = AccessV2.get(access_type=access_type, access_label=access_label)
723+
if not access:
724+
access = AccessV2.objects.create(
725+
access_tag=access_type, access_label=access_label
726+
)
727+
else:
728+
if group.check_access_exist(access):
729+
raise GroupAccessExistsException()
730+
group.add_access(
731+
request_id=request_id,
732+
requested_by=user,
733+
request_reason=access_reason,
734+
access=access,
735+
)
736+
737+
738+
def validate_group_access_create_request(group, auth_user):
739+
if not group:
740+
logger.exception("This Group is not yet approved")
741+
return {"title": "Permisison Denied", "msg": "This Group is not yet approved"}
742+
743+
if not (group.is_owner(auth_user.user) or auth_user.is_superuser):
744+
logger.exception("Permission denied, you're not owner of this group")
745+
return {"title": "Permision Denied", "msg": "You're not owner of this group"}
746+
return None
747+
748+
600749
def remove_member(request):
601750
try:
602751
membership_id = request.POST.get("membershipId")

0 commit comments

Comments
 (0)