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()
        }})
示例#2
0
 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
         }})
示例#3
0
 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
             }
         }})
示例#4
0
 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})
示例#5
0
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))
示例#6
0
 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})
示例#7
0
    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))
示例#8
0
 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))
示例#9
0
 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))
示例#10
0
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))
示例#11
0
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()