From cd15232b4f3be93cd2da2e0a6feb81b527cd3c3f Mon Sep 17 00:00:00 2001 From: Florian Bezannier Date: Fri, 14 May 2021 12:45:58 +0200 Subject: [PATCH] apply default filter --- web/app.py | 23 ++++++++++---- web/assets/clientside.js | 19 ++++++++++-- web/{figure_filter.py => figurefilter.py} | 38 +++++++++++++++-------- web/views.py | 4 +-- 4 files changed, 60 insertions(+), 24 deletions(-) rename web/{figure_filter.py => figurefilter.py} (78%) diff --git a/web/app.py b/web/app.py index 8a3faaf..df3d5a0 100644 --- a/web/app.py +++ b/web/app.py @@ -18,7 +18,6 @@ from mylogger import logger from my_psacc import MyPSACC # pylint: disable=invalid-name - app = None dash_app = None dispatcher = None @@ -28,9 +27,15 @@ myp: MyPSACC = None chc: ChargeControls = None -def start_app(title, base_path, debug: bool, host, port, reloader=False, # pylint: disable=too-many-arguments - unminified=False): +def start_app(*args, **kwargs): + run(config_flask(*args, **kwargs)) + + +def config_flask(title, base_path, debug: bool, host, port, reloader=False, # pylint: disable=too-many-arguments + unminified=False): global app, dash_app, dispatcher + reload_view = app is not None + app = Flask(__name__) try: lang = locale.getlocale()[0].split("_")[0] locale.setlocale(locale.LC_TIME, ".".join(locale.getlocale())) # make sure LC_TIME is set @@ -40,7 +45,6 @@ def start_app(title, base_path, debug: bool, host, port, reloader=False, # pyl logger.warning("Can't get language") if unminified: locale_url = ["assets/plotly-with-meta.js"] - app = Flask(__name__) app.wsgi_app = ProxyFix(app.wsgi_app) app.config["DEBUG"] = debug if base_path == "/": @@ -53,8 +57,15 @@ def start_app(title, base_path, debug: bool, host, port, reloader=False, # pyl server=app, requests_pathname_prefix=requests_pathname_prefix) dash_app.enable_dev_tools(reloader) # keep this line - import web.views # pylint: disable=unused-import,import-outside-toplevel - return run_simple(host, port, application, use_reloader=reloader, use_debugger=debug) + import web.views # pylint: disable=import-outside-toplevel + if reload_view: + import importlib # pylint: disable=import-outside-toplevel + importlib.reload(web.views) + return {"hostname": host, "port": port, "application": application, "use_reloader": reloader, "use_debugger": debug} + + +def run(config): + return run_simple(**config) def save_config(my_peugeot: MyPSACC, name): diff --git a/web/assets/clientside.js b/web/assets/clientside.js index cb88d46..5e8a682 100644 --- a/web/assets/clientside.js +++ b/web/assets/clientside.js @@ -70,6 +70,7 @@ function filterDataset (data, range) { return res } + function filterShortTrip (data) { const longTrips = { trips: data.trips.filter(line => line.distance > 10), @@ -172,10 +173,10 @@ function updateCardsValue (data) { function sortDataset (ctx, data, tables) { const tableId = ctx.prop_id.split('.')[0] - if (ctx.value.length > 0) { + const table = tables.filter(table => table.table_id === tableId)[0] + if (ctx.value.length > 0 && data[table.src].length > 0) { const asc = ctx.value[0].direction === 'asc' let columnId = ctx.value[0].column_id - const table = tables.filter(table => table.table_id === tableId)[0] let sorted if (columnId.endsWith('_str')) { columnId = columnId.slice(0, -4) @@ -196,7 +197,17 @@ function sortDataset (ctx, data, tables) { } } -function filterAndSort (data, range, figures, p, log) { // eslint-disable-line no-unused-vars +function sort_multiple_table(sort_params, data, tables){ + for ([prop_id, value] of Object.entries(sort_params)) { + let ctx = {} + ctx.prop_id = prop_id+".sort_by"; + ctx.value = value + console.log(ctx) + sortDataset(ctx, data, tables); + } +} + +function filterAndSort (data, range, figures, p, log, sort) { // eslint-disable-line no-unused-vars if (log > 10) { logger.disableLogger() } @@ -205,6 +216,7 @@ function filterAndSort (data, range, figures, p, log) { // eslint-disable-line n console.log('figures:', figures) console.log('data:', data) console.log('ctx', ctx) + console.log("sort", sort) if (ctx.length > 0 && ctx[0].prop_id.endsWith('sort_by')) { dataFiltered = filterDataset(data, range) sortDataset(ctx[0], dataFiltered, p.table_src) @@ -214,6 +226,7 @@ function filterAndSort (data, range, figures, p, log) { // eslint-disable-line n } else { addLocaleDate(data, p.date_columns) dataFiltered = filterDataset(data, range) + sort_multiple_table(sort, dataFiltered, p.table_src) outFigures.push(...updateTables(dataFiltered, p.table_src)) console.log(dataFiltered.trips.length) const longTrips = filterShortTrip(dataFiltered) diff --git a/web/figure_filter.py b/web/figurefilter.py similarity index 78% rename from web/figure_filter.py rename to web/figurefilter.py index 96c0134..62eef7b 100644 --- a/web/figure_filter.py +++ b/web/figurefilter.py @@ -34,7 +34,7 @@ def figures_to_dict(figures): return el_list -class Figure_Filter: +class FigureFilter: def __init__(self): self.graphs = [] @@ -74,20 +74,31 @@ class Figure_Filter: outputs.extend([Output(graph.graph_id, "figure") for graph in self.maps]) return outputs - def __get_graph_x_label(self, graphs): + @staticmethod + def __get_graph_x_label(graphs): return [graph.x for graph in graphs] - def __get_graph_y_label(self, graphs): + @staticmethod + def __get_graph_y_label(graphs): return [graph.y for graph in graphs] def __get_table_input_sort_by(self): inputs = [Input(table.table_id, 'sort_by') for table in self.tables] return inputs - def gen_unused_variable(self): + def gen_sort_variable(self): res = ", ".join([chr(i) for i in range(ord('a'), ord('a') + len(self.tables))]) return res + def __gen_sort_dict(self): + res = "{" + i = ord("a") + for table in self.tables: + res+= f'"{table.table_id}": {chr(i)},' + i += 1 + res = res[:-1] + "}" + return res + def get_params(self): params = json.dumps({ "date_columns": self.__get_table_date_column_id(), @@ -106,17 +117,18 @@ class Figure_Filter: log_level = 10 else: log_level = 20 - fct_def = f"""function(data,range, figures, {self.gen_unused_variable()}) {{ - const params={self.get_params()}; - const logLevel={log_level}; - return filterAndSort(data, range, figures, params, logLevel); + fct_def = f"""function(data,range, figures, {self.gen_sort_variable()}) {{ + console.log("=============") + const params={self.get_params()} + const logLevel={log_level} + return filterAndSort(data, range, figures, params, logLevel, {self.__gen_sort_dict()}) }}""" dash_app.clientside_callback(fct_def, - *self.__get_output(), - Input('clientside-data-store', 'data'), - Input('date-slider', 'value'), - Input('clientside-figure-store', 'data'), - *self.__get_table_input_sort_by()) + *self.__get_output(), + Input('clientside-data-store', 'data'), + Input('date-slider', 'value'), + Input('clientside-figure-store', 'data'), + *self.__get_table_input_sort_by()) return True return False diff --git a/web/views.py b/web/views.py index 53ac837..8a0917a 100644 --- a/web/views.py +++ b/web/views.py @@ -23,7 +23,7 @@ from web.db import Database from web.utils import diff_dashtable, dash_date_to_datetime # pylint: disable=invalid-name -from web.figure_filter import Figure_Filter +from web.figurefilter import FigureFilter from web.utils import create_card RESPONSE = "-response" @@ -285,7 +285,7 @@ def serve_layout(): global cached_layout if cached_layout is None: logger.debug("Create new layout") - fig_filter = Figure_Filter() + fig_filter = FigureFilter() try: range_slider = dcc.RangeSlider( id='date-slider',