From 94a4a57148d2c81dbbc1251b7e79ba09282af217 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Mon, 23 Oct 2023 12:36:44 +0200 Subject: ✨ imports: allow errors to be pointed out line by line MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ishtar_common/views.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'ishtar_common/views.py') diff --git a/ishtar_common/views.py b/ishtar_common/views.py index 8f8ecb5a6..b91f3202c 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -2075,6 +2075,7 @@ def import_get_status(request, current_right=None): "full_id": ("group-" if key == "group" else "") + str(item.id), "state": item.state, "status": str(item.status), + "has_error": item.has_error } if key == "import": item_dct.update({ @@ -2182,6 +2183,16 @@ class ImportCSVView(IshtarMixin, LoginRequiredMixin, TemplateView): encoding = self.import_item.encoding data["icon"], data["target"] = self.TITLES[self.kwargs["target"]] data["title"] = str(self.import_item) + line_errors = [] + has_line_errors = False + if self.kwargs["target"] == "error": + has_line_errors = True + q = models.ImportLineError.objects.filter(import_item=self.import_item) + if not q.count(): + self.import_item.parse_error_file() + line_errors = models.ImportLineError.objects.filter( + import_item=self.import_item).values_list("pk", "ignored") + data["has_line_errors"] = has_line_errors data["content"] = [] with open(self.csv_file.path, "r", encoding=encoding) as f: reader = csv.reader(f) @@ -2189,11 +2200,33 @@ class ImportCSVView(IshtarMixin, LoginRequiredMixin, TemplateView): if not idx: data["header"] = line continue + if line_errors and len(line_errors) >= idx: + line = [line_errors[idx - 1]] + line data["content"].append(line) data["window_id"] = "csv-view-" + (self.kwargs.get("group", "") or "") + str(self.import_item.pk) + data["import_id"] = self.import_item.pk return data +def line_error(request, line_id): + """ + Set or unset ignored state of a csv error file + """ + user = request.user + if not user.pk: + raise Http404() + q = models.ImportLineError.objects.filter(pk=line_id) + if not q.count(): + return + line = q.all()[0] + q = models.Import.query_can_access(request.user).filter(pk=line.import_item_id) + if not q.count(): + raise Http404() + line.ignored = not line.ignored + line.save() + return HttpResponse(content_type="text/plain") + + class PersonCreate(LoginRequiredMixin, CreateView): model = models.Person form_class = forms.BasePersonForm -- cgit v1.2.3