diff options
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 |
commit | 140e9ae8e3f7035cd3232fcdf4213de272c22e47 (patch) | |
tree | 6b1ec5073e0b7dff35958e0eb5ac4491cce37272 | |
parent | d988bd2b9168d7e47e4046ff1142e5bf5ceac107 (diff) | |
download | Ishtar-140e9ae8e3f7035cd3232fcdf4213de272c22e47.tar.bz2 Ishtar-140e9ae8e3f7035cd3232fcdf4213de272c22e47.zip |
✨ Pre-import form: form and view
-rw-r--r-- | ishtar_common/forms_common.py | 61 | ||||
-rw-r--r-- | ishtar_common/templates/ishtar/import_table.html | 6 | ||||
-rw-r--r-- | ishtar_common/urls.py | 5 | ||||
-rw-r--r-- | ishtar_common/views.py | 65 |
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 |