Exemplo n.º 1
0
class GetFriendsTestCase(unittest.TestCase):
    def setUp(self):
        self.sObj = Splitwise('consumerkey', 'consumersecret')

    def test_getFriends_success(self, mockMakeRequest):
        mockMakeRequest.return_value = '{"friends":[{"id":79773,"first_name":"Tirthankar","last_name":null,"email":"*****@*****.**","registration_status":"confirmed","picture":{"small":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/79773/small_avatar.jpeg","medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/79773/medium_avatar.jpeg","large":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/79773/large_avatar.jpeg"},"balance":[],"groups":[{"group_id":3449541,"balance":[]},{"group_id":6195367,"balance":[]},{"group_id":0,"balance":[]}],"updated_at":"2020-01-12T15:55:09Z"},{"id":281236,"first_name":"Siddharth","last_name":"Goel","email":"*****@*****.**","registration_status":"confirmed","picture":{"small":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/281236/small_f5fccc37-0a88-4519-9398-59c8c19b92aa.jpeg","medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/281236/medium_f5fccc37-0a88-4519-9398-59c8c19b92aa.jpeg","large":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/281236/large_f5fccc37-0a88-4519-9398-59c8c19b92aa.jpeg"},"balance":[{"currency_code":"SGD","amount":"-20.13"}],"groups":[{"group_id":489361,"balance":[]},{"group_id":629385,"balance":[]},{"group_id":961648,"balance":[]},{"group_id":1282223,"balance":[]},{"group_id":1376285,"balance":[]},{"group_id":1427377,"balance":[]},{"group_id":1591839,"balance":[]},{"group_id":1911503,"balance":[]},{"group_id":2829420,"balance":[]},{"group_id":2831598,"balance":[]},{"group_id":3001684,"balance":[]},{"group_id":3137253,"balance":[]},{"group_id":4149325,"balance":[]},{"group_id":5938420,"balance":[]},{"group_id":7517182,"balance":[]},{"group_id":10843533,"balance":[{"currency_code":"SGD","amount":"-20.13"}]},{"group_id":12991099,"balance":[]},{"group_id":17090245,"balance":[]},{"group_id":0,"balance":[]}],"updated_at":"2020-06-22T07:17:54Z"}]}'  # noqa: E501
        friends = self.sObj.getFriends()
        mockMakeRequest.assert_called_with(
            "https://secure.splitwise.com/api/v3.0/get_friends")
        self.assertEqual(len(friends), 2)
        self.assertEqual(friends[0].getId(), 79773)
        self.assertEqual(friends[0].getFirstName(), "Tirthankar")
        self.assertEqual(friends[0].getLastName(), None)
        self.assertEqual(friends[0].getEmail(), "*****@*****.**")
        self.assertEqual(friends[0].getRegistrationStatus(), "confirmed")
        self.assertEqual(
            friends[0].getPicture().getSmall(),
            "https://splitwise.s3.amazonaws.com/uploads/user/avatar/79773/small_avatar.jpeg"
        )
        self.assertEqual(
            friends[0].getPicture().getMedium(),
            "https://splitwise.s3.amazonaws.com/uploads/user/avatar/79773/medium_avatar.jpeg"
        )
        self.assertEqual(
            friends[0].getPicture().getLarge(),
            "https://splitwise.s3.amazonaws.com/uploads/user/avatar/79773/large_avatar.jpeg"
        )
        self.assertEqual(friends[0].getRegistrationStatus(), "confirmed")
        self.assertEqual(len(friends[0].getBalances()), 0)
        self.assertEqual(len(friends[0].getGroups()), 3)
        self.assertEqual(friends[0].getGroups()[0].getId(), 3449541)
        self.assertEqual(len(friends[0].getGroups()[0].getBalances()), 0)
        self.assertEqual(friends[1].getId(), 281236)
        self.assertEqual(friends[1].getFirstName(), "Siddharth")
        self.assertEqual(friends[1].getLastName(), "Goel")
        self.assertEqual(friends[1].getEmail(), "*****@*****.**")
        self.assertEqual(friends[1].getRegistrationStatus(), "confirmed")
        self.assertEqual(len(friends[1].getBalances()), 1)
        self.assertEqual(friends[1].getBalances()[0].getAmount(), '-20.13')
        self.assertEqual(friends[1].getBalances()[0].getCurrencyCode(), 'SGD')
        self.assertEqual(len(friends[1].getGroups()), 19)
        self.assertEqual(friends[1].getGroups()[15].getId(), 10843533)
        self.assertEqual(len(friends[1].getGroups()[15].getBalances()), 1)
        self.assertEqual(
            friends[1].getGroups()[15].getBalances()[0].getCurrencyCode(),
            'SGD')
        self.assertEqual(
            friends[1].getGroups()[15].getBalances()[0].getAmount(), '-20.13')

    def test_getFriends_exception(self, mockMakeRequest):
        mockMakeRequest.side_effect = Exception(
            "Invalid response %s. Please check your consumer key and secret." %
            404)
        with self.assertRaises(Exception):
            self.sObj.getFriends()
        mockMakeRequest.assert_called_with(
            "https://secure.splitwise.com/api/v3.0/get_friends")
Exemplo n.º 2
0
def friends():

    if 'access_token' not in session:
        return redirect(url_for("home"))

    sObj = Splitwise(Config.consumer_key, Config.consumer_secret)
    sObj.setAccessToken(session['access_token'])

    friends = sObj.getFriends(
    )  #Get a list of friends object using Splitwise API

    friend_list = []  #Friends list
    bal_list = []  #Balance list

    # li = []
    for friend in friends:
        friend_list.append(friend.getFirstName())
        print(friend.getBalances())
        print(len(friend.getBalances()))

        if len(friend.getBalances()) == 0:
            bal_list.append("0")
        else:
            for bal in friend.getBalances():
                if len(bal.getAmount()) == 0:
                    bal_list.append("0")
                else:
                    bal_list.append(bal.getAmount())

    output = {'friends': friend_list, 'balances': bal_list}
    return jsonify(output)
Exemplo n.º 3
0
def friends():
    wise = Splitwise('consumer_key', 'consumer_secret')
    wise.setAccessToken(session[KEY_ACCESS_TOKEN])

    friend_names = [' '.join(filter(None, (f.first_name, f.last_name))) for f in wise.getFriends()]
    template = f"<ul>{''.join(f'<li>{name}</li>' for name in friend_names)}</ul>"
    return render_template_string(template)
Exemplo n.º 4
0
def balances():
	sObj = Splitwise(consumer_key, secret_key)
	sObj.setAccessToken(session['access_token'])
	friends = sObj.getFriends()
	amount = []
	for friend in friends:
		for balance in friend.getBalances():
			amount.append(balance.getAmount())
	return amount
Exemplo n.º 5
0
def friends():
    if 'access_token' not in session:
        return redirect(url_for("home"))

    sObj = Splitwise(Config.consumer_key, Config.consumer_secret)
    sObj.setAccessToken(session['access_token'])

    friends = sObj.getFriends()
    return render_template("friends.html", friends=friends)
Exemplo n.º 6
0
def friends():
    if 'access_token' not in session:
        return redirect(url_for("home"))
    sObj = Splitwise(consumer_key, secret_key)
    sObj.setAccessToken(session['access_token'])
    me = ['David', 'Terpay', '*****@*****.**']
    ram = ['Ram', 'Muthukumaran', '*****@*****.**']
    # transaction("pie",'Testing2','David', 10,['David','Ram'])
    print(groupMembersString('Testing2'))
    # print(sObj.getGroups())
    friends = sObj.getFriends()
    return render_template("friends.html",friends=friends)
Exemplo n.º 7
0
    def get_expenses(self):
        sObj = Splitwise(Config.consumer_key, Config.consumer_secret)
        sObj.setAccessToken(session['access_token'])
        content = sObj.getExpenses()
        session['expenses'] = content

        friends = sObj.getFriends()
        self.debtors = friendsload(friends)
        #print(friendsload(friends))
        #print("\n\n\n\n\n\n" , content)
        #resp = splitwise.get('get_current_user')
        return render2('output.html', getresp="waddup")
Exemplo n.º 8
0
    def settle(self):
        sObj = Splitwise(Config.consumer_key, Config.consumer_secret)
        sObj.setAccessToken(session['access_token'])
        content = sObj.getExpenses()
        session['expenses'] = content

        friends = sObj.getFriends()
        self.debtors = friendsload(friends)

        d = []
        d.append(Debtor("Hugh Mungus", 69.0))
        d.append(Debtor("Gareth Funk", 100000))
        d.append(Debtor("The Queen", 1000000000.01))
        return render2("settle.html", debtors=self.debtors)
Exemplo n.º 9
0
def getFriends():

    access_token = session.get('access_token', '')

    if access_token == '':
        return authorize_step1()

    spltwse = Splitwise(consumer_key, consumer_secret)
    spltwse.setAccessToken(access_token)

    frnds = ''

    for frnd in spltwse.getFriends():
        frnds += frnd.getFirstName()
        frnds += '\n'

    return frnds
def getMaxFriendOwed(access_token):
    sObj = Splitwise(consumer_key, consumer_secret)
    sObj.setAccessToken(access_token)
    friends = sObj.getFriends()
    maxSum = 100000
    maxFriend = ''
    for friend in friends:
        for balance in friend.getBalances():
            print balance.getAmount(), friend.getFirstName()
            if float(balance.getAmount()) < maxSum:

                maxSum = float(balance.getAmount())
                maxFriend = friend.getFirstName()
    #print "Max friend " + maxFriend + " Max Balance " + maxSum
    status_code = 200
    payload = {'friend': maxFriend, 'amount': float(maxSum)}
    return status_code, payload
def getSplitWiseBalance(access_token):
    if access_token is not None:
        sObj = Splitwise(consumer_key, consumer_secret)
        sObj.setAccessToken(access_token)
        status_code = 200
        friends = sObj.getFriends()
        owedSum = 0
        oweSum = 0
        for friend in friends:
            for balance in friend.getBalances():
                if float(balance.getAmount()) > 0:
                    owedSum = owedSum + float(balance.getAmount())
                elif float(balance.getAmount()) < 0:
                    oweSum = oweSum + float(balance.getAmount())
        payload = {'owedShare': owedSum, 'oweShare': oweSum}
    else:
        status_code = 400
        payload = {"error": "can not access splitwise data"}
    return status_code, payload
Exemplo n.º 12
0
class SplitwiseInterface:
    def __init__(self):
        self.consumer_key = getConsumerKey()
        self.consumer_secret = getConsumerSecret()
        self.oauth_verifier = None
        self.oauth_token = None
        self.access_token = getAccessToken()
        self.login_secret = None
        self.url = None
        self.sObj = Splitwise(self.consumer_key, self.consumer_secret)
        self.sObj.setAccessToken(self.access_token)

    def accessCheck(self) -> None:
        """
        Checks for access token. Starts login process if not
        """

        if self.access_token:
            return
        self.access_token = self.login()

    def login(self) -> None:
        """
        Logs into Splitwise. Requires manually entering the token and verifier
        """

        sObj = Splitwise(self.consumer_key, self.consumer_secret)
        self.url, self.login_secret = sObj.getAuthorizeURL()
        print(self.url)
        self.oauth_token = input('token: ')
        self.oauth_verifier = input('verifier: ')

    def authorize(self) -> None:
        """
        Authorizes app to Splitwise
        """

        if not self.login_secret:
            #TODO trigger error
            self.login()

        sObj = Splitwise(self.consumer_key, self.consumer_secret)
        self.access_token = sObj.getAccessToken(self.oauth_token,
                                                self.login_secret,
                                                self.oauth_verifier)

    def friends(self) -> List['Friend']:
        """
        Returns list of Friend objects for the current user
        """

        return self.sObj.getFriends()

    def getCurrentUser(self) -> 'CurrentUser':
        """
        Returns CurrentUser object for the current user
        """
        return self.sObj.getCurrentUser()

    def getGroup(self, group_id: int) -> 'Group':
        """
        Returns Group object for the given group_id
        """
        return self.sObj.getGroup(group_id)

    def getGroupMemberIDs(self, group: 'Group') -> Dict[str, int]:
        """
        Returns a dict of group members {name:id} from a given Group object
        """
        member_object_list = group.getMembers()
        member_dict = {}
        for member in member_object_list:
            member_dict[member.getFirstName()] = member.getId()
        return member_dict

    def addExpense(self, cost: float, description: str, group_id: int,
                   payer: str) -> None:
        """
        Adds expense to Splitwise group. If expenses don't evenly get 
        distributed, it will randomly assign pennies to even things off
        """
        expense = Expense()
        expense.setCost(str(cost))
        expense.setDescription(description)
        expense.setGroupId(group_id)

        group = self.sObj.getGroup(group_id)
        member_dict = self.getGroupMemberIDs(group)
        member_count = len(member_dict)
        per_person_cost = round(cost / member_count, 2)
        expense_members = []
        print(per_person_cost * member_count, cost)
        for member in member_dict:
            expense_user = ExpenseUser()
            expense_user.setId(member_dict[member])
            expense_user.setFirstName(member)
            expense_user.setOwedShare(str(per_person_cost))

            if member == payer:
                expense_user.setPaidShare(cost)
            else:
                expense_user.setPaidShare('0.00')

            expense_members.append(expense_user)

        if cost < per_person_cost * member_count:
            remainder = (per_person_cost * float(member_count)) - cost
            shuffle(expense_members)
            i = 0
            while remainder > 0.00:
                owed = float(expense_members[i].getOwedShare())
                owed -= 0.01
                expense_members[i].setOwedShare(str(owed))
                remainder -= 0.01
                if i == member_count - 1:
                    i = 0
                else:
                    i += 1

        elif cost > per_person_cost * member_count:
            remainder = round(cost - (per_person_cost * float(member_count)),
                              2)
            print(remainder)
            shuffle(expense_members)
            i = 0
            while remainder > 0.00:
                owed = float(expense_members[i].getOwedShare())
                owed += 0.01
                expense_members[i].setOwedShare(str(owed))
                remainder -= 0.01
                if i == member_count - 1:
                    i = 0
                else:
                    i += 1

        expense.setUsers(expense_members)
        expenses = self.sObj.createExpense(expense)
        print('Successfully added to Splitwise. Expense ID:', expenses.getId())