def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) file_importer = FileImporter( importer=self.request.GET["importer"], import_mode=ImportMode.CREATE_UPDATE, file_name=self.request.GET["n"], language=self.request.GET.get("lang"), shop_id=get_shop(self.request), supplier_id=get_supplier(self.request), ) file_importer.prepare() settings_form = ImportSettingsForm( data=self.request.POST if self.request.POST else None) if settings_form.is_bound: settings_form.is_valid() context["data"] = file_importer.data context["importer"] = file_importer.importer context["form"] = settings_form context[ "model_fields"] = file_importer.importer.get_fields_for_mapping() context["visible_rows"] = file_importer.data.rows[1:5] return context
class ImportProcessView(TemplateView): template_name = "shuup/importer/admin/import_process.jinja" importer = None def dispatch(self, request, *args, **kwargs): self.importer_cls = get_importer(request.GET.get("importer")) self.model_str = request.GET.get("importer") self.lang = request.GET.get("lang") self.supplier = get_supplier(request) return super(ImportProcessView, self).dispatch(request, *args, **kwargs) def _transform_request_file(self): try: filename = get_import_file_path(self.request.GET.get("n")) if not os.path.isfile(filename): raise ValueError( _("%s is not a file.") % self.request.GET.get("n")) except: raise Problem(_("File is missing.")) try: mode = "xls" if filename.endswith("xlsx"): mode = "xlsx" if filename.endswith("csv"): mode = "csv" if self.importer_cls.custom_file_transformer: return self.importer_cls.transform_file(mode, filename) return transform_file(mode, filename) except (Exception, RuntimeError) as e: messages.error(self.request, e) def prepare(self): self.data = self._transform_request_file() if self.data is None: return False context = self.importer_cls.get_importer_context( self.request, shop=get_shop(self.request), language=self.lang, ) self.importer = self.importer_cls(self.data, context) self.importer.process_data() if self.request.method == "POST": # check if mapping was done for field in self.importer.unmatched_fields: key = "remap[%s]" % field vals = self.request.POST.getlist(key) if len(vals): self.importer.manually_match(field, vals[0]) self.importer.do_remap() self.settings_form = ImportSettingsForm( data=self.request.POST if self.request.POST else None) if self.settings_form.is_bound: self.settings_form.is_valid() return True def post(self, request, *args, **kwargs): prepared = self.prepare() if not prepared: return redirect(reverse("shuup_admin:importer.import")) try: with atomic(): self.importer.do_import( self.settings_form.cleaned_data["import_mode"]) except Exception: logger.exception("Error! Failed to import data.") messages.error(request, _("Failed to import the file.")) return redirect(reverse("shuup_admin:importer.import")) self.template_name = "shuup/importer/admin/import_process_complete.jinja" return self.render_to_response(self.get_context_data(**kwargs)) def get_context_data(self, **kwargs): context = super(ImportProcessView, self).get_context_data(**kwargs) context["data"] = self.data context["importer"] = self.importer context["form"] = self.settings_form context["model_fields"] = self.importer.get_fields_for_mapping() context["visible_rows"] = self.data.rows[1:5] return context def get(self, request, *args, **kwargs): prepared = self.prepare() if not prepared: return redirect(reverse("shuup_admin:importer.import")) return self.render_to_response(self.get_context_data(**kwargs))
class ImportProcessView(TemplateView): template_name = "shuup/importer/admin/import_process.jinja" importer = None def dispatch(self, request, *args, **kwargs): self.importer_cls = get_importer(request.GET.get("importer")) self.model_str = request.GET.get("importer") self.lang = request.GET.get("lang") return super(ImportProcessView, self).dispatch(request, *args, **kwargs) def _transform_request_file(self): try: filename = get_import_file_path(self.request.GET.get("n")) if not os.path.isfile(filename): raise ValueError(_("%s is not a file") % self.request.GET.get("n")) except: raise Problem(_("File missing.")) try: mode = "xls" if filename.endswith("xlsx"): mode = "xlsx" if filename.endswith("csv"): mode = "csv" return transform_file(mode, filename) except (Exception, RuntimeError) as e: messages.error(self.request, e) def prepare(self): self.data = self._transform_request_file() if self.data is None: return False self.importer = self.importer_cls(self.data, get_shop(self.request), self.lang) self.importer.process_data() if self.request.method == "POST": # check if mapping was done for field in self.importer.unmatched_fields: key = "remap[%s]" % field vals = self.request.POST.getlist(key) if len(vals): self.importer.manually_match(field, vals[0]) self.importer.do_remap() self.settings_form = ImportSettingsForm(data=self.request.POST if self.request.POST else None) if self.settings_form.is_bound: self.settings_form.is_valid() return True def post(self, request, *args, **kwargs): prepared = self.prepare() if not prepared: return redirect(reverse("shuup_admin:importer.import")) try: with atomic(): self.importer.do_import(self.settings_form.cleaned_data["import_mode"]) except Exception: logger.exception("Failed to import data") messages.error(request, _("Failed to import the file.")) return redirect(reverse("shuup_admin:importer.import")) self.template_name = "shuup/importer/admin/import_process_complete.jinja" return self.render_to_response(self.get_context_data(**kwargs)) def get_context_data(self, **kwargs): context = super(ImportProcessView, self).get_context_data(**kwargs) context["data"] = self.data context["importer"] = self.importer context["form"] = self.settings_form context["model_fields"] = self.importer.get_fields_for_mapping() context["visible_rows"] = self.data.rows[1:5] return context def get(self, request, *args, **kwargs): prepared = self.prepare() if not prepared: return redirect(reverse("shuup_admin:importer.import")) return self.render_to_response(self.get_context_data(**kwargs))