Created
November 8, 2012 16:58
-
-
Save Stiivi/4040060 to your computer and use it in GitHub Desktop.
Rickshaw Presenter (early draft implementation)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from flask import Flask, render_template, request | |
import cubes | |
import json | |
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]) | |
result = result.cached() | |
presenter = cubes.create_presenter("simple_html_table", | |
table_style="table table-striped table-bordered", | |
create_links=True) | |
rickshaw = cubes.create_presenter("rickshaw_multi_series") | |
table = presenter.present(result, dimension, ["amount_sum", "record_count"]) | |
result = browser.aggregate(cell, drilldown=["year", "item"]) | |
series = rickshaw.present(result, "year", "item", "amount_sum", | |
color_map={"2010":"red", "2009":"blue"}) | |
series = json.dumps(series) | |
return render_template('report_presenter.html', | |
cell=cell, | |
dimensions=model.dimensions, | |
dimension=dimension, | |
table=table, | |
series=series) | |
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() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!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" /> | |
<script src="{{url_for('static', filename='d3.v2.js')}}"></script> | |
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script> | |
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.15/jquery-ui.min.js"></script> | |
<script src="{{url_for('static', filename='rickshaw.js')}}"></script> | |
</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}} | |
<div id="chart"></div> | |
<script> | |
var graph = new Rickshaw.Graph( { | |
element: document.getElementById("chart"), | |
width: 320, | |
height: 200, | |
renderer: 'bar', | |
series: {{series|safe}} | |
} ); | |
graph.render(); | |
</script> | |
{% endif %} <!-- if dim --> | |
</div> | |
</body> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment