diff options
| -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  | 
