#
tokens: 15837/50000 12/12 files
lines: off (toggle) GitHub
raw markdown copy
# Directory Structure

```
├── .editorconfig
├── .gitignore
├── .gitlab-ci.yml
├── .pre-commit-config.yaml
├── .python-version
├── LICENSE.md
├── pyproject.toml
├── README.md
├── RELEASING.md
├── src
│   └── waldur_mcp_server
│       ├── __init__.py
│       ├── meta.yaml
│       └── server.py
└── uv.lock
```

# Files

--------------------------------------------------------------------------------
/.python-version:
--------------------------------------------------------------------------------

```
3.13

```

--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------

```
[*]
indent_style = space
indent_size = 4
insert_final_newline = true
trim_trailing_whitespace = true
end_of_line = lf
charset = utf-8

[*.py]
max_line_length = 88

[*.yaml]
indent_size = 2

```

--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------

```
# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg

# Virtual Environment
venv/
env/
ENV/
.env

# IDE
.idea/
.vscode/
*.swp
*.swo
.DS_Store

# Project specific
*.log
.coverage
htmlcov/
.pytest_cache/
.env.local
.env.*.local

# Environment variables file that might contain sensitive data
.env
.env.prod
.env.staging

```

--------------------------------------------------------------------------------
/.pre-commit-config.yaml:
--------------------------------------------------------------------------------

```yaml
repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v5.0.0
    hooks:
      - id: trailing-whitespace
      - id: end-of-file-fixer

  - repo: https://github.com/charliermarsh/ruff-pre-commit
    rev: v0.12.0
    hooks:
      - id: ruff-format
      - id: ruff
        args:
          - --fix
          - --exit-non-zero-on-fix

  - repo: https://github.com/pre-commit/mirrors-mypy
    rev: v1.15.0
    hooks:
      - id: mypy

```

--------------------------------------------------------------------------------
/.gitlab-ci.yml:
--------------------------------------------------------------------------------

```yaml
include:
  - project: "waldur/waldur-pipelines"
    file: "/templates/stages.yml"
  - project: "waldur/waldur-pipelines"
    file: "/templates/test/check-merge-compatibility.yml"
  - project: "waldur/waldur-pipelines"
    file: "/templates/test/python-linters.yml"
  - project: "waldur/waldur-pipelines"
    file: "/templates/release/python-module-release-uv.yml"

Run python v3.11 linters:
  image: "registry.hpc.ut.ee/mirror/library/python:3.11"
  extends: .Run linters template
  before_script:
    - |
      echo 'default_language_version:' >> .pre-commit-config.yaml
      echo '  python: python3.11' >> .pre-commit-config.yaml
    - cat .pre-commit-config.yaml

Upload docs:
  image:
    name: registry.hpc.ut.ee/mirror/alpine/git:v2.30.2
    entrypoint: [""]
  stage: deploy
  interruptible: true
  rules:
    - if: '$CI_COMMIT_BRANCH == "main" && $CI_PIPELINE_SOURCE == "schedule"'
  script:
    - cd /tmp/
    - git clone "https://gitlab-ci-token:$GITLAB_TOKEN@$CI_SERVER_HOST/waldur/waldur-docs.git"
    - git config --global user.name "$GITLAB_USER_NAME"
    - git config --global user.email "$GITLAB_USER_EMAIL"
    - cd waldur-docs/
    - mkdir -p docs/integrations/waldur-mcp-server
    - cp -vf $CI_PROJECT_DIR/README.md docs/integrations/waldur-mcp-server/README.md
    - git add docs/integrations/waldur-mcp-server/
    - git commit -m 'Update Waldur MCP Server docs' || exit 0
    - git branch new-mcp-server-docs
    - git push --set-upstream origin new-mcp-server-docs:master

```

--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------

```markdown
# Waldur MCP server

Waldur MCP server enables integration between Waldur instance and Claude Desktop by implementing the Model Context Protocol (MCP). This allows Claude to interact with your Waldur instance directly.

## Quickstart

1. Install Claude Desktop for your platform from the [Claude Desktop releases page](https://claude.ai/download)

2. Install Python 3.13 or higher.

3. Install uv package manager.

### Installation

To install the package:

```bash
pip install waldur-mcp-server
```

Or with uv:

```bash
uv pip install waldur-mcp-server
```

### Generate Waldur Token

1. Log in to your Waldur instance
2. Navigate to Username > Credentials > API Token
3. Generate a new token with appropriate token lifetime - you'll need it for configuration

### Claude Desktop MCP Server Configuration

On Windows: `%APPDATA%\Claude\claude_desktop_config.json`

On MacOS: `~/Library/Application Support/Claude/claude_desktop_config.json`

<details>
  <summary>Development/Unpublished Servers Configuration</summary>

```json
{
  "mcpServers": {
    "waldur-mcp-server": {
      "command": "uv",
      "args": [
        "--directory",
        "C:\\waldur_service",
        "run",
        "waldur-mcp-server"
      ],
      "env": {
        "WALDUR_API_URL": "https://your-waldur-instance",
        "WALDUR_TOKEN": "your-token"
      }
    }
  }
}
```

</details>

<details>
  <summary>Published Servers Configuration</summary>

```json
{
  "mcpServers": {
    "waldur-mcp-server": {
      "command": "uvx",
      "args": [
        "waldur-mcp-server"
      ],
      "env": {
        "WALDUR_API_URL": "https://your-waldur-instance",
        "WALDUR_TOKEN": "your-token"
      }
    }
  }
}
```

</details>

### Debugging

On macOS, log files are located at `~/Library/Logs/Claude/mcp.log`

If you encounter a `spawn uvx ENOENT` error, verify that your PATH environment variable includes the Python installation directory where `uv` is installed. Alternatively, you can specify the full path to `uvx` in the configuration file, for example:
`~/Library/Frameworks/Python.framework/Versions/3.13/bin/uvx`

Since MCP servers run over stdio, debugging can be challenging. For the best debugging
experience, we strongly recommend using the [MCP Inspector](https://github.com/modelcontextprotocol/inspector).

You can launch the MCP Inspector via [`npm`](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) with this command:

```bash
npx @modelcontextprotocol/inspector uv --directory C:\\waldur_service run waldur-mcp-server
```

When debugging, you'll need to set the required environment variables. Upon launching, the Inspector will display a URL that you can access in your browser to begin debugging.

### Common issues

- Invalid token: Verify token permissions and expiration
- Connection issues: Check WALDUR_API_URL is accessible

```

--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------

```markdown
The MIT License (MIT)

Copyright (c) 2016-2025 OpenNode LLC

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

```

--------------------------------------------------------------------------------
/src/waldur_mcp_server/__init__.py:
--------------------------------------------------------------------------------

```python
from . import server
import asyncio


def main():
    """Main entry point for the package."""
    asyncio.run(server.main())


# Optionally expose other important items at package level
__all__ = ["main", "server"]

```

--------------------------------------------------------------------------------
/pyproject.toml:
--------------------------------------------------------------------------------

```toml
[project]
name = "waldur-mcp-server"
version = "0.1.0"
description = "Waldur MCP server project"
readme = "README.md"
requires-python = ">=3.13"
dependencies = [
 "httpx>=0.28.1",
 "mcp>=1.6.0",
 "waldur-api-client==0.2.0",
]

[build-system]
requires = [ "hatchling",]
build-backend = "hatchling.build"

[project.scripts]
waldur-mcp-server = "waldur_mcp_server:main"

```

--------------------------------------------------------------------------------
/RELEASING.md:
--------------------------------------------------------------------------------

```markdown
# Releasing Waldur MCP Server

## Releasing a New Version via GitLab CI

To deploy a new release:

1. Create and push a new tag:
    ```bash
    git tag 0.1.0
    git push origin 0.1.0
    ```

2. The CI pipeline will automatically build and publish the package to PyPI.

## Building and Publishing manually

To prepare the package for distribution:

1. Sync dependencies and update lockfile:
    ```bash
    uv sync
    ```

2. Build package distributions:
    ```bash
    uv build
    ```

    This will create source and wheel distributions in the `dist/` directory.

3. Publish to PyPI:
    ```bash
    uv publish
    ```

Note: You'll need to set PyPI credentials via environment variables or command flags:
- Token: `--token` or `UV_PUBLISH_TOKEN`
- Or username/password: `--username`/`UV_PUBLISH_USERNAME` and `--password`/`UV_PUBLISH_PASSWORD`

```

--------------------------------------------------------------------------------
/src/waldur_mcp_server/server.py:
--------------------------------------------------------------------------------

```python
import os
from typing import Any, Literal

from mcp.server.fastmcp import FastMCP
from waldur_api_client.api.customers import customers_list
from waldur_api_client.api.invoices import invoices_list
from waldur_api_client.api.marketplace_public_offerings import (
    marketplace_public_offerings_list,
)
from waldur_api_client.api.marketplace_resources import marketplace_resources_list
from waldur_api_client.api.projects import projects_list
from waldur_api_client.api.query import query as api_query
from waldur_api_client.api.roles import roles_list
from waldur_api_client.api.user_invitations import user_invitations_create
from waldur_api_client.client import AuthenticatedClient
from waldur_api_client.models.invitation import Invitation
from waldur_api_client.models.public_offering_details import PublicOfferingDetails
from waldur_api_client.models.invitation_request import InvitationRequest
from waldur_api_client.models.customer import Customer
from waldur_api_client.models.invoice import Invoice
from waldur_api_client.models.resource import Resource
from waldur_api_client.models.project import Project
from waldur_api_client.models.query_request import QueryRequest

# Get credentials from environment variables
api_url = os.getenv("WALDUR_API_URL")
token = os.getenv("WALDUR_TOKEN")

if not api_url or not token:
    raise ValueError(
        "WALDUR_API_URL and WALDUR_TOKEN environment variables must be set"
    )

client = AuthenticatedClient(base_url=api_url, token=token)

# Create an MCP server
mcp = FastMCP("Waldur", dependencies=["httpx"])


@mcp.resource("schema://main")
async def get_schema() -> list[str]:
    """Provide the database schema as a resource"""
    result = await api_query.asyncio(
        client=client,
        body=QueryRequest(
            query="SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'"
        ),
    )
    if isinstance(result, list):
        return [row[0] for row in result]
    return []


@mcp.tool()
async def query(sql: str) -> list[Any]:
    """Run a read-only SQL query"""
    return await api_query.asyncio(client=client, body=QueryRequest(query=sql))


@mcp.prompt()
async def schema_aware_query() -> str:
    with open(os.path.join(os.path.dirname(__file__), "meta.yaml")) as f:
        schema = f.read()
        return f"Given the following PostgreSQL database structure:\n {schema}\n compose SQL query for the following analytical query:\n"


@mcp.tool()
async def list_customers() -> list[Customer]:
    """List all customers"""
    return await customers_list.asyncio(client=client)


@mcp.tool()
async def list_projects() -> list[Project]:
    """List all projects"""
    return await projects_list.asyncio(client=client)


@mcp.tool()
async def list_resources() -> list[Resource]:
    """List all resources"""
    return await marketplace_resources_list.asyncio(client=client)


@mcp.tool()
async def list_invoices() -> list[Invoice]:
    """List all invoices"""
    return await invoices_list.asyncio(client=client)


@mcp.tool()
async def list_offerings() -> list[PublicOfferingDetails]:
    """List all offerings"""
    return await marketplace_public_offerings_list.asyncio(client=client)


@mcp.tool()
async def create_invitation(
    scope_type: Literal["customer", "project"],
    scope_name: str,
    role: str,
    emails: list[str],
    extra_invitation_text: str = "",
) -> list[Invitation]:
    """Invite users to project or organization by email

    Args:
        scope_type: Whether to invite users to organization or project
        scope_name: Name of the organization or project to invite users to
        role: Role to assign to invited users
        emails: List of email addresses to invite
        extra_invitation_text: Custom message to include in the invitation
    """

    matching_roles = await roles_list.asyncio(client=client, description=role)
    if not matching_roles:
        raise ValueError(f"Role '{role}' not found")
    role_uuid = matching_roles[0]["uuid"]

    if scope_type == "customer":
        matching_customers = await customers_list.asyncio(
            client=client, name=scope_name
        )
        if not matching_customers:
            raise ValueError(f"Customer '{scope_name}' not found")
        scope_url = matching_customers[0]["url"]
    elif scope_type == "project":
        matching_projects = await projects_list.asyncio(client=client, name=scope_name)
        if not matching_projects:
            raise ValueError(f"Project '{scope_name}' not found")
        scope_url = matching_projects[0]["url"]

    if not scope_url:
        raise ValueError(f"Invalid scope type: {scope_type}")

    results = []
    for email in emails:
        result = await user_invitations_create.asyncio(
            client=client,
            body=InvitationRequest(
                scope=scope_url,
                role=role_uuid,
                email=email,
                extra_invitation_text=extra_invitation_text,
            ),
        )
        results.append(result)

    return results


def main() -> None:
    mcp.run()


if __name__ == "__main__":
    main()

```

--------------------------------------------------------------------------------
/src/waldur_mcp_server/meta.yaml:
--------------------------------------------------------------------------------

```yaml
core_changeemailrequest:
  app_label: core
  columns:
    created:
      type: DateTime
    email:
      type: Email
    id:
      type: PositiveInteger
    modified:
      type: DateTime
    user_id:
      db_table: core_user
      type: OneToOne
    uuid:
      type: UUID
  model: changeemailrequest
  type: Table
core_feature:
  app_label: core
  columns:
    id:
      type: PositiveInteger
    key:
      type: Text
    value:
      type: Boolean
  model: feature
  type: Table
core_notification:
  app_label: core
  columns:
    created:
      type: DateTime
    description:
      type: Char
    enabled:
      type: Boolean
    id:
      type: PositiveInteger
    key:
      type: Char
    modified:
      type: DateTime
    uuid:
      type: UUID
  model: notification
  type: Table
core_notification_templates:
  columns:
    id:
      type: PositiveInteger
    notification_id:
      db_table: core_notification
      type: ForeignKey
    notificationtemplate_id:
      db_table: core_notificationtemplate
      type: ForeignKey
  type: ManyToManyTable
core_notificationtemplate:
  app_label: core
  columns:
    created:
      type: DateTime
    id:
      type: PositiveInteger
    modified:
      type: DateTime
    name:
      type: Char
    path:
      type: Char
    uuid:
      type: UUID
  model: notificationtemplate
  type: Table
core_sshpublickey:
  app_label: core
  columns:
    created:
      type: DateTime
    fingerprint_md5:
      type: Char
    fingerprint_sha256:
      type: Char
    fingerprint_sha512:
      type: Char
    id:
      type: PositiveInteger
    is_shared:
      type: Boolean
    modified:
      type: DateTime
    name:
      type: Char
    public_key:
      type: Text
    user_id:
      db_table: core_user
      type: ForeignKey
    uuid:
      type: UUID
  model: sshpublickey
  type: Table
core_user:
  app_label: core
  columns:
    affiliations:
      type: JSON
    agreement_date:
      type: DateTime
    backend_id:
      type: Char
    birth_date:
      type: Date
    civil_number:
      type: Char
    date_joined:
      type: DateTime
    description:
      type: Char
    details:
      type: JSON
    email:
      type: Email
    first_name:
      type: Char
    id:
      type: PositiveInteger
    identity_source:
      type: Char
    image:
      type: Image
    is_active:
      type: Boolean
    is_identity_manager:
      type: Boolean
    is_staff:
      type: Boolean
    is_superuser:
      type: Boolean
    is_support:
      type: Boolean
    job_title:
      type: Char
    last_login:
      type: DateTime
    last_name:
      type: Char
    last_sync:
      type: DateTime
    modified:
      type: DateTime
    native_name:
      type: Char
    notifications_enabled:
      type: Boolean
    organization:
      type: Char
    password:
      type: Char
    phone_number:
      type: Char
    preferred_language:
      type: Char
    query_field:
      type: Char
    registration_method:
      type: Char
    slug:
      type: Slug
    token_lifetime:
      type: PositiveInteger
    username:
      type: Char
    uuid:
      type: UUID
  model: user
  type: Table
core_user_groups:
  columns:
    group_id:
      db_table: auth_group
      type: ForeignKey
    id:
      type: PositiveInteger
    user_id:
      db_table: core_user
      type: ForeignKey
  type: ManyToManyTable
core_user_user_permissions:
  columns:
    id:
      type: PositiveInteger
    permission_id:
      db_table: auth_permission
      type: ForeignKey
    user_id:
      db_table: core_user
      type: ForeignKey
  type: ManyToManyTable
django_content_type:
  app_label: contenttypes
  columns:
    app_label:
      type: Char
    id:
      type: PositiveInteger
    model:
      type: Char
  model: contenttype
  type: Table
invoices_customercredit:
  app_label: invoices
  columns:
    apply_as_minimal_consumption:
      type: Boolean
    created:
      type: DateTime
    customer_id:
      db_table: structure_customer
      type: OneToOne
    end_date:
      type: Date
    expected_consumption:
      type: Decimal
    grace_coefficient:
      type: Decimal
    id:
      type: PositiveInteger
    minimal_consumption_logic:
      type: Char
    modified:
      type: DateTime
    uuid:
      type: UUID
    value:
      type: Decimal
  model: customercredit
  type: Table
invoices_customercredit_offerings:
  columns:
    customercredit_id:
      db_table: invoices_customercredit
      type: ForeignKey
    id:
      type: PositiveInteger
    offering_id:
      db_table: marketplace_offering
      type: ForeignKey
  type: ManyToManyTable
invoices_invoice:
  app_label: invoices
  columns:
    backend_id:
      type: Char
    created:
      type: Date
    customer_id:
      db_table: structure_customer
      type: ForeignKey
    id:
      type: PositiveInteger
    invoice_date:
      type: Date
    month:
      type: PositiveSmallInteger
    payment_url:
      type: URL
    reference_number:
      type: Char
    state:
      type: Char
    tax_percent:
      type: Decimal
    total_cost:
      type: Decimal
    total_price:
      type: Decimal
    uuid:
      type: UUID
    year:
      type: PositiveSmallInteger
  model: invoice
  type: Table
invoices_invoiceitem:
  app_label: invoices
  columns:
    article_code:
      type: Char
    backend_uuid:
      type: UUID
    credit_id:
      db_table: invoices_customercredit
      type: ForeignKey
    details:
      type: JSON
    end:
      type: DateTime
    id:
      type: PositiveInteger
    invoice_id:
      db_table: invoices_invoice
      type: ForeignKey
    measured_unit:
      type: Char
    name:
      type: Text
    project_id:
      db_table: structure_project
      type: ForeignKey
    project_name:
      type: Char
    project_uuid:
      type: Char
    quantity:
      type: Decimal
    resource_id:
      db_table: marketplace_resource
      type: ForeignKey
    start:
      type: DateTime
    unit:
      type: Char
    unit_price:
      type: Decimal
    uuid:
      type: UUID
  model: invoiceitem
  type: Table
invoices_payment:
  app_label: invoices
  columns:
    created:
      type: DateTime
    date_of_payment:
      type: Date
    id:
      type: PositiveInteger
    invoice_id:
      db_table: invoices_invoice
      type: ForeignKey
    modified:
      type: DateTime
    profile_id:
      db_table: invoices_paymentprofile
      type: ForeignKey
    proof:
      type: File
    sum:
      type: Decimal
    uuid:
      type: UUID
  model: payment
  type: Table
invoices_paymentprofile:
  app_label: invoices
  columns:
    attributes:
      type: JSON
    id:
      type: PositiveInteger
    is_active:
      type: Boolean
    name:
      type: Char
    organization_id:
      db_table: structure_customer
      type: ForeignKey
    payment_type:
      choices:
      - display: Fixed-price contract
        value: fixed_price
      - display: Monthly invoices
        value: invoices
      - display: Payment gateways (monthly)
        value: payment_gw_monthly
      type: PaymentType
    uuid:
      type: UUID
  model: paymentprofile
  type: Table
invoices_projectcredit:
  app_label: invoices
  columns:
    apply_as_minimal_consumption:
      type: Boolean
    created:
      type: DateTime
    end_date:
      type: Date
    expected_consumption:
      type: Decimal
    grace_coefficient:
      type: Decimal
    id:
      type: PositiveInteger
    mark_unused_credit_as_spent_on_project_termination:
      type: Boolean
    minimal_consumption_logic:
      type: Char
    modified:
      type: DateTime
    project_id:
      db_table: structure_project
      type: OneToOne
    uuid:
      type: UUID
    value:
      type: Decimal
  model: projectcredit
  type: Table
marketplace_attribute:
  app_label: marketplace
  columns:
    created:
      type: DateTime
    default:
      type: JSON
    key:
      type: Char
    modified:
      type: DateTime
    required:
      type: Boolean
    section_id:
      db_table: marketplace_section
      type: ForeignKey
    title:
      type: Char
    type:
      type: Char
  model: attribute
  type: Table
marketplace_attributeoption:
  app_label: marketplace
  columns:
    attribute_id:
      db_table: marketplace_attribute
      type: ForeignKey
    id:
      type: PositiveInteger
    key:
      type: Char
    title:
      type: Char
  model: attributeoption
  type: Table
marketplace_backendresource:
  app_label: marketplace
  columns:
    backend_id:
      type: Char
    backend_metadata:
      type: JSON
    created:
      type: DateTime
    id:
      type: PositiveInteger
    modified:
      type: DateTime
    name:
      type: Char
    offering_id:
      db_table: marketplace_offering
      type: ForeignKey
    project_id:
      db_table: structure_project
      type: ForeignKey
    uuid:
      type: UUID
  model: backendresource
  type: Table
marketplace_backendresourcerequest:
  app_label: marketplace
  columns:
    created:
      type: DateTime
    error_message:
      type: Text
    error_traceback:
      type: Text
    finished:
      type: DateTime
    id:
      type: PositiveInteger
    modified:
      type: DateTime
    offering_id:
      db_table: marketplace_offering
      type: ForeignKey
    started:
      type: DateTime
    state:
      type: FSM
    uuid:
      type: UUID
  model: backendresourcerequest
  type: Table
marketplace_category:
  app_label: marketplace
  columns:
    backend_id:
      type: Char
    created:
      type: DateTime
    default_tenant_category:
      type: Boolean
    default_vm_category:
      type: Boolean
    default_volume_category:
      type: Boolean
    description:
      type: Text
    group_id:
      db_table: marketplace_categorygroup
      type: ForeignKey
    icon:
      type: File
    id:
      type: PositiveInteger
    modified:
      type: DateTime
    title:
      type: Char
    uuid:
      type: UUID
  model: category
  type: Table
marketplace_categorycolumn:
  app_label: marketplace
  columns:
    attribute:
      type: Char
    category_id:
      db_table: marketplace_category
      type: ForeignKey
    id:
      type: PositiveInteger
    index:
      type: PositiveSmallInteger
    title:
      type: Char
    uuid:
      type: UUID
    widget:
      type: Char
  model: categorycolumn
  type: Table
marketplace_categorycomponent:
  app_label: marketplace
  columns:
    category_id:
      db_table: marketplace_category
      type: ForeignKey
    description:
      type: Char
    id:
      type: PositiveInteger
    measured_unit:
      type: Char
    name:
      type: Char
    type:
      type: Char
    uuid:
      type: UUID
  model: categorycomponent
  type: Table
marketplace_categorycomponentusage:
  app_label: marketplace
  columns:
    component_id:
      db_table: marketplace_categorycomponent
      type: ForeignKey
    content_type_id:
      db_table: django_content_type
      type: ForeignKey
    date:
      type: Date
    fixed_usage:
      type: BigInteger
    id:
      type: PositiveInteger
    object_id:
      type: PositiveInteger
    reported_usage:
      type: BigInteger
  model: categorycomponentusage
  type: Table
marketplace_categorygroup:
  app_label: marketplace
  columns:
    created:
      type: DateTime
    description:
      type: Text
    icon:
      type: File
    id:
      type: PositiveInteger
    modified:
      type: DateTime
    title:
      type: Char
    uuid:
      type: UUID
  model: categorygroup
  type: Table
marketplace_categoryhelparticle:
  app_label: marketplace
  columns:
    id:
      type: PositiveInteger
    title:
      type: Char
    url:
      type: URL
  model: categoryhelparticle
  type: Table
marketplace_categoryhelparticle_categories:
  columns:
    category_id:
      db_table: marketplace_category
      type: ForeignKey
    categoryhelparticle_id:
      db_table: marketplace_categoryhelparticle
      type: ForeignKey
    id:
      type: PositiveInteger
  type: ManyToManyTable
marketplace_componentquota:
  app_label: marketplace
  columns:
    component_id:
      db_table: marketplace_offeringcomponent
      type: ForeignKey
    created:
      type: DateTime
    id:
      type: PositiveInteger
    limit:
      type: Decimal
    modified:
      type: DateTime
    resource_id:
      db_table: marketplace_resource
      type: ForeignKey
    usage:
      type: Decimal
  model: componentquota
  type: Table
marketplace_componentusage:
  app_label: marketplace
  columns:
    backend_id:
      type: Char
    billing_period:
      type: Date
    component_id:
      db_table: marketplace_offeringcomponent
      type: ForeignKey
    created:
      type: DateTime
    date:
      type: DateTime
    description:
      type: Char
    id:
      type: PositiveInteger
    modified:
      type: DateTime
    modified_by_id:
      db_table: core_user
      type: ForeignKey
    plan_period_id:
      db_table: marketplace_resourceplanperiod
      type: ForeignKey
    recurring:
      type: Boolean
    resource_id:
      db_table: marketplace_resource
      type: ForeignKey
    usage:
      type: Decimal
    uuid:
      type: UUID
  model: componentusage
  type: Table
marketplace_componentuserusage:
  app_label: marketplace
  columns:
    backend_id:
      type: Char
    component_usage_id:
      db_table: marketplace_componentusage
      type: ForeignKey
    created:
      type: DateTime
    description:
      type: Char
    id:
      type: PositiveInteger
    modified:
      type: DateTime
    usage:
      type: Decimal
    user_id:
      db_table: marketplace_offeringuser
      type: ForeignKey
    username:
      type: Char
    uuid:
      type: UUID
  model: componentuserusage
  type: Table
marketplace_componentuserusagelimit:
  app_label: marketplace
  columns:
    component_id:
      db_table: marketplace_offeringcomponent
      type: ForeignKey
    created:
      type: DateTime
    id:
      type: PositiveInteger
    limit:
      type: Decimal
    modified:
      type: DateTime
    resource_id:
      db_table: marketplace_resource
      type: ForeignKey
    user_id:
      db_table: marketplace_offeringuser
      type: ForeignKey
    uuid:
      type: UUID
  model: componentuserusagelimit
  type: Table
marketplace_courseaccount:
  app_label: marketplace
  columns:
    created:
      type: DateTime
    description:
      type: Char
    email:
      type: Email
    error_message:
      type: Text
    error_traceback:
      type: Text
    id:
      type: PositiveInteger
    modified:
      type: DateTime
    project_id:
      db_table: structure_project
      type: ForeignKey
    state:
      choices:
      - display: OK
        value: 1
      - display: Closed
        value: 2
      - display: Erred
        value: 3
      type: PositiveInteger
    user_id:
      db_table: core_user
      type: ForeignKey
    uuid:
      type: UUID
  model: courseaccount
  type: Table
marketplace_customerserviceaccount:
  app_label: marketplace
  columns:
    created:
      type: DateTime
    customer_id:
      db_table: structure_customer
      type: ForeignKey
    description:
      type: Text
    email:
      type: Email
    error_message:
      type: Text
    error_traceback:
      type: Text
    id:
      type: PositiveInteger
    modified:
      type: DateTime
    preferred_identifier:
      type: Char
    state:
      choices:
      - display: OK
        value: 1
      - display: Closed
        value: 2
      - display: Erred
        value: 3
      type: PositiveInteger
    username:
      type: Char
    uuid:
      type: UUID
  model: customerserviceaccount
  type: Table
marketplace_integrationstatus:
  app_label: marketplace
  columns:
    agent_type:
      type: Char
    id:
      type: PositiveInteger
    last_request_timestamp:
      type: DateTime
    offering_id:
      db_table: marketplace_offering
      type: ForeignKey
    service_name:
      type: Char
    status:
      choices:
      - display: Unknown
        value: 1
      - display: Active
        value: 2
      - display: Disconnected
        value: 3
      type: PositiveInteger
    uuid:
      type: UUID
  model: integrationstatus
  type: Table
marketplace_maintenanceannouncement:
  app_label: marketplace
  columns:
    actual_end:
      type: DateTime
    actual_start:
      type: DateTime
    backend_id:
      type: Char
    created:
      type: DateTime
    created_by_id:
      db_table: core_user
      type: ForeignKey
    external_reference_url:
      type: URL
    id:
      type: PositiveInteger
    maintenance_type:
      choices:
      - display: Scheduled maintenance
        value: 1
      - display: Emergency maintenance
        value: 2
      - display: Security maintenance
        value: 3
      - display: System upgrade
        value: 4
      - display: Patch deployment
        value: 5
      type: PositiveSmallInteger
    message:
      type: Char
    modified:
      type: DateTime
    name:
      type: Char
    scheduled_end:
      type: DateTime
    scheduled_start:
      type: DateTime
    service_provider_id:
      db_table: marketplace_serviceprovider
      type: ForeignKey
    state:
      choices:
      - display: Draft
        value: 1
      - display: Scheduled
        value: 2
      - display: In progress
        value: 3
      - display: Completed
        value: 4
      - display: Cancelled
        value: 5
      type: PositiveInteger
    uuid:
      type: UUID
  model: maintenanceannouncement
  type: Table
marketplace_maintenanceannouncementoffering:
  app_label: marketplace
  columns:
    created:
      type: DateTime
    id:
      type: PositiveInteger
    impact_description:
      type: Text
    impact_level:
      choices:
      - display: No impact
        value: 1
      - display: Degraded performance
        value: 2
      - display: Partial outage
        value: 3
      - display: Full outage
        value: 4
      type: PositiveSmallInteger
    maintenance_id:
      db_table: marketplace_maintenanceannouncement
      type: ForeignKey
    modified:
      type: DateTime
    offering_id:
      db_table: marketplace_offering
      type: ForeignKey
    uuid:
      type: UUID
  model: maintenanceannouncementoffering
  type: Table
marketplace_maintenanceannouncementofferingtemplate:
  app_label: marketplace
  columns:
    created:
      type: DateTime
    id:
      type: PositiveInteger
    impact_description:
      type: Text
    impact_level:
      choices:
      - display: No impact
        value: 1
      - display: Degraded performance
        value: 2
      - display: Partial outage
        value: 3
      - display: Full outage
        value: 4
      type: PositiveSmallInteger
    maintenance_template_id:
      db_table: marketplace_maintenanceannouncementtemplate
      type: ForeignKey
    modified:
      type: DateTime
    offering_id:
      db_table: marketplace_offering
      type: ForeignKey
    uuid:
      type: UUID
  model: maintenanceannouncementofferingtemplate
  type: Table
marketplace_maintenanceannouncementtemplate:
  app_label: marketplace
  columns:
    created:
      type: DateTime
    id:
      type: PositiveInteger
    maintenance_type:
      choices:
      - display: Scheduled maintenance
        value: 1
      - display: Emergency maintenance
        value: 2
      - display: Security maintenance
        value: 3
      - display: System upgrade
        value: 4
      - display: Patch deployment
        value: 5
      type: PositiveSmallInteger
    message:
      type: Char
    modified:
      type: DateTime
    name:
      type: Char
    service_provider_id:
      db_table: marketplace_serviceprovider
      type: ForeignKey
    uuid:
      type: UUID
  model: maintenanceannouncementtemplate
  type: Table
marketplace_offering:
  app_label: marketplace
  columns:
    access_url:
      type: URL
    attributes:
      type: JSON
    backend_id:
      type: Char
    backend_metadata:
      type: JSON
    billable:
      type: Boolean
    category_id:
      db_table: marketplace_category
      type: ForeignKey
    citation_count:
      type: Integer
    content_type_id:
      db_table: django_content_type
      type: ForeignKey
    country:
      type: Char
    created:
      type: DateTime
    customer_id:
      db_table: structure_customer
      type: ForeignKey
    datacite_doi:
      type: Char
    description:
      type: Char
    error_message:
      type: Text
    full_description:
      type: Text
    getting_started:
      type: Text
    id:
      type: PositiveInteger
    image:
      type: Image
    integration_guide:
      type: Text
    latitude:
      type: Float
    longitude:
      type: Float
    modified:
      type: DateTime
    name:
      type: Char
    object_id:
      type: PositiveInteger
    options:
      type: JSON
    parent_id:
      db_table: marketplace_offering
      type: ForeignKey
    paused_reason:
      type: Text
    plugin_options:
      type: JSON
    privacy_policy_link:
      type: URL
    project_id:
      db_table: structure_project
      type: ForeignKey
    remote_image_uuid:
      type: UUID
    resource_options:
      type: JSON
    secret_options:
      type: JSON
    shared:
      type: Boolean
    slug:
      type: Slug
    state:
      choices:
      - display: Draft
        value: 1
      - display: Active
        value: 2
      - display: Paused
        value: 3
      - display: Archived
        value: 4
      type: PositiveInteger
    support_per_user_consumption_limitation:
      type: Boolean
    thumbnail:
      type: File
    type:
      type: Char
    uuid:
      type: UUID
    vendor_details:
      type: Text
  model: offering
  type: Table
marketplace_offering_organization_groups:
  columns:
    id:
      type: PositiveInteger
    offering_id:
      db_table: marketplace_offering
      type: ForeignKey
    organizationgroup_id:
      db_table: structure_organizationgroup
      type: ForeignKey
  type: ManyToManyTable
marketplace_offeringaccessendpoint:
  app_label: marketplace
  columns:
    id:
      type: PositiveInteger
    name:
      type: Char
    offering_id:
      db_table: marketplace_offering
      type: ForeignKey
    url:
      type: BackendURL
    uuid:
      type: UUID
  model: offeringaccessendpoint
  type: Table
marketplace_offeringcomponent:
  app_label: marketplace
  columns:
    article_code:
      type: Char
    backend_id:
      type: Char
    billing_type:
      type: Char
    content_type_id:
      db_table: django_content_type
      type: ForeignKey
    default_limit:
      type: Integer
    description:
      type: Char
    id:
      type: PositiveInteger
    is_boolean:
      type: Boolean
    is_prepaid:
      type: Boolean
    limit_amount:
      type: Integer
    limit_period:
      type: Char
    max_available_limit:
      type: Integer
    max_prepaid_duration:
      type: Integer
    max_value:
      type: Integer
    measured_unit:
      type: Char
    min_prepaid_duration:
      type: Integer
    min_value:
      type: Integer
    name:
      type: Char
    object_id:
      type: PositiveInteger
    offering_id:
      db_table: marketplace_offering
      type: ForeignKey
    overage_component_id:
      db_table: marketplace_offeringcomponent
      type: ForeignKey
    parent_id:
      db_table: marketplace_categorycomponent
      type: ForeignKey
    type:
      type: Char
    unit_factor:
      type: Integer
    uuid:
      type: UUID
  model: offeringcomponent
  type: Table
marketplace_offeringfile:
  app_label: marketplace
  columns:
    created:
      type: DateTime
    file:
      type: File
    id:
      type: PositiveInteger
    modified:
      type: DateTime
    name:
      type: Char
    offering_id:
      db_table: marketplace_offering
      type: ForeignKey
    uuid:
      type: UUID
  model: offeringfile
  type: Table
marketplace_offeringpartition:
  app_label: marketplace
  columns:
    cpu_bind:
      type: PositiveInteger
    created:
      type: DateTime
    def_cpu_per_gpu:
      type: PositiveInteger
    def_mem_per_cpu:
      type: PositiveBigInteger
    def_mem_per_gpu:
      type: PositiveBigInteger
    def_mem_per_node:
      type: PositiveBigInteger
    default_time:
      type: PositiveInteger
    exclusive_topo:
      type: Boolean
    exclusive_user:
      type: Boolean
    grace_time:
      type: PositiveInteger
    id:
      type: PositiveInteger
    max_cpus_per_node:
      type: PositiveInteger
    max_cpus_per_socket:
      type: PositiveInteger
    max_mem_per_cpu:
      type: PositiveBigInteger
    max_mem_per_node:
      type: PositiveBigInteger
    max_nodes:
      type: PositiveInteger
    max_time:
      type: PositiveInteger
    min_nodes:
      type: PositiveInteger
    modified:
      type: DateTime
    offering_id:
      db_table: marketplace_offering
      type: ForeignKey
    partition_name:
      type: Char
    priority_tier:
      type: PositiveSmallInteger
    qos:
      type: Char
    req_resv:
      type: Boolean
    uuid:
      type: UUID
  model: offeringpartition
  type: Table
marketplace_offeringsoftwarecatalog:
  app_label: marketplace
  columns:
    catalog_id:
      db_table: marketplace_softwarecatalog
      type: ForeignKey
    created:
      type: DateTime
    enabled_cpu_family:
      type: JSON
    enabled_cpu_microarchitectures:
      type: JSON
    id:
      type: PositiveInteger
    modified:
      type: DateTime
    offering_id:
      db_table: marketplace_offering
      type: ForeignKey
    partition_id:
      db_table: marketplace_offeringpartition
      type: ForeignKey
    uuid:
      type: UUID
  model: offeringsoftwarecatalog
  type: Table
marketplace_offeringtermsofservice:
  app_label: marketplace
  columns:
    created:
      type: DateTime
    id:
      type: PositiveInteger
    is_active:
      type: Boolean
    modified:
      type: DateTime
    offering_id:
      db_table: marketplace_offering
      type: ForeignKey
    requires_reconsent:
      type: Boolean
    terms_of_service:
      type: Text
    terms_of_service_link:
      type: URL
    uuid:
      type: UUID
    version:
      type: Char
  model: offeringtermsofservice
  type: Table
marketplace_offeringuser:
  app_label: marketplace
  columns:
    backend_metadata:
      type: JSON
    created:
      type: DateTime
    id:
      type: PositiveInteger
    is_restricted:
      type: Boolean
    modified:
      type: DateTime
    offering_id:
      db_table: marketplace_offering
      type: ForeignKey
    service_provider_comment:
      type: Text
    service_provider_comment_url:
      type: URL
    state:
      choices:
      - display: Requested
        value: 1
      - display: Creating
        value: 2
      - display: Pending account linking
        value: 3
      - display: Pending additional validation
        value: 4
      - display: OK
        value: 5
      - display: Requested deletion
        value: 6
      - display: Deleting
        value: 7
      - display: Deleted
        value: 8
      - display: Error creating
        value: 9
      - display: Error deleting
        value: 10
      type: PositiveInteger
    user_id:
      db_table: core_user
      type: ForeignKey
    username:
      type: Char
    uuid:
      type: UUID
  model: offeringuser
  type: Table
marketplace_offeringusergroup:
  app_label: marketplace
  columns:
    backend_metadata:
      type: JSON
    created:
      type: DateTime
    id:
      type: PositiveInteger
    modified:
      type: DateTime
    offering_id:
      db_table: marketplace_offering
      type: ForeignKey
  model: offeringusergroup
  type: Table
marketplace_offeringusergroup_projects:
  columns:
    id:
      type: PositiveInteger
    offeringusergroup_id:
      db_table: marketplace_offeringusergroup
      type: ForeignKey
    project_id:
      db_table: structure_project
      type: ForeignKey
  type: ManyToManyTable
marketplace_offeringuserrole:
  app_label: marketplace
  columns:
    id:
      type: PositiveInteger
    name:
      type: Char
    offering_id:
      db_table: marketplace_offering
      type: ForeignKey
    uuid:
      type: UUID
  model: offeringuserrole
  type: Table
marketplace_order:
  app_label: marketplace
  columns:
    attachment:
      type: File
    attributes:
      type: JSON
    backend_id:
      type: Char
    callback_url:
      type: URL
    completed_at:
      type: DateTime
    consumer_reviewed_at:
      type: DateTime
    consumer_reviewed_by_id:
      db_table: core_user
      type: ForeignKey
    cost:
      type: Decimal
    created:
      type: DateTime
    created_by_id:
      db_table: core_user
      type: ForeignKey
    error_message:
      type: Text
    error_traceback:
      type: Text
    id:
      type: PositiveInteger
    limits:
      type: JSON
    modified:
      type: DateTime
    offering_id:
      db_table: marketplace_offering
      type: ForeignKey
    old_plan_id:
      db_table: marketplace_plan
      type: ForeignKey
    output:
      type: Text
    plan_id:
      db_table: marketplace_plan
      type: ForeignKey
    project_id:
      db_table: structure_project
      type: ForeignKey
    provider_reviewed_at:
      type: DateTime
    provider_reviewed_by_id:
      db_table: core_user
      type: ForeignKey
    request_comment:
      type: Char
    resource_id:
      db_table: marketplace_resource
      type: ForeignKey
    slug:
      type: Slug
    start_date:
      type: Date
    state:
      choices:
      - display: pending-consumer
        value: 1
      - display: pending-provider
        value: 7
      - display: pending-project
        value: 8
      - display: pending-start-date
        value: 9
      - display: executing
        value: 2
      - display: done
        value: 3
      - display: erred
        value: 4
      - display: canceled
        value: 5
      - display: rejected
        value: 6
      type: PositiveInteger
    termination_comment:
      type: Char
    type:
      choices:
      - display: Create
        value: 1
      - display: Update
        value: 2
      - display: Terminate
        value: 3
      type: PositiveSmallInteger
    uuid:
      type: UUID
  model: order
  type: Table
marketplace_plan:
  app_label: marketplace
  columns:
    archived:
      type: Boolean
    article_code:
      type: Char
    backend_id:
      type: Char
    content_type_id:
      db_table: django_content_type
      type: ForeignKey
    created:
      type: DateTime
    description:
      type: Char
    id:
      type: PositiveInteger
    max_amount:
      type: PositiveSmallInteger
    modified:
      type: DateTime
    name:
      type: Char
    object_id:
      type: PositiveInteger
    offering_id:
      db_table: marketplace_offering
      type: ForeignKey
    unit:
      type: Char
    unit_price:
      type: Decimal
    uuid:
      type: UUID
  model: plan
  type: Table
marketplace_plan_organization_groups:
  columns:
    id:
      type: PositiveInteger
    organizationgroup_id:
      db_table: structure_organizationgroup
      type: ForeignKey
    plan_id:
      db_table: marketplace_plan
      type: ForeignKey
  type: ManyToManyTable
marketplace_plancomponent:
  app_label: marketplace
  columns:
    amount:
      type: PositiveInteger
    component_id:
      db_table: marketplace_offeringcomponent
      type: ForeignKey
    discount_rate:
      type: PositiveInteger
    discount_threshold:
      type: PositiveInteger
    future_price:
      type: Decimal
    id:
      type: PositiveInteger
    plan_id:
      db_table: marketplace_plan
      type: ForeignKey
    price:
      type: Decimal
  model: plancomponent
  type: Table
marketplace_projectserviceaccount:
  app_label: marketplace
  columns:
    created:
      type: DateTime
    description:
      type: Text
    email:
      type: Email
    error_message:
      type: Text
    error_traceback:
      type: Text
    id:
      type: PositiveInteger
    modified:
      type: DateTime
    preferred_identifier:
      type: Char
    project_id:
      db_table: structure_project
      type: ForeignKey
    state:
      choices:
      - display: OK
        value: 1
      - display: Closed
        value: 2
      - display: Erred
        value: 3
      type: PositiveInteger
    username:
      type: Char
    uuid:
      type: UUID
  model: projectserviceaccount
  type: Table
marketplace_resource:
  app_label: marketplace
  columns:
    attributes:
      type: JSON
    backend_id:
      type: Char
    backend_metadata:
      type: JSON
    content_type_id:
      db_table: django_content_type
      type: ForeignKey
    cost:
      type: Decimal
    created:
      type: DateTime
    current_usages:
      type: JSON
    description:
      type: Char
    downscaled:
      type: Boolean
    effective_id:
      type: Char
    end_date:
      type: Date
    end_date_requested_by_id:
      db_table: core_user
      type: ForeignKey
    error_message:
      type: Text
    error_traceback:
      type: Text
    id:
      type: PositiveInteger
    last_sync:
      type: DateTime
    limits:
      type: JSON
    modified:
      type: DateTime
    name:
      type: Char
    object_id:
      type: PositiveInteger
    offering_id:
      db_table: marketplace_offering
      type: ForeignKey
    options:
      type: JSON
    parent_id:
      db_table: marketplace_resource
      type: ForeignKey
    paused:
      type: Boolean
    plan_id:
      db_table: marketplace_plan
      type: ForeignKey
    project_id:
      db_table: structure_project
      type: ForeignKey
    report:
      type: JSON
    restrict_member_access:
      type: Boolean
    slug:
      type: Slug
    state:
      choices:
      - display: Creating
        value: 1
      - display: OK
        value: 2
      - display: Erred
        value: 3
      - display: Updating
        value: 4
      - display: Terminating
        value: 5
      - display: Terminated
        value: 6
      type: PositiveInteger
    uuid:
      type: UUID
  model: resource
  type: Table
marketplace_resourceaccessendpoint:
  app_label: marketplace
  columns:
    id:
      type: PositiveInteger
    name:
      type: Char
    resource_id:
      db_table: marketplace_resource
      type: ForeignKey
    url:
      type: BackendURL
    uuid:
      type: UUID
  model: resourceaccessendpoint
  type: Table
marketplace_resourceplanperiod:
  app_label: marketplace
  columns:
    created:
      type: DateTime
    end:
      type: DateTime
    id:
      type: PositiveInteger
    modified:
      type: DateTime
    plan_id:
      db_table: marketplace_plan
      type: ForeignKey
    resource_id:
      db_table: marketplace_resource
      type: ForeignKey
    start:
      type: DateTime
    uuid:
      type: UUID
  model: resourceplanperiod
  type: Table
marketplace_resourceuser:
  app_label: marketplace
  columns:
    created:
      type: DateTime
    id:
      type: PositiveInteger
    modified:
      type: DateTime
    resource_id:
      db_table: marketplace_resource
      type: ForeignKey
    role_id:
      db_table: marketplace_offeringuserrole
      type: ForeignKey
    user_id:
      db_table: core_user
      type: ForeignKey
    uuid:
      type: UUID
  model: resourceuser
  type: Table
marketplace_robotaccount:
  app_label: marketplace
  columns:
    backend_id:
      type: Char
    backend_metadata:
      type: JSON
    created:
      type: DateTime
    description:
      type: Text
    error_message:
      type: Text
    error_traceback:
      type: Text
    id:
      type: PositiveInteger
    keys:
      type: JSON
    modified:
      type: DateTime
    resource_id:
      db_table: marketplace_resource
      type: ForeignKey
    responsible_user_id:
      db_table: core_user
      type: ForeignKey
    state:
      choices:
      - display: Requested
        value: 1
      - display: Creating
        value: 2
      - display: OK
        value: 3
      - display: Requested deletion
        value: 4
      - display: Deleted
        value: 5
      - display: Error
        value: 6
      type: PositiveInteger
    type:
      type: Char
    username:
      type: Char
    uuid:
      type: UUID
  model: robotaccount
  type: Table
marketplace_robotaccount_users:
  columns:
    id:
      type: PositiveInteger
    robotaccount_id:
      db_table: marketplace_robotaccount
      type: ForeignKey
    user_id:
      db_table: core_user
      type: ForeignKey
  type: ManyToManyTable
marketplace_screenshot:
  app_label: marketplace
  columns:
    backend_id:
      type: Char
    created:
      type: DateTime
    description:
      type: Char
    id:
      type: PositiveInteger
    image:
      type: Image
    modified:
      type: DateTime
    name:
      type: Char
    offering_id:
      db_table: marketplace_offering
      type: ForeignKey
    thumbnail:
      type: Image
    uuid:
      type: UUID
  model: screenshot
  type: Table
marketplace_section:
  app_label: marketplace
  columns:
    category_id:
      db_table: marketplace_category
      type: ForeignKey
    created:
      type: DateTime
    is_standalone:
      type: Boolean
    key:
      type: Char
    modified:
      type: DateTime
    title:
      type: Char
  model: section
  type: Table
marketplace_serviceprovider:
  app_label: marketplace
  columns:
    api_secret_code:
      type: Char
    created:
      type: DateTime
    customer_id:
      db_table: structure_customer
      type: OneToOne
    description:
      type: Char
    enable_notifications:
      type: Boolean
    id:
      type: PositiveInteger
    image:
      type: Image
    lead_body:
      type: Text
    lead_email:
      type: Email
    lead_subject:
      type: Char
    modified:
      type: DateTime
    uuid:
      type: UUID
  model: serviceprovider
  type: Table
marketplace_softwarecatalog:
  app_label: marketplace
  columns:
    created:
      type: DateTime
    description:
      type: Text
    id:
      type: PositiveInteger
    modified:
      type: DateTime
    name:
      type: Char
    source_url:
      type: URL
    uuid:
      type: UUID
    version:
      type: Char
  model: softwarecatalog
  type: Table
marketplace_softwarepackage:
  app_label: marketplace
  columns:
    catalog_id:
      db_table: marketplace_softwarecatalog
      type: ForeignKey
    created:
      type: DateTime
    description:
      type: Text
    homepage:
      type: URL
    id:
      type: PositiveInteger
    modified:
      type: DateTime
    name:
      type: Char
    uuid:
      type: UUID
  model: softwarepackage
  type: Table
marketplace_softwaretarget:
  app_label: marketplace
  columns:
    cpu_family:
      type: Char
    cpu_microarchitecture:
      type: Char
    created:
      type: DateTime
    id:
      type: PositiveInteger
    modified:
      type: DateTime
    path:
      type: Char
    uuid:
      type: UUID
    version_id:
      db_table: marketplace_softwareversion
      type: ForeignKey
  model: softwaretarget
  type: Table
marketplace_softwareversion:
  app_label: marketplace
  columns:
    created:
      type: DateTime
    id:
      type: PositiveInteger
    metadata:
      type: JSON
    modified:
      type: DateTime
    package_id:
      db_table: marketplace_softwarepackage
      type: ForeignKey
    release_date:
      type: Date
    uuid:
      type: UUID
    version:
      type: Char
  model: softwareversion
  type: Table
marketplace_userofferingconsent:
  app_label: marketplace
  columns:
    agreement_date:
      type: DateTime
    created:
      type: DateTime
    id:
      type: PositiveInteger
    modified:
      type: DateTime
    offering_id:
      db_table: marketplace_offering
      type: ForeignKey
    revocation_date:
      type: DateTime
    user_id:
      db_table: core_user
      type: ForeignKey
    uuid:
      type: UUID
    version:
      type: Char
  model: userofferingconsent
  type: Table
permissions_role:
  app_label: permissions
  columns:
    content_type_id:
      db_table: django_content_type
      type: ForeignKey
    description:
      type: Char
    id:
      type: PositiveInteger
    is_active:
      type: Boolean
    is_system_role:
      type: Boolean
    name:
      type: Char
    uuid:
      type: UUID
  model: role
  type: Table
permissions_rolepermission:
  app_label: permissions
  columns:
    id:
      type: PositiveInteger
    permission:
      type: Char
    role_id:
      db_table: permissions_role
      type: ForeignKey
  model: rolepermission
  type: Table
permissions_userrole:
  app_label: permissions
  columns:
    content_type_id:
      db_table: django_content_type
      type: ForeignKey
    created:
      type: DateTime
    created_by_id:
      db_table: core_user
      type: ForeignKey
    expiration_time:
      type: DateTime
    id:
      type: PositiveInteger
    is_active:
      type: Boolean
    modified:
      type: DateTime
    object_id:
      type: PositiveInteger
    role_id:
      db_table: permissions_role
      type: ForeignKey
    user_id:
      db_table: core_user
      type: ForeignKey
    uuid:
      type: UUID
  model: userrole
  type: Table
structure_accesssubnet:
  app_label: structure
  columns:
    customer_id:
      db_table: structure_customer
      type: ForeignKey
    description:
      type: Char
    id:
      type: PositiveInteger
    inet:
      type: CidrAddress
    uuid:
      type: UUID
  model: accesssubnet
  type: Table
structure_customer:
  app_label: structure
  columns:
    abbreviation:
      type: Char
    access_subnets:
      type: Text
    accounting_start_date:
      type: DateTime
    address:
      type: Char
    agreement_number:
      type: Char
    archived:
      type: Boolean
    backend_id:
      type: Char
    bank_account:
      type: Char
    bank_name:
      type: Char
    blocked:
      type: Boolean
    contact_details:
      type: Text
    country:
      type: Char
    created:
      type: DateTime
    default_tax_percent:
      type: Decimal
    description:
      type: Char
    display_billing_info_in_projects:
      type: Boolean
    domain:
      type: Char
    email:
      type: Email
    homepage:
      type: URL
    id:
      type: PositiveInteger
    image:
      type: Image
    latitude:
      type: Float
    longitude:
      type: Float
    max_service_accounts:
      type: PositiveSmallInteger
    modified:
      type: DateTime
    name:
      type: Char
    native_name:
      type: Char
    notification_emails:
      type: Char
    phone_number:
      type: Char
    postal:
      type: Char
    registration_code:
      type: Char
    slug:
      type: Slug
    sponsor_number:
      type: PositiveInteger
    uuid:
      type: UUID
    vat_address:
      type: Char
    vat_code:
      type: Char
    vat_name:
      type: Char
  model: customer
  type: Table
structure_customer_organization_groups:
  columns:
    customer_id:
      db_table: structure_customer
      type: ForeignKey
    id:
      type: PositiveInteger
    organizationgroup_id:
      db_table: structure_organizationgroup
      type: ForeignKey
  type: ManyToManyTable
structure_customerpermissionreview:
  app_label: structure
  columns:
    closed:
      type: DateTime
    created:
      type: DateTime
    customer_id:
      db_table: structure_customer
      type: ForeignKey
    id:
      type: PositiveInteger
    is_pending:
      type: Boolean
    reviewer_id:
      db_table: core_user
      type: ForeignKey
    uuid:
      type: UUID
  model: customerpermissionreview
  type: Table
structure_externallink:
  app_label: structure
  columns:
    created:
      type: DateTime
    description:
      type: Char
    id:
      type: PositiveInteger
    image:
      type: Image
    link:
      type: URL
    modified:
      type: DateTime
    name:
      type: Char
    uuid:
      type: UUID
  model: externallink
  type: Table
structure_organizationgroup:
  app_label: structure
  columns:
    id:
      type: PositiveInteger
    name:
      type: Char
    parent_id:
      db_table: structure_organizationgroup
      type: ForeignKey
    uuid:
      type: UUID
  model: organizationgroup
  type: Table
structure_project:
  app_label: structure
  columns:
    backend_id:
      type: Char
    created:
      type: DateTime
    customer_id:
      db_table: structure_customer
      type: ForeignKey
    description:
      type: Char
    end_date:
      type: Date
    end_date_requested_by_id:
      db_table: core_user
      type: ForeignKey
    id:
      type: PositiveInteger
    image:
      type: Image
    is_industry:
      type: Boolean
    is_removed:
      type: Boolean
    kind:
      type: Char
    max_service_accounts:
      type: PositiveSmallInteger
    modified:
      type: DateTime
    name:
      type: Char
    oecd_fos_2007_code:
      type: Char
    slug:
      type: Slug
    staff_notes:
      type: Char
    start_date:
      type: Date
    termination_metadata:
      type: JSON
    type_id:
      db_table: structure_projecttype
      type: ForeignKey
    uuid:
      type: UUID
  model: project
  type: Table
structure_projectpermissionreview:
  app_label: structure
  columns:
    closed:
      type: DateTime
    created:
      type: DateTime
    id:
      type: PositiveInteger
    is_pending:
      type: Boolean
    project_id:
      db_table: structure_project
      type: ForeignKey
    reviewer_id:
      db_table: core_user
      type: ForeignKey
    uuid:
      type: UUID
  model: projectpermissionreview
  type: Table
structure_projecttype:
  app_label: structure
  columns:
    description:
      type: Char
    id:
      type: PositiveInteger
    name:
      type: Char
    uuid:
      type: UUID
  model: projecttype
  type: Table
structure_servicesettings:
  app_label: structure
  columns:
    backend_url:
      type: BackendURL
    certificate:
      type: File
    content_type_id:
      db_table: django_content_type
      type: ForeignKey
    customer_id:
      db_table: structure_customer
      type: ForeignKey
    domain:
      type: Char
    error_message:
      type: Text
    error_traceback:
      type: Text
    id:
      type: PositiveInteger
    is_active:
      type: Boolean
    name:
      type: Char
    object_id:
      type: PositiveInteger
    options:
      type: JSON
    password:
      type: Char
    shared:
      type: Boolean
    state:
      choices:
      - display: CREATION_SCHEDULED
        value: 5
      - display: CREATING
        value: 6
      - display: UPDATE_SCHEDULED
        value: 1
      - display: UPDATING
        value: 2
      - display: DELETION_SCHEDULED
        value: 7
      - display: DELETING
        value: 8
      - display: OK
        value: 3
      - display: ERRED
        value: 4
      type: PositiveInteger
    terms_of_services:
      type: URL
    token:
      type: Char
    type:
      type: Char
    username:
      type: Char
    uuid:
      type: UUID
  model: servicesettings
  type: Table
structure_useragreement:
  app_label: structure
  columns:
    agreement_type:
      type: Char
    content:
      type: Text
    created:
      type: DateTime
    id:
      type: PositiveInteger
    modified:
      type: DateTime
    uuid:
      type: UUID
  model: useragreement
  type: Table
users_groupinvitation:
  app_label: users
  columns:
    auto_create_project:
      type: Boolean
    content_type_id:
      db_table: django_content_type
      type: ForeignKey
    created:
      type: DateTime
    created_by_id:
      db_table: core_user
      type: ForeignKey
    customer_id:
      db_table: structure_customer
      type: ForeignKey
    id:
      type: PositiveInteger
    is_active:
      type: Boolean
    is_public:
      type: Boolean
    modified:
      type: DateTime
    object_id:
      type: PositiveInteger
    project_name_template:
      type: Char
    project_role_id:
      db_table: permissions_role
      type: ForeignKey
    role_id:
      db_table: permissions_role
      type: ForeignKey
    user_affiliations:
      type: JSON
    user_email_patterns:
      type: JSON
    uuid:
      type: UUID
  model: groupinvitation
  type: Table
users_invitation:
  app_label: users
  columns:
    affiliations:
      type: JSON
    approved_by_id:
      db_table: core_user
      type: ForeignKey
    civil_number:
      type: Char
    content_type_id:
      db_table: django_content_type
      type: ForeignKey
    created:
      type: DateTime
    created_by_id:
      db_table: core_user
      type: ForeignKey
    customer_id:
      db_table: structure_customer
      type: ForeignKey
    email:
      type: Email
    error_message:
      type: Text
    error_traceback:
      type: Text
    execution_state:
      type: FSM
    extra_invitation_text:
      type: Text
    full_name:
      type: Char
    id:
      type: PositiveInteger
    job_title:
      type: Char
    modified:
      type: DateTime
    native_name:
      type: Char
    object_id:
      type: PositiveInteger
    organization:
      type: Char
    phone_number:
      type: Char
    role_id:
      db_table: permissions_role
      type: ForeignKey
    state:
      type: Char
    uuid:
      type: UUID
  model: invitation
  type: Table
users_permissionrequest:
  app_label: users
  columns:
    created:
      type: DateTime
    created_by_id:
      db_table: core_user
      type: ForeignKey
    id:
      type: PositiveInteger
    invitation_id:
      db_table: users_groupinvitation
      type: ForeignKey
    modified:
      type: DateTime
    review_comment:
      type: Text
    reviewed_at:
      type: DateTime
    reviewed_by_id:
      db_table: core_user
      type: ForeignKey
    state:
      choices:
      - display: draft
        value: 1
      - display: pending
        value: 2
      - display: approved
        value: 3
      - display: rejected
        value: 4
      - display: canceled
        value: 5
      type: PositiveInteger
    uuid:
      type: UUID
  model: permissionrequest
  type: Table

```