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.
- flask_appbuilder/__init__.py +2 -3
- flask_appbuilder/_compat.py +0 -1
- flask_appbuilder/actions.py +14 -14
- flask_appbuilder/api/__init__.py +741 -527
- flask_appbuilder/api/convert.py +104 -98
- flask_appbuilder/api/manager.py +14 -8
- flask_appbuilder/api/schemas.py +12 -1
- flask_appbuilder/babel/manager.py +12 -16
- flask_appbuilder/base.py +353 -280
- flask_appbuilder/basemanager.py +1 -1
- flask_appbuilder/baseviews.py +241 -164
- flask_appbuilder/charts/jsontools.py +10 -10
- flask_appbuilder/charts/views.py +56 -60
- flask_appbuilder/cli.py +115 -70
- flask_appbuilder/const.py +52 -52
- flask_appbuilder/exceptions.py +67 -5
- flask_appbuilder/fields.py +32 -23
- flask_appbuilder/fieldwidgets.py +34 -27
- flask_appbuilder/filemanager.py +33 -45
- flask_appbuilder/filters.py +11 -13
- flask_appbuilder/forms.py +31 -35
- flask_appbuilder/hooks.py +90 -0
- flask_appbuilder/menu.py +35 -10
- flask_appbuilder/models/base.py +47 -57
- flask_appbuilder/models/decorators.py +13 -13
- flask_appbuilder/models/filters.py +42 -38
- flask_appbuilder/models/generic/__init__.py +29 -29
- flask_appbuilder/models/generic/filters.py +11 -3
- flask_appbuilder/models/generic/interface.py +1 -3
- flask_appbuilder/models/group.py +37 -39
- flask_appbuilder/models/mixins.py +22 -18
- flask_appbuilder/models/sqla/__init__.py +19 -72
- flask_appbuilder/models/sqla/base.py +24 -0
- flask_appbuilder/models/sqla/base_legacy.py +132 -0
- flask_appbuilder/models/sqla/filters.py +132 -19
- flask_appbuilder/models/sqla/interface.py +390 -276
- flask_appbuilder/security/api.py +31 -35
- flask_appbuilder/security/decorators.py +181 -83
- flask_appbuilder/security/forms.py +20 -31
- flask_appbuilder/security/manager.py +715 -489
- flask_appbuilder/security/registerviews.py +29 -112
- flask_appbuilder/security/schemas.py +43 -0
- flask_appbuilder/security/sqla/apis/__init__.py +8 -0
- flask_appbuilder/security/sqla/apis/group/__init__.py +1 -0
- flask_appbuilder/security/sqla/apis/group/api.py +227 -0
- flask_appbuilder/security/sqla/apis/group/schema.py +73 -0
- flask_appbuilder/security/sqla/apis/permission/__init__.py +1 -0
- flask_appbuilder/security/sqla/apis/permission/api.py +19 -0
- flask_appbuilder/security/sqla/apis/permission_view_menu/__init__.py +1 -0
- flask_appbuilder/security/sqla/apis/permission_view_menu/api.py +16 -0
- flask_appbuilder/security/sqla/apis/role/__init__.py +1 -0
- flask_appbuilder/security/sqla/apis/role/api.py +306 -0
- flask_appbuilder/security/sqla/apis/role/schema.py +27 -0
- flask_appbuilder/security/sqla/apis/user/__init__.py +1 -0
- flask_appbuilder/security/sqla/apis/user/api.py +292 -0
- flask_appbuilder/security/sqla/apis/user/schema.py +97 -0
- flask_appbuilder/security/sqla/apis/user/validator.py +27 -0
- flask_appbuilder/security/sqla/apis/view_menu/__init__.py +1 -0
- flask_appbuilder/security/sqla/apis/view_menu/api.py +18 -0
- flask_appbuilder/security/sqla/manager.py +421 -203
- flask_appbuilder/security/sqla/models.py +192 -57
- flask_appbuilder/security/utils.py +9 -0
- flask_appbuilder/security/views.py +232 -229
- flask_appbuilder/static/.DS_Store +0 -0
- flask_appbuilder/static/appbuilder/css/ab.css +20 -12
- flask_appbuilder/static/appbuilder/css/bootstrap-datepicker/bootstrap-datepicker3.min.css +7 -0
- flask_appbuilder/static/appbuilder/css/bootstrap.min.css.map +1 -0
- flask_appbuilder/static/appbuilder/css/flags/flags16.css +249 -245
- flask_appbuilder/static/appbuilder/css/fontawesome/all.min.css +6 -0
- flask_appbuilder/static/appbuilder/css/fontawesome/brands.min.css +6 -0
- flask_appbuilder/static/appbuilder/css/fontawesome/fontawesome.min.css +6 -0
- flask_appbuilder/static/appbuilder/css/fontawesome/regular.min.css +6 -0
- flask_appbuilder/static/appbuilder/css/fontawesome/solid.min.css +6 -0
- flask_appbuilder/static/appbuilder/css/fontawesome/svg-with-js.min.css +6 -0
- flask_appbuilder/static/appbuilder/css/fontawesome/v4-font-face.min.css +6 -0
- flask_appbuilder/static/appbuilder/css/fontawesome/v4-shims.min.css +6 -0
- flask_appbuilder/static/appbuilder/css/fontawesome/v5-font-face.min.css +6 -0
- flask_appbuilder/static/appbuilder/css/images/flags16.png +0 -0
- flask_appbuilder/static/appbuilder/css/select2/select2-bootstrap.min.css +7 -0
- flask_appbuilder/static/appbuilder/css/select2/select2.min.css +1 -0
- flask_appbuilder/static/appbuilder/css/swagger/swagger-ui.css +3 -0
- flask_appbuilder/static/appbuilder/css/webfonts/fa-brands-400.ttf +0 -0
- flask_appbuilder/static/appbuilder/css/webfonts/fa-brands-400.woff2 +0 -0
- flask_appbuilder/static/appbuilder/css/webfonts/fa-regular-400.ttf +0 -0
- flask_appbuilder/static/appbuilder/css/webfonts/fa-regular-400.woff2 +0 -0
- flask_appbuilder/static/appbuilder/css/webfonts/fa-solid-900.ttf +0 -0
- flask_appbuilder/static/appbuilder/css/webfonts/fa-solid-900.woff2 +0 -0
- flask_appbuilder/static/appbuilder/css/webfonts/fa-v4compatibility.ttf +0 -0
- flask_appbuilder/static/appbuilder/css/webfonts/fa-v4compatibility.woff2 +0 -0
- flask_appbuilder/static/appbuilder/js/ab.js +33 -23
- flask_appbuilder/static/appbuilder/js/ab_filters.js +91 -84
- flask_appbuilder/static/appbuilder/js/bootstrap-datepicker/bootstrap-datepicker.min.js +8 -0
- flask_appbuilder/static/appbuilder/js/jquery-latest.js +2 -2
- flask_appbuilder/static/appbuilder/js/select2/select2.min.js +2 -0
- flask_appbuilder/static/appbuilder/js/swagger-ui-bundle.js +3 -0
- flask_appbuilder/templates/appbuilder/baselib.html +9 -3
- flask_appbuilder/templates/appbuilder/general/lib.html +60 -34
- flask_appbuilder/templates/appbuilder/general/model/edit.html +1 -1
- flask_appbuilder/templates/appbuilder/general/model/edit_cascade.html +1 -1
- flask_appbuilder/templates/appbuilder/general/model/search.html +3 -2
- flask_appbuilder/templates/appbuilder/general/model/show.html +1 -1
- flask_appbuilder/templates/appbuilder/general/model/show_cascade.html +1 -1
- flask_appbuilder/templates/appbuilder/general/security/login_db.html +7 -7
- flask_appbuilder/templates/appbuilder/general/security/login_ldap.html +5 -5
- flask_appbuilder/templates/appbuilder/general/security/login_oauth.html +24 -49
- flask_appbuilder/templates/appbuilder/general/widgets/base_list.html +2 -1
- flask_appbuilder/templates/appbuilder/general/widgets/chart.html +4 -2
- flask_appbuilder/templates/appbuilder/general/widgets/direct_chart.html +4 -3
- flask_appbuilder/templates/appbuilder/general/widgets/multiple_chart.html +3 -2
- flask_appbuilder/templates/appbuilder/general/widgets/search.html +11 -10
- flask_appbuilder/templates/appbuilder/init.html +37 -43
- flask_appbuilder/templates/appbuilder/navbar_menu.html +1 -1
- flask_appbuilder/templates/appbuilder/navbar_right.html +2 -2
- flask_appbuilder/templates/appbuilder/swagger/swagger.html +22 -19
- flask_appbuilder/translations/de/LC_MESSAGES/messages.mo +0 -0
- flask_appbuilder/translations/de/LC_MESSAGES/messages.po +305 -161
- flask_appbuilder/translations/fa/LC_MESSAGES/messages.mo +0 -0
- flask_appbuilder/translations/fa/LC_MESSAGES/messages.po +802 -0
- flask_appbuilder/translations/fr/LC_MESSAGES/messages.po +461 -319
- flask_appbuilder/translations/pt_BR/LC_MESSAGES/messages.po +650 -650
- flask_appbuilder/translations/ru/LC_MESSAGES/messages.po +1 -1
- flask_appbuilder/translations/sl/LC_MESSAGES/messages.mo +0 -0
- flask_appbuilder/translations/sl/LC_MESSAGES/messages.po +690 -0
- flask_appbuilder/translations/tr/LC_MESSAGES/messages.mo +0 -0
- flask_appbuilder/translations/tr/LC_MESSAGES/messages.po +1015 -0
- flask_appbuilder/upload.py +20 -22
- flask_appbuilder/urltools.py +39 -19
- flask_appbuilder/utils/base.py +76 -0
- flask_appbuilder/utils/legacy.py +33 -0
- flask_appbuilder/utils/limit.py +20 -0
- flask_appbuilder/validators.py +73 -14
- flask_appbuilder/views.py +75 -424
- flask_appbuilder/widgets.py +50 -51
- {Flask_AppBuilder-3.2.1rc1.dist-info → flask_appbuilder-5.0.2.dist-info}/METADATA +36 -76
- flask_appbuilder-5.0.2.dist-info/RECORD +240 -0
- {Flask_AppBuilder-3.2.1rc1.dist-info → flask_appbuilder-5.0.2.dist-info}/WHEEL +1 -1
- flask_appbuilder-5.0.2.dist-info/entry_points.txt +2 -0
- Flask_AppBuilder-3.2.1rc1.dist-info/RECORD +0 -270
- Flask_AppBuilder-3.2.1rc1.dist-info/entry_points.txt +0 -6
- flask_appbuilder/console.py +0 -426
- flask_appbuilder/models/mongoengine/__init__.py +0 -0
- flask_appbuilder/models/mongoengine/fields.py +0 -65
- flask_appbuilder/models/mongoengine/filters.py +0 -145
- flask_appbuilder/models/mongoengine/interface.py +0 -328
- flask_appbuilder/security/mongoengine/__init__.py +0 -0
- flask_appbuilder/security/mongoengine/manager.py +0 -402
- flask_appbuilder/security/mongoengine/models.py +0 -120
- flask_appbuilder/static/appbuilder/css/font-awesome.min.css +0 -4
- flask_appbuilder/static/appbuilder/datepicker/bootstrap-datepicker.css +0 -9
- flask_appbuilder/static/appbuilder/datepicker/bootstrap-datepicker.js +0 -28
- flask_appbuilder/static/appbuilder/fonts/FontAwesome.otf +0 -0
- flask_appbuilder/static/appbuilder/fonts/fontawesome-webfont.eot +0 -0
- flask_appbuilder/static/appbuilder/fonts/fontawesome-webfont.svg +0 -2671
- flask_appbuilder/static/appbuilder/fonts/fontawesome-webfont.ttf +0 -0
- flask_appbuilder/static/appbuilder/fonts/fontawesome-webfont.woff +0 -0
- flask_appbuilder/static/appbuilder/fonts/fontawesome-webfont.woff2 +0 -0
- flask_appbuilder/static/appbuilder/img/aol.png +0 -0
- flask_appbuilder/static/appbuilder/img/flags/flags16.png +0 -0
- flask_appbuilder/static/appbuilder/img/flickr.png +0 -0
- flask_appbuilder/static/appbuilder/img/google.png +0 -0
- flask_appbuilder/static/appbuilder/img/myopenid.png +0 -0
- flask_appbuilder/static/appbuilder/img/yahoo.png +0 -0
- flask_appbuilder/static/appbuilder/js/_google_charts.js +0 -39
- flask_appbuilder/static/appbuilder/js/html5shiv.js +0 -8
- flask_appbuilder/static/appbuilder/js/respond.min.js +0 -6
- flask_appbuilder/static/appbuilder/select2/select2-spinner.gif +0 -0
- flask_appbuilder/static/appbuilder/select2/select2.css +0 -1205
- flask_appbuilder/static/appbuilder/select2/select2.js +0 -23
- flask_appbuilder/static/appbuilder/select2/select2.png +0 -0
- flask_appbuilder/static/appbuilder/select2/select2x2.png +0 -0
- flask_appbuilder/templates/appbuilder/general/security/login_oid.html +0 -129
- flask_appbuilder/templates/appbuilder/general/security/resetpassword.html +0 -29
- flask_appbuilder/tests/__init__.py +0 -0
- flask_appbuilder/tests/__pycache__/__init__.cpython-36.pyc +0 -0
- flask_appbuilder/tests/__pycache__/__init__.cpython-37.pyc +0 -0
- flask_appbuilder/tests/__pycache__/_test_auth_ldap.cpython-37.pyc +0 -0
- flask_appbuilder/tests/__pycache__/_test_auth_oauth.cpython-37.pyc +0 -0
- flask_appbuilder/tests/__pycache__/_test_ldapsearch.cpython-36.pyc +0 -0
- flask_appbuilder/tests/__pycache__/_test_oauth_registration_role.cpython-36.pyc +0 -0
- flask_appbuilder/tests/__pycache__/base.cpython-36.pyc +0 -0
- flask_appbuilder/tests/__pycache__/base.cpython-37.pyc +0 -0
- flask_appbuilder/tests/__pycache__/config_api.cpython-36.pyc +0 -0
- flask_appbuilder/tests/__pycache__/config_api.cpython-37.pyc +0 -0
- flask_appbuilder/tests/__pycache__/const.cpython-36.pyc +0 -0
- flask_appbuilder/tests/__pycache__/const.cpython-37.pyc +0 -0
- flask_appbuilder/tests/__pycache__/test_0_fixture.cpython-36.pyc +0 -0
- flask_appbuilder/tests/__pycache__/test_0_fixture.cpython-37.pyc +0 -0
- flask_appbuilder/tests/__pycache__/test_api.cpython-36.pyc +0 -0
- flask_appbuilder/tests/__pycache__/test_api.cpython-37.pyc +0 -0
- flask_appbuilder/tests/__pycache__/test_fab_cli.cpython-36.pyc +0 -0
- flask_appbuilder/tests/__pycache__/test_fab_cli.cpython-37.pyc +0 -0
- flask_appbuilder/tests/__pycache__/test_menu.cpython-36.pyc +0 -0
- flask_appbuilder/tests/__pycache__/test_menu.cpython-37.pyc +0 -0
- flask_appbuilder/tests/__pycache__/test_mongoengine.cpython-36.pyc +0 -0
- flask_appbuilder/tests/__pycache__/test_mvc.cpython-36.pyc +0 -0
- flask_appbuilder/tests/__pycache__/test_mvc.cpython-37.pyc +0 -0
- flask_appbuilder/tests/__pycache__/test_sqlalchemy.cpython-36.pyc +0 -0
- flask_appbuilder/tests/__pycache__/test_sqlalchemy.cpython-37.pyc +0 -0
- flask_appbuilder/tests/_test_auth_ldap.py +0 -1045
- flask_appbuilder/tests/_test_auth_oauth.py +0 -419
- flask_appbuilder/tests/_test_ldapsearch.py +0 -135
- flask_appbuilder/tests/_test_oauth_registration_role.py +0 -59
- flask_appbuilder/tests/app.db +0 -0
- flask_appbuilder/tests/base.py +0 -90
- flask_appbuilder/tests/config_api.py +0 -21
- flask_appbuilder/tests/const.py +0 -9
- flask_appbuilder/tests/mongoengine/__init__.py +0 -0
- flask_appbuilder/tests/mongoengine/__pycache__/__init__.cpython-36.pyc +0 -0
- flask_appbuilder/tests/mongoengine/__pycache__/__init__.cpython-37.pyc +0 -0
- flask_appbuilder/tests/mongoengine/__pycache__/models.cpython-36.pyc +0 -0
- flask_appbuilder/tests/mongoengine/models.py +0 -41
- flask_appbuilder/tests/sqla/__init__.py +0 -0
- flask_appbuilder/tests/sqla/__pycache__/__init__.cpython-36.pyc +0 -0
- flask_appbuilder/tests/sqla/__pycache__/__init__.cpython-37.pyc +0 -0
- flask_appbuilder/tests/sqla/__pycache__/models.cpython-36.pyc +0 -0
- flask_appbuilder/tests/sqla/__pycache__/models.cpython-37.pyc +0 -0
- flask_appbuilder/tests/sqla/models.py +0 -340
- flask_appbuilder/tests/test_0_fixture.py +0 -39
- flask_appbuilder/tests/test_api.py +0 -2790
- flask_appbuilder/tests/test_fab_cli.py +0 -72
- flask_appbuilder/tests/test_menu.py +0 -122
- flask_appbuilder/tests/test_mongoengine.py +0 -572
- flask_appbuilder/tests/test_mvc.py +0 -1710
- flask_appbuilder/tests/test_sqlalchemy.py +0 -24
- flask_appbuilder/translations/__pycache__/__init__.cpython-36.pyc +0 -0
- flask_appbuilder/translations/es/LC_MESSAGES/messages.po~ +0 -582
- {Flask_AppBuilder-3.2.1rc1.dist-info → flask_appbuilder-5.0.2.dist-info}/LICENSE +0 -0
- {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
|