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 @@ - MailingLoopTemplate diff --git a/src/collective/documentgenerator/search_replace/searchreplace_panel.py b/src/collective/documentgenerator/search_replace/searchreplace_panel.py index f94b1260..029465ea 100644 --- a/src/collective/documentgenerator/search_replace/searchreplace_panel.py +++ b/src/collective/documentgenerator/search_replace/searchreplace_panel.py @@ -3,7 +3,7 @@ from collective.documentgenerator import _ from collective.documentgenerator.content.vocabulary import AllPODTemplateWithFileVocabularyFactory from collective.documentgenerator.search_replace.pod_template import SearchAndReplacePODTemplates -from imio.helpers.content import HAS_PLONE5 +from imio.helpers.content import HAS_PLONE_5_AND_MORE from plone.app.registry.browser.controlpanel import ControlPanelFormWrapper from plone.app.uuid.utils import uuidToObject from plone.autoform import directives @@ -24,7 +24,8 @@ import re -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/setuphandlers.py b/src/collective/documentgenerator/setuphandlers.py index d524bcdb..298d8cc4 100644 --- a/src/collective/documentgenerator/setuphandlers.py +++ b/src/collective/documentgenerator/setuphandlers.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- -from collective.documentgenerator.config import set_use_stream, DEFAULT_OO_PORT +from collective.documentgenerator.config import DEFAULT_OO_PORT +from collective.documentgenerator.config import set_use_stream from collective.documentgenerator.content.pod_template import POD_TEMPLATE_TYPES from collective.documentgenerator.utils import translate as _ from plone import api diff --git a/src/collective/documentgenerator/testing.py b/src/collective/documentgenerator/testing.py index 8eda106f..a922d7c0 100644 --- a/src/collective/documentgenerator/testing.py +++ b/src/collective/documentgenerator/testing.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- """Base module for unittesting.""" -from collective.documentgenerator.config import HAS_PLONE_5 -from collective.documentgenerator.config import HAS_PLONE_5_2 +from imio.helpers import HAS_PLONE_5 +from imio.helpers import HAS_PLONE_5_2 from imio.pyutils.system import runCommand from plone import api from plone.app.robotframework.testing import REMOTE_LIBRARY_BUNDLE_FIXTURE diff --git a/src/collective/documentgenerator/tests/test_AT_helper_view.py b/src/collective/documentgenerator/tests/test_AT_helper_view.py index 89e3ab8d..b003483a 100644 --- a/src/collective/documentgenerator/tests/test_AT_helper_view.py +++ b/src/collective/documentgenerator/tests/test_AT_helper_view.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- -from collective.documentgenerator.config import HAS_PLONE_5 from collective.documentgenerator.testing import ArchetypesIntegrationTests from Products.CMFPlone.utils import safe_unicode from DateTime import DateTime +from imio.helpers import HAS_PLONE_5 from plone import api from plone.app.testing import login from plone.app.testing import logout diff --git a/src/collective/documentgenerator/tests/test_DX_helper_view.py b/src/collective/documentgenerator/tests/test_DX_helper_view.py index b95756b1..89d8e9aa 100644 --- a/src/collective/documentgenerator/tests/test_DX_helper_view.py +++ b/src/collective/documentgenerator/tests/test_DX_helper_view.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- -from collective.documentgenerator.config import HAS_PLONE_4 -from collective.documentgenerator.config import HAS_PLONE_5_1 from collective.documentgenerator.testing import DexterityIntegrationTests +from imio.helpers import HAS_PLONE_4 +from imio.helpers import HAS_PLONE_5_1 from plone import api from plone.app.testing import login from plone.app.testing import logout diff --git a/src/collective/documentgenerator/tests/test_base_helper_view.py b/src/collective/documentgenerator/tests/test_base_helper_view.py index 7517976d..0accb212 100644 --- a/src/collective/documentgenerator/tests/test_base_helper_view.py +++ b/src/collective/documentgenerator/tests/test_base_helper_view.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- -from collective.documentgenerator.config import HAS_PLONE_5 from collective.documentgenerator.demo.helper import ATDemoHelperView from collective.documentgenerator.demo.helper import BaseDemoHelperView from collective.documentgenerator.demo.helper import DXDemoHelperView from collective.documentgenerator.testing import DexterityIntegrationTests +from imio.helpers import HAS_PLONE_5 from plone import api from six import StringIO diff --git a/src/collective/documentgenerator/tests/test_generation_view.py b/src/collective/documentgenerator/tests/test_generation_view.py index f21f10a3..7ab24f08 100644 --- a/src/collective/documentgenerator/tests/test_generation_view.py +++ b/src/collective/documentgenerator/tests/test_generation_view.py @@ -138,10 +138,8 @@ def test_document_generation_call(self): # right, ask available format self.assertIn('odt', pod_template.get_available_formats()) generated_doc = view(template_uid, 'odt') - if six.PY2: - self.assertIn('application/vnd.oasis.opendocument.text', generated_doc) - else: - self.assertIn(b'application/vnd.oasis.opendocument.text', generated_doc) + + self.assertIn('application/vnd.oasis.opendocument.text', generated_doc) def test_unauthorized_generation(self): """ @@ -191,10 +189,7 @@ def test_persistent_document_generation_call(self): generated_doc = persistent_doc.getFile() filename = generated_doc.getFilename() content_type = generated_doc.getContentType() - if six.PY2: - self.assertIn('application/vnd.oasis.opendocument.text', generated_doc.data) - else: - self.assertIn(b'application/vnd.oasis.opendocument.text', generated_doc.data) + self.assertIn('application/vnd.oasis.opendocument.text', generated_doc.data) self.assertEqual( filename, @@ -269,10 +264,7 @@ def test__get_generation_context(self): def test_raiseOnError_for_non_managers(self): # create a POD template that will fail in every case current_path = os.path.dirname(__file__) - if six.PY2: - failing_template_data = open(os.path.join(current_path, 'failing_template.odt'), 'r').read() - else: - failing_template_data = open(os.path.join(current_path, 'failing_template.odt'), 'rb').read() + failing_template_data = open(os.path.join(current_path, 'failing_template.odt'), 'r').read() failing_template = api.content.create( type='ConfigurablePODTemplate', id='failing_template', @@ -290,7 +282,7 @@ def test_raiseOnError_for_non_managers(self): api.user.create( email='test@test.be', username='user', - password='secret12345', + password='12345', roles=['Member'], properties={}) diff --git a/src/collective/documentgenerator/tests/test_utils.py b/src/collective/documentgenerator/tests/test_utils.py index 70ab57d7..261d4c10 100644 --- a/src/collective/documentgenerator/tests/test_utils.py +++ b/src/collective/documentgenerator/tests/test_utils.py @@ -1,9 +1,12 @@ # -*- coding: utf-8 -*- -import copy -import os -from os import getenv, rmdir - +from collective.documentgenerator.testing import PODTemplateIntegrationTest +from collective.documentgenerator.utils import compute_md5 +from collective.documentgenerator.utils import temporary_file_name +from collective.documentgenerator.utils import update_dict_with_validation from collective.documentgenerator.utils import update_oo_config +from collective.documentgenerator.utils import update_templates +from os import getenv +from os import rmdir from plone.api.portal import get_registry_record from zope.interface import Interface from zope.interface import Invalid @@ -11,11 +14,8 @@ from zope.lifecycleevent import modified import collective.documentgenerator as cdg -from collective.documentgenerator.testing import PODTemplateIntegrationTest -from collective.documentgenerator.utils import (compute_md5, - temporary_file_name, - update_dict_with_validation, - update_templates) +import copy +import os import six diff --git a/test-4.3.cfg b/test-4.3.cfg index e248040f..5ca71f97 100644 --- a/test-4.3.cfg +++ b/test-4.3.cfg @@ -42,4 +42,5 @@ zipp = 1.0.0 pathlib2 = 2.3.5 more-itertools = 5.0.0 scandir = 1.10.0 -six = \ No newline at end of file +six = +imio.pyutils = 1.0.0a1