src/pyams_content/shared/form/zmi/render.py
changeset 487 093f201e3168
parent 484 ddbb2278250b
child 546 213db0cb6b4c
equal deleted inserted replaced
486:cb67e71dafff 487:093f201e3168
       
     1 #
       
     2 # Copyright (c) 2008-2015 Thierry Florac <tflorac AT ulthar.net>
       
     3 # All Rights Reserved.
       
     4 #
       
     5 # This software is subject to the provisions of the Zope Public License,
       
     6 # Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
       
     7 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
       
     8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
       
     9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
       
    10 # FOR A PARTICULAR PURPOSE.
       
    11 #
       
    12 
       
    13 __docformat__ = 'restructuredtext'
       
    14 
       
    15 
       
    16 # import standard library
       
    17 
       
    18 # import interfaces
       
    19 from pyams_content.features.renderer.interfaces import IContentRenderer
       
    20 from pyams_content.shared.form.interfaces import IFormFieldContainerTarget, IFormFieldContainer
       
    21 from pyams_form.interfaces.form import IFormHelp
       
    22 from pyams_i18n.interfaces import II18n
       
    23 from pyams_skin.layer import IPyAMSLayer
       
    24 
       
    25 # import packages
       
    26 from pyams_content.features.renderer.zmi import BaseContentRenderer
       
    27 from pyams_form.form import InnerAddForm
       
    28 from pyams_form.help import FormHelp
       
    29 from pyams_utils.adapter import adapter_config
       
    30 from z3c.form import field, button
       
    31 from zope.interface import Interface
       
    32 
       
    33 
       
    34 class FormFieldContainerDisplayForm(InnerAddForm):
       
    35     """Form fields container display form"""
       
    36 
       
    37     @property
       
    38     def legend(self):
       
    39         return II18n(self.context).query_attribute('user_title', request=self.request)
       
    40 
       
    41     @property
       
    42     def fields(self):
       
    43         fields = field.Fields(*IFormFieldContainer(self.context).get_fields())
       
    44         if self.context.use_captcha:
       
    45             # TODO: add captcha
       
    46             # fields += field.Fields(Captcha(title='', description='', required=True))
       
    47             pass
       
    48         return fields
       
    49 
       
    50     buttons = button.Buttons(Interface)
       
    51 
       
    52     def updateWidgets(self, prefix=None):
       
    53         super(FormFieldContainerDisplayForm, self).updateWidgets(prefix)
       
    54         for widget in self.widgets.values():
       
    55             field = IFormFieldContainer(self.context).get(widget.field.__name__)
       
    56             if field is not None:
       
    57                 widget.placeholder = field.placeholder
       
    58                 if field.field_type == 'text':
       
    59                     widget.widget_css_class = 'textarea'
       
    60 
       
    61 
       
    62 @adapter_config(context=(IFormFieldContainerTarget, IPyAMSLayer, FormFieldContainerDisplayForm),
       
    63                 provides=IFormHelp)
       
    64 class FormFieldContainerDisplayFormHelp(FormHelp):
       
    65     """Form field container display form help adapter"""
       
    66 
       
    67     def __new__(cls, context, request, view):
       
    68         if not context.header:
       
    69             return None
       
    70         return FormHelp.__new__(cls)
       
    71 
       
    72     @property
       
    73     def message(self):
       
    74         return II18n(self.context).query_attribute('header', request=self.request)
       
    75 
       
    76     message_format = 'text'
       
    77 
       
    78 
       
    79 @adapter_config(name='form-render', context=(IFormFieldContainerTarget, IPyAMSLayer),
       
    80                 provides=IContentRenderer)
       
    81 class FormFieldContainerRenderer(BaseContentRenderer):
       
    82     """Form field container renderer"""
       
    83 
       
    84     weight = 20
       
    85     display_form = None
       
    86 
       
    87     def __init__(self, context, request):
       
    88         super(FormFieldContainerRenderer, self).__init__(context, request)
       
    89         self.display_form = FormFieldContainerDisplayForm(context, self.request)
       
    90 
       
    91     def update(self):
       
    92         super(FormFieldContainerRenderer, self).update()
       
    93         self.display_form.update()
       
    94 
       
    95     def render(self):
       
    96         return self.display_form.render()