nextplus 0.1.3
A Python SDK for interacting with the Next Plus MES system
License: MIT
Requires Python: >=2.7
Keywords: nextplus mes api sdk

# Nextplus Python SDK

## Introduction

The Nextplus Python SDK is a powerful and user-friendly package that allows developers to interact with the Nextplus API. With this SDK, developers can easily perform CRUD operations on tables and records within the Nextplus system.

## Features

- User authentication with Nextplus API
- Retrieve, create, update, and delete records in tables
- Customizable queries with filtering options

## Requirements

- Python 3.x
- requests library

## Installation

To install the Nextplus Python SDK, you can use the following command:

```bash
pip install nextplus
```

## Usage

### Setting Up the Client

First, you need to set up the NextplusClient with your Nextplus server URL, username or email, and password. These can either be passed directly or set as environment variables (NEXTPLUS_SERVER_URL, NEXTPLUS_EMAIL, NEXTPLUS_USERNAME, NEXTPLUS_PASSWORD).

```python
from nextplus import NextplusClient
# Note that you can use email or username
client = NextplusClient(
    server_url='https://your.nextplus.server.url',
    email='your@email.com',
    password='yourpassword'
)

# If you need to disable SSL verification (not recommended for production)
client = NextplusClient(
    server_url='https://your.nextplus.server.url',
    email='your@email.com',
    password='yourpassword',
    verify_ssl=False
)
```

### Working with Tables

You can perform operations on tables such as finding a specific table or fetching a list of all tables.

#### Find Tables

```python
tables = client.Tables.find({'where': {'name': 'YourTableName'}})
print(json.dumps(tables))
```

Response:

```json
[
  {
    "id": "1958dbd0-b9bf-11ee-a4d7-950198b3451e",
    "name": "Machine Status Log",
    "columns": [
      {
        "id": "_id",
        "name": "id",
        "type": "string"
      },
      {
        "id": "deletedAt",
        "name": "deletedAt",
        "type": "date"
      },
      {
        "id": "createdAt",
        "name": "createdAt",
        "type": "date"
      },
      {
        "id": "modified",
        "name": "modified",
        "type": "date"
      },
      {
        "id": "workflowSessionItemId",
        "name": "workflowSessionItemId",
        "type": "string"
      },
      {
        "id": "formId",
        "name": "formId",
        "type": "string"
      },
      {
        "name": "Machine ID",
        "type": "string",
        "required": true,
        "id": "COLUMN_machine-id"
      },
      {
        "name": "Status",
        "type": "string",
        "id": "COLUMN_status"
      },
      {
        "name": "Change Time",
        "type": "date",
        "id": "COLUMN_change-time",
        "deletedAt": "2024-01-23T08:06:42.426Z"
      }
    ],
    "created": "2024-01-23T07:14:51.021Z",
    "modified": "2024-01-23T08:06:44.500Z",
    "serverModified": "2024-01-23T08:06:44.500Z",
    "deletedAt": null,
    "deletedBy": null
  }
]
```

Note that you can only write to columns that prefixed with `COLUMN_`.
Other columns are auto-generated and read only.

#### Working with Records in a Table

You can create, update, find, and delete records in a specific table.

##### Insert a Record

```python
table = client.Table('your_table_id')
record = {
"COLUMN_machine-id": "Machine1",
"COLUMN_status": "idle"
}
result = table.insert(record)
print(f"Record inserted with ID: {result['_id']}")
```

Response:

```json
{
  "COLUMN_machine-id": "Machine1",
  "COLUMN_status": "idle",
  "_id": "7b74899f-f863-473a-9a96-d37a75e1c7fe",
  "createdAt": "2024-01-23T11:33:37.205Z",
  "modified": "2024-01-23T11:33:37.205Z",
  "serverModified": "2024-01-23T11:33:37.205Z",
  "deletedAt": null
}
```

##### Update a Record

```python
updated_record = {
"_id": "record_id",
"COLUMN_status": "busy"
}
update_result = table.update(updated_record)
print(update_result)
```

Response:

```json
{
  "_id": "7b74899f-f863-473a-9a96-d37a75e1c7fe",
  "COLUMN_machine-id": "Machine1",
  "COLUMN_status": "busy",
  "createdAt": "2024-01-23T11:33:37.205Z",
  "modified": "2024-01-23T11:34:52.185Z",
  "serverModified": "2024-01-23T11:34:52.185Z",
  "deletedAt": null
}
```

##### Find Records

```python
rows = table.find({'where': {'COLUMN_machine-id': 'Machine1'}})
print(rows)
```

Response:

```json
{
  "_id": "7b74899f-f863-473a-9a96-d37a75e1c7fe",
  "COLUMN_machine-id": "Machine1",
  "COLUMN_status": "busy",
  "createdAt": "2024-01-23T11:33:37.205Z",
  "modified": "2024-01-23T11:34:52.185Z",
  "serverModified": "2024-01-23T11:34:52.185Z",
  "deletedAt": null,
  "id": "7b74899f-f863-473a-9a96-d37a75e1c7fe"
}
```

##### Delete a Record

```python
table.remove("record_id")
```

Response:

```json
{
  "_id": "7b74899f-f863-473a-9a96-d37a75e1c7fe",
  "COLUMN_machine-id": "Machine1",
  "COLUMN_status": "busy",
  "createdAt": "2024-01-23T11:33:37.205Z",
  "modified": "2024-01-23T11:36:23.226Z",
  "serverModified": "2024-01-23T11:36:23.226Z",
  "deletedAt": "2024-01-23T11:36:23.226Z"
}
```

## Development

### Building a new version

- Update version code in `nextplus/client.py` and `setup.py`
- Run build command
  ```bash
   python setup.py sdist
  ```

### Release new version

- Make sure twine is installed
  ```bash
  pip install twine
  ```
- Then, upload your package
  ```bash
  twine upload dist/*
  ```
  When username & password prompt, enter `__token__` as username and token as password