Skip to content

Instantly share code, notes, and snippets.

@Stiivi
Created October 30, 2012 18:52
Show Gist options
  • Save Stiivi/3982240 to your computer and use it in GitHub Desktop.
Save Stiivi/3982240 to your computer and use it in GitHub Desktop.
Presenter Flask Example
from flask import Flask, render_template, request
import cubes
app = Flask(__name__)
#
# Data we aregoing to browse and logical model of the data
#
MODEL_PATH = "model.json"
DB_URL = "sqlite:///data.sqlite"
CUBE_NAME = "irbd_balance"
# Some global variables. We do not have to care about Flask provided thread
# safety here, as they are non-mutable.
workspace = None
model = None
@app.route("/")
@app.route("/<dim_name>")
def report(dim_name=None):
global model
browser = get_browser()
if not dim_name:
return render_template('report_presenter.html', dimensions=model.dimensions)
# First we need to get the hierarchy to know the order of levels. Cubes
# supports multiple hierarchies internally.
dimension = model.dimension(dim_name)
hierarchy = dimension.hierarchy()
cutstr = request.args.get("cut")
cell = cubes.Cell(browser.cube, cubes.cuts_from_string(cutstr))
result = browser.aggregate(cell, drilldown=[dim_name])
presenter = cubes.create_presenter("simple_html_table",
table_style="table table-striped table-bordered",
create_links=True)
table = presenter.present(result, dimension, ["amount_sum", "record_count"])
return render_template('report_presenter.html',
cell=cell,
dimensions=model.dimensions,
dimension=dimension,
table=table)
def initialize_model():
global workspace
global model
model = cubes.load_model(MODEL_PATH)
workspace = cubes.create_workspace("sql", model, url=DB_URL,
fact_prefix="ft_")
def get_browser():
return workspace.browser_for_cube(model.cube(CUBE_NAME))
if __name__ == "__main__":
app.debug = True
initialize_model()
app.run()
<!doctype html>
<head>
<title>Cubes</title>
<link rel="stylesheet" href="{{url_for('static', filename='bootstrap.min.css')}}" type="text/css" />
<link rel="stylesheet" href="{{url_for('static', filename='bootstrap-responsive.min.css')}}" type="text/css" />
</head>
<body>
<div class="container">
<h1>Browse Dimensions</h1>
<!-- List dimensions from the model -->
<div class="btn-group">
{% for dimension in dimensions %}
<button class="btn">
<a href="{{dimension.name}}">{{dimension.label or dimension.name}}</a>
</button>
{% endfor %}
</div>
{% if dimension %}
<h1>Dimension: {{dimension.label or dimension.name}}</h1>
<div>
<ul class="breadcrumb">
<li><a href="?cut={{cell.rollup_dim(dimension, None).to_str()}}">All</a></li>
{% if levels %}<span class="divider">::</span>{% endif %}
{% for level in levels %}
<li>
{% if loop.last %}
{{level.label}}: {{details[loop.index0]._label}}
{% else %}
<a href="?cut={{cell.rollup_dim(dimension,level).to_str()}}">
{{level.label}}: {{details[loop.index0]._label}}
</a>
<span class="divider">::</span>
{% endif %}
</li>
{% endfor %}
</ul>
</div>
<!-- Display the data -->
{{table|safe}}
{% endif %} <!-- if dim -->
</div>
</body>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment