src/pyams_content/shared/common/zmi/search.py
changeset 1405 a123fc2a6f69
parent 1395 8184dadefc8b
child 1407 85e615286c7a
equal deleted inserted replaced
1404:8be1cfb23338 1405:a123fc2a6f69
    21 from zope.intid.interfaces import IIntIds
    21 from zope.intid.interfaces import IIntIds
    22 from zope.schema import Choice, Datetime
    22 from zope.schema import Choice, Datetime
    23 
    23 
    24 from pyams_catalog.query import CatalogResultSet
    24 from pyams_catalog.query import CatalogResultSet
    25 from pyams_content.component.theme.interfaces import ICollectionsManager, \
    25 from pyams_content.component.theme.interfaces import ICollectionsManager, \
    26     ICollectionsManagerTarget, ITagsManager, IThemesManager, IThemesManagerTarget
    26     ITagsManager, IThemesManager, IThemesManagerTarget
    27 from pyams_content.profile.interfaces import IAdminProfile
    27 from pyams_content.profile.interfaces import IAdminProfile
    28 from pyams_content.shared.common import CONTENT_TYPES
    28 from pyams_content.shared.common import CONTENT_TYPES
    29 from pyams_content.shared.common.interfaces import IBaseSharedTool, \
    29 from pyams_content.shared.common.interfaces import IBaseSharedTool, \
    30     SHARED_TOOL_WORKFLOW_STATES_VOCABULARY
    30     SHARED_TOOL_WORKFLOW_STATES_VOCABULARY
    31 from pyams_content.shared.common.interfaces.types import DATA_TYPES_VOCABULARY, ITypedSharedTool
    31 from pyams_content.shared.common.interfaces.types import DATA_TYPES_VOCABULARY, ITypedSharedTool
    99 
    99 
   100     @property
   100     @property
   101     def data_attributes(self):
   101     def data_attributes(self):
   102         attributes = super(SharedToolQuickSearchResults, self).data_attributes
   102         attributes = super(SharedToolQuickSearchResults, self).data_attributes
   103         attributes['table'] = {
   103         attributes['table'] = {
   104             'data-ams-datatable-sorting': '{0},{1}'.format(len(self.columns) - 1, self.dt_sort_order),
   104             'data-ams-datatable-sorting':
   105             'data-ams-datatable-display-length': IAdminProfile(self.request.principal).table_page_length
   105                 '{0},{1}'.format(len(self.columns) - 1, self.dt_sort_order),
       
   106             'data-ams-datatable-display-length':
       
   107                 IAdminProfile(self.request.principal).table_page_length
   106         }
   108         }
   107         return attributes
   109         return attributes
   108 
   110 
   109 
   111 
   110 @adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolQuickSearchResults), provides=IValues)
   112 @adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolQuickSearchResults),
       
   113                 provides=IValues)
   111 class SharedToolQuickSearchValues(ContextRequestViewAdapter):
   114 class SharedToolQuickSearchValues(ContextRequestViewAdapter):
   112     """Shared tool quick search results view values adapter"""
   115     """Shared tool quick search results view values adapter"""
   113 
   116 
   114     @property
   117     @property
   115     def values(self):
   118     def values(self):
   124             else:
   127             else:
   125                 params = Eq(catalog['parents'], intids.register(self.context)) & \
   128                 params = Eq(catalog['parents'], intids.register(self.context)) & \
   126                          Any(catalog['content_type'], CONTENT_TYPES.keys())
   129                          Any(catalog['content_type'], CONTENT_TYPES.keys())
   127                 query_params = Eq(catalog['oid'], sequence.get_full_oid(query))
   130                 query_params = Eq(catalog['oid'], sequence.get_full_oid(query))
   128                 negotiator = get_utility(INegotiator)
   131                 negotiator = get_utility(INegotiator)
   129                 for lang in {self.request.registry.settings.get('pyramid.default_locale_name', 'en'),
   132                 for lang in {self.request.registry.settings.get('pyramid.default_locale_name',
       
   133                                                                 'en'),
   130                              self.request.locale_name,
   134                              self.request.locale_name,
   131                              negotiator.server_language} | negotiator.offered_languages:
   135                              negotiator.server_language} | negotiator.offered_languages:
   132                     index_name = 'title:{0}'.format(lang)
   136                     index_name = 'title:{0}'.format(lang)
   133                     if index_name in catalog:
   137                     if index_name in catalog:
   134                         index = catalog[index_name]
   138                         index = catalog[index_name]
   135                         if index.check_query(query):
   139                         if index.check_query(query):
   136                             query_params |= Contains(index, ' and '.join((w+'*' for w in query.split())))
   140                             query_params |= Contains(index,
       
   141                                                      ' and '.join((w+'*' for w in query.split())))
   137                 params &= query_params
   142                 params &= query_params
   138             return unique(map(get_last_version,
   143             return unique(map(get_last_version,
   139                               CatalogResultSet(CatalogQuery(catalog).query(params,
   144                               CatalogResultSet(CatalogQuery(catalog).query(
   140                                                                            sort_index='modified_date',
   145                                   params, sort_index='modified_date', reverse=True))))
   141                                                                            reverse=True))))
       
   142         else:
   146         else:
   143             return ()
   147             return ()
   144 
   148 
   145 
   149 
   146 #
   150 #
   248             manager = ICollectionsManager(self.request.root)
   252             manager = ICollectionsManager(self.request.root)
   249             widget.thesaurus_name = manager.thesaurus_name
   253             widget.thesaurus_name = manager.thesaurus_name
   250             widget.extract_name = manager.extract_name
   254             widget.extract_name = manager.extract_name
   251 
   255 
   252 
   256 
   253 @adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolAdvancedSearchForm), provides=IContentSearch)
   257 @adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolAdvancedSearchForm),
       
   258                 provides=IContentSearch)
   254 class SharedToolAdvancedSearchFormSearchAdapter(ContextRequestViewAdapter):
   259 class SharedToolAdvancedSearchFormSearchAdapter(ContextRequestViewAdapter):
   255     """Shared tool adavanced search form search adapter"""
   260     """Shared tool adavanced search form search adapter"""
   256 
   261 
   257     def get_search_results(self, data):
   262     def get_search_results(self, data):
   258         intids = get_utility(IIntIds)
   263         intids = get_utility(IIntIds)
   265             if query.startswith('+'):
   270             if query.startswith('+'):
   266                 params &= Eq(catalog['oid'], sequence.get_full_oid(query))
   271                 params &= Eq(catalog['oid'], sequence.get_full_oid(query))
   267             else:
   272             else:
   268                 query_params = Eq(catalog['oid'], sequence.get_full_oid(query))
   273                 query_params = Eq(catalog['oid'], sequence.get_full_oid(query))
   269                 negotiator = get_utility(INegotiator)
   274                 negotiator = get_utility(INegotiator)
   270                 for lang in {self.request.registry.settings.get('pyramid.default_locale_name', 'en'),
   275                 for lang in {self.request.registry.settings.get('pyramid.default_locale_name',
       
   276                                                                 'en'),
   271                              self.request.locale_name,
   277                              self.request.locale_name,
   272                              negotiator.server_language} | negotiator.offered_languages:
   278                              negotiator.server_language} | negotiator.offered_languages:
   273                     index_name = 'title:{0}'.format(lang)
   279                     index_name = 'title:{0}'.format(lang)
   274                     if index_name in catalog:
   280                     if index_name in catalog:
   275                         index = catalog[index_name]
   281                         index = catalog[index_name]
   276                         if index.check_query(query):
   282                         if index.check_query(query):
   277                             query_params |= Contains(index, ' and '.join((w+'*' for w in query.split())))
   283                             query_params |= Contains(index,
       
   284                                                      ' and '.join((w+'*' for w in query.split())))
   278                 params &= query_params
   285                 params &= query_params
   279         if data.get('owner'):
   286         if data.get('owner'):
   280             params &= Eq(catalog['role:owner'], data['owner'])
   287             params &= Eq(catalog['role:owner'], data['owner'])
   281         if data.get('status'):
   288         if data.get('status'):
   282             params &= Eq(catalog['workflow_state'], data['status'])
   289             params &= Eq(catalog['workflow_state'], data['status'])
   300             tags = [intids.register(term) for term in data['collections']]
   307             tags = [intids.register(term) for term in data['collections']]
   301             params &= Any(catalog['collections'], tags)
   308             params &= Any(catalog['collections'], tags)
   302         if data.get('status'):
   309         if data.get('status'):
   303             return unique(map(lambda x: sorted(IWorkflowVersions(x).get_versions(data['status']),
   310             return unique(map(lambda x: sorted(IWorkflowVersions(x).get_versions(data['status']),
   304                                                key=lambda y: IZopeDublinCore(y).modified)[0],
   311                                                key=lambda y: IZopeDublinCore(y).modified)[0],
   305                               CatalogResultSet(CatalogQuery(catalog).query(params,
   312                               CatalogResultSet(CatalogQuery(catalog).query(
   306                                                                            sort_index='modified_date',
   313                                   params, sort_index='modified_date', reverse=True))))
   307                                                                            reverse=True))))
       
   308         else:
   314         else:
   309             return unique(map(get_last_version,
   315             return unique(map(get_last_version,
   310                               CatalogResultSet(CatalogQuery(catalog).query(params,
   316                               CatalogResultSet(CatalogQuery(catalog).query(
   311                                                                            sort_index='modified_date',
   317                                   params, sort_index='modified_date', reverse=True))))
   312                                                                            reverse=True))))
       
   313 
   318 
   314 
   319 
   315 @pagelet_config(name='advanced-search.html', context=IBaseSharedTool, layer=IPyAMSLayer,
   320 @pagelet_config(name='advanced-search.html', context=IBaseSharedTool, layer=IPyAMSLayer,
   316                 permission=VIEW_SYSTEM_PERMISSION)
   321                 permission=VIEW_SYSTEM_PERMISSION)
   317 class SharedToolAdvancedSearchView(SearchView):
   322 class SharedToolAdvancedSearchView(SearchView):
   318     """Shared tool advanced search view"""
   323     """Shared tool advanced search view"""
   319 
   324 
   320     search_form_factory = SharedToolAdvancedSearchForm
   325     search_form_factory = SharedToolAdvancedSearchForm
   321 
   326 
   322 
   327 
   323 @adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolAdvancedSearchView), provides=IPageHeader)
   328 @adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolAdvancedSearchView),
       
   329                 provides=IPageHeader)
   324 class SharedToolAdvancedSearchHeaderAdapter(DefaultPageHeaderAdapter):
   330 class SharedToolAdvancedSearchHeaderAdapter(DefaultPageHeaderAdapter):
   325     """Shared tool advanced search header adapter"""
   331     """Shared tool advanced search header adapter"""
   326 
   332 
   327     back_url = '#dashboard.html'
   333     back_url = '#dashboard.html'
   328     back_target = None
   334     back_target = None
   329 
   335 
   330     icon_class = 'fa fa-fw fa-search'
   336     icon_class = 'fa fa-fw fa-search'
   331 
   337 
   332 
   338 
   333 @view_config(name='advanced-search-results.html', context=IBaseSharedTool, request_type=IPyAMSLayer,
   339 @view_config(name='advanced-search-results.html', context=IBaseSharedTool,
   334              permission=VIEW_SYSTEM_PERMISSION)
   340              request_type=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION)
   335 @implementer(ISharedToolDashboardTable)
   341 @implementer(ISharedToolDashboardTable)
   336 class SharedToolAdvancedSearchResultsView(AdminView, SearchResultsView):
   342 class SharedToolAdvancedSearchResultsView(AdminView, SearchResultsView):
   337     """Shared tool advanced search results view"""
   343     """Shared tool advanced search results view"""
   338 
   344 
   339     title = _("Advanced search results")
   345     title = _("Advanced search results")
   348 
   354 
   349     @property
   355     @property
   350     def data_attributes(self):
   356     def data_attributes(self):
   351         attributes = super(SharedToolAdvancedSearchResultsView, self).data_attributes
   357         attributes = super(SharedToolAdvancedSearchResultsView, self).data_attributes
   352         attributes['table'] = {
   358         attributes['table'] = {
   353             'data-ams-datatable-sorting': "{0},{1}".format(len(self.columns) - 1, self.dt_sort_order),
   359             'data-ams-datatable-sorting':
   354             'data-ams-datatable-display-length': IAdminProfile(self.request.principal).table_page_length
   360                 "{0},{1}".format(len(self.columns) - 1, self.dt_sort_order),
       
   361             'data-ams-datatable-display-length':
       
   362                 IAdminProfile(self.request.principal).table_page_length
   355         }
   363         }
   356         return attributes
   364         return attributes
   357 
   365 
   358 
   366 
   359 @adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolAdvancedSearchResultsView), provides=IValues)
   367 @adapter_config(context=(IBaseSharedTool, IPyAMSLayer, SharedToolAdvancedSearchResultsView),
       
   368                 provides=IValues)
   360 class SearchResultsViewValuesAdapter(ContextRequestViewAdapter):
   369 class SearchResultsViewValuesAdapter(ContextRequestViewAdapter):
   361     """Search results view values adapter"""
   370     """Search results view values adapter"""
   362 
   371 
   363     @property
   372     @property
   364     def values(self):
   373     def values(self):