server.py 7.51 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
11
import binascii

12

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

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

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

        session.pop('appkey', None)
Vladislav Rykov's avatar
Vladislav Rykov committed
25
        # print('apps: ', apps)
26
27
28
29
        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
30
31
    else:
        return render_template('index.html')
32
33
34
35



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

        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
47
48
49
50
            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
51
52
            else:
                session['name'] = username
53
        
Vladislav Rykov's avatar
Vladislav Rykov committed
54
                return redirect(url_for('index'))
55

56
57
58


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

        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
70
71
72
73
            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
74
75
            else:
                session['name'] = username
Vladislav Rykov's avatar
Vladislav Rykov committed
76
        
Vladislav Rykov's avatar
Vladislav Rykov committed
77
78
79
                return redirect(url_for('index'))


80
81

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


87
88
89
90
91
92
93
94
95

@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
96
    ah = ad.ApplicationDao()
97
    if request.method == 'GET':
98
        dh = dd.DeviceDao()
Vladislav Rykov's avatar
Vladislav Rykov committed
99
100
            
        session['appkey'] = request.args.get('appkey')
Vladislav Rykov's avatar
Vladislav Rykov committed
101

Vladislav Rykov's avatar
Vladislav Rykov committed
102
        app = ah.get(session['appkey'])
103
        devs = dh.get_list(app[1][1])
Vladislav Rykov's avatar
Vladislav Rykov committed
104
        
Vladislav Rykov's avatar
Vladislav Rykov committed
105
        # print('devs : ', devs)
106
        return render_template('app.html', app=app[1], devs=devs[1])
107
108
109
110
111
    else:
        if request.form['appname'] == '':
            error = 'Application name cannot be empty.'
            return render_template('new-app.html', feedback=error)
        else:
112
113
            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
114
            
Vladislav Rykov's avatar
Vladislav Rykov committed
115
116
117
            if not res[0]:
                return render_template('new-app.html', feedback=res[1])
            
118
119
120
121
122
123
124
            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
125
            return redirect(url_for('index'))
126

127
128
129
130
131
132
@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
133
        data.delete_table(session['appkey'], dev[1])
134
135
136
137
138
139
140
141
142
143
    
    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'))
144

Vladislav Rykov's avatar
Vladislav Rykov committed
145
146
147
148
149
@server.route('/add-dev')
def new_dev():
    dh = dd.DeviceDao()
    dev_list = dh.get_list(session['appkey'])
    
Vladislav Rykov's avatar
Vladislav Rykov committed
150
    #print('dev list : ', dev_list)
Vladislav Rykov's avatar
Vladislav Rykov committed
151
152
153
154

    if not dev_list[0]:
        return render_template('add-dev.html', feedback=dev_list[1])
    else:
Vladislav Rykov's avatar
Vladislav Rykov committed
155
        return render_template('add-dev.html', free_ids=misc.prep_id_range(dev_list[1]))
Vladislav Rykov's avatar
Vladislav Rykov committed
156
157
158
159
160
161
162
 


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

Vladislav Rykov's avatar
Vladislav Rykov committed
166
167
168
        session['devid'] = dev[1][1]
        session['devname'] = dev[1][0]

169
        return render_template('dev.html', dev=dev[1], appkey=session['appkey'], ltup=ltup)
Vladislav Rykov's avatar
Vladislav Rykov committed
170
171
    else:
        res = dh.create(request.form['devname'], request.form['devid'], session['appkey'], request.form['devdesc'])
172

Vladislav Rykov's avatar
Vladislav Rykov committed
173
174
175
        if not res[0]:
            return render_template('add-dev.html', feedback=res[1])
        else:
Vladislav Rykov's avatar
Vladislav Rykov committed
176
            res = data.create_table(session['appkey'], request.form['devid'])
177
178
179
180
181
            
            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
182
                return redirect(url_for('app', appkey=session['appkey']))
Vladislav Rykov's avatar
Vladislav Rykov committed
183
184


Vladislav Rykov's avatar
Vladislav Rykov committed
185
186
187
188
189
@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
190
        
Vladislav Rykov's avatar
Vladislav Rykov committed
191
192
193
194
195
        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
196
        bstr = bytes(request.form['arg'])
Vladislav Rykov's avatar
Vladislav Rykov committed
197
        i = 0
Vladislav Rykov's avatar
Vladislav Rykov committed
198
        while i < argslen - 1:
Vladislav Rykov's avatar
Vladislav Rykov committed
199
200
201
            args[2+i] = bstr[i]
            i += 1

Vladislav Rykov's avatar
Vladislav Rykov committed
202
203
204
205
206
207
208
209
        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
210
211
        
        return redirect(url_for('dev', id=session['devid']))
Vladislav Rykov's avatar
Vladislav Rykov committed
212

Vladislav Rykov's avatar
Vladislav Rykov committed
213

Vladislav Rykov's avatar
Vladislav Rykov committed
214
215
216
@server.route('/delete-dev')
def delete_dev():
    dh = dd.DeviceDao()
Vladislav Rykov's avatar
Vladislav Rykov committed
217
218
    data.delete_table(session['appkey'], session['devid'])
    res = dh.delete(session['appkey'], session['devid'])
Vladislav Rykov's avatar
Vladislav Rykov committed
219
220
221
222

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


Vladislav Rykov's avatar
Vladislav Rykov committed
223
224
@server.route('/dev-data')
def dev_data():
Vladislav Rykov's avatar
Vladislav Rykov committed
225
226
227
    last = data.get_last_n(session['appkey'], session['devid'], 5)  
    count = data.get_count(session['appkey'], session['devid'])

Vladislav Rykov's avatar
Vladislav Rykov committed
228
229
    #print(last)
    #print(count)
Vladislav Rykov's avatar
Vladislav Rykov committed
230
231
232
233
    if count[1][0] > 0:
        return render_template('dev-data.html', data=last[1], total=count[1][0])
    else:
        return render_template('dev-data.html')
Vladislav Rykov's avatar
Vladislav Rykov committed
234

Vladislav Rykov's avatar
Vladislav Rykov committed
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
@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)
        

256
if __name__ == '__main__':
257
258
259
260
    server.secret_key = 'sdjfklsjf^$654sd^#sPH'
    server.run(debug = True, host='0.0.0.0')