コード例 #1
0
ファイル: index.py プロジェクト: PixelJonas/papermerge-core
def search(request):
    # 'qa' is search term from "advanced search form"
    search_term = request.GET.get('q') or request.GET.get('qa')
    tags_list = request.GET.getlist('tag')
    tags_op = request.GET.get('tags_op')
    folder_id = request.GET.get('folder', None)
    folder = None
    descendant_ids = []
    backend = get_search_backend()

    results_folders = backend.search(search_term, Folder)
    results_docs = backend.search(search_term, Page)

    if folder_id:
        try:
            folder = BaseTreeNode.objects.get(id=folder_id)
        except BaseTreeNode.DoesNotExist:
            pass

    if folder:
        descendant_ids = [node.id for node in folder.get_descendants()]

    if results_docs:
        qs_docs = BaseTreeNode.objects.filter(
            id__in=[p.document.basetreenode_ptr_id for p in results_docs])
    elif search_term:
        qs_docs = BaseTreeNode.objects.none()
    else:
        qs_docs = BaseTreeNode.objects.all()

    if descendant_ids:
        qs_docs = qs_docs.filter(id__in=descendant_ids)

    if tags_list:
        # all tags
        if tags_op == 'any':
            qs_docs = qs_docs.filter(tags__name__in=tags_list).distinct()
        else:  # tags_op == all
            for tag in tags_list:
                qs_docs = qs_docs.filter(tags__name__in=[tag]).distinct()

    nodes_perms = request.user.get_perms_dict(qs_docs, Access.ALL_PERMS)

    qs_docs = [
        node for node in qs_docs.prefetch_related('tags')
        if nodes_perms[node.id].get(Access.PERM_READ, False)
    ]

    # filter out all documents for which current user
    # does not has read access

    return render(
        request, "admin/search.html", {
            'results_docs': qs_docs,
            'results_folders': results_folders.results(),
            'search_term': search_term,
            'tags_list': tags_list,
            'folder': folder,
            'tags_op': tags_op
        })
コード例 #2
0
ファイル: index.py プロジェクト: jeffnst/papermerge
def search(request):
    search_term = request.GET.get('q')
    backend = get_search_backend()

    results_folders = backend.search(search_term, Folder)
    results_docs = backend.search(search_term, Page)

    qs_docs = BaseTreeNode.objects.filter(
        id__in=[
            p.document.basetreenode_ptr_id for p in results_docs
        ]
    )

    qs_docs = [
        node for node in qs_docs.all()
        if request.user.has_perm(Access.PERM_READ, node)
    ]

    # filter out all documents for which current user
    # does not has read access

    return render(
        request,
        "admin/search.html",
        {
            'results_docs': qs_docs,
            'results_folders': results_folders.results(),
            'search_term': search_term
        }
    )
コード例 #3
0
ファイル: test_search.py プロジェクト: zhang56/papermerge
    def test_search_is_not_case_sensitive(self):
        """
        UT to double check that search by default is NOT case sensitive
        """
        backend = get_search_backend()

        doc = Document.create_document(
            title="document_c",
            file_name="document_c.pdf",
            size='1212',
            lang='DEU',
            user=self.user,
            page_count=5,
        )

        p = doc.pages.first()
        p.text = "search for TESTX text"
        p.save()

        result = backend.search("TESTX", Page)
        # it matches exact case
        self.assertEqual(result.count(), 1)

        result_case_insensitive_match = backend.search("testX", Page)
        # it matches lower and upper case mix
        self.assertEqual(result_case_insensitive_match.count(), 1)

        # no match for tst
        no_match = backend.search("tst", Page)
        self.assertEqual(no_match.count(), 0)
コード例 #4
0
def remove_object(instance):
    indexed_instance = get_indexed_instance(instance, check_exists=False)

    if indexed_instance:
        backend = get_search_backend()
        try:
            backend.delete(indexed_instance)
        except Exception:
            # Catch and log all errors
            logger.exception(
                "Exception while deleting %r from the '%s' search backend",
                indexed_instance, backend)
コード例 #5
0
def insert_or_update_object(instance):
    indexed_instance = get_indexed_instance(instance)

    if indexed_instance:
        backend = get_search_backend()
        try:
            backend.add(indexed_instance)
        except Exception:
            # Catch and log all errors
            logger.exception(
                "Exception while adding %r into the '%s' search backend",
                indexed_instance, backend)
コード例 #6
0
def search(request):
    search_term = request.GET.get('q')
    backend = get_search_backend()

    results_folders = backend.search(search_term, Folder)
    results_docs = backend.search(search_term, Page)

    qs_docs = BaseTreeNode.objects.filter(
        id__in=[p.document.basetreenode_ptr_id for p in results_docs])

    return render(
        request, "admin/search.html", {
            'results_docs': qs_docs.all(),
            'results_folders': results_folders.results(),
            'search_term': search_term
        })
コード例 #7
0
ファイル: queryset.py プロジェクト: gabrielke/papermerge-core
 def autocomplete(
     self,
     query,
     fields=None,
     operator=None,
     order_by_relevance=True,
 ):
     """
     This runs an autocomplete query on all the items in the QuerySet
     """
     search_backend = get_search_backend()
     return search_backend.autocomplete(
         query,
         self,
         fields=fields,
         operator=operator,
         order_by_relevance=order_by_relevance
     )
コード例 #8
0
ファイル: queryset.py プロジェクト: gabrielke/papermerge-core
 def search(
     self,
     query,
     fields=None,
     operator=None,
     order_by_relevance=True,
     partial_match=True,
 ):
     """
     This runs a search query on all the items in the QuerySet
     """
     search_backend = get_search_backend()
     return search_backend.search(
         query,
         self,
         fields=fields,
         operator=operator,
         order_by_relevance=order_by_relevance,
         partial_match=partial_match
     )
コード例 #9
0
    def get_qs_from_raw_sql(self, request, search_term):
        backend = get_search_backend()

        parent_id = request.GET.get('parent_id', False)

        ocr_lang = request.user.preferences['ocr__OCR_Language']
        ocr_lang = ocr_lang.lower()

        if parent_id:
            descendent_ids = [
                str(desc.id) for desc in
                models.BaseTreeNode.objects.get_queryset_descendants(
                    models.BaseTreeNode.objects.filter(id=parent_id))
            ]
        else:
            descendent_ids = []

        results = backend.search(search_term, models.Page)
        qs = models.BaseTreeNode.objects.filter(
            id__in=[p.document.basetreenode_ptr_id for p in results])

        return qs
コード例 #10
0
ファイル: test_search.py プロジェクト: zhang56/papermerge
 def test_search_backend(self):
     backend = get_search_backend()
     backend.search("Great doc!", Document)