class AttorneyView(ModelView): #MasterDetailView, MultipleView datamodel = SQLAInterface(Attorney, db.session) #add_title = #list_title = #edit_title = #base_order = ("name", "asc") search_exclude_columns = person_exclude_columns + biometric_columns + person_search_exclude_columns add_exclude_columns = edit_exclude_columns = audit_exclude_columns #add_columns = edit_columns = list_columns = person_list_columns + ref_columns + contact_columns #list_widget = ListBlock|ListItem|ListThumbnail|ListWidget (default) #related_views =[] show_fieldsets = edit_fieldsets = add_fieldsets = \ person_fieldset + contact_fieldset #+ activity_fieldset + place_fieldset + biometric_fieldset + employment_fieldset
class AttorneyChartView(GroupByChartView): datamodel = SQLAInterface(Attorney) chart_title = 'Grouped Attorney by Birth' label_columns = AttorneyView.label_columns chart_type = 'PieChart' definitions = [{ 'group': 'age_today', "series": [(aggregate_count, "age_today")] }, { 'group': 'gender', "series": [(aggregate_count, "age_today")] }]
class DruidClusterModelView(CaravelModelView, DeleteMixin): # noqa datamodel = SQLAInterface(models.DruidCluster) add_columns = [ 'cluster_name', 'coordinator_host', 'coordinator_port', 'coordinator_endpoint', 'broker_host', 'broker_port', 'broker_endpoint', ] edit_columns = add_columns list_columns = ['cluster_name', 'metadata_last_refreshed']
class PolicemanChartView(GroupByChartView): datamodel = SQLAInterface(Policeman) chart_title = 'Grouped Policeman by Birth' label_columns = PolicemanView.label_columns chart_type = 'PieChart' definitions = [{ 'group': 'age_today', "series": [(aggregate_count, "age_today")] }, { 'group': 'gender', "series": [(aggregate_count, "age_today")] }]
class ComplaintView(ModelView): datamodel = SQLAInterface(Complaint) show_exclude_columns = edit_exclude_columns = hide_list edit_exclude_columns = hide_list add_fieldsets = show_fieldsets = [ ('Category', { 'fields': ['report_date', 'case_type', 'case_category'] }), ('Complainant', { 'fields': [ 'complainant_is_victim', 'complainant', 'comp_phone', 'comp_email', 'comp_address', 'comp_age', 'comp_dob', 'comp_is_minor', 'comp_gender' ] }), ('Complaint', { 'fields': [ 'complainant_role', 'complaint', 'complaint_language', 'observations' ] }), ('Observations', { 'fields': [ 'injuries', 'loss', 'damage', 'theft', 'narcotics', 'fraud', 'domestic_abuse' ] }), ('Victim', { 'fields': [ 'victim_name', 'victim_phone', 'victim_email', 'victim_address', 'victim_age', 'victim_dob', 'victim_gender', 'victim_pwd', 'victim_religion', 'victim_ethnicity' ] }), ('Offender', { 'fields': [ 'offender_count', 'offenders_known_to_victim', 'offender_known_to_complainant', 'offender_description', 'police_interpretation', 'is_a_crime', 'is_a_case', 'case_number', 'closed' ] }), # ('Responsibility', {'fields': ['reporting_officer', 'investigating_officer'], 'expanded': False}), # ('Investigation', {'fields': ['investigating_officer','investigation_status','investigation_outcomes'], 'expanded': False}), # ('Arrest', {'fields': ['arresting_officer', 'arrest_location','arrest_narrative','warrant_date','warrant_details'], 'expanded': False}), # ('Documentation', {'fields': ['evidence_collected', 'evidence_pictures', 'document_list','document_count','documents'], 'expanded': False}), # ('Charge', {'fields': ['charge_date', 'charge_description','document_count','documents'], 'expanded': False}), # ('Court', {'fields': ['charge_court','first_hearing_date','hearing_dates','court_outcome','case_duration'], 'expanded': False}), # ('Offenders', {'fields': ['offender_picture'], 'expanded': False}), ]
class AuditLogChartView(GroupByChartView): datamodel = SQLAInterface(AuditLog) chart_title = 'Grouped Audit Logs' chart_type = 'BarChart' definitions = [{ 'group': 'operation', 'formatter': str, 'series': [(aggregate_count, 'operation')] }, { 'group': 'username', 'formatter': str, 'series': [(aggregate_count, 'username')] }]
class ProjectModelView(CompactCRUDMixin, ModelView): datamodel = SQLAInterface(Project) related_views = [ProjectFilesModelView] show_template = 'appbuilder/general/model/show_cascade.html' edit_template = 'appbuilder/general/model/edit_cascade.html' add_columns = ['name'] edit_columns = ['name'] list_columns = ['name', 'created_by', 'created_on', 'changed_by', 'changed_on'] show_fieldsets = [ ('Info', {'fields': ['name']}), ('Audit', {'fields': ['created_by', 'created_on', 'changed_by', 'changed_on'], 'expanded': False}) ]
class CauseofactionView(CompactCRUDMixin, ModelView):#MasterDetailView, MultipleView datamodel=SQLAInterface(Causeofaction, db.session) #add_title = #list_title = #edit_title = #show_title = #base_order = ("name", "asc") search_exclude_columns = person_exclude_columns + biometric_columns + person_search_exclude_columns add_exclude_columns = edit_exclude_columns = audit_exclude_columns #add_columns = edit_columns = list_columns = person_list_columns + ref_columns + contact_columns #list_widget = ListBlock|ListItem|ListThumbnail|ListWidget (default) #related_views =[] #show_fieldsets = person_show_fieldset + contact_fieldset edit_fieldsets = add_fieldsets = \
class TableView(ModelView, DeleteMixin): datamodel = SQLAInterface(models.Table) list_columns = ['table_link', 'database'] add_columns = ['table_name', 'database', 'default_endpoint'] edit_columns = [ 'table_name', 'database', 'main_datetime_column', 'default_endpoint' ] related_views = [TableColumnInlineView, SqlMetricInlineView] def post_add(self, table): table.fetch_metadata() def post_update(self, table): table.fetch_metadata()
class Model2View(ModelView): datamodel = SQLAInterface(Model2) list_columns = [ 'field_integer', 'field_float', 'field_string', 'field_method', 'group.field_string' ] edit_form_query_rel_fields = { 'group': [['field_string', FilterEqual, 'G2']] } add_form_query_rel_fields = { 'group': [['field_string', FilterEqual, 'G1']] }
class ContentModelView(CompactCRUDMixin, ModelView): datamodel = SQLAInterface(Content) related_views = [MediaFilesModelView] add_columns = ['name', 'artist', 'created'] edit_columns = ['name', 'artist', 'created'] list_columns = ['name', 'artist.name', 'created'] show_fieldsets = [('Info', { 'fields': ['name', 'artist_id', 'created'] }), ('Audit', { 'fields': ['modified'], 'expanded': False })]
class MetricInlineView(CompactCRUDMixin, ModelView): datamodel = SQLAInterface(models.Metric) list_columns = ['metric_name', 'verbose_name', 'metric_type'] edit_columns = [ 'metric_name', 'description', 'verbose_name', 'metric_type', 'datasource', 'json' ] add_columns = [ 'metric_name', 'verbose_name', 'metric_type', 'datasource', 'json' ] page_size = 100 validators_columns = { 'json': [validate_json], }
class EmployeeView(ModelView): datamodel = SQLAInterface(Employee) list_columns = ['full_name', 'department', 'employee_number'] # TODO there is a bug: the change of history doens't update employee's department edit_form_extra_fields = { 'department': QuerySelectField('Department', query_factory=department_query, widget=Select2Widget(extra_classes="readonly")) } related_views = [EmployeeHistoryView] show_template = 'appbuilder/general/model/show_cascade.html' # not a tab, but on the same page cascading
class ContactModelView(ModelView): datamodel = SQLAInterface(Contact) base_order = ('name', 'desc') # pass extra args to Jinja2 template #extra_args = {'my_extra_arg':'SOMEVALUE'} #show_template = 'my_show_template.html' # filter the fields in the adding form # {add,edit,search}_form_query_rel_fields add_form_query_rel_fields = { 'contact_group': [['name', FilterStartsWith, 'W']] } #add_form = AddFormWTF # customize add/edit forms #add_columns = ['my_field1', my_field2] # customize add/edit form fields label_columns = { 'contact_group': 'Contacts Group' } # define lables of columns # use {add,edit,list,show}_columns properties to customize what columns are displayed and orders list_columns = ['name', 'personal_celphone', 'birthday', 'contact_group'] # add an extra field: e.g. confirmation field # TODO doesn't work... #add_form_extra_fields = {'some_col':BooleanField('Some Col', default=False)} add_form_extra_fields = { 'confirm_name': TextField(gettext('Confirm Name'), description=gettext('Confirm Name'), widget=BS3TextFieldWidget()) } #edit_form_extra_fields = {'field2': TextField('field2', # widget=BS3TextFieldROWidget())} validators_columns = { 'my_field1': [EqualTo('my_field2', message=gettext('fields must match'))] } # show_fieldsets, add_fieldsets, edit_fieldsets to customize show, add and edit views show_fieldsets = [ ('Summary', { 'fields': ['name', 'address', 'contact_group'] }), ('Personal Info', { 'fields': ['birthday', 'personal_phone', 'personal_celphone'], 'expanded': False }), ]
class AlertModelView(ModelView): datamodel = SQLAInterface(Alert) #related_views = [ServiceModelView, ContentModelView, ShortcodeModelView] #message,msisdn,shortcode,content_id ,service_id ,sent ,scheduled_time, #alert_type_id,time_sent ,created_by ,created edit_exclude_columns = [ 'created_by', 'sent', 'modified', 'created', 'time_sent' ] add_exclude_columns = [ 'created_by', 'sent', 'created', 'modified', 'time_sent' ] list_columns = [ 'content_id', 'shortcode', 'message', 'service_id', 'alert_type_id', 'scheduled_time' ]
class ContactTimeChartView(GroupByChartView): datamodel = SQLAInterface(Contact) chart_title = 'Grouped Birth contacts' chart_type = 'AreaChart' label_columns = ContactModelView.label_columns definitions = [{ 'group': 'month_year', 'formatter': pretty_month_year, 'series': [(aggregate_count, 'contact_group')] }, { 'group': 'year', 'formatter': pretty_year, 'series': [(aggregate_count, 'contact_group')] }]
class DataStoreModelView(ModelView): datamodel = SQLAInterface(DataStore) base_permissions = ['can_list', 'can_show'] base_order = ('timestamp', 'desc') label_columns = {'data_type': 'Type'} list_columns = ['timestamp', 'data_type', 'data'] @action("muldelete", "Delete", "Delete all Really?", "fa-trash") def muldelete(self, items): if isinstance(items, list): self.datamodel.delete_all(items) self.update_redirect() else: self.datamodel.delete(items) return redirect(self.get_redirect())
class ContactModelView(ModelView): datamodel = SQLAInterface(Contact) label_columns = {'contact_group': 'Contacts Group'} list_columns = ['name', 'personal_cellphone', 'birthday', 'contact_group'] show_fieldsets = [ ('Summary', { 'fields': ['name', 'address', 'contact_group'] }), ('Personal Info', { 'fields': ['birthday', 'personal_phone', 'personal_cellphone'], 'expanded': False }), ]
class DefendantTimeChartView(GroupByChartView): datamodel = SQLAInterface(Defendant) chart_title = 'Grouped Birth Defendant' chart_type = 'AreaChart' label_columns = DefendantView.label_columns definitions = [{ 'group': 'age_today', 'formatter': pretty_month_year, "series": [(aggregate_count, "age_today")] }, { 'group': 'age_today', 'formatter': pretty_year, "series": [(aggregate_count, "age_today")] }]
class DruidColumnInlineView(CompactCRUDMixin, CaravelModelView): # noqa datamodel = SQLAInterface(models.DruidColumn) edit_columns = [ 'column_name', 'description', 'datasource', 'groupby', 'count_distinct', 'sum', 'min', 'max' ] list_columns = [ 'column_name', 'type', 'groupby', 'filterable', 'count_distinct', 'sum', 'min', 'max' ] can_delete = False page_size = 500 def post_update(self, col): col.generate_metrics()
class SqlMetricInlineView(CompactCRUDMixin, CaravelModelView): # noqa datamodel = SQLAInterface(models.SqlMetric) list_columns = ['metric_name', 'verbose_name', 'metric_type'] edit_columns = [ 'metric_name', 'description', 'verbose_name', 'metric_type', 'expression', 'table' ] description_columns = { 'expression': utils.markdown( "a valid SQL expression as supported by the underlying backend. " "Example: `count(DISTINCT userid)`", True), } add_columns = edit_columns page_size = 500
class JudgeTimeChartView(GroupByChartView): datamodel = SQLAInterface(Judge, db.session) chart_title = 'Grouped Birth Judge' chart_type = 'AreaChart' label_columns = JudgeView.label_columns definitions = [{ 'group': 'age_today', 'formatter': pretty_month_year, "series": [(aggregate_count, "age_today")] }, { 'group': 'age_today', 'formatter': pretty_year, "series": [(aggregate_count, "age_today")] }]
class DefendantChartView(GroupByChartView): datamodel = SQLAInterface(Defendant , db.session) chart_title = 'Grouped Defendant by Birth' label_columns = DefendantView.label_columns chart_type = 'PieChart' definitions = [ { 'group' : 'age_today', "series" : [(aggregate_count,"age_today")] }, { 'group' : 'gender', "series" : [(aggregate_count,"age_today")] } ]
class DatasourceModelView(ModelView): datamodel = SQLAInterface(models.Datasource) list_columns = ['datasource_link', 'owner', 'is_featured', 'is_hidden'] related_views = [ColumnInlineView, MetricInlineView] edit_columns = [ 'datasource_name', 'description', 'owner', 'is_featured', 'is_hidden', 'default_endpoint' ] page_size = 100 base_order = ('datasource_name', 'asc') def post_insert(self, datasource): datasource.generate_metrics() def post_update(self, datasource): datasource.generate_metrics()
class ContactChartView(GroupByChartView): datamodel = SQLAInterface(Contact) chart_title = 'Grouped contacts' label_columns = ContactModelView.label_columns chart_type = 'PieChart' definitions = [ { 'group' : 'contact_group.name', 'series' : [(aggregate_count,'contact_group')] }, { 'group' : 'gender.name', 'series' : [(aggregate_count,'contact_group')] } ]
class FeatureSourceModelView(ModelView): datamodel = SQLAInterface(models.FeatureSource) list_columns = ['name', 'feature_source_type'] edit_columns = ["name"] add_columns = ["name", 'feature_source_type'] related_views = [FeaturesModelView, TableColumnsModelView] def post_add(self, table): try: table.fetch_table_metadata() except Exception as e: logging.exception(e) utils.flasher('Table not exists!') def post_update(self, table): self.post_add(table)
class TableColumnInlineView(CompactCRUDMixin, CaravelModelView): # noqa datamodel = SQLAInterface(models.TableColumn) can_delete = False edit_columns = [ 'column_name', 'verbose_name', 'description', 'groupby', 'filterable', 'table', 'count_distinct', 'sum', 'min', 'max', 'expression', 'is_dttm', ] add_columns = edit_columns list_columns = [ 'column_name', 'type', 'groupby', 'filterable', 'count_distinct', 'sum', 'min', 'max', 'is_dttm' ] page_size = 500 description_columns = { 'is_dttm': (_("Whether to make this column available as a " "[Time Granularity] option, column has to be DATETIME or " "DATETIME-like")), 'expression': utils.markdown( "a valid SQL expression as supported by the underlying backend. " "Example: `substr(name, 1, 1)`", True), } label_columns = { 'column_name': _("Column"), 'verbose_name': _("Verbose Name"), 'description': _("Description"), 'groupby': _("Groupable"), 'filterable': _("Filterable"), 'table': _("Table"), 'count_distinct': _("Count Distinct"), 'sum': _("Sum"), 'min': _("Min"), 'max': _("Max"), 'expression': _("Expression"), 'is_dttm': _("Is temporal"), }
class TableColumnInlineView(CompactCRUDMixin, PanoramixModelView): datamodel = SQLAInterface(models.TableColumn) can_delete = False edit_columns = [ 'column_name', 'description', 'groupby', 'filterable', 'table', 'count_distinct', 'sum', 'min', 'max', 'expression', 'is_dttm'] add_columns = edit_columns list_columns = [ 'column_name', 'type', 'groupby', 'filterable', 'count_distinct', 'sum', 'min', 'max', 'is_dttm'] page_size = 500 description_columns = { 'is_dttm': ( "Whether to make this column available as a " "[Time Granularity] option, column has to be DATETIME or " "DATETIME-like"), }
class PinView(ModelView): datamodel = SQLAInterface(Pin) base_permissions = ['can_list', 'can_show', 'can_edit'] list_columns = [ 'name', 'type', 'function', 'device', 'room', ] show_columns = list_columns edit_columns = [ 'name', 'function', 'device', 'room', ]
class DruidMetricInlineView(CompactCRUDMixin, CaravelModelView): # noqa datamodel = SQLAInterface(models.DruidMetric) list_columns = ['metric_name', 'verbose_name', 'metric_type'] edit_columns = [ 'metric_name', 'description', 'verbose_name', 'metric_type', 'json', 'datasource'] add_columns = edit_columns page_size = 500 validators_columns = { 'json': [validate_json], } description_columns = { 'metric_type': utils.markdown( "use `postagg` as the metric type if you are defining a " "[Druid Post Aggregation]" "(http://druid.io/docs/latest/querying/post-aggregations.html)", True), }