|
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 |
3 | 3 | from django.db import transaction |
4 | 4 | import datetime |
5 | 5 | import logging |
6 | 6 | from bootprocess import general |
7 | 7 | 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 |
12 | 10 | from Access.background_task_manager import background_task |
13 | 11 | import json |
14 | 12 |
|
15 | | - |
16 | 13 | logger = logging.getLogger(__name__) |
17 | 14 |
|
18 | 15 | NEW_GROUP_CREATE_SUCCESS_MESSAGE = { |
|
60 | 57 | } |
61 | 58 |
|
62 | 59 |
|
| 60 | +class GroupAccessExistsException(Exception): |
| 61 | + def __init__(self): |
| 62 | + self.message = "Group Access Exists" |
| 63 | + super().__init__(self.message) |
| 64 | + |
| 65 | + |
63 | 66 | def create_group(request): |
64 | 67 | base_datetime_prefix = datetime.datetime.utcnow().strftime("%Y%m%d%H%M%S") |
65 | 68 | try: |
@@ -134,7 +137,9 @@ def create_group(request): |
134 | 137 |
|
135 | 138 | def get_generic_access(group_mapping): |
136 | 139 | 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 | + ) |
138 | 143 | if not access_module: |
139 | 144 | return {} |
140 | 145 |
|
@@ -597,6 +602,150 @@ def accept_member(request, requestId, shouldRender=True): |
597 | 602 | return context |
598 | 603 |
|
599 | 604 |
|
| 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 | + |
600 | 749 | def remove_member(request): |
601 | 750 | try: |
602 | 751 | membership_id = request.POST.get("membershipId") |
|
0 commit comments