summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2019-05-06 18:16:05 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2019-06-17 13:21:28 +0200
commit0e14ea23407a6b99fba0fce091b31567979311f9 (patch)
treec9fb03cb05f7febf5278982a9d19ab19a959f316
parentc2efcd641e59ef43a496eb66871de0595a51ff33 (diff)
downloadIshtar-0e14ea23407a6b99fba0fce091b31567979311f9.tar.bz2
Ishtar-0e14ea23407a6b99fba0fce091b31567979311f9.zip
Generate libreoffice template for importer from admin
-rw-r--r--ishtar_common/admin.py40
-rw-r--r--ishtar_common/models_imports.py53
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)