From b178040dfa411dc4e386a3c0cc02dee77bab8199 Mon Sep 17 00:00:00 2001 From: Dennis Siemensma Date: Tue, 5 May 2020 15:39:05 +0200 Subject: [PATCH] Standaard zoom live grafieken zelf kunnen instellen #947 --- docs/changelog.rst | 6 ++++++ dsmr_frontend/admin.py | 1 + dsmr_frontend/migrations/0036_graphs_zoom.py | 19 ++++++++++++++++++ dsmr_frontend/models/settings.py | 6 ++++++ .../js/dsmr-reader/live/electricity.js | 2 +- .../dsmr_frontend/js/dsmr-reader/live/gas.js | 2 +- .../js/dsmr-reader/live/phases.js | 2 +- .../js/dsmr-reader/live/power-current.js | 2 +- .../js/dsmr-reader/live/temperature.js | 2 +- .../js/dsmr-reader/live/voltage.js | 2 +- .../templates/dsmr_frontend/live-graphs.html | 1 + dsmrreader/__init__.py | 2 +- dsmrreader/locales/nl/LC_MESSAGES/django.mo | Bin 100192 -> 100416 bytes dsmrreader/locales/nl/LC_MESSAGES/django.po | 6 ++++++ dsmrreader/provisioning/downgrade/v3.9.1.sh | 15 ++++++++++++++ 15 files changed, 61 insertions(+), 7 deletions(-) create mode 100644 dsmr_frontend/migrations/0036_graphs_zoom.py create mode 100644 dsmrreader/provisioning/downgrade/v3.9.1.sh diff --git a/docs/changelog.rst b/docs/changelog.rst index 6c147d44e..9b55a7a08 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -2,6 +2,12 @@ Changelog ========= +v3.9.1 - 2020-05-05 + +- [`#947 `_] Standaard zoom live grafieken zelf kunnen instellen + + +---- v3.9.0 - 2020-05-04 - [`#947 `_] Tijdsrange live grafieken zelf kunnen instellen diff --git a/dsmr_frontend/admin.py b/dsmr_frontend/admin.py index da891aa9e..a12254ea2 100644 --- a/dsmr_frontend/admin.py +++ b/dsmr_frontend/admin.py @@ -16,6 +16,7 @@ class FrontendSettingsAdmin(SingletonModelAdmin): ( _('Graphs'), { 'fields': [ + 'live_graphs_initial_zoom', 'live_graphs_hours_range', 'electricity_graph_style', 'stack_electricity_graphs', diff --git a/dsmr_frontend/migrations/0036_graphs_zoom.py b/dsmr_frontend/migrations/0036_graphs_zoom.py new file mode 100644 index 000000000..d7bda7373 --- /dev/null +++ b/dsmr_frontend/migrations/0036_graphs_zoom.py @@ -0,0 +1,19 @@ +# Generated by Django 3.0.5 on 2020-05-05 13:05 + +import django.core.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('dsmr_frontend', '0035_graphs_range'), + ] + + operations = [ + migrations.AddField( + model_name='frontendsettings', + name='live_graphs_initial_zoom', + field=models.IntegerField(default=10, help_text='The percentage of the graph range displayed initially', validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(100)], verbose_name='Live graphs initial zoom'), + ), + ] diff --git a/dsmr_frontend/models/settings.py b/dsmr_frontend/models/settings.py index 29b08a2c4..1274e5146 100644 --- a/dsmr_frontend/models/settings.py +++ b/dsmr_frontend/models/settings.py @@ -88,6 +88,12 @@ class FrontendSettings(ModelUpdateMixin, SingletonModel): verbose_name=_('Live graphs hours range'), help_text=_("The range of the data displayed in live graphs (increasing it may degrade rendering performance!)") ) + live_graphs_initial_zoom = models.IntegerField( + default=10, + validators=[MinValueValidator(1), MaxValueValidator(100)], + verbose_name=_('Live graphs initial zoom'), + help_text=_("The percentage of the graph range displayed initially") + ) gas_graph_style = models.CharField( max_length=4, choices=GRAPH_STYLES, diff --git a/dsmr_frontend/static/dsmr_frontend/js/dsmr-reader/live/electricity.js b/dsmr_frontend/static/dsmr_frontend/js/dsmr-reader/live/electricity.js index d569088c2..0e87916fb 100644 --- a/dsmr_frontend/static/dsmr_frontend/js/dsmr-reader/live/electricity.js +++ b/dsmr_frontend/static/dsmr_frontend/js/dsmr-reader/live/electricity.js @@ -36,7 +36,7 @@ $(document).ready(function () { dataZoom: [ { show: true, - start: 0, + start: live_graphs_initial_zoom, end: 100 }, { diff --git a/dsmr_frontend/static/dsmr_frontend/js/dsmr-reader/live/gas.js b/dsmr_frontend/static/dsmr_frontend/js/dsmr-reader/live/gas.js index fc2458866..90b5089bd 100644 --- a/dsmr_frontend/static/dsmr_frontend/js/dsmr-reader/live/gas.js +++ b/dsmr_frontend/static/dsmr_frontend/js/dsmr-reader/live/gas.js @@ -43,7 +43,7 @@ $(document).ready(function () { dataZoom: [ { show: true, - start: 0, + start: live_graphs_initial_zoom, end: 100 }, { diff --git a/dsmr_frontend/static/dsmr_frontend/js/dsmr-reader/live/phases.js b/dsmr_frontend/static/dsmr_frontend/js/dsmr-reader/live/phases.js index e630b28be..8fde42341 100644 --- a/dsmr_frontend/static/dsmr_frontend/js/dsmr-reader/live/phases.js +++ b/dsmr_frontend/static/dsmr_frontend/js/dsmr-reader/live/phases.js @@ -41,7 +41,7 @@ $(document).ready(function () { dataZoom: [ { show: true, - start: 0, + start: live_graphs_initial_zoom, end: 100 }, { diff --git a/dsmr_frontend/static/dsmr_frontend/js/dsmr-reader/live/power-current.js b/dsmr_frontend/static/dsmr_frontend/js/dsmr-reader/live/power-current.js index b3825835f..d77e15434 100644 --- a/dsmr_frontend/static/dsmr_frontend/js/dsmr-reader/live/power-current.js +++ b/dsmr_frontend/static/dsmr_frontend/js/dsmr-reader/live/power-current.js @@ -39,7 +39,7 @@ $(document).ready(function () { dataZoom: [ { show: true, - start: 0, + start: live_graphs_initial_zoom, end: 100 }, { diff --git a/dsmr_frontend/static/dsmr_frontend/js/dsmr-reader/live/temperature.js b/dsmr_frontend/static/dsmr_frontend/js/dsmr-reader/live/temperature.js index 3e3d6392c..87e0cd28e 100644 --- a/dsmr_frontend/static/dsmr_frontend/js/dsmr-reader/live/temperature.js +++ b/dsmr_frontend/static/dsmr_frontend/js/dsmr-reader/live/temperature.js @@ -43,7 +43,7 @@ $(document).ready(function () { dataZoom: [ { show: true, - start: 0, + start: live_graphs_initial_zoom, end: 100 }, { diff --git a/dsmr_frontend/static/dsmr_frontend/js/dsmr-reader/live/voltage.js b/dsmr_frontend/static/dsmr_frontend/js/dsmr-reader/live/voltage.js index 88473dc73..514208368 100644 --- a/dsmr_frontend/static/dsmr_frontend/js/dsmr-reader/live/voltage.js +++ b/dsmr_frontend/static/dsmr_frontend/js/dsmr-reader/live/voltage.js @@ -39,7 +39,7 @@ $(document).ready(function () { dataZoom: [ { show: true, - start: 0, + start: live_graphs_initial_zoom, end: 100 }, { diff --git a/dsmr_frontend/templates/dsmr_frontend/live-graphs.html b/dsmr_frontend/templates/dsmr_frontend/live-graphs.html index c87f26e32..6dc2d7f82 100644 --- a/dsmr_frontend/templates/dsmr_frontend/live-graphs.html +++ b/dsmr_frontend/templates/dsmr_frontend/live-graphs.html @@ -145,6 +145,7 @@ diff --git a/dsmrreader/__init__.py b/dsmrreader/__init__.py index 2e8f82d9f..e8f9a0232 100644 --- a/dsmrreader/__init__.py +++ b/dsmrreader/__init__.py @@ -1,5 +1,5 @@ from django.utils.version import get_version -VERSION = (3, 9, 0, 'final', 0) +VERSION = (3, 9, 1, 'final', 0) __version__ = get_version(VERSION) diff --git a/dsmrreader/locales/nl/LC_MESSAGES/django.mo b/dsmrreader/locales/nl/LC_MESSAGES/django.mo index c916e81978b0426e2ea733529bc9535cf2aeb4ff..89775c26326677106bee4f9dae92af9b84bf81e4 100644 GIT binary patch delta 16067 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 XpPH03dWd&IQp%9jJzZOPf}8#yrCXv{ delta 15865 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