src/pyams_skin/configuration.py
changeset 557 bca7a7e058a3
equal deleted inserted replaced
-1:000000000000 557:bca7a7e058a3
       
     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 from persistent import Persistent
       
    16 from pyramid.httpexceptions import HTTPNotFound
       
    17 from pyramid.view import view_config
       
    18 from zope.container.contained import Contained
       
    19 from zope.interface import Interface, implementer
       
    20 from zope.schema.fieldproperty import FieldProperty
       
    21 from zope.traversing.interfaces import ITraversable
       
    22 
       
    23 from pyams_file.property import FileProperty
       
    24 from pyams_file.views.file import FileView
       
    25 from pyams_skin.interfaces import IContextTitlePrefix
       
    26 from pyams_skin.interfaces.configuration import IBackOfficeConfiguration, IConfiguration, SKIN_BACK_CONFIGURATION_KEY, \
       
    27     SKIN_CONFIGURATION_KEY
       
    28 from pyams_utils.adapter import ContextAdapter, ContextRequestViewAdapter, adapter_config, get_annotation_adapter
       
    29 from pyams_utils.factory import factory_config
       
    30 from pyams_utils.interfaces.site import IConfigurationManager
       
    31 from pyams_utils.interfaces.tales import ITALESExtension
       
    32 from pyams_utils.registry import get_global_registry
       
    33 from pyams_utils.traversing import get_parent
       
    34 
       
    35 
       
    36 #
       
    37 # Dynamic front-office configuration
       
    38 # May be overriden by custom applications
       
    39 #
       
    40 
       
    41 @factory_config(IConfiguration)
       
    42 class Configuration(Persistent, Contained):
       
    43     """Manageable configuration"""
       
    44 
       
    45     title = FieldProperty(IConfiguration['title'])
       
    46     short_title = FieldProperty(IConfiguration['short_title'])
       
    47     description = FieldProperty(IConfiguration['description'])
       
    48     author = FieldProperty(IConfiguration['author'])
       
    49     icon = FileProperty(IConfiguration['icon'])
       
    50     logo = FileProperty(IConfiguration['logo'])
       
    51 
       
    52     @staticmethod
       
    53     def get_title_prefix(request):
       
    54         adapter = get_global_registry().queryMultiAdapter((request.context, request), IContextTitlePrefix)
       
    55         if adapter is not None:
       
    56             return adapter.prefix
       
    57 
       
    58 
       
    59 @adapter_config(context=IConfigurationManager, provides=IConfiguration)
       
    60 def configuration_factory(context):
       
    61     """Configuration factory"""
       
    62     return get_annotation_adapter(context, SKIN_CONFIGURATION_KEY, IConfiguration,
       
    63                                   name='++configuration++')
       
    64 
       
    65 
       
    66 @adapter_config(name='configuration', context=(Interface, Interface, Interface), provides=ITALESExtension)
       
    67 class ConfigurationTalesExtension(ContextRequestViewAdapter):
       
    68     """extension:configuration TALES expression"""
       
    69 
       
    70     def render(self, context=None):
       
    71         if context is None:
       
    72             context = self.context
       
    73         manager = get_parent(context, IConfigurationManager)
       
    74         if manager is not None:
       
    75             return IConfiguration(manager)
       
    76 
       
    77 
       
    78 @adapter_config(name='configuration', context=IConfigurationManager, provides=ITraversable)
       
    79 class ConfigurationTraverser(ContextAdapter):
       
    80     """++configuration++ namespace traverser"""
       
    81 
       
    82     def traverse(self, name, furtherpath=None):
       
    83         return IConfiguration(self.context)
       
    84 
       
    85 
       
    86 @view_config(name='favicon.ico', context=IConfigurationManager)
       
    87 def site_icon(request):
       
    88     configuration = IConfiguration(request.context)
       
    89     if configuration.icon is not None:
       
    90         request = request.copy()
       
    91         request.context = configuration.icon
       
    92         return FileView(request)
       
    93     return HTTPNotFound()
       
    94 
       
    95 
       
    96 #
       
    97 # Dynamic back-office configuration
       
    98 # May be overriden by custom applications
       
    99 #
       
   100 
       
   101 @factory_config(IBackOfficeConfiguration)
       
   102 class BackOfficeConfiguration(Persistent, Contained):
       
   103     """Back-office manageable configuration"""
       
   104 
       
   105     title = FieldProperty(IBackOfficeConfiguration['title'])
       
   106     short_title = FieldProperty(IBackOfficeConfiguration['short_title'])
       
   107     login_header = FieldProperty(IBackOfficeConfiguration['login_header'])
       
   108     login_footer = FieldProperty(IBackOfficeConfiguration['login_footer'])
       
   109     icon = FileProperty(IBackOfficeConfiguration['icon'])
       
   110     logo = FileProperty(IBackOfficeConfiguration['logo'])
       
   111     login_logo = FileProperty(IBackOfficeConfiguration['login_logo'])
       
   112     display_content_icon = FieldProperty(IBackOfficeConfiguration['display_content_icon'])
       
   113     display_shared_tool_title = FieldProperty(IBackOfficeConfiguration['display_shared_tool_title'])
       
   114 
       
   115     @staticmethod
       
   116     def get_title_prefix(request):
       
   117         adapter = request.registry.queryMultiAdapter((request.context, request), IContextTitlePrefix)
       
   118         if adapter is not None:
       
   119             return adapter.prefix
       
   120 
       
   121 
       
   122 @adapter_config(context=IConfigurationManager, provides=IBackOfficeConfiguration)
       
   123 def back_office_configuration_factory(context):
       
   124     """Back-office configuration factory"""
       
   125     return get_annotation_adapter(context, SKIN_BACK_CONFIGURATION_KEY, IBackOfficeConfiguration,
       
   126                                   name='++back-configuration++')
       
   127 
       
   128 
       
   129 @adapter_config(name='back_configuration', context=(Interface, Interface, Interface), provides=ITALESExtension)
       
   130 class BackOfficeConfigurationTalesExtension(ContextRequestViewAdapter):
       
   131     """extension:back_configuration TALES expression"""
       
   132 
       
   133     def render(self, context=None):
       
   134         if context is None:
       
   135             context = self.context
       
   136         manager = get_parent(context, IConfigurationManager)
       
   137         if manager is not None:
       
   138             return IBackOfficeConfiguration(manager)
       
   139 
       
   140 
       
   141 @adapter_config(name='back-configuration', context=IConfigurationManager, provides=ITraversable)
       
   142 class BackOfficeConfigurationTraverser(ContextAdapter):
       
   143     """++back-configuration++ namespace traverser"""
       
   144 
       
   145     def traverse(self, name, furtherpath=None):
       
   146         return IBackOfficeConfiguration(self.context)
       
   147 
       
   148 
       
   149 @view_config(name='back-favicon.ico', context=IConfigurationManager)
       
   150 def back_office_site_icon(request):
       
   151     configuration = IBackOfficeConfiguration(request.context)
       
   152     if configuration.icon is not None:
       
   153         request = request.copy()
       
   154         request.context = configuration.icon
       
   155         return FileView(request)
       
   156     return HTTPNotFound()