Changeset - 8c3fc026b081
[Not reviewed]
Dennis Fink - 9 years ago 2016-03-02 23:43:10
dennis.fink@c3l.lu
Begin selectable dates in charts
4 files changed with 73 insertions and 35 deletions:
0 comments (0 inline, 0 general)
ennstatus/data/views.py
Show inline comments
 
@@ -5,38 +5,68 @@
 
# it under the terms of the GNU General Public License as published by
 
# the Free Software Foundation, either version 3 of the License, or
 
# (at your option) any later version.
 
#
 
# This program is distributed in the hope that it will be useful,
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
# GNU General Public License for more details.
 
#
 
# You should have received a copy of the GNU General Public License
 
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 

	
 
import json
 

	
 
from collections import defaultdict
 

	
 
from flask import Blueprint, jsonify
 

	
 
from ennstatus.status.functions import split_all_servers_to_types
 
from ennstatus.donate.functions import all_csv_to_dict, year_sum, month_sum
 

	
 
data_page = Blueprint('data', __name__)
 

	
 

	
 
@data_page.route('/worldmap')
 
def worldmap():
 
    servers = split_all_servers_to_types()
 
    countries = {}
 

	
 
    for key, value in servers.items():
 
        for server in value:
 
            if server.country not in countries:
 
                countries[server.country] = defaultdict(int)
 
            countries[server.country][server.type] += 1
 
            countries[server.country]['total'] += 1
 

	
 
    maximum = max(i['total'] for i in countries.values())
 

	
 
    countries['max'] = maximum
 

	
 
    return jsonify(countries)
 

	
 

	
 
@data_page.route('/year')
 
def yeardata():
 
    data = all_csv_to_dict()
 
    data = year_sum(data)
 
    datalist = []
 

	
 
    for key, values in data.items():
 
        datalist.append({"key": key, "value": float(values)})
 
    datalist.sort(key=lambda x: x["key"])
 

	
 
    return json.dumps(datalist)
 

	
 

	
 
@data_page.route('/month')
 
def monthdata():
 
    data = all_csv_to_dict()
 
    data = month_sum(data)
 
    data_list = []
 

	
 
    for key, values in data.items():
 
        data_list.append({"key": key, "value": float(values)})
 

	
 
    data_list.sort(key=lambda x: x["key"])
 

	
 
    return json.dumps(data_list)
ennstatus/donate/views.py
Show inline comments
 
@@ -23,26 +23,24 @@ from babel.numbers import parse_decimal,
 

	
 
from ennstatus.donate.forms import DateForm
 
from ennstatus.donate.functions import (load_csv,
 
                                        get_choices,
 
                                        all_csv_to_dict,
 
                                        get_all_years_mean,
 
                                        get_months_mean,
 
                                        get_best_year,
 
                                        get_best_month,
 
                                        get_highest_donation,
 
                                        get_median_donation,
 
                                        get_mode_donation,
 
                                        year_sum,
 
                                        month_sum,
 
                                        )
 

	
 
from ennstatus.root.forms import BPMForm
 
from ennstatus.root.constants import BPM_ADDRESSES
 

	
 
donate_page = Blueprint('donate', __name__)
 

	
 

	
 
@donate_page.route('/', methods=('GET', 'POST'))
 
def index():
 

	
 
    current_app.logger.info('Handling index')
 
@@ -131,24 +129,25 @@ def received():
 
        )
 
        csv_file = load_csv(filename)
 

	
 
        current_app.logger.info('Return result')
 
        return render_template('donate/received.html',
 
                               form=form, csv_file=csv_file,
 
                               year=year, month=month, total=total)
 

	
 

	
 
@donate_page.route('/statistics')
 
def statistics():
 
    data = all_csv_to_dict()
 

	
 
    all_years_mean = format_decimal(
 
        get_all_years_mean(data),
 
        locale='de'
 
    )
 
    month_mean = format_decimal(
 
        get_months_mean(data),
 
        locale='de'
 
    )
 
    best_year = get_best_year(data)
 
    best_year = (best_year[0], format_decimal(best_year[1], locale='de'))
 

	
 
    best_month = get_best_month(data)
 
@@ -158,47 +157,30 @@ def statistics():
 
    highest_donation = (highest_donation[0], format_decimal(highest_donation[1], locale='de'))
 

	
 
    median_donation = format_decimal(
 
        get_median_donation(),
 
        locale='de'
 
    )
 

	
 
    mode_donation = format_decimal(
 
        get_mode_donation(),
 
        locale='de'
 
    )
 

	
 
    dates = [name for name in get_choices()]
 
    dates.sort()
 

	
 
    last_default_date = dates[-1]
 
    first_default_date = dates[-12]
 

	
 
    return render_template('donate/statistics.html',
 
                           all_years_mean=all_years_mean,
 
                           month_mean=month_mean,
 
                           best_year=best_year,
 
                           best_month=best_month,
 
                           highest_donation=highest_donation,
 
                           median_donation=median_donation,
 
                           mode_donation=mode_donation
 
                           mode_donation=mode_donation,
 
                           dates=dates,
 
                           first_default_date=first_default_date,
 
                           last_default_date=last_default_date
 
                           )
 

	
 
@donate_page.route('/data/year')
 
def yeardata():
 
    data = all_csv_to_dict() 
 
    data = year_sum(data)
 
    datalist = []
 

	
 
    for key, values in data.items():
 
        datalist.append({"key": key, "value": float(values)})
 
    datalist.sort(key=lambda x: x["key"])
 

	
 
    return json.dumps(datalist)
 

	
 

	
 
@donate_page.route('/data/month')
 
def monthdata():
 
    data = all_csv_to_dict()
 
    data = month_sum(data)
 
    data_list = []
 

	
 
    for key, values in data.items():
 
        data_list.append({"key": key, "value": float(values)})
 

	
 
    data_list.sort(key=lambda x: x["key"])
 

	
 
    return json.dumps(data_list)
ennstatus/static/js/barcharts.js
Show inline comments
 
@@ -25,25 +25,25 @@ function setup(ywidth, yheight, mwidth, 
 
	tip = d3.tip()
 
		.attr('class', 'd3-tip')
 
		.offset([-10, 0])
 
		.html(function(d) {
 
			return "<strong>" + d.key + ":</strong> <span style='color:#00ae18'>" + d.value + "</span>";
 
		});
 
	yearchart.call(tip);
 
	monthchart.call(tip);
 
	draw(ywidth, yheight, mwidth, mheight)
 
}
 

	
 
function draw(ywidth, yheight, mwidth, mheight) {
 
	d3.json("/donate/data/year", function(err, data) {
 
	d3.json("/data/year", function(err, data) {
 
		var xscale = d3.scale.ordinal().rangeRoundBands([0, ywidth], .1);
 
		xscale.domain(data.map(function(d) { return d.key; }));
 
                var yscale = d3.scale.linear().range([yheight, 0]);
 
		yscale.domain([0, d3.max(data, function(d) { return d.value; })]);
 
		var key = function(d) { return d.key; };
 

	
 
		var xaxis = d3.svg.axis()
 
			.scale(xscale)
 
			.orient("bottom");
 
		var yaxis = d3.svg.axis()
 
			.scale(yscale)
 
			.orient("left");
 
@@ -74,53 +74,63 @@ function draw(ywidth, yheight, mwidth, m
 
				return yscale(d.value);
 
			})
 
			.attr("height", function(d) {
 
				return yheight - yscale(d.value);
 
			})
 
			.attr("fill", function(d) {
 
				return "#00ae18";
 
			})
 
			.on("mouseover", tip.show)
 
			.on("mouseout", tip.hide)
 
			
 
	});
 
	d3.json("/donate/data/month", function(err, data) {
 
		var xscale = d3.scale.ordinal().rangeRoundBands([0, mwidth], .1);
 
		xscale.domain(data.map(function(d) { return d.key }));
 
	d3.json("/data/month", function(err, data) {
 
		var firstdate = d3.select("#monthfirstdate").node().value;
 
		var lastdate = d3.select("#monthlastdate").node().value;
 
		var newdata = [];
 
		for (var key in data) {
 
			if (data[key]["key"] >= firstdate && data[key]["key"] <= lastdate) {
 
				console.log(key)
 
				newdata.push(data[key])
 
			}
 
		}
 

	
 
		var xscale = d3.scale.ordinal().rangeRoundBands([0, mwidth - (newdata.length - 3) * 5], .1);
 
		xscale.domain(newdata.map(function(d) { return d.key }));
 
		var yscale = d3.scale.linear().range([mheight, 0]);
 
		yscale.domain([0, d3.max(data, function(d) { return d.value; })]);
 
		yscale.domain([0, d3.max(newdata, function(d) { return d.value; })]);
 

	
 
		var key = function(d) { return d.key; };
 
		var xaxis = d3.svg.axis()
 
			.scale(xscale)
 
			.orient("bottom");
 
		var yaxis = d3.svg.axis()
 
			.scale(yscale)
 
			.orient("left");
 

	
 
		monthchart.append("g")
 
			.attr("class", "x axis")
 
			.attr("transform", "translate(0, " + mheight + ")")
 
			.call(xaxis)
 
		monthchart.append("g")
 
			.attr("class", "y axis")
 
			.call(yaxis)
 
			.append("text")
 
			.attr("transform", "rotate(-90)")
 
			.attr("y", 6)
 
			.attr("dy", ".71em")
 
			.style("text-anchor", "end");
 

	
 
		monthchart.selectAll("rect")
 
			.data(data, key)
 
			.data(newdata, key)
 
			.enter()
 
			.append("rect")
 
			.attr("class", "bar")
 
			.attr("x", function(d) {
 
				return xscale(d.key);
 
			})
 
			.attr("width", xscale.rangeBand())
 
			.attr("y", function(d) {
 
				return yscale(d.value);
 
			})
 
			.attr("height", function(d) {
 
				return mheight - yscale(d.value);
ennstatus/templates/donate/statistics.html
Show inline comments
 
@@ -49,24 +49,40 @@
 
  <div class="col-md-12">
 
    <div class="panel panel-default">
 
      <div class="panel-heading">Donations per year</div>
 
      <div class="panel-body">
 
        <div id="yearchart" class="center-block"></div>
 
      </div>
 
    </div>
 
  </div>
 
  <div class="col-md-12">
 
    <div class="panel panel-default">
 
      <div class="panel-heading">Donations per month</div>
 
      <div class="panel-body">
 
        <form class="form-inline" role="form">
 
          <div class="form-group">
 
            <label for="monthfirstdate">First date</label>
 
            <select class="form-control input-sm" id="monthfirstdate" name="monthfirstdate">
 
              {% for date in dates %}
 
                <option {% if date == first_default_date %}selected{% endif %} value="{{ date }}">{{ date }}</option>
 
              {% endfor %}
 
            </select>
 
            <label for="monthlastdate">Last date</label>
 
            <select class="form-control input-sm" id="monthlastdate" name="monthlastdate">
 
              {% for date in dates %}
 
                <option {% if date == last_default_date %}selected{% endif %} value="{{ date }}">{{ date }}</option>
 
              {% endfor %}
 
            </select>
 
          </div>
 
        </form>
 
        <div id="monthchart"></div>
 
      </div>
 
    </div>
 
  </div>
 
{% endblock %}
 

	
 
{% block scripts %}
 
  {{ super() }}
 
  <script src="{{ url_for('static', filename='js/d3/d3.min.js') }}"></script>
 
  <script src="{{ url_for('static', filename='js/d3-tip/index.js') }}"></script>
 
  <script src="{{ url_for('static', filename='js/barcharts.js') }}"></script>
 
{% endblock %}
0 comments (0 inline, 0 general)