Skip to content

Commit

Permalink
some refactoring and adds tests for title in self link
Browse files Browse the repository at this point in the history
  • Loading branch information
ssfrr committed Mar 14, 2018
1 parent 23e0e3a commit 2b95e5d
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 21 deletions.
35 changes: 16 additions & 19 deletions chain/core/api.py
Expand Up @@ -112,7 +112,7 @@ def __init__(self, child_resource_class, reverse_name, embed=False):

def create_parent_filter(self, parent):
return {self._reverse_name + '_id': parent._obj.id}

def serialize(self, parent, request, cache):
queryset = self._child_resource_class.queryset

Expand Down Expand Up @@ -204,7 +204,7 @@ def __init__(self, obj=None, is_list=None, data=None, request=None,
self._request = request
self._limit = limit or self.page_size
self._offset = offset or 0

@classmethod
def get_object_by_id(cls, id):
return cls.queryset.get(id=id)
Expand All @@ -221,15 +221,7 @@ def serialize_single(self, embed=True, cache=None, rels=True, *args, **kwargs):
if not embed:
# this is just a link, don't embed the full object
data['href'] = self.get_single_href()
title = self.display_field
if title in self.model_fields:
data['title'] = self.serialize_field(getattr(self._obj, title))
elif title in self.stub_fields.keys():
stub_data = getattr(self._obj, title)
data['title'] = getattr(stub_data, self.stub_fields[title])
else:
raise NotImplementedError(
'display_field must be a model field or stub field')
data['title'] = self.get_title()
return data
if rels:
data['_links'] = {
Expand All @@ -253,14 +245,7 @@ def serialize_single(self, embed=True, cache=None, rels=True, *args, **kwargs):
data['_links'][field_name] = collection.serialize(
self, self._request, cache)

title = self.display_field
if title in self.model_fields:
data['_links']['self']['title'] = self.serialize_field(
getattr(self._obj, title))
elif title in self.stub_fields.keys():
stub_data = getattr(self._obj, title)
data['_links']['self']['title'] = getattr(stub_data,
self.stub_fields[title])
data['_links']['self']['title'] = self.get_title()

for field_name in self.model_fields:
data[field_name] = self.serialize_field(
Expand Down Expand Up @@ -305,6 +290,18 @@ def get_total_count(self):
self._total_count = qs.count()
return self._total_count

def get_title(self):
tfield = self.display_field
if tfield in self.model_fields:
return self.serialize_field(getattr(self._obj, tfield))
elif tfield in self.stub_fields.keys():
stub_data = getattr(self._obj, tfield)
return getattr(stub_data, self.stub_fields[tfield])
else:
raise NotImplementedError(
'display_field must be a model field or stub field')


def get_queryset(self):
'''Returns the queryset resulting from this request, including
all filtering, and pagination'''
Expand Down
8 changes: 6 additions & 2 deletions chain/core/tests.py
Expand Up @@ -549,6 +549,7 @@ def test_sites_should_be_postable(self):
db_obj = Site.objects.get(name='MIT Media Lab')
self.assertEqual(new_site['name'], response.name)
self.assertEqual(new_site['name'], db_obj.name)
self.assertEqual(new_site['name'], response.links['self'].title)
self.assertEqual(new_site['rawZMQStream'],
response.links.rawZMQStream.href)
self.assertEqual(new_site['rawZMQStream'],
Expand Down Expand Up @@ -724,7 +725,8 @@ def test_device_should_be_postable_to_a_site(self):
"name": "Unit Test Thermostat 42",
"room": "E14-548R"
}
self.create_resource(dev_url, new_device)
response = self.create_resource(dev_url, new_device)
self.assertEqual(new_device['name'], response.links['self'].title)
# make sure that a device now exists with the right name
db_device = Device.objects.get(name=new_device['name'])
# make sure that the device is set up in the right site
Expand Down Expand Up @@ -829,10 +831,11 @@ def test_sensors_should_be_postable_to_newly_posted_device(self):
'metric': 'Beauty',
'unit': 'millihelen',
}
self.create_resource(sensors.links['createForm'].href, new_sensor)
response = self.create_resource(sensors.links['createForm'].href, new_sensor)
db_sensor = ScalarSensor.objects.get(metric__name='Beauty',
device__name=device.name)
self.assertEqual('millihelen', db_sensor.unit.name)
self.assertEqual('Beauty', response.links['self'].title)

def test_sensor_should_have_data_url(self):
sensor = self.get_a_sensor()
Expand Down Expand Up @@ -886,6 +889,7 @@ def test_presence_sensors_should_be_postable_to_existing_device(self):
db_sensor = PresenceSensor.objects.get(metric__name='rfid',
device__name=device.name)
self.assertTrue(db_sensor is not None)
self.assertEqual(new_sensor_res.links['self'].title, new_sensor['metric'])

# Reload the list of sensors:
sensors = self.get_resource(device.links['ch:sensors'].href)
Expand Down

0 comments on commit 2b95e5d

Please sign in to comment.