Skip to content

Commit 1d53796

Browse files
author
Zach Moody
authored
Merge pull request #253 from digitalocean/record-return-custom
Record return custom
2 parents ce74ebb + cc4d6d7 commit 1d53796

File tree

3 files changed

+28
-38
lines changed

3 files changed

+28
-38
lines changed

pynetbox/core/endpoint.py

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,15 @@
1919
RESERVED_KWARGS = ("id", "pk", "limit", "offset")
2020

2121

22+
def response_loader(req, return_obj, endpoint):
23+
if isinstance(req, list):
24+
return [
25+
return_obj(i, endpoint.api, endpoint)
26+
for i in req
27+
]
28+
return return_obj(req, endpoint.api, endpoint)
29+
30+
2231
class Endpoint(object):
2332
"""Represent actions available on endpoints in the Netbox API.
2433
@@ -73,9 +82,6 @@ def _lookup_ret_obj(self, name, model):
7382
ret = Record
7483
return ret
7584

76-
def _response_loader(self, values):
77-
return self.return_obj(values, self.api, self)
78-
7985
def all(self):
8086
"""Queries the 'ListView' of a given endpoint.
8187
@@ -97,7 +103,7 @@ def all(self):
97103
threading=self.api.threading,
98104
)
99105

100-
return [self._response_loader(i) for i in req.get()]
106+
return response_loader(req.get(), self.return_obj, self)
101107

102108
def get(self, *args, **kwargs):
103109
r"""Queries the DetailsView of a given endpoint.
@@ -157,7 +163,7 @@ def get(self, *args, **kwargs):
157163
except RequestError:
158164
return None
159165

160-
return self._response_loader(req.get())
166+
return response_loader(req.get(), self.return_obj, self)
161167

162168
def filter(self, *args, **kwargs):
163169
r"""Queries the 'ListView' of a given endpoint.
@@ -223,8 +229,7 @@ def filter(self, *args, **kwargs):
223229
threading=self.api.threading,
224230
)
225231

226-
ret = [self._response_loader(i) for i in req.get()]
227-
return ret
232+
return response_loader(req.get(), self.return_obj, self)
228233

229234
def create(self, *args, **kwargs):
230235
r"""Creates an object on an endpoint.
@@ -284,10 +289,7 @@ def create(self, *args, **kwargs):
284289
http_session=self.api.http_session,
285290
).post(args[0] if args else kwargs)
286291

287-
if isinstance(req, list):
288-
return [self._response_loader(i) for i in req]
289-
290-
return self._response_loader(req)
292+
return response_loader(req, self.return_obj, self)
291293

292294
def choices(self):
293295
""" Returns all choices from the endpoint.
@@ -429,15 +431,8 @@ def list(self, **kwargs):
429431
req = Request(**self.request_kwargs).get(add_params=kwargs)
430432

431433
if self.custom_return:
432-
if isinstance(req, list):
433-
return [
434-
self.custom_return(
435-
i, self.parent_obj.api, self.parent_obj.endpoint
436-
)
437-
for i in req
438-
]
439-
return self.custom_return(
440-
req, self.parent_obj.api, self.parent_obj.endpoint
434+
return response_loader(
435+
req, self.custom_return, self.parent_obj.endpoint
441436
)
442437
return req
443438

@@ -454,9 +449,13 @@ def create(self, data=None):
454449
:returns: A dictionary or list of dictionaries its created in
455450
NetBox.
456451
"""
457-
if not data:
458-
return Request(**self.request_kwargs).post({})
459-
return Request(**self.request_kwargs).post(data)
452+
data = data or {}
453+
req = Request(**self.request_kwargs).post(data)
454+
if self.custom_return:
455+
return response_loader(
456+
req, self.custom_return, self.parent_obj.endpoint
457+
)
458+
return req
460459

461460

462461
class RODetailEndpoint(DetailEndpoint):

pynetbox/models/ipam.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def available_ips(self):
5555
>>> len(create)
5656
2
5757
"""
58-
return DetailEndpoint(self, "available-ips")
58+
return DetailEndpoint(self, "available-ips", custom_return=IpAddresses)
5959

6060
@property
6161
def available_prefixes(self):
@@ -86,7 +86,9 @@ def available_prefixes(self):
8686
u'10.1.1.56/29'
8787
8888
"""
89-
return DetailEndpoint(self, "available-prefixes")
89+
return DetailEndpoint(
90+
self, "available-prefixes", custom_return=Prefixes
91+
)
9092

9193

9294
class Aggregates(Record):

tests/test_ipam.py

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -162,18 +162,6 @@ def test_get_available_ips(self, mock):
162162
return_value=Response(fixture='ipam/prefix.json'),
163163
)
164164
def test_create_available_ips(self, _, post):
165-
expected_result = {
166-
'status': 1,
167-
'description': '',
168-
'nat_inside': None,
169-
'role': None,
170-
'vrf': None,
171-
'address':
172-
'10.1.1.1/32',
173-
'interface': None,
174-
'id': 1,
175-
'tenant': None
176-
}
177165
create_parms = dict(
178166
status=2,
179167
)
@@ -186,7 +174,7 @@ def test_create_available_ips(self, _, post):
186174
json=create_parms,
187175
)
188176
self.assertTrue(ret)
189-
self.assertEqual(ret, expected_result)
177+
self.assertTrue(isinstance(ret, pynetbox.models.ipam.IpAddresses))
190178

191179
@patch(
192180
'pynetbox.core.query.requests.sessions.Session.get',
@@ -227,6 +215,7 @@ def test_create_available_prefixes(self, _, post):
227215
json=create_parms,
228216
)
229217
self.assertTrue(ret)
218+
self.assertTrue(isinstance(ret[0], pynetbox.models.ipam.Prefixes))
230219

231220

232221
class IPAddressTestCase(Generic.Tests):

0 commit comments

Comments
 (0)