Skip to content
Snippets Groups Projects
Commit 7f1d360c authored by Tor-Einar Skog's avatar Tor-Einar Skog
Browse files

Changed graph settings, added bar plot for warning status

parent 8f29baee
Branches
No related tags found
No related merge requests found
......@@ -49,6 +49,11 @@ function getSystemTime(){
return systemTime = moment().add(settings.systemTimeOffsetMonths,"months");
}
function getSystemTimeAsUnixTimeStamp()
{
return getSystemTime().valueOf();
}
function setMomentToMidnight(momentObj)
{
return momentObj.hour(0).minute(0).second(0).millisecond(0);
......
......@@ -16,7 +16,7 @@
# along with VIPSWeb. If not, see <http://www.bioforsk.no/licenses/>.
#
from django.contrib import admin
from forecasts.models import ResultParameter, MeasurementUnit, ModelGraphParameter
from forecasts.models import ResultParameter, MeasurementUnit, ModelGraphParameter, HighChartsType
class ResultParameterAdmin(admin.ModelAdmin):
list_display = ['namespace','key','name']
......@@ -26,4 +26,6 @@ admin.site.register(ResultParameter,ResultParameterAdmin)
admin.site.register(MeasurementUnit)
admin.site.register(HighChartsType)
admin.site.register(ModelGraphParameter)
\ No newline at end of file
......@@ -21,7 +21,7 @@ from datetime import datetime
import math
import requests
import json
from decimal import Decimal
from decimal import Decimal, InvalidOperation
from django.conf import settings
from django.db import models
......@@ -64,6 +64,43 @@ class ForecastResult:
def get_instance_from_dict(theDict):
return ForecastResult(theDict["forecastResultId"],theDict["resultValidTime"],theDict["warningStatus"],theDict["allValues"])
"""
Creates plot bands for the warning statuses
"""
@staticmethod
def get_forecast_warning_statuses_highcharts(forecast_results):
warning_statuses = {
0: {"name":"No forecast available", "color":"#C9C9C9"},
1: {"name":"Missing data", "color":"#4DA0FE"},
2: {"name":"No risk", "color":"#6FC49A"},
3: {"name":"Medium risk","color":"#FEDA4D"},
4: {"name":"High risk","color":"#F0564D"}
}
plot_bands = []
previous_forecast_result = None
plot_band = None
band_offset = 0
if len(forecast_results) >=2:
band_offset = (util.get_unix_timestamp(forecast_results[1].result_valid_time) - util.get_unix_timestamp(forecast_results[0].result_valid_time)) / 2
for forecast_result in forecast_results:
if previous_forecast_result == None or previous_forecast_result.warning_status != forecast_result.warning_status:
# Add the previous plot band
if plot_band != None:
plot_band["to"] = util.get_unix_timestamp(forecast_result.result_valid_time) - band_offset
plot_bands.append(plot_band)
plot_band = {
"color": warning_statuses[forecast_result.warning_status]["color"],
"from" : util.get_unix_timestamp(forecast_result.result_valid_time) - band_offset
}
previous_forecast_result = forecast_result
# We probably have a rouge plot band that needs to be finished and appended
if plot_band != None and plot_band.get("to", None) == None:
plot_band["to"] = util.get_unix_timestamp(forecast_results[-1].result_valid_time) - band_offset
plot_bands.append(plot_band)
return plot_bands
@staticmethod
def get_forecast_results_highcharts(forecast_results, forecast_id):
......@@ -86,7 +123,7 @@ class ForecastResult:
result_parameter = model_graph_result_parameter.resultparameter
result_parameter_timeseries = {}
result_parameter_timeseries["name"] = result_parameter.name
result_parameter_timeseries["type"] = "spline"
result_parameter_timeseries["type"] = model_graph_result_parameter.highcharts_type.name
result_parameter_timeseries["data"] = []
#TODO: Dynamic connection of parameters and axis
......@@ -98,55 +135,17 @@ class ForecastResult:
model_graph_result_parameter.color_hexcode = "#" + model_graph_result_parameter.color_hexcode
timeseries[result_parameter.getNamespaceKey()]["color"] = model_graph_result_parameter.color_hexcode
# Adding the warning status
warning_status_axis = {
"max" : 0,
"min" : -1,
"floor" : -1,
"allowDecimals": False,
"hideAxis": True
}
y_axis_list.append(warning_status_axis)
warning_status_axis_id = len(y_axis_list) -1
# Green - no risk
warning_statuses = [
{"id":"WARNING.NOFORECAST", "name":"No forecast available", "color":"#b2b2b2","constant_value":0},
{"id":"WARNING.MISSINGDATA", "name":"Missing data", "color":"#0078fd","constant_value":1},
{"id":"WARNING.NORISK", "name":"No risk", "color":"#31ab6e","constant_value":2},
{"id":"WARNING.MEDIUMRISK", "name":"Medium risk","color":"#fdca00","constant_value":3},
{"id":"WARNING.HIGHRISK", "name":"High risk","color":"#e90d00","constant_value":4}
]
for warning_status in warning_statuses:
timeseries[warning_status["id"]] = {
"name": warning_status["name"],
"type": "area",
"data": [],
"color": warning_status["color"],
"zIndex": -10,
"yAxis": warning_status_axis_id,
"enableMouseTracking": False,
"lineWidth" : 0,
"fillOpacity" : 1.0
}
for forecast_result in forecast_results:
for model_graph_result_parameter in model_graph_result_parameters:
result_parameter = model_graph_result_parameter.resultparameter
the_value = forecast_result.all_values.get(result_parameter.getNamespaceKey(), "")
if the_value != "" and timeseries.get(result_parameter.getNamespaceKey(), None) != None:
data_point = [util.get_unix_timestamp(forecast_result.result_valid_time),Decimal(the_value)]
timeseries[result_parameter.getNamespaceKey()]["data"].append(data_point)
# Add the warning status
for warning_status in warning_statuses:
if forecast_result.warning_status == warning_status["constant_value"]:
the_value = -1
else:
the_value = 0
data_point = [util.get_unix_timestamp(forecast_result.result_valid_time),Decimal(the_value)]
timeseries[warning_status["id"]]["data"].append(data_point)
try:
data_point = [util.get_unix_timestamp(forecast_result.result_valid_time),Decimal(the_value)]
timeseries[result_parameter.getNamespaceKey()]["data"].append(data_point)
except InvalidOperation:
continue
highcharts_dict["series"] = timeseries
......@@ -421,12 +420,20 @@ def validate_model_id_length(value):
if len(value) != 10:
raise ValidationError(u'%s must be 10 characters' % (value))
class HighChartsType(models.Model):
name = models.CharField(max_length=63)
def __unicode__(self):
return self.name
class ModelGraphParameter(models.Model):
model_id = models.CharField(max_length=10, validators=[validate_model_id_length])
resultparameter = models.ForeignKey(ResultParameter)
color_hexcode = models.CharField(max_length=6)
highcharts_type = models.ForeignKey(HighChartsType)
def __unicode__(self):
return self.model_id + "/" + self.resultparameter.getNamespaceKey()
......@@ -83,6 +83,9 @@
{% endif %}
{% endblock %}
{% block customJS %}
<script type="text/javascript" src="{% url "views.settings_js" %}"></script>
<script type="text/javascript" src="{% static "js/3rdparty/moment.min.js" %}"></script>
<script type="text/javascript" src="{% static "js/util.js" %}"></script>
<script type="text/javascript" src="{% static "js/3rdparty/highcharts.js" %}"></script>
<script type="text/javascript">
$(document).ready(function() {
......@@ -111,7 +114,15 @@ $(document).ready(function() {
dateTimeLabelFormats: { // don't display the dummy year
month: '%e. %b',
year: '%b'
}
},
plotBands: {{forecast_warning_statuses_highcharts|safe}}, // This is where we put warning status background bands
plotLines: [{
color: "white",
width: 3,
value: getSystemTime(),
dashStyle: 'shortdot',
zIndex: 100
}]
},
yAxis: [],
series: []
......@@ -121,6 +132,7 @@ $(document).ready(function() {
{
options.yAxis[index] = createYAxisConf(data.yAxis[index], index == 0);
}
var warningNS = "WARNING";
var warningPropNames = ["NOFORECAST","MISSINGDATA","NORISK","MEDIUMRISK","HIGHRISK"];
for(propName in data.series){
......@@ -129,6 +141,7 @@ $(document).ready(function() {
options.series[options.series.length] = data.series[propName];
}
}
/*
// Adding the warning stuff last
for(i in warningPropNames)
{
......@@ -137,7 +150,7 @@ $(document).ready(function() {
{
options.series[options.series.length] = warningSeries;
}
}
}*/
//console.log("Before creating chart " + (new Date().getTime() % 10000000));
var chart = new Highcharts.Chart(options);
......
......@@ -35,6 +35,7 @@ def detail_latest_days(request, forecast_id, latest_days):
forecast_results = ForecastResult.get_forecast_results(forecast_id, latest_days)
#forecast_results = forecast_results[0:1500]
forecast_result_highcharts = ForecastResult.get_forecast_results_highcharts(forecast_results, forecast_id)
forecast_warning_statuses_highcharts = ForecastResult.get_forecast_warning_statuses_highcharts(forecast_results)
#print "Result: %s seconds" % (time.time() - start)
result_parameters = None
if len(forecast_results) > 0:
......@@ -47,6 +48,7 @@ def detail_latest_days(request, forecast_id, latest_days):
'result_parameters' : result_parameters,
'forecast_results': forecast_results,
'forecast_result_highcharts' : forecast_result_highcharts,
'forecast_warning_statuses_highcharts' : forecast_warning_statuses_highcharts,
'timeseriesURL': '/forecasts/%s/detail_highcharts_json/' % forecast_id
}
return render(request, 'forecasts/detail.html', context)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment