Skip to content
Snippets Groups Projects

Add API documentation

Merged Konrad Mohrfeldt requested to merge feature/api-docs into master
Files
6
+ 28
30
@@ -3,7 +3,7 @@ import datetime
from django_filters import rest_framework as filters
from django_filters import widgets
from django.contrib.auth.models import User
from django import forms
from django.db.models import Q, QuerySet
from django.utils import timezone
from program import models
@@ -19,18 +19,24 @@ class StaticFilterHelpTextMixin:
return _filter
class ModelMultipleChoiceFilter(filters.ModelMultipleChoiceFilter):
class IntegerInFilter(filters.BaseInFilter):
class QueryArrayWidget(widgets.QueryArrayWidget):
# see: https://github.com/carltongibson/django-filter/issues/1047
def value_from_datadict(self, data, files, name):
new_data = {}
for key in data.keys():
if len(data.getlist(key)) == 1 and "," in data[key]:
new_data[key] = data[key]
else:
new_data[key] = data.getlist(key)
return super().value_from_datadict(new_data, files, name)
field_class = forms.IntegerField
def __init__(self, *args, **kwargs):
kwargs.setdefault("widget", widgets.CSVWidget())
kwargs["lookup_expr"] = "in"
kwargs.setdefault("widget", self.QueryArrayWidget())
super().__init__(*args, **kwargs)
def get_filter_predicate(self, v):
# There is something wrong with using ModelMultipleChoiceFilter
# along the CSVWidget that causes lookups to fail.
# May be related to: https://github.com/carltongibson/django-filter/issues/1103
return super().get_filter_predicate([v.pk])
class ShowFilterSet(StaticFilterHelpTextMixin, filters.FilterSet):
active = filters.BooleanFilter(
@@ -38,37 +44,34 @@ class ShowFilterSet(StaticFilterHelpTextMixin, filters.FilterSet):
method="filter_active",
help_text=(
"Return only currently running shows (with timeslots in the future) if true "
"or past or upcoming shows if false.",
"or past or upcoming shows if false."
),
)
host = ModelMultipleChoiceFilter(
queryset=models.Host.objects.all(),
host = IntegerInFilter(
field_name="hosts",
help_text="Return only shows assigned to the given host(s).",
)
# TODO: replace `musicfocus` with `music_focus` when dashboard is updated
musicfocus = ModelMultipleChoiceFilter(
queryset=models.MusicFocus.objects.all(),
musicfocus = IntegerInFilter(
field_name="music_focus",
help_text="Return only shows with given music focus(es).",
)
owner = ModelMultipleChoiceFilter(
queryset=User.objects.all(),
owner = IntegerInFilter(
field_name="owners",
help_text="Return only shows that belong to the given owner(s).",
)
category = ModelMultipleChoiceFilter(
queryset=models.Category.objects.all(),
category = IntegerInFilter(
help_text="Return only shows of the given category or categories.",
)
language = ModelMultipleChoiceFilter(
queryset=models.Language.objects.all(),
language = IntegerInFilter(
help_text="Return only shows of the given language(s).",
)
topic = ModelMultipleChoiceFilter(
queryset=models.Topic.objects.all(),
topic = IntegerInFilter(
help_text="Return only shows of the given topic(s).",
)
type = IntegerInFilter(
help_text="Return only shows of a given type.",
)
public = filters.BooleanFilter(
field_name="is_public",
help_text="Return only shows that are public/non-public.",
@@ -102,9 +105,6 @@ class ShowFilterSet(StaticFilterHelpTextMixin, filters.FilterSet):
class Meta:
model = models.Show
help_texts = {
"type": "Return only shows of a given type.",
}
fields = [
"active",
"category",
@@ -213,14 +213,12 @@ class TimeSlotFilterSet(filters.FilterSet):
class NoteFilterSet(StaticFilterHelpTextMixin, filters.FilterSet):
ids = ModelMultipleChoiceFilter(
ids = IntegerInFilter(
field_name="id",
queryset=models.Note.objects.all(),
help_text="Return only notes matching the specified id(s).",
)
owner = ModelMultipleChoiceFilter(
owner = IntegerInFilter(
field_name="show__owners",
queryset=models.User.objects.all(),
help_text="Return only notes by show the specified owner(s): all notes the user may edit.",
)
Loading