Skip to content

Commit

Permalink
Merge pull request #100 from KNWR/fix-batch-delete-1-record
Browse files Browse the repository at this point in the history
Fix 422 error when calling batch_delete on a single record
  • Loading branch information
gtalarico committed Sep 25, 2020
2 parents f3830e9 + c0f3b41 commit 6fad039
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 4 deletions.
5 changes: 4 additions & 1 deletion airtable/airtable.py
Expand Up @@ -203,6 +203,9 @@ def _delete(self, url):
return self._request("delete", url)

def _delete_batch(self, record_ids):
if len(record_ids) == 1:
return self.delete(record_ids[0])

return self._request("delete", self.url_table, params={"records": record_ids})

def get(self, record_id):
Expand Down Expand Up @@ -573,7 +576,7 @@ def batch_delete(self, record_ids):
deleted_records = []
for chunk in chunks:
response = self._delete_batch(chunk)
deleted_records += response["records"]
deleted_records += response["records"] if len(chunk) > 1 else [response]
time.sleep(self.API_LIMIT)
return deleted_records

Expand Down
22 changes: 19 additions & 3 deletions tests/test_airtable_class.py
Expand Up @@ -127,7 +127,9 @@ def test_batch_insert(table, mock_records):
with Mocker() as mock:
for chunk in _chunk(mock_records, 10):
mock.post(
table.url_table, status_code=201, json={"records": chunk},
table.url_table,
status_code=201,
json={"records": chunk},
)
records = [i["fields"] for i in mock_records]
resp = table.batch_insert(records)
Expand Down Expand Up @@ -235,17 +237,31 @@ def test_batch_delete(table, mock_records):
for chunk in _chunk(ids, 10):
params = [("records", id_) for id_ in chunk]
params_encode = urlencode(params)
json = (
{"records": [{"delete": True, "id": id_} for id_ in chunk]}
if len(chunk) > 1
else {"delete": True, "id": chunk[0]}
)
url = (
table.url_table + "?" + params_encode
if len(chunk) > 1
else urljoin(table.url_table, chunk[0])
)
mock.delete(
table.url_table + "?" + params_encode,
url,
status_code=201,
json={"records": [{"delete": True, "id": id_} for id_ in chunk]},
json=json,
)

resp = table.batch_delete(ids)
expected = [{"delete": True, "id": i} for i in ids]
assert resp == expected


def test_batch_delete_single_record(table, mock_response_single):
test_batch_delete(table, [mock_response_single])


# Helpers


Expand Down

0 comments on commit 6fad039

Please sign in to comment.