Skip to content

Commit

Permalink
refactor: Refactor ChangelistView to match latest Django implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
last-partizan committed Aug 16, 2023
1 parent da5f2b5 commit 6264347
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 27 deletions.
48 changes: 45 additions & 3 deletions django_mongoengine/mongo_admin/options.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
from functools import partial, partialmethod
import operator
from functools import partial, partialmethod, reduce

from django import forms
from django.apps import apps
from django.conf import settings
from django.contrib.admin import helpers, widgets
from django.contrib.admin.exceptions import DisallowedModelAdminToField
from django.contrib.admin.options import IS_POPUP_VAR, TO_FIELD_VAR, csrf_protect_m, get_ul_class
from django.contrib.admin.options import (
IS_POPUP_VAR,
TO_FIELD_VAR,
csrf_protect_m,
get_ul_class,
)
from django.contrib.admin.utils import flatten_fieldsets, get_deleted_objects, unquote
from django.core.exceptions import PermissionDenied
from django.forms.formsets import all_valid
Expand All @@ -18,8 +24,14 @@
from django.utils.html import escape
from django.utils.text import capfirst
from django.utils.translation import gettext as _
from mongoengine import Q

from django_mongoengine.fields import EmbeddedDocumentField, ListField, ReferenceField, StringField
from django_mongoengine.fields import (
EmbeddedDocumentField,
ListField,
ReferenceField,
StringField,
)
from django_mongoengine.forms.documents import (
BaseInlineDocumentFormSet,
DocumentForm,
Expand Down Expand Up @@ -234,6 +246,36 @@ def get_changelist_formset(self, request, **kwargs):
**defaults
)

def get_search_results(self, request, queryset, search_term):
"""
Return a tuple containing a queryset to implement the search
and a boolean indicating if the results may contain duplicates.
"""

def construct_search(field_name):
if field_name.startswith('^'):
return "%s__istartswith" % field_name[1:]
elif field_name.startswith('='):
return "%s__iexact" % field_name[1:]
# No __search for mongoengine
# elif field_name.startswith('@'):
# return "%s__search" % field_name[1:]
else:
return "%s__icontains" % field_name

search_fields = self.get_search_fields(request)

if search_fields and search_term:
orm_lookups = [
construct_search(str(search_field)) for search_field in search_fields
]
for bit in search_term.split():
or_queries = [Q(**{orm_lookup: bit}) for orm_lookup in orm_lookups]
queryset = queryset.filter(reduce(operator.or_, or_queries))

return queryset, False


def get_changelist(self, request, **kwargs):
"""
Returns the ChangeList class for use on the changelist page.
Expand Down
32 changes: 8 additions & 24 deletions django_mongoengine/mongo_admin/views.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
import operator
from functools import reduce

from django.contrib.admin.options import IncorrectLookupParameters
from django.contrib.admin.views.main import ORDER_VAR, ChangeList
from django.core.exceptions import ImproperlyConfigured, SuspiciousOperation
from django.core.paginator import InvalidPage
from mongoengine import Q


class DocumentChangeList(ChangeList):
Expand Down Expand Up @@ -114,7 +110,7 @@ def get_queryset(self, request=None):
self.filter_specs,
self.has_filters,
remaining_lookup_params,
use_distinct,
search_may_have_duplicates,
has_active_filters,
) = self.get_filters(request)

Expand Down Expand Up @@ -146,23 +142,11 @@ def get_queryset(self, request=None):
ordering = self.get_ordering(request, qs)
qs = qs.order_by(*ordering)

# Apply keyword searches.
def construct_search(field_name):
if field_name.startswith('^'):
return "%s__istartswith" % field_name[1:]
elif field_name.startswith('='):
return "%s__iexact" % field_name[1:]
# No __search for mongoengine
# elif field_name.startswith('@'):
# return "%s__search" % field_name[1:]
else:
return "%s__icontains" % field_name

if self.search_fields and self.query:
orm_lookups = [
construct_search(str(search_field)) for search_field in self.search_fields
]
for bit in self.query.split():
or_queries = [Q(**{orm_lookup: bit}) for orm_lookup in orm_lookups]
qs = qs.filter(reduce(operator.or_, or_queries))
# Apply search results
qs, search_may_have_duplicates = self.model_admin.get_search_results(
request,
qs,
self.query,
)

return qs

0 comments on commit 6264347

Please sign in to comment.