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")
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)
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)
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
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)
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)
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")
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)
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
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())