views.py 21.8 KB
Newer Older
1
2
from app import app, mail
from flask_mail import Message
Vladislav Rykov's avatar
Vladislav Rykov committed
3

Vladislav Rykov's avatar
Vladislav Rykov committed
4
from flask import render_template, request, redirect, url_for, session, send_from_directory, flash
5
import psycopg2
Vladislav Rykov's avatar
Vladislav Rykov committed
6

Vladislav Rykov's avatar
Vladislav Rykov committed
7
8
9
10
11
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
Vladislav Rykov's avatar
Vladislav Rykov committed
12
13
import app.dao.notification.notification as nfs
import app.dao.trigger.trigger as tr
Vladislav Rykov's avatar
Vladislav Rykov committed
14
import app.dao.notification_queue.notification_queue as nq
Vladislav Rykov's avatar
Vladislav Rykov committed
15

Vladislav Rykov's avatar
Vladislav Rykov committed
16
import app.helpers.misc as misc
17
import app.helpers.mailer as mailer
Vladislav Rykov's avatar
Vladislav Rykov committed
18

19
import binascii
20
import os
Vladislav Rykov's avatar
Vladislav Rykov committed
21

22

23
24
MAX_PG = 5
MAX_PG_ENTRIES_USERS = 10
25
26
MAX_PG_ENTRIES_DATA = 10
MAX_PG_ENTRIES_GRAPH_HOURS = 24
27

Vladislav Rykov's avatar
Vladislav Rykov committed
28
@app.route('/')
29
def index():
Vladislav Rykov's avatar
Vladislav Rykov committed
30
    if 'name' in session and len(session['name']) > 0:
Vladislav Rykov's avatar
Vladislav Rykov committed
31
32
        apps = ad.get_list(session['name'])
        
Vladislav Rykov's avatar
Vladislav Rykov committed
33
        session.pop('appkey', None)
Vladislav Rykov's avatar
Vladislav Rykov committed
34
        # print('apps: ', apps)
35
        if apps[0]:
36
            return render_template('public/index.html', apps=apps[1], users_signup=app.config['USERS_SIGNUP'])
37
        else:
38
            return render_template('public/index.html', feedback=apps[1], users_signup=app.config['USERS_SIGNUP'])
Vladislav Rykov's avatar
Vladislav Rykov committed
39
    else:
40
        return render_template('public/index.html', users_signup=app.config['USERS_SIGNUP'])
41
42
43



Vladislav Rykov's avatar
Vladislav Rykov committed
44
@app.route('/signup', methods=['GET', 'POST'])
45
46
def signup():
    if request.method == 'GET':
Vladislav Rykov's avatar
Vladislav Rykov committed
47
        if session['role'] and session['role'] == 'admin':
48
            return render_template('admin/signup.html', users_signup=app.config['USERS_SIGNUP'])
Vladislav Rykov's avatar
Vladislav Rykov committed
49
        else:
50
            if app.config['USERS_SIGNUP']:
51
                return render_template('public/signup.html', users_signup=app.config['USERS_SIGNUP'])
52
            else:
53
                return redirect(url_for('index', users_signup=app.config['USERS_SIGNUP']))
54
55
56
57
58
59
60
    else:
        if app.config['USERS_SIGNUP'] or session['role'] == 'admin':
            username = request.form['username']
            password = request.form['password'].encode('utf-8')
            
            if (username == '' or password == ''):
                feedback = 'Username or password fields cannot be empty'
61
                return render_template('public/signup.html', feedback=feedback, users_signup=app.config['USERS_SIGNUP'])
62
63
            elif (len(password) < 8):
                flash('Password length must be at least 8 characters.', 'danger')
64
                return redirect(request.url, users_signup=app.config['USERS_SIGNUP'])
Vladislav Rykov's avatar
Vladislav Rykov committed
65
            else:
66
67
68
69
70
71
72
73
                role = 'user'
                if request.form['role'] and request.form['role'] == 'administrator':
                    role = 'admin'

                res = ud.create(username, password, role)
                if (not res[0]):
                    flash('Error: {}'.format(res[1]), 'danger')
                    return redirect(request.url)
Vladislav Rykov's avatar
Vladislav Rykov committed
74
                else:
75
76
77
                    session['name'] = username
                    
                    flash('User successfully created.', 'success')
78

79
80
81
82
83
84
                    if session['role'] and session['role'] == 'admin':
                        return redirect(url_for('dashboard'))
                    else:
                        return redirect(url_for('index'))
        else:
            return redirect(url_for('index'))
85
86


Vladislav Rykov's avatar
Vladislav Rykov committed
87
@app.route('/login', methods=['GET', 'POST'])
Vladislav Rykov's avatar
Vladislav Rykov committed
88
def login():
Vladislav Rykov's avatar
Vladislav Rykov committed
89
    if request.method == 'GET':
Vladislav Rykov's avatar
Vladislav Rykov committed
90
        return render_template('public/login.html')
Vladislav Rykov's avatar
Vladislav Rykov committed
91
92
    else: 
        username = request.form['username']
Vladislav Rykov's avatar
Vladislav Rykov committed
93
        password = request.form['password'].encode('utf-8')
Vladislav Rykov's avatar
Vladislav Rykov committed
94
95

        if (username == '' or password == ''):
Vladislav Rykov's avatar
Vladislav Rykov committed
96
97
            flash('Username or password fields cannot be empty', 'danger')
            return redirect(request.url)
Vladislav Rykov's avatar
Vladislav Rykov committed
98
        else:
Vladislav Rykov's avatar
Vladislav Rykov committed
99
            res = ud.check(username, password)
Vladislav Rykov's avatar
Vladislav Rykov committed
100
            if (not res[0]):
Vladislav Rykov's avatar
Vladislav Rykov committed
101
102
                flash('Error: {}'.format(res[1]), 'danger')
                return redirect(request.url)
Vladislav Rykov's avatar
Vladislav Rykov committed
103
104
            else:
                session['name'] = username
105
                session['role'] = res[1][2]
Vladislav Rykov's avatar
Vladislav Rykov committed
106
        
Vladislav Rykov's avatar
Vladislav Rykov committed
107
108
109
                return redirect(url_for('index'))


110

Vladislav Rykov's avatar
Vladislav Rykov committed
111
@app.route('/logout')
Vladislav Rykov's avatar
Vladislav Rykov committed
112
113
114
def logout():
    session.clear()
    return redirect(url_for('index'))
Vladislav Rykov's avatar
Vladislav Rykov committed
115
116


117

Vladislav Rykov's avatar
Vladislav Rykov committed
118
@app.route('/new-app')
119
def new_application():
Vladislav Rykov's avatar
Vladislav Rykov committed
120
    if 'name' in session:
Vladislav Rykov's avatar
Vladislav Rykov committed
121
        return render_template('public/new-app.html')
Vladislav Rykov's avatar
Vladislav Rykov committed
122
123
    else:
        return redirect(url_for('index'))
124
125
126



Vladislav Rykov's avatar
Vladislav Rykov committed
127
128
@app.route('/app', methods=['GET', 'POST'])
def app_():
Vladislav Rykov's avatar
Vladislav Rykov committed
129
130
131
    if 'name' in session:
        if request.method == 'GET':
            session['appkey'] = request.args.get('appkey')
Vladislav Rykov's avatar
Vladislav Rykov committed
132

Vladislav Rykov's avatar
Vladislav Rykov committed
133
134
            ap = ad.get(session['appkey'])
            devs = dd.get_list(ap[1][1])
135
136

            session['appname'] = ap[1][0]
137
138
139
140
141
            
            if session['role'] == 'admin' or session['name'] == ap[1][2]:
                return render_template('public/app.html', app=ap[1], devs=devs[1])
            else:
                return redirect(url_for('index'))
142
        else:
Vladislav Rykov's avatar
Vladislav Rykov committed
143
144
            if request.form['appname'] == '':
                error = 'Application name cannot be empty.'
Vladislav Rykov's avatar
Vladislav Rykov committed
145
                return render_template('public/new-app.html', feedback=error)
Vladislav Rykov's avatar
Vladislav Rykov committed
146
            else:
Vladislav Rykov's avatar
Vladislav Rykov committed
147
                appkey = misc.rand_str(app.config['APPKEY_LENGTH']).decode('utf-8')
Vladislav Rykov's avatar
Vladislav Rykov committed
148
                res = ad.create(request.form['appname'], appkey, session['name'], request.form['appdesc'])
Vladislav Rykov's avatar
Vladislav Rykov committed
149
            
Vladislav Rykov's avatar
Vladislav Rykov committed
150
                if not res[0]:
Vladislav Rykov's avatar
Vladislav Rykov committed
151
                    return render_template('public/new-app.html', feedback=res[1])
Vladislav Rykov's avatar
Vladislav Rykov committed
152
            
Vladislav Rykov's avatar
Vladislav Rykov committed
153
                res = dd.create_table(appkey)
154
            
Vladislav Rykov's avatar
Vladislav Rykov committed
155
                if not res[0]:
Vladislav Rykov's avatar
Vladislav Rykov committed
156
                    ad.delete(appkey)
Vladislav Rykov's avatar
Vladislav Rykov committed
157
                    return render_template('public/new-app.html', feedback=res[1])
158
            
Vladislav Rykov's avatar
Vladislav Rykov committed
159
160
161
                return redirect(url_for('index'))
    else:
        return redirect(url_for('index'))
162

Vladislav Rykov's avatar
Vladislav Rykov committed
163
@app.route('/delete-app')
164
def delete_app():
Vladislav Rykov's avatar
Vladislav Rykov committed
165
    if 'name' in session:
Vladislav Rykov's avatar
Vladislav Rykov committed
166
        devs = dd.get_list(session['appkey'])
167
    
Vladislav Rykov's avatar
Vladislav Rykov committed
168
169
        for dev in devs[1]:
            data.delete_table(session['appkey'], dev[1])
170
    
Vladislav Rykov's avatar
Vladislav Rykov committed
171
        dd.delete_table(session['appkey'])
172
    
Vladislav Rykov's avatar
Vladislav Rykov committed
173
        res = ad.delete(session['appkey'])
174
    
Vladislav Rykov's avatar
Vladislav Rykov committed
175
        if not res[0]:
Vladislav Rykov's avatar
Vladislav Rykov committed
176
            return redirect(url_for('app_'))
Vladislav Rykov's avatar
Vladislav Rykov committed
177
178
        else:
            return redirect(url_for('index'))
179
180
    else:
        return redirect(url_for('index'))
181

Vladislav Rykov's avatar
Vladislav Rykov committed
182

Vladislav Rykov's avatar
Vladislav Rykov committed
183
@app.route('/add-dev')
Vladislav Rykov's avatar
Vladislav Rykov committed
184
def new_dev():
Vladislav Rykov's avatar
Vladislav Rykov committed
185
    if 'name' in session:
Vladislav Rykov's avatar
Vladislav Rykov committed
186
        dev_list = dd.get_list(session['appkey'])
Vladislav Rykov's avatar
Vladislav Rykov committed
187
    
Vladislav Rykov's avatar
Vladislav Rykov committed
188
    #print('dev list : ', dev_list)
Vladislav Rykov's avatar
Vladislav Rykov committed
189

Vladislav Rykov's avatar
Vladislav Rykov committed
190
        if not dev_list[0]:
Vladislav Rykov's avatar
Vladislav Rykov committed
191
            return render_template('public/add-dev.html', feedback=dev_list[1])
Vladislav Rykov's avatar
Vladislav Rykov committed
192
        else:
Vladislav Rykov's avatar
Vladislav Rykov committed
193
            return render_template('public/add-dev.html', free_ids=misc.prep_id_range(dev_list[1]))
Vladislav Rykov's avatar
Vladislav Rykov committed
194
    else:
Vladislav Rykov's avatar
Vladislav Rykov committed
195
        return redirect(url_for('index'))
Vladislav Rykov's avatar
Vladislav Rykov committed
196
197
198
 


Vladislav Rykov's avatar
Vladislav Rykov committed
199
@app.route('/dev', methods=['GET', 'POST'])
Vladislav Rykov's avatar
Vladislav Rykov committed
200
def dev():
Vladislav Rykov's avatar
Vladislav Rykov committed
201
202
    if 'name' in session:
        if request.method == 'GET':
203
204
205
206
207
208
            ap = ad.get(session['appkey'])
            if session['role'] == 'admin' or session['name'] == ap[1][2]:
                dev = dd.get(session['appkey'], request.args.get('id'))

                session['devid'] = int(dev[1][1])
                session['devname'] = dev[1][0]
Vladislav Rykov's avatar
Vladislav Rykov committed
209
        
210
                last = data.get_last_n(session['appkey'], session['devid'], 1)
Vladislav Rykov's avatar
Vladislav Rykov committed
211
        
212
                ltup = 'Device have not sent data yet'
Vladislav Rykov's avatar
Vladislav Rykov committed
213

214
215
                if last[0]:
                    ltup = last[1][0][1]
216

217
218
219
                return render_template('public/dev.html', dev=dev[1], appkey=session['appkey'], ltup=ltup)
            else:
                return redirect(url_for('index'))
Vladislav Rykov's avatar
Vladislav Rykov committed
220
        else:
Vladislav Rykov's avatar
Vladislav Rykov committed
221
            res = dd.create(request.form['devname'], request.form['devid'], session['appkey'], request.form['devdesc'])
Vladislav Rykov's avatar
Vladislav Rykov committed
222

223
            if not res[0]:
Vladislav Rykov's avatar
Vladislav Rykov committed
224
                return render_template('public/add-dev.html', feedback=res[1])
225
            else:
Vladislav Rykov's avatar
Vladislav Rykov committed
226
227
228
                res = data.create_table(session['appkey'], request.form['devid'])
            
                if not res[0]:
Vladislav Rykov's avatar
Vladislav Rykov committed
229
                    dd.delete(session['appkey'], request.form['devid'])
Vladislav Rykov's avatar
Vladislav Rykov committed
230
                    return render_template('public/add-dev.html', feedback=res[1])
Vladislav Rykov's avatar
Vladislav Rykov committed
231
                else:
232
                    return redirect(url_for('app_', appkey=session['appkey']))
Vladislav Rykov's avatar
Vladislav Rykov committed
233
234
    else:
        return redirect(url_for('index'))
Vladislav Rykov's avatar
Vladislav Rykov committed
235
236


Vladislav Rykov's avatar
Vladislav Rykov committed
237
@app.route('/dev-conf', methods=['GET', 'POST'])
Vladislav Rykov's avatar
Vladislav Rykov committed
238
def dev_conf():
Vladislav Rykov's avatar
Vladislav Rykov committed
239
240
    if 'name' in session and 'devid' in session:
        if request.method == 'GET':
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
            pend_msgs = pend.get_list(session['appkey'], session['devid'])
            
            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('public/dev-conf.html', devname=session['devname'], config_list=config_list)
            else:
                return render_template('public/dev-conf.html', devname=session['devname'])
Vladislav Rykov's avatar
Vladislav Rykov committed
256
257
258
259
260
        else:
            argslen = len(request.form['arg']) + 1
            args = bytearray(argslen + 2)
            args[0] = int(request.form['confid'])
            args[1] = argslen
Vladislav Rykov's avatar
Vladislav Rykov committed
261
        
262
            bstr = bytes(request.form['arg'].encode('utf-8'))
Vladislav Rykov's avatar
Vladislav Rykov committed
263
264
265
266
            i = 0
            while i < argslen - 1:
                args[2+i] = bstr[i]
                i += 1
Vladislav Rykov's avatar
Vladislav Rykov committed
267

Vladislav Rykov's avatar
Vladislav Rykov committed
268
            base64_args = binascii.b2a_base64(args).decode('utf-8')
Vladislav Rykov's avatar
Vladislav Rykov committed
269

Vladislav Rykov's avatar
Vladislav Rykov committed
270
            pend.create(session['appkey'], session['devid'], base64_args)
Vladislav Rykov's avatar
Vladislav Rykov committed
271

Vladislav Rykov's avatar
Vladislav Rykov committed
272
273
274
            return redirect(url_for('dev', id=session['devid']))
    else:
        return redirect(url_for('index'))
Vladislav Rykov's avatar
Vladislav Rykov committed
275

276
277
278
279
280
281
282
283
284
285
286
287
288
@app.route('/dev-conf-rm')
def dev_conf_rm():
    if 'name' in session and 'appkey' in session and 'devid' in session:
        res = pend.delete(session['appkey'], session['devid'], request.args.get('conf')+'_')

        if res[0]:
            flash('Configuration message successfully removed.','success')
            return redirect(url_for('dev_conf'))
        else:
            flash('Error removing configuration message: {}'.format(res[1]), 'danger')
            return redirect(url_for('dev_conf'))
    else:
        return redirect(url_for('index'))
Vladislav Rykov's avatar
Vladislav Rykov committed
289

Vladislav Rykov's avatar
Vladislav Rykov committed
290

Vladislav Rykov's avatar
Vladislav Rykov committed
291
@app.route('/delete-dev')
Vladislav Rykov's avatar
Vladislav Rykov committed
292
def delete_dev():
Vladislav Rykov's avatar
Vladislav Rykov committed
293
294
    if 'name' in session and 'devid' in session:
        data.delete_table(session['appkey'], session['devid'])
Vladislav Rykov's avatar
Vladislav Rykov committed
295
        res = dd.delete(session['appkey'], session['devid'])
Vladislav Rykov's avatar
Vladislav Rykov committed
296

Vladislav Rykov's avatar
Vladislav Rykov committed
297
        return redirect(url_for('app_', appkey=session['appkey']))
Vladislav Rykov's avatar
Vladislav Rykov committed
298
299
    else:
        return redirect(utl_for('index'))
Vladislav Rykov's avatar
Vladislav Rykov committed
300
301


Vladislav Rykov's avatar
Vladislav Rykov committed
302
@app.route('/dev-data')
303
304
305
306
307
308
309
310
311
312
def dev_data_pg():
    if 'name' in session and 'devid' in session:
        cur_pg = 1
        if request.args.get('p'):
            cur_pg = int(request.args.get('p'))
            if cur_pg < 1:
                cur_pg = 1
        
        last = data.get_last_range(session['appkey'], session['devid'], [MAX_PG_ENTRIES_DATA, (cur_pg-1)*MAX_PG_ENTRIES_DATA])
        
Vladislav Rykov's avatar
Vladislav Rykov committed
313
314
315
316
        ent_cnt = data.get_count(session['appkey'], session['devid'])
        if ent_cnt[0]:
            # range data
            rd = misc.paging(cur_pg, ent_cnt[1][0], MAX_PG_ENTRIES_DATA, MAX_PG)
317

Vladislav Rykov's avatar
Vladislav Rykov committed
318
            if ent_cnt[1][0] > 0:
Vladislav Rykov's avatar
Vladislav Rykov committed
319
                return render_template('public/dev-data-t.html', data=last[1], total=ent_cnt[1][0], cp=cur_pg, np=rd[2], pp=rd[0], pr=rd[1], devname=session['devname'])
Vladislav Rykov's avatar
Vladislav Rykov committed
320
            else:
Vladislav Rykov's avatar
Vladislav Rykov committed
321
                return render_template('public/dev-data-t.html', devname=session['devname'])
322
        else:
Vladislav Rykov's avatar
Vladislav Rykov committed
323
            flash('Error: {}'.format(ent_cnt[1]), 'danger')
Vladislav Rykov's avatar
Vladislav Rykov committed
324
            return render_template('public/dev-data-t.html', devname=session['devname'])
325
326
327
328
    else:
        return redirect(utl_for('index'))


Vladislav Rykov's avatar
Vladislav Rykov committed
329
330
331
332
333
@app.route('/dev-vars')
def dev_vars():
    if 'name' in session:
        last = data.get_last_n(session['appkey'], request.args.get('id'), 1)
        if last[0]:
Vladislav Rykov's avatar
Vladislav Rykov committed
334
            select = '<select class="form-control notifelem" id="varname" name="varname" onchange="onvar(event)" required>'
Vladislav Rykov's avatar
Vladislav Rykov committed
335
336
337
338
339
340
341
342
            select += '<option value="-">Select Variable</option>'
            for k in last[1][0][2]:
                select += '<option>'+k+'</option>'
            select += '</select>'
            return select
    else:
        return redirect(url_for('index'))

343

Vladislav Rykov's avatar
Vladislav Rykov committed
344
@app.route('/data-csv')
Vladislav Rykov's avatar
Vladislav Rykov committed
345
def data_csv():
Vladislav Rykov's avatar
Vladislav Rykov committed
346
347
    if 'name' in session and 'devid' in session:
        dumpd = data.get_all(session['appkey'], session['devid'])
Vladislav Rykov's avatar
Vladislav Rykov committed
348

Vladislav Rykov's avatar
Vladislav Rykov committed
349
        fn = session['appkey']+ '_' +str(session['devid'])+ '.csv'
Vladislav Rykov's avatar
Vladislav Rykov committed
350

351
        with open(app.config['DATA_DOWNLOAD_DIR_OS']+'/'+fn, 'w+') as f: 
Vladislav Rykov's avatar
Vladislav Rykov committed
352
            f.write('utc,timestamp,')
Vladislav Rykov's avatar
Vladislav Rykov committed
353
354
            for d in dumpd[1][0][2]:
                f.write(d)
Vladislav Rykov's avatar
Vladislav Rykov committed
355
356
                f.write(',')
            f.write('\n')
Vladislav Rykov's avatar
Vladislav Rykov committed
357
358
        
            for row in dumpd[1]:
Vladislav Rykov's avatar
Vladislav Rykov committed
359
                f.write('{},{},'.format(row[0],row[1]))
Vladislav Rykov's avatar
Vladislav Rykov committed
360
361
362
363
                for v in row[2]:
                    f.write(str(row[2][v]))
                    f.write(',')
                f.write('\n')
Vladislav Rykov's avatar
Vladislav Rykov committed
364
    
Vladislav Rykov's avatar
Vladislav Rykov committed
365
        return send_from_directory(app.config['DATA_DOWNLOAD_DIR'], fn, as_attachment=True)
Vladislav Rykov's avatar
Vladislav Rykov committed
366
367
    else:
        return redirect(utl_for('index'))
368
369


Vladislav Rykov's avatar
Vladislav Rykov committed
370
371
372
373
374
375
376
377
378
379
380
381
382
@app.route('/dashboard', methods=['GET', 'POST'])
def dashboard():
    if 'role' in session and session['role'] == 'admin':
        user_cnt = ud.get_count()
        apps_cnt = ad.get_count()
        devs_cnt = dd.get_count_all()

        cur_pg = 1
        if request.args.get('p'):
            cur_pg = int(request.args.get('p'))
            if cur_pg < 1:
                cur_pg = 1

Vladislav Rykov's avatar
Vladislav Rykov committed
383
        users = None
Vladislav Rykov's avatar
Vladislav Rykov committed
384
        
Vladislav Rykov's avatar
Vladislav Rykov committed
385
386
        if request.method == 'POST':
            session['users_filter'] = request.form['username']
Vladislav Rykov's avatar
Vladislav Rykov committed
387
            
Vladislav Rykov's avatar
Vladislav Rykov committed
388
389
390
391
        if 'users_filter' in session:
            users = ud.get_range_name(session['users_filter'], [MAX_PG_ENTRIES_USERS, (cur_pg-1)*MAX_PG_ENTRIES_USERS])
            print(users)
            rd = misc.paging(cur_pg, len(users[1]), MAX_PG_ENTRIES_USERS, MAX_PG)
Vladislav Rykov's avatar
Vladislav Rykov committed
392
        else:
Vladislav Rykov's avatar
Vladislav Rykov committed
393
394
395
396
            users = ud.get_range([MAX_PG_ENTRIES_USERS, (cur_pg-1)*MAX_PG_ENTRIES_USERS])
            rd = misc.paging(cur_pg, user_cnt[1][0], MAX_PG_ENTRIES_USERS, MAX_PG)
        
        return render_template('admin/dashboard.html', users_cnt=user_cnt[1][0], apps_cnt=apps_cnt[1][0], dev_cnt=devs_cnt, users=users[1], pp=rd[0], pr=rd[1], np=rd[2], cp=cur_pg, usn=(cur_pg-1)*MAX_PG_ENTRIES_USERS+1)
Vladislav Rykov's avatar
Vladislav Rykov committed
397
398
399
    else:
        return redirect(url_for('index'))

Vladislav Rykov's avatar
Vladislav Rykov committed
400
401
402
403
404
405
406

@app.route('/dashboard-clean-search')
def dashboard_clean_search():
    if 'users_filter' in session:
        session.pop('users_filter', None)
    return redirect(url_for('dashboard'))

407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426

@app.route('/user')
def user():
    if 'role' in session and session['role'] == 'admin':
        name = request.args.get('name')
        apps = ad.get_list(name)
        
        session.pop('appkey', None)
        # print('apps: ', apps)
        if apps[0]:
            return render_template('admin/user.html', apps=apps[1], username=name)
        else:
            return render_template('admin/user.html', feedback=apps[1], username=name)
    else:
        return render_template('public/index.html')


@app.route('/user-delete')
def user_delete():
    user = ud.get(request.args.get('name'))
Vladislav Rykov's avatar
Vladislav Rykov committed
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
    if user[0] and user[1][2] != 'admin' and session['role'] == 'admin':
        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])
                print('devs: {}'.format(devs))
                for dev in devs[1]:
                    res = data.delete_table(app[1], dev[1])
                    print ('data del {}'.format(res))
                    if not res[0]:
                        break
    
                if res[0]:
                    res = dd.delete_table(app[1])
                    print ('devices del {}'.format(res))
                    
                if res[0]:
                    res = ad.delete(app[1])
                    print ('app del {}'.format(res))

                if not res[0]:
                    break

        if res[0]:
            res = ud.delete(user[1][0])
            print ('user del {}'.format(res))

        if not res[0]:
            flash('Error: {}'.format(res[1]), 'danger')
            return render_template('admin/user.html', username=user[1][0])
        else:
                return redirect(url_for('dashboard'))
    else:
        flash('Warning: the user is admin or does not exist.' ,'warning')
        return redirect(url_for('index'))
464

Vladislav Rykov's avatar
Vladislav Rykov committed
465

466
467
468
469
@app.route('/settings', methods=['GET', 'POST'])
def settings():
    if request.method == 'GET':
        if session['role'] == 'admin':
470
            return render_template('admin/settings.html', username=session['name'], users_signup=app.config['USERS_SIGNUP'])
471
472
473
474
475
476
477
478
479
480
481
482
483
484
        else:
            return render_template('public/settings.html', username=session['name'])
    else:
        if request.form['name'] != session['name']:
            res = ud.update_name(session['name'], request.form['name'])
            if not res[0]:
                flash('Error: {}'.format(res[1]), 'danger')
                return redirect(request.url);
            else:
                session['name'] = request.form['name']
        if request.form['password'] != '':
            res = ud.update_password(session['name'], request.form['password'].encode('utf-8'))
            if not res[0]:
                flash('Error: {}'.format(res[1]), 'danger')
485
486
487
488
489
490
                return redirect(request.url)
        if session['role'] == 'admin':
            if request.form.getlist('users_signup') and request.form.getlist('users_signup')[0] == 'us':
                app.config['USERS_SIGNUP'] = True
            else:
                app.config['USERS_SIGNUP'] = False
491
492


493
        return redirect(request.url)
494
495


496
497
@app.route('/dev-data/<var>/<dest>/<page>')
def dev_data(var, dest, page):
498
    if dest == 'graph':
499
        last = data.get_last_hours(session['appkey'], session['devid'], MAX_PG_ENTRIES_GRAPH_HOURS, int(page))
500
501
502
503
504
505
506
507
        arr = '[["Time", "{}"],'.format(var)
        if last[0]:
            for d in last[1]:
                arr += '[new Date('+str(d[0])+'*1000),'+str(d[2][var])+'],'
            arr += ']'
        return arr
    elif dest == 'table':
        # for table <cnt> is in items
508
        last = data.get_last_range(session['appkey'], session['devid'], [MAX_PG_ENTRIES_DATA, (int(page)-1)*MAX_PG_ENTRIES_DATA])
509
510
511
512
513
514
515
        #t = """ <thead>
        #            <th>Time</th>
        #            <th>{}</th>
        #        </thead>
        #        <tbody>
        #""".format(var)
        t = ''
516
517
518
        if last[0]:
            for d in last[1]:
                t += '<tr><th>'+d[1]+'</th><th>'+str(d[2][var])+'</th></tr>'
519
        #t += '</tbody>'
520
        return t
521
522


Vladislav Rykov's avatar
Vladislav Rykov committed
523
524
525
@app.route('/alerts')
def alerts():
    if 'name' in session:
526
        alerts = nfs.get_alerts_list(session['appkey'])
Vladislav Rykov's avatar
Vladislav Rykov committed
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
        return render_template('public/alerts.html', alert_list=alerts[1])
    else:
        return redirect(url_for('index'))

@app.route('/new-alert')
def new_alert():
    if 'name' in session:
        devs = dd.get_list(session['appkey'])
        return render_template('public/new-alert.html', devs=devs[1])
    else:
        return redirect(url_for('index'))


@app.route('/alert', methods=['POST'])
def alert():
542
543
544
545
546
547
    if 'name' in session:
        if request.method == 'POST':
            # create new notification
            nid = misc.rand_str(app.config['NID_LENGTH']).decode('utf-8')
            dev = dd.get(session['appkey'], request.form['devid'])

548
            desc = dev[1][0]+'.'+request.form['varname']+' '+request.form['operation']+' '+request.form['avalue']
549

550
            res = nfs.create(nid, session['appkey'], request.form['devid'], request.form['alertname'], desc, 'alert', request.form['alertemail'])
551
            if res[0]:
Vladislav Rykov's avatar
Vladislav Rykov committed
552
                # create new function and trigger
553
554
555
556
                r = tr.create_function(session['appkey'], request.form['devid'], nid, [request.form['varname'],request.form['operation'],request.form['avalue']])
                print ('tr.create_function', r)
                r = tr.create(session['appkey'], request.form['devid'], nid)
                print('tr.create', r)
557
558
559
560
561
562
563
564
                return redirect(url_for('alerts'))
            else:
                flash('Error creating new notification: {}'.format(res[1]), 'danger')
                return redirect(url_for('alerts'))
        else:
            return redirect(url_for('index'))
    else:
        return redirect(url_for('index'))
Vladislav Rykov's avatar
Vladislav Rykov committed
565
566
567
568

@app.route('/alert-rm')
def alarm_rm():
    if 'name' in session:
Vladislav Rykov's avatar
Vladislav Rykov committed
569
570
571
        nq.delete_list(session['appkey'])
        tr.delete(session['appkey'], request.args.get('devid'), request.args.get('id'))
        tr.delete_function(session['appkey'], request.args.get('devid'), request.args.get('id'))
572
        res = nfs.delete(session['appkey'], request.args.get('devid'), request.args.get('id'))
Vladislav Rykov's avatar
Vladislav Rykov committed
573
574

        if res[0]:
575
            flash('Alert removed', 'success')
Vladislav Rykov's avatar
Vladislav Rykov committed
576
577
            return redirect(url_for('alerts'))
        else:
578
            flash('Alert cannot be removed : {}'.format(res[1]), 'danger')
Vladislav Rykov's avatar
Vladislav Rykov committed
579
            return redirect(url_for('alerts'))
Vladislav Rykov's avatar
Vladislav Rykov committed
580
581
582
    else:
        return redirect(url_for('index'))

583
584
585
586
587
588
589

@app.route('/automation', methods=['GET','POST'])
def automation():
    if 'name' in session:
        if request.method == 'GET':
            auto = nfs.get_automation_list(session['appkey'])
            return render_template('public/automation.html', auto_list=auto[1])
590
591
592
        elif request.method == 'POST':
            # new automation
            return redirect(url_for('autmation'))
593
594
595
596
597
598
599
600
601
602
603
604
605
    else:
        return redirect(url_for('index'))


@app.route('/new-automation')
def new_automation():
    if 'name' in session:
        devs = dd.get_list(session['appkey'])
        return render_template('public/new-automation.html', devs=devs[1])
    else:
        return redirect(url_for('index'))


606
607
def pend_delete_all_ack():
    pend.delete_all_ack()
Vladislav Rykov's avatar
Vladislav Rykov committed
608

609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
def fire_notifications(app):
    fnfs = nq.get_all()
    print ('nq.get_all ', fnfs)
    if fnfs[0]:
        for fnf in fnfs[1]:
            nf = nfs.get(fnf[1], fnf[2], fnf[0])
            print('nfs.get ', nf)
            if nf[1][5] == 'alert':
                # send mail
                mailer.send_mail(app, nf[1], fnf)
                nq.delete(fnf[1], fnf[2], fnf[0])
                print('send alert mail')
            elif nf[1][5] == 'automation':
                # enqueue conf id
                print('automation')