diff options
-rw-r--r-- | ishtar_common/admin.py | 40 | ||||
-rw-r--r-- | ishtar_common/models_imports.py | 53 |
2 files changed, 92 insertions, 1 deletions
diff --git a/ishtar_common/admin.py b/ishtar_common/admin.py index 23167180a..75d223005 100644 --- a/ishtar_common/admin.py +++ b/ishtar_common/admin.py @@ -938,9 +938,47 @@ def duplicate_importertype(modeladmin, request, queryset): duplicate_importertype.short_description = _(u"Duplicate") +def generate_libreoffice_template(modeladmin, request, queryset): + if queryset.count() != 1: + messages.add_message( + request, messages.ERROR, + str(_("Select only one importer.")) + ) + url = reverse( + 'admin:%s_%s_changelist' % ( + modeladmin.model._meta.app_label, + modeladmin.model._meta.model_name) + ) + '?' + urllib.parse.urlencode(request.GET) + return HttpResponseRedirect(url) + + importer_type = queryset.all()[0] + dest_filename = importer_type.get_libreoffice_template() + in_memory = BytesIO() + with open(dest_filename, 'rb') as fle: + in_memory.write(fle.read()) + filename = dest_filename.split(os.sep)[-1] + + response = HttpResponse( + content_type='application/vnd.oasis.opendocument.spreadsheet') + response['Content-Disposition'] = 'attachment; filename=%s' % \ + filename.replace(' ', '_') + in_memory.seek(0) + response.write(in_memory.read()) + return response + + +generate_libreoffice_template.short_description = \ + _("Export as libreoffice template") + + +importer_type_actions = [duplicate_importertype] +if settings.USE_LIBREOFFICE: + importer_type_actions.append(generate_libreoffice_template) + + class ImporterTypeAdmin(admin.ModelAdmin): list_display = ('name', 'associated_models', 'available') - actions = [duplicate_importertype] + actions = importer_type_actions admin_site.register(models.ImporterType, ImporterTypeAdmin) diff --git a/ishtar_common/models_imports.py b/ishtar_common/models_imports.py index 23057e6f5..74a7653f1 100644 --- a/ishtar_common/models_imports.py +++ b/ishtar_common/models_imports.py @@ -125,6 +125,59 @@ class ImporterType(models.Model): def __str__(self): return self.name + def get_libreoffice_template(self): + if not settings.USE_LIBREOFFICE: + return + from ishtar_common.libreoffice import UnoCalc + ROW_NUMBER = 500 + uno = UnoCalc() + calc = uno.create_calc() + + main_sheet = uno.get_sheet(calc, 0, self.name) + lst_sheet = uno.get_sheet(calc, 1, str(_("List types"))) + + if not calc: + return + col_number = 1 # user number so we start with 1 + lst_col_number = 0 + for column in self.columns.order_by('col_number').all(): + while column.col_number > col_number: + col_number += 1 + # header + cell = main_sheet.getCellByPosition(col_number - 1, 0) + cell.CharWeight = 150 + cell.setString(column.label) + + # only managing the first target... + ft = None + for target in column.targets.all(): + ft = target.formater_type + if ft: + break + if not ft: + continue + # first we only manage TypeFormater + if ft.formater_type != 'TypeFormater': + continue + if not ft.options: # bad configuration + continue + model = import_class(ft.options) + if not model: + continue + lst = [] + for typ in model.get_types(instances=True): + lst.append(str(typ)) + end_row = uno.create_list(lst_sheet, lst_col_number, 0, + str(model._meta.verbose_name), lst) + uno.set_cell_validation_list( + main_sheet, col_number, 1, ROW_NUMBER + 1, + lst_sheet, lst_col_number, [1, end_row]) + lst_col_number += 1 + tmpdir = tempfile.mkdtemp(prefix="ishtar-templates-") + dest_filename = "{}{}{}.ods".format(tmpdir, os.sep, self.name) + uno.save_calc(calc, dest_filename) + return dest_filename + def get_importer_class(self, import_instance=None): OBJECT_CLS = import_class(self.associated_models.klass) DEFAULTS = dict([(default.keys, default.values) |