def update_balance_sheet(group_id): """ This method helps in updating the balance sheet and settling all the expenses for a group since the last settlement was done. :param group_id: :return: """ group_details = dbconn.get_collection('groups').find_one({"_id": group_id}) print("Running Split Job on {0} after time {1}".format( group_details['group_name'], group_details['last_settlement_on'])) for expense in dbconn.get_collection('expenditures').find({ 'group_id': group_id, 'time': { '$gt': group_details['last_settlement_on'] } }): split_expense = expense['amount'] / len(expense['shared_between']) lender = expense['member_id'] borrower_set = set(expense['shared_between']) - set(lender) for borrower in borrower_set: ''' db.members.update( {'_id':'nir', 'borrowing.group_id':'grp_tst','borrowing.member_id':'tst1'} ,{$inc:{'borrowing.$.amount':100}} ,{upsert:true} ) db.members.update( {'_id':'nir'} ,{'$addToSet': {'borrowing':{ 'group_id':'grp_tst','member_id':'tst1','amount':100}}} ) ''' try: dbconn.get_collection('members')\ .update_one( {'_id':borrower, 'borrowing.group_id':group_id,'borrowing.member_id':lender} ,{'$inc':{'borrowing.$.amount':split_expense}}) except pymongoerrors.WriteError.code == 16836: print( 'You have never borrowed from this person. Running alternate update command.' ) # Added for testing dbconn.get_collection('members')\ .update_one( {"_id":borrower} ,{'$addToSet': {'borrowing':{'group_id':group_id,'member_id':lender,'amount':split_expense}}}) dbconn.get_collection('expenditures').update_one( {'_id': ObjectId(expense['_id'])}, {'$set': { 'settled': True }}) dbconn.get_collection('groups').update_one( {"_id": group_id}, {'$set': { 'last_settlement_on': datetime.utcnow() }})
def add_members_to_group(group_id, member_list): """ This method is called when adding new members to a group. :param group_id: :param member_list: :return: """ dbconn.get_collection('groups').update_one( {"_id": group_id}, {"$addToSet": { "member_list": member_list }})
def remove_members_from_group(group_id, member_list): """ This method will be called while removing list of members from a group. :param group_id: :param member_list: :return: """ dbconn.get_collection('groups').update_one( {"_id": group_id}, {"$pull": { "member_list": { "$in": member_list } }})
def get_member_info(self): """ This method will return the details for the member :return: Member Details """ return dbconn.get_collection('members').find_one( {"_id": self._member_id})
def create_member(): """ This methods helps register a new member to the application. :return: """ from homepage import home_page # The import statement was put here to resolve circular dependency try: while True: username = input("Enter a unique username: "******"_id": username}) if check_db_for_user: print( "Username {0} already exists. Choose a different username." .format(username)) else: break name = input("Enter your name: ") password = input("Enter Password: "******"Your account has been created.") home_page() except Exception as e: print(e, type(e))
def get_group_details(group_id): """ Returns the group details from database. :param group_id: :return: """ return dbconn.get_collection('groups').find_one({"_id": group_id})
def save_member(self): """ This method will save the member in the database Exception: ConnectionError or Generic Exception with exception error and type """ try: doc = { "_id": self._member_id, "name": self._name, "password": self._password, "added_on": datetime.utcnow(), "member_of_groups": self._member_of_groups } dbconn.get_collection('members').insert_one(doc, 'members') except pymongoerrors.DuplicateKeyError: print("Oops! User ID is already taken.") except Exception as e: print(e, type(e))
def save_expenditure(group_id, member_id, amount, time, shared_between): """ This method saves the expenditure to the database. :param group_id: :param member_id: :param amount: :param time: :param shared_between: :return: """ try: doc = { "group_id": group_id, "member_id": member_id, "amount": amount, "time": time, "shared_between": shared_between } dbconn.get_collection('expenditures').insert_one(doc) except Exception as e: print(e, type(e))
def save_group(group_id, group_name, admin_list, member_list=[]): """ This method is called when creating a new group. This will store information in the database. :param group_id: :param group_name: :param admin_list: :param member_list: :return: """ try: doc = { "_id": group_id, "group_name": group_name, "members_list": member_list, "admin_list": admin_list } dbconn.get_collection('groups').insert_one(doc) print("Group Created Successfully") except pymongoerrors.DuplicateKeyError: print("Oops! User ID is already taken.") except Exception as e: print(e, type(e))
def login_member(): """ This method helps the registered user to login to the application :return: """ try: while True: username = input("Enter your username: "******"Enter your password: "******"_id":username}) if check_db_for_user is None: print("User doesn't exist.") else: hashed_password = check_db_for_user['password'] if check_password(hashed_password, user_password): print("Great! Your details match our records.") break session.user_details = check_db_for_user print("Hello, {0}. Here are your account details: \n".format(session.user_details['name'].split()[0])) print(check_db_for_user) # Fix Password being showed to user except Exception as e: print(e, type(e))
def after_login(): """ This method helps render the page after login is successful and ask for further inputs. :return: """ after_login_page_choice = int( input("Enter 1 to check an existing group \n" "Enter 2 to create a new group \n" "Enter 3 to LogOut \n")) if after_login_page_choice == 1: if len(session.user_details['member_of_groups']) == 0: print("You are currently not a member of any group.") after_login() else: print("You are member of groups {0}".format( session.user_details['member_of_groups'])) while True: global group_selection group_selection = input( "Which group would you like to check? Enter 1 to go back ") if group_selection == 1: after_login() elif group_selection not in session.user_details[ 'member_of_groups']: print("You are not a member of this group.") after_login() else: print("Here are the details from this group: \n") global group_details group_details = Group.get_group_details(group_selection) print(group_details) add_expense() elif after_login_page_choice == 2: print("Ok {0}. Let's create a new group for you.".format( session.user_details['name'].split()[0])) while True: try: group_id = input('Enter a unique group ID: ') group_name = input('Enter a group name: ') Group.save_group(group_id, group_name, [ session.user_details["_id"], ], [ session.user_details["_id"], ]) session.user_details = dbconn.get_collection('members')\ .find_and_modify( query={"_id": session.user_details['name']}, update={"$addToSet": { "member_of_groups": group_id}}, new=True) after_login() except pymongoerrors.DuplicateKeyError: break except Exception as e: print(e, type(e)) elif after_login_page_choice == 3: print("LOGGED OUT") from homepage import home_page home_page()