mirror of
https://github.com/Hopiu/django-watson.git
synced 2026-05-11 23:03:10 +00:00
remove UniversalEncoder and move deserialization
This commit is contained in:
parent
d4eb1936b9
commit
b411e6315a
2 changed files with 22 additions and 29 deletions
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in a new issue