Skip to content

Commit 9065e5d

Browse files
Create saved search name
1 parent c6f5fec commit 9065e5d

10 files changed

Lines changed: 46 additions & 13 deletions

‎linkedapi/errors.py‎

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,10 @@
3131
"listNotDeletable",
3232
"listNotRenamable",
3333
"savedSearchNotFound",
34-
"interfaceLanguageNotSupported",
34+
"savedSearchAlreadyExists",
35+
"savedSearchLimitReached",
36+
"savedSearchRenameUnconfirmed",
37+
"savedSearchQueryMismatch",
3538
"postNotFound",
3639
"jobNotFound",
3740
"commentingNotAllowed",
@@ -86,7 +89,10 @@
8689
"listNotDeletable",
8790
"listNotRenamable",
8891
"savedSearchNotFound",
89-
"interfaceLanguageNotSupported",
92+
"savedSearchAlreadyExists",
93+
"savedSearchLimitReached",
94+
"savedSearchRenameUnconfirmed",
95+
"savedSearchQueryMismatch",
9096
"postNotFound",
9197
"jobNotFound",
9298
"commentingNotAllowed",

‎linkedapi/operations/nv_create_saved_search.py‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66

77

88
class NvCreateSavedSearch(Operation[NvCreateSavedSearchParams, NvCreatedSavedSearch]):
9-
"""Save a Sales Navigator search URL matching the requested type. Returns its id, name,
10-
type and URL. English interface only.
9+
"""Save a Sales Navigator search URL matching the requested type. Optional name: trimmed,
10+
single line, 1-256 characters, unique per type (savedSearchAlreadyExists). Returns its id,
11+
name, type and URL.
1112
"""
1213

1314
operation_name = "nvCreateSavedSearch"

‎linkedapi/operations/nv_delete_saved_search.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
class NvDeleteSavedSearch(Operation[NvDeleteSavedSearchParams, None]):
99
"""Delete an owned saved search by its string ID. An absent search returns
10-
savedSearchNotFound. English interface only.
10+
savedSearchNotFound.
1111
"""
1212

1313
operation_name = "nvDeleteSavedSearch"

‎linkedapi/operations/nv_remove_account_from_list.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
class NvRemoveAccountFromList(Operation[NvRemoveAccountFromListParams, None]):
99
"""Remove an account from exactly one owned custom list, keeping it saved even after its
10-
last list. Repeating an absent membership succeeds. English interface only.
10+
last list. Repeating an absent membership succeeds.
1111
"""
1212

1313
operation_name = "nvRemoveAccountFromList"

‎linkedapi/operations/nv_remove_lead_from_list.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
class NvRemoveLeadFromList(Operation[NvRemoveLeadFromListParams, None]):
99
"""Remove a lead from exactly one owned custom list, keeping it saved and in its other
10-
lists. Repeating an absent membership succeeds. English interface only.
10+
lists. Repeating an absent membership succeeds.
1111
"""
1212

1313
operation_name = "nvRemoveLeadFromList"

‎linkedapi/operations/nv_rename_list.py‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
class NvRenameList(Operation[NvRenameListParams, NvCreatedList]):
99
"""Rename an owned custom list. Trimmed name: 1-75 characters, no line breaks. Same name
1010
succeeds; duplicates return listAlreadyExists and system lists return listNotRenamable.
11-
English interface only.
1211
"""
1312

1413
operation_name = "nvRenameList"

‎linkedapi/types/nv_saved_searches.py‎

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from __future__ import annotations
22

3-
from typing import Literal
3+
from typing import Annotated, Literal
44

5-
from pydantic import Field
5+
from pydantic import Field, StringConstraints
66

77
from linkedapi.types.base import LinkedApiModel
88
from linkedapi.types.params import BaseActionParams
@@ -15,6 +15,18 @@ class NvRetrieveSavedSearchesParams(BaseActionParams):
1515
class NvCreateSavedSearchParams(BaseActionParams):
1616
type: Literal["lead", "account"]
1717
custom_search_url: str = Field(min_length=1)
18+
name: (
19+
Annotated[
20+
str,
21+
StringConstraints(
22+
strip_whitespace=True,
23+
min_length=1,
24+
max_length=256,
25+
pattern=r"^[^\r\n\u2028\u2029]+$",
26+
),
27+
]
28+
| None
29+
) = None
1830

1931

2032
class NvDeleteSavedSearchParams(BaseActionParams):

‎tests/test_errors.py‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,10 @@ def test_error_type_sets_match_node_contract() -> None:
6262
"listNotDeletable",
6363
"listNotRenamable",
6464
"savedSearchNotFound",
65-
"interfaceLanguageNotSupported",
65+
"savedSearchAlreadyExists",
66+
"savedSearchLimitReached",
67+
"savedSearchRenameUnconfirmed",
68+
"savedSearchQueryMismatch",
6669
"postNotFound",
6770
"jobNotFound",
6871
"commentingNotAllowed",

‎tests/test_nv_backlog.py‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,14 @@ def client() -> LinkedApi:
7979
NvCreateSavedSearchParams(type="lead", custom_search_url=SEARCH_URL),
8080
{"type": "lead", "customSearchUrl": SEARCH_URL},
8181
),
82+
(
83+
"nv_create_saved_search",
84+
"nv.createSavedSearch",
85+
NvCreateSavedSearchParams(
86+
type="lead", custom_search_url=SEARCH_URL, name=" Heads of Sales "
87+
),
88+
{"type": "lead", "customSearchUrl": SEARCH_URL, "name": "Heads of Sales"},
89+
),
8290
(
8391
"nv_delete_saved_search",
8492
"nv.deleteSavedSearch",
@@ -220,3 +228,9 @@ def test_public_action_errors(operation: str, action: str, error_type: str) -> N
220228
)
221229
assert result.data is None
222230
assert [item.model_dump() for item in result.errors] == [error]
231+
232+
233+
@pytest.mark.parametrize("name", ["", " ", "a" * 257, "Heads\nof Sales"])
234+
def test_create_saved_search_rejects_invalid_names(name: str) -> None:
235+
with pytest.raises(ValidationError):
236+
NvCreateSavedSearchParams(type="lead", custom_search_url=SEARCH_URL, name=name)

‎tests/test_nv_list_management.py‎

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,6 @@ def test_delete_exact_string_id_and_void_result(requests_mock: requests_mock.Moc
8787
("nv_create_list", "nv.createList", error)
8888
for error in [
8989
"listAlreadyExists",
90-
"interfaceLanguageNotSupported",
9190
"noSalesNavigator",
9291
"unexpectedError",
9392
]
@@ -97,7 +96,6 @@ def test_delete_exact_string_id_and_void_result(requests_mock: requests_mock.Moc
9796
for error in [
9897
"listNotFound",
9998
"listNotDeletable",
100-
"interfaceLanguageNotSupported",
10199
"noSalesNavigator",
102100
"unexpectedError",
103101
]

0 commit comments

Comments
 (0)