views.py 8.96 KB
Newer Older
Vladislav Rykov's avatar
Vladislav Rykov committed
1
2
3
from app import app

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

Vladislav Rykov's avatar
Vladislav Rykov committed
6
7
8
9
10
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
11

Vladislav Rykov's avatar
Vladislav Rykov committed
12
import app.helpers.misc as misc
Vladislav Rykov's avatar
Vladislav Rykov committed
13

14
import os
Vladislav Rykov's avatar
Vladislav Rykov committed
15

16

Vladislav Rykov's avatar
Vladislav Rykov committed
17
@app.route('/')
18
def index():
Vladislav Rykov's avatar
Vladislav Rykov committed
19
    if 'name' in session and len(session['name']) > 0:
Vladislav Rykov's avatar
Vladislav Rykov committed
20
21
        apps = ad.get_list(session['name'])
        
Vladislav Rykov's avatar
Vladislav Rykov committed
22
        session.pop('appkey', None)
Vladislav Rykov's avatar
Vladislav Rykov committed
23
        # print('apps: ', apps)
24
        if apps[0]:
Vladislav Rykov's avatar
Vladislav Rykov committed
25
            return render_template('public/index.html', apps=apps[1])
26
        else:
Vladislav Rykov's avatar
Vladislav Rykov committed
27
            return render_template('public/index.html', feedback=apps[1])
Vladislav Rykov's avatar
Vladislav Rykov committed
28
    else:
Vladislav Rykov's avatar
Vladislav Rykov committed
29
        return render_template('public/index.html')
30
31
32



Vladislav Rykov's avatar
Vladislav Rykov committed
33
@app.route('/signup', methods=['GET', 'POST'])
34
35
def signup():
    if request.method == 'GET':
Vladislav Rykov's avatar
Vladislav Rykov committed
36
        return render_template('public/signup.html')
37
38
    else: 
        username = request.form['username']
Vladislav Rykov's avatar
Vladislav Rykov committed
39
        password = request.form['password'].encode('utf-8')
40
41
42

        if (username == '' or password == ''):
            feedback = 'Username or password fields cannot be empty'
Vladislav Rykov's avatar
Vladislav Rykov committed
43
            return render_template('public/signup.html', feedback=feedback)
44
        else:
Vladislav Rykov's avatar
Vladislav Rykov committed
45
            res = ud.create(username, password)
Vladislav Rykov's avatar
Vladislav Rykov committed
46
            if (not res[0]):
Vladislav Rykov's avatar
Vladislav Rykov committed
47
                return render_template('public/signup.html', feedback=res[1])
Vladislav Rykov's avatar
Vladislav Rykov committed
48
49
            else:
                session['name'] = username
50
        
Vladislav Rykov's avatar
Vladislav Rykov committed
51
                return redirect(url_for('index'))
52

53
54


Vladislav Rykov's avatar
Vladislav Rykov committed
55
@app.route('/login', methods=['GET', 'POST'])
Vladislav Rykov's avatar
Vladislav Rykov committed
56
def login():
Vladislav Rykov's avatar
Vladislav Rykov committed
57
    if request.method == 'GET':
Vladislav Rykov's avatar
Vladislav Rykov committed
58
        return render_template('public/login.html')
Vladislav Rykov's avatar
Vladislav Rykov committed
59
60
    else: 
        username = request.form['username']
Vladislav Rykov's avatar
Vladislav Rykov committed
61
        password = request.form['password'].encode('utf-8')
Vladislav Rykov's avatar
Vladislav Rykov committed
62
63
64

        if (username == '' or password == ''):
            feedback = 'Username or password fields cannot be empty'
Vladislav Rykov's avatar
Vladislav Rykov committed
65
            return render_template('public/login.html', feedback=feedback)
Vladislav Rykov's avatar
Vladislav Rykov committed
66
        else:
Vladislav Rykov's avatar
Vladislav Rykov committed
67
            res = ud.get(username, password)
Vladislav Rykov's avatar
Vladislav Rykov committed
68
            if (not res[0]):
Vladislav Rykov's avatar
Vladislav Rykov committed
69
                return render_template('public/login.html', feedback=msg[1])
Vladislav Rykov's avatar
Vladislav Rykov committed
70
71
            else:
                session['name'] = username
Vladislav Rykov's avatar
Vladislav Rykov committed
72
        
Vladislav Rykov's avatar
Vladislav Rykov committed
73
74
75
                return redirect(url_for('index'))


76

Vladislav Rykov's avatar
Vladislav Rykov committed
77
@app.route('/logout')
Vladislav Rykov's avatar
Vladislav Rykov committed
78
79
80
def logout():
    session.clear()
    return redirect(url_for('index'))
Vladislav Rykov's avatar
Vladislav Rykov committed
81
82


83

Vladislav Rykov's avatar
Vladislav Rykov committed
84
@app.route('/new-app')
85
def new_application():
Vladislav Rykov's avatar
Vladislav Rykov committed
86
    if 'name' in session:
Vladislav Rykov's avatar
Vladislav Rykov committed
87
        return render_template('public/new-app.html')
Vladislav Rykov's avatar
Vladislav Rykov committed
88
89
    else:
        return redirect(url_for('index'))
90
91
92



Vladislav Rykov's avatar
Vladislav Rykov committed
93
94
@app.route('/app', methods=['GET', 'POST'])
def app_():
Vladislav Rykov's avatar
Vladislav Rykov committed
95
96
    if 'name' in session:
        if request.method == 'GET':
Vladislav Rykov's avatar
Vladislav Rykov committed
97
            
Vladislav Rykov's avatar
Vladislav Rykov committed
98
            session['appkey'] = request.args.get('appkey')
Vladislav Rykov's avatar
Vladislav Rykov committed
99

Vladislav Rykov's avatar
Vladislav Rykov committed
100
101
            ap = ad.get(session['appkey'])
            devs = dd.get_list(ap[1][1])
Vladislav Rykov's avatar
Vladislav Rykov committed
102
        
Vladislav Rykov's avatar
Vladislav Rykov committed
103
            try:
Vladislav Rykov's avatar
Vladislav Rykov committed
104
                filelist = [f for f in os.listdir(app.config['DATA_DOWNLOAD_DIR']) if f.startswith(session['appkey'])]
Vladislav Rykov's avatar
Vladislav Rykov committed
105
                for f in filelist:
Vladislav Rykov's avatar
Vladislav Rykov committed
106
                    os.remove(app.config['DATA_DOWNLOAD_DIR']+'/'+f)
Vladislav Rykov's avatar
Vladislav Rykov committed
107
108
109
110
            except OSError:
                pass

           # print('devs : ', devs)
Vladislav Rykov's avatar
Vladislav Rykov committed
111
            return render_template('public/app.html', app=ap[1], devs=devs[1])
112
        else:
Vladislav Rykov's avatar
Vladislav Rykov committed
113
114
            if request.form['appname'] == '':
                error = 'Application name cannot be empty.'
Vladislav Rykov's avatar
Vladislav Rykov committed
115
                return render_template('public/new-app.html', feedback=error)
Vladislav Rykov's avatar
Vladislav Rykov committed
116
            else:
Vladislav Rykov's avatar
Vladislav Rykov committed
117
                appkey = misc.rand_str(app.config['APPKEY_LENGTH'])
Vladislav Rykov's avatar
Vladislav Rykov committed
118
                res = ad.create(request.form['appname'], appkey, session['name'], request.form['appdesc'])
Vladislav Rykov's avatar
Vladislav Rykov committed
119
            
Vladislav Rykov's avatar
Vladislav Rykov committed
120
                if not res[0]:
Vladislav Rykov's avatar
Vladislav Rykov committed
121
                    return render_template('public/new-app.html', feedback=res[1])
Vladislav Rykov's avatar
Vladislav Rykov committed
122
            
Vladislav Rykov's avatar
Vladislav Rykov committed
123
                res = dd.create_table(appkey)
124
            
Vladislav Rykov's avatar
Vladislav Rykov committed
125
                if not res[0]:
Vladislav Rykov's avatar
Vladislav Rykov committed
126
                    ad.delete(appkey)
Vladislav Rykov's avatar
Vladislav Rykov committed
127
                    return render_template('public/new-app.html', feedback=res[1])
128
            
Vladislav Rykov's avatar
Vladislav Rykov committed
129
130
131
                return redirect(url_for('index'))
    else:
        return redirect(url_for('index'))
132

Vladislav Rykov's avatar
Vladislav Rykov committed
133
@app.route('/delete-app')
134
def delete_app():
Vladislav Rykov's avatar
Vladislav Rykov committed
135
    if 'name' in session:
Vladislav Rykov's avatar
Vladislav Rykov committed
136
        devs = dd.get_list(session['appkey'])
137
    
Vladislav Rykov's avatar
Vladislav Rykov committed
138
139
        for dev in devs[1]:
            data.delete_table(session['appkey'], dev[1])
140
    
Vladislav Rykov's avatar
Vladislav Rykov committed
141
        dd.delete_table(session['appkey'])
142
    
Vladislav Rykov's avatar
Vladislav Rykov committed
143
        res = ad.delete(session['appkey'])
144
    
Vladislav Rykov's avatar
Vladislav Rykov committed
145
        if not res[0]:
Vladislav Rykov's avatar
Vladislav Rykov committed
146
            return redirect(url_for('app_'))
Vladislav Rykov's avatar
Vladislav Rykov committed
147
148
        else:
            return redirect(url_for('index'))
149
150
    else:
        return redirect(url_for('index'))
151

Vladislav Rykov's avatar
Vladislav Rykov committed
152

Vladislav Rykov's avatar
Vladislav Rykov committed
153
@app.route('/add-dev')
Vladislav Rykov's avatar
Vladislav Rykov committed
154
def new_dev():
Vladislav Rykov's avatar
Vladislav Rykov committed
155
    if 'name' in session:
Vladislav Rykov's avatar
Vladislav Rykov committed
156
        dev_list = dd.get_list(session['appkey'])
Vladislav Rykov's avatar
Vladislav Rykov committed
157
    
Vladislav Rykov's avatar
Vladislav Rykov committed
158
    #print('dev list : ', dev_list)
Vladislav Rykov's avatar
Vladislav Rykov committed
159

Vladislav Rykov's avatar
Vladislav Rykov committed
160
        if not dev_list[0]:
Vladislav Rykov's avatar
Vladislav Rykov committed
161
            return render_template('public/add-dev.html', feedback=dev_list[1])
Vladislav Rykov's avatar
Vladislav Rykov committed
162
        else:
Vladislav Rykov's avatar
Vladislav Rykov committed
163
            return render_template('public/add-dev.html', free_ids=misc.prep_id_range(dev_list[1]))
Vladislav Rykov's avatar
Vladislav Rykov committed
164
    else:
Vladislav Rykov's avatar
Vladislav Rykov committed
165
        return redirect(url_for('index'))
Vladislav Rykov's avatar
Vladislav Rykov committed
166
167
168
 


Vladislav Rykov's avatar
Vladislav Rykov committed
169
@app.route('/dev', methods=['GET', 'POST'])
Vladislav Rykov's avatar
Vladislav Rykov committed
170
def dev():
Vladislav Rykov's avatar
Vladislav Rykov committed
171
172
    if 'name' in session:
        if request.method == 'GET':
Vladislav Rykov's avatar
Vladislav Rykov committed
173
            dev = dd.get(session['appkey'], request.args.get('id'))
Vladislav Rykov's avatar
Vladislav Rykov committed
174

Vladislav Rykov's avatar
Vladislav Rykov committed
175
            session['devid'] = int(dev[1][1])
Vladislav Rykov's avatar
Vladislav Rykov committed
176
            session['devname'] = dev[1][0]
Vladislav Rykov's avatar
Vladislav Rykov committed
177
        
Vladislav Rykov's avatar
Vladislav Rykov committed
178
            last = data.get_last_n(session['appkey'], session['devid'], 1)
Vladislav Rykov's avatar
Vladislav Rykov committed
179
        
Vladislav Rykov's avatar
Vladislav Rykov committed
180
            ltup = 'Device have not sent data yet'
Vladislav Rykov's avatar
Vladislav Rykov committed
181

Vladislav Rykov's avatar
Vladislav Rykov committed
182
183
            if last[0]:
                ltup = last[1][0][1]
184

Vladislav Rykov's avatar
Vladislav Rykov committed
185
            return render_template('public/dev.html', dev=dev[1], appkey=session['appkey'], ltup=ltup)
Vladislav Rykov's avatar
Vladislav Rykov committed
186
        else:
Vladislav Rykov's avatar
Vladislav Rykov committed
187
            res = dd.create(request.form['devname'], request.form['devid'], session['appkey'], request.form['devdesc'])
Vladislav Rykov's avatar
Vladislav Rykov committed
188

189
            if not res[0]:
Vladislav Rykov's avatar
Vladislav Rykov committed
190
                return render_template('public/add-dev.html', feedback=res[1])
191
            else:
Vladislav Rykov's avatar
Vladislav Rykov committed
192
193
194
                res = data.create_table(session['appkey'], request.form['devid'])
            
                if not res[0]:
Vladislav Rykov's avatar
Vladislav Rykov committed
195
                    dd.delete(session['appkey'], request.form['devid'])
Vladislav Rykov's avatar
Vladislav Rykov committed
196
                    return render_template('public/add-dev.html', feedback=res[1])
Vladislav Rykov's avatar
Vladislav Rykov committed
197
198
199
200
                else:
                    return redirect(url_for('app', appkey=session['appkey']))
    else:
        return redirect(url_for('index'))
Vladislav Rykov's avatar
Vladislav Rykov committed
201
202


Vladislav Rykov's avatar
Vladislav Rykov committed
203
@app.route('/dev-conf', methods=['GET', 'POST'])
Vladislav Rykov's avatar
Vladislav Rykov committed
204
def dev_conf():
Vladislav Rykov's avatar
Vladislav Rykov committed
205
206
    if 'name' in session and 'devid' in session:
        if request.method == 'GET':
Vladislav Rykov's avatar
Vladislav Rykov committed
207
            return render_template('public/dev-conf.html', devname=session['devname'])
Vladislav Rykov's avatar
Vladislav Rykov committed
208
        else:
Vladislav Rykov's avatar
Vladislav Rykov committed
209
        
Vladislav Rykov's avatar
Vladislav Rykov committed
210
211
212
213
            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
214
        
Vladislav Rykov's avatar
Vladislav Rykov committed
215
216
217
218
219
            bstr = bytes(request.form['arg'])
            i = 0
            while i < argslen - 1:
                args[2+i] = bstr[i]
                i += 1
Vladislav Rykov's avatar
Vladislav Rykov committed
220

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

Vladislav Rykov's avatar
Vladislav Rykov committed
223
            pend.create(session['appkey'], session['devid'], base64_args)
Vladislav Rykov's avatar
Vladislav Rykov committed
224
225
226
227
228

        #print('msg = ', args)
        #print('base64 = ', base64_args)
        #print(type(request.form['arg'].encode('utf-8')))
        #print(request.form['arg'].encode('utf-8'))
Vladislav Rykov's avatar
Vladislav Rykov committed
229
        
Vladislav Rykov's avatar
Vladislav Rykov committed
230
231
232
            return redirect(url_for('dev', id=session['devid']))
    else:
        return redirect(url_for('index'))
Vladislav Rykov's avatar
Vladislav Rykov committed
233

Vladislav Rykov's avatar
Vladislav Rykov committed
234

Vladislav Rykov's avatar
Vladislav Rykov committed
235
@app.route('/delete-dev')
Vladislav Rykov's avatar
Vladislav Rykov committed
236
def delete_dev():
Vladislav Rykov's avatar
Vladislav Rykov committed
237
238
    if 'name' in session and 'devid' in session:
        data.delete_table(session['appkey'], session['devid'])
Vladislav Rykov's avatar
Vladislav Rykov committed
239
        res = dd.delete(session['appkey'], session['devid'])
Vladislav Rykov's avatar
Vladislav Rykov committed
240

Vladislav Rykov's avatar
Vladislav Rykov committed
241
        return redirect(url_for('app_', appkey=session['appkey']))
Vladislav Rykov's avatar
Vladislav Rykov committed
242
243
    else:
        return redirect(utl_for('index'))
Vladislav Rykov's avatar
Vladislav Rykov committed
244
245


Vladislav Rykov's avatar
Vladislav Rykov committed
246
@app.route('/dev-data')
Vladislav Rykov's avatar
Vladislav Rykov committed
247
def dev_data():
Vladislav Rykov's avatar
Vladislav Rykov committed
248
249
250
251
252
253
254
255
    if 'name' in session and 'devid' in session:
        last = data.get_last_n(session['appkey'], session['devid'], 10)  
        count = data.get_count(session['appkey'], session['devid'])

        last_ctr = 10
        if count[1][0] < 10:
            last_ctr = count[1][0]

Vladislav Rykov's avatar
Vladislav Rykov committed
256
257
        #print(last[1][2][2])
        #print(type(last[1][2][2]))
Vladislav Rykov's avatar
Vladislav Rykov committed
258
259
        #print(count)
        if count[1][0] > 0:
Vladislav Rykov's avatar
Vladislav Rykov committed
260
            return render_template('public/dev-data.html', data=last[1], total=count[1][0], lastctr=last_ctr, devname=session['devname'])
Vladislav Rykov's avatar
Vladislav Rykov committed
261
        else:
Vladislav Rykov's avatar
Vladislav Rykov committed
262
            return render_template('public/dev-data.html', devname=session['devname'])
Vladislav Rykov's avatar
Vladislav Rykov committed
263
    else:
Vladislav Rykov's avatar
Vladislav Rykov committed
264
        return redirect(utl_for('index'))
Vladislav Rykov's avatar
Vladislav Rykov committed
265

Vladislav Rykov's avatar
Vladislav Rykov committed
266
@app.route('/data-csv')
Vladislav Rykov's avatar
Vladislav Rykov committed
267
def data_csv():
Vladislav Rykov's avatar
Vladislav Rykov committed
268
269
    if 'name' in session and 'devid' in session:
        dumpd = data.get_all(session['appkey'], session['devid'])
Vladislav Rykov's avatar
Vladislav Rykov committed
270

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

Vladislav Rykov's avatar
Vladislav Rykov committed
273
        with open(app.config['DATA_DOWNLOAD_DIR']+'/'+fn, 'w') as f: 
Vladislav Rykov's avatar
Vladislav Rykov committed
274
275
            for d in dumpd[1][0][2]:
                f.write(d)
Vladislav Rykov's avatar
Vladislav Rykov committed
276
277
                f.write(',')
            f.write('\n')
Vladislav Rykov's avatar
Vladislav Rykov committed
278
279
280
281
282
283
        
            for row in dumpd[1]:
                for v in row[2]:
                    f.write(str(row[2][v]))
                    f.write(',')
                f.write('\n')
Vladislav Rykov's avatar
Vladislav Rykov committed
284
    
Vladislav Rykov's avatar
Vladislav Rykov committed
285
        return send_from_directory(app.config['DATA_DOWNLOAD_DIR'], fn, as_attachment=True)
Vladislav Rykov's avatar
Vladislav Rykov committed
286
287
    else:
        return redirect(utl_for('index'))