server.py 8.09 KB
Newer Older
Vladislav Rykov's avatar
Vladislav Rykov committed
1
from flask import Flask, render_template, request, redirect, url_for, session, send_from_directory
2
import psycopg2
Vladislav Rykov's avatar
Vladislav Rykov committed
3
import bcrypt
4
import misc
Vladislav Rykov's avatar
Vladislav Rykov committed
5
import dao.user.user as ud
Vladislav Rykov's avatar
Vladislav Rykov committed
6
import dao.application.application as ad
7
import dao.device.device as dd
Vladislav Rykov's avatar
Vladislav Rykov committed
8
import dao.pend.pend as pend
Vladislav Rykov's avatar
Vladislav Rykov committed
9
import dao.data.data as data
Vladislav Rykov's avatar
Vladislav Rykov committed
10
import binascii
11
import os
Vladislav Rykov's avatar
Vladislav Rykov committed
12

13

14
APP_KEY_LEN = 8
Vladislav Rykov's avatar
Vladislav Rykov committed
15
DATA_DOWNLOAD_DIR = 'data'
16
17

server = Flask(__name__, template_folder='templates/')
Vladislav Rykov's avatar
Vladislav Rykov committed
18

19
@server.route('/')
20
def index():
Vladislav Rykov's avatar
Vladislav Rykov committed
21
    if 'name' in session and len(session['name']) > 0:
Vladislav Rykov's avatar
Vladislav Rykov committed
22
23
        ah = ad.ApplicationDao()
        apps = ah.get_list(session['name'].encode('utf-8'))
Vladislav Rykov's avatar
Vladislav Rykov committed
24
25

        session.pop('appkey', None)
Vladislav Rykov's avatar
Vladislav Rykov committed
26
        # print('apps: ', apps)
27
28
29
30
        if apps[0]:
            return render_template('index.html', apps=apps[1])
        else:
            return render_template('index.html', feedback=apps[1])
Vladislav Rykov's avatar
Vladislav Rykov committed
31
32
    else:
        return render_template('index.html')
33
34
35
36



@server.route('/signup', methods=['GET', 'POST'])
37
38
39
40
41
def signup():
    if request.method == 'GET':
        return render_template('signup.html')
    else: 
        username = request.form['username']
Vladislav Rykov's avatar
Vladislav Rykov committed
42
        password = request.form['password'].encode('utf-8')
43
44
45
46
47

        if (username == '' or password == ''):
            feedback = 'Username or password fields cannot be empty'
            return render_template('signup.html', feedback=feedback)
        else:
Vladislav Rykov's avatar
Vladislav Rykov committed
48
49
50
51
            uh = ud.UserDao()
            res = uh.create(username, password)
            if (not res[0]):
                return render_template('signup.html', feedback=res[1])
Vladislav Rykov's avatar
Vladislav Rykov committed
52
53
            else:
                session['name'] = username
54
        
Vladislav Rykov's avatar
Vladislav Rykov committed
55
                return redirect(url_for('index'))
56

57
58
59


@server.route('/login', methods=['GET', 'POST'])
Vladislav Rykov's avatar
Vladislav Rykov committed
60
def login():
Vladislav Rykov's avatar
Vladislav Rykov committed
61
62
63
64
    if request.method == 'GET':
        return render_template('login.html')
    else: 
        username = request.form['username']
Vladislav Rykov's avatar
Vladislav Rykov committed
65
        password = request.form['password'].encode('utf-8')
Vladislav Rykov's avatar
Vladislav Rykov committed
66
67
68
69
70

        if (username == '' or password == ''):
            feedback = 'Username or password fields cannot be empty'
            return render_template('login.html', feedback=feedback)
        else:
Vladislav Rykov's avatar
Vladislav Rykov committed
71
72
73
74
            uh = ud.UserDao()
            res = uh.get(username, password)
            if (not res[0]):
                return render_template('login.html', feedback=msg[1])
Vladislav Rykov's avatar
Vladislav Rykov committed
75
76
            else:
                session['name'] = username
Vladislav Rykov's avatar
Vladislav Rykov committed
77
        
Vladislav Rykov's avatar
Vladislav Rykov committed
78
79
80
                return redirect(url_for('index'))


81
82

@server.route('/logout')
Vladislav Rykov's avatar
Vladislav Rykov committed
83
84
85
def logout():
    session.clear()
    return redirect(url_for('index'))
Vladislav Rykov's avatar
Vladislav Rykov committed
86
87


88
89
90
91
92
93
94
95
96

@server.route('/new-app')
def new_application():
    return render_template('new-app.html')



@server.route('/app', methods=['GET', 'POST'])
def app():
Vladislav Rykov's avatar
Vladislav Rykov committed
97
    ah = ad.ApplicationDao()
98
    if request.method == 'GET':
99
        dh = dd.DeviceDao()
Vladislav Rykov's avatar
Vladislav Rykov committed
100
101
            
        session['appkey'] = request.args.get('appkey')
Vladislav Rykov's avatar
Vladislav Rykov committed
102

Vladislav Rykov's avatar
Vladislav Rykov committed
103
        app = ah.get(session['appkey'])
104
        devs = dh.get_list(app[1][1])
Vladislav Rykov's avatar
Vladislav Rykov committed
105
        
106
107
108
109
110
111
112
113
        try:
            filelist = [f for f in os.listdir(DATA_DOWNLOAD_DIR) if f.startswith(session['appkey'])]
            print(filelist)
            for f in filelist:
                os.remove(DATA_DOWNLOAD_DIR+'/'+f)
        except OSError:
            pass

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

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

Vladislav Rykov's avatar
Vladislav Rykov committed
154
155
156
157
158
@server.route('/add-dev')
def new_dev():
    dh = dd.DeviceDao()
    dev_list = dh.get_list(session['appkey'])
    
Vladislav Rykov's avatar
Vladislav Rykov committed
159
    #print('dev list : ', dev_list)
Vladislav Rykov's avatar
Vladislav Rykov committed
160
161
162
163

    if not dev_list[0]:
        return render_template('add-dev.html', feedback=dev_list[1])
    else:
Vladislav Rykov's avatar
Vladislav Rykov committed
164
        return render_template('add-dev.html', free_ids=misc.prep_id_range(dev_list[1]))
Vladislav Rykov's avatar
Vladislav Rykov committed
165
166
167
168
169
170
171
 


@server.route('/dev', methods=['GET', 'POST'])
def dev():
    dh = dd.DeviceDao()
    if request.method == 'GET':
172
        dev = dh.get(session['appkey'], request.args.get('id'))
Vladislav Rykov's avatar
Vladislav Rykov committed
173

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

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

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

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


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

Vladislav Rykov's avatar
Vladislav Rykov committed
217
218
219
220
221
222
223
224
        base64_args = binascii.b2a_base64(args).decode('utf-8')

        pend.create(session['appkey'], session['devid'], base64_args)

        #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
225
226
        
        return redirect(url_for('dev', id=session['devid']))
Vladislav Rykov's avatar
Vladislav Rykov committed
227

Vladislav Rykov's avatar
Vladislav Rykov committed
228

Vladislav Rykov's avatar
Vladislav Rykov committed
229
230
231
@server.route('/delete-dev')
def delete_dev():
    dh = dd.DeviceDao()
Vladislav Rykov's avatar
Vladislav Rykov committed
232
233
    data.delete_table(session['appkey'], session['devid'])
    res = dh.delete(session['appkey'], session['devid'])
Vladislav Rykov's avatar
Vladislav Rykov committed
234
235
236
237

    return redirect(url_for('app', appkey=session['appkey']))


Vladislav Rykov's avatar
Vladislav Rykov committed
238
239
@server.route('/dev-data')
def dev_data():
Vladislav Rykov's avatar
Vladislav Rykov committed
240
    last = data.get_last_n(session['appkey'], session['devid'], 10)  
Vladislav Rykov's avatar
Vladislav Rykov committed
241
242
    count = data.get_count(session['appkey'], session['devid'])

Vladislav Rykov's avatar
Vladislav Rykov committed
243
244
245
246
    last_ctr = 10
    if count[1][0] < 10:
        last_ctr = count[1][0]

Vladislav Rykov's avatar
Vladislav Rykov committed
247
248
    #print(last)
    #print(count)
Vladislav Rykov's avatar
Vladislav Rykov committed
249
    if count[1][0] > 0:
Vladislav Rykov's avatar
Vladislav Rykov committed
250
        return render_template('dev-data.html', data=last[1], total=count[1][0], lastctr=last_ctr, devname=session['devname'])
Vladislav Rykov's avatar
Vladislav Rykov committed
251
    else:
252
        return render_template('dev-data.html', devname=session['devname'])
Vladislav Rykov's avatar
Vladislav Rykov committed
253

Vladislav Rykov's avatar
Vladislav Rykov committed
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
@server.route('/data-csv')
def data_csv():
    dumpd = data.get_all(session['appkey'], session['devid'])

    fn = session['appkey']+ '_' +str(session['devid'])+ '.csv'

    with open(DATA_DOWNLOAD_DIR+'/'+fn, 'w') as f: 
        for d in dumpd[1][0][2]:
            f.write(d)
            f.write(',')
        f.write('\n')
        
        for row in dumpd[1]:
            for v in row[2]:
                f.write(str(row[2][v]))
                f.write(',')
            f.write('\n')
    
    return send_from_directory(DATA_DOWNLOAD_DIR, fn, as_attachment=True)
        

275
if __name__ == '__main__':
276
277
278
279
    server.secret_key = 'sdjfklsjf^$654sd^#sPH'
    server.run(debug = True, host='0.0.0.0')