catalogs API¶
client.catalogs reads the post-definition catalogs and their entries, and writes catalogs and
entries through the admin endpoints (admin permissions required).
Reading¶
from pynteracta.client import InteractaClient
with InteractaClient(base_url="https://tenant.example.com", credentials=...) as client:
catalogs = client.catalogs.list([5, 8], load_entries=True)
for catalog in catalogs.items_typed:
print(catalog.id, catalog.name, catalog.paged)
for entry in client.catalogs.iterate_entries(5, page_size=50):
print(entry.id, entry.label, entry.external_id)
Pass the catalog IDs: list() without IDs answers an empty CatalogList, whether the client
logs in with a service account or with Google OAuth2 (verified on the test tenant), even when the
same catalogs are readable by ID. The IDs used by a community's fields are in the field metadata
of its post definition, as strings:
with InteractaClient(base_url="https://tenant.example.com", credentials=...) as client:
definition = client.communities.post_definition(21)
catalog_ids = sorted(
{
int(field.metadata["catalog_id"])
for field in definition.field_definitions
if field.metadata and "catalog_id" in field.metadata
}
)
catalogs = client.catalogs.list(catalog_ids)
A disabled catalog is no longer returned: list([id]) with a disabled catalog answers 400 with
NOT_EXISTS on catalogIds.
Edit forms¶
get_for_edit(catalog_id) and get_entry_for_edit(catalog_id, entry_id) read the admin edit
forms. They are aliases of client.admin_manage.catalog_for_edit() and
catalog_entry_for_edit(): same request, same facade. Each facade exposes occ_token, the
concurrency token for the next edit; CatalogForEdit also exposes parent_catalog_id. Languages
whose value is null in a name or label map are dropped from the facade.
Writing catalogs¶
with InteractaClient(base_url="https://tenant.example.com", credentials=...) as client:
created = client.catalogs.create(name={"it": "Sedi", "en": "Sites"}, parent_id=3)
print(created.catalog_id, created.next_occ_token)
form = client.catalogs.get_for_edit(created.catalog_id)
# The name map is replaced as a whole: pass every language you want to keep.
edited = client.catalogs.edit(
created.catalog_id, form.occ_token, name={**form.name, "en": "Offices"}
)
client.catalogs.set_deleted(created.catalog_id, True) # logical deletion
client.catalogs.set_deleted(created.catalog_id, False) # restore
create(name=..., parent_id=...)andedit(catalog_id, occ_token, name=..., parent_id=...)send only the fields given and return aCatalogWriteResult(catalog_id,catalog,parent_catalog,next_occ_token,.raw).set_deleted(catalog_id, deleted)changes the logicaldeletedflag (nooccTokenneeded) and returns aCatalogDeletedResult(catalog_id,entry_id,deleted,.raw). Catalogs are never removed: the API has no physical deletion.deletedis not an argument ofedit: useset_deleted, oredit_rawwith aCreateEditCatalogRequestDTOif you need it in thePUT.create_raw(req)andedit_raw(catalog_id, req)take a pre-built DTO.
Omitted fields (verified on the test tenant): the server replaces the whole name map on
every edit. The languages missing from name lose their text, and the it language takes the
text you passed. Read the form and send the full map, as above; catalogs edit in the CLI does
it for you.
Writing catalog entries¶
with InteractaClient(base_url="https://tenant.example.com", credentials=...) as client:
entry = client.catalogs.create_entry(5, label={"it": "Bologna"}, external_id="BO")
form = client.catalogs.get_entry_for_edit(5, entry.entry_id)
client.catalogs.edit_entry(
5,
entry.entry_id,
form.occ_token,
label={**form.label, "en": "Bologna"},
external_id=form.external_id,
)
client.catalogs.set_entry_deleted(5, entry.entry_id, True)
create_entry(catalog_id, label=..., parent_ids=..., external_id=...)andedit_entry(catalog_id, entry_id, occ_token, ...)return aCatalogEntryWriteResult(entry_id,catalog_id,entry,next_occ_token,.raw).set_entry_deleted(catalog_id, entry_id, deleted)returns aCatalogDeletedResult. The swagger declares the catalog response (catalogId), but the tenant answers withentryId: the result always has both ids, completing the missing one with the id you passed.
Omitted fields (verified on the test tenant): the label map is replaced as a whole, like the
catalog name, and the external id and the parent entries missing from the request are
cleared. Send them back from the form, as above; catalogs edit-entry in the CLI does it for
you.
Every write sends one request and never retries: a 409 raises ConcurrencyError, a timeout or
network error raises TransportError with an unknown outcome (ADR 0001).
API Reference¶
pynteracta.api.catalogs.CatalogsAPI
¶
Bases: ResourceClient
Client for post-definition catalog endpoints and the admin catalog writes.
Le scritture (spec 06) inviano solo i campi passati, in una sola richiesta: un errore del
server o di rete risale al chiamante, mai un nuovo tentativo (ADR 0001). Il token di
concorrenza lo fornisce il chiamante, letto da :meth:get_for_edit o
:meth:get_entry_for_edit; un 409 è ConcurrencyError. Il flag deleted si cambia
con :meth:set_deleted e :meth:set_entry_deleted (cancellazione logica, reversibile), non
con edit; chi lo vuole nel PUT usa le varianti *_raw. La semantica del server sui
campi omessi è documentata in docs/api/catalogs.md.
list(catalog_ids=None, *, load_entries=False)
¶
POST /communication/settings/post-definition/catalogs.
Legge le intestazioni dei cataloghi con gli id indicati. Non è un filtro: senza id il
server risponde con una lista vuota (verificato sul tenant con service account e Google
OAuth2). Gli id si ricavano da metadata["catalog_id"] dei campi della definizione dei
post di una community.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
catalog_ids
|
list[int] | None
|
Id dei cataloghi da leggere; senza id la risposta è vuota. |
None
|
load_entries
|
bool
|
Con |
False
|
list_raw(req, *, load_entries=False)
¶
POST catalog list with a pre-built request DTO (escape hatch).
entries(catalog_id, *, page_token=None, page_size=None, calculate_total_items_count=None, label=None, order_by=None, order_desc=None, **filters)
¶
POST /communication/settings/post-definition/catalogs/{catalogId}/entries.
Retrieve a page of entries for the given catalog.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
catalog_id
|
int
|
Unique catalog identifier. |
required |
page_token
|
str | None
|
Pagination token from a previous response. |
None
|
page_size
|
int | None
|
Number of entries per page. |
None
|
calculate_total_items_count
|
bool | None
|
Include total count in the response when |
None
|
label
|
str | None
|
Filter entries by label substring. |
None
|
order_by
|
str | None
|
Sort field ( |
None
|
order_desc
|
bool | None
|
Sort descending when |
None
|
entries_raw(catalog_id, req)
¶
POST catalog entries with a pre-built request DTO (escape hatch).
iterate_entries(catalog_id, *, page_size=None, **filters)
¶
Lazy iterator over all pages of :meth:entries.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
catalog_id
|
int
|
Unique catalog identifier. |
required |
page_size
|
int | None
|
Number of entries per page. |
None
|
get_for_edit(catalog_id)
¶
GET /admin/manage/catalogs/{catalogId}/edit.
Alias di :meth:~pynteracta.api.admin_manage.AdminManageAPI.catalog_for_edit: stessa
richiesta, stessa façade, con occ_token per :meth:edit.
get_entry_for_edit(catalog_id, entry_id)
¶
GET /admin/manage/catalogs/{catalogId}/entries/{entryId}/edit.
Alias di :meth:~pynteracta.api.admin_manage.AdminManageAPI.catalog_entry_for_edit, con
occ_token per :meth:edit_entry.
create(*, name=None, parent_id=None)
¶
POST /admin/manage/catalogs: crea un catalogo.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
name
|
dict[str, str] | None
|
Nome per lingua, per esempio |
None
|
parent_id
|
int | None
|
Id del catalogo parent (dipendenza gerarchica). |
None
|
create_raw(req)
¶
POST /admin/manage/catalogs da un DTO già costruito.
edit(catalog_id, occ_token, *, name=None, parent_id=None)
¶
PUT /admin/manage/catalogs/{catalogId}: modifica un catalogo.
Il corpo contiene solo i campi passati più l'occToken; i campi omessi non vengono
inviati e cosa ne fa il server è scritto in docs/api/catalogs.md.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
catalog_id
|
int
|
Il catalogo da modificare. |
required |
occ_token
|
int
|
Token letto da |
required |
name
|
dict[str, str] | None
|
Nome per lingua. |
None
|
parent_id
|
int | None
|
Id del catalogo parent. |
None
|
edit_raw(catalog_id, req)
¶
PUT /admin/manage/catalogs/{catalogId} da un DTO già costruito.
Il DTO porta l'occToken e può portare deleted.
set_deleted(catalog_id, deleted)
¶
PUT /admin/manage/catalogs/{catalogId}/deleted: disabilita o ripristina.
La cancellazione è logica: il catalogo resta sul tenant con deleted: true e si
ripristina con deleted=False. L'endpoint non chiede occToken.
create_entry(catalog_id, *, label=None, parent_ids=None, external_id=None)
¶
POST /admin/manage/catalogs/{catalogId}/entries: crea una voce.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
catalog_id
|
int
|
Il catalogo della voce. |
required |
label
|
dict[str, str] | None
|
Etichetta per lingua, per esempio |
None
|
parent_ids
|
list[int] | None
|
Id delle voci parent (cataloghi gerarchici). |
None
|
external_id
|
str | None
|
Id esterno univoco. |
None
|
create_entry_raw(catalog_id, req)
¶
POST /admin/manage/catalogs/{catalogId}/entries da un DTO già costruito.
edit_entry(catalog_id, entry_id, occ_token, *, label=None, parent_ids=None, external_id=None)
¶
PUT /admin/manage/catalogs/{catalogId}/entries/{entryId}: modifica una voce.
Il corpo contiene solo i campi passati più l'occToken; i campi omessi non vengono
inviati (semantica del server in docs/api/catalogs.md).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
catalog_id
|
int
|
Il catalogo della voce. |
required |
entry_id
|
int
|
La voce da modificare. |
required |
occ_token
|
int
|
Token letto da |
required |
label
|
dict[str, str] | None
|
Etichetta per lingua. |
None
|
parent_ids
|
list[int] | None
|
Id delle voci parent. |
None
|
external_id
|
str | None
|
Id esterno univoco. |
None
|
edit_entry_raw(catalog_id, entry_id, req)
¶
PUT /admin/manage/catalogs/{catalogId}/entries/{entryId} da un DTO già costruito.
set_entry_deleted(catalog_id, entry_id, deleted)
¶
PUT /admin/manage/catalogs/{catalogId}/entries/{entryId}/deleted.
Disabilita (deleted=True) o ripristina una voce; cancellazione logica, senza
occToken. La risposta può portare catalogId o entryId: il risultato ha sempre
entrambi gli id.
Facade models¶
pynteracta.models.facade.catalogs.CatalogList
¶
Facade over :class:~generated.GetPostDefinitionCatalogsResponseDTO.
Attributes:
| Name | Type | Description |
|---|---|---|
raw |
The underlying generated DTO. |
Source code in src/pynteracta/models/facade/catalogs.py
pynteracta.models.facade.catalogs.Catalog
¶
Narrow facade over :class:~generated.CatalogDTOModel.
Attributes:
| Name | Type | Description |
|---|---|---|
raw |
The underlying generated DTO; access additional fields via this escape hatch. |
Source code in src/pynteracta/models/facade/catalogs.py
entries_typed
property
¶
Voci del catalogo, se la risposta le contiene, come façade :class:CatalogEntry.
etag
property
¶
Versione del catalogo restituita dal server.
id
property
¶
Unique catalog identifier.
name
property
¶
Catalog name.
paged
property
¶
Whether this catalog is paginated.
from_raw(raw)
classmethod
¶
from_stub(stub)
classmethod
¶
Rivalida uno stub CatalogDTO in :class:Catalog.
Source code in src/pynteracta/models/facade/catalogs.py
pynteracta.models.facade.catalogs.CatalogEntryList
¶
Facade over :class:~generated.ListPostDefinitionCatalogEntriesResponseDTO.
Attributes:
| Name | Type | Description |
|---|---|---|
raw |
The underlying generated DTO. |
Source code in src/pynteracta/models/facade/catalogs.py
items
property
¶
Raw entry items (generated stubs).
items_typed
property
¶
Entry items re-validated as typed :class:CatalogEntry facades.
next_page_token
property
¶
Token for the next page, or None on the last page.
total_items_count
property
¶
Total entry count (present only when calculateTotalItemsCount was requested).
from_dict(data)
classmethod
¶
Parse from a raw API response dict.
pynteracta.models.facade.catalogs.CatalogEntry
¶
Narrow facade over :class:~generated.CatalogEntryDTO1.
Attributes:
| Name | Type | Description |
|---|---|---|
raw |
The underlying generated DTO. |
Source code in src/pynteracta/models/facade/catalogs.py
catalog_id
property
¶
Id del catalogo a cui appartiene la voce.
deleted
property
¶
Se la voce è disabilitata (cancellazione logica).
external_id
property
¶
External identifier for this entry.
id
property
¶
Unique entry identifier.
label
property
¶
Entry label (display value).
parent_ids
property
¶
Parent entry identifiers (for hierarchical catalogs).
from_raw(raw)
classmethod
¶
from_stub(stub)
classmethod
¶
Rivalida uno stub CatalogEntryDTO in :class:CatalogEntry.
Source code in src/pynteracta/models/facade/catalogs.py
pynteracta.models.facade.catalogs.CatalogWriteResult
¶
Façade sulla risposta di catalogs.create ed catalogs.edit (spec 06).
Attributes:
| Name | Type | Description |
|---|---|---|
raw |
Il DTO generato |
Source code in src/pynteracta/models/facade/catalogs.py
catalog
property
¶
Il catalogo scritto, come restituito dal server.
catalog_id
property
¶
Id del catalogo: dalla risposta, altrimenti quello passato dal chiamante.
next_occ_token
property
¶
Token di concorrenza da usare per la modifica successiva.
parent_catalog
property
¶
Il catalogo parent, se c'è.
from_dict(data, catalog_id=None)
classmethod
¶
Legge la risposta grezza; catalog_id completa le risposte senza catalogo.
Source code in src/pynteracta/models/facade/catalogs.py
pynteracta.models.facade.catalogs.CatalogEntryWriteResult
¶
Façade sulla risposta di catalogs.create_entry ed catalogs.edit_entry (spec 06).
Attributes:
| Name | Type | Description |
|---|---|---|
raw |
Il DTO generato |
Source code in src/pynteracta/models/facade/catalogs.py
catalog_id
property
¶
Id del catalogo: dalla voce restituita, altrimenti quello passato.
entry
property
¶
La voce scritta, come restituita dal server.
entry_id
property
¶
Id della voce: dalla risposta, altrimenti quello passato.
next_occ_token
property
¶
Token di concorrenza da usare per la modifica successiva.
from_dict(data, catalog_id, entry_id=None)
classmethod
¶
Legge la risposta grezza; gli id completano le risposte senza voce.
Source code in src/pynteracta/models/facade/catalogs.py
pynteracta.models.facade.catalogs.CatalogDeletedResult
¶
Façade sulla risposta di set_deleted e set_entry_deleted (spec 06).
Lo swagger dichiara per entrambi gli endpoint la risposta del catalogo (catalogId) ma
definisce anche un DTO con entryId: la façade legge l'id presente e completa l'altro con
quello passato dal chiamante.
Attributes:
| Name | Type | Description |
|---|---|---|
raw |
|
Source code in src/pynteracta/models/facade/catalogs.py
catalog_id
property
¶
Id del catalogo: dalla risposta, altrimenti quello passato.
deleted
property
¶
Il valore del flag deleted dopo la scrittura.
entry_id
property
¶
Id della voce (None per un catalogo): dalla risposta, altrimenti quello passato.
from_dict(data, catalog_id, entry_id=None)
classmethod
¶
Sceglie il DTO dalla chiave presente (entryId o catalogId).