Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 17 additions & 1 deletion sources/pipedrive/helpers/custom_fields_munger.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Any, Dict, TypedDict, Optional
from typing import Any, Dict, TypedDict, Optional, List

import dlt

Expand Down Expand Up @@ -93,10 +93,26 @@ def rename_fields(data: TDataPage, fields_mapping: Dict[str, Any]) -> TDataPage:
options_map = field["options"]
# Get label instead of ID for 'enum' and 'set' fields
if field_value and field["field_type"] == "set": # Multiple choice
field_value = _coerce_set_field_value(field_value)
field_value = [
options_map.get(str(enum_id), enum_id) for enum_id in field_value
]
elif field_value and field["field_type"] == "enum":
field_value = options_map.get(str(field_value), field_value)
data_item[field_name] = field_value
return data


def _coerce_set_field_value(field_value: Any) -> List[Any]:
"""Normalize Pipedrive `set` custom fields to a list of option ids."""
if isinstance(field_value, str):
return [
option_id.strip()
for option_id in field_value.split(",")
if option_id.strip()
]
if isinstance(field_value, list):
return field_value
if isinstance(field_value, tuple):
return list(field_value)
return [field_value]
22 changes: 22 additions & 0 deletions tests/pipedrive/test_pipedrive_source.py
Original file line number Diff line number Diff line change
Expand Up @@ -439,6 +439,28 @@ def test_rename_fields_with_set() -> None:
assert result == [{"custom_field_1": ["b", "a", "c"], "id": 44, "name": "asdf"}]


def test_rename_fields_with_set_csv_string() -> None:
data_item = {"random_hash_1": "62,63,65", "id": 44, "name": "asdf"}
mapping = {
"random_hash_1": {
"name": "services",
"normalized_name": "services",
"field_type": "set",
"options": {"62": "Service A", "63": "Service B", "65": "Service C"},
}
}

result = rename_fields([data_item], mapping)

assert result == [
{
"services": ["Service A", "Service B", "Service C"],
"id": 44,
"name": "asdf",
}
]


def test_recents_none_data_items_from_recents() -> None:
pytest.skip("Unskip after setting up credentials.")
"""Pages from /recents sometimes contain `None` data items which cause errors.
Expand Down