コード例 #1
0
class ManageAlbumFilterSet(filters.FilterSet):
    q = fields.SmartSearchFilter(
        config=search.SearchConfig(
            search_fields={
                "title": {"to": "title"},
                "fid": {"to": "fid"},
                "artist": {"to": "artist__name"},
                "mbid": {"to": "mbid"},
            },
            filter_fields={
                "uuid": {"to": "uuid"},
                "artist_id": {"to": "artist_id", "field": forms.IntegerField()},
                "domain": {
                    "handler": lambda v: federation_utils.get_domain_query_from_url(v)
                },
                "library_id": {
                    "to": "tracks__uploads__library_id",
                    "field": forms.IntegerField(),
                    "distinct": True,
                },
                "tag": {"to": "tagged_items__tag__name", "distinct": True},
            },
        )
    )

    class Meta:
        model = music_models.Album
        fields = ["q", "title", "mbid", "fid", "artist"]
コード例 #2
0
class ManageChannelFilterSet(filters.FilterSet):
    q = fields.SmartSearchFilter(
        config=search.SearchConfig(
            search_fields={
                "name": {"to": "artist__name"},
                "username": {"to": "artist__name"},
                "fid": {"to": "artist__fid"},
                "rss": {"to": "rss_url"},
            },
            filter_fields={
                "uuid": {"to": "uuid"},
                "category": {"to": "artist__content_category"},
                "domain": {
                    "handler": lambda v: federation_utils.get_domain_query_from_url(
                        v, url_field="attributed_to__fid"
                    )
                },
                "tag": {"to": "artist__tagged_items__tag__name", "distinct": True},
                "account": get_actor_filter("attributed_to"),
            },
        )
    )

    class Meta:
        model = audio_models.Channel
        fields = ["q"]
コード例 #3
0
ファイル: filters.py プロジェクト: mayhem/funkwhale
class UploadFilter(audio_filters.IncludeChannelsFilterSet):
    library = filters.CharFilter("library__uuid")
    channel = filters.CharFilter("library__channel__uuid")
    track = filters.UUIDFilter("track__uuid")
    track_artist = filters.UUIDFilter("track__artist__uuid")
    album_artist = filters.UUIDFilter("track__album__artist__uuid")
    library = filters.UUIDFilter("library__uuid")
    playable = filters.BooleanFilter(field_name="_", method="filter_playable")
    scope = common_filters.ActorScopeFilter(
        actor_field="library__actor",
        distinct=True,
        library_field="library",
    )
    import_status = common_filters.MultipleQueryFilter(coerce=str)
    q = fields.SmartSearchFilter(config=search.SearchConfig(
        search_fields={
            "track_artist": {
                "to": "track__artist__name"
            },
            "album_artist": {
                "to": "track__album__artist__name"
            },
            "album": {
                "to": "track__album__title"
            },
            "title": {
                "to": "track__title"
            },
        },
        filter_fields={
            "artist": {
                "to": "track__artist__name__iexact"
            },
            "mimetype": {
                "to": "mimetype"
            },
            "album": {
                "to": "track__album__title__iexact"
            },
            "title": {
                "to": "track__title__iexact"
            },
            "status": {
                "to": "import_status"
            },
        },
    ))

    class Meta:
        model = models.Upload
        fields = [
            "import_status",
            "mimetype",
            "import_reference",
        ]
        include_channels_field = "track__artist__channel"

    def filter_playable(self, queryset, name, value):
        actor = utils.get_actor_from_request(self.request)
        return queryset.playable_by(actor, value)
コード例 #4
0
class ManageActorFilterSet(filters.FilterSet):
    q = fields.SmartSearchFilter(
        config=search.SearchConfig(
            search_fields={
                "name": {"to": "name"},
                "username": {"to": "preferred_username"},
                "email": {"to": "user__email"},
                "bio": {"to": "summary"},
                "type": {"to": "type"},
            },
            filter_fields={
                "uuid": {"to": "uuid"},
                "domain": {"to": "domain__name__iexact"},
                "username": {"to": "preferred_username__iexact"},
                "email": {"to": "user__email__iexact"},
            },
        )
    )
    local = filters.BooleanFilter(field_name="_", method="filter_local")

    class Meta:
        model = federation_models.Actor
        fields = ["q", "domain", "type", "manually_approves_followers", "local"]

    def filter_local(self, queryset, name, value):
        return queryset.local(value)
コード例 #5
0
ファイル: test_search.py プロジェクト: Steffo99/funkwhale-ryg
def test_search_config_query_filter_field_handler():
    s = search.SearchConfig(
        filter_fields={"account": {
            "handler": lambda v: Q(hello="world")
        }})

    cleaned = s.clean("account:noop")
    assert cleaned["filter_query"] == Q(hello="world")
コード例 #6
0
ファイル: filters.py プロジェクト: sbignell/funkwhale
class UploadFilter(filters.FilterSet):
    library = filters.CharFilter("library__uuid")
    track = filters.UUIDFilter("track__uuid")
    track_artist = filters.UUIDFilter("track__artist__uuid")
    album_artist = filters.UUIDFilter("track__album__artist__uuid")
    library = filters.UUIDFilter("library__uuid")
    playable = filters.BooleanFilter(name="_", method="filter_playable")
    q = fields.SmartSearchFilter(config=search.SearchConfig(
        search_fields={
            "track_artist": {
                "to": "track__artist__name"
            },
            "album_artist": {
                "to": "track__album__artist__name"
            },
            "album": {
                "to": "track__album__title"
            },
            "title": {
                "to": "track__title"
            },
        },
        filter_fields={
            "artist": {
                "to": "track__artist__name__iexact"
            },
            "mimetype": {
                "to": "mimetype"
            },
            "album": {
                "to": "track__album__title__iexact"
            },
            "title": {
                "to": "track__title__iexact"
            },
            "status": {
                "to": "import_status"
            },
        },
    ))

    class Meta:
        model = models.Upload
        fields = [
            "playable",
            "import_status",
            "mimetype",
            "track",
            "track_artist",
            "album_artist",
            "library",
            "import_reference",
        ]

    def filter_playable(self, queryset, name, value):
        actor = utils.get_actor_from_request(self.request)
        return queryset.playable_by(actor, value)
コード例 #7
0
ファイル: test_search.py プロジェクト: Steffo99/funkwhale-ryg
def test_search_config_query_filter_field():
    s = search.SearchConfig(filter_fields={
        "account": {
            "to": "noop",
            "field": forms.BooleanField()
        }
    })

    cleaned = s.clean("account:true")
    assert cleaned["filter_query"] == Q(noop=True)
コード例 #8
0
def test_search_config_filter(query, expected):
    s = search.SearchConfig(filter_fields={
        "user": {
            "to": "user__username__iexact"
        },
        "status": {
            "to": "status"
        },
    })

    cleaned = s.clean(query)
    assert cleaned["filter_query"] == expected
コード例 #9
0
class ManageUploadFilterSet(filters.FilterSet):
    ordering = django_filters.OrderingFilter(
        # tuple-mapping retains order
        fields=(
            ("creation_date", "creation_date"),
            ("modification_date", "modification_date"),
            ("accessed_date", "accessed_date"),
            ("size", "size"),
            ("bitrate", "bitrate"),
            ("duration", "duration"),
        )
    )
    q = fields.SmartSearchFilter(
        config=search.SearchConfig(
            search_fields={
                "source": {"to": "source"},
                "fid": {"to": "fid"},
                "track": {"to": "track__title"},
                "album": {"to": "track__album__title"},
                "artist": {"to": "track__artist__name"},
            },
            filter_fields={
                "uuid": {"to": "uuid"},
                "library_id": {"to": "library_id", "field": forms.IntegerField()},
                "artist_id": {"to": "track__artist_id", "field": forms.IntegerField()},
                "album_id": {"to": "track__album_id", "field": forms.IntegerField()},
                "track_id": {"to": "track__id", "field": forms.IntegerField()},
                "domain": {"to": "library__actor__domain_id"},
                "import_reference": {"to": "import_reference"},
                "type": {"to": "mimetype"},
                "status": {"to": "import_status"},
                "account": get_actor_filter("library__actor"),
                "privacy_level": {"to": "library__privacy_level"},
            },
        )
    )
    domain = filters.CharFilter("library__actor__domain_id")
    privacy_level = filters.CharFilter("library__privacy_level")

    class Meta:
        model = music_models.Upload
        fields = [
            "q",
            "fid",
            "privacy_level",
            "domain",
            "mimetype",
            "import_reference",
            "import_status",
        ]
コード例 #10
0
def test_search_config_query(query, expected):
    s = search.SearchConfig(search_fields={
        "field1": {
            "to": "f1"
        },
        "field2": {
            "to": "f2"
        },
        "field3": {
            "to": "f3"
        },
    })

    cleaned = s.clean(query)
    assert cleaned["search_query"] == expected
コード例 #11
0
class ManageNoteFilterSet(filters.FilterSet):
    q = fields.SmartSearchFilter(
        config=search.SearchConfig(
            search_fields={"summary": {"to": "summary"}},
            filter_fields={
                "uuid": {"to": "uuid"},
                "author": get_actor_filter("author"),
                "target": common_filters.get_generic_relation_filter(
                    "target", moderation_utils.NOTE_TARGET_FIELDS
                ),
            },
        )
    )

    class Meta:
        model = moderation_models.Note
        fields = ["q"]
コード例 #12
0
class ManageLibraryFilterSet(filters.FilterSet):
    ordering = django_filters.OrderingFilter(
        # tuple-mapping retains order
        fields=(
            ("creation_date", "creation_date"),
            ("_uploads_count", "uploads_count"),
            ("followers_count", "followers_count"),
        )
    )
    q = fields.SmartSearchFilter(
        config=search.SearchConfig(
            search_fields={
                "name": {"to": "name"},
                "description": {"to": "description"},
                "fid": {"to": "fid"},
            },
            filter_fields={
                "uuid": {"to": "uuid"},
                "artist_id": {
                    "to": "uploads__track__artist_id",
                    "field": forms.IntegerField(),
                    "distinct": True,
                },
                "album_id": {
                    "to": "uploads__track__album_id",
                    "field": forms.IntegerField(),
                    "distinct": True,
                },
                "track_id": {
                    "to": "uploads__track__id",
                    "field": forms.IntegerField(),
                    "distinct": True,
                },
                "domain": {"to": "actor__domain_id"},
                "account": get_actor_filter("actor"),
                "privacy_level": {"to": "privacy_level"},
            },
        )
    )
    domain = filters.CharFilter("actor__domain_id")

    class Meta:
        model = music_models.Library
        fields = ["q", "name", "fid", "privacy_level", "domain"]
コード例 #13
0
class ManageUserRequestFilterSet(filters.FilterSet):
    q = fields.SmartSearchFilter(
        config=search.SearchConfig(
            search_fields={
                "username": {"to": "submitter__preferred_username"},
                "uuid": {"to": "uuid"},
            },
            filter_fields={
                "uuid": {"to": "uuid"},
                "id": {"to": "id"},
                "status": {"to": "status"},
                "category": {"to": "type"},
                "submitter": get_actor_filter("submitter"),
                "assigned_to": get_actor_filter("assigned_to"),
            },
        )
    )

    class Meta:
        model = moderation_models.UserRequest
        fields = ["q", "status", "type"]
コード例 #14
0
ファイル: filters.py プロジェクト: mayhem/funkwhale
class ManageUserFilterSet(filters.FilterSet):
    q = fields.SmartSearchFilter(
        config=search.SearchConfig(
            search_fields={
                "name": {"to": "name"},
                "username": {"to": "username"},
                "email": {"to": "email"},
            }
        )
    )

    class Meta:
        model = users_models.User
        fields = [
            "is_active",
            "privacy_level",
            "is_staff",
            "is_superuser",
            "permission_library",
            "permission_settings",
            "permission_moderation",
        ]
コード例 #15
0
class ManageReportFilterSet(filters.FilterSet):
    q = fields.SmartSearchFilter(
        config=search.SearchConfig(
            search_fields={"summary": {"to": "summary"}},
            filter_fields={
                "uuid": {"to": "uuid"},
                "id": {"to": "id"},
                "resolved": common_filters.get_boolean_filter("is_handled"),
                "domain": {"to": "target_owner__domain_id"},
                "category": {"to": "type"},
                "submitter": get_actor_filter("submitter"),
                "assigned_to": get_actor_filter("assigned_to"),
                "target_owner": get_actor_filter("target_owner"),
                "submitter_email": {"to": "submitter_email"},
                "target": common_filters.get_generic_relation_filter(
                    "target", moderation_serializers.TARGET_CONFIG
                ),
            },
        )
    )

    class Meta:
        model = moderation_models.Report
        fields = ["q", "is_handled", "type", "submitter_email"]
コード例 #16
0
def test_search_config_is(query, expected):
    s = search.SearchConfig(
        types=[("album", music_models.Album), ("artist", music_models.Artist)])

    cleaned = s.clean(query)
    assert cleaned["types"] == expected