diff --git a/src/ui/client/builder/pages/reports2.py b/src/ui/client/builder/pages/reports2.py new file mode 100644 index 000000000..d4e4ceaec --- /dev/null +++ b/src/ui/client/builder/pages/reports2.py @@ -0,0 +1,148 @@ +# TODO : REMOVE operation by custom endpoint + +reports_columns = [ + {"title": "Date", "field": "date", "formatter": "fields"}, # datepicker + {"title": "IP", "field": "ip", "formatter": "text"}, + {"title": "Country", "field": "country", "formatter": "text"}, + {"title": "Server name", "field": "server_name", "formatter": "text"}, + {"title": "Method", "field": "method", "formatter": "text"}, + {"title": "URL", "field": "url", "formatter": "text"}, + {"title": "Code", "field": "code", "formatter": "text"}, + {"title": "User agent", "field": "user_agent", "formatter": "text"}, + {"title": "Reason", "field": "reason", "formatter": "text"}, + {"title": "Data", "field": "data", "formatter": "text"}, +] + + +reports_filters = [ + { + "type": "like", + "fields": ["ip"], + "setting": { + "id": "input-search-ip", + "name": "input-search-ip", + "label": "reports_search_ip", # keep it (a18n) + "value": "", + "inpType": "input", + "columns": {"pc": 3, "tablet": 4, " mobile": 12}, + }, + }, + { + "type": "=", + "fields": ["reason"], + "setting": { + "id": "select-reason", + "name": "select-reason", + "label": "reports_select_reason", # keep it (a18n) + "value": "all", # keep "all" + "values": {"all"}, # keep "all" and add your reasons + "inpType": "select", + "onlyDown": True, + "columns": {"pc": 3, "tablet": 4, " mobile": 12}, + }, + }, + { + "type": "like", + "fields": ["url"], + "setting": { + "id": "input-search-url", + "name": "input-search-url", + "label": "reports_search_url", # keep it (a18n) + "value": "", + "inpType": "input", + "columns": {"pc": 3, "tablet": 4, " mobile": 12}, + }, + }, + { + "type": "like", + "fields": ["user_agent", "data"], + "setting": { + "id": "input-search-misc", + "name": "input-search-misc", + "label": "reports_search_misc", # keep it (a18n) + "value": "", + "inpType": "input", + "columns": {"pc": 3, "tablet": 4, " mobile": 12}, + }, + }, + { + "type": "=", + "fields": ["country"], + "setting": { + "id": "select-country", + "name": "select-country", + "label": "reports_select_country", # keep it (a18n) + "value": "all", # keep "all" + "values": {"all"}, # keep "all" and add your countries + "inpType": "select", + "onlyDown": True, + "columns": {"pc": 3, "tablet": 4, " mobile": 12}, + }, + }, + { + "type": "=", + "fields": ["method"], + "setting": { + "id": "select-method", + "name": "select-method", + "label": "reports_select_method", # keep it (a18n) + "value": "all", # keep "all" + "values": {"all"}, # keep "all" and add your methods + "inpType": "select", + "onlyDown": True, + "columns": {"pc": 3, "tablet": 4, " mobile": 12}, + }, + }, + { + "type": "=", + "fields": ["code"], + "setting": { + "id": "select-code", + "name": "select-code", + "label": "reports_select_code", # keep it (a18n) + "value": "all", # keep "all" + "values": {"all"}, # keep "all" and add your codes + "inpType": "select", + "onlyDown": True, + "columns": {"pc": 3, "tablet": 4, " mobile": 12}, + }, + }, +] + +# reports_items = [ +# { +# "date": datepicker( +# id="datepicker-date-id", # replace id by unique id +# name="datepicker-date-id", # replace by unique id +# label="reports_date", # keep it (a18n) +# hideLabel=True, +# inputType="datepicker", +# value="my_date", # replace my_date by timestamp value +# disabled=True, # Readonly +# )["data"], +# "ip": text(text="IP")["data"], +# "country": text(text="Country")["data"], +# "method": text(text="Method")["data"], +# "url": text(text="URL")["data"], +# "code": text(text="Code")["data"], +# "user_agent": text(text="User agent")["data"], +# "reason": text(text="Reason")["data"], +# "data": text(text="Data")["data"], +# }, +# ] + + +# builder = [ +# { +# "type": "card", +# "display": ["main", 1], +# "widgets": [ +# tabulator( +# id="table-core-plugins", +# columns=reports_columns, +# items=reports_items, +# filters=reports_filters, +# ), +# ], +# }, +# ] diff --git a/src/ui/client/builder/reports2.py b/src/ui/client/builder/reports2.py index 2c8fc201b..033ac5f66 100644 --- a/src/ui/client/builder/reports2.py +++ b/src/ui/client/builder/reports2.py @@ -40,7 +40,7 @@ reports_filters = [ "name": "select-reason", "label": "reports_select_reason", # keep it (a18n) "value": "all", # keep "all" - "values": ["all", "antibot"], # keep "all" and add your reasons + "values": {"all"}, # keep "all" and add your reasons "inpType": "select", "onlyDown": True, "columns": {"pc": 3, "tablet": 4, " mobile": 12}, @@ -78,7 +78,7 @@ reports_filters = [ "name": "select-country", "label": "reports_select_country", # keep it (a18n) "value": "all", # keep "all" - "values": ["all", "antibot"], # keep "all" and add your countries + "values": {"all"}, # keep "all" and add your countries "inpType": "select", "onlyDown": True, "columns": {"pc": 3, "tablet": 4, " mobile": 12}, @@ -92,7 +92,7 @@ reports_filters = [ "name": "select-method", "label": "reports_select_method", # keep it (a18n) "value": "all", # keep "all" - "values": ["all", "antibot"], # keep "all" and add your methods + "values": {"all"}, # keep "all" and add your methods "inpType": "select", "onlyDown": True, "columns": {"pc": 3, "tablet": 4, " mobile": 12}, @@ -106,7 +106,7 @@ reports_filters = [ "name": "select-code", "label": "reports_select_code", # keep it (a18n) "value": "all", # keep "all" - "values": ["all", "antibot"], # keep "all" and add your codes + "values": {"all"}, # keep "all" and add your codes "inpType": "select", "onlyDown": True, "columns": {"pc": 3, "tablet": 4, " mobile": 12}, @@ -116,7 +116,7 @@ reports_filters = [ reports_items = [ { - "data": datepicker( + "date": datepicker( id="datepicker-date-id", # replace id by unique id name="datepicker-date-id", # replace by unique id label="reports_date", # keep it (a18n) diff --git a/src/ui/main.py b/src/ui/main.py index 2ce49c898..759419ab9 100644 --- a/src/ui/main.py +++ b/src/ui/main.py @@ -49,6 +49,10 @@ from src.ui_data import UIData # TODO: rename to bans from builder.bans2 import bans_builder # type: ignore + +# TODO: rename to reports +from builder.reports2 import reports_columns, reports_filters # type: ignore + from builder.home import home_builder # type: ignore from builder.instances import instances_builder # type: ignore from builder.global_config import global_config_builder # type: ignore @@ -59,6 +63,8 @@ from builder.advanced_mode import advanced_mode_builder # type: ignore from builder.easy_mode import easy_mode_builder # type: ignore from builder.logs import logs_builder # type: ignore +from builder.utils.widgets import tabulator, datepicker # type: ignore + from common_utils import get_version # type: ignore from logger import setup_logger # type: ignore @@ -2034,33 +2040,49 @@ def logs(): @login_required def reports(): reports = app.bw_instances_utils.get_reports() - total_reports = len(reports) - reports = reports[:100] + tmp_reports_filters = reports_filters.copy() # Prepare data - reasons = {} - codes = {} - for i, report in enumerate(deepcopy(reports)): - reports[i]["date"] = datetime.fromtimestamp(floor(reports[i]["date"])).strftime("%d/%m/%Y %H:%M:%S") - # Get top reasons - if not report["reason"] in reasons: - reasons[report["reason"]] = 0 - reasons[report["reason"]] = reasons[report["reason"]] + 1 - # Get top status code - if not report["status"] in codes: - codes[report["status"]] = 0 - codes[report["status"]] = codes[report["status"]] + 1 + reports_items = [] + for i, report in enumerate(reports): + report_item = { + "date": datepicker( + id=f"datepicker-date-{i}", + name=f"datepicker-date-{i}", + label="reports_date", # keep it (a18n) + hideLabel=True, + inputType="datepicker", + value=str(floor(report.pop("date"))), # replace my_date by timestamp value + disabled=True, # Readonly + ), + } | report + reports_items.append(report_item) - top_reason = ([k for k, v in reasons.items() if v == max(reasons.values())] or [""])[0] - top_code = ([k for k, v in codes.items() if v == max(codes.values())] or [""])[0] + tmp_reports_filters[1]["setting"]["values"].add(report["reason"]) + tmp_reports_filters[4]["setting"]["values"].add(report["country"]) + tmp_reports_filters[5]["setting"]["values"].add(report["method"]) + tmp_reports_filters[6]["setting"]["values"].add(report["code"]) - return render_template( - "reports.html", - reports=reports, - total_reports=total_reports, - top_code=top_code, - top_reason=top_reason, - ) + tmp_reports_filters[1]["setting"]["values"] = list(tmp_reports_filters[1]["setting"]["values"]) + tmp_reports_filters[4]["setting"]["values"] = list(tmp_reports_filters[4]["setting"]["values"]) + tmp_reports_filters[5]["setting"]["values"] = list(tmp_reports_filters[5]["setting"]["values"]) + tmp_reports_filters[6]["setting"]["values"] = list(tmp_reports_filters[6]["setting"]["values"]) + + builder = [ + { + "type": "card", + "display": ["main", 1], + "widgets": [ + tabulator( + id="table-core-plugins", + columns=reports_columns, + items=reports_items, + filters=tmp_reports_filters, + ), + ], + }, + ] + return render_template("reports.html", data_server_builder=b64encode(dumps(builder).encode("utf-8")).decode("ascii")) @app.route("/bans", methods=["GET", "POST"])