from urlparse import urlparse, parse_qs from urllib import unquote_plus from django.utils.simplejson import dumps, loads, JSONEncoder from django.db.models import Manager from django.utils.http import urlencode from django.contrib.auth.models import AnonymousUser from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes import generic from django.utils.encoding import smart_unicode, smart_str from dynamic_search.conf.settings import RECENT_COUNT class RecentSearchManager(Manager): def add_query_for_user(self, search_view):#user, url, hits): query_dict = parse_qs(unquote_plus(smart_str(urlparse(search_view.request.get_full_path()).query))) if query_dict and not isinstance(search_view.request.user, AnonymousUser): # If the URL query has at least one variable with a value new_recent, created = self.model.objects.get_or_create(user=search_view.request.user, query=dumps(query_dict), defaults={'hits': 0}) new_recent.hits = search_view.results.count() new_recent.save() to_delete = self.model.objects.filter(user=search_view.request.user)[RECENT_COUNT:] for recent_to_delete in to_delete: recent_to_delete.delete() def get_for_user(self, user): return [entry for entry in self.model.objects.filter(user=user) if entry.get_query()] class IndexableObjectManager(Manager): def get_indexables(self, datetime=None): if datetime: return self.model.objects.filter(datetime__gte=datetime) else: return self.model.objects.all() def get_indexables_pk_list(self, datetime=None): return self.get_indexables(datetime).values_list('object_id', flat=True) def mark_indexable(self, obj): content_type = ContentType.objects.get_for_model(obj) self.model.objects.get_or_create(content_type=content_type, object_id=obj.pk) def clear_all(self): self.model.objects.all().delete()