Passed
Push — master ( 091649...54f033 )
by William
01:52
created

app.main.users()   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, send_file
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, Skip
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
    # get today's date
20
    todaydate = datetime.today().strftime('%A, %B %d, %Y')
21
22
    # query the latest balance information
23
    balance = Balance.query.order_by(desc(Balance.date), desc(Balance.id)).first()
24
25
    try:
26
        if balance.amount:
27
            db.session.query(Balance).delete()
28
            balance = Balance(amount=balance.amount, date=datetime.today())
29
            db.session.add(balance)
30
            db.session.commit()
31
    except:
32
        balance = Balance(amount='0',
33
                          date=datetime.today())
34
        db.session.add(balance)
35
        db.session.commit()
36
37
    # empty the tables to create fresh data from the schedule
38
    db.session.query(Total).delete()
39
    db.session.query(Running).delete()
40
    db.session.query(Transactions).delete()
41
    db.session.commit()
42
43
    # calculate total events for the year amount
44
    calc_schedule()
45
46
    # calculate sum of running transactions
47
    calc_transactions(balance)
48
49
    # plot cash flow results
50
    minbalance, graphJSON = plot_cash()
51
52
    user = User.query.filter_by(id=current_user.get_id()).first()
53
54
    if user.admin:
55
        return render_template('index.html', title='Index', todaydate=todaydate, balance=balance.amount,
56
                           minbalance=minbalance, graphJSON=graphJSON)
57
    else:
58
        return render_template('index_guest.html', title='Index', todaydate=todaydate, balance=balance.amount,
59
                           minbalance=minbalance, graphJSON=graphJSON)
60
61
62
@main.route('/profile')
63
@login_required
64
def profile():
65
    user = User.query.filter_by(id=current_user.get_id()).first()
66
67
    if user.admin:
68
        return render_template('profile.html')
69
    else:
70
        return render_template('profile_guest.html')
71
72
73
@main.route('/settings')
74
@login_required
75
def settings_page():
76
77
    return render_template('settings.html')
78
79
80
@main.route('/schedule')
81
@login_required
82
def schedule():
83
    schedule = Schedule.query.order_by(asc(extract('day', Schedule.startdate)))
84
85
    return render_template('schedule_table.html', title='Schedule Table', schedule=schedule)
86
87
88
@main.route('/holds')
89
@login_required
90
def holds():
91
    hold = Hold.query
92
    skip = Skip.query
93
94
    return render_template('holds_table.html', title='Holds Table', hold=hold, skip=skip)
95
96
97
@main.route('/create', methods=('GET', 'POST'))
98
@login_required
99
def create():
100
    # create a new schedule item
101
    format = '%Y-%m-%d'
102
    if request.method == 'POST':
103
        name = request.form['name']
104
        amount = request.form['amount']
105
        frequency = request.form['frequency']
106
        startdate = request.form['startdate']
107
        type = request.form['type']
108
        schedule = Schedule(name=name,
109
                          type=type,
110
                          amount=amount,
111
                          frequency=frequency,
112
                          startdate=datetime.strptime(startdate, format).date())
113
        existing = Schedule.query.filter_by(name=name).first()
114
        if existing:
115
            flash("Schedule already exists")
116
            return redirect(url_for('main.schedule'))
117
        db.session.add(schedule)
118
        db.session.commit()
119
        flash("Added Successfully")
120
121
        return redirect(url_for('main.schedule'))
122
123
    return redirect(url_for('main.schedule'))
124
125
126
@main.route('/update', methods=['GET', 'POST'])
127
@login_required
128
def update():
129
    # update an existing schedule item
130
    format = '%Y-%m-%d'
131
132
    if request.method == 'POST':
133
        current = Schedule.query.filter_by(id=request.form['id']).first()
134
        existing = Schedule.query.filter_by(name=request.form['name']).first()
135
        if existing:
136
            if current.name != request.form['name']:
137
                flash("Schedule name already exists")
138
                return redirect(url_for('main.schedule'))
139
        my_data = Schedule.query.get(request.form.get('id'))
140
        my_data.name = request.form['name']
141
        my_data.amount = request.form['amount']
142
        my_data.type = request.form['type']
143
        my_data.frequency = request.form['frequency']
144
        my_data.startdate = request.form['startdate']
145
        startdate = request.form['startdate']
146
        my_data.startdate = datetime.strptime(startdate, format).date()
147
        db.session.commit()
148
        flash("Updated Successfully")
149
150
        return redirect(url_for('main.schedule'))
151
152
    return redirect(url_for('main.schedule'))
153
154
155
@main.route('/addhold/<id>')
156
@login_required
157
def addhold(id):
158
    # add a hold item from the schedule
159
    schedule = Schedule.query.filter_by(id=id).first()
160
    hold = Hold(name=schedule.name, type=schedule.type, amount=schedule.amount)
161
    db.session.add(hold)
162
    db.session.commit()
163
164
    return redirect(url_for('main.schedule'))
165
166
167
@main.route('/addskip/<id>')
168
@login_required
169
def addskip(id):
170
    # add a skip item from the schedule
171
    transaction = Transactions.query.filter_by(id=id).first()
172
    trans_type = ""
173
    if transaction.type == "Expense":
174
        trans_type = "Income"
175
    elif transaction.type == "Income":
176
        trans_type = "Expense"
177
    skip = Skip(name=transaction.name + " (SKIP)", type=trans_type, amount=transaction.amount, date=transaction.date)
178
    db.session.add(skip)
179
    db.session.commit()
180
181
    return redirect(url_for('main.transactions'))
182
183
184
@main.route('/deletehold/<id>')
185
@login_required
186
def holds_delete(id):
187
    # delete a hold item
188
    hold = Hold.query.filter_by(id=id).first()
189
190
    if hold:
191
        db.session.delete(hold)
192
        db.session.commit()
193
        flash("Deleted Successfully")
194
195
    return redirect(url_for('main.holds'))
196
197
198
@main.route('/deleteskip/<id>')
199
@login_required
200
def skips_delete(id):
201
    # delete a skip item
202
    skip = Skip.query.filter_by(id=id).first()
203
204
    if skip:
205
        db.session.delete(skip)
206
        db.session.commit()
207
        flash("Deleted Successfully")
208
209
    return redirect(url_for('main.holds'))
210
211
212
@main.route('/clearholds')
213
@login_required
214
def clear_holds():
215
    # clear holds
216
217
    db.session.query(Hold).delete()
218
    db.session.commit()
219
220
    return redirect(url_for('main.holds'))
221
222
223
@main.route('/clearskips')
224
@login_required
225
def clear_skips():
226
    # clear skips
227
228
    db.session.query(Skip).delete()
229
    db.session.commit()
230
231
    return redirect(url_for('main.index'))
232
233
234
@main.route('/delete/<id>')
235
@login_required
236
def schedule_delete(id):
237
    # delete a schedule item
238
    schedule = Schedule.query.filter_by(id=id).first()
239
240
    if schedule:
241
        db.session.delete(schedule)
242
        db.session.commit()
243
        flash("Deleted Successfully")
244
245
    return redirect(url_for('main.schedule'))
246
247
248
@main.route('/favicon')
249
def favicon():
250
    return send_from_directory(os.path.join(main.root_path, 'static'),
251
                               'favicon.ico', mimetype='image/vnd.microsoft.icon')
252
253
254
@main.route('/appleicon')
255
def appleicon():
256
    return send_from_directory(os.path.join(main.root_path, 'static'),
257
                               'apple-touch-icon.png', mimetype='image/png')
258
259
260
@main.route('/balance', methods=('GET', 'POST'))
261
@login_required
262
def balance():
263
    # manually update the balance from the balance button
264
    format = '%Y-%m-%d'
265
    if request.method == 'POST':
266
        amount = request.form['amount']
267
        dateentry = request.form['date']
268
        balance = Balance(amount=amount,
269
                          date=datetime.strptime(dateentry, format).date())
270
        db.session.add(balance)
271
        db.session.commit()
272
273
        return redirect(url_for('main.index'))
274
275
276
@main.route('/changepw', methods=('GET', 'POST'))
277
@login_required
278
def changepw():
279
    # change the users password from the profile page
280
    if request.method == 'POST':
281
        curr_user = current_user.id
282
        my_user = User.query.filter_by(id=curr_user).first()
283
        password = request.form['password']
284
        my_user.password = generate_password_hash(password, method='scrypt')
285
        db.session.commit()
286
287
        return redirect(url_for('main.profile'))
288
289
    return redirect(url_for('main.profile'))
290
291
292
@main.route('/settings', methods=('GET', 'POST'))
293
@login_required
294
def settings():
295
    # set the settings options, in this case disable signups, from the profile page
296
    if request.method == 'POST':
297
        signupsettingname = Settings.query.filter_by(name='signup').first()
298
299
        if signupsettingname:
300
            signupvalue = request.form['signupvalue']
301
            signupsettingname.value = eval(signupvalue)
302
            db.session.commit()
303
304
            return redirect(url_for('main.profile'))
305
306
        # store the signup option value in the database to check when the user clicks signup
307
        signupvalue = request.form['signupvalue']
308
        signupvalue = eval(signupvalue)
309
        settings = Settings(name="signup",
310
                          value=signupvalue)
311
        db.session.add(settings)
312
        db.session.commit()
313
314
        return redirect(url_for('main.profile'))
315
316
    return redirect(url_for('main.profile'))
317
318
319
@main.route('/transactions')
320
@login_required
321
def transactions():
322
    total = Transactions.query
323
324
    return render_template('transactions_table.html', total=total)
325
326
327
@main.route('/email', methods=('GET', 'POST'))
328
@login_required
329
def email():
330
    # set the users email address, password, and server for the auto email balance update
331
    if request.method == 'POST':
332
        emailsettings = Email.query.filter_by(id=1).first()
333
334
        if emailsettings:
335
            email = request.form['email']
336
            password = request.form['password']
337
            server = request.form['server']
338
            subjectstr = request.form['subject_str']
339
            startstr = request.form['start_str']
340
            endstr = request.form['end_str']
341
            emailsettings.email = email
342
            emailsettings.password = password
343
            emailsettings.server = server
344
            emailsettings.subjectstr = subjectstr
345
            emailsettings.startstr = startstr
346
            emailsettings.endstr = endstr
347
            db.session.commit()
348
349
            return redirect(url_for('main.profile'))
350
351
        email = request.form['email']
352
        password = request.form['password']
353
        server = request.form['server']
354
        subjectstr = request.form['subject_str']
355
        startstr = request.form['start_str']
356
        endstr = request.form['end_str']
357
        emailentry = Email(email=email, password=password, server=server, subjectstr=subjectstr, startstr=startstr,
358
                           endstr=endstr)
359
        db.session.add(emailentry)
360
        db.session.commit()
361
362
        return redirect(url_for('main.profile'))
363
364
    return redirect(url_for('main.profile'))
365
366
367
@main.route('/users_table')
368
@login_required
369
def users():
370
    users = User.query
371
372
    return render_template('users_table.html', title='Users Table', users=users)
373
374
375
@main.route('/update_user', methods=['GET', 'POST'])
376
@login_required
377
def update_user():
378
    # update an existing user
379
380
    if request.method == 'POST':
381
        current = User.query.filter_by(id=request.form['id']).first()
382
        existing = User.query.filter_by(email=request.form['email']).first()
383
        if existing:
384
            if current.email != request.form['email']:
385
                flash("Email already exists")
386
                return redirect(url_for('main.users'))
387
        my_data = User.query.get(request.form.get('id'))
388
        my_data.name = request.form['name']
389
        my_data.email = request.form['email']
390
        my_data.admin = eval(request.form['admin'])
391
        db.session.commit()
392
        flash("Updated Successfully")
393
394
        return redirect(url_for('main.users'))
395
396
    return redirect(url_for('main.users'))
397
398
399
@main.route('/delete_user/<id>')
400
@login_required
401
def delete_user(id):
402
    # delete a schedule item
403
    user = User.query.filter_by(id=id).first()
404
405
    if user:
406
        db.session.delete(user)
407
        db.session.commit()
408
        flash("Deleted Successfully")
409
410
    return redirect(url_for('main.users'))
411
412
413
@main.route('/create_user', methods=('GET', 'POST'))
414
@login_required
415
def create_user():
416
    # create a new user
417
418
    if request.method == 'POST':
419
        name = request.form['name']
420
        email = request.form['email']
421
        admin = eval(request.form['admin'])
422
        password = generate_password_hash(request.form['password'], method='scrypt')
423
        user = User(name=name, email=email, admin=admin, password=password)
424
        existing = User.query.filter_by(email=email).first()
425
        if existing:
426
            flash("User already exists")
427
            return redirect(url_for('main.users'))
428
        db.session.add(user)
429
        db.session.commit()
430
        flash("Added Successfully")
431
432
        return redirect(url_for('main.users'))
433
434
    return redirect(url_for('main.users'))
435
436
437
@main.route('/manifest.json')
438
def serve_manifest():
439
    return send_file('manifest.json', mimetype='application/manifest+json')
440
441
442
@main.route('/sw.js')
443
def serve_sw():
444
    return send_file('sw.js', mimetype='application/javascript')
445