server.py 6.76 KB
Newer Older
1
2
from flask import Flask, render_template, request, redirect, url_for, session
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
14
15

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

17
@server.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
        ah = ad.ApplicationDao()
        apps = ah.get_list(session['name'].encode('utf-8'))
Vladislav Rykov's avatar
Vladislav Rykov committed
22
23

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



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

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

53
54
55


@server.route('/login', methods=['GET', 'POST'])
Vladislav Rykov's avatar
Vladislav Rykov committed
56
def login():
Vladislav Rykov's avatar
Vladislav Rykov committed
57
58
59
60
    if request.method == 'GET':
        return render_template('login.html')
    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
65
66

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


77
78

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


84
85
86
87
88
89
90
91
92

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

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

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

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

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


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

Vladislav Rykov's avatar
Vladislav Rykov committed
163
164
165
        session['devid'] = dev[1][1]
        session['devname'] = dev[1][0]

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

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


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

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

Vladislav Rykov's avatar
Vladislav Rykov committed
210

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

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


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

    print(last)
    print(count)

    return render_template('dev-data.html', data=last[1], total=count[1][0])
Vladislav Rykov's avatar
Vladislav Rykov committed
229

230
if __name__ == '__main__':
231
232
233
234
    server.secret_key = 'sdjfklsjf^$654sd^#sPH'
    server.run(debug = True, host='0.0.0.0')