def post(self, request, *args, **kwargs): """ Perform the actual import action (after the user has confirmed the import) """ confirm_form = self.get_confirm_import_form()(request.POST) if confirm_form.is_valid(): import_formats = self.get_import_formats() input_format = import_formats[int( confirm_form.cleaned_data['input_format'])]() tmp_storage = self.get_tmp_storage_class()( name=confirm_form.cleaned_data['import_file_name']) data = tmp_storage.read(input_format.get_read_mode()) if not input_format.is_binary() and self.from_encoding: data = force_text(data, self.from_encoding) dataset = input_format.create_dataset(data) result = self.process_dataset(dataset, confirm_form, request, *args, **kwargs) tmp_storage.remove() self.generate_log_entries(result, request) self.add_success_message(result, request) post_import.send(sender=None, model=self.model) if self.success_url: url = self.success_url else: url = reverse('{}:{}_index'.format(self.get_model_info()[0], self.get_model_info()[1])) return HttpResponseRedirect(url)
def post(self, request, *args, **kwargs): """ Perform the actual import action (after the user has confirmed he wishes to import) """ resource = self.get_import_resource_class()(**self.get_import_resource_kwargs(request, *args, **kwargs)) confirm_form = ConfirmImportForm(request.POST) if confirm_form.is_valid(): import_formats = self.get_import_formats() input_format = import_formats[ int(confirm_form.cleaned_data['input_format']) ]() tmp_storage = self.get_tmp_storage_class()(name=confirm_form.cleaned_data['import_file_name']) data = tmp_storage.read(input_format.get_read_mode()) if not input_format.is_binary() and self.from_encoding: data = force_text(data, self.from_encoding) dataset = input_format.create_dataset(data) result = resource.import_data(dataset, dry_run=False, raise_errors=True, file_name=confirm_form.cleaned_data['original_file_name'], user=request.user) if not self.get_skip_admin_log(): # Add imported objects to LogEntry logentry_map = { RowResult.IMPORT_TYPE_NEW: ADDITION, RowResult.IMPORT_TYPE_UPDATE: CHANGE, RowResult.IMPORT_TYPE_DELETE: DELETION, } content_type_id = ContentType.objects.get_for_model(self.model).pk for row in result: if row.import_type != row.IMPORT_TYPE_ERROR and row.import_type != row.IMPORT_TYPE_SKIP: LogEntry.objects.log_action( user_id=request.user.pk, content_type_id=content_type_id, object_id=row.object_id, object_repr=row.object_repr, action_flag=logentry_map[row.import_type], change_message="%s through import_export" % row.import_type, ) success_message = str(_(u'Import finished')) + ' , ' + str(_(u'Add')) + ' : %d' % result.totals[ RowResult.IMPORT_TYPE_NEW] + ' , ' + str(_(u'Update')) + ' : %d' % result.totals[ RowResult.IMPORT_TYPE_UPDATE] messages.success(request, success_message) tmp_storage.remove() post_import.send(sender=None, model=self.model) model_info = (self.opts.app_label, self.opts.model_name) url = reverse('xadmin:%s_%s_changelist' % model_info, current_app=self.admin_site.name) return HttpResponseRedirect(url)
def import_action(self, request, *args, **kwargs): """ Perform a dry_run of the import to make sure the import will not result in errors. If there where no error, save the user uploaded file to a local temp file that will be used by 'process_import' for the actual import. """ if not self.has_import_permission(request): raise PermissionDenied context = self.get_import_context_data() import_formats = self.get_import_formats() form_type = self.get_import_form() form_kwargs = self.get_form_kwargs(form_type, *args, **kwargs) form = form_type(import_formats, request.POST or None, request.FILES or None, **form_kwargs) if request.POST and form.is_valid(): input_format = import_formats[ int(form.cleaned_data['input_format']) ]() import_file = form.cleaned_data['import_file'] # first always write the uploaded file to disk as it may be a # memory file or else based on settings upload handlers tmp_storage = self.write_to_tmp_storage(import_file, input_format) # then read the file, using the proper format-specific mode # warning, big files may exceed memory print("IN FORMS") try: data = tmp_storage.read(input_format.get_read_mode()) if not input_format.is_binary() and self.from_encoding: data = force_str(data, self.from_encoding) dataset = input_format.create_dataset(data) except UnicodeDecodeError as e: return HttpResponse(_(u"<h1>Imported file has a wrong encoding: %s</h1>" % e)) except Exception as e: return HttpResponse(_(u"<h1>%s encountered while trying to read file: %s</h1>" % (type(e).__name__, import_file.name))) # prepare kwargs for import data, if needed res_kwargs = self.get_import_resource_kwargs(request, form=form, *args, **kwargs) resource = self.get_import_resource_class()(**res_kwargs) # prepare additional kwargs for import_data, if needed imp_kwargs = self.get_import_data_kwargs(request, form=form, *args, **kwargs) result = resource.import_data(dataset, dry_run=False, raise_errors=True, file_name=import_file.name, user=request.user, **imp_kwargs) if not result.has_errors() and not result.has_validation_errors(): initial = { 'import_file_name': tmp_storage.name, 'original_file_name': import_file.name, 'input_format': form.cleaned_data['input_format'], } confirm_form = self.get_confirm_import_form() initial = self.get_form_kwargs(form=form, **initial) context['confirm_form'] = confirm_form(initial=initial) self.generate_log_entries(result, request) self.add_success_message(result, request) post_import.send(sender=None, model=self.model) url = reverse('admin:%s_%s_changelist' % self.get_model_info(), current_app=self.admin_site.name) return HttpResponseRedirect(url) else: res_kwargs = self.get_import_resource_kwargs(request, form=form, *args, **kwargs) resource = self.get_import_resource_class()(**res_kwargs) context.update(self.admin_site.each_context(request)) print("IN FORMS - 3") context['title'] = _("Import") context['form'] = form context['opts'] = self.model._meta context['fields'] = [f.column_name for f in resource.get_user_visible_fields()] request.current_app = self.admin_site.name return TemplateResponse(request, [self.import_template_name], context)
def process_import(self, request, *args, **kwargs): ''' Perform the actual import action (after the user has confirmed he wishes to import) ''' opts = self.model._meta resource = self.get_import_resource_class()(**self.get_import_resource_kwargs(request, *args, **kwargs)) print(kwargs) id = kwargs["id"] print("aaaaaa") confirm_form = ConfirmImportForm(request.POST) if confirm_form.is_valid(): import_formats = self.get_import_formats() input_format = import_formats[ int(confirm_form.cleaned_data['input_format']) ]() tmp_storage = self.get_tmp_storage_class()(name=confirm_form.cleaned_data['import_file_name']) data = tmp_storage.read(input_format.get_read_mode()) if not input_format.is_binary() and self.from_encoding: data = force_text(data, self.from_encoding) dataset = input_format.create_dataset(data) result = resource.import_data(dataset, dry_run=False, raise_errors=True, file_name=confirm_form.cleaned_data['original_file_name'], user=request.user) if not self.get_skip_admin_log(): # Add imported objects to LogEntry logentry_map = { RowResult.IMPORT_TYPE_NEW: ADDITION, RowResult.IMPORT_TYPE_UPDATE: CHANGE, RowResult.IMPORT_TYPE_DELETE: DELETION, } content_type_id = ContentType.objects.get_for_model(self.model).pk for row in result: if row.import_type != row.IMPORT_TYPE_ERROR and row.import_type != row.IMPORT_TYPE_SKIP: LogEntry.objects.log_action( user_id=request.user.pk, content_type_id=content_type_id, object_id=row.object_id, object_repr=row.object_repr, action_flag=logentry_map[row.import_type], change_message="%s through import_export" % row.import_type, ) success_message = u'Import finished, with {} new {}{} and ' \ u'{} updated {}{}.'.format(result.totals[RowResult.IMPORT_TYPE_NEW], opts.model_name, pluralize(result.totals[RowResult.IMPORT_TYPE_NEW]), result.totals[RowResult.IMPORT_TYPE_UPDATE], opts.model_name, pluralize(result.totals[RowResult.IMPORT_TYPE_UPDATE])) messages.success(request, success_message) tmp_storage.remove() post_import.send(sender=None, model=self.model) url = reverse('admin:%s_%s_change' % ('tpa', 'mychoice'), args=(id), current_app=self.admin_site.name) return HttpResponseRedirect(url)