forked from w2g/w2g
-
Notifications
You must be signed in to change notification settings - Fork 0
/
__init__.py
78 lines (62 loc) · 2.22 KB
/
__init__.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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
__init__.py
~~~~~~~~~~~
Common utilities for views
:copyright: (c) 2015 by Mek.
:license: see LICENSE for more details.
"""
import calendar
from datetime import datetime
from flask import jsonify, request
from flask import Flask, jsonify
from flask.json import JSONEncoder
from api import db
class CustomJSONEncoder(JSONEncoder):
def default(self, obj):
try:
if isinstance(obj, datetime):
if obj.utcoffset() is not None:
obj = obj - obj.utcoffset()
millis = int(
calendar.timegm(obj.timetuple()) * 1000 +
obj.microsecond / 1000
)
return millis
iterable = iter(obj)
except TypeError:
pass
else:
return list(iterable)
return JSONEncoder.default(self, obj)
def rest(f):
def inner(*args, **kwargs):
try:
return jsonify(f(*args, **kwargs))
except Exception as e:
return jsonify({"error": str(e)})
finally:
db.rollback()
db.remove()
return inner
def paginate(limit=100, dump=lambda i, **opts: i.dict(**opts), **options):
"""Decorator for returning paginated json data"""
def outer(f):
def inner(self, cls, *args, **kwargs):
_limit = min(request.args.get("limit", limit), limit)
_offset = request.args.get("page", 0) * _limit
query = f(self, cls, *args, **kwargs)
items = query.limit(_limit).offset(_offset).all()
# consider returning total obj count and/or current limit + page
return {cls: [dump(i, **options) for i in items]}
return inner
return outer
def search(model, limit=50, lazy=True):
query = request.args.get('query')
field = request.args.get('field')
limit = min(request.args.get('limit', limit), limit)
if all([query, field, limit]):
return model.search(query, field=field, limit=limit, lazy=lazy)
raise ValueError('Query and field must be provided. Valid fields are: %s' \
% model.__table__.columns.keys())