1
+ import os
1
2
from flask .views import MethodView
2
3
from flask .templating import render_template
3
4
from flask .helpers import url_for
4
5
from flask import redirect , flash
5
6
from wtforms .form import FormMeta
7
+ from .basemodels import classproperty
6
8
7
- class BaseView (MethodView ):
9
+
10
+ is_verbose = lambda : os .environ .get ('VERBOSE' ) and True or False
11
+
12
+ class Flasher (object ):
13
+ DEFAULT_CATEGORY = 'warning'
14
+
15
+ def flash (self ,msg ,cat = None ):
16
+ cat = cat or self .DEFAULT_CATEGORY
17
+ flash (msg ,cat )
18
+
19
+ def add_warning (self ,* args ,** kwargs ):
20
+ self .flash (* args ,** kwargs )
21
+
22
+ def add_error (self ,msg ):
23
+ self .flash (msg = msg ,cat = 'danger' )
24
+
25
+ def add_info (self ,msg ):
26
+ self .flash (msg ,'info' )
27
+
28
+ def add_success (self ,msg ):
29
+ self .flash (msg ,'success' )
30
+
31
+ class BaseView (MethodView ,Flasher ):
8
32
_template = None
9
33
_form = None
10
34
_context = {}
11
35
_form_obj = None
12
36
_obj_id = None
13
37
_form_args = {}
38
+ _default_view_routes = {}
39
+
40
+ @classmethod
41
+ def _add_default_routes (cls ,app = None ):
42
+ for route ,endpoint in cls ._default_view_routes .items ():
43
+ if is_verbose ():
44
+ print 'attaching' ,route ,'to view func' ,endpoint
45
+ app .add_url_rule (route ,endpoint ,view_func = cls .as_view (endpoint ))
46
+
14
47
15
48
def render (self ,** kwargs ):
16
49
if self ._template is None :
@@ -35,6 +68,7 @@ def render(self,**kwargs):
35
68
inner_field = getattr (getattr (field ,field .__name__ ),getattr (fiels .__name__ ))
36
69
if hasattr (inner_field ,'choices' ):
37
70
setattr (inner_field ,'choices' ,choices )
71
+ # the 6 lines above replace the line below, delete it once we verify it works
38
72
#self._context['form'].template.template.choices = choices
39
73
for f ,v in self ._form_args .items ():
40
74
self ._form .__dict__ [f ].data = v
@@ -45,12 +79,6 @@ def redirect(self,endpoint,**kwargs):
45
79
return redirect (url_for (endpoint ,** kwargs ))
46
80
return redirect (endpoint ,** kwargs )
47
81
48
-
49
- def flash (self ,* args ,** kwargs ):
50
- if not 'category' in kwargs :
51
- kwargs ['category' ] = 'warning'
52
- flash (* args ,** kwargs )
53
-
54
82
def form_validated (self ):
55
83
if self ._form :
56
84
return self ._form ().validate ()
@@ -74,6 +102,14 @@ def get_env(self):
74
102
75
103
76
104
class ModelView (BaseView ):
105
+ # ModelView is an abstract class
106
+ # just an interface really
107
+ # to use the ModelView create your own view class
108
+ # and use this as the parent class, and
109
+ # set its _model class attr to the class to wrap ie:
110
+ #
111
+ # class UserModelView(ModelView):
112
+ # _model = User
77
113
_model = None
78
114
79
115
def render (self ,** kwargs ):
@@ -110,3 +146,28 @@ def update(self,model_id,**kwargs):
110
146
def get_by_id (self ,model_id ):
111
147
tmp = self ._model .get_by_id (model_id )
112
148
return tmp
149
+
150
+
151
+ class ModelAPIView (ModelView ):
152
+ __abstract__ = True
153
+
154
+ @classproperty
155
+ def _default_view_routes (cls ):
156
+ if cls is ModelAPIView :
157
+ return {}
158
+ name = cls .__name__ .lower ()
159
+ _default_view_routes = {
160
+ '/{}/list' .format (name ):'{}-list' .format (name ),
161
+ '/{}/detail' .format (name ):'{}-detail' .format (name ),
162
+ '/{}/edit' .format (name ):'{}-edit' .format (name ),
163
+ }
164
+ return _default_view_routes
165
+
166
+
167
+ def render (self ,** kwargs ):
168
+ old_rtn = super (ModelAPIView ,self ).render (** kwargs )
169
+ rtn = make_response (json .dumps (self ._context ))
170
+ rtn .headers ['Content-Type' ] = 'application/json'
171
+ return rtn
172
+
173
+
0 commit comments