def project_members_action(request, chain_id, action=None, redirect_to=''): actions_map = { 'remove': _project_remove_member, 'accept': _project_accept_member, 'reject': _project_reject_member } if not action in actions_map.keys(): raise PermissionDenied member_ids = request.POST.getlist('members') project, application = get_by_chain_or_404(chain_id) user = request.user if not user.owns_project(project) and not user.is_project_admin(): return redirect(reverse('index')) logger.info("Batch members action from %s (chain: %r, action: %s, " "members: %r)", user.log_display, chain_id, action, member_ids) action_func = actions_map.get(action) for member_id in member_ids: member_id = int(member_id) with ExceptionHandler(request): action_func(request, chain_id, member_id) return redirect_back(request, 'project_list')
def project_members(request, chain_id, members_status_filter=None, template_name='im/projects/project_members.html'): project, application = get_by_chain_or_404(chain_id) user = request.user if not user.owns_project(project) and not user.is_project_admin(): return redirect(reverse('index')) return common_detail(request, chain_id, members_status_filter=members_status_filter, template_name=template_name)
def common_detail(request, chain_or_app_id, project_view=True, template_name='im/projects/project_detail.html', members_status_filter=None): project = None approved_members_count = 0 pending_members_count = 0 remaining_memberships_count = None if project_view: chain_id = chain_or_app_id if request.method == 'POST': addmembers_form = AddProjectMembersForm( request.POST, chain_id=int(chain_id), request_user=request.user) with ExceptionHandler(request): addmembers(request, chain_id, addmembers_form) if addmembers_form.is_valid(): addmembers_form = AddProjectMembersForm() # clear form data else: addmembers_form = AddProjectMembersForm() # initialize form project, application = get_by_chain_or_404(chain_id) if project: members = project.projectmembership_set approved_members_count = project.members_count() pending_members_count = project.count_pending_memberships() _limit = application.limit_on_members_number if _limit is not None: remaining_memberships_count = \ max(0, _limit - approved_members_count) flt = MEMBERSHIP_STATUS_FILTER.get(members_status_filter) if flt is not None: members = flt(members) members = members.select_related() members_table = tables.ProjectMembersTable(project, members, user=request.user, prefix="members_") RequestConfig(request, paginate={"per_page": settings.PAGINATE_BY} ).configure(members_table) else: members_table = None else: # is application application_id = chain_or_app_id application = get_object_or_404(ProjectApplication, pk=application_id) members_table = None addmembers_form = None modifications_table = None user = request.user is_project_admin = user.is_project_admin(application_id=application.id) is_owner = user.owns_application(application) if not (is_owner or is_project_admin) and not project_view: m = _(astakos_messages.NOT_ALLOWED) raise PermissionDenied(m) if (not (is_owner or is_project_admin) and project_view and not user.non_owner_can_view(project)): m = _(astakos_messages.NOT_ALLOWED) raise PermissionDenied(m) following_applications = list(application.pending_modifications()) following_applications.reverse() modifications_table = ( tables.ProjectModificationApplicationsTable(following_applications, user=request.user, prefix="modifications_")) mem_display = user.membership_display(project) if project else None can_join_req = can_join_request(project, user) if project else False can_leave_req = can_leave_request(project, user) if project else False return object_detail( request, queryset=ProjectApplication.objects.select_related(), object_id=application.id, template_name=template_name, extra_context={ 'project_view': project_view, 'chain_id': chain_or_app_id, 'application': application, 'addmembers_form': addmembers_form, 'approved_members_count': approved_members_count, 'pending_members_count': pending_members_count, 'members_table': members_table, 'owner_mode': is_owner, 'admin_mode': is_project_admin, 'modifications_table': modifications_table, 'mem_display': mem_display, 'can_join_request': can_join_req, 'can_leave_request': can_leave_req, 'members_status_filter':members_status_filter, 'remaining_memberships_count': remaining_memberships_count, })