2021-02-28 16:19:41 +01:00
|
|
|
from django.db.models import Q
|
2022-03-11 10:55:51 -08:00
|
|
|
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
|
|
|
|
2022-03-11 10:55:51 -08:00
|
|
|
from .models import Correspondent
|
|
|
|
|
from .models import Document
|
|
|
|
|
from .models import DocumentType
|
|
|
|
|
from .models import Log
|
2022-05-19 23:42:25 +02:00
|
|
|
from .models import StoragePath
|
2022-03-11 10:55:51 -08:00
|
|
|
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"]
|
2020-10-25 23:03:02 +01:00
|
|
|
DATE_KWARGS = ["year", "month", "day", "date__gt", "gt", "date__lt", "lt"]
|
2018-09-23 15:38:31 +01:00
|
|
|
|
|
|
|
|
|
2017-01-01 16:31:46 +00: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
|
|
|
|
|
|
|
|
|
2017-01-01 16:31: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}
|
2017-01-01 16:31:46 +00:00
|
|
|
|
|
|
|
|
|
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):
|
2022-05-06 09:04:08 -07:00
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
2021-02-28 16:19:41 +01:00
|
|
|
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))
|
2021-02-28 16:19:41 +01:00
|
|
|
else:
|
|
|
|
|
return qs
|
|
|
|
|
|
|
|
|
|
|
2017-01-01 16:31:46 +00:00
|
|
|
class DocumentFilterSet(FilterSet):
|
|
|
|
|
|
2020-10-25 23:03:02 +01:00
|
|
|
is_tagged = BooleanFilter(
|
2022-03-11 10:55:51 -08:00
|
|
|
label="Is tagged",
|
|
|
|
|
field_name="tags",
|
|
|
|
|
lookup_expr="isnull",
|
|
|
|
|
exclude=True,
|
2018-09-23 15:38:31 +01:00
|
|
|
)
|
2016-03-12 20:45:13 +00: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()
|
|
|
|
|
|
2021-02-28 16:19:41 +01:00
|
|
|
title_content = TitleContentFilter()
|
|
|
|
|
|
2018-09-02 21:26:06 +01:00
|
|
|
class Meta:
|
2016-03-12 20:45:13 +00:00
|
|
|
model = Document
|
2017-01-01 16:31:46 +00:00
|
|
|
fields = {
|
2018-09-23 15:38:31 +01:00
|
|
|
"title": CHAR_KWARGS,
|
2020-10-21 12:16:25 +02:00
|
|
|
"content": CHAR_KWARGS,
|
2020-10-25 23:03:02 +01:00
|
|
|
"archive_serial_number": INT_KWARGS,
|
|
|
|
|
"created": DATE_KWARGS,
|
|
|
|
|
"added": DATE_KWARGS,
|
|
|
|
|
"modified": DATE_KWARGS,
|
2020-12-25 19:01:46 +01:00
|
|
|
"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,
|
2020-12-25 19:01:46 +01:00
|
|
|
"document_type": ["isnull"],
|
2020-10-21 12:16:25 +02:00
|
|
|
"document_type__id": ID_KWARGS,
|
2020-10-25 23:03:02 +01:00
|
|
|
"document_type__name": CHAR_KWARGS,
|
2022-05-19 23:42:25 +02:00
|
|
|
"storage_path": ["isnull"],
|
|
|
|
|
"storage_path__id": ID_KWARGS,
|
|
|
|
|
"storage_path__name": CHAR_KWARGS,
|
2017-01-01 16:31:46 +00:00
|
|
|
}
|
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}
|
2022-05-19 23:42:25 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class StoragePathFilterSet(FilterSet):
|
|
|
|
|
class Meta:
|
|
|
|
|
model = StoragePath
|
|
|
|
|
fields = {
|
|
|
|
|
"name": CHAR_KWARGS,
|
|
|
|
|
"path": CHAR_KWARGS,
|
|
|
|
|
}
|