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.
- kitconcept/__init__.py +4 -0
- kitconcept/core/__init__.py +30 -0
- kitconcept/core/_types.py +10 -0
- kitconcept/core/behaviors/__init__.py +0 -0
- kitconcept/core/behaviors/additional_contact_info.py +38 -0
- kitconcept/core/behaviors/blocks_settings.py +49 -0
- kitconcept/core/behaviors/configure.zcml +43 -0
- kitconcept/core/behaviors/person_bio.py +27 -0
- kitconcept/core/behaviors/person_image.py +17 -0
- kitconcept/core/configure.zcml +39 -0
- kitconcept/core/content/__init__.py +0 -0
- kitconcept/core/controlpanel/__init__.py +0 -0
- kitconcept/core/controlpanel/configure.zcml +17 -0
- kitconcept/core/controlpanel/kitconcept.py +61 -0
- kitconcept/core/dependencies.zcml +11 -0
- kitconcept/core/factory.py +196 -0
- kitconcept/core/indexers/__init__.py +0 -0
- kitconcept/core/indexers/configure.zcml +7 -0
- kitconcept/core/interfaces.py +15 -0
- kitconcept/core/locales/__init__.py +0 -0
- kitconcept/core/locales/__main__.py +69 -0
- kitconcept/core/locales/de/LC_MESSAGES/kitconcept.core.mo +0 -0
- kitconcept/core/locales/de/LC_MESSAGES/kitconcept.core.po +132 -0
- kitconcept/core/locales/en/LC_MESSAGES/kitconcept.core.mo +0 -0
- kitconcept/core/locales/en/LC_MESSAGES/kitconcept.core.po +132 -0
- kitconcept/core/locales/kitconcept.core.pot +135 -0
- kitconcept/core/permissions.zcml +9 -0
- kitconcept/core/profiles/base/actions.xml +516 -0
- kitconcept/core/profiles/base/browserlayer.xml +6 -0
- kitconcept/core/profiles/base/catalog.xml +236 -0
- kitconcept/core/profiles/base/componentregistry.xml +96 -0
- kitconcept/core/profiles/base/contenttyperegistry.xml +118 -0
- kitconcept/core/profiles/base/controlpanel.xml +355 -0
- kitconcept/core/profiles/base/mailhost.xml +8 -0
- kitconcept/core/profiles/base/memberdata_properties.xml +50 -0
- kitconcept/core/profiles/base/metadata.xml +4 -0
- kitconcept/core/profiles/base/properties.xml +5 -0
- kitconcept/core/profiles/base/rolemap.xml +382 -0
- kitconcept/core/profiles/base/skins.xml +30 -0
- kitconcept/core/profiles/base/toolset.xml +79 -0
- kitconcept/core/profiles/base/types/Plone_Site.xml +81 -0
- kitconcept/core/profiles/base/types/TempFolder.xml +48 -0
- kitconcept/core/profiles/base/types.xml +12 -0
- kitconcept/core/profiles/base/viewlets.xml +56 -0
- kitconcept/core/profiles/base/workflows/one_state_workflow/definition.xml +119 -0
- kitconcept/core/profiles/base/workflows/simple_publication_workflow/definition.xml +284 -0
- kitconcept/core/profiles/base/workflows.xml +20 -0
- kitconcept/core/profiles/cmfdependencies/metadata.xml +17 -0
- kitconcept/core/profiles/cmfdependencies/portlets.xml +33 -0
- kitconcept/core/profiles/cmfdependencies/registry.xml +125 -0
- kitconcept/core/profiles/dependencies/catalog.xml +9 -0
- kitconcept/core/profiles/dependencies/controlpanel.xml +19 -0
- kitconcept/core/profiles/dependencies/metadata.xml +14 -0
- kitconcept/core/profiles/dependencies/registry/kitconcept.core.controlpanel.kitconcept.IKitconceptSettings.xml +8 -0
- kitconcept/core/profiles/dependencies/repositorytool.xml +37 -0
- kitconcept/core/profiles/dependencies/types/Collection.xml +11 -0
- kitconcept/core/profiles/dependencies/types/Document.xml +32 -0
- kitconcept/core/profiles/dependencies/types/Event.xml +34 -0
- kitconcept/core/profiles/dependencies/types/File.xml +22 -0
- kitconcept/core/profiles/dependencies/types/Folder.xml +11 -0
- kitconcept/core/profiles/dependencies/types/Image.xml +21 -0
- kitconcept/core/profiles/dependencies/types/LRF.xml +25 -0
- kitconcept/core/profiles/dependencies/types/Link.xml +24 -0
- kitconcept/core/profiles/dependencies/types/News_Item.xml +27 -0
- kitconcept/core/profiles/dependencies/types/Person.xml +33 -0
- kitconcept/core/profiles/dependencies/types/Plone_Site.xml +24 -0
- kitconcept/core/profiles.zcml +42 -0
- kitconcept/core/serializers/__init__.py +0 -0
- kitconcept/core/serializers/configure.zcml +10 -0
- kitconcept/core/serializers/summary.py +19 -0
- kitconcept/core/services/__init__.py +0 -0
- kitconcept/core/services/configure.zcml +6 -0
- kitconcept/core/services/sites/__init__.py +0 -0
- kitconcept/core/services/sites/add.py +59 -0
- kitconcept/core/services/sites/configure.zcml +26 -0
- kitconcept/core/services/sites/overrides.zcml +36 -0
- kitconcept/core/services/system/__init__.py +0 -0
- kitconcept/core/services/system/configure.zcml +15 -0
- kitconcept/core/services/system/get.py +34 -0
- kitconcept/core/setuphandlers/__init__.py +0 -0
- kitconcept/core/setuphandlers/base.py +69 -0
- kitconcept/core/testing/__init__.py +37 -0
- kitconcept/core/testing/configure.zcml +16 -0
- kitconcept/core/testing/distributions/testing/content/content/__metadata__.json +19 -0
- kitconcept/core/testing/distributions/testing/content/content/plone_site_root/data.json +37 -0
- kitconcept/core/testing/distributions/testing/image.png +0 -0
- kitconcept/core/testing/distributions/testing/profiles.json +6 -0
- kitconcept/core/testing/distributions/testing/schema.json +45 -0
- kitconcept/core/testing/layers.py +100 -0
- kitconcept/core/tools/__init__.py +0 -0
- kitconcept/core/tools/migration.py +252 -0
- kitconcept/core/upgrades/__init__.py +0 -0
- kitconcept/core/upgrades/configure.zcml +12 -0
- kitconcept/core/upgrades/utils.py +8 -0
- kitconcept/core/upgrades/v20250523001/__init__.py +0 -0
- kitconcept/core/upgrades/v20250523001/configure.zcml +22 -0
- kitconcept/core/upgrades/v20250612001/__init__.py +0 -0
- kitconcept/core/upgrades/v20250612001/configure.zcml +17 -0
- kitconcept/core/upgrades/v20250902001/__init__.py +0 -0
- kitconcept/core/upgrades/v20250902001/configure.zcml +18 -0
- kitconcept/core/upgrades/v20250903001/__init__.py +0 -0
- kitconcept/core/upgrades/v20250903001/configure.zcml +18 -0
- kitconcept/core/upgrades/v20250915001/__init__.py +0 -0
- kitconcept/core/upgrades/v20250915001/configure.zcml +18 -0
- kitconcept/core/upgrades/v20250916001/__init__.py +0 -0
- kitconcept/core/upgrades/v20250916001/configure.zcml +18 -0
- kitconcept/core/upgrades/v20250917001/__init__.py +0 -0
- kitconcept/core/upgrades/v20250917001/configure.zcml +18 -0
- kitconcept/core/utils/__init__.py +0 -0
- kitconcept/core/utils/distributions.py +25 -0
- kitconcept/core/utils/gs.py +26 -0
- kitconcept/core/utils/packages.py +16 -0
- kitconcept/core/utils/scripts.py +121 -0
- kitconcept/core/utils/types.py +8 -0
- kitconcept/core/vocabularies/__init__.py +0 -0
- kitconcept/core/vocabularies/configure.zcml +5 -0
- kitconcept_core-1.0.0.dist-info/METADATA +126 -0
- kitconcept_core-1.0.0.dist-info/RECORD +122 -0
- kitconcept_core-1.0.0.dist-info/WHEEL +4 -0
- kitconcept_core-1.0.0.dist-info/entry_points.txt +2 -0
- kitconcept_core-1.0.0.dist-info/licenses/LICENSE.GPL +339 -0
- kitconcept_core-1.0.0.dist-info/licenses/LICENSE.md +15 -0
kitconcept/__init__.py
ADDED
|
@@ -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)
|
|
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,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()
|
|
Binary file
|