Skip to content

Commit

Permalink
Merge pull request #531 from shawnadelic/omit-inactive-users-contacts…
Browse files Browse the repository at this point in the history
…-from-select-field

Admin: Omit inactive contacts and users from multiselect (SHUUP-2745)
  • Loading branch information
tulimaki committed Jun 9, 2016
2 parents eb9a192 + d37161c commit 5b19bd2
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 9 deletions.
18 changes: 18 additions & 0 deletions shoop/admin/views/select.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
from __future__ import unicode_literals

from django.apps import apps
from django.contrib.auth import get_user_model
from django.core.exceptions import FieldDoesNotExist
from django.db.models import Q
from django.http import JsonResponse
from django.utils.encoding import force_text
Expand All @@ -18,6 +20,14 @@
from shoop.core.models import Contact, Product


def _field_exists(model, field):
try:
model._meta.get_field(field)
return True
except FieldDoesNotExist:
return False


class MultiselectAjaxView(TemplateView):
model = None
search_fields = []
Expand All @@ -31,6 +41,12 @@ def init_search_fields(self, cls):
self.search_fields.append("email")
if isinstance(cls, Product):
self.search_fields.append("sku")
user_model = get_user_model()
if issubclass(cls, user_model):
if _field_exists(user_model, "username"):
self.search_fields.append("username")
if not _field_exists(user_model, "name"):
self.search_fields.remove("name")

def get_data(self, request, *args, **kwargs):
model_name = request.GET.get("model")
Expand All @@ -45,6 +61,8 @@ def get_data(self, request, *args, **kwargs):
keyword = request.GET.get("search")
for field in self.search_fields:
query |= Q(**{"%s__icontains" % field: keyword})
if issubclass(cls, Contact) or issubclass(cls, get_user_model()):
query &= Q(is_active=True)
objects = cls.objects.filter(query).distinct()
else:
objects = cls.objects.all()
Expand Down
49 changes: 40 additions & 9 deletions shoop_tests/admin/test_select_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,23 @@
import json
import pytest

from django.contrib.auth import get_user_model
from django.utils.translation import activate

from shoop.admin.views.select import MultiselectAjaxView
from shoop.core.models import CompanyContact, PersonContact
from shoop.core.models import CompanyContact, get_person_contact, PersonContact
from shoop.testing.factories import create_product
from shoop_tests.utils.fixtures import regular_user


def _get_search_results(rf, view, model_name, search_str):
request = rf.get("sa/search", {
"model": model_name,
"search": search_str
})
response = view(request)
assert response.status_code == 200
return json.loads(response.content.decode("utf-8")).get("results")


@pytest.mark.django_db
Expand Down Expand Up @@ -78,11 +90,30 @@ def test_ajax_select_view_with_contacts(rf, contact_cls):
assert len(results) == 0


def _get_search_results(rf, view, model_name, search_str):
request = rf.get("sa/search", {
"model": model_name,
"search": search_str
})
response = view(request)
assert response.status_code == 200
return json.loads(response.content.decode("utf-8")).get("results")
@pytest.mark.django_db
def test_multiselect_inactive_users_and_contacts(rf, regular_user):
"""
Make sure inactive users and contacts are filtered from search results.
"""
view = MultiselectAjaxView.as_view()
assert "joe" in regular_user.username

results = _get_search_results(rf, view, "auth.User", "joe")
assert len(results) == 1
assert results[0].get("id") == regular_user.id
assert results[0].get("name") == regular_user.username

contact = PersonContact.objects.create(first_name="Joe", last_name="Somebody")

results = _get_search_results(rf, view, "shoop.PersonContact", "joe")

assert len(results) == 1
assert results[0].get("id") == contact.id
assert results[0].get("name") == contact.name

contact.is_active = False
contact.save()

results = _get_search_results(rf, view, "shoop.PersonContact", "joe")

assert len(results) == 0

0 comments on commit 5b19bd2

Please sign in to comment.