Zucker

Zucker is a Python wrapper around Sugar’s REST API. The interface is loosely inspired by Django’s ORM syntax. Zucker’s main goal is to abstract away Sugar’s concepts as much as possible and enable a Pythonic, type-safe way to interact with the CRM system.

You can see a very basic example of how it works in the following snippet. In a nutshell, you will need to do two things to interact with a CMR server: First, define a client which will talk with the server. Then, build a data model in Python that matches what you have on the backend – for every Sugar module you want to use, create a class with the corresponding properties. Once that is done, you can use access your records much like a list or another data structure:

from zucker import model, RequestsClient

# This client will use the 'requests' module as an HTTP transport library.
# There are more to choose from here!
crm = RequestsClient("https://crm.example.com", "zucker", "password")

# The data model defined here should match the one on the server - although
# you don't need to include fields that you won't use.
class Contact(model.SyncModule, client=crm, api_name="Contacts"):
    lead_source = model.StringField()
    phone_work = model.StringField()

# .find() returns a View, which is a lazily-fetched construct that points to
# some data on the server, similar to a cursor or queryset in other ORMs:
contacts = Contact.find(Contact.lead_source == "Word of mouth")

print("All contacts got by word of mouth:")
for contact in contacts:
  print(contact.phone_work)

That’s the gist to querying records. Did we mention that Zucker comes without any dependencies? The only thing you need to install is some HTTP transport library – we ship support for requests and aiohttp, but using other libraries is possible as well.

Zucker also includes native support for Asynchronous I/O. That means it seamlessly integrates into existing software stacks, regardless of your concurrency model. Here is the same code as above, but with an asynchronous stack:

import asyncio
from zucker import model, AioClient

# Same as before, only we now use an asynchronous client. This one uses
# aiohttp as the backend.
crm = AioClient("https://crm.example.com", "zucker", "password")

class Contact(model.AsyncModule, client=crm, api_name="Contacts"):
    lead_source = model.StringField()
    phone_work = model.StringField()

async def demo():
    contacts = Contact.find(Contact.lead_source == "Word of mouth")

    print("All contacts got by word of mouth:")
    async for contact in contacts:
      print(contact.phone_work)

asyncio.run(demo())

For a more in-depth guide into all these features, see the following documentation pages: