src/pyams_content/root/zmi/search.py
changeset 1395 8184dadefc8b
parent 1189 26b86361e20b
child 1407 85e615286c7a
equal deleted inserted replaced
1394:ed31bfceddda 1395:8184dadefc8b
    21 from zope.interface import implementer
    21 from zope.interface import implementer
    22 from zope.intid import IIntIds
    22 from zope.intid import IIntIds
    23 from zope.schema import Choice, Datetime, List
    23 from zope.schema import Choice, Datetime, List
    24 
    24 
    25 from pyams_catalog.query import CatalogResultSet
    25 from pyams_catalog.query import CatalogResultSet
       
    26 from pyams_content.component.theme import ICollectionsManager
    26 from pyams_content.component.theme.interfaces import ITagsManager
    27 from pyams_content.component.theme.interfaces import ITagsManager
    27 from pyams_content.profile.interfaces import IAdminProfile
    28 from pyams_content.profile.interfaces import IAdminProfile
    28 from pyams_content.root import ISiteRoot
    29 from pyams_content.root import ISiteRoot
    29 from pyams_content.shared.common import CONTENT_TYPES
    30 from pyams_content.shared.common import CONTENT_TYPES
    30 from pyams_content.shared.common.interfaces import CONTENT_TYPES_VOCABULARY
    31 from pyams_content.shared.common.interfaces import CONTENT_TYPES_VOCABULARY
   175                                required=False)
   176                                required=False)
   176 
   177 
   177     tags = ThesaurusTermsListField(title=_("Tags"),
   178     tags = ThesaurusTermsListField(title=_("Tags"),
   178                                    required=False)
   179                                    required=False)
   179 
   180 
       
   181     collections = ThesaurusTermsListField(title=_("Collections"),
       
   182                                           required=False)
       
   183 
   180 
   184 
   181 @template_config(template='templates/advanced-search.pt', layer=IPyAMSLayer)
   185 @template_config(template='templates/advanced-search.pt', layer=IPyAMSLayer)
   182 @implementer(IInnerPage)
   186 @implementer(IInnerPage)
   183 class SiteRootAdvancedSearchForm(SearchForm):
   187 class SiteRootAdvancedSearchForm(SearchForm):
   184     """Site root advanced search form"""
   188     """Site root advanced search form"""
   190         request.registry.notify(PageletCreatedEvent(self))
   194         request.registry.notify(PageletCreatedEvent(self))
   191         apply_skin(self.request, 'PyAMS admin skin')
   195         apply_skin(self.request, 'PyAMS admin skin')
   192 
   196 
   193     fields = field.Fields(ISiteRootAdvancedSearchFields)
   197     fields = field.Fields(ISiteRootAdvancedSearchFields)
   194     fields['tags'].widgetFactory = ThesaurusTermsTreeFieldWidget
   198     fields['tags'].widgetFactory = ThesaurusTermsTreeFieldWidget
       
   199     fields['collections'].widgetFactory = ThesaurusTermsTreeFieldWidget
   195     ajax_handler = 'advanced-search-results.html'
   200     ajax_handler = 'advanced-search-results.html'
   196 
   201 
   197     def updateWidgets(self, prefix=None):
   202     def updateWidgets(self, prefix=None):
   198         super(SiteRootAdvancedSearchForm, self).updateWidgets(prefix)
   203         super(SiteRootAdvancedSearchForm, self).updateWidgets(prefix)
   199         if 'tags' in self.widgets:
   204         if 'tags' in self.widgets:
   200             widget = self.widgets['tags']
   205             widget = self.widgets['tags']
   201             manager = ITagsManager(self.request.root)
   206             manager = ITagsManager(self.request.root)
       
   207             widget.thesaurus_name = manager.thesaurus_name
       
   208             widget.extract_name = manager.extract_name
       
   209         if 'collections' in self.widgets:
       
   210             widget = self.widgets['collections']
       
   211             manager = ICollectionsManager(self.request.root)
   202             widget.thesaurus_name = manager.thesaurus_name
   212             widget.thesaurus_name = manager.thesaurus_name
   203             widget.extract_name = manager.extract_name
   213             widget.extract_name = manager.extract_name
   204 
   214 
   205 
   215 
   206 @adapter_config(context=(ISiteRoot, IPyAMSLayer, SiteRootAdvancedSearchForm), provides=IContentSearch)
   216 @adapter_config(context=(ISiteRoot, IPyAMSLayer, SiteRootAdvancedSearchForm), provides=IContentSearch)
   221             if query.startswith('+'):
   231             if query.startswith('+'):
   222                 params &= Eq(catalog['oid'], sequence.get_full_oid(query))
   232                 params &= Eq(catalog['oid'], sequence.get_full_oid(query))
   223             else:
   233             else:
   224                 query_params = Eq(catalog['oid'], sequence.get_full_oid(query))
   234                 query_params = Eq(catalog['oid'], sequence.get_full_oid(query))
   225                 negotiator = get_utility(INegotiator)
   235                 negotiator = get_utility(INegotiator)
   226                 for lang in {self.request.registry.settings.get('pyramid.default_locale_name', 'en'),
   236                 for lang in {self.request.registry.settings.get('pyramid.default_locale_name',
       
   237                                                                 'en'),
   227                              self.request.locale_name,
   238                              self.request.locale_name,
   228                              negotiator.server_language} | negotiator.offered_languages:
   239                              negotiator.server_language} | negotiator.offered_languages:
   229                     index_name = 'title:{0}'.format(lang)
   240                     index_name = 'title:{0}'.format(lang)
   230                     if index_name in catalog:
   241                     if index_name in catalog:
   231                         index = catalog[index_name]
   242                         index = catalog[index_name]
   232                         if index.check_query(query):
   243                         if index.check_query(query):
   233                             query_params |= Contains(index, ' and '.join((w+'*' for w in query.split())))
   244                             query_params |= Contains(index, ' and '.join(
       
   245                                 (w + '*' for w in query.split())))
   234                 params &= query_params
   246                 params &= query_params
   235         if data.get('owner'):
   247         if data.get('owner'):
   236             params &= Eq(catalog['role:owner'], data['owner'])
   248             params &= Eq(catalog['role:owner'], data['owner'])
   237         if data.get('created_after'):
   249         if data.get('created_after'):
   238             params &= Ge(catalog['created_date'], data['created_after'])
   250             params &= Ge(catalog['created_date'], data['created_after'])
   243         if data.get('modified_before'):
   255         if data.get('modified_before'):
   244             params &= Le(catalog['modified_date'], data['modified_before'])
   256             params &= Le(catalog['modified_date'], data['modified_before'])
   245         if data.get('tags'):
   257         if data.get('tags'):
   246             tags = [intids.register(term) for term in data['tags']]
   258             tags = [intids.register(term) for term in data['tags']]
   247             params &= Any(catalog['tags'], tags)
   259             params &= Any(catalog['tags'], tags)
       
   260         if data.get('collections'):
       
   261             tags = [intids.register(term) for term in data['collections']]
       
   262             params &= Any(catalog['collections'], tags)
   248         return unique(map(get_last_version,
   263         return unique(map(get_last_version,
   249                           CatalogResultSet(CatalogQuery(catalog).query(params,
   264                           CatalogResultSet(CatalogQuery(catalog).query(params,
   250                                                                        sort_index='modified_date',
   265                                                                        sort_index='modified_date',
   251                                                                        reverse=True))))
   266                                                                        reverse=True))))
   252 
   267