Skip to content

Commit e5e1eec

Browse files
authored
feat: allow group owners and admins to list members and accesses of the group
Group owners and admins can list the members and accesses of the group. Group owners and admins can update the group's ownership to any member.
1 parent 4c6436e commit e5e1eec

File tree

9 files changed

+612
-75
lines changed

9 files changed

+612
-75
lines changed

Access/group_helper.py

Lines changed: 157 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from Access.models import User, GroupV2, MembershipV2, Role
1+
from Access.models import User, GroupV2, MembershipV2
22
from Access import helpers, views_helper, notifications
33
from django.db import transaction
44
import datetime
@@ -17,7 +17,7 @@
1717

1818
NEW_GROUP_CREATE_ERROR_MESSAGE = {
1919
"error_msg": "Internal Error",
20-
"msg": "Error Occured while load ing the page. Please contact admin",
20+
"msg": "Error Occured while loading the page. Please contact admin",
2121
}
2222

2323
NEW_GROUP_CREATE_ERROR_GROUP_EXISTS = {
@@ -26,12 +26,31 @@
2626
}
2727

2828
REQUEST_NOT_FOUND_ERROR = "Error request not found OR Invalid request type"
29-
SELF_APPROVAL_ERROR = "You cannot approve your own request. Please ask other admins to do that"
30-
GROUP_APPROVAL_ERROR = "Error Occured while Approving group creation. Please contact admin - "
29+
SELF_APPROVAL_ERROR = (
30+
"You cannot approve your own request. Please ask other admins to do that"
31+
)
32+
GROUP_APPROVAL_ERROR = (
33+
"Error Occured while Approving group creation. Please contact admin - "
34+
)
3135
APPROVAL_ERROR = "Error Occured while Approving the request. Please contact admin - "
3236
REQUEST_PROCESSING = "The Request {requestId} is now being processed"
3337
REQUEST_PROCESSED_BY = "The Request {requestId} is already Processed By : {user}"
3438

39+
LIST_GROUP_ACCESSES_GROUP_DONT_EXIST_ERROR = {
40+
"error_msg": "Invalid Group Name",
41+
"msg": "A group with {group_name} doesn't exist.",
42+
}
43+
44+
LIST_GROUP_ACCESSES_PERMISSION_DENIED = {
45+
"error_msg": "Permission Denied",
46+
"msg": "Permission denied, requester is non owner",
47+
}
48+
49+
UPDATE_OWNERS_REQUEST_ERROR = {
50+
"error_msg": "Bad request",
51+
"msg": "The requested URL is of POST method but was called with other.",
52+
}
53+
3554

3655
def create_group(request):
3756
base_datetime_prefix = datetime.datetime.utcnow().strftime("%Y%m%d%H%M%S")
@@ -84,8 +103,10 @@ def create_group(request):
84103

85104
if "selectedUserList" in data:
86105
initial_members = list(map(str, selected_users))
87-
new_group.add_members(users=User.objects.filter(email__in=initial_members),
88-
requested_by=request.user.user)
106+
new_group.add_members(
107+
users=User.objects.filter(email__in=initial_members),
108+
requested_by=request.user.user,
109+
)
89110
else:
90111
initial_members = [request.user.email]
91112

@@ -103,45 +124,125 @@ def create_group(request):
103124
return context
104125

105126

106-
def getGroupAccessList(request, groupName):
107-
return {}
127+
def get_generic_access(group_mapping):
128+
access_details = {}
129+
for each_access_module in helpers.getAvailableAccessModules():
130+
if group_mapping.access.access_tag == each_access_module.tag():
131+
access_details = group_mapping.getAccessRequestDetails(each_access_module)
132+
break
133+
134+
logger.debug("Generic access generated: " + str(access_details))
135+
return access_details
136+
137+
138+
def get_group_access_list(request, group_name):
139+
context = {}
140+
group = GroupV2.get_active_group_by_name(group_name)
141+
if not group:
142+
logger.debug(f"Group does not exist with group name {group_name}")
143+
context = {
144+
"error": {
145+
"error_msg": LIST_GROUP_ACCESSES_GROUP_DONT_EXIST_ERROR["error_msg"],
146+
"msg": LIST_GROUP_ACCESSES_GROUP_DONT_EXIST_ERROR["msg"],
147+
}
148+
}
149+
return context
150+
151+
group_members = group.get_all_members().filter(status="Approved")
152+
auth_user = request.user
153+
154+
if not auth_user.user.is_allowed_admin_actions_on_group(group):
155+
logger.debug("Permission denied, requester is non owner")
156+
context = {
157+
"error": {
158+
"error_msg": LIST_GROUP_ACCESSES_PERMISSION_DENIED["error_msg"],
159+
"msg": LIST_GROUP_ACCESSES_PERMISSION_DENIED["msg"],
160+
}
161+
}
162+
return context
163+
164+
group_members = [
165+
{
166+
"name": member.user.name,
167+
"email": member.user.email,
168+
"is_owner": member.is_owner,
169+
"current_state": member.user.current_state(),
170+
"membership_id": member.membership_id,
171+
}
172+
for member in group_members
173+
]
174+
context["userList"] = group_members
175+
context["groupName"] = group_name
176+
177+
allow_revoke = False
178+
if auth_user.user.is_allowed_to_offboard_user_from_group(group):
179+
allow_revoke = True
180+
context["allowRevoke"] = allow_revoke
181+
182+
group_mappings = group.get_active_accesses()
183+
context["genericAccesses"] = [
184+
get_generic_access(group_mapping) for group_mapping in group_mappings
185+
]
186+
if(context["genericAccesses"] == [{}]):
187+
context["genericAccesses"] = []
188+
189+
return context
190+
108191

192+
def update_owners(request, group_name):
193+
context = {}
194+
group = GroupV2.get_active_group_by_name(group_name)
195+
if not group:
196+
context = {
197+
"error": {
198+
"error_msg": LIST_GROUP_ACCESSES_GROUP_DONT_EXIST_ERROR["error_msg"],
199+
"msg": LIST_GROUP_ACCESSES_GROUP_DONT_EXIST_ERROR["msg"],
200+
}
201+
}
202+
return context
109203

110-
def updateOwner(request, group, context):
111204
logger.debug(
112205
"updating owners for group "
113206
+ group.name
114207
+ " requested by "
115208
+ request.user.username
116209
)
210+
if not request.POST:
211+
logger.debug("Update Owners POST request not found.")
212+
return {"error": UPDATE_OWNERS_REQUEST_ERROR}
213+
117214
data = request.POST
118215
data = dict(data.lists())
119-
120216
if "owners" not in data:
121217
data["owners"] = []
122-
destination = [request.user.user.email]
218+
219+
auth_user = request.user
220+
destination = [auth_user.user.email]
221+
222+
group_members = (
223+
group.get_all_members().filter(status="Approved").exclude(user=auth_user.user)
224+
)
123225

124226
# we will only get data["owners"] as owners who are checked in UI
125227
# (exluding disabled checkbox owner who requested the change)
126-
for membership_obj in MembershipV2.objects.filter(
127-
group=group, status="Approved"
128-
).exclude(user=request.user.user):
129-
if membership_obj.user.email in data["owners"]:
130-
membership_obj.is_owner = True
131-
destination.append(membership_obj.user.email)
132-
else:
133-
membership_obj.is_owner = False
134-
membership_obj.save()
228+
with transaction.atomic():
229+
for membership in group_members:
230+
if membership.user.email in data["owners"]:
231+
membership.is_owner = True
232+
destination.append(membership.user.email)
233+
else:
234+
membership.is_owner = False
235+
membership.save()
135236

136237
logger.debug("Owners changed to " + ", ".join(destination))
137-
subject = "Enigma Group '" + group.name + "' owners changed"
138-
body = "\nGroup Name :- {} \nupdated owners :- {} \nupdated by :- {}".format(
139-
group.name, ", ".join(destination), request.user.user.email
140-
)
141238
destination.extend(MAIL_APPROVER_GROUPS)
142-
general.emailSES(destination, subject, body)
239+
notifications.send_group_owners_update_mail(
240+
destination, group_name, auth_user.user.email
241+
)
143242
context["notification"] = "Owner's updated"
144243

244+
return context
245+
145246

146247
def isAllowedGroupAdminFunctions(request, groupMembers):
147248
ownersEmail = [member.user.email for member in groupMembers.filter(is_owner=True)]
@@ -206,12 +307,16 @@ def approve_new_group_request(request, group_id):
206307
initial_members = group.get_all_members()
207308
initial_member_names = [user.user.name for user in initial_members]
208309
try:
209-
notifications.send_new_group_approved_notification(group=group,
210-
group_id=group_id,
211-
initial_member_names=initial_member_names)
310+
notifications.send_new_group_approved_notification(
311+
group=group,
312+
group_id=group_id,
313+
initial_member_names=initial_member_names,
314+
)
212315
except Exception as e:
213316
logger.exception(e)
214-
logger.error("Group approved, but Error in sending group approval notification")
317+
logger.error(
318+
"Group approved, but Error in sending group approval notification"
319+
)
215320
logger.debug(
216321
"Approved group creation for - "
217322
+ group_id
@@ -230,10 +335,7 @@ def approve_new_group_request(request, group_id):
230335
logger.exception(e)
231336
logger.error("Error in Approving New Group request.")
232337
context = {}
233-
context["error"] = (
234-
GROUP_APPROVAL_ERROR
235-
+ str(e)
236-
)
338+
context["error"] = GROUP_APPROVAL_ERROR + str(e)
237339
return context
238340

239341

@@ -440,42 +542,52 @@ def accept_member(request, requestId, shouldRender=True):
440542
except Exception as e:
441543
logger.error("Error request not found OR Invalid request type")
442544
context = {}
443-
context['error'] = REQUEST_NOT_FOUND_ERROR + str(e)
545+
context["error"] = REQUEST_NOT_FOUND_ERROR + str(e)
444546
return context
445547
try:
446548
if membership.is_already_processed():
447-
logger.warning("An Already Approved/Declined/Processing Request was accessed by - "
448-
+ request.user.username)
549+
logger.warning(
550+
"An Already Approved/Declined/Processing Request was accessed by - "
551+
+ request.user.username
552+
)
449553
context = {}
450-
context['error'] = REQUEST_PROCESSED_BY.format(requestId=requestId,
451-
user=membership.approver.user.username)
554+
context["error"] = REQUEST_PROCESSED_BY.format(
555+
requestId=requestId, user=membership.approver.user.username
556+
)
452557
return context
453558
elif membership.is_self_approval(approver=request.user.user):
454559
context = {}
455560
context["error"] = SELF_APPROVAL_ERROR
456561
return context
457562
else:
458563
context = {}
459-
context['msg'] = REQUEST_PROCESSING.format(requestId=requestId)
564+
context["msg"] = REQUEST_PROCESSING.format(requestId=requestId)
460565
with transaction.atomic():
461566
membership.approve(request.user.user)
462567
group = membership.group
463568
user = membership.user
464-
userMappingsList = views_helper.generateUserMappings(user, group, membership)
569+
userMappingsList = views_helper.generateUserMappings(
570+
user, group, membership
571+
)
465572

466573
# TODO: Add celery task for executeGroupAccess
467574
# accessAcceptThread = threading.Thread(target=executeGroupAccess,
468575
# args=(request, group.name, userMappingsList))
469576
# accessAcceptThread.start()
470577

471-
notifications.send_membership_accepted_notification(user=user,
472-
group=group, membership=membership)
473-
logger.debug("Process has been started for the Approval of request - "
474-
+ requestId + " - Approver=" + request.user.username)
578+
notifications.send_membership_accepted_notification(
579+
user=user, group=group, membership=membership
580+
)
581+
logger.debug(
582+
"Process has been started for the Approval of request - "
583+
+ requestId
584+
+ " - Approver="
585+
+ request.user.username
586+
)
475587
return context
476588
except Exception as e:
477589
logger.exception(e)
478590
logger.error("Error in Accept of New Member in Group request.")
479591
context = {}
480-
context['error'] = APPROVAL_ERROR + str(e)
592+
context["error"] = APPROVAL_ERROR + str(e)
481593
return context

0 commit comments

Comments
 (0)