src/pyams_default_theme/features/search/manager.py
changeset 409 fc623fa4f4ac
child 507 01a4fac43422
equal deleted inserted replaced
408:e6dd4e74ae8b 409:fc623fa4f4ac
       
     1 #
       
     2 # Copyright (c) 2008-2019 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 pyramid.exceptions import NotFound
       
    16 from pyramid.view import view_config
       
    17 from zope.interface import Interface
       
    18 
       
    19 from pyams_content.features.search.interfaces import ISearchManagerInfo
       
    20 from pyams_content.root import ISiteRoot
       
    21 from pyams_i18n.interfaces import II18n
       
    22 from pyams_skin.interfaces.metas import IHTMLContentMetas
       
    23 from pyams_skin.layer import IPyAMSUserLayer
       
    24 from pyams_skin.metas import LinkMeta
       
    25 from pyams_utils.adapter import ContextRequestViewAdapter, adapter_config
       
    26 from pyams_utils.url import absolute_url
       
    27 
       
    28 
       
    29 @adapter_config(name='opensearch',
       
    30                 context=(Interface, IPyAMSUserLayer, Interface), provides=IHTMLContentMetas)
       
    31 class OpenSearchMetasAdapter(ContextRequestViewAdapter):
       
    32     """OpenSearch metas adapter"""
       
    33 
       
    34     def __new__(cls, context, request, view):
       
    35         search_info = ISearchManagerInfo(request.root, None)
       
    36         if (search_info is None) or (search_info.target is None):
       
    37             return None
       
    38         return ContextRequestViewAdapter.__new__(cls)
       
    39 
       
    40     order = 25
       
    41 
       
    42     def get_metas(self):
       
    43         search_info = ISearchManagerInfo(self.request.root, None)
       
    44         yield LinkMeta('search', 'application/opensearchdescription+xml',
       
    45                        href=absolute_url(self.request.root, self.request, 'opensearch.xml'),
       
    46                        title=II18n(search_info).query_attribute('name', request=self.request))
       
    47 
       
    48 
       
    49 @view_config(name='opensearch.xml', context=ISiteRoot, request_type=IPyAMSUserLayer,
       
    50              renderer='templates/opensearch.pt')
       
    51 class OpenSearchDescriptionView(object):
       
    52     """Site root Opensearch description"""
       
    53 
       
    54     def __init__(self, request):
       
    55         self.request = request
       
    56         self.context = request.context
       
    57 
       
    58     def __call__(self):
       
    59         self.request.response.content_type = 'application/opensearchdescription+xml'
       
    60         return {}
       
    61 
       
    62     @property
       
    63     def search_info(self):
       
    64         search_info = ISearchManagerInfo(self.context, None)
       
    65         if (search_info is None) or (search_info.target is None):
       
    66             raise NotFound()
       
    67         return search_info