Skip to content

Commit 967c9d8

Browse files
authored
Allow query by record with nested sys_id (#147)
1 parent fcdf582 commit 967c9d8

File tree

2 files changed

+23
-16
lines changed

2 files changed

+23
-16
lines changed

pysnow/request.py

+23-15
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import logging
44
import json
5+
import six
56

67
from .response import Response
78
from .exceptions import InvalidUsage
@@ -67,14 +68,31 @@ def _get_response(self, method, **kwargs):
6768
stream=use_stream,
6869
)
6970

71+
def _get_custom_endpoint(self, value):
72+
if isinstance(value, dict) and "value" in value:
73+
value = value["value"]
74+
elif not isinstance(value, six.string_types):
75+
raise InvalidUsage(
76+
"Argument 'path_append' must be a string in the following format: "
77+
"/path-to-append[/.../...]"
78+
)
79+
80+
segment = value if value.startswith("/") else "/{0}".format(value)
81+
return self._url_builder.get_appended_custom(segment)
82+
7083
def get(self, *args, **kwargs):
7184
"""Fetches one or more records
7285
7386
:return:
7487
- :class:`pysnow.Response` object
7588
"""
7689

77-
self._parameters.query = kwargs.pop("query", {}) if len(args) == 0 else args[0]
90+
query = kwargs.pop("query", {}) if len(args) == 0 else args[0]
91+
for key, value in query.items():
92+
if isinstance(value, dict):
93+
query[key] = value["value"]
94+
95+
self._parameters.query = query
7896
self._parameters.limit = kwargs.pop("limit", 10000)
7997
self._parameters.offset = kwargs.pop("offset", 0)
8098
self._parameters.fields = kwargs.pop("fields", kwargs.pop("fields", []))
@@ -109,11 +127,9 @@ def update(self, query, payload):
109127
if not isinstance(payload, dict):
110128
raise InvalidUsage("Update payload must be of type dict")
111129

112-
record = self.get(query).one()
130+
record = self.get(query=query).one()
113131

114-
self._url = self._url_builder.get_appended_custom(
115-
"/{0}".format(record["sys_id"])
116-
)
132+
self._url = self._get_custom_endpoint(record["sys_id"])
117133
return self._get_response("PUT", data=json.dumps(payload))
118134

119135
def delete(self, query):
@@ -125,10 +141,8 @@ def delete(self, query):
125141
"""
126142

127143
record = self.get(query=query).one()
144+
self._url = self._get_custom_endpoint(record["sys_id"])
128145

129-
self._url = self._url_builder.get_appended_custom(
130-
"/{0}".format(record["sys_id"])
131-
)
132146
return self._get_response("DELETE").one()
133147

134148
def custom(self, method, path_append=None, **kwargs):
@@ -142,12 +156,6 @@ def custom(self, method, path_append=None, **kwargs):
142156
- :class:`pysnow.Response` object
143157
"""
144158
if path_append is not None:
145-
try:
146-
self._url = self._url_builder.get_appended_custom(path_append)
147-
except InvalidUsage:
148-
raise InvalidUsage(
149-
"Argument 'path_append' must be a string in the following format: "
150-
"/path-to-append[/.../...]"
151-
)
159+
self._url = self._get_custom_endpoint(path_append)
152160

153161
return self._get_response(method, **kwargs)

tests/test_resource.py

-1
Original file line numberDiff line numberDiff line change
@@ -646,7 +646,6 @@ def test_custom_with_path(self):
646646
def test_custom_with_path_invalid(self):
647647
""":meth:`custom` should raise an exception if the provided path is invalid"""
648648

649-
self.assertRaises(InvalidUsage, self.resource.request, "GET", path_append="foo")
650649
self.assertRaises(
651650
InvalidUsage, self.resource.request, "GET", path_append={"foo": "bar"}
652651
)

0 commit comments

Comments
 (0)