Revision 71c741dc

b/snf-astakos-app/astakos/im/functions.py
411 411

  
412 412

  
413 413
def accept_membership_checks(membership, request_user):
414
    if not membership.can_accept():
414
    if not membership.check_action("accept"):
415 415
        m = _(astakos_messages.NOT_MEMBERSHIP_REQUEST)
416 416
        raise ProjectConflict(m)
417 417

  
......
424 424
    membership = get_membership_by_id(memb_id)
425 425
    accept_membership_checks(membership, request_user)
426 426
    user = membership.person
427
    membership.accept()
427
    membership.perform_action("accept")
428 428
    qh_sync_user(user)
429 429
    logger.info("User %s has been accepted in %s." %
430 430
                (user.log_display, project))
......
434 434

  
435 435

  
436 436
def reject_membership_checks(membership, request_user):
437
    if not membership.can_reject():
437
    if not membership.check_action("reject"):
438 438
        m = _(astakos_messages.NOT_MEMBERSHIP_REQUEST)
439 439
        raise ProjectConflict(m)
440 440

  
......
448 448
    membership = get_membership_by_id(memb_id)
449 449
    reject_membership_checks(membership, request_user)
450 450
    user = membership.person
451
    membership.reject()
451
    membership.perform_action("reject")
452 452
    logger.info("Request of user %s for %s has been rejected." %
453 453
                (user.log_display, project))
454 454

  
......
457 457

  
458 458

  
459 459
def cancel_membership_checks(membership, request_user):
460
    if not membership.can_cancel():
460
    if not membership.check_action("cancel"):
461 461
        m = _(astakos_messages.NOT_MEMBERSHIP_REQUEST)
462 462
        raise ProjectConflict(m)
463 463

  
......
470 470
    project = get_project_of_membership_for_update(memb_id)
471 471
    membership = get_membership_by_id(memb_id)
472 472
    cancel_membership_checks(membership, request_user)
473
    membership.cancel()
473
    membership.perform_action("cancel")
474 474
    logger.info("Request of user %s for %s has been cancelled." %
475 475
                (membership.person.log_display, project))
476 476

  
477 477

  
478 478
def remove_membership_checks(membership, request_user=None):
479
    if not membership.can_remove():
479
    if not membership.check_action("remove"):
480 480
        m = _(astakos_messages.NOT_ACCEPTED_MEMBERSHIP)
481 481
        raise ProjectConflict(m)
482 482

  
......
495 495
    membership = get_membership_by_id(memb_id)
496 496
    remove_membership_checks(membership, request_user)
497 497
    user = membership.person
498
    membership.remove()
498
    membership.perform_action("remove")
499 499
    qh_sync_user(user)
500 500
    logger.info("User %s has been removed from %s." %
501 501
                (user.log_display, project))
......
514 514

  
515 515
    try:
516 516
        membership = get_membership(project_id, user.id)
517
        if not membership.can_enroll():
517
        if not membership.check_action("enroll"):
518 518
            m = _(astakos_messages.MEMBERSHIP_ACCEPTED)
519 519
            raise ProjectConflict(m)
520
        membership.join()
520
        membership.perform_action("join")
521 521
    except ProjectNotFound:
522 522
        membership = new_membership(project, user)
523 523

  
524
    membership.accept()
524
    membership.perform_action("accept")
525 525
    qh_sync_user(user)
526 526
    logger.info("User %s has been enrolled in %s." %
527 527
                (membership.person.log_display, project))
......
531 531

  
532 532

  
533 533
def leave_project_checks(membership, request_user):
534
    if not membership.can_leave():
534
    if not membership.check_action("leave"):
535 535
        m = _(astakos_messages.NOT_ACCEPTED_MEMBERSHIP)
536 536
        raise ProjectConflict(m)
537 537

  
......
564 564
    auto_accepted = False
565 565
    leave_policy = project.application.member_leave_policy
566 566
    if leave_policy == AUTO_ACCEPT_POLICY:
567
        membership.remove()
567
        membership.perform_action("remove")
568 568
        qh_sync_user(request_user)
569 569
        logger.info("User %s has left %s." %
570 570
                    (request_user.log_display, project))
571 571
        auto_accepted = True
572 572
    else:
573
        membership.leave_request()
573
        membership.perform_action("leave_request")
574 574
        logger.info("User %s requested to leave %s." %
575 575
                    (request_user.log_display, project))
576 576
        membership_leave_request_notify(project, membership.person)
......
595 595
    m = user.get_membership(project)
596 596
    if not m:
597 597
        return True
598
    return m.can_join()
598
    return m.check_action("join")
599 599

  
600 600

  
601 601
def new_membership(project, user):
......
610 610

  
611 611
    try:
612 612
        membership = get_membership(project.id, request_user.id)
613
        if not membership.can_join():
613
        if not membership.check_action("join"):
614 614
            msg = _(astakos_messages.MEMBERSHIP_ASSOCIATED)
615 615
            raise ProjectConflict(msg)
616
        membership.join()
616
        membership.perform_action("join")
617 617
    except ProjectNotFound:
618 618
        membership = new_membership(project, request_user)
619 619

  
620 620
    join_policy = project.application.member_join_policy
621 621
    if (join_policy == AUTO_ACCEPT_POLICY and (
622 622
            not project.violates_members_limit(adding=1))):
623
        membership.accept()
623
        membership.perform_action("accept")
624 624
        qh_sync_user(request_user)
625 625
        logger.info("User %s joined %s." %
626 626
                    (request_user.log_display, project))
b/snf-astakos-app/astakos/im/models.py
1924 1924
        self.state = to_state
1925 1925
        self.save()
1926 1926

  
1927
    def can_join(self):
1928
        return self.state not in self.ASSOCIATED_STATES
1929

  
1930
    def join(self):
1931
        if not self.can_join():
1932
            m = _("%s: attempt to join in state '%s'") % (self, self.state)
1933
            raise AssertionError(m)
1934

  
1935
        self.set_state(self.REQUESTED)
1936

  
1937
    def can_accept(self):
1938
        return self.state == self.REQUESTED
1939

  
1940
    def accept(self):
1941
        if not self.can_accept():
1942
            m = _("%s: attempt to accept in state '%s'") % (self, self.state)
1943
            raise AssertionError(m)
1944

  
1945
        self.set_state(self.ACCEPTED)
1946

  
1947
    def can_enroll(self):
1948
        return self.state not in self.ACCEPTED_STATES
1949

  
1950
    def can_leave(self):
1951
        return self.state in self.ACCEPTED_STATES
1952

  
1953
    def leave_request(self):
1954
        if not self.can_leave():
1955
            m = _("%s: attempt to request to leave in state '%s'") % (
1956
                self, self.state)
1957
            raise AssertionError(m)
1958

  
1959
        self.set_state(self.LEAVE_REQUESTED)
1960

  
1961
    def can_deny_leave(self):
1962
        return self.state == self.LEAVE_REQUESTED
1963

  
1964
    def leave_request_deny(self):
1965
        if not self.can_deny_leave():
1966
            m = _("%s: attempt to deny leave request in state '%s'") % (
1967
                self, self.state)
1968
            raise AssertionError(m)
1969

  
1970
        self.set_state(self.ACCEPTED)
1971

  
1972
    def can_cancel_leave(self):
1973
        return self.state == self.LEAVE_REQUESTED
1974

  
1975
    def leave_request_cancel(self):
1976
        if not self.can_cancel_leave():
1977
            m = _("%s: attempt to cancel leave request in state '%s'") % (
1978
                self, self.state)
1979
            raise AssertionError(m)
1980

  
1981
        self.set_state(self.ACCEPTED)
1982

  
1983
    def can_remove(self):
1984
        return self.state in self.ACCEPTED_STATES
1985

  
1986
    def remove(self):
1987
        if not self.can_remove():
1988
            m = _("%s: attempt to remove in state '%s'") % (self, self.state)
1989
            raise AssertionError(m)
1990

  
1991
        self.set_state(self.REMOVED)
1992

  
1993
    def can_reject(self):
1994
        return self.state == self.REQUESTED
1995

  
1996
    def reject(self):
1997
        if not self.can_reject():
1998
            m = _("%s: attempt to reject in state '%s'") % (self, self.state)
1999
            raise AssertionError(m)
2000

  
2001
        self.set_state(self.REJECTED)
1927
    ACTION_CHECKS = {
1928
        "join": lambda m: m.state not in m.ASSOCIATED_STATES,
1929
        "accept": lambda m: m.state == m.REQUESTED,
1930
        "enroll": lambda m: m.state not in m.ACCEPTED_STATES,
1931
        "leave": lambda m: m.state in m.ACCEPTED_STATES,
1932
        "leave_request": lambda m: m.state in m.ACCEPTED_STATES,
1933
        "deny_leave": lambda m: m.state == m.LEAVE_REQUESTED,
1934
        "cancel_leave": lambda m: m.state == m.LEAVE_REQUESTED,
1935
        "remove": lambda m: m.state in m.ACCEPTED_STATES,
1936
        "reject": lambda m: m.state == m.REQUESTED,
1937
        "cancel": lambda m: m.state == m.REQUESTED,
1938
    }
2002 1939

  
2003
    def can_cancel(self):
2004
        return self.state == self.REQUESTED
1940
    ACTION_STATES = {
1941
        "join":          REQUESTED,
1942
        "accept":        ACCEPTED,
1943
        "leave_request": LEAVE_REQUESTED,
1944
        "deny_leave":    ACCEPTED,
1945
        "cancel_leave":  ACCEPTED,
1946
        "remove":        REMOVED,
1947
        "reject":        REJECTED,
1948
        "cancel":        CANCELLED,
1949
    }
2005 1950

  
2006
    def cancel(self):
2007
        if not self.can_cancel():
2008
            m = _("%s: attempt to cancel in state '%s'") % (self, self.state)
1951
    def check_action(self, action):
1952
        try:
1953
            check = self.ACTION_CHECKS[action]
1954
        except KeyError:
1955
            raise ValueError("No check found for action '%s'" % action)
1956
        return check(self)
1957

  
1958
    def perform_action(self, action):
1959
        if not self.check_action(action):
1960
            m = _("%s: attempted action '%s' in state '%s'") % (
1961
                self, action, self.state)
2009 1962
            raise AssertionError(m)
2010

  
2011
        self.set_state(self.CANCELLED)
1963
        try:
1964
            s = self.ACTION_STATES[action]
1965
        except KeyError:
1966
            raise ValueError("No such action '%s'" % action)
1967
        return self.set_state(s)
2012 1968

  
2013 1969

  
2014 1970
class Serial(models.Model):

Also available in: Unified diff