flask-appbuilder 3.2.1rc1__py3-none-any.whl → 5.0.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. flask_appbuilder/__init__.py +2 -3
  2. flask_appbuilder/_compat.py +0 -1
  3. flask_appbuilder/actions.py +14 -14
  4. flask_appbuilder/api/__init__.py +741 -527
  5. flask_appbuilder/api/convert.py +104 -98
  6. flask_appbuilder/api/manager.py +14 -8
  7. flask_appbuilder/api/schemas.py +12 -1
  8. flask_appbuilder/babel/manager.py +12 -16
  9. flask_appbuilder/base.py +353 -280
  10. flask_appbuilder/basemanager.py +1 -1
  11. flask_appbuilder/baseviews.py +241 -164
  12. flask_appbuilder/charts/jsontools.py +10 -10
  13. flask_appbuilder/charts/views.py +56 -60
  14. flask_appbuilder/cli.py +115 -70
  15. flask_appbuilder/const.py +52 -52
  16. flask_appbuilder/exceptions.py +67 -5
  17. flask_appbuilder/fields.py +32 -23
  18. flask_appbuilder/fieldwidgets.py +34 -27
  19. flask_appbuilder/filemanager.py +33 -45
  20. flask_appbuilder/filters.py +11 -13
  21. flask_appbuilder/forms.py +31 -35
  22. flask_appbuilder/hooks.py +90 -0
  23. flask_appbuilder/menu.py +35 -10
  24. flask_appbuilder/models/base.py +47 -57
  25. flask_appbuilder/models/decorators.py +13 -13
  26. flask_appbuilder/models/filters.py +42 -38
  27. flask_appbuilder/models/generic/__init__.py +29 -29
  28. flask_appbuilder/models/generic/filters.py +11 -3
  29. flask_appbuilder/models/generic/interface.py +1 -3
  30. flask_appbuilder/models/group.py +37 -39
  31. flask_appbuilder/models/mixins.py +22 -18
  32. flask_appbuilder/models/sqla/__init__.py +19 -72
  33. flask_appbuilder/models/sqla/base.py +24 -0
  34. flask_appbuilder/models/sqla/base_legacy.py +132 -0
  35. flask_appbuilder/models/sqla/filters.py +132 -19
  36. flask_appbuilder/models/sqla/interface.py +390 -276
  37. flask_appbuilder/security/api.py +31 -35
  38. flask_appbuilder/security/decorators.py +181 -83
  39. flask_appbuilder/security/forms.py +20 -31
  40. flask_appbuilder/security/manager.py +715 -489
  41. flask_appbuilder/security/registerviews.py +29 -112
  42. flask_appbuilder/security/schemas.py +43 -0
  43. flask_appbuilder/security/sqla/apis/__init__.py +8 -0
  44. flask_appbuilder/security/sqla/apis/group/__init__.py +1 -0
  45. flask_appbuilder/security/sqla/apis/group/api.py +227 -0
  46. flask_appbuilder/security/sqla/apis/group/schema.py +73 -0
  47. flask_appbuilder/security/sqla/apis/permission/__init__.py +1 -0
  48. flask_appbuilder/security/sqla/apis/permission/api.py +19 -0
  49. flask_appbuilder/security/sqla/apis/permission_view_menu/__init__.py +1 -0
  50. flask_appbuilder/security/sqla/apis/permission_view_menu/api.py +16 -0
  51. flask_appbuilder/security/sqla/apis/role/__init__.py +1 -0
  52. flask_appbuilder/security/sqla/apis/role/api.py +306 -0
  53. flask_appbuilder/security/sqla/apis/role/schema.py +27 -0
  54. flask_appbuilder/security/sqla/apis/user/__init__.py +1 -0
  55. flask_appbuilder/security/sqla/apis/user/api.py +292 -0
  56. flask_appbuilder/security/sqla/apis/user/schema.py +97 -0
  57. flask_appbuilder/security/sqla/apis/user/validator.py +27 -0
  58. flask_appbuilder/security/sqla/apis/view_menu/__init__.py +1 -0
  59. flask_appbuilder/security/sqla/apis/view_menu/api.py +18 -0
  60. flask_appbuilder/security/sqla/manager.py +421 -203
  61. flask_appbuilder/security/sqla/models.py +192 -57
  62. flask_appbuilder/security/utils.py +9 -0
  63. flask_appbuilder/security/views.py +232 -229
  64. flask_appbuilder/static/.DS_Store +0 -0
  65. flask_appbuilder/static/appbuilder/css/ab.css +20 -12
  66. flask_appbuilder/static/appbuilder/css/bootstrap-datepicker/bootstrap-datepicker3.min.css +7 -0
  67. flask_appbuilder/static/appbuilder/css/bootstrap.min.css.map +1 -0
  68. flask_appbuilder/static/appbuilder/css/flags/flags16.css +249 -245
  69. flask_appbuilder/static/appbuilder/css/fontawesome/all.min.css +6 -0
  70. flask_appbuilder/static/appbuilder/css/fontawesome/brands.min.css +6 -0
  71. flask_appbuilder/static/appbuilder/css/fontawesome/fontawesome.min.css +6 -0
  72. flask_appbuilder/static/appbuilder/css/fontawesome/regular.min.css +6 -0
  73. flask_appbuilder/static/appbuilder/css/fontawesome/solid.min.css +6 -0
  74. flask_appbuilder/static/appbuilder/css/fontawesome/svg-with-js.min.css +6 -0
  75. flask_appbuilder/static/appbuilder/css/fontawesome/v4-font-face.min.css +6 -0
  76. flask_appbuilder/static/appbuilder/css/fontawesome/v4-shims.min.css +6 -0
  77. flask_appbuilder/static/appbuilder/css/fontawesome/v5-font-face.min.css +6 -0
  78. flask_appbuilder/static/appbuilder/css/images/flags16.png +0 -0
  79. flask_appbuilder/static/appbuilder/css/select2/select2-bootstrap.min.css +7 -0
  80. flask_appbuilder/static/appbuilder/css/select2/select2.min.css +1 -0
  81. flask_appbuilder/static/appbuilder/css/swagger/swagger-ui.css +3 -0
  82. flask_appbuilder/static/appbuilder/css/webfonts/fa-brands-400.ttf +0 -0
  83. flask_appbuilder/static/appbuilder/css/webfonts/fa-brands-400.woff2 +0 -0
  84. flask_appbuilder/static/appbuilder/css/webfonts/fa-regular-400.ttf +0 -0
  85. flask_appbuilder/static/appbuilder/css/webfonts/fa-regular-400.woff2 +0 -0
  86. flask_appbuilder/static/appbuilder/css/webfonts/fa-solid-900.ttf +0 -0
  87. flask_appbuilder/static/appbuilder/css/webfonts/fa-solid-900.woff2 +0 -0
  88. flask_appbuilder/static/appbuilder/css/webfonts/fa-v4compatibility.ttf +0 -0
  89. flask_appbuilder/static/appbuilder/css/webfonts/fa-v4compatibility.woff2 +0 -0
  90. flask_appbuilder/static/appbuilder/js/ab.js +33 -23
  91. flask_appbuilder/static/appbuilder/js/ab_filters.js +91 -84
  92. flask_appbuilder/static/appbuilder/js/bootstrap-datepicker/bootstrap-datepicker.min.js +8 -0
  93. flask_appbuilder/static/appbuilder/js/jquery-latest.js +2 -2
  94. flask_appbuilder/static/appbuilder/js/select2/select2.min.js +2 -0
  95. flask_appbuilder/static/appbuilder/js/swagger-ui-bundle.js +3 -0
  96. flask_appbuilder/templates/appbuilder/baselib.html +9 -3
  97. flask_appbuilder/templates/appbuilder/general/lib.html +60 -34
  98. flask_appbuilder/templates/appbuilder/general/model/edit.html +1 -1
  99. flask_appbuilder/templates/appbuilder/general/model/edit_cascade.html +1 -1
  100. flask_appbuilder/templates/appbuilder/general/model/search.html +3 -2
  101. flask_appbuilder/templates/appbuilder/general/model/show.html +1 -1
  102. flask_appbuilder/templates/appbuilder/general/model/show_cascade.html +1 -1
  103. flask_appbuilder/templates/appbuilder/general/security/login_db.html +7 -7
  104. flask_appbuilder/templates/appbuilder/general/security/login_ldap.html +5 -5
  105. flask_appbuilder/templates/appbuilder/general/security/login_oauth.html +24 -49
  106. flask_appbuilder/templates/appbuilder/general/widgets/base_list.html +2 -1
  107. flask_appbuilder/templates/appbuilder/general/widgets/chart.html +4 -2
  108. flask_appbuilder/templates/appbuilder/general/widgets/direct_chart.html +4 -3
  109. flask_appbuilder/templates/appbuilder/general/widgets/multiple_chart.html +3 -2
  110. flask_appbuilder/templates/appbuilder/general/widgets/search.html +11 -10
  111. flask_appbuilder/templates/appbuilder/init.html +37 -43
  112. flask_appbuilder/templates/appbuilder/navbar_menu.html +1 -1
  113. flask_appbuilder/templates/appbuilder/navbar_right.html +2 -2
  114. flask_appbuilder/templates/appbuilder/swagger/swagger.html +22 -19
  115. flask_appbuilder/translations/de/LC_MESSAGES/messages.mo +0 -0
  116. flask_appbuilder/translations/de/LC_MESSAGES/messages.po +305 -161
  117. flask_appbuilder/translations/fa/LC_MESSAGES/messages.mo +0 -0
  118. flask_appbuilder/translations/fa/LC_MESSAGES/messages.po +802 -0
  119. flask_appbuilder/translations/fr/LC_MESSAGES/messages.po +461 -319
  120. flask_appbuilder/translations/pt_BR/LC_MESSAGES/messages.po +650 -650
  121. flask_appbuilder/translations/ru/LC_MESSAGES/messages.po +1 -1
  122. flask_appbuilder/translations/sl/LC_MESSAGES/messages.mo +0 -0
  123. flask_appbuilder/translations/sl/LC_MESSAGES/messages.po +690 -0
  124. flask_appbuilder/translations/tr/LC_MESSAGES/messages.mo +0 -0
  125. flask_appbuilder/translations/tr/LC_MESSAGES/messages.po +1015 -0
  126. flask_appbuilder/upload.py +20 -22
  127. flask_appbuilder/urltools.py +39 -19
  128. flask_appbuilder/utils/base.py +76 -0
  129. flask_appbuilder/utils/legacy.py +33 -0
  130. flask_appbuilder/utils/limit.py +20 -0
  131. flask_appbuilder/validators.py +73 -14
  132. flask_appbuilder/views.py +75 -424
  133. flask_appbuilder/widgets.py +50 -51
  134. {Flask_AppBuilder-3.2.1rc1.dist-info → flask_appbuilder-5.0.2.dist-info}/METADATA +36 -76
  135. flask_appbuilder-5.0.2.dist-info/RECORD +240 -0
  136. {Flask_AppBuilder-3.2.1rc1.dist-info → flask_appbuilder-5.0.2.dist-info}/WHEEL +1 -1
  137. flask_appbuilder-5.0.2.dist-info/entry_points.txt +2 -0
  138. Flask_AppBuilder-3.2.1rc1.dist-info/RECORD +0 -270
  139. Flask_AppBuilder-3.2.1rc1.dist-info/entry_points.txt +0 -6
  140. flask_appbuilder/console.py +0 -426
  141. flask_appbuilder/models/mongoengine/__init__.py +0 -0
  142. flask_appbuilder/models/mongoengine/fields.py +0 -65
  143. flask_appbuilder/models/mongoengine/filters.py +0 -145
  144. flask_appbuilder/models/mongoengine/interface.py +0 -328
  145. flask_appbuilder/security/mongoengine/__init__.py +0 -0
  146. flask_appbuilder/security/mongoengine/manager.py +0 -402
  147. flask_appbuilder/security/mongoengine/models.py +0 -120
  148. flask_appbuilder/static/appbuilder/css/font-awesome.min.css +0 -4
  149. flask_appbuilder/static/appbuilder/datepicker/bootstrap-datepicker.css +0 -9
  150. flask_appbuilder/static/appbuilder/datepicker/bootstrap-datepicker.js +0 -28
  151. flask_appbuilder/static/appbuilder/fonts/FontAwesome.otf +0 -0
  152. flask_appbuilder/static/appbuilder/fonts/fontawesome-webfont.eot +0 -0
  153. flask_appbuilder/static/appbuilder/fonts/fontawesome-webfont.svg +0 -2671
  154. flask_appbuilder/static/appbuilder/fonts/fontawesome-webfont.ttf +0 -0
  155. flask_appbuilder/static/appbuilder/fonts/fontawesome-webfont.woff +0 -0
  156. flask_appbuilder/static/appbuilder/fonts/fontawesome-webfont.woff2 +0 -0
  157. flask_appbuilder/static/appbuilder/img/aol.png +0 -0
  158. flask_appbuilder/static/appbuilder/img/flags/flags16.png +0 -0
  159. flask_appbuilder/static/appbuilder/img/flickr.png +0 -0
  160. flask_appbuilder/static/appbuilder/img/google.png +0 -0
  161. flask_appbuilder/static/appbuilder/img/myopenid.png +0 -0
  162. flask_appbuilder/static/appbuilder/img/yahoo.png +0 -0
  163. flask_appbuilder/static/appbuilder/js/_google_charts.js +0 -39
  164. flask_appbuilder/static/appbuilder/js/html5shiv.js +0 -8
  165. flask_appbuilder/static/appbuilder/js/respond.min.js +0 -6
  166. flask_appbuilder/static/appbuilder/select2/select2-spinner.gif +0 -0
  167. flask_appbuilder/static/appbuilder/select2/select2.css +0 -1205
  168. flask_appbuilder/static/appbuilder/select2/select2.js +0 -23
  169. flask_appbuilder/static/appbuilder/select2/select2.png +0 -0
  170. flask_appbuilder/static/appbuilder/select2/select2x2.png +0 -0
  171. flask_appbuilder/templates/appbuilder/general/security/login_oid.html +0 -129
  172. flask_appbuilder/templates/appbuilder/general/security/resetpassword.html +0 -29
  173. flask_appbuilder/tests/__init__.py +0 -0
  174. flask_appbuilder/tests/__pycache__/__init__.cpython-36.pyc +0 -0
  175. flask_appbuilder/tests/__pycache__/__init__.cpython-37.pyc +0 -0
  176. flask_appbuilder/tests/__pycache__/_test_auth_ldap.cpython-37.pyc +0 -0
  177. flask_appbuilder/tests/__pycache__/_test_auth_oauth.cpython-37.pyc +0 -0
  178. flask_appbuilder/tests/__pycache__/_test_ldapsearch.cpython-36.pyc +0 -0
  179. flask_appbuilder/tests/__pycache__/_test_oauth_registration_role.cpython-36.pyc +0 -0
  180. flask_appbuilder/tests/__pycache__/base.cpython-36.pyc +0 -0
  181. flask_appbuilder/tests/__pycache__/base.cpython-37.pyc +0 -0
  182. flask_appbuilder/tests/__pycache__/config_api.cpython-36.pyc +0 -0
  183. flask_appbuilder/tests/__pycache__/config_api.cpython-37.pyc +0 -0
  184. flask_appbuilder/tests/__pycache__/const.cpython-36.pyc +0 -0
  185. flask_appbuilder/tests/__pycache__/const.cpython-37.pyc +0 -0
  186. flask_appbuilder/tests/__pycache__/test_0_fixture.cpython-36.pyc +0 -0
  187. flask_appbuilder/tests/__pycache__/test_0_fixture.cpython-37.pyc +0 -0
  188. flask_appbuilder/tests/__pycache__/test_api.cpython-36.pyc +0 -0
  189. flask_appbuilder/tests/__pycache__/test_api.cpython-37.pyc +0 -0
  190. flask_appbuilder/tests/__pycache__/test_fab_cli.cpython-36.pyc +0 -0
  191. flask_appbuilder/tests/__pycache__/test_fab_cli.cpython-37.pyc +0 -0
  192. flask_appbuilder/tests/__pycache__/test_menu.cpython-36.pyc +0 -0
  193. flask_appbuilder/tests/__pycache__/test_menu.cpython-37.pyc +0 -0
  194. flask_appbuilder/tests/__pycache__/test_mongoengine.cpython-36.pyc +0 -0
  195. flask_appbuilder/tests/__pycache__/test_mvc.cpython-36.pyc +0 -0
  196. flask_appbuilder/tests/__pycache__/test_mvc.cpython-37.pyc +0 -0
  197. flask_appbuilder/tests/__pycache__/test_sqlalchemy.cpython-36.pyc +0 -0
  198. flask_appbuilder/tests/__pycache__/test_sqlalchemy.cpython-37.pyc +0 -0
  199. flask_appbuilder/tests/_test_auth_ldap.py +0 -1045
  200. flask_appbuilder/tests/_test_auth_oauth.py +0 -419
  201. flask_appbuilder/tests/_test_ldapsearch.py +0 -135
  202. flask_appbuilder/tests/_test_oauth_registration_role.py +0 -59
  203. flask_appbuilder/tests/app.db +0 -0
  204. flask_appbuilder/tests/base.py +0 -90
  205. flask_appbuilder/tests/config_api.py +0 -21
  206. flask_appbuilder/tests/const.py +0 -9
  207. flask_appbuilder/tests/mongoengine/__init__.py +0 -0
  208. flask_appbuilder/tests/mongoengine/__pycache__/__init__.cpython-36.pyc +0 -0
  209. flask_appbuilder/tests/mongoengine/__pycache__/__init__.cpython-37.pyc +0 -0
  210. flask_appbuilder/tests/mongoengine/__pycache__/models.cpython-36.pyc +0 -0
  211. flask_appbuilder/tests/mongoengine/models.py +0 -41
  212. flask_appbuilder/tests/sqla/__init__.py +0 -0
  213. flask_appbuilder/tests/sqla/__pycache__/__init__.cpython-36.pyc +0 -0
  214. flask_appbuilder/tests/sqla/__pycache__/__init__.cpython-37.pyc +0 -0
  215. flask_appbuilder/tests/sqla/__pycache__/models.cpython-36.pyc +0 -0
  216. flask_appbuilder/tests/sqla/__pycache__/models.cpython-37.pyc +0 -0
  217. flask_appbuilder/tests/sqla/models.py +0 -340
  218. flask_appbuilder/tests/test_0_fixture.py +0 -39
  219. flask_appbuilder/tests/test_api.py +0 -2790
  220. flask_appbuilder/tests/test_fab_cli.py +0 -72
  221. flask_appbuilder/tests/test_menu.py +0 -122
  222. flask_appbuilder/tests/test_mongoengine.py +0 -572
  223. flask_appbuilder/tests/test_mvc.py +0 -1710
  224. flask_appbuilder/tests/test_sqlalchemy.py +0 -24
  225. flask_appbuilder/translations/__pycache__/__init__.cpython-36.pyc +0 -0
  226. flask_appbuilder/translations/es/LC_MESSAGES/messages.po~ +0 -582
  227. {Flask_AppBuilder-3.2.1rc1.dist-info → flask_appbuilder-5.0.2.dist-info}/LICENSE +0 -0
  228. {Flask_AppBuilder-3.2.1rc1.dist-info → flask_appbuilder-5.0.2.dist-info}/top_level.txt +0 -0
@@ -1,328 +0,0 @@
1
- import logging
2
- import sys
3
-
4
- from mongoengine.fields import (
5
- BooleanField,
6
- DateTimeField,
7
- FileField,
8
- FloatField,
9
- ImageField,
10
- IntField,
11
- ListField,
12
- ObjectIdField,
13
- ReferenceField,
14
- StringField,
15
- )
16
-
17
- from . import filters
18
- from ..base import BaseInterface
19
- from ..._compat import as_unicode
20
- from ...const import (
21
- LOGMSG_ERR_DBI_ADD_GENERIC,
22
- LOGMSG_ERR_DBI_DEL_GENERIC,
23
- LOGMSG_ERR_DBI_EDIT_GENERIC,
24
- )
25
-
26
- log = logging.getLogger(__name__)
27
-
28
-
29
- def _include_filters(obj):
30
- for key in filters.__all__:
31
- if not hasattr(obj, key):
32
- setattr(obj, key, getattr(filters, key))
33
-
34
-
35
- class MongoEngineInterface(BaseInterface):
36
-
37
- filter_converter_class = filters.MongoEngineFilterConverter
38
-
39
- def __init__(self, obj, session=None):
40
- self.session = session
41
- _include_filters(self)
42
- super(MongoEngineInterface, self).__init__(obj)
43
-
44
- @property
45
- def model_name(self):
46
- """
47
- Returns the models class name
48
- useful for auto title on views
49
- """
50
- return self.obj.__name__
51
-
52
- def query(
53
- self,
54
- filters=None,
55
- order_column="",
56
- order_direction="",
57
- page=None,
58
- page_size=None,
59
- ):
60
-
61
- # base query : all objects
62
- objs = self.obj.objects
63
-
64
- # apply filters first if given
65
- if filters:
66
- objs = filters.apply_all(objs)
67
-
68
- # get the count of all items, either filtered or unfiltered
69
- count = objs.count()
70
-
71
- # order the data
72
- if order_column != "":
73
- if hasattr(getattr(self.obj, order_column), "_col_name"):
74
- order_column = getattr(getattr(self.obj, order_column), "_col_name")
75
- if order_direction == "asc":
76
- objs = objs.order_by("-{0}".format(order_column))
77
- else:
78
- objs = objs.order_by("+{0}".format(order_column))
79
-
80
- if page_size is None: # error checking and warnings
81
- if page is not None:
82
- log.error("Attempting to get page %s but page_size is undefined" % page)
83
- if count > 100:
84
- log.warn("Retrieving %s %s items from DB" % (count, str(self.obj)))
85
- else: # get data segment for paginated page
86
- offset = (page or 0) * page_size
87
- objs = objs[offset : offset + page_size]
88
-
89
- return count, objs
90
-
91
- def is_object_id(self, col_name):
92
- try:
93
- return isinstance(self.obj._fields[col_name], ObjectIdField)
94
- except Exception:
95
- return False
96
-
97
- def is_string(self, col_name):
98
- try:
99
- return isinstance(self.obj._fields[col_name], StringField)
100
- except Exception:
101
- return False
102
-
103
- def is_integer(self, col_name):
104
- try:
105
- return isinstance(self.obj._fields[col_name], IntField)
106
- except Exception:
107
- return False
108
-
109
- def is_float(self, col_name):
110
- try:
111
- return isinstance(self.obj._fields[col_name], FloatField)
112
- except Exception:
113
- return False
114
-
115
- def is_boolean(self, col_name):
116
- try:
117
- return isinstance(self.obj._fields[col_name], BooleanField)
118
- except Exception:
119
- return False
120
-
121
- def is_datetime(self, col_name):
122
- try:
123
- return isinstance(self.obj._fields[col_name], DateTimeField)
124
- except Exception:
125
- return False
126
-
127
- def is_gridfs_file(self, col_name):
128
- try:
129
- return isinstance(self.obj._fields[col_name], FileField)
130
- except Exception:
131
- return False
132
-
133
- def is_gridfs_image(self, col_name):
134
- try:
135
- return isinstance(self.obj._fields[col_name], ImageField)
136
- except Exception:
137
- return False
138
-
139
- def is_relation(self, col_name):
140
- try:
141
- return isinstance(self.obj._fields[col_name], ReferenceField) or isinstance(
142
- self.obj._fields[col_name], ListField
143
- )
144
- except Exception:
145
- return False
146
-
147
- def is_relation_many_to_one(self, col_name):
148
- try:
149
- return isinstance(self.obj._fields[col_name], ReferenceField)
150
- except Exception:
151
- return False
152
-
153
- def is_relation_many_to_many(self, col_name):
154
- try:
155
- field = self.obj._fields[col_name]
156
- return isinstance(field, ListField) and isinstance(
157
- field.field, ReferenceField
158
- )
159
- except Exception:
160
- return False
161
-
162
- def is_relation_one_to_one(self, col_name):
163
- return False
164
-
165
- def is_relation_one_to_many(self, col_name):
166
- return False
167
-
168
- def is_nullable(self, col_name):
169
- return not self.obj._fields[col_name].required
170
-
171
- def is_unique(self, col_name):
172
- return self.obj._fields[col_name].unique
173
-
174
- def is_pk(self, col_name):
175
- return col_name == "id"
176
-
177
- def is_pk_composite(self):
178
- return False
179
-
180
- def get_max_length(self, col_name):
181
- try:
182
- col = self.obj._fields[col_name]
183
- if col.max_length:
184
- return col.max_length
185
- else:
186
- return -1
187
- except Exception:
188
- return -1
189
-
190
- def get_min_length(self, col_name):
191
- try:
192
- col = self.obj._fields[col_name]
193
- if col.min_length:
194
- return col.min_length
195
- else:
196
- return -1
197
- except Exception:
198
- return -1
199
-
200
- def add(self, item):
201
- try:
202
- item.save()
203
- self.message = (as_unicode(self.add_row_message), "success")
204
- return True
205
- except Exception as e:
206
- self.message = (
207
- as_unicode(self.general_error_message + " " + str(sys.exc_info()[0])),
208
- "danger",
209
- )
210
- log.exception(LOGMSG_ERR_DBI_ADD_GENERIC.format(str(e)))
211
- return False
212
-
213
- def edit(self, item):
214
- try:
215
- item.save()
216
- self.message = (as_unicode(self.edit_row_message), "success")
217
- return True
218
- except Exception as e:
219
- self.message = (
220
- as_unicode(self.general_error_message + " " + str(sys.exc_info()[0])),
221
- "danger",
222
- )
223
- log.exception(LOGMSG_ERR_DBI_EDIT_GENERIC.format(str(e)))
224
- return False
225
-
226
- def delete(self, item):
227
- try:
228
- item.delete()
229
- self.message = (as_unicode(self.delete_row_message), "success")
230
- return True
231
- except Exception as e:
232
- self.message = (
233
- as_unicode(self.general_error_message + " " + str(sys.exc_info()[0])),
234
- "danger",
235
- )
236
- log.exception(LOGMSG_ERR_DBI_DEL_GENERIC.format(str(e)))
237
- return False
238
-
239
- def get_columns_list(self):
240
- """
241
- modified: removing the '_cls' column added by Mongoengine to support
242
- mongodb document inheritance
243
- cf. http://docs.mongoengine.org/apireference.html#documents:
244
- "A Document subclass may be itself subclassed,
245
- to create a specialised version of the document that will be
246
- stored in the same collection.
247
- To facilitate this behaviour a _cls field is added to documents
248
- (hidden though the MongoEngine interface).
249
- To disable this behaviour and remove the dependence on the presence of _cls set
250
- allow_inheritance to False in the meta dictionary."
251
- """
252
- columns = list(self.obj._fields.keys())
253
- if "_cls" in columns:
254
- columns.remove("_cls")
255
- return columns
256
-
257
- def get_search_columns_list(self):
258
- ret_lst = list()
259
- for col_name in self.get_columns_list():
260
- for conversion in self.filter_converter_class.conversion_table:
261
- if getattr(self, conversion[0])(col_name) and not self.is_object_id(
262
- col_name
263
- ):
264
- ret_lst.append(col_name)
265
- return ret_lst
266
-
267
- def get_user_columns_list(self):
268
- """
269
- Returns all model's columns except pk
270
- """
271
- return [
272
- col_name for col_name in self.get_columns_list() if not self.is_pk(col_name)
273
- ]
274
-
275
- def get_order_columns_list(self, list_columns=None):
276
- """
277
- Returns the columns that can be ordered
278
-
279
- :param list_columns: optional list of columns name, if provided will
280
- use this list only.
281
- """
282
- ret_lst = list()
283
- list_columns = list_columns or self.get_columns_list()
284
- for col_name in list_columns:
285
- if hasattr(self.obj, col_name):
286
- if not hasattr(getattr(self.obj, col_name), "__call__"):
287
- ret_lst.append(col_name)
288
- else:
289
- ret_lst.append(col_name)
290
- return ret_lst
291
-
292
- def get_related_model(self, col_name):
293
- field = self.obj._fields[col_name]
294
- if isinstance(field, ListField):
295
- return field.field.document_type
296
- else:
297
- return field.document_type
298
-
299
- def get_related_interface(self, col_name):
300
- return self.__class__(self.get_related_model(col_name))
301
-
302
- def get_related_obj(self, col_name, value):
303
- rel_model = self.get_related_model(col_name)
304
- return rel_model.objects(pk=value)[0]
305
-
306
- def get_keys(self, lst):
307
- """
308
- return a list of pk values from object list
309
- """
310
- pk_name = self.get_pk_name()
311
- return [getattr(item, pk_name) for item in lst]
312
-
313
- def get_related_fk(self, model):
314
- for col_name in self.get_columns_list():
315
- if self.is_relation(col_name):
316
- if model == self.get_related_model(col_name):
317
- return col_name
318
-
319
- def get_pk_name(self):
320
- return "id"
321
-
322
- def get(self, id, filters=None):
323
- if filters:
324
- objs = self.obj.objects
325
- objs = filters.apply_all(objs)
326
- return objs(pk=id).first()
327
-
328
- return self.obj.objects(pk=id).first()
File without changes