funkwhale/api/funkwhale_api/common/fields.py

51 wiersze
1.4 KiB
Python
Czysty Zwykły widok Historia

2018-04-12 21:02:41 +00:00
import django_filters
2018-03-16 22:30:11 +00:00
from django.db import models
2018-07-03 06:13:13 +00:00
from . import search
2018-04-12 21:02:41 +00:00
2018-03-16 22:30:11 +00:00
PRIVACY_LEVEL_CHOICES = [
2018-06-09 13:36:16 +00:00
("me", "Only me"),
("followers", "Me and my followers"),
("instance", "Everyone on my instance, and my followers"),
("everyone", "Everyone, including people on other instances"),
2018-03-16 22:30:11 +00:00
]
def get_privacy_field():
return models.CharField(
2018-06-09 13:36:16 +00:00
max_length=30, choices=PRIVACY_LEVEL_CHOICES, default="instance"
)
def privacy_level_query(user, lookup_field="privacy_level", user_field="user"):
if user.is_anonymous:
2018-06-09 13:36:16 +00:00
return models.Q(**{lookup_field: "everyone"})
2018-06-09 13:36:16 +00:00
return models.Q(
**{"{}__in".format(lookup_field): ["instance", "everyone"]}
) | models.Q(**{lookup_field: "me", user_field: user})
2018-04-12 21:02:41 +00:00
class SearchFilter(django_filters.CharFilter):
def __init__(self, *args, **kwargs):
2018-06-09 13:36:16 +00:00
self.search_fields = kwargs.pop("search_fields")
2018-04-12 21:02:41 +00:00
super().__init__(*args, **kwargs)
def filter(self, qs, value):
if not value:
return qs
2018-07-03 06:13:13 +00:00
query = search.get_query(value, self.search_fields)
2018-04-12 21:02:41 +00:00
return qs.filter(query)
2018-07-03 06:13:13 +00:00
class SmartSearchFilter(django_filters.CharFilter):
def __init__(self, *args, **kwargs):
self.config = kwargs.pop("config")
super().__init__(*args, **kwargs)
def filter(self, qs, value):
if not value:
return qs
cleaned = self.config.clean(value)
return search.apply(qs, cleaned)