From a2f62effa3b352baa84d791555248625e13d6b3e Mon Sep 17 00:00:00 2001 From: gh-pedrotpo Date: Mon, 4 Nov 2024 13:02:49 -0500 Subject: [PATCH] feat: change profile filter to add name and urlpath query --- .../baseapp_profiles/graphql/filters.py | 24 +++++++++++ .../baseapp_profiles/graphql/object_types.py | 9 +---- .../tests/test_get_queries.py | 40 +++++++++++++++++++ baseapp-profiles/setup.cfg | 2 +- 4 files changed, 67 insertions(+), 8 deletions(-) create mode 100644 baseapp-profiles/baseapp_profiles/graphql/filters.py diff --git a/baseapp-profiles/baseapp_profiles/graphql/filters.py b/baseapp-profiles/baseapp_profiles/graphql/filters.py new file mode 100644 index 00000000..ef8da931 --- /dev/null +++ b/baseapp-profiles/baseapp_profiles/graphql/filters.py @@ -0,0 +1,24 @@ +import django_filters +import swapper +from django.db.models import Q + +Profile = swapper.load_model("baseapp_profiles", "Profile") + + +class ProfileFilter(django_filters.FilterSet): + q = django_filters.CharFilter(method="filter_q") + + order_by = django_filters.OrderingFilter( + fields=( + ("created", "created"), + ("followers_count__total", "followers_count_total"), + ("following_count__total", "following_count_total"), + ) + ) + + class Meta: + model = Profile + fields = ["q", "order_by"] + + def filter_q(self, queryset, name, value): + return queryset.filter(Q(name__icontains=value) | Q(url_paths__path__icontains=value)) diff --git a/baseapp-profiles/baseapp_profiles/graphql/object_types.py b/baseapp-profiles/baseapp_profiles/graphql/object_types.py index 9f39f558..d31137f9 100644 --- a/baseapp-profiles/baseapp_profiles/graphql/object_types.py +++ b/baseapp-profiles/baseapp_profiles/graphql/object_types.py @@ -1,4 +1,3 @@ -import django_filters import graphene import swapper from baseapp_auth.graphql import PermissionsInterface @@ -13,6 +12,8 @@ from graphene import relay from graphene_django.filter import DjangoFilterConnectionField +from .filters import ProfileFilter + Profile = swapper.load_model("baseapp_profiles", "Profile") ProfileUserRole = swapper.load_model("baseapp_profiles", "ProfileUserRole") @@ -41,12 +42,6 @@ class ProfileInterface(relay.Node): profile = graphene.Field(get_object_type_for_model(Profile)) -class ProfileFilter(django_filters.FilterSet): - class Meta: - model = Profile - fields = ["name"] - - class ProfileMetadata(AbstractMetadataObjectType): @property def meta_title(self): diff --git a/baseapp-profiles/baseapp_profiles/tests/test_get_queries.py b/baseapp-profiles/baseapp_profiles/tests/test_get_queries.py index 81ec3ad0..1559a77e 100644 --- a/baseapp-profiles/baseapp_profiles/tests/test_get_queries.py +++ b/baseapp-profiles/baseapp_profiles/tests/test_get_queries.py @@ -1,5 +1,7 @@ import pytest import swapper +from baseapp_pages.tests.factories import URLPathFactory +from django.contrib.contenttypes.models import ContentType from .factories import ProfileFactory @@ -22,6 +24,18 @@ } """ +SEARCH_PROFILES_BY_QUERY_PARAM = """ + query AllProfiles($q: String!) { + allProfiles(q: $q) { + edges { + node { + id + } + } + } + } +""" + def test_profile_metadata(graphql_user_client, image_djangofile): profile = ProfileFactory(image=image_djangofile) @@ -128,3 +142,29 @@ def test_another_user_cant_view_members(graphql_user_client): content = response.json() assert content["data"]["profile"]["members"] + + +def test_search_profiles(graphql_user_client): + profile1 = ProfileFactory(name="David") + profile2 = ProfileFactory(name="Daniel") + profile3 = ProfileFactory(name="Mark") + profile4 = ProfileFactory(name="John") + profile5 = ProfileFactory(name="Donald") + urlPath1 = URLPathFactory(path="danger.john", is_active=True, language=None) + profile_content_type = ContentType.objects.get_for_model(Profile) + urlPath1.target_content_type = profile_content_type + urlPath1.target_object_id = profile4.id + urlPath1.save() + urlPath1.refresh_from_db() + profile4.refresh_from_db() + + response = graphql_user_client(SEARCH_PROFILES_BY_QUERY_PARAM, variables={"q": "da"}) + content = response.json() + profiles = [ + id for id in [edge["node"]["id"] for edge in content["data"]["allProfiles"]["edges"]] + ] + assert profile1.relay_id in profiles + assert profile2.relay_id in profiles + assert profile3.relay_id not in profiles + assert profile4.relay_id in profiles + assert profile5.relay_id not in profiles diff --git a/baseapp-profiles/setup.cfg b/baseapp-profiles/setup.cfg index 449e3fa0..9f224bea 100644 --- a/baseapp-profiles/setup.cfg +++ b/baseapp-profiles/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = baseapp_profiles -version = 0.3.0 +version = 0.3.1 description = BaseApp Profiles long_description = file: README.md long_description_content_type = text/markdown