paperless-ngx/src/documents/filters.py

137 lines
3.5 KiB
Python
Raw Normal View History

from django.db.models import Q
from django_filters.rest_framework import BooleanFilter
from django_filters.rest_framework import Filter
from django_filters.rest_framework import FilterSet
2016-03-09 01:05:46 +00:00
from .models import Correspondent
from .models import Document
from .models import DocumentType
from .models import Log
Feature: Dynamic document storage pathes (#916) * Added devcontainer * Add feature storage pathes * Exclude tests and add versioning * Check escaping * Check escaping * Check quoting * Echo * Escape * Escape : * Double escape \ * Escaping * Remove if * Escape colon * Missing \ * Esacpe : * Escape all * test * Remove sed * Fix exclude * Remove SED command * Add LD_LIBRARY_PATH * Adjusted to v1.7 * Updated test-cases * Remove devcontainer * Removed internal build-file * Run pre-commit * Corrected flak8 error * Adjusted to v1.7 * Updated test-cases * Corrected flak8 error * Adjusted to new plural translations * Small adjustments due to code-review backend * Adjusted line-break * Removed PAPERLESS prefix from settings variables * Corrected style change due to search+replace * First documentation draft * Revert changes to Pipfile * Add sphinx-autobuild with keep-outdated * Revert merge error that results in wrong storage path is evaluated * Adjust styles of generated files ... * Adds additional testing to cover dynamic storage path functionality * Remove unnecessary condition * Add hint to edit storage path dialog * Correct spelling of pathes to paths * Minor documentation tweaks * Minor typo * improving wrapping of filter editor buttons with new storage path button * Update .gitignore * Fix select border radius in non input-groups * Better storage path edit hint * Add note to edit storage path dialog re document_renamer * Add note to bulk edit storage path re document_renamer * Rename FILTER_STORAGE_DIRECTORY to PATH * Fix broken filter rule parsing * Show default storage if unspecified * Remove note re storage path on bulk edit * Add basic validation of filename variables Co-authored-by: Markus Kling <markus@markus-kling.net> Co-authored-by: Trenton Holmes <holmes.trenton@gmail.com> Co-authored-by: Michael Shamoon <4887959+shamoon@users.noreply.github.com> Co-authored-by: Quinn Casey <quinn@quinncasey.com>
2022-05-19 23:42:25 +02:00
from .models import StoragePath
from .models import Tag
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"]
2021-01-04 00:38:29 +01:00
INT_KWARGS = ["exact", "gt", "gte", "lt", "lte", "isnull"]
DATE_KWARGS = ["year", "month", "day", "date__gt", "gt", "date__lt", "lt"]
2018-09-23 15:38:31 +01:00
class CorrespondentFilterSet(FilterSet):
2018-09-02 21:26:06 +01:00
class Meta:
2016-03-09 01:05:46 +00:00
model = Correspondent
2022-02-27 15:26:41 +01:00
fields = {"name": CHAR_KWARGS}
2016-03-09 01:05:46 +00:00
class TagFilterSet(FilterSet):
2018-09-02 21:26:06 +01:00
class Meta:
2016-03-09 01:05:46 +00:00
model = Tag
2022-02-27 15:26:41 +01:00
fields = {"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
2022-02-27 15:26:41 +01:00
fields = {"name": CHAR_KWARGS}
2018-09-05 15:25:14 +02:00
2020-11-04 00:01:08 +01:00
class TagsFilter(Filter):
2021-01-20 18:35:03 -08:00
def __init__(self, exclude=False, in_list=False):
super().__init__()
2020-12-07 15:25:06 +01:00
self.exclude = exclude
2021-01-20 18:35:03 -08:00
self.in_list = in_list
2020-12-07 15:25:06 +01:00
2020-11-04 00:01:08 +01:00
def filter(self, qs, value):
if not value:
return qs
try:
2022-02-27 15:26:41 +01:00
tag_ids = [int(x) for x in value.split(",")]
2020-11-04 00:01:08 +01:00
except ValueError:
return qs
2021-01-20 18:35:03 -08:00
if self.in_list:
qs = qs.filter(tags__id__in=tag_ids).distinct()
else:
for tag_id in tag_ids:
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):
2022-02-27 15:26:41 +01:00
if value == "true":
2020-11-04 00:01:08 +01:00
return qs.filter(tags__is_inbox_tag=True)
2022-02-27 15:26:41 +01:00
elif value == "false":
2020-11-04 00:01:08 +01:00
return qs.exclude(tags__is_inbox_tag=True)
else:
return qs
class TitleContentFilter(Filter):
def filter(self, qs, value):
if value:
2022-02-27 15:26:41 +01:00
return qs.filter(Q(title__icontains=value) | Q(content__icontains=value))
else:
return qs
class DocumentFilterSet(FilterSet):
is_tagged = BooleanFilter(
label="Is tagged",
field_name="tags",
lookup_expr="isnull",
exclude=True,
2018-09-23 15:38:31 +01:00
)
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)
2021-01-20 18:35:03 -08:00
tags__id__in = TagsFilter(in_list=True)
2020-11-04 00:01:08 +01:00
is_in_inbox = InboxFilter()
title_content = TitleContentFilter()
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,
"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,
Feature: Dynamic document storage pathes (#916) * Added devcontainer * Add feature storage pathes * Exclude tests and add versioning * Check escaping * Check escaping * Check quoting * Echo * Escape * Escape : * Double escape \ * Escaping * Remove if * Escape colon * Missing \ * Esacpe : * Escape all * test * Remove sed * Fix exclude * Remove SED command * Add LD_LIBRARY_PATH * Adjusted to v1.7 * Updated test-cases * Remove devcontainer * Removed internal build-file * Run pre-commit * Corrected flak8 error * Adjusted to v1.7 * Updated test-cases * Corrected flak8 error * Adjusted to new plural translations * Small adjustments due to code-review backend * Adjusted line-break * Removed PAPERLESS prefix from settings variables * Corrected style change due to search+replace * First documentation draft * Revert changes to Pipfile * Add sphinx-autobuild with keep-outdated * Revert merge error that results in wrong storage path is evaluated * Adjust styles of generated files ... * Adds additional testing to cover dynamic storage path functionality * Remove unnecessary condition * Add hint to edit storage path dialog * Correct spelling of pathes to paths * Minor documentation tweaks * Minor typo * improving wrapping of filter editor buttons with new storage path button * Update .gitignore * Fix select border radius in non input-groups * Better storage path edit hint * Add note to edit storage path dialog re document_renamer * Add note to bulk edit storage path re document_renamer * Rename FILTER_STORAGE_DIRECTORY to PATH * Fix broken filter rule parsing * Show default storage if unspecified * Remove note re storage path on bulk edit * Add basic validation of filename variables Co-authored-by: Markus Kling <markus@markus-kling.net> Co-authored-by: Trenton Holmes <holmes.trenton@gmail.com> Co-authored-by: Michael Shamoon <4887959+shamoon@users.noreply.github.com> Co-authored-by: Quinn Casey <quinn@quinncasey.com>
2022-05-19 23:42:25 +02:00
"storage_path": ["isnull"],
"storage_path__id": ID_KWARGS,
"storage_path__name": CHAR_KWARGS,
}
2020-11-02 01:24:56 +01:00
class LogFilterSet(FilterSet):
class Meta:
model = Log
2022-02-27 15:26:41 +01:00
fields = {"level": INT_KWARGS, "created": DATE_KWARGS, "group": ID_KWARGS}
Feature: Dynamic document storage pathes (#916) * Added devcontainer * Add feature storage pathes * Exclude tests and add versioning * Check escaping * Check escaping * Check quoting * Echo * Escape * Escape : * Double escape \ * Escaping * Remove if * Escape colon * Missing \ * Esacpe : * Escape all * test * Remove sed * Fix exclude * Remove SED command * Add LD_LIBRARY_PATH * Adjusted to v1.7 * Updated test-cases * Remove devcontainer * Removed internal build-file * Run pre-commit * Corrected flak8 error * Adjusted to v1.7 * Updated test-cases * Corrected flak8 error * Adjusted to new plural translations * Small adjustments due to code-review backend * Adjusted line-break * Removed PAPERLESS prefix from settings variables * Corrected style change due to search+replace * First documentation draft * Revert changes to Pipfile * Add sphinx-autobuild with keep-outdated * Revert merge error that results in wrong storage path is evaluated * Adjust styles of generated files ... * Adds additional testing to cover dynamic storage path functionality * Remove unnecessary condition * Add hint to edit storage path dialog * Correct spelling of pathes to paths * Minor documentation tweaks * Minor typo * improving wrapping of filter editor buttons with new storage path button * Update .gitignore * Fix select border radius in non input-groups * Better storage path edit hint * Add note to edit storage path dialog re document_renamer * Add note to bulk edit storage path re document_renamer * Rename FILTER_STORAGE_DIRECTORY to PATH * Fix broken filter rule parsing * Show default storage if unspecified * Remove note re storage path on bulk edit * Add basic validation of filename variables Co-authored-by: Markus Kling <markus@markus-kling.net> Co-authored-by: Trenton Holmes <holmes.trenton@gmail.com> Co-authored-by: Michael Shamoon <4887959+shamoon@users.noreply.github.com> Co-authored-by: Quinn Casey <quinn@quinncasey.com>
2022-05-19 23:42:25 +02:00
class StoragePathFilterSet(FilterSet):
class Meta:
model = StoragePath
fields = {
"name": CHAR_KWARGS,
"path": CHAR_KWARGS,
}