Jihaisse
Jihaisse

Reputation: 977

Schema Extender with IBrowserLayerAwareExtender applied to all Plone sites

I've got a product installed in one Plone Site, this product change the visibility of a field of the Event content type.

It use IBrowserLayerAwareExtender to restrain the change to only the Plone Site where the product is installed.

This work on the development server on which buildout is made with the develop.cfg option, but in production, the layer is not respected, and all others Plone Site have this change.

Here is the code:

schemaextender.py:

    class EventModifier(object):
    """
    Masque certains champs inutiles pour le projet
    """
    implements(ISchemaModifier, IBrowserLayerAwareExtender)
    adapts(IATEvent)
    layer = IBswMonasticLayer

    def __init__(self, context):
        self.context = context

    # noinspection PyMethodMayBeStatic
    def fiddle(self, schema):
        """

        :param schema:
        :return:
        """
        schema['attendees'].widget.visible = {'edit': 'invisible', 'view': 'invisible'}
        schema['location'].widget.label = _(u'Adresse')
        return schema

configure.zcml:

<adapter for="Products.ATContentTypes.interface.IATEvent"
             provides="archetypes.schemaextender.interfaces.ISchemaModifier"
             factory=".schemaextender.EventModifier"
             name="bsw.monastic.schemaextender.EventModifier"/>

Is it a bug or am I missing something ?

Upvotes: 0

Views: 47

Answers (1)

Mathias
Mathias

Reputation: 6839

IMHO it's weird it works on you dev machine and not in production. I assume the browserlayer is indeed there on the production site.

You can check this by running the following code in a debug session on the server:

>>> from zope.component.hooks import setSite
>>> plone = app.path.to.plone.site
>>> setSite(plone)  # Setup component registry
>>> from plone.browserlayer.utils import registered_layers
>>> registered_layers()
[...]  # Bunch of layer interface active on the plone site.

I assume it's there, so you should remove it.

If so remove it using from plone.browserlayer.utils import unregister_layer

>>> from plone.browserlayer.utils import unregister_layer
>>> unregister_layer(layername)
>>> import transaction
>>> transaction.commit()

Upvotes: 0

Related Questions