Exemple #1
0
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')
Exemple #2
0
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)
Exemple #3
0
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,
            })