Skip to content
Snippets Groups Projects
fields.py 1.52 KiB
Newer Older
  • Learn to ignore specific revisions
  • import django_filters
    
    from django import forms
    
    from django.db import models
    
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    from . import search
    
    PRIVACY_LEVEL_CHOICES = [
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        ("me", "Only me"),
        ("followers", "Me and my followers"),
        ("instance", "Everyone on my instance, and my followers"),
        ("everyone", "Everyone, including people on other instances"),
    
    ]
    
    
    def get_privacy_field():
        return models.CharField(
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            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:
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            return models.Q(**{lookup_field: "everyone"})
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        return models.Q(
    
            **{"{}__in".format(lookup_field): ["instance", "everyone"]}
        ) | models.Q(**{lookup_field: "me", user_field: user})
    
    
    
    class SearchFilter(django_filters.CharFilter):
        def __init__(self, *args, **kwargs):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            self.search_fields = kwargs.pop("search_fields")
    
            super().__init__(*args, **kwargs)
    
        def filter(self, qs, value):
            if not value:
                return qs
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            query = search.get_query(value, self.search_fields)
    
            return qs.filter(query)
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    
    
    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
    
            try:
                cleaned = self.config.clean(value)
            except forms.ValidationError:
                return qs.none()
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            return search.apply(qs, cleaned)