from splitwise import Splitwise class SplitwiseClient: def __init__(self, config): self.config = config self.sw = Splitwise(config["consumer_key"], self.config["consumer_secret"], self.config["api_key"]) self.friend_name = self.config["friend_name"] self._user = None self._user_name = None self._user_id = None self._friends = None self._friend_ids = None self._friend_id = None self._friend = None self._expenses_included = None @property def user(self): if self._user is None: self._user = self.sw.getCurrentUser() return self._user @property def user_name(self): if self._user_name is None: first_name = self.user.getFirstName() last_name = self.user.getLastName() self._user_name = first_name + " " + last_name return self._user_name @property def user_id(self): if self._user_id is None: self._user_id = self.user.getId() return self._user_id @property def friends(self): if self._friends is None: self._friends = self.sw.getFriends() return self._friends @property def friend_ids(self): if self._friend_ids is None: self._friend_ids = {} for i, x in enumerate(self.friends): first_name = self.friends[i].getFirstName() last_name = self.friends[i].getLastName() name = first_name + " " + last_name id = self.friends[i].getId() self._friend_ids[name] = id return self._friend_ids @property def friend_id(self): if self._friend_id is None: self._friend_id = self.friend_ids[self.friend_name] return self._friend_id @property def friend(self): if self._friend is None: self._friend = self.sw.getUser(self.friend_id) return self._friend @property def expenses_included(self): if self._expenses_included is None: raise ValueError("Expenses included have not been set. Call set_expenses_included() first.") return self._expenses_included @property def debtor_name(self, debtor_id): if debtor_id == self.user_id: return self.user_name elif debtor_id == self.friend_ids[self.friend_name]: return self.friend_name else: raise ValueError("Debtor not found.") @property def creditor_name(self, creditor_id): if creditor_id == self.user_id: return self.user_name elif creditor_id == self.friend_ids[self.friend_name]: return self.friend_name else: raise ValueError("Creditor not found.") def set_expenses_included(self, date_cutoff=None): self._expenses_included = [ exp for exp in self.sw.getExpenses(limit=0, dated_after=date_cutoff) if exp.repayments[0].getToUser() == self.friend_ids[self.friend_name] ]