Skip to content

Commit

Permalink
Merge branch 'master' into default_plone_views
Browse files Browse the repository at this point in the history
  • Loading branch information
mamico authored Jul 31, 2024
2 parents f3d5b69 + f1de3b5 commit 86e3eaa
Show file tree
Hide file tree
Showing 22 changed files with 366 additions and 12 deletions.
24 changes: 24 additions & 0 deletions .github/workflows/bandit.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
name: Security check - Bandit

on: push

jobs:
build:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Security check - Bandit
uses: ioggstream/[email protected]
with:
project_path: src
# ignore_failure: true

# This is optional
#- name: Security check report artifacts
# uses: actions/upload-artifact@v4
# with:
# name: Security report
# path: output/security_report.txt

3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,12 @@ coverage.json
*.py?
*.swp
# dirs
__pycache__
bin/
buildout-cache/
develop-eggs/
eggs/
extras/
htmlcov/
include/
lib/
Expand Down Expand Up @@ -43,4 +45,5 @@ reports/
!.gitkeep
!.travis.yml
!src/redturtle
!src/.bandit
.idea/
23 changes: 19 additions & 4 deletions CHANGES.rst
Original file line number Diff line number Diff line change
@@ -1,16 +1,31 @@
Changelog
=========

5.4.10 (unreleased)
-------------------
5.5.2 (unreleased)
------------------

- Nothing changed yet.


5.5.1 (2024-07-22)
------------------

- Allow to select which image miniature use in
RSS
[lucabel]


5.5.0 (2024-07-10)
------------------

- remove newsitem template override, use default dexterity view for newsitem in backend
[mamico]

- Fixed limit event occurrences to 100.
[eikichi18]


- Add dependency with collective.volto.sitesettings.
[cekk]

5.4.9 (2024-04-22)
------------------

Expand Down
2 changes: 2 additions & 0 deletions MANIFEST.in
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,5 @@ include *.rst
include *.GPL
include *.txt
global-exclude *.pyc
exclude .pre-commit-config.yaml
exclude src/.bandit
7 changes: 6 additions & 1 deletion base.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,11 @@ parts =
omelette
robot
plone-helper-scripts
develop = .

develop = .
sources-dir = extras
auto-checkout = *
always-checkout = force

[instance]
recipe = plone.recipe.zope2instance
Expand Down Expand Up @@ -117,3 +120,5 @@ scripts =
# Don't use a released version of redturtle.volto
redturtle.volto =
setuptools =

[sources]
1 change: 0 additions & 1 deletion buildout.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,3 @@ extends =
test_plone60.cfg

[versions]
plone.restapi = 9.7.0
3 changes: 2 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

setup(
name="redturtle.volto",
version="5.4.10.dev0",
version="5.5.2.dev0",
description="Helper package to setup a RedTurtle's Plone site ready to work with Volto.",
long_description=long_description,
# Get more from https://pypi.org/classifiers/
Expand Down Expand Up @@ -62,6 +62,7 @@
"plone.volto>=4.0.0",
"plone.restapi>=9.6.0",
"Products.PortalTransforms>=3.2.0",
"collective.volto.sitesettings",
"z3c.jbot",
],
extras_require={
Expand Down
3 changes: 3 additions & 0 deletions src/.bandit
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[bandit]
exclude = locales,tests
skips = B410
15 changes: 15 additions & 0 deletions src/redturtle/volto/adapters/configure.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -66,4 +66,19 @@
provides="zope.container.interfaces.INameChooser"
for="Products.CMFCore.interfaces.ISiteRoot"
/>

<adapter
factory=".rss.CustomFeedItem"
provides="plone.base.interfaces.syndication.IFeedItem"
for="redturtle.volto.interfaces.ICustomFeedItem
plone.base.interfaces.syndication.IFeed"
zcml:condition="have plone-60"
/>
<adapter
factory=".rss.CustomFeedItem"
provides="Products.CMFPlone.interfaces.syndication.IFeedItem"
for="redturtle.volto.interfaces.ICustomFeedItem
Products.CMFPlone.interfaces.syndication.IFeed"
zcml:condition="not-have plone-60"
/>
</configure>
78 changes: 77 additions & 1 deletion src/redturtle/volto/adapters/rss.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
from DateTime import DateTime
from plone import api
from plone.api.exc import InvalidParameterError
from plone.app.contenttypes.behaviors.leadimage import ILeadImageBehavior
from plone.app.contenttypes.interfaces import IEvent
from plone.dexterity.interfaces import IDexterityContent
from plone.namedfile.interfaces import INamedField
from plone.rfc822.interfaces import IPrimaryFieldInfo
from plone.volto.behaviors.preview import IPreview
from redturtle.volto.interfaces import ICustomFeedItem


try:
Expand All @@ -11,8 +19,76 @@
from zope.component import adapter


@adapter(ICustomFeedItem, IFeed)
class CustomFeedItem(DexterityItem):

def _has_valid_image(self, behavior, field_name):
if not behavior:
return False

field = getattr(behavior, field_name, None)
if not field:
return False

if not hasattr(field, "getSize"):
return False

return field.getSize() > 0

def __init__(self, context, feed):
super().__init__(context, feed)
self.dexterity = IDexterityContent.providedBy(context)
self.img_choice = None
self.file = None
self.field_name = None
self._set_image_field()
if self.file is None:
self._set_primary_field()

def _set_image_field(self):
lead = ILeadImageBehavior(self.context, None)
preview = IPreview(self.context, None)
# if we don't have the record gently fallback on the old behavior
try:
img_choice = api.portal.get_registry_record(
"redturtle.volto.rss_image_choice"
)
except InvalidParameterError:
# seems the default of get_registry_record is not working
img_choice = "image"

if img_choice == "preview_image" and self._has_valid_image(
preview, "preview_image"
):
self.file = preview.image
self.field_name = "preview_image"
elif img_choice == "image" and self._has_valid_image(lead, "image"):
self.file = lead.image
self.field_name = "image"
elif img_choice == "listing_like":
if self._has_valid_image(preview, "preview_image"):
self.file = preview.image
self.field_name = "preview_image"
elif self._has_valid_image(lead, "image"):
self.file = lead.image
self.field_name = "image"

def _set_primary_field(self):
try:
primary = IPrimaryFieldInfo(self.context, None)
if (
INamedField.providedBy(primary.field)
and hasattr(primary.value, "getSize") # noqa
and primary.value.getSize() > 0 # noqa
):
self.file = primary.value
self.field_name = primary.fieldname
except TypeError:
pass


@adapter(IEvent, IFeed)
class EventItem(DexterityItem):
class EventItem(CustomFeedItem):
@property
def startdate(self):
"""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,9 @@
<title tal:content="item/title" />
<link tal:content="link" />
<description tal:content="item/description" />
<tal:image tal:condition="python: item.field_name == 'image'" tal:on-error="string:">
<tal:image_metadata tal:define="url string:${link}/@@images/image/${image_miniature};
<tal:image tal:condition="python: item.field_name in {'image', 'preview_image'}" >
<tal:image_metadata tal:define="image_type python: item.field_name;
url string:${link}/@@images/${image_type}/${image_miniature};
size item/file/size|nothing;
mime item/file/contentType|nothing">
<enclosure url="${url}" tal:attributes="size size; type mime"/>
Expand Down
22 changes: 22 additions & 0 deletions src/redturtle/volto/configure.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,14 @@
post_handler=".setuphandlers.uninstall"
/>

<genericsetup:registerProfile
name="profile_to_4307"
title="RedTurtle: Volto (to 4307)"
description="Installs the redturtle.volto add-on."
provides="Products.GenericSetup.interfaces.EXTENSION"
directory="profiles/to_4307"
/>

<utility
factory=".setuphandlers.HiddenProfiles"
name="redturtle.volto-hiddenprofiles"
Expand All @@ -47,4 +55,18 @@
handler=".events.manage_auth_token"
/>

<!-- provide interface to News-->
<class class="plone.volto.content.FolderishNewsItem">
<implements interface="redturtle.volto.interfaces.ICustomFeedItem" />
</class>
<!-- <class class="plone.volto.content.FolderishEvent">
<implements interface="redturtle.volto.interfaces.ICustomFeedItem" />
</class> -->
<class class="plone.volto.content.FolderishDocument">
<implements interface="redturtle.volto.interfaces.ICustomFeedItem" />
</class>
<class class="plone.app.contenttypes.content.Link">
<implements interface="redturtle.volto.interfaces.ICustomFeedItem" />
</class>

</configure>
7 changes: 7 additions & 0 deletions src/redturtle/volto/interfaces.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from plone.app.contenttypes.interfaces import (
IPloneAppContenttypesLayer as IDefaultBrowserLayer,
)
from plone.dexterity.interfaces import IDexterityContent
from plone.restapi.controlpanels.interfaces import IControlpanel
from redturtle.volto import _
from zope.interface import Interface
Expand Down Expand Up @@ -43,3 +44,9 @@ class IRedTurtleVoltoSettings(Interface):
default=False,
required=False,
)


class ICustomFeedItem(IDexterityContent):
"""
Marker interface for custom feed items.
"""
3 changes: 2 additions & 1 deletion src/redturtle/volto/profiles/default/metadata.xml
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<version>4305</version>
<version>4307</version>
<dependencies>
<dependency>profile-plone.volto:default</dependency>
<dependency>profile-plone.app.caching:with-caching-proxy</dependency>
<dependency>profile-collective.volto.gdprcookie:default</dependency>
<dependency>profile-kitconcept.seo:default</dependency>
<dependency>profile-collective.volto.sitesettings:default</dependency>
</dependencies>
</metadata>
11 changes: 11 additions & 0 deletions src/redturtle/volto/profiles/default/registry/rss.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,15 @@
</field>
<value>thumb</value>
</record>
<record name="redturtle.volto.rss_image_choice">
<value>image</value>
<field type="plone.registry.field.Choice">
<title>RSS Image Choice</title>
<values>
<element>listing_like</element>
<element>image</element>
<element>preview_image</element>
</values>
</field>
</record>
</registry>
13 changes: 13 additions & 0 deletions src/redturtle/volto/profiles/to_4307/registry.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<registry>
<record name="redturtle.volto.rss_image_choice">
<value>image</value>
<field type="plone.registry.field.Choice">
<title>RSS Image Choice</title>
<values>
<element>listing_like</element>
<element>image</element>
<element>preview_image</element>
</values>
</field>
</record>
</registry>
2 changes: 1 addition & 1 deletion src/redturtle/volto/profiles/uninstall/controlpanel.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version="1.0"?>
<object name="portal_controlpanel"
xmlns:i18n="http://xml.zope.org/namespaces/i18n"
i18n:domain="design.plone.contenttypes">
i18n:domain="redturtle.volto">

<configlet
title="RedTurtle Volto Settings"
Expand Down
3 changes: 3 additions & 0 deletions src/redturtle/volto/testing.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from plone.testing import z2

import collective.volto.gdprcookie
import collective.volto.sitesettings
import kitconcept.seo
import plone.app.caching
import plone.restapi
Expand All @@ -24,6 +25,7 @@ def setUpZope(self, app, configurationContext):
# The z3c.autoinclude feature is disabled in the Plone fixture base
# layer.
self.loadZCML(package=collective.volto.gdprcookie)
self.loadZCML(package=collective.volto.sitesettings)
self.loadZCML(package=plone.restapi)
self.loadZCML(package=redturtle.volto)
self.loadZCML(package=plone.volto)
Expand Down Expand Up @@ -67,6 +69,7 @@ def setUpZope(self, app, configurationContext):
super(RedturtleVoltoRestApiLayer, self).setUpZope(app, configurationContext)

self.loadZCML(package=collective.volto.gdprcookie)
self.loadZCML(package=collective.volto.sitesettings)
self.loadZCML(package=plone.restapi)
self.loadZCML(package=plone.volto)
self.loadZCML(package=redturtle.volto)
Expand Down
Loading

0 comments on commit 86e3eaa

Please sign in to comment.