summaryrefslogtreecommitdiff
path: root/ishtar_common/views.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2023-09-21 19:29:44 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2024-04-16 16:38:32 +0200
commitee4619364d1751b1c877b3047906439a24aacd36 (patch)
tree5e8e2b72d0ea36d8e40ec67df0da81ccb14b1b0e /ishtar_common/views.py
parent27eac8dc6cf0e96f78edfe4e09845e454fb6d510 (diff)
downloadIshtar-ee4619364d1751b1c877b3047906439a24aacd36.tar.bz2
Ishtar-ee4619364d1751b1c877b3047906439a24aacd36.zip
✨ Imports: built-in CSV viewer
Diffstat (limited to 'ishtar_common/views.py')
-rw-r--r--ishtar_common/views.py60
1 files changed, 54 insertions, 6 deletions
diff --git a/ishtar_common/views.py b/ishtar_common/views.py
index 4a76207f6..ca9df098c 100644
--- a/ishtar_common/views.py
+++ b/ishtar_common/views.py
@@ -1553,13 +1553,12 @@ class ImportListView(IshtarMixin, LoginRequiredMixin, ListView):
return query.exclude(state="AC")
def get_queryset(self):
- q1 = self._queryset_filter(self.model.objects)
- q2 = self._queryset_filter(models.ImportGroup.objects)
- if not self.request.user.is_superuser:
- user = models.IshtarUser.objects.get(pk=self.request.user.pk)
- q1 = q1.filter(user=user)
- q2 = q2.filter(user=user)
+ user = self.request.user
+ if not user.pk:
+ raise Http404()
+ q1 = self._queryset_filter(self.model.query_can_access(user))
q1 = q1.filter(group__isnull=True).order_by("-creation_date", "-pk")
+ q2 = self._queryset_filter(models.ImportGroup.query_can_access(user))
q2 = q2.order_by("-creation_date", "-pk")
return list(reversed(sorted(list(q1) + list(q2), key=lambda x: x.creation_date)))
@@ -2143,6 +2142,55 @@ class ImportGroupDeleteView(IshtarMixin, LoginRequiredMixin, DeleteView):
return reverse("current_imports")
+class ImportCSVView(IshtarMixin, LoginRequiredMixin, TemplateView):
+ template_name = "ishtar/blocks/view_import_csv.html"
+ ATTRIBUTES = {
+ "source": "imported_file",
+ "error": "error_file",
+ "result": "result_file",
+ "match": "match_file"
+ }
+ TITLES = {
+ "source": ("fa fa-file-text-o", _("Source")),
+ "error": ("text-danger fa fa-exclamation-triangle", _("Error")),
+ "result": ("fa fa-th", _("Result")) ,
+ "match": ("fa fa-arrows-h", _("Match")),
+ }
+
+ def get(self, request, *args, **kwargs):
+ user = self.request.user
+ if not user.pk:
+ raise Http404()
+ model = models.ImportGroup if kwargs.get("group", None) else models.Import
+ q = model.query_can_access(self.request.user).filter(pk=kwargs.get("pk", -1))
+ if not q.count():
+ raise Http404()
+ self.import_item = q.all()[0]
+ attribute = self.ATTRIBUTES[kwargs["target"]]
+ self.csv_file = getattr(self.import_item, attribute)
+ if not self.csv_file:
+ raise Http404()
+ return super().get(request, *args, **kwargs)
+
+ def get_context_data(self, **kwargs):
+ data = super().get_context_data(**kwargs)
+ encoding = "utf-8"
+ if self.kwargs["target"] == "source" and self.import_item.encoding:
+ encoding = self.import_item.encoding
+ data["icon"], data["target"] = self.TITLES[self.kwargs["target"]]
+ data["title"] = str(self.import_item)
+ data["content"] = []
+ with open(self.csv_file.path, "r", encoding=encoding) as f:
+ reader = csv.reader(f)
+ for idx, line in enumerate(reader):
+ if not idx:
+ data["header"] = line
+ continue
+ data["content"].append(line)
+ data["window_id"] = "csv-view-" + (self.kwargs.get("group", "") or "") + str(self.import_item.pk)
+ return data
+
+
class PersonCreate(LoginRequiredMixin, CreateView):
model = models.Person
form_class = forms.BasePersonForm