remove UniversalEncoder and move deserialization

This commit is contained in:
Samuel Colvin 2015-10-12 12:01:12 +01:00
parent d4eb1936b9
commit b411e6315a
2 changed files with 22 additions and 29 deletions

View file

@ -6,6 +6,8 @@ import json
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.utils.functional import cached_property
try:
from django.contrib.contenttypes.fields import GenericForeignKey
except ImportError:
@ -71,9 +73,13 @@ class SearchEntry(models.Model):
meta_encoded = models.TextField()
def _deserialize_meta(self):
return json.loads(self.meta_encoded)
from watson.registration import SearchEngine
engine = SearchEngine._created_engines[self.engine_slug]
model = self.content_type.model_class()
adapter = engine.get_adapter(model)
return adapter.deserialize_meta(self.meta_encoded)
@property
@cached_property
def meta(self):
"""Returns the meta information stored with the search entry."""
# Attempt to use the cached value.

View file

@ -2,9 +2,7 @@
from __future__ import unicode_literals
import sys
import json
import types
import sys, json
from itertools import chain, islice
from threading import local
from functools import wraps
@ -20,7 +18,6 @@ from django.db.models.query import QuerySet
from django.db.models.signals import post_save, pre_delete
from django.utils.encoding import force_text
from django.utils.html import strip_tags
from django.utils.functional import Promise
from django.core.serializers.json import DjangoJSONEncoder
try:
from importlib import import_module
@ -30,24 +27,6 @@ except ImportError:
from watson.models import SearchEntry, has_int_pk
class UniversalEncoder(DjangoJSONEncoder):
ENCODER_BY_TYPE = {
set: list,
frozenset: list,
types.GeneratorType: list,
bytes: lambda o: o.decode('utf-8', errors='replace'),
}
def default(self, obj):
encoder = self.ENCODER_BY_TYPE.get(type(obj))
if encoder:
return encoder(obj)
elif isinstance(obj, Promise):
return force_text(obj)
else:
return super(UniversalEncoder, self).default(obj)
class SearchAdapterError(Exception):
"""Something went wrong with a search adapter."""
@ -173,6 +152,18 @@ class SearchAdapter(object):
for field_name in self.store
)
def serialized_meta(self, obj):
"""serialise meta ready to be saved in "meta_encoded"."""
meta_obj = self.get_meta(obj)
return json.dumps(meta_obj, cls=DjangoJSONEncoder)
def deserialize_meta(self, meta_encoded):
"""
deserialize the encoded meta string for use in views etc., this is
used by SearchEntry's _deserialize_meta method to create the "meta" property
"""
return json.loads(meta_encoded)
def get_live_queryset(self):
"""
Returns the queryset of objects that should be considered live.
@ -461,10 +452,6 @@ class SearchEngine(object):
)
return object_id_int, search_entries
def serialize_meta(self, meta_obj):
"""serialise meta ready to be saved in "meta_encoded"."""
return json.dumps(meta_obj, cls=UniversalEncoder)
def _update_obj_index_iter(self, obj):
"""Either updates the given object index, or yields an unsaved search entry."""
model = obj.__class__
@ -478,7 +465,7 @@ class SearchEngine(object):
"description": adapter.get_description(obj),
"content": adapter.get_content(obj),
"url": adapter.get_url(obj),
"meta_encoded": self.serialize_meta(adapter.get_meta(obj)),
"meta_encoded": adapter.serialized_meta(obj),
}
# Try to get the existing search entry.
object_id_int, search_entries = self._get_entries_for_obj(obj)