diff --git a/CHANGES.rst b/CHANGES.rst
index ec2f95fd..7f8d62d0 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -1,12 +1,36 @@
Changelog
=========
-3.41 (unreleased)
+3.44 (unreleased)
-----------------
- Nothing changed yet.
+3.43 (2024-04-10)
+-----------------
+
+- Import `safe_encode` from `imio.pyutils` instead `imio.helpers`.
+ [gbastien]
+- Use has Plone versions constants (`HAS_PLONE_4`, `HAS_PLONE_5`, ...)
+ from `imio.helpers`.
+ [gbastien]
+
+3.42 (2024-02-12)
+-----------------
+
+- Translated again type icon title.
+ [gbastien]
+
+3.41 (2024-02-12)
+-----------------
+
+- Corrected typo.
+ [sgeulette]
+- In `TitleColumn`, use `typeInfo.Title()` instead translating `typeInfo.title`,
+ `Title()` do the same but manages special characters in the `title`.
+ [gbastien]
+
3.40 (2023-08-01)
-----------------
@@ -14,7 +38,6 @@ Changelog
collective.fingerpointing.
[mpeeters]
-
3.39 (2023-06-26)
-----------------
diff --git a/bootstrap.py b/bootstrap.py
deleted file mode 100644
index a6295667..00000000
--- a/bootstrap.py
+++ /dev/null
@@ -1,189 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2006 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Bootstrap a buildout-based project
-
-Simply run this script in a directory containing a buildout.cfg.
-The script accepts buildout command-line options, so you can
-use the -c option to specify an alternate configuration file.
-"""
-
-import os
-import shutil
-import sys
-import tempfile
-
-from optparse import OptionParser
-
-tmpeggs = tempfile.mkdtemp()
-
-usage = '''\
-[DESIRED PYTHON FOR BUILDOUT] bootstrap.py [options]
-
-Bootstraps a buildout-based project.
-
-Simply run this script in a directory containing a buildout.cfg, using the
-Python that you want bin/buildout to use.
-
-Note that by using --find-links to point to local resources, you can keep
-this script from going over the network.
-'''
-
-parser = OptionParser(usage=usage)
-parser.add_option("-v", "--version", help="use a specific zc.buildout version")
-
-parser.add_option("-t", "--accept-buildout-test-releases",
- dest='accept_buildout_test_releases',
- action="store_true", default=False,
- help=("Normally, if you do not specify a --version, the "
- "bootstrap script and buildout gets the newest "
- "*final* versions of zc.buildout and its recipes and "
- "extensions for you. If you use this flag, "
- "bootstrap and buildout will get the newest releases "
- "even if they are alphas or betas."))
-parser.add_option("-c", "--config-file",
- help=("Specify the path to the buildout configuration "
- "file to be used."))
-parser.add_option("-f", "--find-links",
- help=("Specify a URL to search for buildout releases"))
-parser.add_option("--allow-site-packages",
- action="store_true", default=False,
- help=("Let bootstrap.py use existing site packages"))
-parser.add_option("--setuptools-version",
- help="use a specific setuptools version")
-
-
-options, args = parser.parse_args()
-
-######################################################################
-# load/install setuptools
-
-try:
- if options.allow_site_packages:
- import setuptools
- import pkg_resources
- from urllib.request import urlopen
-except ImportError:
- from urllib2 import urlopen
-
-ez = {}
-exec(urlopen('https://bootstrap.pypa.io/ez_setup.py').read(), ez)
-
-if not options.allow_site_packages:
- # ez_setup imports site, which adds site packages
- # this will remove them from the path to ensure that incompatible versions
- # of setuptools are not in the path
- import site
- # inside a virtualenv, there is no 'getsitepackages'.
- # We can't remove these reliably
- if hasattr(site, 'getsitepackages'):
- for sitepackage_path in site.getsitepackages():
- sys.path[:] = [x for x in sys.path if sitepackage_path not in x]
-
-setup_args = dict(to_dir=tmpeggs, download_delay=0)
-
-if options.setuptools_version is not None:
- setup_args['version'] = options.setuptools_version
-
-ez['use_setuptools'](**setup_args)
-import setuptools
-import pkg_resources
-
-# This does not (always?) update the default working set. We will
-# do it.
-for path in sys.path:
- if path not in pkg_resources.working_set.entries:
- pkg_resources.working_set.add_entry(path)
-
-######################################################################
-# Install buildout
-
-ws = pkg_resources.working_set
-
-cmd = [sys.executable, '-c',
- 'from setuptools.command.easy_install import main; main()',
- '-mZqNxd', tmpeggs]
-
-find_links = os.environ.get(
- 'bootstrap-testing-find-links',
- options.find_links or
- ('http://downloads.buildout.org/'
- if options.accept_buildout_test_releases else None)
- )
-if find_links:
- cmd.extend(['-f', find_links])
-
-setuptools_path = ws.find(
- pkg_resources.Requirement.parse('setuptools')).location
-
-requirement = 'zc.buildout'
-version = options.version
-if version is None and not options.accept_buildout_test_releases:
- # Figure out the most recent final version of zc.buildout.
- import setuptools.package_index
- _final_parts = '*final-', '*final'
-
- def _final_version(parsed_version):
- try:
- return not parsed_version.is_prerelease
- except AttributeError:
- # Older setuptools
- for part in parsed_version:
- if (part[:1] == '*') and (part not in _final_parts):
- return False
- return True
-
- index = setuptools.package_index.PackageIndex(
- search_path=[setuptools_path])
- if find_links:
- index.add_find_links((find_links,))
- req = pkg_resources.Requirement.parse(requirement)
- if index.obtain(req) is not None:
- best = []
- bestv = None
- for dist in index[req.project_name]:
- distv = dist.parsed_version
- if _final_version(distv):
- if bestv is None or distv > bestv:
- best = [dist]
- bestv = distv
- elif distv == bestv:
- best.append(dist)
- if best:
- best.sort()
- version = best[-1].version
-if version:
- requirement = '=='.join((requirement, version))
-cmd.append(requirement)
-
-import subprocess
-if subprocess.call(cmd, env=dict(os.environ, PYTHONPATH=setuptools_path)) != 0:
- raise Exception(
- "Failed to execute command:\n%s" % repr(cmd)[1:-1])
-
-######################################################################
-# Import and run buildout
-
-ws.add_entry(tmpeggs)
-ws.require(requirement)
-import zc.buildout.buildout
-
-if not [a for a in args if '=' not in a]:
- args.append('bootstrap')
-
-# if -c was provided, we push it back into args for buildout' main function
-if options.config_file is not None:
- args[0:0] = ['-c', options.config_file]
-
-zc.buildout.buildout.main(args)
-shutil.rmtree(tmpeggs)
diff --git a/buildout.d/plone-4.3.x.cfg b/buildout.d/plone-4.3.x.cfg
new file mode 100644
index 00000000..fa7b54fa
--- /dev/null
+++ b/buildout.d/plone-4.3.x.cfg
@@ -0,0 +1,12 @@
+
+[buildout]
+extends =
+ https://raw.github.com/collective/buildout.plonetest/master/test-4.3.x.cfg
+ development.cfg
+
+[versions]
+beautifulsoup4 = 4.9.3
+soupsieve = 1.9.2
+backports.functools-lru-cache = 1.5
+zc.lockfile = 2.0
+zope.configuration = 3.8.1
\ No newline at end of file
diff --git a/development.cfg b/development.cfg
index 5274abd2..fd76bbae 100644
--- a/development.cfg
+++ b/development.cfg
@@ -26,6 +26,7 @@ auto-checkout +=
collective.behavior.talcondition
collective.big.bang
imio.helpers
+ imio.pyutils
[instance]
eggs +=
@@ -54,6 +55,7 @@ collective.big.bang = git ${remotes:collective}/collective.big.bang.git pushurl=
collective.behavior.talcondition = git ${remotes:collective}/collective.behavior.talcondition.git pushurl=${remotes:collective_push}/collective.behavior.talcondition.git
collective.excelexport = git ${remotes:collective}/collective.excelexport.git pushurl=${remotes:collective_push}/collective.excelexport.git
imio.helpers = git ${remotes:imio}/imio.helpers.git pushurl=${remotes:imio_push}/imio.helpers.git
+imio.pyutils = git ${remotes:imio}/imio.pyutils.git pushurl=${remotes:imio_push}/imio.pyutils.git
appy = git ${remotes:imio}/appy.git pushurl=${remotes:imio_push}/appy.git
[omelette]
diff --git a/setup.py b/setup.py
index 24a7d91b..c62dd03f 100644
--- a/setup.py
+++ b/setup.py
@@ -11,7 +11,7 @@
setup(
name='collective.documentgenerator',
- version='3.41.dev0',
+ version='3.44.dev0',
description="Desktop document generation (.odt, .pdf, .doc, ...) based on appy framework (https://appyframe.work/tool/public) and OpenOffice/LibreOffice",
long_description=long_description,
# Get more from https://pypi.org/pypi?%3Aaction=list_classifiers
diff --git a/src/collective/documentgenerator/browser/generation_view.py b/src/collective/documentgenerator/browser/generation_view.py
index 84a2f713..d910905e 100644
--- a/src/collective/documentgenerator/browser/generation_view.py
+++ b/src/collective/documentgenerator/browser/generation_view.py
@@ -3,12 +3,20 @@
import mimetypes
import os
import unicodedata
-
import pkg_resources
import six
from AccessControl import Unauthorized
from appy.pod.renderer import CsvOptions, Renderer
from appy.pod.styles_manager import TableProperties
+from collective.documentgenerator import config
+from collective.documentgenerator import utils
+from collective.documentgenerator.content.pod_template import IPODTemplate
+from collective.documentgenerator.interfaces import CyclicMergeTemplatesException
+from collective.documentgenerator.interfaces import IDocumentFactory
+from collective.documentgenerator.interfaces import PODTemplateNotFoundError
+from collective.documentgenerator.utils import remove_tmp_file
+from collective.documentgenerator.utils import temporary_file_name
+from imio.helpers import HAS_PLONE_5_AND_MORE
from plone import api
from plone.app.uuid.utils import uuidToObject
from plone.i18n.normalizer.interfaces import IFileNameNormalizer
@@ -17,13 +25,6 @@
from six import StringIO
from zope.annotation.interfaces import IAnnotations
from zope.component import getMultiAdapter, queryAdapter, queryUtility
-
-from collective.documentgenerator import config, utils
-from collective.documentgenerator.content.pod_template import IPODTemplate
-from collective.documentgenerator.interfaces import (
- CyclicMergeTemplatesException, IDocumentFactory, PODTemplateNotFoundError)
-from collective.documentgenerator.utils import remove_tmp_file
-from collective.documentgenerator.utils import temporary_file_name
import io
from .. import _
diff --git a/src/collective/documentgenerator/browser/table.py b/src/collective/documentgenerator/browser/table.py
index c9e9c4f9..f31455cf 100644
--- a/src/collective/documentgenerator/browser/table.py
+++ b/src/collective/documentgenerator/browser/table.py
@@ -89,9 +89,8 @@ def _icons(self, item):
# we assume that stored icon_expr is like string:${portal_url}/myContentIcon.svg
# or like string:${portal_url}/++resource++imio.dashboard/dashboardpodtemplate.svg
contentIcon = '/'.join(typeInfo.icon_expr.split('/')[1:])
- title = translate(typeInfo.title, domain=typeInfo.i18n_domain, context=self.request)
icon_link = u'' % \
- (safe_unicode(escape(title)), purl, contentIcon)
+ (safe_unicode(escape(translate(typeInfo.Title(), context=self.request))), purl, contentIcon)
self.i_cache[item.portal_type] = icon_link
return self.i_cache[item.portal_type]
diff --git a/src/collective/documentgenerator/config.py b/src/collective/documentgenerator/config.py
index c4e4ad4c..72cfd30e 100644
--- a/src/collective/documentgenerator/config.py
+++ b/src/collective/documentgenerator/config.py
@@ -31,11 +31,12 @@
HAS_PLONE_6 = api.env.plone_version() > '6'
DEFAULT_OO_SERVER = u'localhost'
-DEFAULT_OO_PORT = "2002"
+DEFAULT_OO_PORT = 2002
DEFAULT_PYTHON_UNO = u'/usr/bin/python3'
DEFAULT_COLUMN_MODIFIER = u'nothing'
-DEFAULT_CSV_FIELD_DELIMITERS = {u'Comma': u',', u'Semicolon': u';', u'Colon': u':', u'Space': u' ', u'Tabulation': u'\t'}
+DEFAULT_CSV_FIELD_DELIMITERS = {
+ u'Comma': u',', u'Semicolon': u';', u'Colon': u':', u'Space': u' ', u'Tabulation': u'\t'}
DEFAULT_CSV_STRING_DELIMITERS = {u"Double Quote": u'"', u"Single Quote": u"'"}
@@ -115,7 +116,7 @@ def set_oo_server():
def set_oo_port():
""" Get environment value in buildout to define port """
- oo_port = safe_unicode(os.getenv('OO_PORT', DEFAULT_OO_PORT))
+ oo_port = unicode(os.getenv('OO_PORT', DEFAULT_OO_PORT))
if oo_port:
api.portal.set_registry_record('collective.documentgenerator.browser.controlpanel.'
'IDocumentGeneratorControlPanelSchema.oo_port_list', oo_port)
diff --git a/src/collective/documentgenerator/content/pod_template.py b/src/collective/documentgenerator/content/pod_template.py
index 1d57b08e..18c06871 100644
--- a/src/collective/documentgenerator/content/pod_template.py
+++ b/src/collective/documentgenerator/content/pod_template.py
@@ -12,7 +12,7 @@
from imio.helpers.content import add_to_annotation
from imio.helpers.content import del_from_annotation
from imio.helpers.content import get_from_annotation
-from imio.helpers.content import HAS_PLONE5
+from imio.helpers.content import HAS_PLONE_5_AND_MORE
from plone import api
from plone.autoform import directives as form
from plone.autoform.interfaces import IFormFieldProvider
@@ -40,7 +40,8 @@
import logging
import six
-if HAS_PLONE5:
+
+if HAS_PLONE_5_AND_MORE:
from collective.z3cform.datagridfield.datagridfield import DataGridFieldFactory
from collective.z3cform.datagridfield.row import DictRow
else:
diff --git a/src/collective/documentgenerator/demo/helper.py b/src/collective/documentgenerator/demo/helper.py
index cf4d5d46..3c2d8f74 100644
--- a/src/collective/documentgenerator/demo/helper.py
+++ b/src/collective/documentgenerator/demo/helper.py
@@ -1,13 +1,13 @@
# -*- coding: utf-8 -*-
-from collective.documentgenerator.config import HAS_PLONE_5
-from collective.documentgenerator.config import HAS_PLONE_5_2
from collective.documentgenerator.helper import ATDocumentGenerationHelperView
from collective.documentgenerator.helper import DocumentGenerationHelperView
from collective.documentgenerator.helper import DXDocumentGenerationHelperView
from collective.documentgenerator.utils import translate as _
from DateTime import DateTime
-from imio.helpers.content import safe_encode
+from imio.helpers import HAS_PLONE_5
+from imio.helpers import HAS_PLONE_5_2
+from imio.pyutils.utils import safe_encode
from plone import api
from plone.app.textfield import RichText
from plone.dexterity.events import EditCancelledEvent
diff --git a/src/collective/documentgenerator/profiles/base/types/MailingLoopTemplate.xml b/src/collective/documentgenerator/profiles/base/types/MailingLoopTemplate.xml
index d6c906f4..6798f686 100644
--- a/src/collective/documentgenerator/profiles/base/types/MailingLoopTemplate.xml
+++ b/src/collective/documentgenerator/profiles/base/types/MailingLoopTemplate.xml
@@ -1,5 +1,5 @@
-