svthalia/concrexit

View on GitHub
website/events/api/v2/filters.py

Summary

Maintainability
D
1 day
Test Coverage
from rest_framework import filters

from utils.snippets import extract_date_range


class EventDateFilter(filters.BaseFilterBackend):
    """Allows you to filter by event start/end dates."""

    def filter_queryset(self, request, queryset, view):
        start, end = extract_date_range(request, allow_empty=True)

        if start is not None:
            queryset = queryset.filter(end__gte=start)
        if end is not None:
            queryset = queryset.filter(start__lte=end)

        return queryset

    def get_schema_operation_parameters(self, view):
        return [
            {
                "name": "start",
                "required": False,
                "in": "query",
                "description": "Filter events by ISO date, starting with this parameter (i.e. 2021-03-30T04:20:00) where `event.end >= value`",
                "schema": {
                    "type": "string",
                },
            },
            {
                "name": "end",
                "required": False,
                "in": "query",
                "description": "Filter events by ISO date, ending with this parameter (i.e. 2021-05-16T13:37:00) where `event.start <= value`",
                "schema": {
                    "type": "string",
                },
            },
        ]


class CategoryFilter(filters.BaseFilterBackend):
    """Allows you to filter by category."""

    def filter_queryset(self, request, queryset, view):
        category = request.query_params.get("category", None)

        if category:
            queryset = queryset.filter(category__in=category.split(","))

        return queryset

    def get_schema_operation_parameters(self, view):
        return [
            {
                "name": "category",
                "required": False,
                "in": "query",
                "description": "Filter by category, accepts a comma separated list",
                "schema": {
                    "type": "string",
                },
            }
        ]


class OrganiserFilter(filters.BaseFilterBackend):
    """Allows you to filter by organiser id."""

    def filter_queryset(self, request, queryset, view):
        organiser = request.query_params.get("organiser", None)

        if organiser:
            queryset = queryset.filter(organisers__in=[organiser])

        return queryset

    def get_schema_operation_parameters(self, view):
        return [
            {
                "name": "organiser",
                "required": False,
                "in": "query",
                "description": "Filter by organiser id",
                "schema": {
                    "type": "number",
                },
            }
        ]