Revision 866e5768 snf-astakos-app/astakos/im/functions.py

b/snf-astakos-app/astakos/im/functions.py
318 318
        raise IOError(m)
319 319

  
320 320

  
321
def get_membership_by_id(project_id, memb_id):
321
def get_membership_by_id(memb_id):
322 322
    try:
323 323
        objs = ProjectMembership.objects.select_related('project', 'person')
324
        return objs.get(project__id=project_id, id=memb_id)
324
        return objs.get(id=memb_id)
325 325
    except ProjectMembership.DoesNotExist:
326 326
        m = _(astakos_messages.NOT_MEMBERSHIP_REQUEST)
327 327
        raise IOError(m)
......
352 352
        raise PermissionDenied(m)
353 353

  
354 354

  
355
def accept_membership_checks(project, request_user):
355
def accept_membership_project_checks(project, request_user):
356 356
    checkAllowed(project, request_user)
357 357
    checkAlive(project)
358 358

  
......
366 366
        raise PermissionDenied(m)
367 367

  
368 368

  
369
def accept_membership(memb_id, request_user=None):
370
    project = get_project_of_membership_for_update(memb_id)
371
    membership = get_membership_by_id(memb_id)
369
def accept_membership_checks(membership, request_user):
372 370
    if not membership.can_accept():
373 371
        m = _(astakos_messages.NOT_MEMBERSHIP_REQUEST)
374 372
        raise PermissionDenied(m)
375 373

  
376
    accept_membership_checks(project, request_user)
374
    project = membership.project
375
    accept_membership_project_checks(project, request_user)
376

  
377

  
378
def accept_membership(memb_id, request_user=None):
379
    project = get_project_of_membership_for_update(memb_id)
380
    membership = get_membership_by_id(memb_id)
381
    accept_membership_checks(membership, request_user)
377 382
    user = membership.person
378 383
    membership.accept()
379 384
    qh_sync_user(user)
......
384 389
    return membership
385 390

  
386 391

  
387
def reject_membership_checks(project, request_user):
392
def reject_membership_checks(membership, request_user):
393
    if not membership.can_reject():
394
        m = _(astakos_messages.NOT_MEMBERSHIP_REQUEST)
395
        raise PermissionDenied(m)
396

  
397
    project = membership.project
388 398
    checkAllowed(project, request_user)
389 399
    checkAlive(project)
390 400

  
......
392 402
def reject_membership(memb_id, request_user=None):
393 403
    project = get_project_of_membership_for_update(memb_id)
394 404
    membership = get_membership_by_id(memb_id)
395
    if not membership.can_reject():
396
        m = _(astakos_messages.NOT_MEMBERSHIP_REQUEST)
397
        raise PermissionDenied(m)
398

  
399
    reject_membership_checks(project, request_user)
405
    reject_membership_checks(membership, request_user)
400 406
    user = membership.person
401 407
    membership.reject()
402 408
    logger.info("Request of user %s for %s has been rejected." %
......
406 412
    return membership
407 413

  
408 414

  
409
def cancel_membership_checks(project):
410
    checkAlive(project)
411

  
412

  
413
def cancel_membership(memb_id, request_user):
414
    project = get_project_of_membership_for_update(memb_id)
415

  
416
    membership = get_membership_by_id(memb_id)
415
def cancel_membership_checks(membership, request_user):
417 416
    if not membership.can_cancel():
418 417
        m = _(astakos_messages.NOT_MEMBERSHIP_REQUEST)
419 418
        raise PermissionDenied(m)
......
422 421
        raise PermissionDenied()
423 422

  
424 423
    project = membership.project
425
    cancel_membership_checks(project)
424
    checkAlive(project)
425

  
426

  
427
def cancel_membership(memb_id, request_user):
428
    project = get_project_of_membership_for_update(memb_id)
429
    membership = get_membership_by_id(memb_id)
430
    cancel_membership_checks(membership, request_user)
426 431
    membership.cancel()
427 432
    logger.info("Request of user %s for %s has been cancelled." %
428 433
                (membership.person.log_display, project))
429 434

  
430 435

  
431
def remove_membership_checks(project, request_user=None):
436
def remove_membership_checks(membership, request_user=None):
437
    if not membership.can_remove():
438
        m = _(astakos_messages.NOT_ACCEPTED_MEMBERSHIP)
439
        raise PermissionDenied(m)
440

  
441
    project = membership.project
432 442
    checkAllowed(project, request_user)
433 443
    checkAlive(project)
434 444

  
......
441 451
def remove_membership(memb_id, request_user=None):
442 452
    project = get_project_of_membership_for_update(memb_id)
443 453
    membership = get_membership_by_id(memb_id)
444
    if not membership.can_remove():
445
        m = _(astakos_messages.NOT_ACCEPTED_MEMBERSHIP)
446
        raise PermissionDenied(m)
447

  
448
    remove_membership_checks(project, request_user)
454
    remove_membership_checks(membership, request_user)
449 455
    user = membership.person
450 456
    membership.remove()
451 457
    qh_sync_user(user)
......
458 464

  
459 465
def enroll_member(project_id, user, request_user=None):
460 466
    project = get_project_for_update(project_id)
461
    accept_membership_checks(project, request_user)
467
    accept_membership_project_checks(project, request_user)
462 468

  
463 469
    try:
464 470
        membership = get_membership(project_id, user.id)
......
478 484
    return membership
479 485

  
480 486

  
481
def leave_project_checks(project):
487
def leave_project_checks(membership, request_user):
488
    if not membership.can_leave():
489
        m = _(astakos_messages.NOT_ACCEPTED_MEMBERSHIP)
490
        raise PermissionDenied(m)
491

  
492
    if membership.person != request_user:
493
        raise PermissionDenied()
494

  
495
    project = membership.project
482 496
    checkAlive(project)
483 497

  
484 498
    leave_policy = project.application.member_leave_policy
......
488 502

  
489 503

  
490 504
def can_leave_request(project, user):
491
    try:
492
        leave_project_checks(project)
493
    except PermissionDenied:
494
        return False
495 505
    m = user.get_membership(project)
496 506
    if m is None:
497 507
        return False
498
    return m.can_leave()
508
    try:
509
        leave_project_checks(m, user)
510
    except PermissionDenied:
511
        return False
512
    return True
499 513

  
500 514

  
501 515
def leave_project(memb_id, request_user):
502 516
    project = get_project_of_membership_for_update(memb_id)
503

  
504 517
    membership = get_membership_by_id(memb_id)
505
    if not membership.can_leave():
506
        m = _(astakos_messages.NOT_ACCEPTED_MEMBERSHIP)
507
        raise PermissionDenied(m)
508

  
509
    if membership.person != request_user:
510
        raise PermissionDenied()
511

  
512
    project = membership.project
513
    leave_project_checks(project)
518
    leave_project_checks(membership, request_user)
514 519

  
515 520
    auto_accepted = False
516 521
    leave_policy = project.application.member_leave_policy
......
562 567
    try:
563 568
        membership = get_membership(project.id, request_user.id)
564 569
        if not membership.can_join():
565
            msg = _(astakos_messages.MEMBERSHIP_REQUEST_EXISTS)
570
            msg = _(astakos_messages.MEMBERSHIP_ASSOCIATED)
566 571
            raise PermissionDenied(msg)
567 572
        membership.join()
568 573
    except IOError:
......
584 589
    return auto_accepted
585 590

  
586 591

  
592
MEMBERSHIP_ACTION_CHECKS = {
593
    "leave":  leave_project_checks,
594
    "cancel": cancel_membership_checks,
595
    "accept": accept_membership_checks,
596
    "reject": reject_membership_checks,
597
    "remove": remove_membership_checks,
598
}
599

  
600

  
601
def membership_allowed_actions(membership, request_user):
602
    allowed = []
603
    for action, check in MEMBERSHIP_ACTION_CHECKS.iteritems():
604
        try:
605
            check(membership, request_user)
606
            allowed.append(action)
607
        except PermissionDenied:
608
            pass
609
    return allowed
610

  
611

  
587 612
def submit_application(owner=None,
588 613
                       name=None,
589 614
                       project_id=None,

Also available in: Unified diff