paperless-ngx/src/documents/filters.py

126 lines
2.7 KiB
Python
Raw Normal View History

2020-11-04 00:01:08 +01:00
from django_filters.rest_framework import BooleanFilter, FilterSet, Filter
2016-03-09 01:05:46 +00:00
2020-11-02 01:24:56 +01:00
from .models import Correspondent, Document, Tag, DocumentType, Log
2016-03-09 01:05:46 +00:00
2020-10-21 12:16:25 +02:00
CHAR_KWARGS = ["istartswith", "iendswith", "icontains", "iexact"]
ID_KWARGS = ["in", "exact"]
2020-11-02 01:24:56 +01:00
INT_KWARGS = ["exact", "gt", "gte", "lt", "lte"]
DATE_KWARGS = ["year", "month", "day", "date__gt", "gt", "date__lt", "lt"]
2018-09-23 15:38:31 +01:00
class CorrespondentFilterSet(FilterSet):
2016-03-09 01:05:46 +00:00
2018-09-02 21:26:06 +01:00
class Meta:
2016-03-09 01:05:46 +00:00
model = Correspondent
fields = {
2020-10-21 12:16:25 +02:00
"name": CHAR_KWARGS
}
2016-03-09 01:05:46 +00:00
class TagFilterSet(FilterSet):
2016-03-09 01:05:46 +00:00
2018-09-02 21:26:06 +01:00
class Meta:
2016-03-09 01:05:46 +00:00
model = Tag
fields = {
2020-10-21 12:16:25 +02:00
"name": CHAR_KWARGS
}
2018-09-05 15:25:14 +02:00
class DocumentTypeFilterSet(FilterSet):
2018-12-11 12:26:44 +01:00
class Meta:
2018-09-05 15:25:14 +02:00
model = DocumentType
fields = {
2020-10-21 12:16:25 +02:00
"name": CHAR_KWARGS
2018-09-05 15:25:14 +02:00
}
2020-11-04 00:01:08 +01:00
class TagsFilter(Filter):
2020-12-07 15:25:06 +01:00
def __init__(self, exclude=False):
super(TagsFilter, self).__init__()
self.exclude = exclude
2020-11-04 00:01:08 +01:00
def filter(self, qs, value):
if not value:
return qs
try:
tag_ids = [int(x) for x in value.split(',')]
except ValueError:
return qs
for tag_id in tag_ids:
2020-12-07 15:25:06 +01:00
if self.exclude:
qs = qs.exclude(tags__id=tag_id)
else:
qs = qs.filter(tags__id=tag_id)
2020-11-04 00:01:08 +01:00
return qs
class InboxFilter(Filter):
def filter(self, qs, value):
if value == 'true':
return qs.filter(tags__is_inbox_tag=True)
elif value == 'false':
return qs.exclude(tags__is_inbox_tag=True)
else:
return qs
class DocumentFilterSet(FilterSet):
is_tagged = BooleanFilter(
2018-09-23 15:38:31 +01:00
label="Is tagged",
field_name="tags",
lookup_expr="isnull",
exclude=True
)
2020-11-04 00:01:08 +01:00
tags__id__all = TagsFilter()
2020-12-07 15:25:06 +01:00
tags__id__none = TagsFilter(exclude=True)
2020-11-04 00:01:08 +01:00
is_in_inbox = InboxFilter()
2018-09-02 21:26:06 +01:00
class Meta:
model = Document
fields = {
2018-09-23 15:38:31 +01:00
"title": CHAR_KWARGS,
2020-10-21 12:16:25 +02:00
"content": CHAR_KWARGS,
2018-09-23 15:38:31 +01:00
"archive_serial_number": INT_KWARGS,
"created": DATE_KWARGS,
"added": DATE_KWARGS,
"modified": DATE_KWARGS,
"correspondent": ["isnull"],
2020-10-21 12:16:25 +02:00
"correspondent__id": ID_KWARGS,
2018-09-23 15:38:31 +01:00
"correspondent__name": CHAR_KWARGS,
2020-10-21 12:16:25 +02:00
"tags__id": ID_KWARGS,
2018-09-23 15:38:31 +01:00
"tags__name": CHAR_KWARGS,
"document_type": ["isnull"],
2020-10-21 12:16:25 +02:00
"document_type__id": ID_KWARGS,
"document_type__name": CHAR_KWARGS,
}
2020-11-02 01:24:56 +01:00
class LogFilterSet(FilterSet):
class Meta:
model = Log
fields = {
"level": INT_KWARGS,
"created": DATE_KWARGS,
"group": ID_KWARGS
}