From fe37858788078ea738af80f3a0ed3b0dcb557975 Mon Sep 17 00:00:00 2001 From: Dennis Siemensma Date: Sun, 3 May 2020 19:55:11 +0200 Subject: [PATCH] Tijdsrange live grafieken zelf kunnen instellen #947 --- docs/changelog.rst | 1 + dsmr_frontend/admin.py | 2 +- dsmr_frontend/migrations/0035_graphs_range.py | 23 ++++++++++++++++++ dsmr_frontend/models/settings.py | 10 ++++---- .../js/dsmr-reader/live/electricity.js | 4 --- .../dsmr_frontend/js/dsmr-reader/live/gas.js | 3 --- .../js/dsmr-reader/live/phases.js | 4 --- .../js/dsmr-reader/live/power-current.js | 3 --- .../js/dsmr-reader/live/temperature.js | 3 --- .../js/dsmr-reader/live/voltage.js | 3 --- .../templates/dsmr_frontend/live-graphs.html | 1 - dsmr_frontend/tests/models/test_settings.py | 4 +-- .../tests/webinterface/test_dashboard.py | 5 ---- .../tests/webinterface/test_live_graphs.py | 5 ---- dsmr_frontend/views/live_graphs.py | 17 +++++++------ dsmrreader/locales/nl/LC_MESSAGES/django.mo | Bin 100092 -> 100192 bytes dsmrreader/locales/nl/LC_MESSAGES/django.po | 14 ++++++++--- 17 files changed, 52 insertions(+), 50 deletions(-) create mode 100644 dsmr_frontend/migrations/0035_graphs_range.py diff --git a/docs/changelog.rst b/docs/changelog.rst index a86fccbff..51069a1fe 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -4,6 +4,7 @@ Changelog v3.9.0 - 2020-xx-xx +- [`#947 `_] Tijdsrange live grafieken zelf kunnen instellen - [`#969 `_] In- en uitknijpen van de grafieken werkt niet meer - [`#966 `_] Error in dsmr_backup_create --compact diff --git a/dsmr_frontend/admin.py b/dsmr_frontend/admin.py index 9033bbcc1..da891aa9e 100644 --- a/dsmr_frontend/admin.py +++ b/dsmr_frontend/admin.py @@ -16,10 +16,10 @@ class FrontendSettingsAdmin(SingletonModelAdmin): ( _('Graphs'), { 'fields': [ + 'live_graphs_hours_range', 'electricity_graph_style', 'stack_electricity_graphs', 'gas_graph_style', - 'dashboard_graph_width', ], } ), diff --git a/dsmr_frontend/migrations/0035_graphs_range.py b/dsmr_frontend/migrations/0035_graphs_range.py new file mode 100644 index 000000000..468a7786b --- /dev/null +++ b/dsmr_frontend/migrations/0035_graphs_range.py @@ -0,0 +1,23 @@ +# Generated by Django 3.0.5 on 2020-05-02 22:23 + +import django.core.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('dsmr_frontend', '0034_mysql_timezone_support'), + ] + + operations = [ + migrations.RemoveField( + model_name='frontendsettings', + name='dashboard_graph_width', + ), + migrations.AddField( + model_name='frontendsettings', + name='live_graphs_hours_range', + field=models.IntegerField(default=24, help_text='The range of the data displayed in live graphs (increasing it may degrade rendering performance!)', validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(168)], verbose_name='Live graphs hours range'), + ), + ] diff --git a/dsmr_frontend/models/settings.py b/dsmr_frontend/models/settings.py index 03ad322c4..29b08a2c4 100644 --- a/dsmr_frontend/models/settings.py +++ b/dsmr_frontend/models/settings.py @@ -82,11 +82,11 @@ class FrontendSettings(ModelUpdateMixin, SingletonModel): verbose_name=_('Temperature color'), help_text=_("Graph color for temperatures read") ) - dashboard_graph_width = models.IntegerField( - default=30, - validators=[MinValueValidator(30), MaxValueValidator(60 * 60 * 24)], - verbose_name=_('Dashboard graph width'), - help_text=_("The number of items displayed on the X-axis of the dashboard graphs") + live_graphs_hours_range = models.IntegerField( + default=24, + validators=[MinValueValidator(1), MaxValueValidator(7 * 24)], + verbose_name=_('Live graphs hours range'), + help_text=_("The range of the data displayed in live graphs (increasing it may degrade rendering performance!)") ) gas_graph_style = models.CharField( max_length=4, 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 08f96d035..d569088c2 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 @@ -80,10 +80,6 @@ $(document).ready(function () { /* Init graph. */ $.get(echarts_electricity_graph_url, function (xhr_data) { echarts_electricity_graph.hideLoading(); - - /* Adjust default zooming to the number of default items we want to display. */ - var zoom_percent = 100 - (dashboard_graph_width / xhr_data.read_at.length * 100); - echarts_electricity_initial_options.dataZoom[0].start = zoom_percent; echarts_electricity_graph.setOption(echarts_electricity_initial_options); /* Different set of options, to prevent the dataZoom being reset on each update. */ 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 a379e0b6a..fc2458866 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 @@ -7,9 +7,6 @@ $(document).ready(function () { $.get(echarts_gas_graph_url, function (xhr_data) { echarts_gas_graph.hideLoading(); - /* Adjust default zooming to the number of default items we want to display. */ - var zoom_percent = 100 - (dashboard_graph_width / xhr_data.read_at.length * 100); - var option = { color: [ gas_delivered_color 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 81c3095f7..e630b28be 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 @@ -118,10 +118,6 @@ $(document).ready(function () { /* Init graph. */ $.get(echarts_phases_graph_url, function (xhr_data) { echarts_phases_graph.hideLoading(); - - /* Adjust default zooming to the number of default items we want to display. */ - var zoom_percent = 100 - (dashboard_graph_width / xhr_data.read_at.length * 100); - echarts_phases_initial_options.dataZoom[0].start = zoom_percent; echarts_phases_graph.setOption(echarts_phases_initial_options); /* Different set of options, to prevent the dataZoom being reset on each update. */ 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 8c4072503..b3825835f 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 @@ -100,9 +100,6 @@ $(document).ready(function () { ]; } - /* Adjust default zooming to the number of default items we want to display. */ - var zoom_percent = 100 - (dashboard_graph_width / xhr_data.read_at.length * 100); - echarts_power_current_initial_options.dataZoom[0].start = zoom_percent; echarts_power_current_graph.setOption(echarts_power_current_initial_options); /* Different set of options, to prevent the dataZoom being reset on each update. */ 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 8194ed085..3e3d6392c 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 @@ -7,9 +7,6 @@ $(document).ready(function () { $.get(echarts_temperature_graph_url, function (xhr_data) { echarts_temperature_graph.hideLoading(); - /* Adjust default zooming to the number of default items we want to display. */ - var zoom_percent = 100 - (dashboard_graph_width / xhr_data.read_at.length * 100); - var option = { color: [ temperature_color 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 ae7be22b4..88473dc73 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 @@ -97,9 +97,6 @@ $(document).ready(function () { ]; } - /* Adjust default zooming to the number of default items we want to display. */ - var zoom_percent = 100 - (dashboard_graph_width / xhr_data.read_at.length * 100); - echarts_voltage_initial_options.dataZoom[0].start = zoom_percent; echarts_voltage_graph.setOption(echarts_voltage_initial_options); /* Different set of options, to prevent the dataZoom being reset on each update. */ diff --git a/dsmr_frontend/templates/dsmr_frontend/live-graphs.html b/dsmr_frontend/templates/dsmr_frontend/live-graphs.html index c010bdcf3..c87f26e32 100644 --- a/dsmr_frontend/templates/dsmr_frontend/live-graphs.html +++ b/dsmr_frontend/templates/dsmr_frontend/live-graphs.html @@ -145,7 +145,6 @@ diff --git a/dsmr_frontend/tests/models/test_settings.py b/dsmr_frontend/tests/models/test_settings.py index 1cfb83f78..bcff6c76c 100644 --- a/dsmr_frontend/tests/models/test_settings.py +++ b/dsmr_frontend/tests/models/test_settings.py @@ -46,5 +46,5 @@ def test_phase_delivered_l3_color(self): def test_temperature_color(self): self.assertEqual(self.instance.temperature_color, '#0073B7') - def test_dashboard_graph_width(self): - self.assertEqual(self.instance.dashboard_graph_width, 30) + def test_live_graphs_hours_range(self): + self.assertEqual(self.instance.live_graphs_hours_range, 24) diff --git a/dsmr_frontend/tests/webinterface/test_dashboard.py b/dsmr_frontend/tests/webinterface/test_dashboard.py index 18ec3323b..23a72851f 100644 --- a/dsmr_frontend/tests/webinterface/test_dashboard.py +++ b/dsmr_frontend/tests/webinterface/test_dashboard.py @@ -8,7 +8,6 @@ from dsmr_consumption.models.energysupplier import EnergySupplierPrice from dsmr_weather.models.settings import WeatherSettings from dsmr_stats.models.statistics import DayStatistics -from dsmr_frontend.models.settings import FrontendSettings class TestViews(TestCase): @@ -46,10 +45,6 @@ def test_dashboard(self, now_mock): self.assertIn('datalogger_settings', response.context) self.assertIn('frontend_settings', response.context) self.assertIn('notification_count', response.context) - self.assertEqual( - response.context['frontend_settings'].dashboard_graph_width, - FrontendSettings.get_solo().dashboard_graph_width - ) class TestViewsWithoutData(TestViews): diff --git a/dsmr_frontend/tests/webinterface/test_live_graphs.py b/dsmr_frontend/tests/webinterface/test_live_graphs.py index e5c711ac1..b39c5899a 100644 --- a/dsmr_frontend/tests/webinterface/test_live_graphs.py +++ b/dsmr_frontend/tests/webinterface/test_live_graphs.py @@ -9,7 +9,6 @@ from dsmr_consumption.models.energysupplier import EnergySupplierPrice from dsmr_weather.models.settings import WeatherSettings from dsmr_stats.models.statistics import DayStatistics -from dsmr_frontend.models.settings import FrontendSettings from dsmr_weather.models.reading import TemperatureReading @@ -44,10 +43,6 @@ def test_live_graphs(self, now_mock): ) self.assertEqual(response.status_code, 200, response.content) self.assertIn('frontend_settings', response.context) - self.assertEqual( - response.context['frontend_settings'].dashboard_graph_width, - FrontendSettings.get_solo().dashboard_graph_width - ) @mock.patch('django.utils.timezone.now') def test_live_xhr_electricity(self, now_mock): diff --git a/dsmr_frontend/views/live_graphs.py b/dsmr_frontend/views/live_graphs.py index d4f6d562c..e88f82fa4 100644 --- a/dsmr_frontend/views/live_graphs.py +++ b/dsmr_frontend/views/live_graphs.py @@ -12,9 +12,6 @@ import dsmr_stats.services -XHR_RECENT_CONSUMPTION_HOURS_AGO = 24 - - class LiveGraphs(TemplateView): template_name = 'dsmr_frontend/live-graphs.html' @@ -73,8 +70,10 @@ def get(self, request): # noqa: C901 # Optional delta. latest_delta_id = form.cleaned_data.get('latest_delta_id') - # Optimize queries for large datasets by restricting the data to the last week in the first place. - base_timestamp = timezone.now() - timezone.timedelta(hours=XHR_RECENT_CONSUMPTION_HOURS_AGO) + # Optimize queries for large datasets by restricting the data (when using the installation default). + base_timestamp = timezone.now() - timezone.timedelta( + hours=FrontendSettings.get_solo().live_graphs_hours_range + ) electricity = ElectricityConsumption.objects.filter(read_at__gt=base_timestamp).order_by('read_at') if latest_delta_id: @@ -133,7 +132,9 @@ def get(self, request): # noqa: C901 } # Optimize queries for large datasets by restricting the data to the last week in the first place. - base_timestamp = timezone.now() - timezone.timedelta(hours=XHR_RECENT_CONSUMPTION_HOURS_AGO) + base_timestamp = timezone.now() - timezone.timedelta( + hours=FrontendSettings.get_solo().live_graphs_hours_range + ) gas = GasConsumption.objects.filter(read_at__gt=base_timestamp).order_by('read_at') for current in gas: @@ -153,7 +154,9 @@ def get(self, request): # noqa: C901 } # Optimize queries for large datasets by restricting the data to the last week in the first place. - base_timestamp = timezone.now() - timezone.timedelta(hours=XHR_RECENT_CONSUMPTION_HOURS_AGO) + base_timestamp = timezone.now() - timezone.timedelta( + hours=FrontendSettings.get_solo().live_graphs_hours_range + ) temperature = TemperatureReading.objects.filter(read_at__gt=base_timestamp).order_by('read_at') for current in temperature: diff --git a/dsmrreader/locales/nl/LC_MESSAGES/django.mo b/dsmrreader/locales/nl/LC_MESSAGES/django.mo index 366a0e599f5b8c5e07a6eaab04fbb9a38358883b..c916e81978b0426e2ea733529bc9535cf2aeb4ff 100644 GIT binary patch delta 13452 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 WVRLSHpx4Z`--_5T6+o!}+_ delta 13327 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 K5!2F>oce!-wz4+> diff --git a/dsmrreader/locales/nl/LC_MESSAGES/django.po b/dsmrreader/locales/nl/LC_MESSAGES/django.po index 3cb0b28d2..d6269bc5f 100644 --- a/dsmrreader/locales/nl/LC_MESSAGES/django.po +++ b/dsmrreader/locales/nl/LC_MESSAGES/django.po @@ -854,11 +854,11 @@ msgstr "Temperatuurkleur" msgid "Graph color for temperatures read" msgstr "Grafiekkleur voor temperatuurmetingen" -msgid "Dashboard graph width" -msgstr "Dashboard grafiek breedte" +msgid "Live graphs hours range" +msgstr "Live grafieken urenlimiet" -msgid "The number of items displayed on the X-axis of the dashboard graphs" -msgstr "Het aantal punten dat getoond wordt op de X-as van de Dashboardgrafieken" +msgid "The range of the data displayed in live graphs (increasing it may degrade rendering performance!)" +msgstr "Het bereik van de gegevens in de live grafieken (het verhogen van deze waarde kan resulteren in verslechterde performance van de grafieken!)" msgid "Gas graph style" msgstr "Grafiekstijl voor gas" @@ -2564,6 +2564,12 @@ msgstr "Nederlands" msgid "English" msgstr "Engels" +#~ msgid "Dashboard graph width" +#~ msgstr "Dashboard grafiek breedte" + +#~ msgid "The number of items displayed on the X-axis of the dashboard graphs" +#~ msgstr "Het aantal punten dat getoond wordt op de X-as van de Dashboardgrafieken" + #~ msgid "The lifetime of readings, before discarding them. Please note that retention is applied during night time currently, between midnight and six in the morning." #~ msgstr "De levenduur van metingen, voordat ze opgeschoond worden. N.B.: Momenteel wordt retentie alleen doorgevoerd tijdens de nachturen, tussen middernacht en zes uur 's ochtends."