django-watson/watson/admin.py

79 lines
2.9 KiB
Python
Raw Normal View History

2011-08-29 13:37:19 +00:00
"""Admin integration for django-watson."""
from __future__ import unicode_literals
2011-08-29 13:37:19 +00:00
from django.contrib import admin
from django.contrib.admin.views.main import ChangeList
2015-12-02 10:39:36 +00:00
from watson.search import SearchEngine, SearchAdapter
2011-08-29 13:37:19 +00:00
admin_search_engine = SearchEngine("admin")
2011-08-29 13:57:55 +00:00
class WatsonSearchChangeList(ChangeList):
2011-08-29 13:37:19 +00:00
"""A change list that takes advantage of django-watson full text search."""
def get_queryset(self, *args, **kwargs):
2011-08-29 13:37:19 +00:00
"""Creates the query set."""
2011-08-29 13:57:55 +00:00
# Do the basic searching.
2011-09-08 15:53:07 +00:00
search_fields = self.search_fields
self.search_fields = ()
try:
qs = super(WatsonSearchChangeList, self).get_queryset(*args, **kwargs)
2011-09-08 15:53:07 +00:00
finally:
self.search_fields = search_fields
2011-08-29 13:57:55 +00:00
# Do the full text searching.
if self.query.strip():
qs = self.model_admin.search_engine.filter(qs, self.query, ranking=False)
return qs
2011-08-29 13:37:19 +00:00
2012-04-30 10:49:54 +00:00
class SearchAdmin(admin.ModelAdmin):
2011-08-29 13:37:19 +00:00
2012-04-30 10:49:54 +00:00
"""
A ModelAdmin subclass that provides full-text search integration.
2012-04-30 10:49:54 +00:00
Subclass this admin class and specify a tuple of search_fields for instant
integration!
"""
2011-08-29 13:37:19 +00:00
search_engine = admin_search_engine
search_adapter_cls = SearchAdapter
@property
def search_context_manager(self):
"""The search context manager used by this SearchAdmin."""
return self.search_engine._search_context_manager
2011-08-29 13:37:19 +00:00
def __init__(self, *args, **kwargs):
"""Initializes the search admin."""
2012-04-30 10:49:54 +00:00
super(SearchAdmin, self).__init__(*args, **kwargs)
2011-08-29 13:57:55 +00:00
# Check that the search fields are valid.
for search_field in self.search_fields or ():
if search_field[0] in ("^", "@", "="):
2011-08-29 17:00:55 +00:00
raise ValueError("SearchAdmin does not support search fields prefixed with '^', '=' or '@'")
2011-08-29 13:37:19 +00:00
# Register with the search engine.
self.register_model_with_watson()
# Set up revision contexts on key methods, just in case.
self.add_view = self.search_context_manager.update_index()(self.add_view)
self.change_view = self.search_context_manager.update_index()(self.change_view)
self.delete_view = self.search_context_manager.update_index()(self.delete_view)
self.changelist_view = self.search_context_manager.update_index()(self.changelist_view)
2011-08-29 13:37:19 +00:00
def register_model_with_watson(self):
"""Registers this admin class' model with django-watson."""
if not self.search_engine.is_registered(self.model) and self.search_fields:
self.search_engine.register(
self.model,
fields=self.search_fields,
adapter_cls=self.search_adapter_cls,
get_live_queryset=lambda self_: None, # Ensure complete queryset is used in admin.
)
2011-08-29 13:37:19 +00:00
def get_changelist(self, request, **kwargs):
"""Returns the ChangeList class for use on the changelist page."""
return WatsonSearchChangeList