示例#1
0
文件: views.py 项目: dudarev/cghub
    def get_context_data(self, **kwargs):
        context = super(SearchView, self).get_context_data(**kwargs)
        q = self.request.GET.get('q', '').strip()
        sort_by = self.request.GET.get('sort_by', DEFAULT_SORT_BY)
        offset, limit = paginator_params(self.request)
        # will be saved to cookie in get method
        self.paginator_limit = limit
        filters = get_filters_dict(self.request.GET)

        # set offset to zero if no results returned
        for offset in (offset, 0):
            if q:
                # search by ids first
                search = SearchByIDs(
                        ids=[q],
                        filters=filters,
                        request_cls=RequestDetail)
                if not search.is_empty():
                    results = search.get_results()
                    context['results'] = results[offset:offset + limit]
                    context['num_results'] = len(results)
                    return context
                else:
                    # FIXME: temporary hack to work around GNOS not quoting Solr query
                    if browser_text_search.useAllMetadataIndex:
                        filters.update({'all_metadata': browser_text_search.ws_query(q)})
                    else:
                        filters.update({'xml_text': '(%s)' % q})
                    context['search_notification'] = ('<strong>Warning:</strong> '
                            'these results were produced by a free text '
                            'word search of the metadata. The results maybe '
                            'be incomplete or inconsistent due to limited '
                            'amount of textual metadata available. Use the '
                            'filters to get a consistent set of results or '
                            'search for a particular identifier.')

            api_request = RequestDetail(
                    query=filters, sort_by=sort_by, offset=offset, limit=limit)
            results = []
            for result in api_request.call():
                results.append(result)
            context['num_results'] = api_request.hits
            context['results'] = results
            if api_request.hits != 0:
                break

        if context['num_results'] == 0:
            context['message'] = 'No results found.'

        return context
示例#2
0
文件: views.py 项目: dudarev/cghub
def cart_add_all_files(request):
    # 'Add all to cart' pressed
    form = AllItemsForm(request.POST)
    if form.is_valid():
        try:
            # calculate query
            raw_filters = form.cleaned_data['filters']
            filters = get_filters_dict(raw_filters)
            q = raw_filters.get('q')
            queries = []
            if q:
                # FIXME: temporary hack to work around GNOS not quoting Solr query
                # FIXME: this is temporary hack, need for multiple requests will be fixed at CGHub
                if browser_text_search.useAllMetadataIndex:
                    query = {'all_metadata': browser_text_search.ws_query(q)}
                    query.update(filters)
                    queries = [query]
                else:
                    query = {'xml_text': u"(%s)" % q}
                    query.update(filters)
                    queries = [query, {'analysis_id': q}]
            if not queries:
                queries = [filters]

            message_id = add_message(
                        request, 'info',
                        settings.ADDING_TO_CART_IN_PROGRESS_NOTIFICATION)
            try:
                with transaction.commit_on_success():
                    cart = Cart(request.session)
                    for query in queries:
                        api_request = RequestMinimal(query=query)
                        for result in api_request.call():
                            cart.add(result)
                        cart.update_stats()
                remove_message(request, message_id)
            except DatabaseError:
                remove_message(request, message_id)
                return {
                    'action': 'message',
                    'title': settings.DATABASE_ERROR_NOTIFICATION_TITLE,
                    'content': settings.DATABASE_ERROR_NOTIFICATION}
            return {'action': 'redirect', 'redirect': reverse('cart_page')}
        except Exception as e:
            cart_logger.error('Error while adding all files to cart: %s' % unicode(e))
    else:
        cart_logger.error('AllItemsForm not valid: %s' % unicode(form.errors))