From b411e6315a403d9cf9080c0bff2ef1406b47435d Mon Sep 17 00:00:00 2001 From: Samuel Colvin Date: Mon, 12 Oct 2015 12:01:12 +0100 Subject: [PATCH] remove UniversalEncoder and move deserialization --- src/watson/models.py | 10 ++++++++-- src/watson/registration.py | 41 +++++++++++++------------------------- 2 files changed, 22 insertions(+), 29 deletions(-) diff --git a/src/watson/models.py b/src/watson/models.py index 6224b95..c19a8f3 100644 --- a/src/watson/models.py +++ b/src/watson/models.py @@ -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. diff --git a/src/watson/registration.py b/src/watson/registration.py index 651abac..17f5a3b 100644 --- a/src/watson/registration.py +++ b/src/watson/registration.py @@ -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)