# HG changeset patch # User Thierry Florac # Date 1434527798 -7200 # Node ID 2f2596eee744c7478e1e8bd07b44e5b0295b6b6c # Parent 6c594e84ec0598a7518f62cdd4abb2fd24fc580d Version 0.1.0 diff -r 6c594e84ec05 -r 2f2596eee744 .installed.cfg --- a/.installed.cfg Wed May 20 12:24:59 2015 +0200 +++ b/.installed.cfg Wed Jun 17 09:56:38 2015 +0200 @@ -1,16 +1,21 @@ [buildout] -installed_develop_eggs = /home/tflorac/Dropbox/src/PyAMS/pyams_form/develop-eggs/pyams-utils.egg-link +installed_develop_eggs = /home/tflorac/Dropbox/src/PyAMS/pyams_form/develop-eggs/pyams-file.egg-link + /home/tflorac/Dropbox/src/PyAMS/pyams_form/develop-eggs/lingua.egg-link + /home/tflorac/Dropbox/src/PyAMS/pyams_form/develop-eggs/pyams-viewlet.egg-link + /home/tflorac/Dropbox/src/PyAMS/pyams_form/develop-eggs/pyams-i18n.egg-link + /home/tflorac/Dropbox/src/PyAMS/pyams_form/develop-eggs/pyams-catalog.egg-link + /home/tflorac/Dropbox/src/PyAMS/pyams_form/develop-eggs/pyams-utils.egg-link parts = package i18n pyflakes test [package] -__buildout_installed__ = /home/tflorac/Dropbox/src/PyAMS/pyams_form/bin/pcreate - /home/tflorac/Dropbox/src/PyAMS/pyams_form/bin/ptweens +__buildout_installed__ = /home/tflorac/Dropbox/src/PyAMS/pyams_form/bin/pserve + /home/tflorac/Dropbox/src/PyAMS/pyams_form/bin/pshell + /home/tflorac/Dropbox/src/PyAMS/pyams_form/bin/pcreate /home/tflorac/Dropbox/src/PyAMS/pyams_form/bin/prequest /home/tflorac/Dropbox/src/PyAMS/pyams_form/bin/pdistreport - /home/tflorac/Dropbox/src/PyAMS/pyams_form/bin/pserve - /home/tflorac/Dropbox/src/PyAMS/pyams_form/bin/pshell + /home/tflorac/Dropbox/src/PyAMS/pyams_form/bin/pviews /home/tflorac/Dropbox/src/PyAMS/pyams_form/bin/proutes - /home/tflorac/Dropbox/src/PyAMS/pyams_form/bin/pviews + /home/tflorac/Dropbox/src/PyAMS/pyams_form/bin/ptweens __buildout_signature__ = zc.recipe.egg-2.0.1-py3.4.egg setuptools-12.0.5-py3.4.egg zc.buildout-2.3.1-py3.4.egg _b = /home/tflorac/Dropbox/src/PyAMS/pyams_form/bin _d = /home/tflorac/Dropbox/src/PyAMS/pyams_form/develop-eggs @@ -60,7 +65,7 @@ [test] __buildout_installed__ = /home/tflorac/Dropbox/src/PyAMS/pyams_form/parts/test /home/tflorac/Dropbox/src/PyAMS/pyams_form/bin/test -__buildout_signature__ = zc.recipe.testrunner-2.0.0-py3.4.egg zc.recipe.egg-2.0.1-py3.4.egg setuptools-12.0.5-py3.4.egg zope.testrunner-4.4.6-py3.4.egg zc.buildout-2.3.1-py3.4.egg zope.interface-4.1.2-py3.4-linux-x86_64.egg zope.exceptions-4.0.7-py3.4.egg six-1482e89f68d85eea27f4ed7749df2819 +__buildout_signature__ = zc.recipe.testrunner-2.0.0-py3.4.egg zc.recipe.egg-2.0.1-py3.4.egg setuptools-12.0.5-py3.4.egg zope.testrunner-4.4.6-py3.4.egg zc.buildout-2.3.1-py3.4.egg zope.interface-4.1.2-py3.4-linux-x86_64.egg zope.exceptions-4.0.7-py3.4.egg six-e6b62e54b4df360c40dfcbb76c1ecf1a _b = /home/tflorac/Dropbox/src/PyAMS/pyams_form/bin _d = /home/tflorac/Dropbox/src/PyAMS/pyams_form/develop-eggs _e = /var/local/env/pyams/eggs @@ -71,3 +76,23 @@ location = /home/tflorac/Dropbox/src/PyAMS/pyams_form/parts/test recipe = zc.recipe.testrunner script = /home/tflorac/Dropbox/src/PyAMS/pyams_form/bin/test + +[buildout] +installed_develop_eggs = /home/tflorac/Dropbox/src/PyAMS/pyams_form/develop-eggs/pyams-file.egg-link + /home/tflorac/Dropbox/src/PyAMS/pyams_form/develop-eggs/lingua.egg-link + /home/tflorac/Dropbox/src/PyAMS/pyams_form/develop-eggs/pyams-viewlet.egg-link + /home/tflorac/Dropbox/src/PyAMS/pyams_form/develop-eggs/pyams-i18n.egg-link + /home/tflorac/Dropbox/src/PyAMS/pyams_form/develop-eggs/pyams-catalog.egg-link + /home/tflorac/Dropbox/src/PyAMS/pyams_form/develop-eggs/pyams-utils.egg-link + +[buildout] +parts = i18n pyflakes test package + +[buildout] +parts = pyflakes test package i18n + +[buildout] +parts = test package i18n pyflakes + +[buildout] +parts = package i18n pyflakes test diff -r 6c594e84ec05 -r 2f2596eee744 buildout.cfg --- a/buildout.cfg Wed May 20 12:24:59 2015 +0200 +++ b/buildout.cfg Wed Jun 17 09:56:38 2015 +0200 @@ -17,9 +17,15 @@ #allow-picked-versions = false src = src -develop = . - ../pyams_skin - ../pyams_utils +develop = + . + ../ext/lingua + ../pyams_catalog + ../pyams_file + ../pyams_i18n + ../pyams_skin + ../pyams_utils + ../pyams_viewlet parts = package diff -r 6c594e84ec05 -r 2f2596eee744 setup.py --- a/setup.py Wed May 20 12:24:59 2015 +0200 +++ b/setup.py Wed Jun 17 09:56:38 2015 +0200 @@ -56,7 +56,9 @@ install_requires=[ 'setuptools', # -*- Extra requirements: -*- + 'pyams_i18n', 'pyams_skin', + 'pyams_utils', 'pyramid', 'pyramid_zope_request', 'z3c.form', diff -r 6c594e84ec05 -r 2f2596eee744 src/pyams_form.egg-info/SOURCES.txt --- a/src/pyams_form.egg-info/SOURCES.txt Wed May 20 12:24:59 2015 +0200 +++ b/src/pyams_form.egg-info/SOURCES.txt Wed Jun 17 09:56:38 2015 +0200 @@ -9,6 +9,7 @@ src/pyams_form/include.py src/pyams_form/schema.py src/pyams_form/search.py +src/pyams_form/security.py src/pyams_form/terms.py src/pyams_form/viewlet.py src/pyams_form.egg-info/PKG-INFO @@ -40,8 +41,11 @@ src/pyams_form/widget/templates/checkbox-input.pt src/pyams_form/widget/templates/close-display.pt src/pyams_form/widget/templates/close-input.pt +src/pyams_form/widget/templates/color-input.pt src/pyams_form/widget/templates/date-input.pt src/pyams_form/widget/templates/datetime-input.pt +src/pyams_form/widget/templates/html-input.pt +src/pyams_form/widget/templates/orderedselect-input.pt src/pyams_form/widget/templates/radio-display.pt src/pyams_form/widget/templates/radio-input.pt src/pyams_form/widget/templates/reset-display.pt diff -r 6c594e84ec05 -r 2f2596eee744 src/pyams_form.egg-info/requires.txt --- a/src/pyams_form.egg-info/requires.txt Wed May 20 12:24:59 2015 +0200 +++ b/src/pyams_form.egg-info/requires.txt Wed Jun 17 09:56:38 2015 +0200 @@ -1,5 +1,7 @@ setuptools +pyams_i18n pyams_skin +pyams_utils pyramid pyramid_zope_request z3c.form diff -r 6c594e84ec05 -r 2f2596eee744 src/pyams_form/form.py --- a/src/pyams_form/form.py Wed May 20 12:24:59 2015 +0200 +++ b/src/pyams_form/form.py Wed Jun 17 09:56:38 2015 +0200 @@ -18,11 +18,12 @@ # import interfaces from pyams_form.interfaces.form import IFormLayer, IForm, IAJAXForm, IInnerSubForm, IInnerTabForm, \ - ICustomUpdateSubForm, IFormCreatedEvent, FormCreatedEvent, IInnerForm + ICustomUpdateSubForm, IFormCreatedEvent, FormCreatedEvent, IInnerForm, IFormContextPermissionChecker from pyams_form.interfaces.form import IAddFormButtons, IModalAddFormButtons, IEditFormButtons, \ IModalEditFormButtons, IModalDisplayFormButtons from pyams_form.interfaces.form import FormObjectCreatedEvent, FormObjectModifiedEvent -from pyams_skin.interfaces import IDialog, ISkinnable +from pyams_i18n.interfaces import II18n +from pyams_skin.interfaces import IDialog, ISkinnable, IContentTitle from pyams_template.interfaces import IContentTemplate, ILayoutTemplate from pyramid_chameleon.interfaces import IChameleonTranslate from z3c.form.interfaces import DISPLAY_MODE, IErrorViewSnippet @@ -32,6 +33,8 @@ from pyams_form.group import GroupsBasedForm from pyams_pagelet.interfaces import PageletCreatedEvent from pyams_skin.skin import apply_skin +from pyams_utils.adapter import adapter_config, ContextRequestViewAdapter +from pyams_utils.list import unique from pyams_utils.url import absolute_url from pyramid.decorator import reify from pyramid.events import subscriber @@ -70,7 +73,6 @@ edit_permission = FieldProperty(IForm['edit_permission']) - title = FieldProperty(IForm['title']) legend = FieldProperty(IForm['legend']) css_class = FieldProperty(IForm['css_class']) icon_css_class = FieldProperty(IForm['icon_css_class']) @@ -93,12 +95,39 @@ alsoProvides(req, self.layer) request.registry.notify(FormCreatedEvent(self)) + @property + def title(self): + registry = self.request.registry + adapter = registry.queryMultiAdapter((self.context, self.request, self), IContentTitle) + if adapter is None: + adapter = registry.queryAdapter(self.context, IContentTitle) + if adapter is not None: + return adapter.title + else: + return II18n(self.context).query_attribute('title', request=self.request) + def update(self): + # check form permission to get form mode if self.edit_permission and not self.request.has_permission(self.edit_permission, self.getContent()): self.mode = DISPLAY_MODE - Form.update(self) + # check form mode based on context checker + registry = self.request.registry + permission = None + for content in unique((self.getContent(), self.context)): + checker = registry.queryMultiAdapter((content, self.request, self), IFormContextPermissionChecker) + if checker is None: + checker = registry.queryAdapter(content, IFormContextPermissionChecker) + if checker is not None: + permission = checker.edit_permission + break + if permission != self.edit_permission: + if (permission == 'system.forbidden') or \ + not self.request.has_permission(permission, self.getContent()): + self.mode = DISPLAY_MODE + # update form and sub-forms [subform.update() for subform in self.subforms] [tabform.update() for tabform in self.tabforms] + Form.update(self) def get_form_action(self): return self.action @@ -278,6 +307,15 @@ return object +@adapter_config(context=(Interface, Interface, AddForm), provides=IFormContextPermissionChecker) +class AddFormContextPermissionChecker(ContextRequestViewAdapter): + """Add form context permission checker""" + + @property + def edit_permission(self): + return self.view.edit_permission + + class AJAXAddForm(AddForm): """AJAX add form""" @@ -427,6 +465,24 @@ dialog_class = 'modal-medium' +@implementer(IInnerForm) +class InnerDisplayForm(DisplayForm): + """Inner display form""" + + @property + def id(self): + return self.__class__.__name__ + + buttons = Buttons(Interface) + + def __init__(self, context, request, view): + super(InnerDisplayForm, self).__init__(context, request) + self.parent_form = view + + def get_form_action(self): + return None + + # # Form events subscribers # diff -r 6c594e84ec05 -r 2f2596eee744 src/pyams_form/interfaces/form.py --- a/src/pyams_form/interfaces/form.py Wed May 20 12:24:59 2015 +0200 +++ b/src/pyams_form/interfaces/form.py Wed Jun 17 09:56:38 2015 +0200 @@ -17,10 +17,10 @@ # import interfaces from pyams_viewlet.interfaces import IViewletManager from pyramid.interfaces import IView -from z3c.form.interfaces import INPUT_MODE, ISubForm, IWidget, IFormLayer as IBaseFormLayer, ISubmitWidget, ITextWidget +from z3c.form.interfaces import INPUT_MODE, ISubForm, IWidget, IFormLayer as IBaseFormLayer, ISubmitWidget, \ + ITextWidget, ITextAreaWidget from zope.interface.interfaces import IObjectEvent, ObjectEvent from zope.lifecycleevent.interfaces import IObjectCreatedEvent, IObjectModifiedEvent -from zope.schema.interfaces import IField # import packages from pyams_form.schema import ResetButton, CloseButton @@ -41,6 +41,22 @@ """Base PyAMS form layer""" +class IFormSecurityContext(Interface): + """Interface used to get security context of a given object""" + + context = Attribute("Object security context") + + +class IFormContextPermissionChecker(Interface): + """Interface used to check form context access rights + + May be implemented as a context adapter or as a + (context, request, form) multi-adapter + """ + + edit_permission = Attribute("Permission required to modify content") + + class IBaseForm(IView): """Base form interface""" @@ -266,6 +282,8 @@ class IInnerTabForm(IInnerForm, ISubForm): """Inner tab-form interface""" + tab_label = TextLine(title="Tab label") + class IViewletSubForm(ISubForm): """Inner viewlet form interface""" @@ -341,10 +359,11 @@ if widget.mode == INPUT_MODE: return True if IForm.providedBy(form): - for subform in form.subforms: - for widget in subform.widgets.values(): + for subform in (form.subforms + form.tabforms): + for widget in (subform.widgets or {}).values(): if widget.mode == INPUT_MODE: return True + return False class IAddFormButtons(Interface): @@ -409,6 +428,10 @@ """Color widget interface""" +class IHTMLWidget(ITextAreaWidget): + """HTML editor widget interface""" + + # # Form events # diff -r 6c594e84ec05 -r 2f2596eee744 src/pyams_form/locales/fr/LC_MESSAGES/pyams_form.mo Binary file src/pyams_form/locales/fr/LC_MESSAGES/pyams_form.mo has changed diff -r 6c594e84ec05 -r 2f2596eee744 src/pyams_form/locales/fr/LC_MESSAGES/pyams_form.po --- a/src/pyams_form/locales/fr/LC_MESSAGES/pyams_form.po Wed May 20 12:24:59 2015 +0200 +++ b/src/pyams_form/locales/fr/LC_MESSAGES/pyams_form.po Wed Jun 17 09:56:38 2015 +0200 @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE 1.0\n" -"POT-Creation-Date: 2015-01-29 22:41+0100\n" +"POT-Creation-Date: 2015-06-01 14:37+0200\n" "PO-Revision-Date: 2015-01-29 17:17+0100\n" "Last-Translator: Thierry Florac \n" "Language-Team: French \n" @@ -16,6 +16,19 @@ "Generated-By: Lingua 3.8\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#: src/pyams_form/search.py:56 src/pyams_form/search.py:49 +msgid "Search" +msgstr "Chercher" + +#: src/pyams_form/search.py:41 +msgid "Search query" +msgstr "Texte recherché" + +#: src/pyams_form/search.py:48 src/pyams_form/interfaces/form.py:356 +#: src/pyams_form/interfaces/form.py:370 +msgid "Reset" +msgstr "Annuler" + #: src/pyams_form/terms.py:36 msgid "yes" msgstr "oui" @@ -24,55 +37,52 @@ msgid "no" msgstr "non" -#: src/pyams_form/form.py:212 +#: src/pyams_form/form.py:269 msgid "Add form" -msgstr "" +msgstr "Formulaire de création" -#: src/pyams_form/form.py:213 src/pyams_form/form.py:264 +#: src/pyams_form/form.py:270 src/pyams_form/form.py:350 msgid "There were some errors." msgstr "Des erreurs se sont produites." -#: src/pyams_form/form.py:263 +#: src/pyams_form/form.py:349 msgid "Edit form" -msgstr "" +msgstr "Formulaire de mise à jour" -#: src/pyams_form/form.py:265 +#: src/pyams_form/form.py:351 msgid "Data successfully updated." msgstr "Les modifications ont été enregistrées." -#: src/pyams_form/form.py:266 +#: src/pyams_form/form.py:352 msgid "No changes were applied." msgstr "Aucune modification effectuée." -#: src/pyams_form/form.py:353 -msgid "My legend" -msgstr "Ma légende" - -#: src/pyams_form/templates/radio-input.pt:7 +#: src/pyams_form/widget/templates/checkbox-input.pt:66 +#: src/pyams_form/widget/templates/radio-input.pt:34 +#: src/pyams_form/widget/templates/checkbox-display.pt:62 msgid "Label" -msgstr "" +msgstr "Libellé" -#: src/pyams_form/templates/inner-form.pt:89 -msgid "legend" -msgstr "" +#: src/pyams_form/widget/templates/orderedselect-input.pt:4 +msgid "Clear selected values" +msgstr "Enlever les valeurs sélectionnées" -#: src/pyams_form/templates/inner-form.pt:108 -msgid "Tab label" -msgstr "" +#: src/pyams_form/templates/search.pt:6 +msgid "Search results" +msgstr "Résultats de la recherche" -#: src/pyams_form/interfaces/form.py:295 src/pyams_form/interfaces/form.py:309 -msgid "Reset" -msgstr "Annuler" - -#: src/pyams_form/interfaces/form.py:296 src/pyams_form/interfaces/form.py:303 +#: src/pyams_form/interfaces/form.py:357 src/pyams_form/interfaces/form.py:364 msgid "Add" msgstr "Ajouter" -#: src/pyams_form/interfaces/form.py:302 src/pyams_form/interfaces/form.py:316 -#: src/pyams_form/interfaces/form.py:323 +#: src/pyams_form/interfaces/form.py:363 src/pyams_form/interfaces/form.py:377 +#: src/pyams_form/interfaces/form.py:384 msgid "Close" msgstr "Fermer" -#: src/pyams_form/interfaces/form.py:310 src/pyams_form/interfaces/form.py:317 +#: src/pyams_form/interfaces/form.py:371 src/pyams_form/interfaces/form.py:378 msgid "Submit" msgstr "Enregistrer" + +#~ msgid "My legend" +#~ msgstr "Ma légende" diff -r 6c594e84ec05 -r 2f2596eee744 src/pyams_form/locales/pyams_form.pot --- a/src/pyams_form/locales/pyams_form.pot Wed May 20 12:24:59 2015 +0200 +++ b/src/pyams_form/locales/pyams_form.pot Wed Jun 17 09:56:38 2015 +0200 @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE 1.0\n" -"POT-Creation-Date: 2015-01-29 22:41+0100\n" +"POT-Creation-Date: 2015-06-01 14:37+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" @@ -14,7 +14,20 @@ "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Lingua 3.8\n" +"Generated-By: Lingua 3.10.dev0\n" + +#: ./src/pyams_form/search.py:56 ./src/pyams_form/search.py:49 +msgid "Search" +msgstr "" + +#: ./src/pyams_form/search.py:41 +msgid "Search query" +msgstr "" + +#: ./src/pyams_form/search.py:48 ./src/pyams_form/interfaces/form.py:356 +#: ./src/pyams_form/interfaces/form.py:370 +msgid "Reset" +msgstr "" #: ./src/pyams_form/terms.py:36 msgid "yes" @@ -24,59 +37,52 @@ msgid "no" msgstr "" -#: ./src/pyams_form/form.py:212 +#: ./src/pyams_form/form.py:269 msgid "Add form" msgstr "" -#: ./src/pyams_form/form.py:213 ./src/pyams_form/form.py:264 +#: ./src/pyams_form/form.py:270 ./src/pyams_form/form.py:350 msgid "There were some errors." msgstr "" -#: ./src/pyams_form/form.py:263 +#: ./src/pyams_form/form.py:349 msgid "Edit form" msgstr "" -#: ./src/pyams_form/form.py:265 +#: ./src/pyams_form/form.py:351 msgid "Data successfully updated." msgstr "" -#: ./src/pyams_form/form.py:266 +#: ./src/pyams_form/form.py:352 msgid "No changes were applied." msgstr "" -#: ./src/pyams_form/form.py:353 -msgid "My legend" -msgstr "" - -#: ./src/pyams_form/templates/radio-input.pt:7 +#: ./src/pyams_form/widget/templates/checkbox-input.pt:66 +#: ./src/pyams_form/widget/templates/radio-input.pt:34 +#: ./src/pyams_form/widget/templates/checkbox-display.pt:62 msgid "Label" msgstr "" -#: ./src/pyams_form/templates/inner-form.pt:89 -msgid "legend" -msgstr "" - -#: ./src/pyams_form/templates/inner-form.pt:108 -msgid "Tab label" +#: ./src/pyams_form/widget/templates/orderedselect-input.pt:4 +msgid "Clear selected values" msgstr "" -#: ./src/pyams_form/interfaces/form.py:295 -#: ./src/pyams_form/interfaces/form.py:309 -msgid "Reset" +#: ./src/pyams_form/templates/search.pt:6 +msgid "Search results" msgstr "" -#: ./src/pyams_form/interfaces/form.py:296 -#: ./src/pyams_form/interfaces/form.py:303 +#: ./src/pyams_form/interfaces/form.py:357 +#: ./src/pyams_form/interfaces/form.py:364 msgid "Add" msgstr "" -#: ./src/pyams_form/interfaces/form.py:302 -#: ./src/pyams_form/interfaces/form.py:316 -#: ./src/pyams_form/interfaces/form.py:323 +#: ./src/pyams_form/interfaces/form.py:363 +#: ./src/pyams_form/interfaces/form.py:377 +#: ./src/pyams_form/interfaces/form.py:384 msgid "Close" msgstr "" -#: ./src/pyams_form/interfaces/form.py:310 -#: ./src/pyams_form/interfaces/form.py:317 +#: ./src/pyams_form/interfaces/form.py:371 +#: ./src/pyams_form/interfaces/form.py:378 msgid "Submit" msgstr "" diff -r 6c594e84ec05 -r 2f2596eee744 src/pyams_form/search.py --- a/src/pyams_form/search.py Wed May 20 12:24:59 2015 +0200 +++ b/src/pyams_form/search.py Wed Jun 17 09:56:38 2015 +0200 @@ -38,7 +38,8 @@ class ISearchFields(Interface): """Default search form interface""" - query = TextLine(title=_("Search query")) + query = TextLine(title=_("Search query"), + required=False) class ISearchButtons(Interface): @@ -68,7 +69,12 @@ self.actions['search'].addClass('btn-primary') def get_search_results(self): - search = IContentSearch(self.context, None) + registry = self.request.registry + search = registry.queryMultiAdapter((self.context, self.request, self), IContentSearch) + if search is None: + search = registry.queryMultiAdapter((self.context, self.request), IContentSearch) + if search is None: + search = IContentSearch(self.context, None) if search is not None: self.updateWidgets() data, errors = self.extractData() @@ -97,7 +103,7 @@ return Response(self.renderTable()) -@adapter_config(context=(Interface, IPyAMSLayer, SearchResultsView), provides=IValues) +@adapter_config(context=(IContentSearch, IPyAMSLayer, SearchResultsView), provides=IValues) class SearchResultsViewValuesAdapter(ContextRequestViewAdapter): """Search results view values adapter""" diff -r 6c594e84ec05 -r 2f2596eee744 src/pyams_form/security.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pyams_form/security.py Wed Jun 17 09:56:38 2015 +0200 @@ -0,0 +1,40 @@ +# +# Copyright (c) 2008-2015 Thierry Florac +# 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. +# + +__docformat__ = 'restructuredtext' + + +# import standard library + +# import interfaces +from pyams_form.interfaces.form import IFormSecurityContext, IFormContextPermissionChecker + +# import packages + + +class ProtectedFormObjectMixin(object): + """Form object protected by a given permission""" + + @property + def permission(self): + registry = self.request.registry + checker = None + context = IFormSecurityContext(self, None) + if context is None: + context = self.context + view = getattr(self, '__parent__', None) or getattr(self, 'view', None) or getattr(self, 'table', None) + if view is not None: + checker = registry.queryMultiAdapter((context, self.request, view), IFormContextPermissionChecker) + if checker is None: + checker = registry.queryAdapter(context, IFormContextPermissionChecker) + if checker is not None: + return checker.edit_permission diff -r 6c594e84ec05 -r 2f2596eee744 src/pyams_form/templates/form.pt --- a/src/pyams_form/templates/form.pt Wed May 20 12:24:59 2015 +0200 +++ b/src/pyams_form/templates/form.pt Wed Jun 17 09:56:38 2015 +0200 @@ -30,7 +30,7 @@ data-ams-form-download-target view.download_target | nothing; data-ams-warn-on-change view.warn_on_change;">