-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcustom_wtf.py
136 lines (112 loc) · 4.57 KB
/
custom_wtf.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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# coding: utf-8
from flaskext.wtf import QuerySelectMultipleField, QuerySelectField
class CustomQuerySelectMultipleField(QuerySelectMultipleField):
def __init__(self, column=None, get_key=None, order_by=None, query_with=None, *args,**kws):
super(CustomQuerySelectMultipleField,self).__init__(*args,**kws)
query = self.query_factory()
if hasattr(query,'_entities'):
model = query._entities[0].type
elif hasattr(query,'impl'):
model = query.impl.class_
else:
assert False
if query_with is not None:
self.query = getattr(model, query_with)
else:
self.query = query
self.column = column or model.id
self.get_key = get_key or model.decode_id
self.order_by = order_by
def _get_data(self):
formdata = self._formdata
if formdata is None:
return self._data
keys = [self.get_key(x) for x in self._formdata]
# q = self.query_factory().filter(self.column.in_(keys))
q = self.query.filter(self.column.in_(keys))
if self.order_by is not None:
q = q.order_by(self.order_by)
data = q.all()
if len(data) != len(formdata):
self._invalid_formdata = True
self._set_data(data)
return data
def _set_data(self, data):
self._data = data
self._formdata = None
data = property(_get_data, _set_data)
def iter_choices(self):
for pk, obj in self._get_object_list():
yield (pk, self.get_label(obj), obj in self.data)
def process_formdata(self, valuelist):
self._formdata = set(valuelist)
def pre_validate(self, form):
if self._invalid_formdata:
raise ValidationError('Not a valid choice')
elif self.data:
return
obj_list = list(x[1] for x in self._get_object_list())
for v in self.data:
if v not in obj_list:
raise ValidationError('Not a valid choice')
class CustomQuerySelectField(QuerySelectField):
def __init__(self , column, **kws):
super(CustomQuerySelectField,self).__init__( **kws)
self.column = column
def _get_data(self):
if self._formdata is not None:
query = self.query or self.query_factory()
if isinstance(column, basestring):
obj = query.filter_by(**{column: self._formdata}).first()
else:
obj = query.filter(column==self._formdata).first()
self._set_data(obj)
return self._data
from flaskext.wtf import Form, TextField, TextAreaField, QuerySelectField, QuerySelectMultipleField, PasswordField, FileField, BooleanField, SelectField, RadioField, HiddenField, SelectMultipleField, IntegerField
#def getrows(form=None, _search=False, rows=None, page=None, sidx=None, sord=None):
def coerce_bool(s):
print "s:",s
return True
def p(s):
print "P:", s
class JqBooleanField(TextField):
def process_formdata(self, valuelist):
print "valuelist:", valuelist
if valuelist:
try:
self.data = "true" == valuelist[0]
#self.data = int(valuelist[0])
except ValueError:
raise ValueError(self.gettext(u'Not a valid integer value'))
class JsonField(TextField):
def process_formdata(self, valuelist):
if valuelist:
try:
import json
self.data = json.loads(valuelist[0])
#self.data = int(valuelist[0])
except ValueError:
raise ValueError(self.gettext(u'Not a valid integer value'))
class JqSearchField(JqBooleanField):
name = property(
lambda self:"_search",
lambda self, value: None
)
from wtforms.validators import ValidationError
class QueryTextField(TextField):
#raise ValidationError('Not a valid choice')
def __init__(self, *args, **kws):
to_obj = kws.pop("to_obj", None)
self.error_message = kws.pop("error_message", None)
TextField.__init__(self, *args, **kws)
self.to_obj = to_obj
def pre_validate(self, form):
if self.data is None and getattr(self,"_formdata", None):
raise ValidationError(self.error_message)
def process_formdata(self, valuelist):
self.allow_blank = True
self._formdata = valuelist[0].strip() if valuelist else None
if self._formdata is not None:
self.data = self.to_obj(self._formdata)
def _value(self):
return getattr(self,"_formdata", None) or u""