def wants_to_be_friends_with(origin_username, destiny_username): """Declares an intention from origin to be friends with destiny, sending a request to destiny or confirming the relation if the inverse had been previously stated. Returns a FriendshipState which can be request_sent or friends depending on the previous.""" Logger(__name__).info( 'Username {} wants to be friends with {}.'.format( origin_username, destiny_username)) # retrieve the DB user representations origin_user = User._get_one({'username': origin_username}) destiny_user = User._get_one({'username': destiny_username}) # if one of them was not found raise exception if origin_user is None or destiny_user is None: raise UserNotFoundException # if destiny had NOT already wanted to be friends with origin if origin_username not in destiny_user['friends']: return Friendship._send_request_from_to(origin_username, destiny_username) # if destiny is already friends with origin if Friendship._are_friends(origin_username, destiny_username): raise AlreadyFriendsException # only other cases are: invitation already sent or needed confirmation # and this first case should not be possible assert _user(destiny_username )['friends'][origin_username] == FRIENDSHIP_STATE_SENT assert _user(origin_username)['friends'][ destiny_username] == FRIENDSHIP_STATE_RECEIVED # so now it should be confirmed return Friendship._confirm_friends(origin_username, destiny_username)
def _are_friends(username1, username2): Logger(__name__).info( 'Evaluating whether users {} and {} are friends.'.format( username1, username2)) if username2 in _user(username1)['friends'] and \ _user(username1)['friends'][username2] == FRIENDSHIP_STATE_FRIENDS: return True return False
def get_friendship_state_from_to(origin_username, destiny_username): """Returns one of the friendship states according to how origin sees the relationship.""" origin_user_obj = _user(origin_username) if _user(destiny_username) is None: raise UserNotFoundException if destiny_username not in origin_user_obj['friends']: return FRIENDSHIP_STATE_NOT_FRIENDS return origin_user_obj['friends'][destiny_username]
def _confirm_friends(username1, username2): Logger(__name__).info( 'Confirming friendship between users {} and {}.'.format( username1, username2)) assert username2 in _user(username1)['friends'] assert username1 in _user(username2)['friends'] # user1['friends'][user2['username']] = FRIENDSHIP_STATE_FRIENDS Friendship._change_friendship_in_to(username1, username2, FRIENDSHIP_STATE_FRIENDS) # user2['friends'][user1['username']] = FRIENDSHIP_STATE_FRIENDS Friendship._change_friendship_in_to(username2, username1, FRIENDSHIP_STATE_FRIENDS) return FRIENDSHIP_STATE_FRIENDS
def _had_sent_request(origin_username, destiny_username): Logger(__name__).info( 'Evaluating whether user {} wanted to be friends with {} ' 'beforehand.'.format(origin_username, destiny_username)) if _user(destiny_username )['friends'][origin_username] == FRIENDSHIP_STATE_RECEIVED: return True return False
def _get_friends_of(username): user_obj = _user(username) if user_obj is None: raise UserNotFoundException return [ friend_id for friend_id, friendship_state in user_obj["friends"].items() if friendship_state == FRIENDSHIP_STATE_FRIENDS ]
def _reject_friendship(username1, username2): Logger(__name__).info( 'Rejecting friendship between users {} and {}.'.format( username1, username2)) # previous_state = user1['friends'].pop(user2["username"]) previous_state = _user(username1)['friends'][username2] Friendship._delete_friendship_in(username1, username2) # user2['friends'].pop(user1["username"]) Friendship._delete_friendship_in(username2, username1) return previous_state