From 8cbda24660d1dbf50980e1f77c5c12a27e0279f5 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Thu, 10 Aug 2023 18:13:55 +0200 Subject: 🚸 imports: auto-refresh import state and progress MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ishtar_common/models_imports.py | 8 +++ ishtar_common/static/js/ishtar.js | 56 +++++++++++++++++++ ishtar_common/templates/ishtar/import_table.html | 69 +++++++++++++++--------- ishtar_common/urls.py | 5 ++ ishtar_common/views.py | 35 +++++++++++- 5 files changed, 146 insertions(+), 27 deletions(-) (limited to 'ishtar_common') diff --git a/ishtar_common/models_imports.py b/ishtar_common/models_imports.py index 718f76ef3..ff920fbf2 100644 --- a/ishtar_common/models_imports.py +++ b/ishtar_common/models_imports.py @@ -1313,6 +1313,10 @@ class ImportGroup(BaseImport): def __str__(self): return f"{self.name} ({self.importer_type.name})" + @property + def import_id(self): + return f"group-{self.id}" + def import_list(self): """ Sorted import list by order in the importer group @@ -1529,6 +1533,10 @@ class Import(BaseImport): def __str__(self): return "{} | {}".format(self.name or "-", self.importer_type) + @property + def import_id(self): + return str(self.id) + def need_matching(self): return bool( TargetKey.objects.filter(associated_import=self, is_set=False).count() diff --git a/ishtar_common/static/js/ishtar.js b/ishtar_common/static/js/ishtar.js index 1c7474c57..1656cb427 100644 --- a/ishtar_common/static/js/ishtar.js +++ b/ishtar_common/static/js/ishtar.js @@ -2107,3 +2107,59 @@ var bs_hide_table = function(name){ $("#grid_" + name).DataTable().clear().draw(); current_modal = null; } + +var import_table_import_state = new Array(); + +var import_table_update_import_list = function(import_ids){ + $.post('/import-get-status/', + {items: import_ids}, + import_table_refresh_import_list + ); +} + +var import_table_refresh_import_item = function(item){ + $("#status-" + item["full_id"]).html(item["status"]); + let display = "display:none"; + if (item["state"] == "IP" || item["state"] == "PP"){ + display = ""; + } + $("#progress-display-" + item["full_id"]).attr("style", display); + let actions = ""; + for (action_id in item["actions"]){ + let action = item["actions"][action_id]; + actions += ""; + } + if (!import_table_import_state[item["full_id"]]){ + import_table_import_state[item["full_id"]] = actions; + } + if (import_table_import_state[item["full_id"]] != actions){ + $("#import-action-" + item["full_id"]).html(actions); + import_table_import_state[item["full_id"]] = actions; + } +}; + +var import_table_refresh_import_list = function(data){ + for (item_id in data["group"]){ + let item = data["group"][item_id]; + import_table_refresh_import_item(item); + } + for (item_id in data["import"]){ + let item = data["import"][item_id]; + import_table_refresh_import_item(item); + if (item["current_line"]){ + $("#progress-" + item["full_id"]).attr("aria-valuenow", item["current_line"]); + $("#progress-" + item["full_id"]).attr("aria-valuemax", item["status"]); + $("#progress-" + item["full_id"]).attr("style", "width: " + item["progress_percent"] + "%"); + let cls = "progress-bar progress-bar-striped "; + if (item["state"] == "IP"){ + $("#progress-" + item["full_id"]).removeClass("bg-info").addClass("bg-success"); + } else { + $("#progress-" + item["full_id"]).removeClass("bg-success").addClass("bg-info"); + } + cls += " progress-bar-animated"; + $("#progress-" + item["full_id"]).html( + item["current_line"] + "/" + item["number_of_line"] + ); + } + } +} diff --git a/ishtar_common/templates/ishtar/import_table.html b/ishtar_common/templates/ishtar/import_table.html index 138dbba65..f027e07c5 100644 --- a/ishtar_common/templates/ishtar/import_table.html +++ b/ishtar_common/templates/ishtar/import_table.html @@ -1,21 +1,36 @@ {% load i18n l10n inline_formset %} {% localize off %}

{{page_name}}

@@ -37,7 +52,7 @@ $("#import-list").find('input').prop('disabled', true); {% trans "Match" %} {% for import in object_list %} - + {{import.name|default:"-"}} @@ -61,11 +76,13 @@ $("#import-list").find('input').prop('disabled', true); {{import.creation_date|date:"DATE_FORMAT"}} {{import.creation_date|time:"H:i"}} - {{import.user}} - + {{import.status}} - {% for action, lbl in import.get_actions %} @@ -87,11 +104,12 @@ $("#import-list").find('input').prop('disabled', true); {% trans "File" context "not a directory" %} {% endif %} - {% if import.importer_type.type_label and import.state == 'IP' or import.state == 'PP' and import.current_line %} - + {% if import.importer_type.type_label %} + {# only for even and odd style #} +
-
 {{import.current_line}} / {{import.number_of_line}}
@@ -101,7 +119,7 @@ $("#import-list").find('input').prop('disabled', true); {% endif %} {% if not import.importer_type.type_label %} {# group #} {% for sub in import.import_list %} - + {{sub.importer_type}} {% if sub.imported_file %} @@ -113,7 +131,7 @@ $("#import-list").find('input').prop('disabled', true); {% endif %} - {{sub.status}} + {{sub.status}} {% if sub.need_matching %} {% trans "Match"%} @@ -128,18 +146,17 @@ $("#import-list").find('input').prop('disabled', true); {% trans "File" context "not a directory" %} {% endif %} - {% if sub.state == 'IP' or sub.state == 'PP' %} - + {# only for even and odd style #} +
-
 {{sub.current_line}} / {{sub.number_of_line}}
- {% endif %} {% endfor %} {% endif %} {% endfor %} diff --git a/ishtar_common/urls.py b/ishtar_common/urls.py index 16f04175e..eb35ea36b 100644 --- a/ishtar_common/urls.py +++ b/ishtar_common/urls.py @@ -238,6 +238,11 @@ urlpatterns = [ check_rights(["change_import"])(views.ImportListTableView.as_view()), name="current_imports_table", ), + url( + r"^import-get-status/$", + check_rights(["change_import"])(views.import_get_status), + name="import_get_status", + ), url( r"^import-list-old/$", check_rights(["change_import"])(views.ImportOldListView.as_view()), diff --git a/ishtar_common/views.py b/ishtar_common/views.py index 74691256b..1ab5931e4 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -1535,7 +1535,7 @@ class ImportListView(IshtarMixin, LoginRequiredMixin, ListView): q2 = q2.filter(user=user) q1 = q1.filter(group__isnull=True).order_by("-creation_date", "-pk") q2 = q2.order_by("-creation_date", "-pk") - return reversed(sorted(list(q1) + list(q2), key=lambda x: x.creation_date)) + return list(reversed(sorted(list(q1) + list(q2), key=lambda x: x.creation_date))) def post(self, request, *args, **kwargs): for field in request.POST: @@ -2029,6 +2029,39 @@ class ImportOldListView(ImportListView): return q.filter(user=user).order_by("-creation_date") +def import_get_status(request, current_right=None): + response = {"group": [], "import": []} + import_ids = request.POST.getlist("items[]", []) + for import_id in import_ids: + model = models.Import + key = "import" + if import_id.startswith("group-"): + model = models.ImportGroup + key = "group" + idx = import_id.split("-")[-1] + q = model.objects.filter(pk=idx) + if not q.count(): + continue + item = q.all()[0] + item_dct = { + "id": item.id, + "full_id": ("group-" if key == "group" else "") + str(item.id), + "state": item.state, + "status": str(item.status), + } + if key == "import": + item_dct.update({ + "current_line": item.current_line, + "number_of_line": item.number_of_line, + "progress_percent": item.progress_percent, + }) + item_dct["actions"] = [(key, str(lbl)) for key, lbl in item.get_actions()] + response[key].append(item_dct) + + data = json.dumps(response) + return HttpResponse(data, content_type="application/json") + + class ImportLinkView(IshtarMixin, LoginRequiredMixin, ModelFormSetView): template_name = "ishtar/formset_import_match.html" model = models.TargetKey -- cgit v1.2.3