kitconcept.core 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. kitconcept/__init__.py +4 -0
  2. kitconcept/core/__init__.py +30 -0
  3. kitconcept/core/_types.py +10 -0
  4. kitconcept/core/behaviors/__init__.py +0 -0
  5. kitconcept/core/behaviors/additional_contact_info.py +38 -0
  6. kitconcept/core/behaviors/blocks_settings.py +49 -0
  7. kitconcept/core/behaviors/configure.zcml +43 -0
  8. kitconcept/core/behaviors/person_bio.py +27 -0
  9. kitconcept/core/behaviors/person_image.py +17 -0
  10. kitconcept/core/configure.zcml +39 -0
  11. kitconcept/core/content/__init__.py +0 -0
  12. kitconcept/core/controlpanel/__init__.py +0 -0
  13. kitconcept/core/controlpanel/configure.zcml +17 -0
  14. kitconcept/core/controlpanel/kitconcept.py +61 -0
  15. kitconcept/core/dependencies.zcml +11 -0
  16. kitconcept/core/factory.py +196 -0
  17. kitconcept/core/indexers/__init__.py +0 -0
  18. kitconcept/core/indexers/configure.zcml +7 -0
  19. kitconcept/core/interfaces.py +15 -0
  20. kitconcept/core/locales/__init__.py +0 -0
  21. kitconcept/core/locales/__main__.py +69 -0
  22. kitconcept/core/locales/de/LC_MESSAGES/kitconcept.core.mo +0 -0
  23. kitconcept/core/locales/de/LC_MESSAGES/kitconcept.core.po +132 -0
  24. kitconcept/core/locales/en/LC_MESSAGES/kitconcept.core.mo +0 -0
  25. kitconcept/core/locales/en/LC_MESSAGES/kitconcept.core.po +132 -0
  26. kitconcept/core/locales/kitconcept.core.pot +135 -0
  27. kitconcept/core/permissions.zcml +9 -0
  28. kitconcept/core/profiles/base/actions.xml +516 -0
  29. kitconcept/core/profiles/base/browserlayer.xml +6 -0
  30. kitconcept/core/profiles/base/catalog.xml +236 -0
  31. kitconcept/core/profiles/base/componentregistry.xml +96 -0
  32. kitconcept/core/profiles/base/contenttyperegistry.xml +118 -0
  33. kitconcept/core/profiles/base/controlpanel.xml +355 -0
  34. kitconcept/core/profiles/base/mailhost.xml +8 -0
  35. kitconcept/core/profiles/base/memberdata_properties.xml +50 -0
  36. kitconcept/core/profiles/base/metadata.xml +4 -0
  37. kitconcept/core/profiles/base/properties.xml +5 -0
  38. kitconcept/core/profiles/base/rolemap.xml +382 -0
  39. kitconcept/core/profiles/base/skins.xml +30 -0
  40. kitconcept/core/profiles/base/toolset.xml +79 -0
  41. kitconcept/core/profiles/base/types/Plone_Site.xml +81 -0
  42. kitconcept/core/profiles/base/types/TempFolder.xml +48 -0
  43. kitconcept/core/profiles/base/types.xml +12 -0
  44. kitconcept/core/profiles/base/viewlets.xml +56 -0
  45. kitconcept/core/profiles/base/workflows/one_state_workflow/definition.xml +119 -0
  46. kitconcept/core/profiles/base/workflows/simple_publication_workflow/definition.xml +284 -0
  47. kitconcept/core/profiles/base/workflows.xml +20 -0
  48. kitconcept/core/profiles/cmfdependencies/metadata.xml +17 -0
  49. kitconcept/core/profiles/cmfdependencies/portlets.xml +33 -0
  50. kitconcept/core/profiles/cmfdependencies/registry.xml +125 -0
  51. kitconcept/core/profiles/dependencies/catalog.xml +9 -0
  52. kitconcept/core/profiles/dependencies/controlpanel.xml +19 -0
  53. kitconcept/core/profiles/dependencies/metadata.xml +14 -0
  54. kitconcept/core/profiles/dependencies/registry/kitconcept.core.controlpanel.kitconcept.IKitconceptSettings.xml +8 -0
  55. kitconcept/core/profiles/dependencies/repositorytool.xml +37 -0
  56. kitconcept/core/profiles/dependencies/types/Collection.xml +11 -0
  57. kitconcept/core/profiles/dependencies/types/Document.xml +32 -0
  58. kitconcept/core/profiles/dependencies/types/Event.xml +34 -0
  59. kitconcept/core/profiles/dependencies/types/File.xml +22 -0
  60. kitconcept/core/profiles/dependencies/types/Folder.xml +11 -0
  61. kitconcept/core/profiles/dependencies/types/Image.xml +21 -0
  62. kitconcept/core/profiles/dependencies/types/LRF.xml +25 -0
  63. kitconcept/core/profiles/dependencies/types/Link.xml +24 -0
  64. kitconcept/core/profiles/dependencies/types/News_Item.xml +27 -0
  65. kitconcept/core/profiles/dependencies/types/Person.xml +33 -0
  66. kitconcept/core/profiles/dependencies/types/Plone_Site.xml +24 -0
  67. kitconcept/core/profiles.zcml +42 -0
  68. kitconcept/core/serializers/__init__.py +0 -0
  69. kitconcept/core/serializers/configure.zcml +10 -0
  70. kitconcept/core/serializers/summary.py +19 -0
  71. kitconcept/core/services/__init__.py +0 -0
  72. kitconcept/core/services/configure.zcml +6 -0
  73. kitconcept/core/services/sites/__init__.py +0 -0
  74. kitconcept/core/services/sites/add.py +59 -0
  75. kitconcept/core/services/sites/configure.zcml +26 -0
  76. kitconcept/core/services/sites/overrides.zcml +36 -0
  77. kitconcept/core/services/system/__init__.py +0 -0
  78. kitconcept/core/services/system/configure.zcml +15 -0
  79. kitconcept/core/services/system/get.py +34 -0
  80. kitconcept/core/setuphandlers/__init__.py +0 -0
  81. kitconcept/core/setuphandlers/base.py +69 -0
  82. kitconcept/core/testing/__init__.py +37 -0
  83. kitconcept/core/testing/configure.zcml +16 -0
  84. kitconcept/core/testing/distributions/testing/content/content/__metadata__.json +19 -0
  85. kitconcept/core/testing/distributions/testing/content/content/plone_site_root/data.json +37 -0
  86. kitconcept/core/testing/distributions/testing/image.png +0 -0
  87. kitconcept/core/testing/distributions/testing/profiles.json +6 -0
  88. kitconcept/core/testing/distributions/testing/schema.json +45 -0
  89. kitconcept/core/testing/layers.py +100 -0
  90. kitconcept/core/tools/__init__.py +0 -0
  91. kitconcept/core/tools/migration.py +252 -0
  92. kitconcept/core/upgrades/__init__.py +0 -0
  93. kitconcept/core/upgrades/configure.zcml +12 -0
  94. kitconcept/core/upgrades/utils.py +8 -0
  95. kitconcept/core/upgrades/v20250523001/__init__.py +0 -0
  96. kitconcept/core/upgrades/v20250523001/configure.zcml +22 -0
  97. kitconcept/core/upgrades/v20250612001/__init__.py +0 -0
  98. kitconcept/core/upgrades/v20250612001/configure.zcml +17 -0
  99. kitconcept/core/upgrades/v20250902001/__init__.py +0 -0
  100. kitconcept/core/upgrades/v20250902001/configure.zcml +18 -0
  101. kitconcept/core/upgrades/v20250903001/__init__.py +0 -0
  102. kitconcept/core/upgrades/v20250903001/configure.zcml +18 -0
  103. kitconcept/core/upgrades/v20250915001/__init__.py +0 -0
  104. kitconcept/core/upgrades/v20250915001/configure.zcml +18 -0
  105. kitconcept/core/upgrades/v20250916001/__init__.py +0 -0
  106. kitconcept/core/upgrades/v20250916001/configure.zcml +18 -0
  107. kitconcept/core/upgrades/v20250917001/__init__.py +0 -0
  108. kitconcept/core/upgrades/v20250917001/configure.zcml +18 -0
  109. kitconcept/core/utils/__init__.py +0 -0
  110. kitconcept/core/utils/distributions.py +25 -0
  111. kitconcept/core/utils/gs.py +26 -0
  112. kitconcept/core/utils/packages.py +16 -0
  113. kitconcept/core/utils/scripts.py +121 -0
  114. kitconcept/core/utils/types.py +8 -0
  115. kitconcept/core/vocabularies/__init__.py +0 -0
  116. kitconcept/core/vocabularies/configure.zcml +5 -0
  117. kitconcept_core-1.0.0.dist-info/METADATA +126 -0
  118. kitconcept_core-1.0.0.dist-info/RECORD +122 -0
  119. kitconcept_core-1.0.0.dist-info/WHEEL +4 -0
  120. kitconcept_core-1.0.0.dist-info/entry_points.txt +2 -0
  121. kitconcept_core-1.0.0.dist-info/licenses/LICENSE.GPL +339 -0
  122. kitconcept_core-1.0.0.dist-info/licenses/LICENSE.md +15 -0
kitconcept/__init__.py ADDED
@@ -0,0 +1,4 @@
1
+ from pkgutil import extend_path
2
+
3
+
4
+ __path__ = extend_path(__path__, __name__)
@@ -0,0 +1,30 @@
1
+ """Init and utils."""
2
+
3
+ from zope.i18nmessageid import MessageFactory
4
+
5
+ import logging
6
+
7
+
8
+ __version__ = "1.0.0"
9
+
10
+ PACKAGE_NAME = "kitconcept.core"
11
+ DEFAULT_PROFILE = f"{PACKAGE_NAME}:base"
12
+ CMF_DEPENDENCIES_PROFILE = f"{PACKAGE_NAME}:cmfdependencies"
13
+ DEPENDENCIES_PROFILE = f"{PACKAGE_NAME}:dependencies"
14
+
15
+ _ = MessageFactory(PACKAGE_NAME)
16
+
17
+ logger = logging.getLogger(PACKAGE_NAME)
18
+
19
+
20
+ def initialize(context):
21
+ from kitconcept.core.tools import migration
22
+ from Products.CMFPlone.utils import ToolInit
23
+
24
+ tools = (migration.MigrationTool,)
25
+ # Register tools and content
26
+ ToolInit(
27
+ "Plone Tool",
28
+ tools=tools,
29
+ icon="tool.gif",
30
+ ).initialize(context)
@@ -0,0 +1,10 @@
1
+ from typing import TypedDict
2
+
3
+
4
+ class DistributionInfo(TypedDict):
5
+ """Distribution Information."""
6
+
7
+ name: str
8
+ title: str
9
+ package_name: str
10
+ package_version: str
File without changes
@@ -0,0 +1,38 @@
1
+ from kitconcept.core import _
2
+ from plone.autoform.directives import read_permission
3
+ from plone.autoform.interfaces import IFormFieldProvider
4
+ from plone.supermodel import directives
5
+ from plone.supermodel import model
6
+ from zope import schema
7
+ from zope.interface import provider
8
+
9
+
10
+ PERMISSION = "kitconcept.core.behaviors.additional_contact_info.view"
11
+
12
+
13
+ @provider(IFormFieldProvider)
14
+ class IAdditionalContactInfo(model.Schema):
15
+ read_permission(contact_building=PERMISSION, contact_room=PERMISSION)
16
+
17
+ contact_building = schema.TextLine(
18
+ title=_("label_contact_building", default="Building"),
19
+ required=False,
20
+ )
21
+
22
+ contact_room = schema.TextLine(
23
+ title=_("label_contact_room", default="Room"), required=False
24
+ )
25
+
26
+ address = schema.Text(
27
+ title=_("label_address", default="Address"),
28
+ required=False,
29
+ )
30
+
31
+ directives.fieldset(
32
+ "contact_location",
33
+ label=_(
34
+ "label_contact_location",
35
+ default="Location",
36
+ ),
37
+ fields=("contact_building", "contact_room", "address"),
38
+ )
@@ -0,0 +1,49 @@
1
+ from kitconcept.core import _
2
+ from plone.autoform import directives
3
+ from plone.autoform.interfaces import IFormFieldProvider
4
+ from plone.schema import JSONField
5
+ from plone.supermodel import model
6
+ from zope.interface import provider
7
+
8
+ import json
9
+
10
+
11
+ OBJECT_DEFAULT_VALUE = {}
12
+
13
+ OBJECT = json.dumps({
14
+ "type": "object",
15
+ })
16
+
17
+
18
+ @provider(IFormFieldProvider)
19
+ class ITTWBlocksSettings(model.Schema):
20
+ """Through The Web blocks configuration."""
21
+
22
+ model.fieldset(
23
+ "blocksconfiguration",
24
+ label=_("Blocks configuration"),
25
+ fields=[
26
+ "blocks_config_mutator",
27
+ ],
28
+ )
29
+
30
+ directives.write_permission(
31
+ blocks_config_mutator="kitconcept.intranet.siteadminsonly"
32
+ )
33
+ directives.widget(
34
+ "blocks_config_mutator",
35
+ frontendOptions={
36
+ "widget": "modalJSONEditor",
37
+ },
38
+ )
39
+ blocks_config_mutator = JSONField(
40
+ title=_("Blocks configuration"),
41
+ description=_(
42
+ "help_blocks_config_mutator",
43
+ default="Configure some aspects of the default blocks configuration.",
44
+ ),
45
+ schema=OBJECT,
46
+ default=OBJECT_DEFAULT_VALUE,
47
+ required=False,
48
+ widget="",
49
+ )
@@ -0,0 +1,43 @@
1
+ <configure
2
+ xmlns="http://namespaces.zope.org/zope"
3
+ xmlns:browser="http://namespaces.zope.org/browser"
4
+ xmlns:plone="http://namespaces.plone.org/plone"
5
+ xmlns:zcml="http://namespaces.zope.org/zcml"
6
+ i18n_domain="kitconcept.core"
7
+ >
8
+
9
+ <include
10
+ package="plone.behavior"
11
+ file="meta.zcml"
12
+ />
13
+
14
+ <plone:behavior
15
+ name="kitconcept.blocks.config"
16
+ title="Through The Web blocks configuration"
17
+ description="Allows to set configuration that will be injected into the blocks default configuration."
18
+ provides=".blocks_settings.ITTWBlocksSettings"
19
+ />
20
+
21
+ <!-- Person Behavior -->
22
+ <plone:behavior
23
+ name="kitconcept.core.additional_contact_info"
24
+ title="Person: Additional contact information"
25
+ description="Fields with additional person information"
26
+ provides=".additional_contact_info.IAdditionalContactInfo"
27
+ />
28
+
29
+ <plone:behavior
30
+ name="kitconcept.core.biography"
31
+ title="Person: Biography information"
32
+ description="Add a field for a biography."
33
+ provides=".person_bio.IPersonBiography"
34
+ />
35
+
36
+ <plone:behavior
37
+ name="kitconcept.core.person_image"
38
+ title="Person: Image"
39
+ description="Simple attribute-based image field for persons portraits."
40
+ provides=".person_image.IPersonImage"
41
+ />
42
+
43
+ </configure>
@@ -0,0 +1,27 @@
1
+ from collective.person.behaviors.person import IPersonData
2
+ from kitconcept.core import _
3
+ from plone.app.dexterity.textindexer import searchable
4
+ from plone.app.textfield import RichText as RichTextField
5
+ from plone.autoform import directives as form
6
+ from plone.autoform.interfaces import IFormFieldProvider
7
+ from plone.supermodel import model
8
+ from zope.interface import provider
9
+
10
+
11
+ @provider(IFormFieldProvider)
12
+ class IPersonBiography(model.Schema):
13
+ """A behavior to add a biography field to a person."""
14
+
15
+ # Hide the existing description field
16
+ IPersonData["description"].__dict__["readonly"] = True
17
+
18
+ text = RichTextField(
19
+ title=_("label_person_biography", default="Biography"),
20
+ description=_(
21
+ "help_person_biography", default="A short biography for this person."
22
+ ),
23
+ required=False,
24
+ )
25
+ model.primary("text")
26
+ searchable("text")
27
+ form.order_after(text="last_name")
@@ -0,0 +1,17 @@
1
+ from kitconcept.core import _
2
+ from plone.autoform.interfaces import IFormFieldProvider
3
+ from plone.namedfile import field as namedfile
4
+ from plone.supermodel import model
5
+ from zope.interface import provider
6
+
7
+
8
+ @provider(IFormFieldProvider)
9
+ class IPersonImage(model.Schema):
10
+ image = namedfile.NamedBlobImage(
11
+ title=_("label_person_image", default="Profile Picture/Portrait"),
12
+ description=_(
13
+ "help_person_image",
14
+ default="Use a normal portrait image with your face centered.",
15
+ ),
16
+ required=False,
17
+ )
@@ -0,0 +1,39 @@
1
+ <configure
2
+ xmlns="http://namespaces.zope.org/zope"
3
+ xmlns:five="http://namespaces.zope.org/five"
4
+ xmlns:i18n="http://namespaces.zope.org/i18n"
5
+ i18n_domain="kitconcept.core"
6
+ >
7
+
8
+ <five:registerPackage
9
+ package="."
10
+ initialize=".initialize"
11
+ />
12
+
13
+ <i18n:registerTranslations directory="locales" />
14
+
15
+ <include
16
+ package="Products.CMFCore"
17
+ file="permissions.zcml"
18
+ />
19
+
20
+
21
+ <include file="dependencies.zcml" />
22
+ <include file="profiles.zcml" />
23
+ <include file="permissions.zcml" />
24
+
25
+ <include package=".behaviors" />
26
+ <include package=".controlpanel" />
27
+ <include package=".indexers" />
28
+ <include package=".serializers" />
29
+ <include package=".services" />
30
+ <include package=".vocabularies" />
31
+
32
+ <utility
33
+ factory=".factory.LocalAddonList"
34
+ name="kitconcept.core"
35
+ />
36
+
37
+ <!-- -*- extra stuff goes here -*- -->
38
+
39
+ </configure>
File without changes
File without changes
@@ -0,0 +1,17 @@
1
+ <configure
2
+ xmlns="http://namespaces.zope.org/zope"
3
+ xmlns:browser="http://namespaces.zope.org/browser"
4
+ xmlns:plone="http://namespaces.plone.org/plone"
5
+ i18n_domain="kitconcept.core"
6
+ >
7
+
8
+ <adapter
9
+ factory=".kitconcept.KitconceptControlpanel"
10
+ name="kitconcept-settings"
11
+ />
12
+ <adapter
13
+ factory=".kitconcept.SiteEndpointExpander"
14
+ name="kitconcept.core.settings"
15
+ />
16
+
17
+ </configure>
@@ -0,0 +1,61 @@
1
+ from kitconcept.core import _
2
+ from kitconcept.core.interfaces import IBrowserLayer
3
+ from plone.app.registry.browser.controlpanel import ControlPanelFormWrapper
4
+ from plone.app.registry.browser.controlpanel import RegistryEditForm
5
+ from plone.registry.interfaces import IRegistry
6
+ from plone.restapi.controlpanels import RegistryConfigletPanel
7
+ from plone.restapi.interfaces import ISiteEndpointExpander
8
+ from zope import schema
9
+ from zope.component import adapter
10
+ from zope.component import getUtility
11
+ from zope.interface import implementer
12
+ from zope.interface import Interface
13
+
14
+
15
+ class IKitconceptSettings(Interface):
16
+ """kitconcept core settings stored in the backend"""
17
+
18
+ custom_css = schema.Text(
19
+ title=_("Custom CSS"),
20
+ description=_("Custom CSS for this site."),
21
+ required=False,
22
+ )
23
+
24
+
25
+ class KitconceptSettingsEditForm(RegistryEditForm):
26
+ schema = IKitconceptSettings
27
+ label = _("kitconcept Settings")
28
+ schema_prefix = "kitconcept.core.settings"
29
+
30
+ def updateFields(self):
31
+ super().updateFields()
32
+
33
+ def updateWidgets(self):
34
+ super().updateWidgets()
35
+
36
+
37
+ class KitconceptSettingsControlPanel(ControlPanelFormWrapper):
38
+ form = KitconceptSettingsEditForm
39
+
40
+
41
+ @adapter(Interface, Interface)
42
+ class KitconceptControlpanel(RegistryConfigletPanel):
43
+ schema = IKitconceptSettings
44
+ configlet_id = "kitconceptSettings"
45
+ configlet_category_id = "plone-general"
46
+ schema_prefix = "kitconcept.core.settings"
47
+
48
+
49
+ @adapter(Interface, IBrowserLayer)
50
+ @implementer(ISiteEndpointExpander)
51
+ class SiteEndpointExpander:
52
+ def __init__(self, context, request):
53
+ self.context = context
54
+ self.request = request
55
+
56
+ def __call__(self, data):
57
+ registry = getUtility(IRegistry)
58
+ settings = registry.forInterface(
59
+ IKitconceptSettings, prefix="kitconcept.core.settings"
60
+ )
61
+ data["kitconcept.custom_css"] = settings.custom_css
@@ -0,0 +1,11 @@
1
+ <configure xmlns="http://namespaces.zope.org/zope">
2
+
3
+ <!-- List all packages you depend here -->
4
+ <include package="plone.restapi" />
5
+ <include package="plone.volto" />
6
+ <include package="collective.person" />
7
+ <include package="kitconcept.voltolighttheme" />
8
+ <include package="collective.volto.formsupport" />
9
+ <include package="plonegovbr.socialmedia" />
10
+
11
+ </configure>
@@ -0,0 +1,196 @@
1
+ from kitconcept.core import CMF_DEPENDENCIES_PROFILE
2
+ from kitconcept.core import DEFAULT_PROFILE
3
+ from kitconcept.core import DEPENDENCIES_PROFILE
4
+ from kitconcept.core import PACKAGE_NAME
5
+ from kitconcept.core.interfaces import IAddonList
6
+ from plone.base.interfaces.installable import INonInstallable
7
+ from plone.distribution.api import site as site_api
8
+ from Products.CMFPlone.MigrationTool import Addon
9
+ from Products.CMFPlone.MigrationTool import AddonList
10
+ from zope.component.hooks import setSite
11
+ from zope.interface import implementer
12
+
13
+
14
+ _PLONE_PACKAGES = [
15
+ "CMFDefault",
16
+ "Products.CMFDefault",
17
+ "CMFPlone",
18
+ "Products.CMFPlone",
19
+ "Products.CMFPlone.migrations",
20
+ "CMFTopic",
21
+ "Products.CMFTopic",
22
+ "CMFUid",
23
+ "Products.CMFUid",
24
+ "DCWorkflow",
25
+ "Products.DCWorkflow",
26
+ "PasswordResetTool",
27
+ "Products.PasswordResetTool",
28
+ "PlonePAS",
29
+ "Products.PlonePAS",
30
+ "PloneLanguageTool",
31
+ "Products.PloneLanguageTool",
32
+ "MimetypesRegistry",
33
+ "Products.MimetypesRegistry",
34
+ "PortalTransforms",
35
+ "Products.PortalTransforms",
36
+ "CMFDiffTool",
37
+ "Products.CMFDiffTool",
38
+ "CMFEditions",
39
+ "Products.CMFEditions",
40
+ "Products.NuPlone",
41
+ "borg.localrole",
42
+ "plone.app.dexterity",
43
+ "plone.app.event",
44
+ "plone.app.intid",
45
+ "plone.app.linkintegrity",
46
+ "plone.app.querystring",
47
+ "plone.app.registry",
48
+ "plone.app.referenceablebehavior",
49
+ "plone.app.relationfield",
50
+ "plone.app.theming",
51
+ "plone.app.users",
52
+ "plone.app.z3cform",
53
+ "plone.formwidget.recurrence",
54
+ "plone.keyring",
55
+ "plone.outputfilters",
56
+ "plone.portlet.static",
57
+ "plone.portlet.collection",
58
+ "plone.protect",
59
+ "plone.resource",
60
+ "plonetheme.barceloneta",
61
+ "plone.restapi",
62
+ "plone.volto",
63
+ "kitconcept.voltolighttheme",
64
+ "plonegovbr.socialmedia",
65
+ ]
66
+ _PLONE_PROFILES = [
67
+ "Products.CMFDiffTool:CMFDiffTool",
68
+ "Products.CMFEditions:CMFEditions",
69
+ "Products.CMFPlone:dependencies",
70
+ "Products.CMFPlone:testfixture",
71
+ "Products.NuPlone:uninstall",
72
+ "Products.MimetypesRegistry:MimetypesRegistry",
73
+ "Products.PasswordResetTool:PasswordResetTool",
74
+ "Products.PortalTransforms:PortalTransforms",
75
+ "Products.PloneLanguageTool:PloneLanguageTool",
76
+ "Products.PlonePAS:PlonePAS",
77
+ "borg.localrole:default",
78
+ "plone.browserlayer:default",
79
+ "plone.keyring:default",
80
+ "plone.outputfilters:default",
81
+ "plone.portlet.static:default",
82
+ "plone.portlet.collection:default",
83
+ "plone.protect:default",
84
+ "plone.app.contenttypes:default",
85
+ "plone.app.dexterity:default",
86
+ "plone.app.event:default",
87
+ "plone.app.linkintegrity:default",
88
+ "plone.app.registry:default",
89
+ "plone.app.relationfield:default",
90
+ "plone.app.theming:default",
91
+ "plone.app.users:default",
92
+ "plone.app.versioningbehavior:default",
93
+ "plone.app.z3cform:default",
94
+ "plone.formwidget.recurrence:default",
95
+ "plone.resource:default",
96
+ "plone.restapi:default",
97
+ "plone.volto:default",
98
+ "kitconcept.voltolighttheme:default",
99
+ "kitconcept.voltolighttheme:demo",
100
+ "collective.volto.formsupport:default",
101
+ "plonegovbr.socialmedia:demo",
102
+ ]
103
+
104
+
105
+ @implementer(INonInstallable)
106
+ class HiddenProfiles:
107
+ def getNonInstallableProducts(self):
108
+ return [PACKAGE_NAME, *_PLONE_PACKAGES]
109
+
110
+ def getNonInstallableProfiles(self):
111
+ """Hide uninstall profile from site-creation and quickinstaller."""
112
+ return [
113
+ DEFAULT_PROFILE,
114
+ CMF_DEPENDENCIES_PROFILE,
115
+ DEPENDENCIES_PROFILE,
116
+ *_PLONE_PROFILES,
117
+ ]
118
+
119
+
120
+ @implementer(IAddonList)
121
+ class LocalAddonList:
122
+ addon_list: AddonList = AddonList([
123
+ Addon(profile_id="Products.CMFEditions:CMFEditions"),
124
+ Addon(
125
+ profile_id="Products.CMFPlacefulWorkflow:CMFPlacefulWorkflow",
126
+ check_module="Products.CMFPlacefulWorkflow",
127
+ ),
128
+ Addon(profile_id="Products.PlonePAS:PlonePAS"),
129
+ Addon(profile_id="plone.app.caching:default", check_module="plone.app.caching"),
130
+ Addon(profile_id="plone.app.contenttypes:default"),
131
+ Addon(profile_id="plone.app.dexterity:default"),
132
+ Addon(
133
+ profile_id="plone.app.discussion:default",
134
+ check_module="plone.app.discussion",
135
+ ),
136
+ Addon(profile_id="plone.app.event:default"),
137
+ Addon(profile_id="plone.app.iterate:default", check_module="plone.app.iterate"),
138
+ Addon(
139
+ profile_id="plone.app.multilingual:default",
140
+ check_module="plone.app.multilingual",
141
+ ),
142
+ Addon(profile_id="plone.app.querystring:default"),
143
+ Addon(profile_id="plone.app.theming:default"),
144
+ Addon(profile_id="plone.app.users:default"),
145
+ Addon(profile_id="plone.restapi:default"),
146
+ Addon(profile_id="plone.session:default"),
147
+ Addon(profile_id="plone.staticresources:default"),
148
+ Addon(profile_id="plone.volto:default"),
149
+ Addon(profile_id="plonetheme.barceloneta:default"),
150
+ Addon(profile_id="kitconcept.voltolighttheme:default"),
151
+ Addon(profile_id="collective.person:default"),
152
+ Addon(profile_id="collective.volto.formsupport:default"),
153
+ Addon(profile_id="plonegovbr.socialmedia:default"),
154
+ Addon(profile_id="kitconcept.core:dependencies"),
155
+ ])
156
+
157
+
158
+ def add_site(
159
+ context,
160
+ site_id: str,
161
+ title: str = "kitconcept: Site",
162
+ description: str = "",
163
+ profile_id: str = DEFAULT_PROFILE,
164
+ snapshot: bool = False,
165
+ content_profile_id: str | None = None,
166
+ extension_ids: tuple[str] = (),
167
+ setup_content: bool = False,
168
+ default_language: str = "de",
169
+ portal_timezone: str = "UTC",
170
+ distribution: str = "volto",
171
+ **kwargs,
172
+ ):
173
+ """Add a PloneSite to the context."""
174
+
175
+ # Pass all arguments and keyword arguments in the answers,
176
+ # But the 'distribution_name' is not needed there.
177
+ answers = {
178
+ "site_id": site_id,
179
+ "title": title,
180
+ "description": description,
181
+ "profile_id": profile_id,
182
+ "snapshot": snapshot,
183
+ "content_profile_id": content_profile_id,
184
+ "extension_ids": extension_ids,
185
+ "setup_content": setup_content,
186
+ "default_language": default_language,
187
+ "portal_timezone": portal_timezone,
188
+ }
189
+ answers.update(kwargs)
190
+ site = site_api._create_site(
191
+ context=context,
192
+ distribution_name=distribution,
193
+ answers=answers,
194
+ )
195
+ setSite(site)
196
+ return site
File without changes
@@ -0,0 +1,7 @@
1
+ <configure xmlns="http://namespaces.zope.org/zope">
2
+
3
+ <!-- Indexers/Metadata -->
4
+
5
+ <!-- -*- extra stuff goes here -*- -->
6
+
7
+ </configure>
@@ -0,0 +1,15 @@
1
+ """Module where all interfaces, events and exceptions live."""
2
+
3
+ from Products.CMFPlone.MigrationTool import AddonList
4
+ from zope.interface import Interface
5
+ from zope.publisher.interfaces.browser import IDefaultBrowserLayer
6
+
7
+
8
+ class IBrowserLayer(IDefaultBrowserLayer):
9
+ """Marker interface that defines a browser layer."""
10
+
11
+
12
+ class IAddonList(Interface):
13
+ """List of add ons managed by migration tool."""
14
+
15
+ addon_list: AddonList
File without changes
@@ -0,0 +1,69 @@
1
+ """Update locales."""
2
+
3
+ from pathlib import Path
4
+
5
+ import logging
6
+ import re
7
+ import subprocess
8
+
9
+
10
+ logger = logging.getLogger("i18n")
11
+ logger.setLevel(logging.DEBUG)
12
+
13
+
14
+ PATTERN = r"^[a-z]{2}.*"
15
+
16
+ locale_path = Path(__file__).parent.resolve()
17
+ target_path = locale_path.parent.resolve()
18
+ domains = [path.name[:-4] for path in locale_path.glob("*.pot")]
19
+
20
+ i18ndude = "uvx i18ndude"
21
+
22
+ # ignore node_modules files resulting in errors
23
+ excludes = '"*.html *json-schema*.xml"'
24
+
25
+
26
+ def locale_folder_setup(domain: str):
27
+ languages = [path for path in locale_path.glob("*") if path.is_dir()]
28
+ for lang_folder in languages:
29
+ lc_messages_path = lang_folder / "LC_MESSAGES"
30
+ lang = lang_folder.name
31
+ if lc_messages_path.exists():
32
+ continue
33
+ elif re.match(PATTERN, lang):
34
+ lc_messages_path.mkdir()
35
+ cmd = (
36
+ f"msginit --locale={lang} "
37
+ f"--input={locale_path}/{domain}.pot "
38
+ f"--output={locale_path}/{lang}/LC_MESSAGES/{domain}.po"
39
+ )
40
+ subprocess.call(cmd, shell=True) # noQA: S602
41
+
42
+
43
+ def _rebuild(domain: str):
44
+ cmd = (
45
+ f"{i18ndude} rebuild-pot --pot {locale_path}/{domain}.pot "
46
+ f"--exclude {excludes} "
47
+ f"--create {domain} {target_path}"
48
+ )
49
+ subprocess.call(cmd, shell=True) # noQA: S602
50
+
51
+
52
+ def _sync(domain: str):
53
+ cmd = (
54
+ f"{i18ndude} sync --pot {locale_path}/{domain}.pot "
55
+ f"{locale_path}/*/LC_MESSAGES/{domain}.po"
56
+ )
57
+ subprocess.call(cmd, shell=True) # noQA: S602
58
+
59
+
60
+ def main():
61
+ for domain in domains:
62
+ logger.info(f"Updating translations for {domain}")
63
+ locale_folder_setup(domain)
64
+ _rebuild(domain)
65
+ _sync(domain)
66
+
67
+
68
+ if __name__ == "__main__":
69
+ main()