Unicat API How-To's

Up - Home


Use the Python SDK

You can install the official Unicat client lib from PyPI.

pip install unicat

Connect to Unicat

import sys
from unicat import Unicat
from .env import project_gid, local_folder
import keyring
secret_api_key = keyring.get_password("unicat-my-project", "my-key-name")

unicat = Unicat("https://unicat.app", project_gid, secret_api_key, local_folder)
if not unicat.connect():
    print("Invalid connection settings")
    sys.exit(1)

You'll need the project key (a gid) and the API key. The local folder is used for uploads and downloads (for assets).

Languages, channels, and other project settings

Once we have the connection, we can explore the project and its settings:

project = unicat.project
print(project.name)
print(project.owner.username)
print(project.languages)
print(project.channels)
print(project.orderings)
print(project.fieldlists)

language = project.default_language
channel = unicat.project.channels["Main channel"]  # or unicat.project.default_channel
ordering = unicat.project.orderings["Main ordering"]  # .default_ordering
fieldlist = unicat.project.fieldlists["Main fieldlist"]  # .default_fieldlist

List all the fields by name and type

Once we have the connection, we can iterate over all the fields, for example:

for field in unicat.walk_fields():
    print(field.name, field.type)

Walkables

There are a number of walk_… methods where we iterate over a list, or over a resultset.

If we want to download all assets:

for asset in unicat.walk_asset_tree():
    if asset.is_file:
        asset.download()

Or, if we want to go through all records that have a definition named 'brand', then print all the field names and values:

brand_definition = unicat.get_definition_by_name("brand")

for totalsize, record in unicat.walk_record_query(
    language,
    DuckObject(
        q="",
        filter=["definition", "is", brand_definition.gid],
    ),
):
    fields = record.fields[language]
    for field in fields:
        print(field.field.name, field.value)

Let's print the whole record tree, with fieldlist fields for each article record:

for record in unicat.walk_record_tree():
    print(record.treelevel, record.definition.name, record.title[language])
    if record.definition.name == "article":
        fields = record.fields[language]
        for field in record.definition.fieldlists[fieldlist]:
            print(field.field.name, field.value)

Update a record

unicat.mutate.update_record(record, {language: {"price": 19.95}})

For a reference, see the Python Unicat SDK documentation.