From 68509d4bd652cceb2ec3b7ab436c8930c6765bcd Mon Sep 17 00:00:00 2001 From: Rizwan Date: Thu, 6 Sep 2018 20:24:00 +0100 Subject: [PATCH] Added global filters (#26) --- djangocms_internalsearch/admin.py | 106 +++++------ djangocms_internalsearch/cms_config.py | 6 +- .../contrib/cms/filters.py | 150 ++++++++++++++++ .../contrib/cms/internal_search.py | 153 ++++++++++++++++ .../contrib/filer/internal_search.py | 77 ++++++++ djangocms_internalsearch/filters.py | 42 +++++ djangocms_internalsearch/helpers.py | 35 ++++ djangocms_internalsearch/internal_search.py | 167 ++++-------------- tests/settings.py | 2 +- 9 files changed, 551 insertions(+), 187 deletions(-) create mode 100644 djangocms_internalsearch/contrib/cms/filters.py create mode 100644 djangocms_internalsearch/contrib/cms/internal_search.py create mode 100644 djangocms_internalsearch/contrib/filer/internal_search.py create mode 100644 djangocms_internalsearch/filters.py diff --git a/djangocms_internalsearch/admin.py b/djangocms_internalsearch/admin.py index 2420b15..d6f195c 100644 --- a/djangocms_internalsearch/admin.py +++ b/djangocms_internalsearch/admin.py @@ -3,6 +3,7 @@ import operator from functools import reduce +from django.apps import apps from django.contrib import admin from django.contrib.admin.options import ModelAdmin, csrf_protect_m from django.core.exceptions import PermissionDenied @@ -10,19 +11,23 @@ from django.db import models from django.shortcuts import render from django.utils.encoding import force_text -from django.utils.html import format_html from django.utils.translation import ungettext from haystack.admin import SearchChangeList, SearchModelAdminMixin from haystack.query import SearchQuerySet from haystack.utils import get_model_ct_tuple +from djangocms_internalsearch.internal_search import InternalSearchAdminSetting + +from .filters import ContentTypeFilter +from .helpers import get_internalsearch_model_config from .models import InternalSearchProxy class InternalSearchChangeList(SearchChangeList): def get_results(self, request): + sqs = self.queryset if hasattr(request, 'SEARCH_VAR'): query = request.GET('SEARCH_VAR') @@ -72,6 +77,21 @@ def __init__(self, using=None, query=None): self.query.select_related = False +def get_admin_settings_from_config(model_meta): + result = {} + model_class = apps.get_model(model_meta) + if model_class: + app_config = get_internalsearch_model_config(model_class) + if app_config: + result.update({ + 'list_display': app_config.list_display, + 'list_filter': app_config.list_filter, + # TODO: adept more settings + }) + + return result + + class InternalSearchModelAdminMixin(SearchModelAdminMixin): @csrf_protect_m @@ -79,8 +99,26 @@ def changelist_view(self, request, extra_context=None): if not self.has_change_permission(request, None): raise PermissionDenied - list_display = list(self.list_display) - list_filter = self.list_filter + list_filter = list(InternalSearchAdminSetting.list_filter) + list_display = list(InternalSearchAdminSetting.list_display) + + model_meta = request.GET.get('type') + if model_meta: + config_setting = get_admin_settings_from_config(model_meta) + for item in config_setting.get('list_filter'): + if item not in list_filter: + list_filter.append(item) + + if config_setting.get('list_display'): + list_display = config_setting.get('list_display') + + else: + # Deleting preserved filter parameters for all content type UI + request.GET = request.GET.copy() + request.GET.pop('version_state', None) + request.GET.pop('auth', None) + request.GET.pop('site', None) + extra_context = {'title': 'Internal Search'} kwargs = { @@ -97,7 +135,6 @@ def changelist_view(self, request, extra_context=None): 'list_editable': self.list_editable, 'model_admin': self, 'list_max_show_all': self.list_max_show_all, - } changelist = InternalSearchChangeList(**kwargs) @@ -127,7 +164,6 @@ def changelist_view(self, request, extra_context=None): 'cl': changelist, 'media': media, 'has_add_permission': self.has_add_permission(request), - # More Django 1.4 compatibility 'root_path': getattr(self.admin_site, 'root_path', None), 'app_label': self.model._meta.app_label, 'action_form': action_form, @@ -153,11 +189,16 @@ def get_queryset(self, request): Return a QuerySet of all model instances that can be edited by the admin site. This is used by changelist_view. """ + model_meta = request.GET.get('type') qs = InternalSearchQuerySet(self.haystack_connection).all() - # TODO: this should be handled by some parameter to the ChangeList. - ordering = self.get_ordering(request) - if ordering: - qs = qs.order_by(*ordering) + if model_meta: + model_klass = apps.get_model(model_meta) + qs = InternalSearchQuerySet(self.haystack_connection).models(model_klass).all() + + # TODO: this should be handled by some parameter to the ChangeList. + ordering = self.get_ordering(request) + if ordering: + qs = qs.order_by(*ordering) return qs def get_search_results(self, request, queryset, search_term): @@ -189,50 +230,11 @@ def construct_search(field_name): @admin.register(InternalSearchProxy) -class InternalSearchAdmin(InternalSearchModelAdminMixin, ModelAdmin): - # Todo: use model config to generate admin attributes and methods - list_display = ['title', 'slug', 'absolute_url', 'content_type', 'language', 'author', 'version_status', - 'modified_date'] +class InternalSearchAdmin(InternalSearchModelAdminMixin, ModelAdmin, InternalSearchAdminSetting): + list_display = ['title', 'slug', 'absolute_url', 'content_type', 'site_name', 'language', 'author', + 'version_status', 'modified_date'] + list_filter = [ContentTypeFilter, ] list_per_page = 50 search_fields = ('text', 'title') ordering = ('-id',) list_display_links = None - - def has_add_permission(self, request): - return False - - def modified_date(self, obj): - return obj.result.modified_date - - def slug(self, obj): - return obj.result.slug - - def absolute_url(self, obj): - if obj.result.url: - return format_html("{url}", url=obj.result.url) - else: - return obj.result.url - - absolute_url.short_description = 'URL' - absolute_url.allow_tags = True - - def text(self, obj): - return obj.text - - def title(self, obj): - return obj.result.title - - def language(self, obj): - return obj.result.language - - def site_name(self, obj): - return obj.result.site_name - - def author(self, obj): - return obj.result.created_by - - def content_type(self, obj): - return obj.result.model.__name__ - - def version_status(self, obj): - return obj.result.version_status diff --git a/djangocms_internalsearch/cms_config.py b/djangocms_internalsearch/cms_config.py index 1dca22b..072457f 100644 --- a/djangocms_internalsearch/cms_config.py +++ b/djangocms_internalsearch/cms_config.py @@ -4,10 +4,12 @@ from cms.app_base import CMSAppConfig, CMSAppExtension -from djangocms_internalsearch.internal_search import ( +from djangocms_internalsearch.contrib.cms.internal_search import ( + PageContentConfig, +) +from djangocms_internalsearch.contrib.filer.internal_search import ( FilerFileConfig, FilerImageConfig, - PageContentConfig, ) diff --git a/djangocms_internalsearch/contrib/cms/filters.py b/djangocms_internalsearch/contrib/cms/filters.py new file mode 100644 index 0000000..ecdb544 --- /dev/null +++ b/djangocms_internalsearch/contrib/cms/filters.py @@ -0,0 +1,150 @@ +from django.contrib import admin +from django.contrib.sites.models import Site + +from cms.models import Page, PageContent + + +class LanguageFilter(admin.SimpleListFilter): + # Human-readable title which will be displayed in the + # right admin sidebar just above the filter options. + title = 'language' + + # Parameter for the filter that will be used in the URL query. + parameter_name = 'lang' + + def lookups(self, request, model_admin): + """ + Returns a list of tuples. The first element in each + tuple is the coded value for the option that will + appear in the URL query. The second element is the + human-readable name for the option that will appear + in the right sidebar. + """ + languages = ( + PageContent + .objects + .order_by() + .distinct() + .values_list('language', flat=True) + ) + return ((item, item) for item in languages) + + def queryset(self, request, queryset): + """ + Returns the filtered queryset based on the value + provided in the query string and retrievable via + `self.value()`. + """ + # Compare the requested value (either '80s' or '90s') + # to decide how to filter the queryset. + if self.value() is not None: + return queryset.filter(language=self.value()) + + +class VersionStateFilter(admin.SimpleListFilter): + # Human-readable title which will be displayed in the + # right admin sidebar just above the filter options. + title = 'version state' + + # Parameter for the filter that will be used in the URL query. + parameter_name = 'version_state' + + def lookups(self, request, model_admin): + """ + Returns a list of tuples. The first element in each + tuple is the coded value for the option that will + appear in the URL query. The second element is the + human-readable name for the option that will appear + in the right sidebar. + """ + # TODO: hard coding filter. Todo once versioning app ready. + return ( + ('Archived', 'Archived'), + ('Draft', 'Draft'), + ('Published', 'Published'), + ('Unpublished', 'Unpublished'), + ('Locked', 'Locked'), + ) + + def queryset(self, request, queryset): + """ + Returns the filtered queryset based on the value + provided in the query string and retrievable via + `self.value()`. + """ + if self.value() is not None: + return queryset.filter(version_status=self.value()) + + +class AuthorFilter(admin.SimpleListFilter): + # Human-readable title which will be displayed in the + # right admin sidebar just above the filter options. + title = 'author' + + # Parameter for the filter that will be used in the URL query. + parameter_name = 'auth' + + def lookups(self, request, model_admin): + """ + Returns a list of tuples. The first element in each + tuple is the coded value for the option that will + appear in the URL query. The second element is the + human-readable name for the option that will appear + in the right sidebar. + """ + authors = ( + Page + .objects + .order_by() + .distinct() + .values_list('changed_by', flat=True) + ) + return ((item, item) for item in authors) + + def queryset(self, request, queryset): + """ + Returns the filtered queryset based on the value + provided in the query string and retrievable via + `self.value()`. + """ + # Compare the requested value (either '80s' or '90s') + # to decide how to filter the queryset. + if self.value() is not None: + return queryset.filter(created_by=self.value()) + + +class SiteFilter(admin.SimpleListFilter): + # Human-readable title which will be displayed in the + # right admin sidebar just above the filter options. + title = 'Site' + + # Parameter for the filter that will be used in the URL query. + parameter_name = 'site' + + def lookups(self, request, model_admin): + """ + Returns a list of tuples. The first element in each + tuple is the coded value for the option that will + appear in the URL query. The second element is the + human-readable name for the option that will appear + in the right sidebar. + """ + sites = ( + Site + .objects + .order_by() + .distinct() + .values_list('name', flat=True) + ) + return ((item, item) for item in sites) + + def queryset(self, request, queryset): + """ + Returns the filtered queryset based on the value + provided in the query string and retrievable via + `self.value()`. + """ + # Compare the requested value (either '80s' or '90s') + # to decide how to filter the queryset. + if self.value() is not None: + return queryset.filter(site_name=self.value()) diff --git a/djangocms_internalsearch/contrib/cms/internal_search.py b/djangocms_internalsearch/contrib/cms/internal_search.py new file mode 100644 index 0000000..c511c8c --- /dev/null +++ b/djangocms_internalsearch/contrib/cms/internal_search.py @@ -0,0 +1,153 @@ +import random + +from django.contrib.contenttypes.models import ContentType +from django.contrib.sites.models import Site +from django.template import RequestContext +from django.utils.translation import ugettext_lazy as _ + +from cms.models import CMSPlugin, PageContent + +from haystack import indexes + +from djangocms_internalsearch.base import BaseSearchConfig +from djangocms_internalsearch.contrib.cms.filters import ( + AuthorFilter, + SiteFilter, + VersionStateFilter, +) +from djangocms_internalsearch.helpers import get_request + + +def get_title(obj): + return obj.result.title + + +get_title.short_description = _('title') + + +def get_slug(obj): + return obj.result.slug + + +get_slug.short_description = _('slug') + + +def get_site_name(obj): + return obj.result.site_name + + +get_site_name.short_description = _('site_name') + + +def get_language(obj): + return obj.result.language + + +get_language.short_description = _('language') + + +def get_author(obj): + return obj.result.created_by + + +get_author.short_description = _('Author') + + +def get_content_type(obj): + return obj.result.model.__name__ + + +get_content_type.short_description = _('Content Type') + + +def get_version_status(obj): + return obj.result.version_status + + +get_version_status.short_description = _('Version Status') + + +def get_modified_date(obj): + return obj.result.creation_date + + +get_modified_date.short_description = _('Modified Date') + + +class PageContentConfig(BaseSearchConfig): + """ + Page config and index definition + """ + page = indexes.IntegerField(model_attr='page__id') + title = indexes.CharField(model_attr='title') + slug = indexes.CharField() + site_id = indexes.IntegerField() + site_name = indexes.CharField() + language = indexes.CharField(model_attr='language') + plugin_types = indexes.MultiValueField() + created_by = indexes.CharField() + version_status = indexes.CharField() + creation_date = indexes.DateTimeField(model_attr='creation_date') + + # admin setting + list_display = [get_title, get_slug, get_content_type, get_site_name, get_language, get_author, + get_version_status, get_modified_date] + list_filter = [SiteFilter, AuthorFilter, VersionStateFilter, ] + search_fields = ('text', 'title') + ordering = ('-id',) + list_per_page = 50 + + model = PageContent + + def prepare_slug(self, obj): + return obj.page.get_slug(obj.language, fallback=False) + + def prepare_site_id(self, obj): + return obj.page.node.site_id + + def prepare_site_name(self, obj): + site_id = obj.page.node.site_id + return Site.objects.filter(pk=site_id).values_list('domain', flat=True)[0] + + def prepare_plugin_types(self, obj): + plugin_types = ( + CMSPlugin + .objects + .filter( + placeholder__content_type=ContentType.objects.get_for_model(obj), + placeholder__object_id=obj.pk, + language=obj.language, + ) + .order_by() # Needed for distinct() with values_list https://code.djangoproject.com/ticket/16058 + .values_list('plugin_type', flat=True) + .distinct() + ) + return list(plugin_types) + + def prepare_text(self, obj): + plugins = CMSPlugin.objects.filter( + placeholder__content_type=ContentType.objects.get_for_model(obj), + placeholder__object_id=obj.pk, + language=obj.language, + ) + request = get_request(obj.language) + context = RequestContext(request) + renderer = request.toolbar.content_renderer + rendered_plugins = [] + + for base_plugin in plugins: + plugin_content = renderer.render_plugin( + instance=base_plugin, + context=context, + editable=False, + ) + rendered_plugins.append(plugin_content) + return ' '.join(rendered_plugins) + + def prepare_version_status(self, obj): + # TODO: prepare from djangocms_versioning apps + # Creating random for time being for UI Filter + return random.choice(['Draft', 'Published', 'Unpublished', 'Archived', 'Locked']) + + def prepare_created_by(self, obj): + return obj.page.changed_by diff --git a/djangocms_internalsearch/contrib/filer/internal_search.py b/djangocms_internalsearch/contrib/filer/internal_search.py new file mode 100644 index 0000000..f9a9243 --- /dev/null +++ b/djangocms_internalsearch/contrib/filer/internal_search.py @@ -0,0 +1,77 @@ +from django.utils.translation import ugettext_lazy as _ + +from filer.models.filemodels import File +from filer.models.imagemodels import Image +from haystack import indexes + +from djangocms_internalsearch.base import BaseSearchConfig + + +def get_title(obj): + return obj.result.file_path + + +get_title.short_description = _('Title') + + +def get_file_path(obj): + return obj.result.file_path + + +get_file_path.short_description = _('File Path') + + +def get_file_size(obj): + return obj.result.file_size + + +get_file_size.short_description = _('File Size') + + +def get_folder_name(obj): + return obj.result.folder_name + + +get_folder_name.short_description = _('Folder Name') + + +class FilerFileConfig(BaseSearchConfig): + # indexes definition + folder_name = indexes.CharField(model_attr="folder__name") + file_path = indexes.CharField(model_attr="file") + title = indexes.CharField(model_attr="original_filename") + file_size = indexes.IntegerField(model_attr="_file_size") + created_by = indexes.CharField(model_attr="owner") + version_status = indexes.CharField() + + # admin setting + list_display = [get_title, get_file_size, get_file_path] + search_fields = ('title', 'folder_name') + list_filter = () + + model = File + + def prepare_text(self, obj): + # Todo: Might need to change based on file type e.g. Image + return ' '.join([obj.original_filename, ]) + + +class FilerImageConfig(BaseSearchConfig): + # indexes definition + folder_name = indexes.CharField(model_attr="folder__name") + file_path = indexes.CharField(model_attr="file") + title = indexes.CharField(model_attr="original_filename") + file_size = indexes.IntegerField(model_attr="_file_size") + created_by = indexes.CharField(model_attr="owner") + version_status = indexes.CharField() + + # admin setting + list_display = [get_title, get_folder_name, get_file_size] + search_fields = ('title', 'folder_name') + list_filter = () + + model = Image + + def prepare_text(self, obj): + # Todo: Might need to change based on file type e.g. Image + return ' '.join([obj.original_filename, ]) diff --git a/djangocms_internalsearch/filters.py b/djangocms_internalsearch/filters.py new file mode 100644 index 0000000..44d5b72 --- /dev/null +++ b/djangocms_internalsearch/filters.py @@ -0,0 +1,42 @@ +from django.apps import apps +from django.contrib import admin + +from djangocms_internalsearch.helpers import get_internalsearch_config + + +class ContentTypeFilter(admin.SimpleListFilter): + # Human-readable title which will be displayed in the + # right admin sidebar just above the filter options. + title = 'Content type' + + # Parameter for the filter that will be used in the URL query. + parameter_name = 'type' + + def lookups(self, request, model_admin): + """ + Returns a list of tuples. The first element in each + tuple is the coded value for the option that will + appear in the URL query. The second element is the + human-readable name for the option that will appear + in the right sidebar. + """ + models_meta = [ + (app.model._meta, app.model.__name__) for app in get_internalsearch_config() + ] + return (item for item in models_meta) + + def queryset(self, request, queryset): + """ + Returns the filtered queryset based on the value + provided in the query string and retrievable via + `self.value()`. + """ + # Compare the requested value (either '80s' or '90s') + # to decide how to filter the queryset. + # qs = super(InternalSearchAdmin, self).changelist(request, queryset) + if not self.value(): + return + + model = apps.get_model(self.value()) + if model: + return queryset.models(model) diff --git a/djangocms_internalsearch/helpers.py b/djangocms_internalsearch/helpers.py index 6e238da..c58cf44 100644 --- a/djangocms_internalsearch/helpers.py +++ b/djangocms_internalsearch/helpers.py @@ -1,3 +1,38 @@ +from django.apps import apps +from django.conf import settings +from django.test import RequestFactory + + def save_to_index(sender, operation, request, token, **kwargs): # TODO; add/update object pass + + +def get_internalsearch_model_config(model_class): + internalsearch_config = apps.get_app_config('djangocms_internalsearch') + apps_config = internalsearch_config.cms_extension.internalsearch_apps_config + app_config = [app for app in apps_config if app.model == model_class] + return app_config[0] + + +def get_internalsearch_config(): + internalsearch_config = apps.get_app_config('djangocms_internalsearch') + apps_config = internalsearch_config.cms_extension.internalsearch_apps_config + return apps_config + + +def get_request(language=None): + from django.contrib.auth.models import AnonymousUser + from cms.toolbar.toolbar import CMSToolbar + """ + Returns a Request instance populated with cms specific attributes. + """ + request_factory = RequestFactory(HTTP_HOST=settings.ALLOWED_HOSTS[0]) + request = request_factory.get("/") + request.session = {} + request.LANGUAGE_CODE = language or settings.LANGUAGE_CODE + # Needed for plugin rendering. + request.current_page = None + request.user = AnonymousUser() + request.toolbar = CMSToolbar(request) + return request diff --git a/djangocms_internalsearch/internal_search.py b/djangocms_internalsearch/internal_search.py index 8a4da91..16c36b8 100644 --- a/djangocms_internalsearch/internal_search.py +++ b/djangocms_internalsearch/internal_search.py @@ -1,151 +1,54 @@ -import random +from django.utils.html import format_html -from django.conf import settings -from django.contrib.auth.models import AnonymousUser -from django.contrib.contenttypes.models import ContentType -from django.contrib.sites.models import Site -from django.template import RequestContext -from django.test import RequestFactory +from djangocms_internalsearch.filters import ContentTypeFilter -from cms.models import CMSPlugin, PageContent -from cms.toolbar.toolbar import CMSToolbar -from filer.models.filemodels import File -from filer.models.imagemodels import Image -from haystack import indexes - -from .base import BaseSearchConfig - - -class PageContentConfig(BaseSearchConfig): +class InternalSearchAdminSetting: """ - Page config and index definition + Default admin setting for all models listing """ - page = indexes.IntegerField(model_attr='page__id') - title = indexes.CharField(model_attr='title') - slug = indexes.CharField() - site_id = indexes.IntegerField() - site_name = indexes.CharField() - language = indexes.CharField(model_attr='language') - plugin_types = indexes.MultiValueField() - created_by = indexes.CharField() - version_status = indexes.CharField() - creation_date = indexes.DateTimeField(model_attr='creation_date') - - # admin setting - list_display = ['id', 'title', 'slug', 'site_name', 'language', - 'author', 'content_type', 'version_status'] - + list_display = ['title', 'slug', 'absolute_url', 'content_type', 'site_name', 'language', + 'author', 'version_status', 'modified_date'] + list_filter = [ContentTypeFilter, ] + list_per_page = 50 search_fields = ('text', 'title') ordering = ('-id',) - # model class attribute - model = PageContent - - def prepare_slug(self, obj): - return obj.page.get_slug(obj.language, fallback=False) - - def prepare_site_id(self, obj): - return obj.page.node.site_id - - def prepare_site_name(self, obj): - site_id = obj.page.node.site_id - return Site.objects.filter(pk=site_id).values_list('domain', flat=True)[0] + def has_add_permission(self, request): + return False - def prepare_plugin_types(self, obj): - plugin_types = ( - CMSPlugin - .objects - .filter( - placeholder__content_type=ContentType.objects.get_for_model(obj), - placeholder__object_id=obj.pk, - language=obj.language, - ) - .order_by() # Needed for distinct() with values_list https://code.djangoproject.com/ticket/16058 - .values_list('plugin_type', flat=True) - .distinct() - ) - return list(plugin_types) - - def prepare_text(self, obj): - plugins = CMSPlugin.objects.filter( - placeholder__content_type=ContentType.objects.get_for_model(obj), - placeholder__object_id=obj.pk, - language=obj.language, - ) - request = get_request(obj.language) - context = RequestContext(request) - renderer = request.toolbar.content_renderer - rendered_plugins = [] - - for base_plugin in plugins: - plugin_content = renderer.render_plugin( - instance=base_plugin, - context=context, - editable=False, - ) - rendered_plugins.append(plugin_content) - return ' '.join(rendered_plugins) - - def prepare_version_status(self, obj): - # TODO: prepare from djangocms_versioning apps - # Creating random for time being for UI Filter - return random.choice(['Draft', 'Published', 'Unpublished', 'Archived', 'Locked']) - - def prepare_created_by(self, obj): - return obj.page.changed_by - - -def get_request(language=None): - """ - Returns a Request instance populated with cms specific attributes. - """ - request_factory = RequestFactory(HTTP_HOST=settings.ALLOWED_HOSTS[0]) - request = request_factory.get("/") - request.session = {} - request.LANGUAGE_CODE = language or settings.LANGUAGE_CODE - # Needed for plugin rendering. - request.current_page = None - request.user = AnonymousUser() - request.toolbar = CMSToolbar(request) - return request + def modified_date(self, obj): + return obj.result.creation_date + def slug(self, obj): + return obj.result.slug -class FilerFileConfig(BaseSearchConfig): - # indexes definition - folder_name = indexes.CharField(model_attr="folder__name") - file_path = indexes.CharField(model_attr="file") - title = indexes.CharField(model_attr="original_filename") - file_size = indexes.IntegerField(model_attr="_file_size") - created_by = indexes.CharField(model_attr="owner") - version_status = indexes.CharField() + def absolute_url(self, obj): + if obj.result.url: + return format_html("{url}", url=obj.result.url) + else: + return obj.result.url - # admin setting - list_display = ['file_src', 'file_name', 'folder_name'] - search_fields = ('file_name', 'folder_name') + absolute_url.short_description = 'URL' + absolute_url.allow_tags = True - model = File + def text(self, obj): + return obj.text - def prepare_text(self, obj): - # Todo: Might need to change based on file type e.g. Image - return ' '.join([obj.original_filename, ]) + def title(self, obj): + return obj.result.title + def language(self, obj): + return obj.result.language -class FilerImageConfig(BaseSearchConfig): - # indexes definition - folder_name = indexes.CharField(model_attr="folder__name") - file_path = indexes.CharField(model_attr="file") - title = indexes.CharField(model_attr="original_filename") - file_size = indexes.IntegerField(model_attr="_file_size") - created_by = indexes.CharField(model_attr="owner") - version_status = indexes.CharField() + def site_name(self, obj): + return obj.result.site_name - # admin setting - list_display = ['file_src', 'file_name', 'folder_name'] - search_fields = ('file_name', 'folder_name') + def author(self, obj): + return obj.result.created_by - model = Image + def content_type(self, obj): + return obj.result.model.__name__ - def prepare_text(self, obj): - # Todo: Might need to change based on file type e.g. Image - return ' '.join([obj.original_filename, ]) + def version_status(self, obj): + return obj.result.version_status diff --git a/tests/settings.py b/tests/settings.py index 0c882ad..4a6d368 100644 --- a/tests/settings.py +++ b/tests/settings.py @@ -11,7 +11,7 @@ 'URL': 'http://127.0.0.1:9200/', 'INDEX_NAME': 'test_haystack', }, - } + }, }