Package: pyconnectwise
pyConnectWise - An API library for ConnectWise Manage and ConnectWise Automate, written in PythonpyConnectWise is a full-featured, type annotated API client written in Python for the ConnectWise APIs based off their OpenAPI schemas.This library has been developed with the intention of making the ConnectWise APIs simple and accessible to non-coders while allowing experienced coders to utilize all features the API has to offer without the boilerplate.pyConnectWise currently supports both ConnectWise Manage and ConnectWise Automate.Features:100% API Coverage.All endpoints and response models have had their code generated from the ConnectWise Manage and ConnectWise Automate OpenAPI schemas.Non-coder friendly.100% annotated for full IDE auto-completion. Clients handle requests and authentication - just plug the right details in and go!Fully annotated.This library has a strong focus on type safety and type hinting. Models are declared and parsed usingPydanticpyConnectWise is currently inpre-release. This means that while it does work, you may come across issues and inconsistencies.As all Endpoint and Model code has been generated, not all of it has been tested. YMMV.Endpoint generation is custom-built, but Pydantic models have been generated using a customised fork ofdatamodel-code-generatorKnown Issues:Currently only parsesResponsemodels. No input models yet.As this project is still a WIP, documentation or code commentary may not always align.Roadmap:Automate API Support- :white_check_mark: DoneRobust error handling- :white_check_mark: DoneTests- :construction: In ProgressInput model validation- :chart_with_upwards_trend: PlannedScreenConnect (Control) API Support- :chart_with_upwards_trend: PlannedBatch requests- :chart_with_upwards_trend: PlannedHow-to:InstallInitializing the API ClientsConnectWise ManageConnectWise AutomateWorking with EndpointsGet manyGet oneGet with paramsChild Endpoints-Example using/company/companies/{company_id}/sitesPaginationAdditional ConfigurationImplementationSupported OptionsExamplesGet all agreements, then all additions for an agreementGet all service tickets with an ID > 1000ContributingPreparing your development environmentQuick dependencies install on apt-based systems (using pipx to manage python tools)Setting up your development environmentTestingSupporting the projectInstallOpen a terminal and runpip install pyconnectwiseorpoetry add pyconnectwiseInitializing the API ClientsConnectWise ManagefrompyconnectwiseimportConnectWiseManageAPIClient# init clientmanage_api_client=ConnectWiseManageAPIClient(# your company name,# manage instance url,# your api client id,# your api public key,# your api private key,# optionally, a Config object for customizing API interactions. See [Additional Configuration].)ConnectWise AutomatefrompyconnectwiseimportConnectWiseAutomateAPIClient# init clientautomate_api_client=ConnectWiseAutomateAPIClient(# your automate url# your client id# automate api username# automate api password,# optionally, a Config object for customizing API interactions. See [Additional Configuration].)Working with EndpointsEndpoints are 1:1 to what's available for both the ConnectWise Manage and ConnectWise Automate as code is generated from their OpenAPI spec.For more information, check out the following resources:ConnectWise Manage REST API Docs (requires ConnectWise Developer account)ConnectWise Automate REST API Docs (requires ConnectWise Developer account)Get many### Manage #### sends GET request to /company/companies endpointcompanies=manage_api_client.company.companies.get()### Automate #### sends GET request to /clients endpointclients=automate_api_client.clients.get()Get one### Manage #### sends GET request to /company/companies/{id} endpointcompany=manage_api_client.company.companies.id(250).get()### Automate #### sends GET request to /clients/{id} endpointclient=automate_api_client.clients.id(250).get()Get with params### Manage #### sends GET request to /company/companies with a conditions query stringconditional_company=manage_api_client.company.companies.get(params={'conditions':'company/id=250'})### Automate #### sends GET request to /clients endpoint with a condition query string# note that the Automate API expects the string 'condition' where-as the Manage API expects the string 'conditions'conditional_client=automate_api_client.clients.get(params={'condition':'company/id=250'})Child EndpointsThe ConnectWise APIs have many instances of endpoints with path parameters - for example,/company/companies/{company_id}/sitesThis also exists in the library. Endpoints provide anidmethod for setting the ID and traversing down the path.Example using/company/companies/{company_id}/sites# equivalent to GET /company/companies/250/sitessites=manage_api_client.company.companies.id(250).sites.get()PaginationThe ConnectWise Manage API paginates data for performance reasons through thepageandpageSizequery parameters.pageSizeis limited to a maximum of 1000.To make working with paginated data easy, Endpoints that implement a GET response with an array also supply apaginated()method. Under the hood this wraps a GET request, but does a lot of neat stuff to make working with pages easier.Working with pagination# initialize a PaginatedResponse instance for /company/companies, starting on page 1 with a pageSize of 100paginated_companies=manage_api_client.company.companies.paginated(1,100)# access the data from the current page using the .data fieldpage_one_data=paginated_companies.data# if there's a next page, retrieve the next page worth of datapaginated_companies.get_next_page()# if there's a previous page, retrieve the previous page worth of datapaginated_companies.get_previous_page()# iterate over all companies on the current pageforcompanyinpaginated_companies:# ... do things ...# iterate over all companies in all pages# this works by yielding every item on the page, then fetching the next page and continuing until there's no data leftforcompanyinpaginated_companies.all():# ... do things ...Additional ConfigurationAs of version0.4.6, pyConnectWise clients now accept a newConfigobject for additional API interaction configuration.ImplementationfrompyconnectwiseimportConnectWiseManageAPIClient,ConnectWiseAutomateAPIClientfrompyconnectwise.configimportConfig# create an instance of Config with your own changes...config=Config(max_retries=5)# ... and hand off to the clients during initializationmanage_api_client=ConnectWiseManageAPIClient(config=config)automate_api_client=ConnectWiseAutomateAPIClient(config=config)Supported OptionsAs of version0.4.6, the following Config options are supported:max_retries- The number of times to re-attempt a request if a HTTP 500 error occurs. Defaults to 3.ExamplesGet all agreements, then all additions for an agreementagreements=api.finance.agreements.paginated(1,1000)foragreementinagreements.all():additions=api.finance.agreements.id(agreement.id).additions.get()Get all service tickets with an ID > 1000tickets=api.service.tickets.get(params={'conditions':'id > 1000'})ContributingContributions to the project are welcome. If you find any issues or have suggestions for improvement, please feel free to open an issue or submit a pull request.When working on the project, please note that there's a few requirements you'll need to install in order to run the project locally. These requirements are stored inrequirements.txtYou can install these requirements by opening a terminal, navigating to the repo's directory and runningpip install -r requirements.txtPreparing your development environmentPrerequisites:Python 3.10+PoetryPre-CommitQuick dependencies install on apt-based systems (using pipx to manage python tools)sudoaptinstallpipx
pipxinstallpoetry
pipxinstallpre-commitSetting up your development environmentpoetryinstall--with=dev
pre-commitinstallTestingpoetryrunpytestSupporting the project:heart: the project and would like to show your support? Please consider donating to the following charities:Black DogCure4 CysticFibrosis FoundationVinnies CEO SleepoutCare.org.au's Ukraine Humanitarian Crisis fundRedFrogs AustraliaLove Your Sister (Sam's 1000)