-
-
Notifications
You must be signed in to change notification settings - Fork 27
/
Copy patheditable_table.py
93 lines (75 loc) · 2.29 KB
/
editable_table.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
from flask import Flask, render_template, request, abort
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), index=True)
age = db.Column(db.Integer, index=True)
address = db.Column(db.String(256))
phone = db.Column(db.String(20))
email = db.Column(db.String(120))
def to_dict(self):
return {
'id': self.id,
'name': self.name,
'age': self.age,
'address': self.address,
'phone': self.phone,
'email': self.email
}
db.create_all()
@app.route('/')
def index():
return render_template('editable_table.html')
@app.route('/api/data')
def data():
query = User.query
# search filter
search = request.args.get('search')
if search:
query = query.filter(db.or_(
User.name.like(f'%{search}%'),
User.email.like(f'%{search}%')
))
total = query.count()
# sorting
sort = request.args.get('sort')
if sort:
order = []
for s in sort.split(','):
direction = s[0]
name = s[1:]
if name not in ['name', 'age', 'email']:
name = 'name'
col = getattr(User, name)
if direction == '-':
col = col.desc()
order.append(col)
if order:
query = query.order_by(*order)
# pagination
start = request.args.get('start', type=int, default=-1)
length = request.args.get('length', type=int, default=-1)
if start != -1 and length != -1:
query = query.offset(start).limit(length)
# response
return {
'data': [user.to_dict() for user in query],
'total': total,
}
@app.route('/api/data', methods=['POST'])
def update():
data = request.get_json()
if 'id' not in data:
abort(400)
user = User.query.get(data['id'])
for field in ['name', 'age', 'address', 'phone', 'email']:
if field in data:
setattr(user, field, data[field])
db.session.commit()
return '', 204
if __name__ == '__main__':
app.run()