Example #1
0
def project_app_approve(request, project_uuid, application_id):
    with ExceptionHandler(request):
        with transaction.commit_on_success():
            approve_application(application_id, project_uuid,
                                request_user=request.user)
            messages.success(request, _(astakos_messages.APPLICATION_APPROVED))
    return redirect(reverse('project_detail', args=(project_uuid,)))
Example #2
0
def project_app_approve(request, project_uuid, application_id):
    with ExceptionHandler(request):
        with transaction.commit_on_success():
            approve_application(application_id, project_uuid,
                                request_user=request.user)
            messages.success(request, _(astakos_messages.APPLICATION_APPROVED))
    return redirect(reverse('project_detail', args=(project_uuid,)))
Example #3
0
def project_app_dismiss(request, project_uuid, application_id):
    with ExceptionHandler(request):
        with transaction.commit_on_success():
            dismiss_application(application_id, project_uuid,
                                request_user=request.user)
            messages.success(request,
                             _(astakos_messages.APPLICATION_DISMISSED))
    return redirect(reverse("project_list"))
Example #4
0
def project_app_deny(request, project_uuid, application_id):
    with ExceptionHandler(request):
        reason = request.POST.get("reason", "")
        with transaction.commit_on_success():
            deny_application(application_id, project_uuid,
                             request_user=request.user, reason=reason)
            messages.success(request, _(astakos_messages.APPLICATION_DENIED))
    return redirect(reverse("project_list"))
Example #5
0
def project_app_cancel(request, project_uuid, application_id):
    with ExceptionHandler(request):
        with transaction.commit_on_success():
            cancel_application(application_id, project_uuid,
                               request_user=request.user)
            messages.success(request,
                             _(astakos_messages.APPLICATION_CANCELLED))
    return redirect(reverse('project_list'))
Example #6
0
def project_app_deny(request, project_uuid, application_id):
    with ExceptionHandler(request):
        reason = request.POST.get("reason", "")
        with transaction.commit_on_success():
            deny_application(application_id, project_uuid,
                             request_user=request.user, reason=reason)
            messages.success(request, _(astakos_messages.APPLICATION_DENIED))
    return redirect(reverse("project_list"))
Example #7
0
def project_app_dismiss(request, project_uuid, application_id):
    with ExceptionHandler(request):
        with transaction.commit_on_success():
            dismiss_application(application_id, project_uuid,
                                request_user=request.user)
            messages.success(request,
                             _(astakos_messages.APPLICATION_DISMISSED))
    return redirect(reverse("project_list"))
Example #8
0
def project_app_cancel(request, project_uuid, application_id):
    with ExceptionHandler(request):
        with transaction.commit_on_success():
            cancel_application(application_id, project_uuid,
                               request_user=request.user)
            messages.success(request,
                             _(astakos_messages.APPLICATION_CANCELLED))
    return redirect(reverse('project_list'))
Example #9
0
def project_members_action(request,
                           project_uuid,
                           action=None,
                           redirect_to='',
                           memb_id=None):

    actions_map = {
        'remove': {
            'method': 'remove_membership',
            'msg': _(astakos_messages.USER_MEMBERSHIP_REMOVED)
        },
        'accept': {
            'method': 'accept_membership',
            'msg': _(astakos_messages.USER_MEMBERSHIP_ACCEPTED)
        },
        'reject': {
            'method': 'reject_membership',
            'msg': _(astakos_messages.USER_MEMBERSHIP_REJECTED)
        }
    }

    if not action in actions_map.keys():
        raise PermissionDenied

    if memb_id:
        member_ids = [memb_id]
    else:
        member_ids = request.POST.getlist('members')

    project = get_object_or_404(Project, uuid=project_uuid)

    user = request.user
    if not user.owns_project(project) and not user.is_project_admin():
        messages.error(request, astakos_messages.NOT_ALLOWED)
        return redirect(reverse('index'))

    logger.info(
        "Member(s) action from %s (project: %r, action: %s, "
        "members: %r)", user.log_display, project.uuid, action, member_ids)

    action = actions_map.get(action)
    action_func = getattr(project_actions, action.get('method'))
    for member_id in member_ids:
        member_id = int(member_id)
        with ExceptionHandler(request):
            with transaction.commit_on_success():
                try:
                    m = action_func(member_id, request.user)
                except ProjectError as e:
                    messages.error(request, e)
                else:
                    email = escape(m.person.email)
                    msg = action.get('msg') % email
                    messages.success(request, msg)

    return redirect_back(request, 'project_list')
Example #10
0
def project_cancel_join(request, project_uuid):
    project = get_object_or_404(Project, uuid=project_uuid)
    with ExceptionHandler(request):
        with transaction.commit_on_success():
            project = get_object_or_404(Project, uuid=project_uuid)
            memb_id = request.user.get_membership(project).pk
            cancel_membership(memb_id, request.user)
            m = _(astakos_messages.USER_REQUEST_CANCELLED)
            messages.success(request, m)
    return redirect_to_next(request, 'project_detail', args=(project.uuid, ))
Example #11
0
def project_cancel_join(request, project_uuid):
    project = get_object_or_404(Project, uuid=project_uuid)
    with ExceptionHandler(request):
        with transaction.commit_on_success():
            project = get_object_or_404(Project, uuid=project_uuid)
            memb_id = request.user.get_membership(project).pk
            cancel_membership(memb_id, request.user)
            m = _(astakos_messages.USER_REQUEST_CANCELLED)
            messages.success(request, m)
    return redirect_to_next(request, 'project_detail', args=(project.uuid,))
Example #12
0
def project_join(request, project_uuid):
    project = get_object_or_404(Project, uuid=project_uuid)
    with ExceptionHandler(request):
        with transaction.commit_on_success():
            membership = join_project(project_uuid, request.user)
            if membership.state != membership.REQUESTED:
                m = _(astakos_messages.USER_JOINED_PROJECT)
            else:
                m = _(astakos_messages.USER_JOIN_REQUEST_SUBMITTED)
            messages.success(request, m)
    return redirect_to_next(request, 'project_detail', args=(project.uuid, ))
Example #13
0
def project_join(request, project_uuid):
    project = get_object_or_404(Project, uuid=project_uuid)
    with ExceptionHandler(request):
        with transaction.commit_on_success():
            membership = join_project(project_uuid, request.user)
            if membership.state != membership.REQUESTED:
                m = _(astakos_messages.USER_JOINED_PROJECT)
            else:
                m = _(astakos_messages.USER_JOIN_REQUEST_SUBMITTED)
            messages.success(request, m)
    return redirect_to_next(request, 'project_detail', args=(project.uuid,))
Example #14
0
def project_leave(request, project_uuid):
    project = get_object_or_404(Project, uuid=project_uuid)
    with ExceptionHandler(request):
        with transaction.commit_on_success():
            memb_id = request.user.get_membership(project).pk
            auto_accepted = leave_project(memb_id, request.user)
            if auto_accepted:
                m = _(astakos_messages.USER_LEFT_PROJECT)
            else:
                m = _(astakos_messages.USER_LEAVE_REQUEST_SUBMITTED)
            messages.success(request, m)
    return redirect_to_next(request, 'project_detail', args=(project.uuid, ))
Example #15
0
def project_members_action(request, project_uuid, action=None, redirect_to='',
                           memb_id=None):

    actions_map = {
        'remove': {
            'method': 'remove_membership',
            'msg': _(astakos_messages.USER_MEMBERSHIP_REMOVED)
        },
        'accept': {
            'method': 'accept_membership',
            'msg': _(astakos_messages.USER_MEMBERSHIP_ACCEPTED)
        },
        'reject': {
            'method': 'reject_membership',
            'msg': _(astakos_messages.USER_MEMBERSHIP_REJECTED)
        }
    }

    if not action in actions_map.keys():
        raise PermissionDenied

    if memb_id:
        member_ids = [memb_id]
    else:
        member_ids = request.POST.getlist('members')

    project = get_object_or_404(Project, uuid=project_uuid)

    user = request.user
    if not user.owns_project(project) and not user.is_project_admin():
        messages.error(request, astakos_messages.NOT_ALLOWED)
        return redirect(reverse('index'))

    logger.info("Member(s) action from %s (project: %r, action: %s, "
                "members: %r)", user.log_display, project.uuid, action,
                member_ids)

    action = actions_map.get(action)
    action_func = getattr(project_actions, action.get('method'))
    for member_id in member_ids:
        member_id = int(member_id)
        with ExceptionHandler(request):
            with transaction.commit_on_success():
                try:
                    m = action_func(member_id, request.user)
                except ProjectError as e:
                    messages.error(request, e)
                else:
                    email = escape(m.person.email)
                    msg = action.get('msg') % email
                    messages.success(request, msg)

    return redirect_back(request, 'project_list')
Example #16
0
def project_leave(request, project_uuid):
    project = get_object_or_404(Project, uuid=project_uuid)
    with ExceptionHandler(request):
        with transaction.commit_on_success():
            memb_id = request.user.get_membership(project).pk
            auto_accepted = leave_project(memb_id, request.user)
            if auto_accepted:
                m = _(astakos_messages.USER_LEFT_PROJECT)
            else:
                m = _(astakos_messages.USER_LEAVE_REQUEST_SUBMITTED)
            messages.success(request, m)
    return redirect_to_next(request, 'project_detail', args=(project.uuid,))
Example #17
0
 def test_good_transaction_custom_decorator(self):
     astakos_transaction.commit_on_success(self.good_transaction)()
     self.assertEqual(AstakosUser.objects.count(), 1)
Example #18
0
def project_add_or_modify(request, project_uuid=None):
    user = request.user

    # only check quota for non project admin users
    if not user.is_project_admin():
        ok, limit = check_pending_app_quota(user)
        if not ok:
            m = _(astakos_messages.PENDING_APPLICATION_LIMIT_ADD) % limit
            messages.error(request, m)
            return redirect(restrict_reverse('astakos.im.views.project_list'))

    project = None
    if project_uuid:
        project = get_object_or_404(Project, uuid=project_uuid)

        if not user.owns_project(project) and not user.is_project_admin():
            m = _(astakos_messages.NOT_ALLOWED)
            raise PermissionDenied(m)

    details_fields = [
        "name", "homepage", "description", "start_date", "end_date", "comments"
    ]
    membership_fields = [
        "member_join_policy", "member_leave_policy", "limit_on_members_number"
    ]

    resource_catalog, resource_groups = _resources_catalog()
    resource_catalog_dict, resource_groups_dict = \
        _resources_catalog(as_dict=True)

    extra_context = {
        'resource_catalog': resource_catalog,
        'resource_groups': resource_groups,
        'resource_catalog_dict': resource_catalog_dict,
        'resource_groups_dict': resource_groups_dict,
        'show_form': True,
        'details_fields': details_fields,
        'membership_fields': membership_fields,
        'object': project
    }

    with transaction.commit_on_success():
        template_name = 'im/projects/projectapplication_form.html'
        summary_template_name = \
            'im/projects/projectapplication_form_summary.html'
        success_msg = _("The project application has been received and "
                        "is under consideration.")
        form_class = ProjectApplicationForm

        if project:
            template_name = 'im/projects/projectmodification_form.html'
            summary_template_name = \
                'im/projects/projectmodification_form_summary.html'
            success_msg = _("The project modification has been received and "
                            "is under consideration.")
            form_class = ProjectModificationForm
            details_fields.remove('start_date')

        extra_context['edit'] = 0
        if request.method == 'POST':
            form = form_class(request.POST, request.FILES, instance=project)
            if form.is_valid():
                verify = request.GET.get('verify')
                edit = request.GET.get('edit')
                if verify == '1':
                    extra_context['show_form'] = False
                    extra_context['form_data'] = form.cleaned_data
                    template_name = summary_template_name
                elif edit == '1':
                    extra_context['show_form'] = True
                else:
                    new_object = form.save()
                    messages.success(request, success_msg, fail_silently=True)
                    return redirect(restrict_reverse('project_list'))
        else:
            form = form_class(instance=project)

        extra_context['form'] = form
        return render_to_response(template_name,
                                  extra_context,
                                  context_instance=RequestContext(request))
Example #19
0
 def test_bad_transaction_custom_decorator_using(self):
     with self.assertRaises(TransactionException):
         astakos_transaction.commit_on_success(using="default")(
             self.bad_transaction)()
     self.assertEqual(AstakosUser.objects.count(), 0)
Example #20
0
 def test_bad_transaction_custom_decorator_incorrect_dbs(self):
     settings.DATABASES['astakos'] = settings.DATABASES['default']
     with self.assertRaises(TransactionException):
         astakos_transaction.commit_on_success(self.bad_transaction)()
     self.assertEqual(AstakosUser.objects.count(), 0)
     settings.DATABASES.pop("astakos")
Example #21
0
 def test_good_transaction_custom_decorator(self):
     astakos_transaction.commit_on_success(self.good_transaction)()
     self.assertEqual(AstakosUser.objects.count(), 1)
Example #22
0
def project_add_or_modify(request, project_uuid=None):
    user = request.user

    # only check quota for non project admin users
    if not user.is_project_admin():
        ok, limit = check_pending_app_quota(user)
        if not ok:
            m = _(astakos_messages.PENDING_APPLICATION_LIMIT_ADD) % limit
            messages.error(request, m)
            return redirect(restrict_reverse(
                'astakos.im.views.project_list'))

    project = None
    if project_uuid:
        project = get_object_or_404(Project, uuid=project_uuid)

        if not user.owns_project(project) and not user.is_project_admin():
            m = _(astakos_messages.NOT_ALLOWED)
            raise PermissionDenied(m)

    details_fields = ["name", "homepage", "description", "start_date",
                      "end_date", "comments"]
    membership_fields = ["member_join_policy", "member_leave_policy",
                         "limit_on_members_number"]

    resource_catalog, resource_groups = _resources_catalog()
    resource_catalog_dict, resource_groups_dict = \
        _resources_catalog(as_dict=True)

    extra_context = {
        'resource_catalog': resource_catalog,
        'resource_groups': resource_groups,
        'resource_catalog_dict': resource_catalog_dict,
        'resource_groups_dict': resource_groups_dict,
        'show_form': True,
        'details_fields': details_fields,
        'membership_fields': membership_fields,
        'object': project
    }

    with transaction.commit_on_success():
        template_name = 'im/projects/projectapplication_form.html'
        summary_template_name = \
            'im/projects/projectapplication_form_summary.html'
        success_msg = _("The project application has been received and "
                        "is under consideration.")
        form_class = ProjectApplicationForm

        if project:
            template_name = 'im/projects/projectmodification_form.html'
            summary_template_name = \
                'im/projects/projectmodification_form_summary.html'
            success_msg = _("The project modification has been received and "
                            "is under consideration.")
            form_class = ProjectModificationForm
            details_fields.remove('start_date')

        extra_context['edit'] = 0
        if request.method == 'POST':
            form = form_class(request.POST, request.FILES, instance=project)
            if form.is_valid():
                verify = request.GET.get('verify')
                edit = request.GET.get('edit')
                if verify == '1':
                    extra_context['show_form'] = False
                    extra_context['form_data'] = form.cleaned_data
                    template_name = summary_template_name
                elif edit == '1':
                    extra_context['show_form'] = True
                else:
                    new_object = form.save()
                    messages.success(request, success_msg,
                                     fail_silently=True)
                    return redirect(restrict_reverse('project_list'))
        else:
            form = form_class(instance=project)

        extra_context['form'] = form
        return render_to_response(template_name, extra_context,
                                  context_instance=RequestContext(request))
Example #23
0
 def test_bad_transaction_custom_decorator_using(self):
     with self.assertRaises(TransactionException):
         astakos_transaction.commit_on_success(using="default")(self.bad_transaction)()
     self.assertEqual(AstakosUser.objects.count(), 0)
Example #24
0
 def test_bad_transaction_custom_decorator_incorrect_dbs(self):
     settings.DATABASES['astakos'] = settings.DATABASES['default']
     with self.assertRaises(TransactionException):
         astakos_transaction.commit_on_success(self.bad_transaction)()
     self.assertEqual(AstakosUser.objects.count(), 0)
     settings.DATABASES.pop("astakos")