Skip to content

Commit

Permalink
fix(sales-dashboard): prevent 500 error when user doesn't exist on sa…
Browse files Browse the repository at this point in the history
…les dashboard search (#4757)
  • Loading branch information
matthewelwell authored Oct 28, 2024
1 parent eb38828 commit 282d82f
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 6 deletions.
28 changes: 22 additions & 6 deletions api/sales_dashboard/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
from organisations.models import (
Organisation,
OrganisationSubscriptionInformationCache,
UserOrganisation,
)
from organisations.tasks import (
update_organisation_subscription_information_cache,
Expand All @@ -53,6 +54,7 @@
DEFAULT_ORGANISATION_SORT_DIRECTION = "DESC"

email_regex = re.compile(r"^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$")
domain_regex = re.compile(r"^[a-z0-9.-]+\.[a-z]{2,}$")


@method_decorator(
Expand Down Expand Up @@ -126,14 +128,28 @@ def get_context_data(self, **kwargs):
return data

def _build_search_query(self, search_term: str) -> Q:
if email_regex.match(search_term.lower()):
# Assume that the search is for the email of a given user
user = FFAdminUser.objects.filter(email__iexact=search_term).first()
search_term = search_term.lower()
if email_regex.match(search_term) and (
user := FFAdminUser.objects.filter(email__iexact=search_term).first()
):
return Q(id__in=user.organisations.values_list("id", flat=True))
else:
query = Q()

return Q(name__icontains=search_term) | Q(
subscription__subscription_id=search_term
)
if domain_regex.match(search_term):
matching_users = FFAdminUser.objects.filter(
email__iendswith=search_term
)
org_ids = UserOrganisation.objects.filter(
user__in=matching_users
).values_list("organisation_id", flat=True)
query = query & Q(id__in=org_ids)

return (
query
| Q(name__icontains=search_term)
| Q(subscription__subscription_id__iexact=search_term)
)


@staff_member_required
Expand Down
39 changes: 39 additions & 0 deletions api/tests/unit/sales_dashboard/test_unit_sales_dashboard_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,45 @@ def test_list_organisations_search_by_user_email(
assert list(response.context_data["organisation_list"]) == [organisation]


def test_list_organisations_search_by_user_email_for_non_existent_user(
organisation: Organisation,
superuser_client: Client,
) -> None:
# Given
domain = "bar.com"
user = FFAdminUser.objects.create(email=f"foo@{domain}")
user.add_organisation(organisation)
search_term = f"baz@{domain}"

url = "%s?search=%s" % (reverse("sales_dashboard:index"), search_term)

# When
response = superuser_client.get(url)

# Then
assert response.status_code == 200
assert list(response.context_data["organisation_list"]) == []


def test_list_organisations_search_by_domain(
organisation: Organisation,
superuser_client: Client,
) -> None:
# Given
domain = "bar.com"
user = FFAdminUser.objects.create(email=f"foo@{domain}")
user.add_organisation(organisation)

url = "%s?search=%s" % (reverse("sales_dashboard:index"), domain)

# When
response = superuser_client.get(url)

# Then
assert response.status_code == 200
assert list(response.context_data["organisation_list"]) == [organisation]


def test_list_organisations_filter_plan(
organisation: Organisation,
chargebee_subscription: Subscription,
Expand Down

0 comments on commit 282d82f

Please sign in to comment.