mirror of https://github.com/doccano/doccano.git
pythonannotation-tooldatasetsactive-learningtext-annotationdatasetnatural-language-processingdata-labelingmachine-learning
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
1.8 KiB
56 lines
1.8 KiB
from django.db.models import Count, Q, QuerySet
|
|
from django_filters.rest_framework import BooleanFilter, CharFilter, FilterSet
|
|
|
|
from .models import Example
|
|
|
|
|
|
class ExampleFilter(FilterSet):
|
|
confirmed = BooleanFilter(field_name="states", method="filter_by_state")
|
|
label = CharFilter(method="filter_by_label")
|
|
|
|
def filter_by_state(self, queryset, field_name, is_confirmed: bool):
|
|
queryset = queryset.annotate(
|
|
num_confirm=Count(
|
|
expression=field_name,
|
|
filter=Q(**{f"{field_name}__confirmed_by": self.request.user})
|
|
| Q(project__collaborative_annotation=True),
|
|
)
|
|
)
|
|
if is_confirmed:
|
|
queryset = queryset.filter(num_confirm__gte=1)
|
|
else:
|
|
queryset = queryset.filter(num_confirm__lte=0)
|
|
return queryset
|
|
|
|
def filter_by_label(self, queryset: QuerySet, field_name: str, label: str) -> QuerySet:
|
|
"""Filter examples by a given label name.
|
|
|
|
This performs filtering on all of the following labels at once:
|
|
- categories
|
|
- spans
|
|
- relations
|
|
- bboxes
|
|
- segmentations
|
|
|
|
Todo: Consider project type to make filtering more efficient.
|
|
|
|
Args:
|
|
queryset (QuerySet): QuerySet to filter.
|
|
field_name (str): This equals to `label`.
|
|
label (str): The label name to filter.
|
|
|
|
Returns:
|
|
QuerySet: Filtered examples.
|
|
"""
|
|
queryset = queryset.filter(
|
|
Q(categories__label__text=label)
|
|
| Q(spans__label__text=label)
|
|
| Q(relations__type__text=label)
|
|
| Q(bboxes__label__text=label)
|
|
| Q(segmentations__label__text=label)
|
|
)
|
|
return queryset
|
|
|
|
class Meta:
|
|
model = Example
|
|
fields = ("project", "text", "created_at", "updated_at", "label")
|