class ManageUploadFilterSet(filters.FilterSet): q = fields.SearchFilter(search_fields=[ "track__title", "track__album__title", "track__artist__name", "source", ]) class Meta: model = music_models.Upload fields = ["q", "track__album", "track__artist", "track"]
class AlbumFilter(filters.FilterSet): playable = filters.BooleanFilter(name="_", method="filter_playable") q = fields.SearchFilter(search_fields=["title", "artist__name" "source"]) class Meta: model = models.Album fields = ["playable", "q", "artist"] def filter_playable(self, queryset, name, value): actor = utils.get_actor_from_request(self.request) return queryset.playable_by(actor, value)
class LibraryFilter(filters.FilterSet): q = fields.SearchFilter(search_fields=["name"], ) scope = common_filters.ActorScopeFilter( actor_field="actor", distinct=True, library_field="pk", ) class Meta: model = models.Library fields = ["privacy_level"]
class TrackFavoriteFilter(moderation_filters.HiddenContentFilterSet): q = fields.SearchFilter( search_fields=["track__title", "track__artist__name", "track__album__title"] ) scope = common_filters.ActorScopeFilter(actor_field="user__actor", distinct=True) class Meta: model = models.TrackFavorite fields = ["user", "q", "scope"] hidden_content_fields_mapping = moderation_filters.USER_FILTER_CONFIG[ "TRACK_FAVORITE" ]
class ManageInvitationFilterSet(filters.FilterSet): q = fields.SearchFilter(search_fields=["owner__username", "code", "owner__email"]) is_open = filters.BooleanFilter(method="filter_is_open") class Meta: model = users_models.Invitation fields = ["q", "is_open"] def filter_is_open(self, queryset, field_name, value): if value is None: return queryset return queryset.open(value)
class TagFilter(filters.FilterSet): q = fields.SearchFilter(search_fields=["name"]) ordering = django_filters.OrderingFilter( fields=( ("name", "name"), ("creation_date", "creation_date"), ("__size", "length"), ) ) class Meta: model = models.Tag fields = {"name": ["exact", "startswith"]}
class ArtistFilter(filters.FilterSet): q = fields.SearchFilter(search_fields=["name"]) playable = filters.BooleanFilter(name="_", method="filter_playable") class Meta: model = models.Artist fields = { "name": ["exact", "iexact", "startswith", "icontains"], "playable": "exact", } def filter_playable(self, queryset, name, value): actor = utils.get_actor_from_request(self.request) return queryset.playable_by(actor, value)
class ChannelFilter(moderation_filters.HiddenContentFilterSet): q = fields.SearchFilter(search_fields=[ "artist__name", "actor__summary", "actor__preferred_username" ]) tag = TAG_FILTER scope = common_filters.ActorScopeFilter(actor_field="attributed_to", distinct=True) subscribed = django_filters.BooleanFilter(field_name="_", method="filter_subscribed") external = django_filters.BooleanFilter(field_name="_", method="filter_external") ordering = django_filters.OrderingFilter( # tuple-mapping retains order fields=( ("creation_date", "creation_date"), ("artist__modification_date", "modification_date"), ("?", "random"), )) class Meta: model = models.Channel fields = [] hidden_content_fields_mapping = moderation_filters.USER_FILTER_CONFIG[ "CHANNEL"] def filter_subscribed(self, queryset, name, value): if not self.request.user.is_authenticated: return queryset.none() emitted_follows = self.request.user.actor.emitted_follows.exclude( target__channel__isnull=True) query = Q(actor__in=emitted_follows.values_list("target", flat=True)) if value is True: return queryset.filter(query) else: return queryset.exclude(query) def filter_external(self, queryset, name, value): query = Q( attributed_to=actors.get_service_actor(), actor__preferred_username__startswith="rssfeed-", ) if value is True: queryset = queryset.filter(query) if value is False: queryset = queryset.exclude(query) return queryset
class ManageUserFilterSet(filters.FilterSet): q = fields.SearchFilter(search_fields=["username", "email", "name"]) class Meta: model = users_models.User fields = [ "q", "is_active", "privacy_level", "is_staff", "is_superuser", "permission_upload", "permission_library", "permission_settings", "permission_federation", ]
class ArtistFilter( RelatedFilterSet, LibraryFilterSet, audio_filters.IncludeChannelsFilterSet, moderation_filters.HiddenContentFilterSet, ): q = fields.SearchFilter(search_fields=["name"], fts_search_fields=["body_text"]) playable = filters.BooleanFilter(field_name="_", method="filter_playable") has_albums = filters.BooleanFilter(field_name="_", method="filter_has_albums") tag = TAG_FILTER scope = common_filters.ActorScopeFilter( actor_field="tracks__uploads__library__actor", distinct=True, library_field="tracks__uploads__library", ) ordering = django_filters.OrderingFilter(fields=( ("id", "id"), ("name", "name"), ("creation_date", "creation_date"), ("modification_date", "modification_date"), ("?", "random"), ("tag_matches", "related"), )) class Meta: model = models.Artist fields = { "name": ["exact", "iexact", "startswith", "icontains"], "mbid": ["exact"], } hidden_content_fields_mapping = moderation_filters.USER_FILTER_CONFIG[ "ARTIST"] include_channels_field = "channel" library_filter_field = "track__artist" def filter_playable(self, queryset, name, value): actor = utils.get_actor_from_request(self.request) return queryset.playable_by(actor, value).distinct() def filter_has_albums(self, queryset, name, value): if value is True: return queryset.filter(albums__isnull=False) else: return queryset.filter(albums__isnull=True)
class FollowFilter(django_filters.FilterSet): pending = django_filters.CharFilter(method="filter_pending") ordering = django_filters.OrderingFilter( # tuple-mapping retains order fields=( ("creation_date", "creation_date"), ("modification_date", "modification_date"), )) q = fields.SearchFilter( search_fields=["actor__domain", "actor__preferred_username"]) class Meta: model = models.Follow fields = ["approved", "pending", "q"] def filter_pending(self, queryset, field_name, value): if value.lower() in ["true", "1", "yes"]: queryset = queryset.filter(approved__isnull=True) return queryset
class AlbumFilter( RelatedFilterSet, ChannelFilterSet, LibraryFilterSet, audio_filters.IncludeChannelsFilterSet, moderation_filters.HiddenContentFilterSet, ): playable = filters.BooleanFilter(field_name="_", method="filter_playable") q = fields.SearchFilter( search_fields=["title", "artist__name"], fts_search_fields=["body_text", "artist__body_text"], ) tag = TAG_FILTER scope = common_filters.ActorScopeFilter( actor_field="tracks__uploads__library__actor", distinct=True, library_field="tracks__uploads__library", ) ordering = django_filters.OrderingFilter(fields=( ("creation_date", "creation_date"), ("release_date", "release_date"), ("title", "title"), ("artist__modification_date", "artist__modification_date"), ("?", "random"), ("tag_matches", "related"), )) class Meta: model = models.Album fields = ["artist", "mbid"] hidden_content_fields_mapping = moderation_filters.USER_FILTER_CONFIG[ "ALBUM"] include_channels_field = "artist__channel" channel_filter_field = "track__album" library_filter_field = "track__album" def filter_playable(self, queryset, name, value): actor = utils.get_actor_from_request(self.request) return queryset.playable_by(actor, value)
class ManageInstancePolicyFilterSet(filters.FilterSet): q = fields.SearchFilter( search_fields=[ "summary", "target_domain__name", "target_actor__username", "target_actor__domain__name", ] ) target_domain = filters.CharFilter("target_domain__name") target_account_domain = filters.CharFilter("target_actor__domain__name") target_account_username = filters.CharFilter("target_actor__preferred_username") class Meta: model = moderation_models.InstancePolicy fields = [ "block_all", "silence_activity", "silence_notifications", "reject_media", ]
class TrackFilter( ChannelFilterSet, LibraryFilterSet, audio_filters.IncludeChannelsFilterSet, moderation_filters.HiddenContentFilterSet, ): q = fields.SearchFilter( search_fields=["title", "album__title", "artist__name"], fts_search_fields=["body_text", "artist__body_text", "album__body_text"], ) playable = filters.BooleanFilter(field_name="_", method="filter_playable") tag = TAG_FILTER id = common_filters.MultipleQueryFilter(coerce=int) scope = common_filters.ActorScopeFilter( actor_field="uploads__library__actor", distinct=True ) class Meta: model = models.Track fields = { "title": ["exact", "iexact", "startswith", "icontains"], "playable": ["exact"], "id": ["exact"], "artist": ["exact"], "album": ["exact"], "license": ["exact"], "scope": ["exact"], "mbid": ["exact"], } hidden_content_fields_mapping = moderation_filters.USER_FILTER_CONFIG["TRACK"] include_channels_field = "artist__channel" channel_filter_field = "track" library_filter_field = "track" def filter_playable(self, queryset, name, value): actor = utils.get_actor_from_request(self.request) return queryset.playable_by(actor, value).distinct()
class ManageTagFilterSet(filters.FilterSet): q = fields.SearchFilter(search_fields=["name"]) class Meta: model = tags_models.Tag fields = ["q"]