Skip to content

Commit 9021a5a

Browse files
author
Saurabh Badenkal
committed
Strip whitespace from IDs, filter empty update patches, fix README ids[0] reference, use DataFrame index labels in errors
1 parent f7a70d5 commit 9021a5a

2 files changed

Lines changed: 19 additions & 9 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ new_accounts["telephone1"] = ["555-0199", "555-0299"]
263263
client.dataframe.update("account", new_accounts, id_column="accountid")
264264

265265
# Clear a field by setting clear_nulls=True (by default, NaN/None fields are skipped)
266-
df = pd.DataFrame([{"accountid": ids[0], "websiteurl": None}])
266+
df = pd.DataFrame([{"accountid": new_accounts["accountid"].iloc[0], "websiteurl": None}])
267267
client.dataframe.update("account", df, id_column="accountid", clear_nulls=True)
268268

269269
# Delete records by passing a Series of GUIDs

src/PowerPlatform/Dataverse/operations/dataframe.py

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -245,13 +245,14 @@ def update(
245245
if id_column not in changes.columns:
246246
raise ValueError(f"id_column '{id_column}' not found in DataFrame columns")
247247

248-
ids = changes[id_column].tolist()
249-
invalid = [i for i, v in enumerate(ids) if not isinstance(v, str) or not v.strip()]
248+
raw_ids = changes[id_column].tolist()
249+
invalid = [changes.index[i] for i, v in enumerate(raw_ids) if not isinstance(v, str) or not v.strip()]
250250
if invalid:
251251
raise ValueError(
252252
f"id_column '{id_column}' contains invalid values at row index(es) {invalid}. "
253253
"All IDs must be non-empty strings."
254254
)
255+
ids = [v.strip() for v in raw_ids]
255256

256257
change_columns = [column for column in changes.columns if column != id_column]
257258
if not change_columns:
@@ -260,10 +261,18 @@ def update(
260261
)
261262
change_list = dataframe_to_records(changes[change_columns], na_as_null=clear_nulls)
262263

263-
if len(ids) == 1:
264-
self._client.records.update(table, ids[0], change_list[0])
264+
# Filter out rows where all change values were NaN/None (empty dicts)
265+
paired = [(rid, patch) for rid, patch in zip(ids, change_list) if patch]
266+
if not paired:
267+
return
268+
ids_filtered, change_filtered = zip(*paired)
269+
ids_filtered = list(ids_filtered)
270+
change_filtered = list(change_filtered)
271+
272+
if len(ids_filtered) == 1:
273+
self._client.records.update(table, ids_filtered[0], change_filtered[0])
265274
else:
266-
self._client.records.update(table, ids, change_list)
275+
self._client.records.update(table, ids_filtered, change_filtered)
267276

268277
# ----------------------------------------------------------------- delete
269278

@@ -299,15 +308,16 @@ def delete(
299308
if not isinstance(ids, pd.Series):
300309
raise TypeError("ids must be a pandas Series")
301310

302-
id_list = ids.tolist()
303-
if not id_list:
311+
raw_list = ids.tolist()
312+
if not raw_list:
304313
return None
305314

306-
invalid = [i for i, v in enumerate(id_list) if not isinstance(v, str) or not v.strip()]
315+
invalid = [ids.index[i] for i, v in enumerate(raw_list) if not isinstance(v, str) or not v.strip()]
307316
if invalid:
308317
raise ValueError(
309318
f"ids Series contains invalid values at index(es) {invalid}. " "All IDs must be non-empty strings."
310319
)
320+
id_list = [v.strip() for v in raw_list]
311321

312322
if len(id_list) == 1:
313323
self._client.records.delete(table, id_list[0])

0 commit comments

Comments
 (0)