Skip to content
Snippets Groups Projects
Commit f8cda1bf authored by Hugh Dickinson's avatar Hugh Dickinson
Browse files

Functionality to add shopping items to basket from IDA.

parent 2d135a3f
No related branches found
No related tags found
1 merge request!6Draft: Functionality to add shopping items to basket from IDA.
...@@ -36,9 +36,13 @@ class shopping_client: ...@@ -36,9 +36,13 @@ class shopping_client:
self.connectors = connectors self.connectors = connectors
self.basket = None self.basket = None
self.username = None
def get_basket( def get_basket(
self, convert_to_pandas: bool = False, reload: bool = False, filter_archives: bool = False self,
convert_to_pandas: bool = False,
reload: bool = False,
filter_archives: bool = False,
) -> Union[list, pd.DataFrame, None]: ) -> Union[list, pd.DataFrame, None]:
"""Retrieve the shopping basket for a user. """Retrieve the shopping basket for a user.
Prompts for access token if one was not supplied to constructor. Prompts for access token if one was not supplied to constructor.
...@@ -87,6 +91,56 @@ class shopping_client: ...@@ -87,6 +91,56 @@ class shopping_client:
return self.basket return self.basket
def add_to_basket(self, items: list):
"""Add items to user's shopping basket.
Parameters
----------
items : list
List of objects, each containing the data for a single
shopping item. Objects should be JSON-serializable. Examples
include Python `dict`s or `list`s.
Returns
-------
bool
`True` if items were successfully added otherwise `False`.
"""
url = urllib.parse.urljoin(self.host, shopping_client.endpoint)
if self.username is None:
# Retrieve username
response = requests.get(url, headers=self._request_header())
if response.ok:
self.username = json.loads(response.content)["results"][0]["user_name"]
else:
warn(
f"Unable to retrieve username from {self.host}; is your key valid?"
)
return False, response
# PATCH not working properly need to add existing basket items
payload = {
"shopping_cart": [
json.loads(item["item_data"]) for item in self.get_basket()
]
+ items
}
# trailing "/" required for PATCH
url = urllib.parse.urljoin(url, self.username) + "/"
response = requests.patch(url, json=payload, headers=self._request_header())
if response.ok:
print(
f"{len(items)} item{'s' if len(items) > 1 else ''} successfully added."
)
return True
else:
warn(f"Unable to add data to basket at {self.host}; is your key valid?")
return False, response
def _request_header(self): def _request_header(self):
while self.token is None: while self.token is None:
self._get_token() self._get_token()
...@@ -102,12 +156,14 @@ class shopping_client: ...@@ -102,12 +156,14 @@ class shopping_client:
item_data = json.loads(item["item_data"]) item_data = json.loads(item["item_data"])
for connector in self.connectors: for connector in self.connectors:
if "archive" in item_data and item_data["archive"] == connector.archive: if (
"archive" in item_data
and item_data["archive"] == connector.archive
):
filtered_items.append(item) filtered_items.append(item)
return filtered_items return filtered_items
def _basket_to_pandas(self): def _basket_to_pandas(self):
if len(self.connectors): if len(self.connectors):
converted_basket = { converted_basket = {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment