8000 fixes #8: keeps the filter[*] parameters in the original order · juno249/wc-api-python@51fe555 · GitHub
[go: up one dir, main page]

Skip to content

Commit 51fe555

Browse files
committed
fixes woocommerce#8: keeps the filter[*] parameters in the original order
1 parent baf03ca commit 51fe555

File tree

2 files changed

+32
-3
lines changed

2 files changed

+32
-3
lines changed

tests.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
""" API Tests """
22
import unittest
33
import woocommerce
4+
from woocommerce import oauth
45
from httmock import all_requests, HTTMock
56

67

@@ -116,3 +117,19 @@ def woo_test_mock(*args, **kwargs):
116117
# call requests
117118
status = self.api.delete("products").status_code
118119
self.assertEqual(status, 200)
120+
121+
def test_oauth_sorted_params(self):
122+
def check_sorted(keys, expected):
123+
params = oauth.OrderedDict()
124+
for key in keys:
125+
params[key] = ''
126+
127+
ordered = oauth.OAuth.sorted_params(params).keys()
128+
self.assertEqual(ordered, expected)
129+
130+
check_sorted(['a', 'b'], ['a', 'b'])
131+
check_sorted(['b', 'a'], ['a', 'b'])
132+
check_sorted(['a', 'b[a]', 'b[b]', 'b[c]', 'c'], ['a', 'b[a]', 'b[b]', 'b[c]', 'c'])
133+
check_sorted(['a', 'b[c]', 'b[a]', 'b[b]', 'c'], ['a', 'b[c]', 'b[a]', 'b[b]', 'c'])
134+
check_sorted(['d', 'b[c]', 'b[a]', 'b[b]', 'c'], ['b[c]', 'b[a]', 'b[b]', 'c', 'd'])
135+
check_sorted(['a1', 'b[c]', 'b[a]', 'b[b]', 'a2'], ['a1', 'a2', 'b[c]', 'b[a]', 'b[b]'])

woocommerce/oauth.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def __init__(self, url, consumer_key, consumer_secret, **kwargs):
3939

4040
def get_oauth_url(self):
4141
""" Returns the URL with OAuth params """
42-
params = {}
42+
params = OrderedDict()
4343

4444
if "?" in self.url:
4545
url = self.url[:self.url.find("?")]
@@ -68,8 +68,8 @@ def generate_oauth_signature(self, params, url):
6868
del params["oauth_signature"]
6969

7070
base_request_uri = quote(url, "")
71+
params = self.sorted_params(params)
7172
params = self.normalize_parameters(params)
72-
params = OrderedDict(sorted(params.items()))
7373
query_params = ["{param_key}%3D{param_value}".format(param_key=key, param_value=value)
7474
for key, value in params.items()]
7575

@@ -88,11 +88,23 @@ def generate_oauth_signature(self, params, url):
8888

8989
return b64encode(hash_signature).decode("utf-8").replace("\n", "")
9090

91+
@staticmethod
92+
def sorted_params(params):
93+
ordered = OrderedDict()
94+
base_keys = sorted(set(k.split('[')[0] for k in params.keys()))
95+
96+
for base in base_keys:
97+
for key in params.keys():
98+
if key == base or key.startswith(base + '['):
99+
ordered[key] = params[key]
100+
101+
return ordered
102+
91103
@staticmethod
92104
def normalize_parameters(params):
93105
""" Normalize parameters """
94106
params = params or {}
95-
normalized_parameters = {}
107+
normalized_parameters = OrderedDict()
96108

97109
def get_value_like_as_php(val):
98110
""" Prepare value for quote """

0 commit comments

Comments
 (0)
0