Passed
Push — master ( 798d89...0fa119 )
by William
02:42
created

app.main.holds()   A

Complexity

Conditions 1

Size

Total Lines 6
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 5
nop 0
dl 0
loc 6
rs 10
c 0
b 0
f 0
1
from flask import request, redirect, url_for, send_from_directory, flash
2
from flask_login import login_required, current_user
3
from flask import Blueprint, render_template
4
from .models import Schedule, Balance, Total, Running, User, Settings, Transactions, Email, Hold
5
from app import db
6
from datetime import datetime
7
import os
8
from sqlalchemy import desc, extract, asc
9
from werkzeug.security import generate_password_hash
10
from .cashflow import calc_schedule, calc_transactions, plot_cash
11
12
13
main = Blueprint('main', __name__)
14
15
16
@main.route('/', methods=('GET', 'POST'))
17
@login_required
18
def index():
19
    # query the latest balance information
20
    balance = Balance.query.order_by(desc(Balance.date), desc(Balance.id)).first()
21
22
    try:
23
        if balance.amount:
24
            db.session.query(Balance).delete()
25
            balance = Balance(amount=balance.amount, date=datetime.today())
26
            db.session.add(balance)
27
            db.session.commit()
28
    except:
29
        balance = Balance(amount='0',
30
                          date=datetime.today())
31
        db.session.add(balance)
32
        db.session.commit()
33
34
    # empty the tables to create fresh data from the schedule
35
    db.session.query(Total).delete()
36
    db.session.query(Running).delete()
37
    db.session.query(Transactions).delete()
38
    db.session.commit()
39
40
    # retrieve the number of years for the cash flow plot
41
    yearamount = request.form.get('yearamount')
42
43
    # calculate total events for the year amount
44
    calc_schedule(yearamount)
45
46
    # calculate sum of running transactions
47
    calc_transactions(balance)
48
49
    # plot cash flow results
50
    minbalance, graphJSON = plot_cash()
51
52
    return render_template('index.html', title='Index', balance=balance.amount, minbalance=minbalance,
53
                           graphJSON=graphJSON)
54
55
56
@main.route('/profile')
57
@login_required
58
def profile():
59
60
    return render_template('profile.html')
61
62
63
@main.route('/schedule')
64
@login_required
65
def schedule():
66
    schedule = Schedule.query.order_by(asc(extract('day', Schedule.startdate)))
67
68
    return render_template('schedule_table.html', title='Schedule Table', schedule=schedule)
69
70
71
@main.route('/holds')
72
@login_required
73
def holds():
74
    hold = Hold.query
75
76
    return render_template('holds_table.html', title='Holds Table', hold=hold)
77
78
79
@main.route('/create', methods=('GET', 'POST'))
80
@login_required
81
def create():
82
    # create a new schedule item
83
    format = '%Y-%m-%d'
84
    if request.method == 'POST':
85
        name = request.form['name']
86
        amount = request.form['amount']
87
        frequency = request.form['frequency']
88
        startdate = request.form['startdate']
89
        type = request.form['type']
90
        schedule = Schedule(name=name,
91
                          type=type,
92
                          amount=amount,
93
                          frequency=frequency,
94
                          startdate=datetime.strptime(startdate, format).date())
95
        db.session.add(schedule)
96
        db.session.commit()
97
        flash("Added Successfully")
98
99
        return redirect(url_for('main.schedule'))
100
101
    return redirect(url_for('main.schedule'))
102
103
104
@main.route('/update', methods=['GET', 'POST'])
105
@login_required
106
def update():
107
    # update an existing schedule item
108
    format = '%Y-%m-%d'
109
110
    if request.method == 'POST':
111
        my_data = Schedule.query.get(request.form.get('id'))
112
        my_data.name = request.form['name']
113
        my_data.amount = request.form['amount']
114
        my_data.type = request.form['type']
115
        my_data.frequency = request.form['frequency']
116
        my_data.startdate = request.form['startdate']
117
        startdate = request.form['startdate']
118
        my_data.startdate = datetime.strptime(startdate, format).date()
119
        db.session.commit()
120
        flash("Updated Successfully")
121
122
        return redirect(url_for('main.schedule'))
123
124
    return redirect(url_for('main.schedule'))
125
126
127
@main.route('/addhold/<id>')
128
@login_required
129
def addhold(id):
130
    # add a hold item from the schedule
131
    schedule = Schedule.query.filter_by(id=id).first()
132
    hold = Hold(name=schedule.name, type=schedule.type, amount=schedule.amount)
133
    db.session.add(hold)
134
    db.session.commit()
135
136
    return redirect(url_for('main.schedule'))
137
138
139
@main.route('/deletehold/<id>')
140
@login_required
141
def holds_delete(id):
142
    # delete a hold item
143
    hold = Hold.query.filter_by(id=id).first()
144
145
    if schedule:
146
        db.session.delete(hold)
147
        db.session.commit()
148
        flash("Deleted Successfully")
149
150
    return redirect(url_for('main.holds'))
151
152
153
@main.route('/clearholds')
154
@login_required
155
def clear_holds():
156
    # clear holds
157
158
    db.session.query(Hold).delete()
159
    db.session.commit()
160
161
    return redirect(url_for('main.index'))
162
163
164
@main.route('/delete/<id>')
165
@login_required
166
def schedule_delete(id):
167
    # delete a schedule item
168
    schedule = Schedule.query.filter_by(id=id).first()
169
170
    if schedule:
171
        db.session.delete(schedule)
172
        db.session.commit()
173
        flash("Deleted Successfully")
174
175
    return redirect(url_for('main.schedule'))
176
177
178
@main.route('/favicon')
179
def favicon():
180
    return send_from_directory(os.path.join(main.root_path, 'static'),
181
                               'favicon.ico', mimetype='image/vnd.microsoft.icon')
182
183
184
@main.route('/appleicon')
185
def appleicon():
186
    return send_from_directory(os.path.join(main.root_path, 'static'),
187
                               'apple-touch-icon.png', mimetype='image/png')
188
189
190
@main.route('/balance', methods=('GET', 'POST'))
191
@login_required
192
def balance():
193
    # manually update the balance from the balance button
194
    format = '%Y-%m-%d'
195
    if request.method == 'POST':
196
        amount = request.form['amount']
197
        dateentry = request.form['date']
198
        balance = Balance(amount=amount,
199
                          date=datetime.strptime(dateentry, format).date())
200
        db.session.add(balance)
201
        db.session.commit()
202
203
        return redirect(url_for('main.index'))
204
205
206
@main.route('/changepw', methods=('GET', 'POST'))
207
@login_required
208
def changepw():
209
    # change the users password from the profile page
210
    if request.method == 'POST':
211
        curr_user = current_user.id
212
        my_user = User.query.filter_by(id=curr_user).first()
213
        password = request.form['password']
214
        my_user.password = generate_password_hash(password, method='scrypt')
215
        db.session.commit()
216
217
        return redirect(url_for('main.profile'))
218
219
    return redirect(url_for('main.profile'))
220
221
222
@main.route('/settings', methods=('GET', 'POST'))
223
@login_required
224
def settings():
225
    # set the settings options, in this case disable signups, from the profile page
226
    if request.method == 'POST':
227
        signupsettingname = Settings.query.filter_by(name='signup').first()
228
229
        if signupsettingname:
230
            signupvalue = request.form['signupvalue']
231
            signupsettingname.value = eval(signupvalue)
232
            db.session.commit()
233
234
            return redirect(url_for('main.profile'))
235
236
        # store the signup option value in the database to check when the user clicks signup
237
        signupvalue = request.form['signupvalue']
238
        signupvalue = eval(signupvalue)
239
        settings = Settings(name="signup",
240
                          value=signupvalue)
241
        db.session.add(settings)
242
        db.session.commit()
243
244
        return redirect(url_for('main.profile'))
245
246
    return redirect(url_for('main.profile'))
247
248
249
@main.route('/transactions')
250
@login_required
251
def transactions():
252
    total = Transactions.query
253
254
    return render_template('transactions_table.html', total=total)
255
256
257
@main.route('/email', methods=('GET', 'POST'))
258
@login_required
259
def email():
260
    # set the users email address, password, and server for the auto email balance update
261
    if request.method == 'POST':
262
        emailsettings = Email.query.filter_by(id=1).first()
263
264
        if emailsettings:
265
            email = request.form['email']
266
            password = request.form['password']
267
            server = request.form['server']
268
            emailsettings.email = email
269
            emailsettings.password = password
270
            emailsettings.server = server
271
            db.session.commit()
272
273
            return redirect(url_for('main.profile'))
274
275
        email = request.form['email']
276
        password = request.form['password']
277
        server = request.form['server']
278
        emailentry = Email(email=email, password=password, server=server)
279
        db.session.add(emailentry)
280
        db.session.commit()
281
282
        return redirect(url_for('main.profile'))
283
284
    return redirect(url_for('main.profile'))
285