mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-11-04 03:27:12 -05:00 
			
		
		
		
	Added basic filtering + search
This commit is contained in:
		
							parent
							
								
									bbc85ece31
								
							
						
					
					
						commit
						1ef119eb82
					
				@ -1,11 +1,13 @@
 | 
				
			|||||||
Django==1.9.2
 | 
					Django==1.9.2
 | 
				
			||||||
 | 
					Pillow==3.1.1
 | 
				
			||||||
 | 
					django-crispy-forms==1.6.0
 | 
				
			||||||
django-extensions==1.6.1
 | 
					django-extensions==1.6.1
 | 
				
			||||||
 | 
					django-filter==0.12.0
 | 
				
			||||||
djangorestframework==3.3.2
 | 
					djangorestframework==3.3.2
 | 
				
			||||||
python-dotenv==0.3.0
 | 
					 | 
				
			||||||
filemagic==1.6
 | 
					filemagic==1.6
 | 
				
			||||||
langdetect==1.0.5
 | 
					langdetect==1.0.5
 | 
				
			||||||
Pillow==3.1.1
 | 
					 | 
				
			||||||
pyocr==0.3.1
 | 
					pyocr==0.3.1
 | 
				
			||||||
python-dateutil==2.4.2
 | 
					python-dateutil==2.4.2
 | 
				
			||||||
 | 
					python-dotenv==0.3.0
 | 
				
			||||||
python-gnupg==0.3.8
 | 
					python-gnupg==0.3.8
 | 
				
			||||||
pytz==2015.7
 | 
					pytz==2015.7
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										97
									
								
								src/documents/filters.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								src/documents/filters.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,97 @@
 | 
				
			|||||||
 | 
					import django_filters
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from rest_framework import filters
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from .models import Document, Correspondent, Tag
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class DocumentFilter(filters.FilterSet):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    title__startswith = django_filters.CharFilter(
 | 
				
			||||||
 | 
					        name="title", lookup_type="startswith",
 | 
				
			||||||
 | 
					        label="Title starts with (case sensitive)"
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    title__istartswith = django_filters.CharFilter(
 | 
				
			||||||
 | 
					        name="title", lookup_type="istartswith",
 | 
				
			||||||
 | 
					        label="Title starts with (case insensitive)"
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    title__endswith = django_filters.CharFilter(
 | 
				
			||||||
 | 
					        name="title", lookup_type="endswith",
 | 
				
			||||||
 | 
					        label="Title ends with (case sensitive)"
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    title__iendswith = django_filters.CharFilter(
 | 
				
			||||||
 | 
					        name="title", lookup_type="endswith",
 | 
				
			||||||
 | 
					        label="Title ends with (case insensitive)"
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    title__contains = django_filters.CharFilter(
 | 
				
			||||||
 | 
					        name="title", lookup_type="contains",
 | 
				
			||||||
 | 
					        label="Title contains (case sensitive)"
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    title__icontains = django_filters.CharFilter(
 | 
				
			||||||
 | 
					        name="title", lookup_type="icontains",
 | 
				
			||||||
 | 
					        label="Title contains (case insensitive)"
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    content__contains = django_filters.CharFilter(
 | 
				
			||||||
 | 
					        name="content", lookup_type="contains")
 | 
				
			||||||
 | 
					    content__icontains = django_filters.CharFilter(
 | 
				
			||||||
 | 
					        name="content", lookup_type="icontains")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    class Meta(object):
 | 
				
			||||||
 | 
					        model = Document
 | 
				
			||||||
 | 
					        fields = ["title"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class SluggableFilter(filters.FilterSet):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    name__startswith = django_filters.CharFilter(
 | 
				
			||||||
 | 
					        name="name", lookup_type="startswith",
 | 
				
			||||||
 | 
					        label="Name starts with (case sensitive)"
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    name__istartswith = django_filters.CharFilter(
 | 
				
			||||||
 | 
					        name="name", lookup_type="istartswith",
 | 
				
			||||||
 | 
					        label="Name starts with (case insensitive)"
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    name__endswith = django_filters.CharFilter(
 | 
				
			||||||
 | 
					        name="name", lookup_type="endswith",
 | 
				
			||||||
 | 
					        label="Name ends with (case sensitive)"
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    name__iendswith = django_filters.CharFilter(
 | 
				
			||||||
 | 
					        name="name", lookup_type="endswith",
 | 
				
			||||||
 | 
					        label="Name ends with (case insensitive)"
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    name__contains = django_filters.CharFilter(
 | 
				
			||||||
 | 
					        name="name", lookup_type="contains",
 | 
				
			||||||
 | 
					        label="Name contains (case sensitive)"
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    name__icontains = django_filters.CharFilter(
 | 
				
			||||||
 | 
					        name="name", lookup_type="icontains",
 | 
				
			||||||
 | 
					        label="Name contains (case insensitive)"
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    slug__istartswith = django_filters.CharFilter(
 | 
				
			||||||
 | 
					        name="slug", lookup_type="istartswith",
 | 
				
			||||||
 | 
					        label="Slug starts with (case insensitive)"
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    slug__iendswith = django_filters.CharFilter(
 | 
				
			||||||
 | 
					        name="slug", lookup_type="endswith",
 | 
				
			||||||
 | 
					        label="Slug ends with (case insensitive)"
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    slug__icontains = django_filters.CharFilter(
 | 
				
			||||||
 | 
					        name="slug", lookup_type="icontains",
 | 
				
			||||||
 | 
					        label="Slug contains (case insensitive)"
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class CorrespondentFilter(SluggableFilter):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    class Meta(object):
 | 
				
			||||||
 | 
					        model = Correspondent
 | 
				
			||||||
 | 
					        fields = ["name"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TagFilter(SluggableFilter):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    class Meta(object):
 | 
				
			||||||
 | 
					        model = Tag
 | 
				
			||||||
 | 
					        fields = ["name"]
 | 
				
			||||||
@ -3,6 +3,7 @@ from django.http import HttpResponse
 | 
				
			|||||||
from django.views.decorators.csrf import csrf_exempt
 | 
					from django.views.decorators.csrf import csrf_exempt
 | 
				
			||||||
from django.views.generic import FormView, DetailView, TemplateView
 | 
					from django.views.generic import FormView, DetailView, TemplateView
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from rest_framework import filters
 | 
				
			||||||
from rest_framework.mixins import (
 | 
					from rest_framework.mixins import (
 | 
				
			||||||
    RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, ListModelMixin)
 | 
					    RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, ListModelMixin)
 | 
				
			||||||
from rest_framework.pagination import PageNumberPagination
 | 
					from rest_framework.pagination import PageNumberPagination
 | 
				
			||||||
@ -12,6 +13,7 @@ from rest_framework.viewsets import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
from paperless.db import GnuPG
 | 
					from paperless.db import GnuPG
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from .filters import DocumentFilter, CorrespondentFilter, TagFilter
 | 
				
			||||||
from .forms import UploadForm
 | 
					from .forms import UploadForm
 | 
				
			||||||
from .models import Correspondent, Tag, Document, Log
 | 
					from .models import Correspondent, Tag, Document, Log
 | 
				
			||||||
from .serialisers import (
 | 
					from .serialisers import (
 | 
				
			||||||
@ -92,6 +94,8 @@ class CorrespondentViewSet(ModelViewSet):
 | 
				
			|||||||
    serializer_class = CorrespondentSerializer
 | 
					    serializer_class = CorrespondentSerializer
 | 
				
			||||||
    pagination_class = StandardPagination
 | 
					    pagination_class = StandardPagination
 | 
				
			||||||
    permission_classes = (IsAuthenticated,)
 | 
					    permission_classes = (IsAuthenticated,)
 | 
				
			||||||
 | 
					    filter_backends = (filters.DjangoFilterBackend,)
 | 
				
			||||||
 | 
					    filter_class = CorrespondentFilter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TagViewSet(ModelViewSet):
 | 
					class TagViewSet(ModelViewSet):
 | 
				
			||||||
@ -100,6 +104,8 @@ class TagViewSet(ModelViewSet):
 | 
				
			|||||||
    serializer_class = TagSerializer
 | 
					    serializer_class = TagSerializer
 | 
				
			||||||
    pagination_class = StandardPagination
 | 
					    pagination_class = StandardPagination
 | 
				
			||||||
    permission_classes = (IsAuthenticated,)
 | 
					    permission_classes = (IsAuthenticated,)
 | 
				
			||||||
 | 
					    filter_backends = (filters.DjangoFilterBackend,)
 | 
				
			||||||
 | 
					    filter_class = TagFilter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class DocumentViewSet(RetrieveModelMixin,
 | 
					class DocumentViewSet(RetrieveModelMixin,
 | 
				
			||||||
@ -112,6 +118,9 @@ class DocumentViewSet(RetrieveModelMixin,
 | 
				
			|||||||
    serializer_class = DocumentSerializer
 | 
					    serializer_class = DocumentSerializer
 | 
				
			||||||
    pagination_class = StandardPagination
 | 
					    pagination_class = StandardPagination
 | 
				
			||||||
    permission_classes = (IsAuthenticated,)
 | 
					    permission_classes = (IsAuthenticated,)
 | 
				
			||||||
 | 
					    filter_backends = (filters.DjangoFilterBackend, filters.SearchFilter)
 | 
				
			||||||
 | 
					    filter_class = DocumentFilter
 | 
				
			||||||
 | 
					    search_fields = ("title", "correspondent__name", "content")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class LogViewSet(ReadOnlyModelViewSet):
 | 
					class LogViewSet(ReadOnlyModelViewSet):
 | 
				
			||||||
@ -120,3 +129,4 @@ class LogViewSet(ReadOnlyModelViewSet):
 | 
				
			|||||||
    serializer_class = LogSerializer
 | 
					    serializer_class = LogSerializer
 | 
				
			||||||
    pagination_class = StandardPagination
 | 
					    pagination_class = StandardPagination
 | 
				
			||||||
    permission_classes = (IsAuthenticated,)
 | 
					    permission_classes = (IsAuthenticated,)
 | 
				
			||||||
 | 
					    filter_backends = (filters.DjangoFilterBackend,)
 | 
				
			||||||
 | 
				
			|||||||
@ -46,6 +46,7 @@ INSTALLED_APPS = [
 | 
				
			|||||||
    "documents",
 | 
					    "documents",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    "rest_framework",
 | 
					    "rest_framework",
 | 
				
			||||||
 | 
					    "crispy_forms",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user