Skip to content
This repository was archived by the owner on Feb 20, 2019. It is now read-only.

Commit aa6a0fb

Browse files
author
Florent
committed
Adds get_object test when id_field is uuid.
1 parent 2444798 commit aa6a0fb

File tree

2 files changed

+37
-10
lines changed

2 files changed

+37
-10
lines changed

elasticutils/contrib/django/tests/__init__.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# We need to put these in a separate module so they're easy to import
22
# on a test-by-test basis so that we can skip django-requiring tests
33
# if django isn't installed.
4+
from uuid import UUID
45

56

67
from elasticutils.contrib.django import MappingType, Indexable
@@ -22,11 +23,17 @@ class SearchQuerySet(object):
2223
# Yes. This is kind of crazy, but ... whatever.
2324
def __init__(self, model):
2425
self.model = model
26+
self.id_field = model.id_field
2527
self.steps = []
2628

27-
def get(self, pk):
28-
pk = int(pk)
29-
return [m for m in _model_cache if m.id == pk][0]
29+
def get(self, pk=None, uuid=None):
30+
if pk:
31+
pk = int(pk)
32+
return [m for m in _model_cache if m.id == pk][0]
33+
if uuid:
34+
uuid = UUID(uuid)
35+
return [m for m in _model_cache if m.uuid == uuid][0]
36+
return []
3037

3138
def filter(self, id__in=None):
3239
self.steps.append(('filter', id__in))
@@ -47,7 +54,8 @@ def __iter__(self):
4754

4855
for mem in self.steps:
4956
if mem[0] == 'filter':
50-
objs = [obj for obj in objs if obj.id in mem[1]]
57+
objs = [obj for obj in objs
58+
if getattr(obj, self.id_field) in mem[1]]
5159
elif mem[0] == 'order_by':
5260
order_by_field = mem[1][0]
5361
elif mem[0] == 'values_list':
@@ -58,16 +66,16 @@ def __iter__(self):
5866

5967
if values_list:
6068
# Note: Hard-coded to just id and flat
61-
objs = [obj.id for obj in objs]
69+
objs = [getattr(obj, self.id_field) for obj in objs]
6270
return iter(objs)
6371

6472

6573
class Manager(object):
6674
def get_query_set(self):
6775
return SearchQuerySet(self)
6876

69-
def get(self, pk):
70-
return self.get_query_set().get(pk)
77+
def get(self, pk=None, uuid=None):
78+
return self.get_query_set().get(pk=pk, uuid=uuid)
7179

7280
def filter(self, *args, **kwargs):
7381
return self.get_query_set().filter(*args, **kwargs)
@@ -84,6 +92,7 @@ class FakeModel(object):
8492
objects = Manager()
8593

8694
def __init__(self, **kw):
95+
self.objects.id_field = kw.pop('id_field', 'id')
8796
self._doc = kw
8897
for key in kw:
8998
setattr(self, key, kw[key])
@@ -102,3 +111,6 @@ def extract_document(cls, obj_id, obj=None):
102111
'what to do with these args.')
103112

104113
return obj._doc
114+
115+
class FakeDjangoWithUuidMappingType(FakeDjangoMappingType):
116+
id_field = 'uuid'

elasticutils/contrib/django/tests/test_models.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1+
import uuid
2+
13
from nose.tools import eq_
24

35
from elasticutils.contrib.django import S, get_es
46
from elasticutils.contrib.django.tests import (
5-
FakeDjangoMappingType, FakeModel, reset_model_cache)
7+
FakeDjangoMappingType, FakeDjangoWithUuidMappingType, FakeModel,
8+
reset_model_cache)
69
from elasticutils.contrib.django.estestcase import ESTestCase
710

811

@@ -20,12 +23,13 @@ def tearDown(self):
2023
IndexableTest.cleanup_index(FakeDjangoMappingType.get_index())
2124
reset_model_cache()
2225

23-
def persist_data(self, data):
26+
def persist_data(self, data, id_field='id'):
2427
for doc in data:
2528
FakeModel(**doc)
2629

2730
# Index the document with .index()
28-
FakeDjangoMappingType.index(doc, id_=doc['id'])
31+
FakeDjangoMappingType.index({k:str(v) for k,v in doc.iteritems()},
32+
id_=str(doc[id_field]))
2933

3034
self.refresh(FakeDjangoMappingType.get_index())
3135

@@ -51,6 +55,17 @@ def test_get_object(self):
5155
obj = s[0]
5256
eq_(obj.object.id, 1)
5357

58+
def test_get_object_with_custom_pk(self):
59+
data = [
60+
{'uuid': uuid.uuid4(), 'name': 'odin skullcrusher'},
61+
{'uuid': uuid.uuid4(), 'name': 'olaf bloodbiter'},
62+
]
63+
self.persist_data(data, id_field='uuid')
64+
65+
s = S(FakeDjangoWithUuidMappingType).query(name__prefix='odin')
66+
obj = s[0]
67+
eq_(obj.object.uuid, data[0]['uuid'])
68+
5469
def test_get_indexable(self):
5570
self.persist_data([
5671
{'id': 1, 'name': 'odin skullcrusher'},

0 commit comments

Comments
 (0)