mirror of
https://github.com/getredash/redash.git
synced 2026-05-10 06:00:10 -04:00
* Consistently use simplejson to loading and dumping JSON. This introduces the new functions redash.utils.json_dumps and redash.utils.json_loads and simplifies the custom encoder setup. UUIDs are now handled by the default encoder, too. Fixes #2807. Use string comparison in parse_boolean instead of the (simple)json module.
79 lines
2.4 KiB
Python
79 lines
2.4 KiB
Python
from flask_admin import Admin
|
|
from flask_admin.base import MenuLink
|
|
from flask_admin.contrib.sqla import ModelView
|
|
from flask_admin.contrib.sqla.form import AdminModelConverter
|
|
from wtforms import fields
|
|
from wtforms.widgets import TextInput
|
|
|
|
from redash import models
|
|
from redash.permissions import require_super_admin
|
|
from redash.utils import json_loads
|
|
|
|
|
|
class ArrayListField(fields.Field):
|
|
widget = TextInput()
|
|
|
|
def _value(self):
|
|
if self.data:
|
|
return u', '.join(self.data)
|
|
else:
|
|
return u''
|
|
|
|
def process_formdata(self, valuelist):
|
|
if valuelist:
|
|
self.data = [x.strip() for x in valuelist[0].split(',')]
|
|
else:
|
|
self.data = []
|
|
|
|
|
|
class JSONTextAreaField(fields.TextAreaField):
|
|
def process_formdata(self, valuelist):
|
|
if valuelist:
|
|
try:
|
|
json_loads(valuelist[0])
|
|
except ValueError:
|
|
raise ValueError(self.gettext(u'Invalid JSON'))
|
|
self.data = valuelist[0]
|
|
else:
|
|
self.data = ''
|
|
|
|
|
|
class BaseModelView(ModelView):
|
|
column_display_pk = True
|
|
model_form_converter = AdminModelConverter
|
|
form_excluded_columns = ('created_at', 'updated_at')
|
|
|
|
@require_super_admin
|
|
def is_accessible(self):
|
|
return True
|
|
|
|
|
|
class QueryResultModelView(BaseModelView):
|
|
column_exclude_list = ('data',)
|
|
|
|
|
|
class QueryModelView(BaseModelView):
|
|
column_exclude_list = ('latest_query_data',)
|
|
form_excluded_columns = ('version', 'visualizations', 'alerts', 'org', 'created_at',
|
|
'updated_at', 'latest_query_data', 'search_vector')
|
|
|
|
|
|
class DashboardModelView(BaseModelView):
|
|
column_searchable_list = ('name', 'slug')
|
|
column_exclude_list = ('version', )
|
|
form_excluded_columns = ('version', 'widgets', 'org', 'created_at', 'updated_at')
|
|
|
|
|
|
def init_admin(app):
|
|
admin = Admin(app, name='Redash Admin', template_mode='bootstrap3')
|
|
|
|
admin.add_view(QueryModelView(models.Query, models.db.session))
|
|
admin.add_view(QueryResultModelView(models.QueryResult, models.db.session))
|
|
admin.add_view(DashboardModelView(models.Dashboard, models.db.session))
|
|
logout_link = MenuLink('Logout', '/logout', 'logout')
|
|
|
|
for m in (models.Visualization, models.Widget, models.Event, models.Organization):
|
|
admin.add_view(BaseModelView(m, models.db.session))
|
|
|
|
admin.add_link(logout_link)
|