summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2023-09-12 12:48:15 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2024-02-05 10:51:51 +0100
commit140e9ae8e3f7035cd3232fcdf4213de272c22e47 (patch)
tree6b1ec5073e0b7dff35958e0eb5ac4491cce37272
parentd988bd2b9168d7e47e4046ff1142e5bf5ceac107 (diff)
downloadIshtar-140e9ae8e3f7035cd3232fcdf4213de272c22e47.tar.bz2
Ishtar-140e9ae8e3f7035cd3232fcdf4213de272c22e47.zip
✨ Pre-import form: form and view
-rw-r--r--ishtar_common/forms_common.py61
-rw-r--r--ishtar_common/templates/ishtar/import_table.html6
-rw-r--r--ishtar_common/urls.py5
-rw-r--r--ishtar_common/views.py65
4 files changed, 111 insertions, 26 deletions
diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py
index d2011338b..1b59206a6 100644
--- a/ishtar_common/forms_common.py
+++ b/ishtar_common/forms_common.py
@@ -37,9 +37,7 @@ from django.contrib.auth.forms import UsernameField, \
AuthenticationForm as AuthAuthenticationForm, \
PasswordChangeForm as AuthPasswordChangeForm, \
SetPasswordForm as AuthSetPasswordForm
-from django.contrib.contenttypes.models import ContentType
from django.core import validators
-from django.core.cache import cache
from django.core.exceptions import ObjectDoesNotExist
from django.core.files import File
from django.core.validators import MaxValueValidator, MinValueValidator
@@ -51,6 +49,7 @@ from django.utils.safestring import mark_safe
from django.utils.translation import ugettext_lazy as _, pgettext
from . import models, models_rest
+from .models_imports import FORMATER_WIDGETS_DCT
from . import widgets
from bootstrap_datepicker.widgets import DatePicker
from ishtar_common.templatetags.link_to_window import simple_link_to_window
@@ -65,8 +64,6 @@ from .forms import (
FieldType,
FormHeader,
FormSetWithDeleteSwitches,
- BSForm,
- get_data_from_formset,
file_size_validator,
HistorySelect,
CustomFormSearch,
@@ -462,7 +459,7 @@ class NewImportGISForm(BaseImportForm):
def save(self, user, commit=True):
self.instance.user = user
- item = super(NewImportGISForm, self).save(commit)
+ item = super().save(commit)
return item
@@ -625,6 +622,60 @@ class TargetKeyForm(forms.ModelForm):
self.instance.save()
+class PreImportForm(IshtarForm):
+ def __init__(self, *args, **kwargs):
+ self.HEADERS = {}
+ self.import_item = kwargs.pop("import_item")
+ super().__init__(*args, **kwargs)
+ readonly = self.import_item.state not in ("C", "AP", "A")
+
+ for column in self.column_query.order_by("col_number"):
+ q = column.targets
+ if not q.count():
+ continue
+ target = q.all()[0]
+ field_name, widget_name = FORMATER_WIDGETS_DCT[target.formater_type.formater_type]
+ attrs = {
+ "label": column.label,
+ "required": column.required,
+ }
+ q = models.ImportColumnValue.objects.filter(column=column,
+ import_item=self.import_item)
+ if q.count():
+ attrs["initial"] = q.all()[0].value
+ if column.description:
+ attrs["help_text"] = column.description
+ if widget_name:
+ attrs["widget"] = getattr(forms, widget_name)
+ key = f"col_{- column.col_number}"
+ self.fields[key] = getattr(forms, field_name)(
+ **attrs
+ )
+ if readonly:
+ self.fields[key].widget.attrs["readonly"] = True
+ if not self.HEADERS:
+ self.HEADERS[key] = FormHeader(self.import_item)
+ if self.import_item.importer_type.pre_import_message:
+ self.HEADERS[key].help_message = self.import_item.importer_type.pre_import_message
+
+ @property
+ def column_query(self):
+ return self.import_item.importer_type.columns.filter(col_number__lte=0)
+
+ def save(self):
+ for column in self.column_query.all():
+ key = f"col_{-column.col_number}"
+ if key not in self.cleaned_data:
+ continue
+ col_value, __ = models.ImportColumnValue.objects.get_or_create(
+ column=column,
+ import_item=self.import_item
+ )
+ col_value.value = self.cleaned_data[key]
+ col_value.save()
+ return self.import_item
+
+
class TargetKeyFormset(BaseModelFormSet):
def __init__(self, *args, **kwargs):
self.user = kwargs.pop("user")
diff --git a/ishtar_common/templates/ishtar/import_table.html b/ishtar_common/templates/ishtar/import_table.html
index f066bef2a..62545f5a3 100644
--- a/ishtar_common/templates/ishtar/import_table.html
+++ b/ishtar_common/templates/ishtar/import_table.html
@@ -82,6 +82,12 @@
{% endif %}
</td>
<td>
+ {% if import.has_pre_import_form %}
+ {% if not import.pre_import_form_is_valid %}
+ <i class="text-danger fa fa-exclamation-triangle" aria-hidden="true"></i>
+ {% endif %}
+ <a href='{% url "import_pre_import_form" import.pk %}'>{% trans "Pre-import values" %}</a><br>
+ {% endif %}
{% if import.need_matching %}
<a href='{% url "import_link_unmatched" import.pk %}'>{% trans "Make match" %}</a>
{% endif %}
diff --git a/ishtar_common/urls.py b/ishtar_common/urls.py
index eb35ea36b..ebcb132b8 100644
--- a/ishtar_common/urls.py
+++ b/ishtar_common/urls.py
@@ -274,6 +274,11 @@ urlpatterns = [
views.ImportStepByStepView.as_view(),
name="import_step_by_step",
),
+ url(
+ r"^import-pre-form/(?P<import_id>[0-9]+)/$",
+ check_rights(["change_import"])(views.ImportPreFormView.as_view()),
+ name="import_pre_import_form",
+ ),
url(r"^profile(?:/(?P<pk>[0-9]+))?/$", views.ProfileEdit.as_view(), name="profile"),
url(
r"^save-search/(?P<app_label>[a-z-]+)/(?P<model>[a-z-]+)/$",
diff --git a/ishtar_common/views.py b/ishtar_common/views.py
index 1ab5931e4..c590532b9 100644
--- a/ishtar_common/views.py
+++ b/ishtar_common/views.py
@@ -1464,17 +1464,18 @@ class GlobalVarEdit(IshtarMixin, AdminLoginRequiredMixin, ModelFormSetView):
"""
-class NewImportView(IshtarMixin, LoginRequiredMixin, CreateView):
+class BaseImportView(IshtarMixin, LoginRequiredMixin):
template_name = "ishtar/form.html"
model = models.Import
form_class = forms.NewImportForm
- page_name = _("Import: create (table)")
def get_success_url(self):
+ if self.object.has_pre_import_form:
+ return reverse("import_pre_import_form", args=[self.object.pk])
return reverse("current_imports")
def get_form_kwargs(self):
- kwargs = super(NewImportView, self).get_form_kwargs()
+ kwargs = super().get_form_kwargs()
kwargs["user"] = self.request.user
return kwargs
@@ -1484,26 +1485,12 @@ class NewImportView(IshtarMixin, LoginRequiredMixin, CreateView):
return HttpResponseRedirect(self.get_success_url())
-class EditImportView(IshtarMixin, LoginRequiredMixin, UpdateView):
- template_name = "ishtar/form.html"
- model = models.Import
- form_class = forms.NewImportForm
- page_name = _("Edit import")
-
- def get_success_url(self):
- return reverse("current_imports")
-
- def get_form_kwargs(self):
- kwargs = super(EditImportView, self).get_form_kwargs()
- kwargs["user"] = self.request.user
-
- return kwargs
+class NewImportView(BaseImportView, CreateView):
+ page_name = _("Import: create (table)")
- def form_valid(self, form):
- user = models.IshtarUser.objects.get(pk=self.request.user.pk)
- self.object = form.save(user=user)
- return HttpResponseRedirect(self.get_success_url())
+class EditImportView(BaseImportView, UpdateView):
+ page_name = _("Import: edit (table)")
class NewImportGISView(NewImportView):
@@ -1520,6 +1507,42 @@ class NewImportGroupView(NewImportView):
page_name = _("Import: create (group)")
+class ImportPreFormView(IshtarMixin, LoginRequiredMixin, FormView):
+ template_name = "ishtar/form.html"
+ form_class = forms.PreImportForm
+ page_name = _("Import: pre-form")
+
+ def get_success_url(self):
+ return reverse("current_imports")
+
+ def dispatch(self, request, *args, **kwargs):
+ self.user = models.IshtarUser.objects.get(pk=self.request.user.pk)
+ try:
+ self.import_item = models.Import.objects.get(pk=self.kwargs["import_id"])
+ except models.Import.DoesNotExist:
+ raise Http404()
+ if not self.import_item.is_available(self.user):
+ raise Http404()
+ if not self.import_item.importer_type.columns.filter(col_number__lte=0).count():
+ # no pre-form fields
+ raise Http404()
+ return super().dispatch(request, *args, **kwargs)
+
+ def get_form_kwargs(self):
+ kwargs = super().get_form_kwargs()
+ kwargs["import_item"] = self.import_item
+ return kwargs
+
+ def get_context_data(self, **kwargs):
+ data = super().get_context_data(**kwargs)
+ data["page_name"] = self.page_name
+ return data
+
+ def form_valid(self, form):
+ self.object = form.save()
+ return HttpResponseRedirect(self.get_success_url())
+
+
class ImportListView(IshtarMixin, LoginRequiredMixin, ListView):
template_name = "ishtar/import_list.html"
model = models.Import