def budgets(year=None): """Manage budgets""" # Make sure the year from route is valid if year: currentYear = datetime.now().year if not 2020 <= year <= currentYear: return apology( f"Please select a valid budget year: 2020 through {currentYear}" ) else: # Set year to current year if it was not in the route (this will set UX to display current years budgets) year = datetime.now().year # User reached route via GET if request.method == "GET": # Get the users income income = tendie_account.getIncome(session["user_id"]) # Get the users current budgets budgets = tendie_budgets.getBudgets(session["user_id"]) # Get the users total budgeted amount budgeted = tendie_budgets.getTotalBudgetedByYear( session["user_id"], year) return render_template("budgets.html", income=income, budgets=budgets, year=year, budgeted=budgeted, deletedBudgetName=None) # User reached route via POST else: # Get the name of the budget the user wants to delete budgetName = request.form.get("delete").strip() # Delete the budget deletedBudgetName = tendie_budgets.deleteBudget( budgetName, session["user_id"]) # Render the budgets page with a success message, otherwise throw an error/apology if deletedBudgetName: # Get the users income, current budgets, and sum their budgeted amount unless they don't have any budgets (same steps as a GET for this route) income = tendie_account.getIncome(session["user_id"]) budgets = tendie_budgets.getBudgets(session["user_id"]) budgeted = tendie_budgets.getTotalBudgetedByYear( session["user_id"], year) return render_template("budgets.html", income=income, budgets=budgets, year=year, budgeted=budgeted, deletedBudgetName=deletedBudgetName) else: return apology("Uh oh! Your budget could not be deleted.")
def budgets(): """Manage budgets""" # User reached route via GET if request.method == "GET": # Get the users income income = tendie_account.getIncome(session["user_id"]) # Get the users current budgets budgets = tendie_budgets.getBudgets(session["user_id"]) # Get the users total budgeted amount budgeted = tendie_budgets.getTotalBudgeted(session["user_id"]) return render_template("budgets.html", income=income, budgets=budgets, budgeted=budgeted, deletedBudgetName=None) # User reached route via POST else: # Get the name of the budget the user wants to delete budgetName = request.form.get("delete").strip() # Delete the budget deletedBudgetName = tendie_budgets.deleteBudget( budgetName, session["user_id"]) # Render the budgets page with a success message, otherwise throw an error/apology if deletedBudgetName: # Get the users income, current budgets, and sum their budgeted amount unless they don't have any budgets (same steps as a GET for this route) income = tendie_account.getIncome(session["user_id"]) budgets = tendie_budgets.getBudgets(session["user_id"]) budgeted = tendie_budgets.getTotalBudgeted(session["user_id"]) return render_template("budgets.html", income=income, budgets=budgets, budgeted=budgeted, deletedBudgetName=deletedBudgetName) else: return apology("Uh oh! Your budget could not be deleted.")
def updatebudget(urlvar_budgetname): """Update a budget""" # User reached route via POST if request.method == "POST": # Get all of the budget info provided from the HTML form formData = list(request.form.items()) # Remove CSRF field from form data before processing formData.pop(0) # Generate data structure to hold budget info from form budgetDict = tendie_budgets.generateBudgetFromForm(formData) # Render error message if budget name or categories contained invalid data if "apology" in budgetDict: return apology(budgetDict["apology"]) else: # Update budget in the DB for user budget = tendie_budgets.updateBudget(urlvar_budgetname, budgetDict, session["user_id"]) # Render error message if budget name is a duplicate of another budget the user has if "apology" in budget: return apology(budget["apology"]) else: return render_template("budgetcreated.html", results=budget) # User reached route via GET else: # Get the budget details from the DB based on the budget name provided via URL. Throw an apology/error if budget can't be found. budgetID = tendie_budgets.getBudgetID(urlvar_budgetname, session["user_id"]) if budgetID is None: return apology("'" + urlvar_budgetname + "' budget does not exist") else: budget = tendie_budgets.getBudgetByID(budgetID, session["user_id"]) # Get the users income income = tendie_account.getIncome(session["user_id"]) # Get the users total budgeted amount budgeted = tendie_budgets.getTotalBudgetedByYear( session["user_id"], budget['year']) # Generate the full, updatable budget data structure (name, amount for budget w/ all categories and their budgeted amounts) budget = tendie_budgets.getUpdatableBudget(budget, session["user_id"]) # Render the budget update page return render_template("updatebudget.html", income=income, budgeted=budgeted, budget=budget)
def createbudget(): """Create a budget""" # User reached route via POST if request.method == "POST": # Make sure user has no more than 20 budgets (note: 20 is an arbitrary value) budgets = tendie_budgets.getBudgets(session["user_id"]) if budgets: budgetCount = 0 for year in budgets: budgetCount += len(budgets[year]) if budgetCount >= 20: return apology("You've reached the max amount of budgets'") # Get all of the budget info provided from the HTML form formData = list(request.form.items()) # Remove CSRF field from form data before processing formData.pop(0) # Generate data structure to hold budget info from form budgetDict = tendie_budgets.generateBudgetFromForm(formData) # Render error message if budget name or categories contained invalid data if "apology" in budgetDict: return apology(budgetDict["apology"]) else: # Add budget to DB for user budget = tendie_budgets.createBudget(budgetDict, session["user_id"]) # Render error message if budget name is a duplicate of another budget the user has if "apology" in budget: return apology(budget["apology"]) else: return render_template("budgetcreated.html", results=budget) else: # Get the users income income = tendie_account.getIncome(session["user_id"]) # Get the users total budgeted amount budgeted = tendie_budgets.getTotalBudgetedByYear(session["user_id"]) # Get the users spend categories categories = tendie_categories.getSpendCategories(session["user_id"]) return render_template("createbudget.html", income=income, budgeted=budgeted, categories=categories)
def index(): """Show dashboard of budget/expenses""" # User reached route via GET if request.method == "GET": # TODO reduce or completely remove the redundant use of javascript code in dashboard.js and reports.js # Initialize metrics to None to render the appropriate UX if data does not exist yet for the user expenses_year = None expenses_month = None expenses_week = None expenses_last5 = None spending_week = [] spending_month = [] # Get the users spend categories (for quick expense modal) categories = tendie_categories.getSpendCategories(session["user_id"]) # Get the users payers (for quick expense modal) payers = tendie_account.getPayers(session["user_id"]) # Get todays date (for quick expense modal) date = datetime.today().strftime('%Y-%m-%d') # Get the users income income = tendie_account.getIncome(session["user_id"]) # Get current years total expenses for the user expenses_year = tendie_dashboard.getTotalSpend_Year(session["user_id"]) # Get current months total expenses for the user expenses_month = tendie_dashboard.getTotalSpend_Month( session["user_id"]) # Get current week total expenses for the user expenses_week = tendie_dashboard.getTotalSpend_Week(session["user_id"]) # Get last 5 expenses for the user expenses_last5 = tendie_dashboard.getLastFiveExpenses( session["user_id"]) # Get every budgets spent/remaining for the user budgets = tendie_dashboard.getBudgets(session["user_id"]) # Get weekly spending for the user weeks = tendie_dashboard.getLastFourWeekNames() spending_week = tendie_dashboard.getWeeklySpending( weeks, session["user_id"]) # Get monthly spending for the user (for the current year) spending_month = tendie_dashboard.getMonthlySpending( session["user_id"]) # Get spending trends for the user spending_trends = tendie_dashboard.getSpendingTrends( session["user_id"]) # Get payer spending for the user payersChart = tendie_reports.generatePayersReport(session["user_id"]) return render_template("index.html", categories=categories, payers=payers, date=date, income=income, expenses_year=expenses_year, expenses_month=expenses_month, expenses_week=expenses_week, expenses_last5=expenses_last5, budgets=budgets, spending_week=spending_week, spending_month=spending_month, spending_trends=spending_trends, payersChart=payersChart) # User reached route via POST else: # Get all of the expenses provided from the HTML form formData = list(request.form.items()) # Add expenses to the DB for user expenses = tendie_expenses.addExpenses(formData, session["user_id"]) # Redirect to results page and render a summary of the submitted expenses return render_template("expensed.html", results=expenses)