views_admin.py 23 KB
Newer Older
1
2
from app import app

3
from flask import render_template, request, redirect, url_for, session, flash, after_this_request, send_from_directory
4
5
6
7
8
9
10
11
12
13
14
15

import app.dao.user.user as ud
import app.dao.application.application as ad
import app.dao.device.device as dd
import app.dao.pend.pend as pend
import app.dao.data.data as data
import app.dao.notification.notification as nfs
import app.dao.trigger.trigger as tr
import app.dao.notification_queue.notification_queue as nq
import app.dao.misc.misc as md

#import app.helpers.misc as misc
16
from app.helpers.decorators import restricted
17
import app.helpers.device_data_model as ddm
18
import app.helpers.misc as misc
19

20
import binascii
21
import os
22
23
24
25


MAX_PG = 5
MAX_PG_ENTRIES_USERS = 10
26
27
MAX_PG_ENTRIES_DATA = 10
MAX_PG_ENTRIES_GRAPH_HOURS = 24
28

Vladislav Rykov's avatar
Vladislav Rykov committed
29

30
@app.route('/administration', methods=['GET', 'POST'])
31
@restricted('admin')
32
33
34
35
def administration():
    if request.method == 'GET':
        user_cnt = ud.get_count()[1][0]
        apps_cnt = ad.get_count()[1][0]
36
        devs_cnt = dd.get_count_all()[1][0]
37
38
39
40
41
42
43
44
45
46
47
        info = [user_cnt, apps_cnt, devs_cnt]

        return render_template('new/admin/administration.html', info=info)
    elif request.method == 'POST':
        if request.form.getlist('signup') and request.form.getlist('signup')[0] == 'on':
            app.config['USERS_SIGNUP'] = True
        else:
            app.config['USERS_SIGNUP'] = False
        
        return redirect(request.url)

48
49

@app.route('/administration/users')
50
@restricted('admin')
51
def administration_users():
52
53
54
55
56
    user_cnt = ud.get_count()[1][0]
    apps_cnt = ad.get_count()[1][0]
    devs_cnt = dd.get_count_all()[1][0]
    info = [user_cnt, apps_cnt, devs_cnt]
    
57
58
59
    cur_pg = 1
    users = ud.get_range([MAX_PG_ENTRIES_USERS, (cur_pg-1)*MAX_PG_ENTRIES_USERS])[1]

60
    return render_template('new/admin/users.html', users=users, info=info)
61
62


63
@app.route('/administration/<name>')
64
@restricted('admin', True)
65
def administration_user(name):
66
67
68
69
70
71
72
    created_apps = ad.get_count_by_user(name)[1][0]
    active_devices = dd.get_count_by_user(name)
    total_activity = md.get_user_data_count(name)[1][0]
    last_activity = md.get_user_data_count_per_day(name)[1][0]
    info = [created_apps, active_devices, total_activity, last_activity]

    return render_template('new/admin/user-dashboard.html', info=info, user=name)
73

74
@app.route('/administration/<name>/applications')
75
@restricted('admin', True)
76
def administration_user_applications(name):
77
78
79
80
    apps = ad.get_list(name)[1]
    return render_template('new/admin/user-applications.html', apps=apps, user=name)


81
@app.route('/administration/<name>/new-application', methods=['GET', 'POST'])
82
@restricted('admin', True)
83
def administration_user_new_application(name):
84
85
86
87
88
    if request.method == 'GET':
        return render_template('new/admin/user-new-application.html', user=name)
    elif request.method == 'POST':
        if request.form['appname'] == '':
            flash('Application name cannot be empty.', 'danger')
89
            return redirect(request.url)
90
91
92
93
94
95
96
97
98
99
100
101
        elif request.method == 'POST':
            appkey = misc.rand_str(app.config['APPKEY_LENGTH']).decode('utf-8')
            secure_key = misc.gen_skey_b64(16)
            secure = False

            if request.form.getlist('secure') and request.form.getlist('secure')[0] == 'on':
                secure = True

            res = ad.create(request.form['appname'], appkey, name, request.form['appdesc'], secure, secure_key)
        
            if not res[0]:
                flash('Error: {}'.format(res[1]), 'danger')
102
                return redirect(request.url)
103
        
104
            res = dd.create_table_ddm(appkey)
105
106
107
108
        
            if not res[0]:
                ad.delete(appkey)
                flash('Error: {}'.format(res[1]), 'danger')
109
                return redirect(request.url)
110
        
111
            return redirect(url_for('administration_user_applications', name=name))
112
113


114
@app.route('/administration/<name>/application/<appkey>')
115
@restricted('admin', True)
116
def administration_user_application(name, appkey):
117
118
119
120
121
122
123
    ap = list(ad.get(appkey)[1])
    ap[5] = misc.skey_b64_to_hex(ap[5])
    devs = dd.get_list(ap[1])[1]

    return render_template('new/admin/user-application.html', app=ap, devs=devs, user=name)


124
@app.route('/administration/<name>/application/<appkey>/add-device', methods=['GET', 'POST'])
125
@restricted('admin', True)
126
def administration_user_application_add_device(name, appkey):
127
128
129
    if request.method == 'GET':
        ap = ad.get(appkey)
        dev_list = dd.get_list(appkey)
130
        return render_template('new/admin/user-add-device.html', app=ap[1], free_ids=misc.prep_id_range(dev_list[1]), models=ddm.MODELS, user=name)
131
    elif request.method == 'POST':
132
        ddmin = ddm.extract(request)
133
        res = dd.create_ddm(request.form['devname'], request.form['devid'], appkey, request.form['devdesc'], ddmin)
134
135
136

        if not res[0]:
            flash('Error: {}'.format(res[1]), 'danger')
137
            return redirect(request.url)
138
        else:
Vladislav Rykov's avatar
Vladislav Rykov committed
139
            res = data.create_table_ddm(appkey, request.form['devid'])
140
141
142
143
        
            if not res[0]:
                dd.delete(appkey, request.form['devid'])
                flash('Error: {}'.format(res[1]), 'danger')
144
                return rendirect(request.url)
145
            else:
146
                return redirect(url_for('administration_user_application', name=name, appkey=appkey))
147
148


149
@app.route('/administration/<name>/application/<appkey>/device/<devid>')
150
@restricted('admin', True)
151
def administration_user_application_device(name, appkey, devid):
152
153
154
    ap = ad.get(appkey)
    dev = dd.get(appkey, devid)

155
    ld = data.get_last_n(appkey, devid, 1)
156
157
    cnt = data.get_count(appkey, devid)

158
    ltup = 'Device has not any sent data yet'
159
160
161
162

    if ld[0] and ld[1][0] != []:
        ltup = ld[1][0][1]

163
    return render_template('new/admin/user-device.html', dev=dev[1], app=ap[1], ltup=ltup, total=cnt[1][0], user=name, table_max=MAX_PG_ENTRIES_DATA)
164
165


166
@app.route('/administration/<name>/application/<appkey>/device/<devid>/settings', methods=['GET', 'POST'])
167
@restricted('admin', True)
168
def administration_user_application_device_settings(name, appkey, devid):
169
170
171
172
    if request.method == 'GET':
        ap = ad.get(appkey)
        dev = dd.get(appkey, devid)

173
        return render_template('new/admin/user-application-device-settings.html', app=ap[1], dev=dev[1], models=ddm.MODELS, user=name)
174
    elif request.method == 'POST':
175
        ddmin = ddm.extract(request)
176
        res = dd.update_ddm(appkey, devid, request.form['devname'], request.form['devdesc'], ddmin)
177
178
179
    
        if not res[0]:
            flash('Error: {}'.format(res[1]), 'danger')
180
            return redirect(request.url)
181
182
183
184
    
        return redirect(request.url)


185
@app.route('/administration/<name>/application/<appkey>/device/<devid>/delete')
186
@restricted('admin', True)
187
def administration_user_application_device_delete(name, appkey, devid):
188
189
190
191
192
193
194
195
196
197
    nq.delete_per_device(appkey, devid)
    nfss = nfs.get_per_device(appkey, devid)
    for nf in nfss[1]:
        tr.delete(appkey, devid, nf[0])
        tr.delete_function(appkey, devid, nf[0])
        nfs.delete(appkey, devid, nf[0])

    data.delete_table(appkey, devid)
    res = dd.delete(appkey, devid)

198
    return redirect(url_for('administration_user_application', name=name, appkey=appkey))
199
200


201
@app.route('/administration/<name>/application/<appkey>/alerts')
202
@restricted('admin', True)
203
def administration_user_application_alerts(name, appkey):
204
205
206
207
208
    ap = ad.get(appkey)
    alerts = nfs.get_alerts_list(appkey)
    return render_template('new/admin/user-application-alerts.html', alert_list=alerts[1], app=ap[1], user=name)


209
@app.route('/administration/<name>/application/<appkey>/new-alert', methods=['GET', 'POST'])
210
@restricted('admin', True)
211
def administration_user_application_new_alert(name, appkey):
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
        if request.method == 'GET':
            ap = ad.get(appkey)
            devs = dd.get_list(appkey)
            
            return render_template('new/admin/user-new-alert.html', devs=devs[1], app=ap[1], user=name)
        elif request.method == 'POST':
            # create new notification
            nid = misc.rand_str(app.config['NID_LENGTH']).decode('utf-8')
            dev = dd.get(appkey, request.form['devid'])
            
            try:
                desc = dev[1][0]+'.'+request.form['varname']+' '+request.form['operation']+' '+request.form['avalue']
                res = nfs.create(nid, appkey, request.form['devid'], request.form['alertname'], desc, 'alert', request.form['alertemail'])
                if res[0]:
                    # create new function and trigger
                    tr.create_function(appkey, request.form['devid'], nid, [request.form['varname'],request.form['operation'],request.form['avalue']])
                    tr.create(appkey, request.form['devid'], nid)
                    flash('Alert created', 'success')
230
                    return redirect(url_for('administration_user_application_alerts', name=name, appkey=appkey))
231
232
233
234
235
                else:
                    flash('Error creating new alert: {}'.format(res[1]), 'danger')
                    return redirect(request.url) 
            except Exception as e:
                flash('Error creating new alert: {}. Make sure you have filled all form fields.'.format(e), 'danger')
236
237
                return redirect(request.url) 

238

239
@app.route('/administration/<name>/application/<appkey>/automation')
240
@restricted('admin', True)
241
def administration_user_application_automation(name, appkey):
242
243
244
245
246
247
    ap = ad.get(appkey)
    ats = nfs.get_automation_list(appkey)
    
    return render_template('new/admin/user-application-automation.html', automations=ats[1], app=ap[1], user=name)


248
@app.route('/administration/<name>/application/<appkey>/new-automation', methods=['GET', 'POST'])
249
@restricted('admin', True)
250
def administration_user_application_new_automation(name, appkey):
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
    if request.method == 'GET':
        ap = ad.get(appkey)
        devs = dd.get_list(appkey)
        
        return render_template('new/admin/user-application-new-automation.html', devs=devs[1], app=ap[1], user=name)
    elif request.method == 'POST':
        # create new notification
        nid = misc.rand_str(app.config['NID_LENGTH']).decode('utf-8')
        dev = dd.get(appkey, request.form['devid'])
        adev = dd.get(appkey, request.form['adevid'])
        
        try:
            desc = 'IF '+dev[1][0]+'.'+request.form['varname']+' '+request.form['operation']+' '+request.form['avalue']+' THEN '+adev[1][0]+'.confID_'+request.form['confid']+' = '+request.form['arg']
            # action format: '<devid>#<confid>#<arg>'
            action = request.form['adevid']+'#'+request.form['confid']+'#'+request.form['arg']
            res = nfs.create(nid, appkey, request.form['devid'], request.form['automationname'], desc, 'automation', action)
            if res[0]:
                # create new function and trigger
                tr.create_function(appkey, request.form['devid'], nid, [request.form['varname'],request.form['operation'],request.form['avalue']])
                tr.create(appkey, request.form['devid'], nid)
                flash('Automation created', 'success')
272
                return redirect(url_for('administration_user_application_automation', name=name, appkey=appkey))
273
274
275
276
277
278
279
280
            else:
                flash('Error creating new alert: {}'.format(res[1]), 'danger')
                return redirect(request.url) 
        except Exception as e:
            flash('Error creating new alert: {}. Make sure you have filled all form fields.'.format(e), 'danger')
            return redirect(request.url) 


281
@app.route('/administration/<name>/application/<appkey>/delete')
282
@restricted('admin', True)
283
def administration_user_application_delete(name, appkey):
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
    devs = dd.get_list(appkey)

    for dev in devs[1]:
        data.delete_table(appkey, dev[1])
        # delete notifications
        nq.delete_per_device(appkey, dev[1])
        nfss = nfs.get_per_device(appkey, dev[1])
        for nf in nfss[1]:
            tr.delete(appkey, dev[1], nf[0])
            tr.delete_function(appkey, dev[1], nf[0])
            nfs.delete(appkey, dev[1], nf[0])

    dd.delete_table(appkey)

    res = ad.delete(appkey)

    if not res[0]:
        flash('Error deleting application: {}'.format(res[1]), 'danger')
302
        return redirect(url_for('administration_user_application_settings', name=name, appkey=appkey))
303
304
    else:
        flash('Application deleted.', 'success')
305
        return redirect(url_for('administration_user_applications', name=name))
306
307


308
@app.route('/administration/<name>/application/<appkey>/settings', methods=['GET', 'POST'])
309
@restricted('admin', True)
310
def administration_user_application_settings(name, appkey):
311
312
313
314
315
316
317
318
319
320
321
322
323
324
    if request.method == 'GET':
        ap = ad.get(appkey)

        return render_template('new/admin/user-application-settings.html', app=ap[1], user=name)
    elif request.method == 'POST':
        if request.form.getlist('secure') and request.form.getlist('secure')[0] == 'on':
            secure = True
        else:
            secure = False
        
        res = ad.update(appkey, request.form['appname'], request.form['appdesc'], secure)
    
        if not res[0]:
            flash('Error: {}'.format(res[1]), 'danger')
325
            return redirect(request.url)
326
327
328
329
    
        return redirect(request.url)


330
@app.route('/administration/<name>/application/<appkey>/delete-<ntype>')
331
@restricted('admin', True)
332
def administration_user_application_notification_remove(name, appkey, ntype):
333
334
335
336
337
338
339
340
341
342
343
344
345
    nq.delete(appkey, request.args.get('devid'), request.args.get('id'))
    tr.delete(appkey, request.args.get('devid'), request.args.get('id'))
    tr.delete_function(appkey, request.args.get('devid'), request.args.get('id'))
    res = nfs.delete(appkey, request.args.get('devid'), request.args.get('id'))

    if res[0]:
        flash('{} removed'.format(ntype.capitalize()), 'success')
        return '', 200
    else:
        flash('{} cannot be removed : {}'.format(ntype.capitalize(), res[1]), 'danger')
        return '', 500


346
@app.route('/administration/<name>/application/<appkey>/device/<devid>/variables')
347
@restricted('admin', True)
348
def administration_user_application_device_variables(name, appkey, devid):
349
350
351
352
353
354
355
    dev = dd.get(appkey, devid)[1]
    select = '<select class="form-control" id="varname" name="varname" onchange="validate_form();" required>'
    select += '<option value="-">Select Variable</option>'
    for k in dev[3]['format']:
        select += '<option>'+k+'</option>'
    select += '</select>'
    return select
356
357


358
@app.route('/administration/<name>/application/<appkey>/device/<devid>/data/<var>/<dest>/<page>')
359
@restricted('admin', True)
360
def administration_user_application_device_data(name, appkey, devid, var, dest, page):
361
    dev = dd.get(appkey, devid)[1]
362
363
364
    if dest == 'graph':
        last = data.get_last_hours(appkey, devid, MAX_PG_ENTRIES_GRAPH_HOURS, int(page))
        if last[0]:
365
366
367
            arr = '[["Time", "{}"],'.format(var)
            last = [ddm.decode_datum(d, dev[3]) for d in last[1]]
            for d in last:
368
369
370
371
372
373
374
375
                arr += '[new Date('+str(d[0])+'*1000),'+str(d[2][var])+'],'
            arr += ']'
        return arr
    elif dest == 'table':
        # for table <cnt> is in items
        last = data.get_last_range(appkey, devid, [MAX_PG_ENTRIES_DATA, (int(page)-1)*MAX_PG_ENTRIES_DATA])
        t = ''
        if last[0]:
376
377
            last = [ddm.decode_datum(d, dev[3]) for d in last[1]]
            for d in last:
378
379
380
381
                t += '<tr><th>'+d[1]+'</th><th>'+str(d[2][var])+'</th></tr>'
        return t


382
@app.route('/administration/<name>/application/<appkey>/device/<devid>/configure', methods=['GET', 'POST'])
383
@restricted('admin', True)
384
def administration_user_application_device_configuration(name, appkey, devid):
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
    if request.method == 'GET':
        pend_msgs = pend.get_list(appkey, devid)
        ap = ad.get(appkey)[1]
        dev = dd.get(appkey, devid)[1]
        if pend_msgs[0]:
            config_list = []

            for pm in pend_msgs[1]:
                cntt = binascii.a2b_base64(pm[2])
                config_id = int(cntt[0])
                config_args = cntt[2:(len(cntt)-1)].decode('utf-8')
                ack = pm[3]
                config_list.append((config_id, config_args, ack, pm[2]))
        
        return render_template('new/admin/user-application-device-configuration.html', dev=dev, app=ap, config_list=config_list, user=name)
    elif request.method == 'POST':
        base64_args = misc.pend_base64_encode(request.form['arg'], request.form['confid'])
        pend.create(appkey, devid, base64_args)
        
        flash('Message enqueued', 'success')
        return '', 201


408
@app.route('/administration/<name>/application/<appkey>/device/<devid>/remove-configuration')
409
@restricted('admin', True)
410
def administration_user_application_device_configuration_remove(name, appkey, devid):
411
412
413
414
415
416
417
418
419
420
    res = pend.delete(appkey, devid, request.args.get('conf')+'_')

    if res[0]:
        flash('Configuration message successfully removed.','success')
    else:
        flash('Error removing configuration message: {}'.format(res[1]), 'danger')
    
    return '', 200


421
@app.route('/administration/<name>/application/<appkey>/device/<devid>/download-csv')
422
@restricted('admin', True)
423
def administration_user_application_device_download_csv(name, appkey, devid):
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
    @after_this_request
    def clean_data_folder(response):
        try:
            filelist = [f for f in os.listdir(app.config['DATA_DOWNLOAD_DIR_OS'])]
            for f in filelist:
                os.remove(app.config['DATA_DOWNLOAD_DIR_OS']+'/'+f)
        except OSError:
            pass
        return response
    dumpd = data.get_all(appkey, devid)
    ap = ad.get(appkey)[1]
    dev = dd.get(appkey, devid)[1]

    fn = ap[0]+ '-' +dev[0]+ '-data.csv'

    with open(app.config['DATA_DOWNLOAD_DIR_OS']+'/'+fn, 'w+') as f: 
        f.write('utc,timestamp,')
441
        for d in dev[3]['format']:
442
443
444
445
446
447
448
449
450
451
452
453
454
455
            f.write(d)
            f.write(',')
        f.write('\n')
    
        for row in dumpd[1]:
            f.write('{},{},'.format(row[0],row[1]))
            for v in row[2]:
                f.write(str(row[2][v]))
                f.write(',')
            f.write('\n')

    return send_from_directory(app.config['DATA_DOWNLOAD_DIR'], fn, as_attachment=True)


456
@app.route('/administration/<name>/chart-update')
457
@restricted('admin', True)
458
def administration_user_chart_update(name):
459
460
461
462
463
464
465
466
467
468
469
470
471
    day_chart_values = md.get_user_data_count_per_hour_period(name, 11)[1]
    day_chart_values = [x[0] for x in day_chart_values]
    day_chart_labels = [misc.local_hour(x) for x in range(11,-1,-1)]
    day_chart = [day_chart_labels, day_chart_values]

    week_chart_values = md.get_user_data_count_per_day_period(name, 6)[1]
    week_chart_values = [x[0] for x in week_chart_values]
    week_chart_labels = [misc.local_weekday(x) for x in range(6,-1,-1)]
    week_chart = [week_chart_labels, week_chart_values]
    
    return "[{}, {}]".format(day_chart, week_chart)


472
@app.route('/administration/<name>/recent-activity')
473
@restricted('admin', True)
474
def administration_user_recent_activity(name):
475
476
477
478
479
480
    recent_activity = md.get_recent_activity(name)[1]
    ra = ''
    
    for r in recent_activity:
        dev = dd.get(r[5], r[6])[1]
        ra += '<tr><th scope="row">'+r[1]+'</th><th>'+r[2]+'</th><th>'+r[0]+'</th><th>'+str(ddm.read_data(r[3], dev[3]))+'</th></tr>'
481

482
    return ra, 200
483

484

485
@app.route('/administration/users/table/<page>')
486
@restricted('admin')
487
488
def administration_users_table(page):
    users = ud.get_range_name(request.args.get('name'), [MAX_PG_ENTRIES_USERS, (int(page)-1)*MAX_PG_ENTRIES_USERS])[1]
489
490
491
492
    users = [[u[0],u[2]] for u in users]

    return str(users), 200

493

494
@app.route('/administration/new-user', methods=['POST', 'GET'])
495
@restricted('admin')
496
def administration_new_user():
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
    if request.method == 'GET':
        return render_template('new/admin/new-user.html')
    elif request.method == 'POST':
        username = request.form['username']
        password = request.form['password'].encode('utf-8')
        role = request.form['role']
        
        if (username == '' or password == ''):
            flash('Username or password fields cannot be empty', 'danger')
            return redirect(request.url)
        elif (len(password) < 8):
            flash('Password length must be at least 8 characters.', 'danger')
            return redirect(request.url)
        else:
            res = ud.create(username, password, role)
            if (not res[0]):
                flash('Error: {}'.format(res[1]), 'danger')
                return redirect(request.url)
            else:
516
                return redirect(url_for('administration_user', name=username))
517

518

519
@app.route('/administration/<name>/settings', methods=['GET', 'POST'])
520
@restricted('admin', True)
521
def administration_user_settings(name):
522
    user = ud.get(name)
523
    if user[0] and misc.grant_view(user[1][2], session['role']):
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
        if request.method == 'GET':
            return render_template('new/admin/user-settings.html', user=name, user_role=user[1][2])
        else:
            if request.form['name'] != name:
                res = ud.update_name(name, request.form['name'])
                if not res[0]:
                    flash('Error: {}'.format(res[1]), 'danger')
                    return redirect(request.url);
            if request.form['password'] != '':
                res = ud.update_password(name, request.form['password'].encode('utf-8'))
                if not res[0]:
                    flash('Error: {}'.format(res[1]), 'danger')
                    return redirect(request.url)
            if request.form['role'] != user[1][2]:
                res = ud.update_role(name, request.form['role'])
                if not res[0]:
                    flash('Error: {}'.format(res[1]), 'danger')
                    return redirect(request.url)
            flash('Settings successfully saved.', 'success')
            return redirect(request.url)
544
    else:
545
        flash('Access denied' ,'danger')
546
        return redirect(url_for('administration_user', name=name))
547
548


549
@app.route('/administration/<name>/delete-account')
550
@restricted('admin', True)
551
def administration_user_delete_account(name):
552
    user = ud.get(name)
553
    if user[0] and misc.grant_view(user[1][2], session['role']):
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
        app_list = ad.get_list(user[1][0])

        res = (True,)
        if app_list[0]:
            for app in app_list[1]:
                devs = dd.get_list(app[1])
                for dev in devs[1]:
                    res = data.delete_table(app[1], dev[1])
                    if not res[0]:
                        break
    
                if res[0]:
                    res = dd.delete_table(app[1])
                    
                if res[0]:
                    res = ad.delete(app[1])

                if not res[0]:
                    break

        if res[0]:
            res = ud.delete(user[1][0])

        if not res[0]:
            flash('Error: {}'.format(res[1]), 'danger')
            return render_template('new/admin/user-settings.html', user=name)
        else:
            flash('User {} was successfully deleted'.format(name), 'success')
            return redirect(url_for('administration_users'))
    else:
        flash('Warning: the user is admin or does not exist.' ,'danger')
585
        return redirect(url_for('administration_user_settings', name=name))