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)  | 
