or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

configuration.mddata-sources.mddruid-sources.mdindex.mdsql-tables.mdvisualizations.mdweb-interface.md

web-interface.mddocs/

0

# Web Interface and Views

1

2

Panoramix provides a Flask-based web interface with admin views for data source management, visualization endpoints, and user interaction. The interface is built using Flask-AppBuilder for consistent admin functionality.

3

4

## Capabilities

5

6

### Main Application View

7

8

The core Panoramix view class handles visualization requests and data exploration endpoints.

9

10

```python { .api }

11

class Panoramix(BaseView):

12

"""

13

Main visualization controller for the web interface.

14

15

Provides endpoints for table and datasource visualization,

16

metadata management, and interactive data exploration.

17

"""

18

19

@expose("/table/<table_id>/")

20

def table(self, table_id):

21

"""

22

SQL table visualization endpoint.

23

24

Args:

25

table_id (str): ID of the table to visualize

26

27

Returns:

28

str: Rendered HTML page with visualization interface

29

"""

30

31

@expose("/datasource/<datasource_name>/")

32

def datasource(self, datasource_name):

33

"""

34

Druid datasource visualization endpoint.

35

36

Args:

37

datasource_name (str): Name of the datasource to visualize

38

39

Returns:

40

str: Rendered HTML page with visualization interface

41

"""

42

43

@expose("/refresh_datasources/")

44

def refresh_datasources(self):

45

"""

46

Refresh metadata for all Druid datasources.

47

48

Triggers synchronization of datasource metadata

49

from all configured Druid clusters.

50

51

Returns:

52

str: Success/failure message

53

"""

54

55

@expose("/autocomplete/<datasource>/<column>/")

56

def autocomplete(self, datasource, column):

57

"""

58

Autocomplete endpoint for column values.

59

60

Args:

61

datasource (str): Datasource name

62

column (str): Column name for value suggestions

63

64

Returns:

65

list: JSON list of suggested values

66

"""

67

```

68

69

### Admin Views for Data Sources

70

71

Flask-AppBuilder model views provide CRUD operations for managing data sources through the web interface.

72

73

```python { .api }

74

class DatabaseView(ModelView):

75

"""

76

Admin view for managing SQL database connections.

77

78

Features:

79

- Create/edit database connections

80

- Test connectivity

81

- Manage connection parameters

82

- View connection status

83

"""

84

datamodel = SQLAInterface(Database)

85

list_columns = ['database_name', 'sqlalchemy_uri', 'created_by', 'created_on']

86

add_columns = ['database_name', 'sqlalchemy_uri', 'extra', 'cache_timeout']

87

edit_columns = add_columns

88

89

class ClusterModelView(ModelView):

90

"""

91

Admin view for managing Druid cluster connections.

92

93

Features:

94

- Configure cluster endpoints

95

- Test cluster connectivity

96

- Manage cluster metadata

97

- Monitor cluster status

98

"""

99

datamodel = SQLAInterface(Cluster)

100

list_columns = ['cluster_name', 'coordinator_host', 'broker_host', 'created_on']

101

add_columns = ['cluster_name', 'coordinator_host', 'coordinator_port',

102

'broker_host', 'broker_port']

103

edit_columns = add_columns

104

105

class TableView(ModelView):

106

"""

107

Admin view for managing SQL tables.

108

109

Features:

110

- Register tables from databases

111

- Configure table metadata

112

- Define metrics and columns

113

- Set access permissions

114

"""

115

datamodel = SQLAInterface(Table)

116

list_columns = ['table_link', 'database', 'owner', 'created_on']

117

add_columns = ['table_name', 'database', 'main_datetime_column', 'description']

118

edit_columns = add_columns

119

120

class DatasourceModelView(ModelView):

121

"""

122

Admin view for managing Druid datasources.

123

124

Features:

125

- Configure datasource metadata

126

- Define dimensions and metrics

127

- Set caching and permissions

128

- Sync from Druid clusters

129

"""

130

datamodel = SQLAInterface(Datasource)

131

list_columns = ['datasource_link', 'cluster', 'owner', 'created_on']

132

add_columns = ['datasource_name', 'cluster', 'description', 'is_featured']

133

edit_columns = add_columns

134

```

135

136

### Inline Editing Views

137

138

Inline views provide embedded editing capabilities for related objects.

139

140

```python { .api }

141

class TableColumnInlineView(CompactCRUDMixin, ModelView):

142

"""

143

Inline view for editing table columns.

144

145

Allows editing column metadata directly within

146

the table edit interface.

147

"""

148

datamodel = SQLAInterface(TableColumn)

149

edit_columns = ['column_name', 'verbose_name', 'type', 'groupby', 'filterable']

150

151

class ColumnInlineView(CompactCRUDMixin, ModelView):

152

"""

153

Inline view for editing datasource dimensions.

154

155

Allows editing dimension metadata directly within

156

the datasource edit interface.

157

"""

158

datamodel = SQLAInterface(Column)

159

edit_columns = ['column_name', 'verbose_name', 'type', 'groupby', 'filterable']

160

161

class SqlMetricInlineView(CompactCRUDMixin, ModelView):

162

"""Inline view for editing SQL metrics"""

163

datamodel = SQLAInterface(SqlMetric)

164

edit_columns = ['metric_name', 'verbose_name', 'expression', 'metric_type']

165

166

class MetricInlineView(CompactCRUDMixin, ModelView):

167

"""Inline view for editing Druid metrics"""

168

datamodel = SQLAInterface(Metric)

169

edit_columns = ['metric_name', 'verbose_name', 'metric_type', 'json']

170

```

171

172

### Utility Mixins and Validators

173

174

```python { .api }

175

class DeleteMixin:

176

"""

177

Mixin providing bulk delete functionality.

178

179

Adds bulk delete operations to model views

180

with proper permission checking.

181

"""

182

183

def validate_json(form, field):

184

"""

185

Validator for JSON fields in forms.

186

187

Args:

188

form: WTForms form instance

189

field: Form field to validate

190

191

Raises:

192

ValidationError: If field contains invalid JSON

193

"""

194

```

195

196

## Health and Status Endpoints

197

198

```python { .api }

199

@app.route('/health')

200

def health():

201

"""

202

System health check endpoint.

203

204

Returns:

205

dict: System status and health information

206

"""

207

208

@app.route('/ping')

209

def ping():

210

"""

211

Simple ping endpoint for connectivity testing.

212

213

Returns:

214

str: "OK" response

215

"""

216

```

217

218

## Usage Examples

219

220

### Accessing Visualization Interfaces

221

222

```python

223

# SQL table visualization

224

# GET /panoramix/table/1/

225

# Opens visualization interface for table with ID 1

226

227

# Druid datasource visualization

228

# GET /panoramix/datasource/events/

229

# Opens visualization interface for 'events' datasource

230

```

231

232

### Using Autocomplete

233

234

```python

235

# Get autocomplete suggestions for a column

236

# GET /panoramix/autocomplete/events/country/

237

# Returns: ["US", "UK", "CA", "DE", "FR", ...]

238

239

# Client-side JavaScript usage

240

fetch('/panoramix/autocomplete/sales/product_category/')

241

.then(response => response.json())

242

.then(values => {

243

// Populate autocomplete dropdown

244

updateAutocompleteOptions(values);

245

});

246

```

247

248

### Refreshing Metadata

249

250

```python

251

# Refresh all datasource metadata

252

# GET /panoramix/refresh_datasources/

253

# Triggers cluster.refresh_datasources() for all clusters

254

```

255

256

## Template System

257

258

Panoramix uses Jinja2 templates for rendering the web interface:

259

260

```python { .api }

261

# Base templates

262

'panoramix/base.html' # Main application layout

263

'index.html' # Home page template

264

'panoramix/viz_table.html' # Table visualization template

265

266

# Form templates

267

'appbuilder/general/model/edit.html' # Edit forms

268

'appbuilder/general/model/list.html' # List views

269

```

270

271

## Security and Permissions

272

273

The web interface integrates with Flask-AppBuilder's security system:

274

275

- User authentication and authorization

276

- Role-based access control

277

- Object-level permissions

278

- CSRF protection

279

- SQL injection prevention

280

281

```python { .api }

282

# Permission strings

283

'datasource_access' # Access to specific datasources

284

'database_access' # Access to specific databases

285

'can_edit' # Edit permissions

286

'can_delete' # Delete permissions

287

```

288

289

## Static Assets and Resources

290

291

```python { .api }

292

# Static file paths

293

'/static/chaudron_white.png' # Application icon

294

'/static/css/' # Stylesheets

295

'/static/js/' # JavaScript files

296

'/static/img/' # Images and icons

297

```

298

299

The web interface provides a complete admin experience for managing data sources and an intuitive visualization interface for data exploration and analysis.