Revision dc946891

b/snf-astakos-app/astakos/im/functions.py
288 288
        raise IOError(m)
289 289

  
290 290

  
291
def get_chain_of_membership_for_update(memb_id):
292
    m = get_membership_by_id(memb_id)
293
    return get_chain_for_update(m.project_id)
294

  
295

  
291 296
def get_user_by_id(user_id):
292 297
    try:
293 298
        return AstakosUser.objects.get(id=user_id)
......
361 366
        raise PermissionDenied(m)
362 367

  
363 368

  
364
def accept_membership(project_id, memb_id, request_user=None):
365
    get_chain_for_update(project_id)
366

  
367
    membership = get_membership_by_id(project_id, memb_id)
369
def accept_membership(memb_id, request_user=None):
370
    get_chain_of_membership_for_update(memb_id)
371
    membership = get_membership_by_id(memb_id)
368 372
    if not membership.can_accept():
369 373
        m = _(astakos_messages.NOT_MEMBERSHIP_REQUEST)
370 374
        raise PermissionDenied(m)
......
386 390
    checkAlive(project)
387 391

  
388 392

  
389
def reject_membership(project_id, memb_id, request_user=None):
390
    get_chain_for_update(project_id)
391

  
392
    membership = get_membership_by_id(project_id, memb_id)
393
def reject_membership(memb_id, request_user=None):
394
    get_chain_of_membership_for_update(memb_id)
395
    membership = get_membership_by_id(memb_id)
393 396
    if not membership.can_reject():
394 397
        m = _(astakos_messages.NOT_MEMBERSHIP_REQUEST)
395 398
        raise PermissionDenied(m)
......
409 412
    checkAlive(project)
410 413

  
411 414

  
412
def cancel_membership(project_id, request_user):
413
    get_chain_for_update(project_id)
415
def cancel_membership(memb_id, request_user):
416
    get_chain_of_membership_for_update(memb_id)
414 417

  
415
    membership = get_membership(project_id, request_user.id)
418
    membership = get_membership_by_id(memb_id)
416 419
    if not membership.can_cancel():
417 420
        m = _(astakos_messages.NOT_MEMBERSHIP_REQUEST)
418 421
        raise PermissionDenied(m)
419 422

  
423
    if membership.person != request_user:
424
        raise PermissionDenied()
425

  
420 426
    project = membership.project
421 427
    cancel_membership_checks(project)
422 428
    membership.cancel()
......
434 440
        raise PermissionDenied(m)
435 441

  
436 442

  
437
def remove_membership(project_id, memb_id, request_user=None):
438
    get_chain_for_update(project_id)
439

  
440
    membership = get_membership_by_id(project_id, memb_id)
443
def remove_membership(memb_id, request_user=None):
444
    get_chain_of_membership_for_update(memb_id)
445
    membership = get_membership_by_id(memb_id)
441 446
    if not membership.can_remove():
442 447
        m = _(astakos_messages.NOT_ACCEPTED_MEMBERSHIP)
443 448
        raise PermissionDenied(m)
......
497 502
    return m.can_leave()
498 503

  
499 504

  
500
def leave_project(project_id, request_user):
501
    get_chain_for_update(project_id)
505
def leave_project(memb_id, request_user):
506
    get_chain_of_membership_for_update(memb_id)
502 507

  
503
    membership = get_membership(project_id, request_user.id)
508
    membership = get_membership_by_id(memb_id)
504 509
    if not membership.can_leave():
505 510
        m = _(astakos_messages.NOT_ACCEPTED_MEMBERSHIP)
506 511
        raise PermissionDenied(m)
507 512

  
513
    if membership.person != request_user:
514
        raise PermissionDenied()
515

  
508 516
    project = membership.project
509 517
    leave_project_checks(project)
510 518

  
b/snf-astakos-app/astakos/im/tables.py
207 207
    membership = user.get_membership(project)
208 208
    if membership is not None:
209 209
        if can_leave and membership.can_leave():
210
            url = 'astakos.im.views.project_leave'
210
            url = reverse('astakos.im.views.project_leave',
211
                          args=(membership.id,))
211 212
            action = _('Leave')
212 213
            confirm = True
213 214
            prompt = _('Are you sure you want to leave from the project?')
214 215
        elif can_cancel and membership.can_cancel():
215
            url = 'astakos.im.views.project_cancel'
216
            url = reverse('astakos.im.views.project_cancel_member',
217
                          args=(membership.id,))
216 218
            action = _('Cancel')
217 219
            confirm = True
218 220
            prompt = _('Are you sure you want to cancel the join request?')
219 221

  
220 222
    elif can_join:
221
        url = 'astakos.im.views.project_join'
223
        url = reverse('astakos.im.views.project_join', args=(project.id,))
222 224
        action = _('Join')
223 225
        confirm = True
224 226
        prompt = _('Are you sure you want to join this project?')
......
227 229
        confirm = False
228 230
        url = None
229 231

  
230
    url = reverse(url, args=(project.id, )) + append_url if url else ''
231

  
232 232
    return {'action': action,
233 233
            'confirm': confirm,
234 234
            'url': url,
......
351 351
        confirms = [True, True]
352 352

  
353 353
    for i, url in enumerate(urls):
354
        context.append(dict(url=reverse(url, args=(table.project.pk,
355
                                                   membership.pk)),
354
        context.append(dict(url=reverse(url, args=(membership.pk,)),
356 355
                            action=actions[i], prompt=prompts[i],
357 356
                            confirm=confirms[i]))
358 357
    return context
b/snf-astakos-app/astakos/im/templates/im/projects/_project_detail_actions.html
45 45
{% endif %}
46 46

  
47 47
{% if can_leave_request %}
48
{% confirm_link "LEAVE" "project_leave" "project_leave" project.pk %}
48
{% confirm_link "LEAVE" "project_leave" "project_leave" membership_id %}
49 49
{% endif %}
50 50
</div>
b/snf-astakos-app/astakos/im/urls.py
75 75
        name='project_detail'),
76 76
    url(r'^projects/(?P<chain_id>\d+)/join/?$', 'project_join', {},
77 77
        name='project_join'),
78
    url(r'^projects/(?P<chain_id>\d+)/leave/?$', 'project_leave', {},
79
        name='project_leave'),
80
    url(r'^projects/(?P<chain_id>\d+)/cancel/?$', 'project_cancel', {},
81
        name='project_cancel'),
82 78
    url(r'^projects/(?P<chain_id>\d+)/members/?$', 'project_members', {},
83 79
        name='project_members'),
84 80
    url(r'^projects/(?P<chain_id>\d+)/members/approved/?$', 'project_members',
......
94 90
        name='project_members_reject'),
95 91
    url(r'^projects/(?P<chain_id>\d+)/members/pending/?$', 'project_members',
96 92
        {'members_status_filter': 0}, name='project_pending_members'),
97
    url(r'^projects/(?P<chain_id>\d+)/(?P<memb_id>\d+)/accept/?$',
93
    url(r'^projects/memberships/(?P<memb_id>\d+)/leave/?$',
94
        'project_leave', {}, name='project_leave'),
95
    url(r'^projects/memberships/(?P<memb_id>\d+)/cancel/?$',
96
        'project_cancel_member', {}, name='project_cancel_member'),
97
    url(r'^projects/memberships/(?P<memb_id>\d+)/accept/?$',
98 98
        'project_accept_member', {}, name='project_accept_member'),
99
    url(r'^projects/(?P<chain_id>\d+)/(?P<memb_id>\d+)/reject/?$',
99
    url(r'^projects/memberships/(?P<memb_id>\d+)/reject/?$',
100 100
        'project_reject_member', {}, name='project_reject_member'),
101
    url(r'^projects/(?P<chain_id>\d+)/(?P<memb_id>\d+)/remove/?$',
101
    url(r'^projects/memberships/(?P<memb_id>\d+)/remove/?$',
102 102
        'project_remove_member', {}, name='project_remove_member'),
103 103
    url(r'^projects/app/(?P<application_id>\d+)/?$', 'project_app', {},
104 104
        name='project_app'),
b/snf-astakos-app/astakos/im/views/projects.py
354 354
        m = _(astakos_messages.NOT_ALLOWED)
355 355
        raise PermissionDenied(m)
356 356

  
357
    membership = user.get_membership(project) if project else None
358
    membership_id = membership.id if membership else None
357 359
    mem_display = user.membership_display(project) if project else None
358 360
    can_join_req = can_join_request(project, user) if project else False
359 361
    can_leave_req = can_leave_request(project, user) if project else False
......
374 376
            'owner_mode': is_owner,
375 377
            'admin_mode': is_project_admin,
376 378
            'mem_display': mem_display,
379
            'membership_id': membership_id,
377 380
            'can_join_request': can_join_req,
378 381
            'can_leave_request': can_leave_req,
379 382
            'members_status_filter': members_status_filter,
......
462 465
@require_http_methods(["POST"])
463 466
@cookie_fix
464 467
@valid_astakos_user_required
465
def project_leave(request, chain_id):
468
def project_leave(request, memb_id):
466 469
    next = request.GET.get('next')
467 470
    if not next:
468 471
        next = reverse('astakos.im.views.project_list')
469 472

  
470 473
    with ExceptionHandler(request):
471
        _project_leave(request, chain_id)
474
        _project_leave(request, memb_id)
472 475

  
473 476
    next = restrict_next(next, domain=settings.COOKIE_DOMAIN)
474 477
    return redirect(next)
475 478

  
476 479

  
477 480
@commit_on_success_strict()
478
def _project_leave(request, chain_id):
481
def _project_leave(request, memb_id):
479 482
    try:
480
        chain_id = int(chain_id)
481
        auto_accepted = leave_project(chain_id, request.user)
483
        memb_id = int(memb_id)
484
        auto_accepted = leave_project(memb_id, request.user)
482 485
        if auto_accepted:
483 486
            m = _(astakos_messages.USER_LEFT_PROJECT)
484 487
        else:
......
491 494
@require_http_methods(["POST"])
492 495
@cookie_fix
493 496
@valid_astakos_user_required
494
def project_cancel(request, chain_id):
497
def project_cancel_member(request, memb_id):
495 498
    next = request.GET.get('next')
496 499
    if not next:
497 500
        next = reverse('astakos.im.views.project_list')
498 501

  
499 502
    with ExceptionHandler(request):
500
        _project_cancel(request, chain_id)
503
        _project_cancel_member(request, memb_id)
501 504

  
502 505
    next = restrict_next(next, domain=settings.COOKIE_DOMAIN)
503 506
    return redirect(next)
504 507

  
505 508

  
506 509
@commit_on_success_strict()
507
def _project_cancel(request, chain_id):
510
def _project_cancel_member(request, memb_id):
508 511
    try:
509
        chain_id = int(chain_id)
510
        cancel_membership(chain_id, request.user)
512
        cancel_membership(memb_id, request.user)
511 513
        m = _(astakos_messages.USER_REQUEST_CANCELLED)
512 514
        messages.success(request, m)
513 515
    except (IOError, PermissionDenied), e:
......
517 519
@require_http_methods(["POST"])
518 520
@cookie_fix
519 521
@valid_astakos_user_required
520
def project_accept_member(request, chain_id, memb_id):
522
def project_accept_member(request, memb_id):
521 523

  
522 524
    with ExceptionHandler(request):
523
        _project_accept_member(request, chain_id, memb_id)
525
        _project_accept_member(request, memb_id)
524 526

  
525 527
    return redirect_back(request, 'project_list')
526 528

  
527 529

  
528 530
@commit_on_success_strict()
529
def _project_accept_member(request, chain_id, memb_id):
531
def _project_accept_member(request, memb_id):
530 532
    try:
531
        chain_id = int(chain_id)
532 533
        memb_id = int(memb_id)
533
        m = accept_membership(chain_id, memb_id, request.user)
534
        m = accept_membership(memb_id, request.user)
534 535
    except (IOError, PermissionDenied), e:
535 536
        messages.error(request, e)
536 537

  
......
543 544
@require_http_methods(["POST"])
544 545
@cookie_fix
545 546
@valid_astakos_user_required
546
def project_remove_member(request, chain_id, memb_id):
547
def project_remove_member(request, memb_id):
547 548

  
548 549
    with ExceptionHandler(request):
549
        _project_remove_member(request, chain_id, memb_id)
550
        _project_remove_member(request, memb_id)
550 551

  
551 552
    return redirect_back(request, 'project_list')
552 553

  
553 554

  
554 555
@commit_on_success_strict()
555
def _project_remove_member(request, chain_id, memb_id):
556
def _project_remove_member(request, memb_id):
556 557
    try:
557
        chain_id = int(chain_id)
558 558
        memb_id = int(memb_id)
559
        m = remove_membership(chain_id, memb_id, request.user)
559
        m = remove_membership(memb_id, request.user)
560 560
    except (IOError, PermissionDenied), e:
561 561
        messages.error(request, e)
562 562
    else:
......
568 568
@require_http_methods(["POST"])
569 569
@cookie_fix
570 570
@valid_astakos_user_required
571
def project_reject_member(request, chain_id, memb_id):
571
def project_reject_member(request, memb_id):
572 572

  
573 573
    with ExceptionHandler(request):
574
        _project_reject_member(request, chain_id, memb_id)
574
        _project_reject_member(request, memb_id)
575 575

  
576 576
    return redirect_back(request, 'project_list')
577 577

  
578 578

  
579 579
@commit_on_success_strict()
580
def _project_reject_member(request, chain_id, memb_id):
580
def _project_reject_member(request, memb_id):
581 581
    try:
582
        chain_id = int(chain_id)
583 582
        memb_id = int(memb_id)
584
        m = reject_membership(chain_id, memb_id, request.user)
583
        m = reject_membership(memb_id, request.user)
585 584
    except (IOError, PermissionDenied), e:
586 585
        messages.error(request, e)
587 586
    else:
......
722 721
    for member_id in member_ids:
723 722
        member_id = int(member_id)
724 723
        with ExceptionHandler(request):
725
            action_func(request, chain_id, member_id)
724
            action_func(request, member_id)
726 725

  
727 726
    return redirect_back(request, 'project_list')

Also available in: Unified diff