Remove support for recent searches
This commit is contained in:
@@ -1,14 +0,0 @@
|
|||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
from django.contrib import admin
|
|
||||||
|
|
||||||
from .models import RecentSearch
|
|
||||||
|
|
||||||
|
|
||||||
@admin.register(RecentSearch)
|
|
||||||
class RecentSearchAdmin(admin.ModelAdmin):
|
|
||||||
date_hierarchy = 'datetime_created'
|
|
||||||
list_display = ('user', 'query', 'datetime_created', 'hits')
|
|
||||||
list_display_links = ('user', 'query', 'datetime_created', 'hits')
|
|
||||||
list_filter = ('user',)
|
|
||||||
readonly_fields = ('user', 'query', 'datetime_created', 'hits')
|
|
||||||
@@ -6,29 +6,6 @@ from rest_framework.exceptions import ParseError
|
|||||||
from rest_api.filters import MayanObjectPermissionsFilter
|
from rest_api.filters import MayanObjectPermissionsFilter
|
||||||
|
|
||||||
from .classes import SearchModel
|
from .classes import SearchModel
|
||||||
from .filters import RecentSearchUserFilter
|
|
||||||
from .models import RecentSearch
|
|
||||||
from .serializers import RecentSearchSerializer
|
|
||||||
|
|
||||||
|
|
||||||
class APIRecentSearchListView(generics.ListAPIView):
|
|
||||||
"""
|
|
||||||
Returns a list of all the recent searches for the logged user.
|
|
||||||
"""
|
|
||||||
|
|
||||||
filter_backends = (RecentSearchUserFilter,)
|
|
||||||
queryset = RecentSearch.objects.all()
|
|
||||||
serializer_class = RecentSearchSerializer
|
|
||||||
|
|
||||||
|
|
||||||
class APIRecentSearchView(generics.RetrieveAPIView):
|
|
||||||
"""
|
|
||||||
Returns the selected recent search details.
|
|
||||||
"""
|
|
||||||
|
|
||||||
filter_backends = (RecentSearchUserFilter,)
|
|
||||||
queryset = RecentSearch.objects.all()
|
|
||||||
serializer_class = RecentSearchSerializer
|
|
||||||
|
|
||||||
|
|
||||||
class APISearchView(generics.ListAPIView):
|
class APISearchView(generics.ListAPIView):
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ from django.utils.module_loading import import_string
|
|||||||
from acls.models import AccessControlList
|
from acls.models import AccessControlList
|
||||||
from permissions import Permission
|
from permissions import Permission
|
||||||
|
|
||||||
from .models import RecentSearch
|
|
||||||
from .settings import setting_limit
|
from .settings import setting_limit
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
@@ -222,10 +221,6 @@ class SearchModel(object):
|
|||||||
self.permission, user, queryset
|
self.permission, user, queryset
|
||||||
)
|
)
|
||||||
|
|
||||||
RecentSearch.objects.add_query_for_user(
|
|
||||||
user, query_string, len(result_set)
|
|
||||||
)
|
|
||||||
|
|
||||||
return queryset, result_set, elapsed_time
|
return queryset, result_set, elapsed_time
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
from rest_framework.filters import BaseFilterBackend
|
|
||||||
|
|
||||||
|
|
||||||
class RecentSearchUserFilter(BaseFilterBackend):
|
|
||||||
def filter_queryset(self, request, queryset, view):
|
|
||||||
if request.user.is_staff or request.user.is_superuser:
|
|
||||||
return queryset
|
|
||||||
else:
|
|
||||||
return queryset.filter(user=self.request.user)
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
import urlparse
|
|
||||||
|
|
||||||
from django.contrib.auth.models import AnonymousUser
|
|
||||||
from django.db import models
|
|
||||||
from django.utils.http import urlencode
|
|
||||||
|
|
||||||
from .settings import setting_recent_count
|
|
||||||
|
|
||||||
|
|
||||||
class RecentSearchManager(models.Manager):
|
|
||||||
def add_query_for_user(self, user, query_string, hits):
|
|
||||||
parsed_query = urlparse.parse_qs(
|
|
||||||
urlencode(dict(query_string.items()))
|
|
||||||
)
|
|
||||||
|
|
||||||
for key, value in parsed_query.items():
|
|
||||||
parsed_query[key] = ' '.join(value)
|
|
||||||
|
|
||||||
if 'q' in query_string:
|
|
||||||
# Is a simple query
|
|
||||||
|
|
||||||
if not query_string['q']:
|
|
||||||
# Don't store empty simple searches
|
|
||||||
return
|
|
||||||
else:
|
|
||||||
# Cleanup query string and only store the q parameter
|
|
||||||
parsed_query = {'q': parsed_query['q']}
|
|
||||||
|
|
||||||
if parsed_query and not isinstance(user, AnonymousUser):
|
|
||||||
# If the URL query has at least one variable with a value
|
|
||||||
new_recent, created = self.model.objects.get_or_create(
|
|
||||||
user=user, query=urlencode(parsed_query),
|
|
||||||
defaults={'hits': hits}
|
|
||||||
)
|
|
||||||
if not created:
|
|
||||||
new_recent.hits = hits
|
|
||||||
new_recent.save()
|
|
||||||
|
|
||||||
for recent_to_delete in self.model.objects.filter(user=user)[setting_recent_count.value:]:
|
|
||||||
recent_to_delete.delete()
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
import urllib
|
|
||||||
import urlparse
|
|
||||||
|
|
||||||
from django.conf import settings
|
|
||||||
from django.core.urlresolvers import reverse
|
|
||||||
from django.db import models
|
|
||||||
from django.utils.encoding import (
|
|
||||||
python_2_unicode_compatible, smart_str, smart_unicode
|
|
||||||
)
|
|
||||||
from django.utils.translation import ugettext_lazy as _
|
|
||||||
|
|
||||||
from .managers import RecentSearchManager
|
|
||||||
|
|
||||||
|
|
||||||
@python_2_unicode_compatible
|
|
||||||
class RecentSearch(models.Model):
|
|
||||||
"""
|
|
||||||
Keeps a list of the [n] most recent search keywords for a given user
|
|
||||||
"""
|
|
||||||
|
|
||||||
user = models.ForeignKey(
|
|
||||||
settings.AUTH_USER_MODEL, editable=False, verbose_name=_('User')
|
|
||||||
)
|
|
||||||
query = models.TextField(editable=False, verbose_name=_('Query'))
|
|
||||||
datetime_created = models.DateTimeField(
|
|
||||||
auto_now=True, db_index=True, verbose_name=_('Datetime created')
|
|
||||||
)
|
|
||||||
hits = models.IntegerField(editable=False, verbose_name=_('Hits'))
|
|
||||||
|
|
||||||
objects = RecentSearchManager()
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
# TODO: Fix this hack, store the search model name in the recent
|
|
||||||
# search entry
|
|
||||||
from .classes import SearchModel
|
|
||||||
document_search = SearchModel.get('documents.Document')
|
|
||||||
|
|
||||||
query_dict = urlparse.parse_qs(
|
|
||||||
urllib.unquote_plus(smart_str(self.query))
|
|
||||||
)
|
|
||||||
|
|
||||||
if self.is_advanced():
|
|
||||||
# Advanced search
|
|
||||||
advanced_string = []
|
|
||||||
for key, value in query_dict.items():
|
|
||||||
search_field = document_search.get_search_field(key)
|
|
||||||
advanced_string.append(
|
|
||||||
'%s: %s' % (
|
|
||||||
search_field.label, smart_unicode(' '.join(value))
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
display_string = ', '.join(advanced_string)
|
|
||||||
else:
|
|
||||||
# Is a simple search
|
|
||||||
display_string = smart_unicode(' '.join(query_dict['q']))
|
|
||||||
|
|
||||||
return '%s (%s)' % (display_string, self.hits)
|
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
|
||||||
super(RecentSearch, self).save(*args, **kwargs)
|
|
||||||
|
|
||||||
def url(self):
|
|
||||||
view = 'search:results' if self.is_advanced() else 'search:search'
|
|
||||||
return '%s?%s' % (reverse(view), self.query)
|
|
||||||
|
|
||||||
def is_advanced(self):
|
|
||||||
return 'q' not in urlparse.parse_qs(self.query)
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
ordering = ('-datetime_created',)
|
|
||||||
verbose_name = _('Recent search')
|
|
||||||
verbose_name_plural = _('Recent searches')
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
from rest_framework import serializers
|
|
||||||
|
|
||||||
from user_management.serializers import UserSerializer
|
|
||||||
|
|
||||||
from .models import RecentSearch
|
|
||||||
|
|
||||||
|
|
||||||
class RecentSearchSerializer(serializers.HyperlinkedModelSerializer):
|
|
||||||
url = serializers.HyperlinkedIdentityField(
|
|
||||||
view_name='rest_api:recentsearch-detail'
|
|
||||||
)
|
|
||||||
user = UserSerializer()
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
fields = ('datetime_created', 'hits', 'query', 'url', 'user')
|
|
||||||
model = RecentSearch
|
|
||||||
read_only_fields = ('datetime_created', 'hits', 'query', 'user')
|
|
||||||
@@ -10,7 +10,3 @@ setting_limit = namespace.add_setting(
|
|||||||
global_name='SEARCH_LIMIT', default=100,
|
global_name='SEARCH_LIMIT', default=100,
|
||||||
help_text=_('Maximum amount search hits to fetch and display.')
|
help_text=_('Maximum amount search hits to fetch and display.')
|
||||||
)
|
)
|
||||||
setting_recent_count = namespace.add_setting(
|
|
||||||
global_name='SEARCH_RECENT_COUNT', default=5,
|
|
||||||
help_text=_('Maximum number of search queries to remember per user.')
|
|
||||||
)
|
|
||||||
|
|||||||
@@ -2,9 +2,7 @@ from __future__ import unicode_literals
|
|||||||
|
|
||||||
from django.conf.urls import patterns, url
|
from django.conf.urls import patterns, url
|
||||||
|
|
||||||
from .api_views import (
|
from .api_views import APISearchView
|
||||||
APIRecentSearchListView, APIRecentSearchView, APISearchView
|
|
||||||
)
|
|
||||||
from .views import (
|
from .views import (
|
||||||
AdvancedSearchView, ResultsView, SearchAgainView, SearchView
|
AdvancedSearchView, ResultsView, SearchAgainView, SearchView
|
||||||
)
|
)
|
||||||
@@ -28,13 +26,5 @@ urlpatterns = patterns(
|
|||||||
|
|
||||||
api_urls = patterns(
|
api_urls = patterns(
|
||||||
'',
|
'',
|
||||||
url(
|
|
||||||
r'^recent_searches/$', APIRecentSearchListView.as_view(),
|
|
||||||
name='recentsearch-list'
|
|
||||||
),
|
|
||||||
url(
|
|
||||||
r'^recent_searches/(?P<pk>[0-9]+)/$', APIRecentSearchView.as_view(),
|
|
||||||
name='recentsearch-detail'
|
|
||||||
),
|
|
||||||
url(r'^search/$', APISearchView.as_view(), name='search-view'),
|
url(r'^search/$', APISearchView.as_view(), name='search-view'),
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user