diff --git a/.github/ISSUE_TEMPLATE/01-feature_request.yaml b/.github/ISSUE_TEMPLATE/01-feature_request.yaml index fca8fd983..973384dd3 100644 --- a/.github/ISSUE_TEMPLATE/01-feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/01-feature_request.yaml @@ -15,7 +15,7 @@ body: attributes: label: NetBox version description: What version of NetBox are you currently running? - placeholder: v4.5.9 + placeholder: v4.5.10 validations: required: true - type: dropdown diff --git a/.github/ISSUE_TEMPLATE/02-bug_report.yaml b/.github/ISSUE_TEMPLATE/02-bug_report.yaml index 294dcc9f5..0d9cfa194 100644 --- a/.github/ISSUE_TEMPLATE/02-bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/02-bug_report.yaml @@ -27,7 +27,7 @@ body: attributes: label: NetBox Version description: What version of NetBox are you currently running? - placeholder: v4.5.9 + placeholder: v4.5.10 validations: required: true - type: dropdown diff --git a/.github/ISSUE_TEMPLATE/03-performance.yaml b/.github/ISSUE_TEMPLATE/03-performance.yaml index 62dab9e63..8a221bcfa 100644 --- a/.github/ISSUE_TEMPLATE/03-performance.yaml +++ b/.github/ISSUE_TEMPLATE/03-performance.yaml @@ -8,7 +8,7 @@ body: attributes: label: NetBox Version description: What version of NetBox are you currently running? - placeholder: v4.5.9 + placeholder: v4.5.10 validations: required: true - type: dropdown diff --git a/.github/workflows/claude-code-review.yml b/.github/workflows/claude-code-review.yml deleted file mode 100644 index 5ddb3c00a..000000000 --- a/.github/workflows/claude-code-review.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: Claude Code Review - -on: - pull_request: - types: [opened, synchronize, ready_for_review, reopened] - -jobs: - claude-review: - # Only run for PRs submitted by organization members or owners - if: | - github.repository == 'netbox-community/netbox' && - (github.event.pull_request.author_association == 'MEMBER' || - github.event.pull_request.author_association == 'OWNER') - - runs-on: ubuntu-latest - permissions: - contents: read - pull-requests: read - issues: read - id-token: write - - steps: - - name: Checkout repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - fetch-depth: 1 - - - name: Run Claude Code Review - id: claude-review - uses: anthropics/claude-code-action@e763fe78de2db7389e04818a00b5ff8ba13d1360 # v1 - with: - claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} - plugin_marketplaces: 'https://github.com/anthropics/claude-code.git' - plugins: 'code-review@claude-code-plugins' - prompt: '/code-review:code-review ${{ github.repository }}/pull/${{ github.event.pull_request.number }}' - # See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md - # or https://code.claude.com/docs/en/cli-reference for available options diff --git a/.github/workflows/claude-issue-triage.yml b/.github/workflows/claude-issue-triage.yml index 7370fa274..ac5781d32 100644 --- a/.github/workflows/claude-issue-triage.yml +++ b/.github/workflows/claude-issue-triage.yml @@ -11,19 +11,18 @@ jobs: permissions: contents: read issues: write - steps: - name: Checkout repository uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 1 - - name: Run Claude Issue Triage id: claude-triage - uses: anthropics/claude-code-action@e763fe78de2db7389e04818a00b5ff8ba13d1360 # v1 + uses: anthropics/claude-code-action@11a9dadd198803a0cea6bd53da3e0e8a762fc6ea # v1.0.108 with: anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} github_token: ${{ secrets.GITHUB_TOKEN }} + allowed_non_write_users: "*" # Restrict Claude to read-only inspection of the repo plus posting a single comment # on THIS issue only. `gh issue comment` is pinned to the current issue number, so an # injection cannot redirect a comment to another issue. Close, label, reopen, assign, @@ -33,7 +32,7 @@ jobs: # reduce the blast radius of an injection that tries to dump runner env vars or # secrets into a comment body. claude_args: >- - --allowed-tools + --allowedTools "Bash(gh issue view:*),Bash(gh issue list:*),Bash(gh search issues:*),Bash(gh issue comment ${{ github.event.issue.number }}:*),Bash(gh release list:*),Bash(gh release view:*),Read,Grep,Glob" prompt: | You are triaging a newly opened issue in the netbox-community/netbox repository. @@ -129,6 +128,8 @@ jobs: - Reference the specific problem(s) and clearly explain what the submitter can do to move the issue forward (e.g. "please edit the issue to include reproduction steps" or "this appears to duplicate #12345 — could you confirm?"). + - Never direct the submitter to proceed with a pull request immediately: A + maintainer will decide when that is appropriate. - Sign off noting that you are an automated triage assistant and a human maintainer will follow up. - Paraphrase rather than quoting issue content verbatim. Do not echo back links, diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index ca8b8ce97..6feaa0dce 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -5,76 +5,35 @@ on: types: [created] pull_request_review_comment: types: [created] - issues: - types: [opened, assigned] pull_request_review: types: [submitted] +concurrency: + group: claude-${{ github.event.pull_request.number || github.event.issue.number }} + cancel-in-progress: true + jobs: claude: if: | - (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) || - (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) || - (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) || - (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude'))) + (github.event_name != 'issue_comment' || github.event.issue.pull_request != null) + && contains(github.event.comment.body || github.event.review.body, '@claude') + && (github.event.comment.user.type || github.event.review.user.type) != 'Bot' + && contains(fromJSON('["OWNER", "MEMBER", "COLLABORATOR"]'), github.event.comment.author_association || github.event.review.author_association) runs-on: ubuntu-latest + timeout-minutes: 15 permissions: contents: read - pull-requests: read - issues: read - id-token: write + issues: write + pull-requests: write actions: read # Required for Claude to read CI results on PRs steps: - name: Checkout repository uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 1 - - # Workaround for claude-code-action bug with fork PRs: The action fetches by branch name - # (git fetch origin --depth=N ), but fork PR branches don't exist on origin. - # Fix: redirect origin to the fork's URL so the action can fetch the branch directly. - - name: Configure git remote for fork PRs - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - # Determine PR number based on event type - if [ "${{ github.event_name }}" = "issue_comment" ]; then - PR_NUMBER="${{ github.event.issue.number }}" - elif [ "${{ github.event_name }}" = "pull_request_review_comment" ] || [ "${{ github.event_name }}" = "pull_request_review" ]; then - PR_NUMBER="${{ github.event.pull_request.number }}" - else - exit 0 # issues event — no PR branch to worry about - fi - - # Fetch fork info in one API call; silently skip if this is not a PR - PR_INFO=$(gh pr view "${PR_NUMBER}" --json isCrossRepository,headRepositoryOwner,headRepository 2>/dev/null || echo "") - if [ -z "$PR_INFO" ]; then - exit 0 - fi - - IS_FORK=$(echo "$PR_INFO" | jq -r '.isCrossRepository') - if [ "$IS_FORK" = "true" ]; then - FORK_OWNER=$(echo "$PR_INFO" | jq -r '.headRepositoryOwner.login') - FORK_REPO=$(echo "$PR_INFO" | jq -r '.headRepository.name') - echo "Fork PR detected from ${FORK_OWNER}/${FORK_REPO}: updating origin to fork URL" - git remote set-url origin "https://github.com/${FORK_OWNER}/${FORK_REPO}.git" - fi - - name: Run Claude Code id: claude - uses: anthropics/claude-code-action@e763fe78de2db7389e04818a00b5ff8ba13d1360 # v1 + uses: anthropics/claude-code-action@11a9dadd198803a0cea6bd53da3e0e8a762fc6ea # v1.0.108 with: - claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} - - # This is an optional setting that allows Claude to read CI results on PRs - additional_permissions: | - actions: read - - # Optional: Give a custom prompt to Claude. If this is not specified, Claude will perform the instructions specified in the comment that tagged it. - # prompt: 'Update the pull request description to include a summary of changes.' - - # Optional: Add claude_args to customize behavior and configuration - # See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md - # or https://code.claude.com/docs/en/cli-reference for available options - # claude_args: '--allowed-tools Bash(gh pr:*)' - + anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} + github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/base_requirements.txt b/base_requirements.txt index a044746a7..d88174c5e 100644 --- a/base_requirements.txt +++ b/base_requirements.txt @@ -148,7 +148,8 @@ social-auth-app-django # Social authentication framework # https://github.com/python-social-auth/social-core/blob/master/CHANGELOG.md -social-auth-core +# Need to verify that v4.9.0 does not introduce breaking changes (see #22095) +social-auth-core==4.8.* # Image thumbnail generation # https://github.com/jazzband/sorl-thumbnail/blob/master/CHANGES.rst diff --git a/contrib/openapi.json b/contrib/openapi.json index 4ab0a5833..57bfe97bd 100644 --- a/contrib/openapi.json +++ b/contrib/openapi.json @@ -177187,5899 +177187,6 @@ } } }, - "/api/plugins/physical-geometry/floorplans/": { - "get": { - "operationId": "plugins_physical_geometry_floorplans_list", - "description": "Get a list of floorplan objects.", - "parameters": [ - { - "in": "query", - "name": "base_unit", - "schema": { - "type": "string", - "x-spec-enum-id": "7acfbd25fa72f8c6", - "enum": [ - "cm", - "in", - "null" - ] - }, - "description": "The base unit in which all shapes are measured\n\n* `cm` - Centimeter\n* `in` - Inch" - }, - { - "in": "query", - "name": "base_unit__empty", - "schema": { - "type": "boolean" - } - }, - { - "in": "query", - "name": "base_unit__ic", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "base_unit__ie", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "base_unit__iew", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "base_unit__iregex", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "base_unit__isw", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "base_unit__n", - "schema": { - "type": "string", - "x-spec-enum-id": "7acfbd25fa72f8c6", - "enum": [ - "cm", - "in", - "null" - ] - }, - "description": "The base unit in which all shapes are measured\n\n* `cm` - Centimeter\n* `in` - Inch" - }, - { - "in": "query", - "name": "base_unit__nic", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "base_unit__nie", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "base_unit__niew", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "base_unit__nisw", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "base_unit__regex", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "created", - "schema": { - "type": "array", - "items": { - "type": "string", - "format": "date-time" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "created__empty", - "schema": { - "type": "array", - "items": { - "type": "string", - "format": "date-time" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "created__gt", - "schema": { - "type": "array", - "items": { - "type": "string", - "format": "date-time" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "created__gte", - "schema": { - "type": "array", - "items": { - "type": "string", - "format": "date-time" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "created__lt", - "schema": { - "type": "array", - "items": { - "type": "string", - "format": "date-time" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "created__lte", - "schema": { - "type": "array", - "items": { - "type": "string", - "format": "date-time" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "created__n", - "schema": { - "type": "array", - "items": { - "type": "string", - "format": "date-time" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "created_by_request", - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "in": "query", - "name": "depth", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "depth__empty", - "schema": { - "type": "boolean" - } - }, - { - "in": "query", - "name": "depth__gt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "depth__gte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "depth__lt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "depth__lte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "depth__n", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "description", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "description__empty", - "schema": { - "type": "boolean" - } - }, - { - "in": "query", - "name": "description__ic", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "description__ie", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "description__iew", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "description__iregex", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "description__isw", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "description__n", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "description__nic", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "description__nie", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "description__niew", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "description__nisw", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "description__regex", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "id", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "id__empty", - "schema": { - "type": "boolean" - } - }, - { - "in": "query", - "name": "id__gt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "id__gte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "id__lt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "id__lte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "id__n", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "last_updated", - "schema": { - "type": "array", - "items": { - "type": "string", - "format": "date-time" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "last_updated__empty", - "schema": { - "type": "array", - "items": { - "type": "string", - "format": "date-time" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "last_updated__gt", - "schema": { - "type": "array", - "items": { - "type": "string", - "format": "date-time" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "last_updated__gte", - "schema": { - "type": "array", - "items": { - "type": "string", - "format": "date-time" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "last_updated__lt", - "schema": { - "type": "array", - "items": { - "type": "string", - "format": "date-time" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "last_updated__lte", - "schema": { - "type": "array", - "items": { - "type": "string", - "format": "date-time" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "last_updated__n", - "schema": { - "type": "array", - "items": { - "type": "string", - "format": "date-time" - } - }, - "explode": true, - "style": "form" - }, - { - "name": "limit", - "required": false, - "in": "query", - "description": "Number of results to return per page.", - "schema": { - "type": "integer" - } - }, - { - "in": "query", - "name": "location_id", - "schema": { - "type": "array", - "items": { - "type": "integer" - } - }, - "description": "Location (ID)", - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "location_id__n", - "schema": { - "type": "array", - "items": { - "type": "integer" - } - }, - "description": "Location (ID)", - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "modified_by_request", - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "in": "query", - "name": "name", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "name__empty", - "schema": { - "type": "boolean" - } - }, - { - "in": "query", - "name": "name__ic", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "name__ie", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "name__iew", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "name__iregex", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "name__isw", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "name__n", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "name__nic", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "name__nie", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "name__niew", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "name__nisw", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "name__regex", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "name": "offset", - "required": false, - "in": "query", - "description": "The initial index from which to return the results.", - "schema": { - "type": "integer" - } - }, - { - "name": "ordering", - "required": false, - "in": "query", - "description": "Which field to use when ordering the results.", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "owner", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "description": "Owner (name)", - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "owner__n", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "description": "Owner (name)", - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "owner_group", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "description": "Owner Group (name)", - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "owner_group__n", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "description": "Owner Group (name)", - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "owner_group_id", - "schema": { - "type": "array", - "items": { - "type": "integer" - } - }, - "description": "Owner Group (ID)", - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "owner_group_id__n", - "schema": { - "type": "array", - "items": { - "type": "integer" - } - }, - "description": "Owner Group (ID)", - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "owner_id", - "schema": { - "type": "array", - "items": { - "type": "integer", - "nullable": true - } - }, - "description": "Owner (ID)", - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "owner_id__n", - "schema": { - "type": "array", - "items": { - "type": "integer", - "nullable": true - } - }, - "description": "Owner (ID)", - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "q", - "schema": { - "type": "string" - }, - "description": "Search" - }, - { - "name": "start", - "required": false, - "in": "query", - "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", - "schema": { - "type": "integer" - } - }, - { - "in": "query", - "name": "tag", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "tag__n", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "tag_id", - "schema": { - "type": "array", - "items": { - "type": "integer" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "tag_id__n", - "schema": { - "type": "array", - "items": { - "type": "integer" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "updated_by_request", - "schema": { - "type": "string", - "format": "uuid" - } - }, - { - "in": "query", - "name": "width", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "width__empty", - "schema": { - "type": "boolean" - } - }, - { - "in": "query", - "name": "width__gt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "width__gte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "width__lt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "width__lte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "width__n", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - } - ], - "tags": [ - "plugins" - ], - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PaginatedFloorplanList" - } - } - }, - "description": "" - } - } - }, - "post": { - "operationId": "plugins_physical_geometry_floorplans_create", - "description": "Post a list of floorplan objects.", - "tags": [ - "plugins" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "oneOf": [ - { - "$ref": "#/components/schemas/FloorplanRequest" - }, - { - "type": "array", - "items": { - "$ref": "#/components/schemas/FloorplanRequest" - } - } - ] - } - }, - "multipart/form-data": { - "schema": { - "oneOf": [ - { - "$ref": "#/components/schemas/FloorplanRequest" - }, - { - "type": "array", - "items": { - "$ref": "#/components/schemas/FloorplanRequest" - } - } - ] - } - } - }, - "required": true - }, - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "201": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Floorplan" - } - } - }, - "description": "" - } - } - }, - "put": { - "operationId": "plugins_physical_geometry_floorplans_bulk_update", - "description": "Put a list of floorplan objects.", - "tags": [ - "plugins" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/FloorplanRequest" - } - } - }, - "multipart/form-data": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/FloorplanRequest" - } - } - } - }, - "required": true - }, - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Floorplan" - } - } - } - }, - "description": "" - } - } - }, - "patch": { - "operationId": "plugins_physical_geometry_floorplans_bulk_partial_update", - "description": "Patch a list of floorplan objects.", - "tags": [ - "plugins" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/FloorplanRequest" - } - } - }, - "multipart/form-data": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/FloorplanRequest" - } - } - } - }, - "required": true - }, - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Floorplan" - } - } - } - }, - "description": "" - } - } - }, - "delete": { - "operationId": "plugins_physical_geometry_floorplans_bulk_destroy", - "description": "Delete a list of floorplan objects.", - "tags": [ - "plugins" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/FloorplanRequest" - } - } - }, - "multipart/form-data": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/FloorplanRequest" - } - } - } - }, - "required": true - }, - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "204": { - "description": "No response body" - } - } - } - }, - "/api/plugins/physical-geometry/floorplans/{id}/": { - "get": { - "operationId": "plugins_physical_geometry_floorplans_retrieve", - "description": "Get a floorplan object.", - "parameters": [ - { - "in": "path", - "name": "id", - "schema": { - "type": "integer" - }, - "description": "A unique integer value identifying this floorplan.", - "required": true - } - ], - "tags": [ - "plugins" - ], - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Floorplan" - } - } - }, - "description": "" - } - } - }, - "put": { - "operationId": "plugins_physical_geometry_floorplans_update", - "description": "Put a floorplan object.", - "parameters": [ - { - "in": "path", - "name": "id", - "schema": { - "type": "integer" - }, - "description": "A unique integer value identifying this floorplan.", - "required": true - } - ], - "tags": [ - "plugins" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FloorplanRequest" - } - }, - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/FloorplanRequest" - } - } - }, - "required": true - }, - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Floorplan" - } - } - }, - "description": "" - } - } - }, - "patch": { - "operationId": "plugins_physical_geometry_floorplans_partial_update", - "description": "Patch a floorplan object.", - "parameters": [ - { - "in": "path", - "name": "id", - "schema": { - "type": "integer" - }, - "description": "A unique integer value identifying this floorplan.", - "required": true - } - ], - "tags": [ - "plugins" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PatchedFloorplanRequest" - } - }, - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/PatchedFloorplanRequest" - } - } - } - }, - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Floorplan" - } - } - }, - "description": "" - } - } - }, - "delete": { - "operationId": "plugins_physical_geometry_floorplans_destroy", - "description": "Delete a floorplan object.", - "parameters": [ - { - "in": "path", - "name": "id", - "schema": { - "type": "integer" - }, - "description": "A unique integer value identifying this floorplan.", - "required": true - } - ], - "tags": [ - "plugins" - ], - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "204": { - "description": "No response body" - } - } - } - }, - "/api/plugins/physical-geometry/layers/": { - "get": { - "operationId": "plugins_physical_geometry_layers_list", - "description": "Get a list of layer objects.", - "parameters": [ - { - "in": "query", - "name": "floorplan_id", - "schema": { - "type": "array", - "items": { - "type": "integer" - } - }, - "description": "Floorplan (ID)", - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "floorplan_id__n", - "schema": { - "type": "array", - "items": { - "type": "integer" - } - }, - "description": "Floorplan (ID)", - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "id", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "id__empty", - "schema": { - "type": "boolean" - } - }, - { - "in": "query", - "name": "id__gt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "id__gte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "id__lt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "id__lte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "id__n", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "is_visible", - "schema": { - "type": "boolean" - } - }, - { - "name": "limit", - "required": false, - "in": "query", - "description": "Number of results to return per page.", - "schema": { - "type": "integer" - } - }, - { - "in": "query", - "name": "name", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "name__empty", - "schema": { - "type": "boolean" - } - }, - { - "in": "query", - "name": "name__ic", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "name__ie", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "name__iew", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "name__iregex", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "name__isw", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "name__n", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "name__nic", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "name__nie", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "name__niew", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "name__nisw", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "name__regex", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "name": "offset", - "required": false, - "in": "query", - "description": "The initial index from which to return the results.", - "schema": { - "type": "integer" - } - }, - { - "in": "query", - "name": "opacity", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "opacity__empty", - "schema": { - "type": "boolean" - } - }, - { - "in": "query", - "name": "opacity__gt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "opacity__gte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "opacity__lt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "opacity__lte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "opacity__n", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "order", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "order__empty", - "schema": { - "type": "boolean" - } - }, - { - "in": "query", - "name": "order__gt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "order__gte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "order__lt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "order__lte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "order__n", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "name": "ordering", - "required": false, - "in": "query", - "description": "Which field to use when ordering the results.", - "schema": { - "type": "string" - } - }, - { - "name": "start", - "required": false, - "in": "query", - "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", - "schema": { - "type": "integer" - } - } - ], - "tags": [ - "plugins" - ], - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PaginatedLayerList" - } - } - }, - "description": "" - } - } - }, - "post": { - "operationId": "plugins_physical_geometry_layers_create", - "description": "Post a list of layer objects.", - "tags": [ - "plugins" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "oneOf": [ - { - "$ref": "#/components/schemas/LayerRequest" - }, - { - "type": "array", - "items": { - "$ref": "#/components/schemas/LayerRequest" - } - } - ] - } - }, - "multipart/form-data": { - "schema": { - "oneOf": [ - { - "$ref": "#/components/schemas/LayerRequest" - }, - { - "type": "array", - "items": { - "$ref": "#/components/schemas/LayerRequest" - } - } - ] - } - } - }, - "required": true - }, - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "201": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Layer" - } - } - }, - "description": "" - } - } - }, - "put": { - "operationId": "plugins_physical_geometry_layers_bulk_update", - "description": "Put a list of layer objects.", - "tags": [ - "plugins" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/LayerRequest" - } - } - }, - "multipart/form-data": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/LayerRequest" - } - } - } - }, - "required": true - }, - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Layer" - } - } - } - }, - "description": "" - } - } - }, - "patch": { - "operationId": "plugins_physical_geometry_layers_bulk_partial_update", - "description": "Patch a list of layer objects.", - "tags": [ - "plugins" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/LayerRequest" - } - } - }, - "multipart/form-data": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/LayerRequest" - } - } - } - }, - "required": true - }, - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Layer" - } - } - } - }, - "description": "" - } - } - }, - "delete": { - "operationId": "plugins_physical_geometry_layers_bulk_destroy", - "description": "Delete a list of layer objects.", - "tags": [ - "plugins" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/LayerRequest" - } - } - }, - "multipart/form-data": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/LayerRequest" - } - } - } - }, - "required": true - }, - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "204": { - "description": "No response body" - } - } - } - }, - "/api/plugins/physical-geometry/layers/{id}/": { - "get": { - "operationId": "plugins_physical_geometry_layers_retrieve", - "description": "Get a layer object.", - "parameters": [ - { - "in": "path", - "name": "id", - "schema": { - "type": "integer" - }, - "description": "A unique integer value identifying this layer.", - "required": true - } - ], - "tags": [ - "plugins" - ], - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Layer" - } - } - }, - "description": "" - } - } - }, - "put": { - "operationId": "plugins_physical_geometry_layers_update", - "description": "Put a layer object.", - "parameters": [ - { - "in": "path", - "name": "id", - "schema": { - "type": "integer" - }, - "description": "A unique integer value identifying this layer.", - "required": true - } - ], - "tags": [ - "plugins" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/LayerRequest" - } - }, - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/LayerRequest" - } - } - }, - "required": true - }, - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Layer" - } - } - }, - "description": "" - } - } - }, - "patch": { - "operationId": "plugins_physical_geometry_layers_partial_update", - "description": "Patch a layer object.", - "parameters": [ - { - "in": "path", - "name": "id", - "schema": { - "type": "integer" - }, - "description": "A unique integer value identifying this layer.", - "required": true - } - ], - "tags": [ - "plugins" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PatchedLayerRequest" - } - }, - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/PatchedLayerRequest" - } - } - } - }, - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Layer" - } - } - }, - "description": "" - } - } - }, - "delete": { - "operationId": "plugins_physical_geometry_layers_destroy", - "description": "Delete a layer object.", - "parameters": [ - { - "in": "path", - "name": "id", - "schema": { - "type": "integer" - }, - "description": "A unique integer value identifying this layer.", - "required": true - } - ], - "tags": [ - "plugins" - ], - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "204": { - "description": "No response body" - } - } - } - }, - "/api/plugins/physical-geometry/paths/": { - "get": { - "operationId": "plugins_physical_geometry_paths_list", - "description": "Get a list of path objects.", - "parameters": [ - { - "in": "query", - "name": "floorplan_id", - "schema": { - "type": "array", - "items": { - "type": "integer" - } - }, - "description": "Floorplan (ID)", - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "floorplan_id__n", - "schema": { - "type": "array", - "items": { - "type": "integer" - } - }, - "description": "Floorplan (ID)", - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "id", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "id__empty", - "schema": { - "type": "boolean" - } - }, - { - "in": "query", - "name": "id__gt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "id__gte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "id__lt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "id__lte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "id__n", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__empty", - "schema": { - "type": "boolean" - } - }, - { - "in": "query", - "name": "label__ic", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__ie", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__iew", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__iregex", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__isw", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__n", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__nic", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__nie", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__niew", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__nisw", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__regex", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "layer_id", - "schema": { - "type": "array", - "items": { - "type": "integer" - } - }, - "description": "Layer (ID)", - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "layer_id__n", - "schema": { - "type": "array", - "items": { - "type": "integer" - } - }, - "description": "Layer (ID)", - "explode": true, - "style": "form" - }, - { - "name": "limit", - "required": false, - "in": "query", - "description": "Number of results to return per page.", - "schema": { - "type": "integer" - } - }, - { - "name": "offset", - "required": false, - "in": "query", - "description": "The initial index from which to return the results.", - "schema": { - "type": "integer" - } - }, - { - "name": "ordering", - "required": false, - "in": "query", - "description": "Which field to use when ordering the results.", - "schema": { - "type": "string" - } - }, - { - "name": "start", - "required": false, - "in": "query", - "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", - "schema": { - "type": "integer" - } - }, - { - "in": "query", - "name": "type", - "schema": { - "type": "string", - "x-spec-enum-id": "d1dbedba6032e0ff", - "enum": [ - "cable", - "conduit", - "null", - "other" - ] - }, - "description": "* `cable` - Cable\n* `conduit` - Conduit\n* `other` - Other" - }, - { - "in": "query", - "name": "type__empty", - "schema": { - "type": "boolean" - } - }, - { - "in": "query", - "name": "type__ic", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "type__ie", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "type__iew", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "type__iregex", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "type__isw", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "type__n", - "schema": { - "type": "string", - "x-spec-enum-id": "d1dbedba6032e0ff", - "enum": [ - "cable", - "conduit", - "null", - "other" - ] - }, - "description": "* `cable` - Cable\n* `conduit` - Conduit\n* `other` - Other" - }, - { - "in": "query", - "name": "type__nic", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "type__nie", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "type__niew", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "type__nisw", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "type__regex", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - } - ], - "tags": [ - "plugins" - ], - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PaginatedPathList" - } - } - }, - "description": "" - } - } - }, - "post": { - "operationId": "plugins_physical_geometry_paths_create", - "description": "Post a list of path objects.", - "tags": [ - "plugins" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "oneOf": [ - { - "$ref": "#/components/schemas/PathRequest" - }, - { - "type": "array", - "items": { - "$ref": "#/components/schemas/PathRequest" - } - } - ] - } - }, - "multipart/form-data": { - "schema": { - "oneOf": [ - { - "$ref": "#/components/schemas/PathRequest" - }, - { - "type": "array", - "items": { - "$ref": "#/components/schemas/PathRequest" - } - } - ] - } - } - }, - "required": true - }, - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "201": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Path" - } - } - }, - "description": "" - } - } - }, - "put": { - "operationId": "plugins_physical_geometry_paths_bulk_update", - "description": "Put a list of path objects.", - "tags": [ - "plugins" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/PathRequest" - } - } - }, - "multipart/form-data": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/PathRequest" - } - } - } - }, - "required": true - }, - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - } - } - }, - "description": "" - } - } - }, - "patch": { - "operationId": "plugins_physical_geometry_paths_bulk_partial_update", - "description": "Patch a list of path objects.", - "tags": [ - "plugins" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/PathRequest" - } - } - }, - "multipart/form-data": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/PathRequest" - } - } - } - }, - "required": true - }, - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - } - } - }, - "description": "" - } - } - }, - "delete": { - "operationId": "plugins_physical_geometry_paths_bulk_destroy", - "description": "Delete a list of path objects.", - "tags": [ - "plugins" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/PathRequest" - } - } - }, - "multipart/form-data": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/PathRequest" - } - } - } - }, - "required": true - }, - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "204": { - "description": "No response body" - } - } - } - }, - "/api/plugins/physical-geometry/paths/{id}/": { - "get": { - "operationId": "plugins_physical_geometry_paths_retrieve", - "description": "Get a path object.", - "parameters": [ - { - "in": "path", - "name": "id", - "schema": { - "type": "integer" - }, - "description": "A unique integer value identifying this path.", - "required": true - } - ], - "tags": [ - "plugins" - ], - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Path" - } - } - }, - "description": "" - } - } - }, - "put": { - "operationId": "plugins_physical_geometry_paths_update", - "description": "Put a path object.", - "parameters": [ - { - "in": "path", - "name": "id", - "schema": { - "type": "integer" - }, - "description": "A unique integer value identifying this path.", - "required": true - } - ], - "tags": [ - "plugins" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PathRequest" - } - }, - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/PathRequest" - } - } - }, - "required": true - }, - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Path" - } - } - }, - "description": "" - } - } - }, - "patch": { - "operationId": "plugins_physical_geometry_paths_partial_update", - "description": "Patch a path object.", - "parameters": [ - { - "in": "path", - "name": "id", - "schema": { - "type": "integer" - }, - "description": "A unique integer value identifying this path.", - "required": true - } - ], - "tags": [ - "plugins" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PatchedPathRequest" - } - }, - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/PatchedPathRequest" - } - } - } - }, - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Path" - } - } - }, - "description": "" - } - } - }, - "delete": { - "operationId": "plugins_physical_geometry_paths_destroy", - "description": "Delete a path object.", - "parameters": [ - { - "in": "path", - "name": "id", - "schema": { - "type": "integer" - }, - "description": "A unique integer value identifying this path.", - "required": true - } - ], - "tags": [ - "plugins" - ], - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "204": { - "description": "No response body" - } - } - } - }, - "/api/plugins/physical-geometry/shapes/": { - "get": { - "operationId": "plugins_physical_geometry_shapes_list", - "description": "Get a list of shape objects.", - "parameters": [ - { - "in": "query", - "name": "depth", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "depth__empty", - "schema": { - "type": "boolean" - } - }, - { - "in": "query", - "name": "depth__gt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "depth__gte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "depth__lt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "depth__lte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "depth__n", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "floorplan_id", - "schema": { - "type": "array", - "items": { - "type": "integer" - } - }, - "description": "Floorplan (ID)", - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "floorplan_id__n", - "schema": { - "type": "array", - "items": { - "type": "integer" - } - }, - "description": "Floorplan (ID)", - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "height", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "height__empty", - "schema": { - "type": "boolean" - } - }, - { - "in": "query", - "name": "height__gt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "height__gte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "height__lt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "height__lte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "height__n", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "id", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "id__empty", - "schema": { - "type": "boolean" - } - }, - { - "in": "query", - "name": "id__gt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "id__gte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "id__lt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "id__lte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "id__n", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__empty", - "schema": { - "type": "boolean" - } - }, - { - "in": "query", - "name": "label__ic", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__ie", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__iew", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__iregex", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__isw", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__n", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__nic", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__nie", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__niew", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__nisw", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__regex", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "layer_id", - "schema": { - "type": "array", - "items": { - "type": "integer" - } - }, - "description": "Layer (ID)", - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "layer_id__n", - "schema": { - "type": "array", - "items": { - "type": "integer" - } - }, - "description": "Layer (ID)", - "explode": true, - "style": "form" - }, - { - "name": "limit", - "required": false, - "in": "query", - "description": "Number of results to return per page.", - "schema": { - "type": "integer" - } - }, - { - "name": "offset", - "required": false, - "in": "query", - "description": "The initial index from which to return the results.", - "schema": { - "type": "integer" - } - }, - { - "name": "ordering", - "required": false, - "in": "query", - "description": "Which field to use when ordering the results.", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "orientation", - "schema": { - "type": "integer", - "x-spec-enum-id": "cc17b9669bd36be0", - "enum": [ - 0, - 180, - 270, - 90, - "null" - ] - }, - "description": "* `0` - North\n* `90` - East\n* `180` - South\n* `270` - West" - }, - { - "in": "query", - "name": "orientation__ic", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "orientation__ie", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "orientation__iew", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "orientation__iregex", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "orientation__isw", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "orientation__n", - "schema": { - "type": "integer", - "x-spec-enum-id": "cc17b9669bd36be0", - "enum": [ - 0, - 180, - 270, - 90, - "null" - ] - }, - "description": "* `0` - North\n* `90` - East\n* `180` - South\n* `270` - West" - }, - { - "in": "query", - "name": "orientation__nic", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "orientation__nie", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "orientation__niew", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "orientation__nisw", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "orientation__regex", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "name": "start", - "required": false, - "in": "query", - "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", - "schema": { - "type": "integer" - } - }, - { - "in": "query", - "name": "type", - "schema": { - "type": "string", - "x-spec-enum-id": "8a6c4aff5be62f86", - "enum": [ - "device", - "null", - "obstruction", - "other", - "rack" - ] - }, - "description": "* `rack` - Rack\n* `device` - Device\n* `obstruction` - Obstruction\n* `other` - Other" - }, - { - "in": "query", - "name": "type__empty", - "schema": { - "type": "boolean" - } - }, - { - "in": "query", - "name": "type__ic", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "type__ie", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "type__iew", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "type__iregex", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "type__isw", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "type__n", - "schema": { - "type": "string", - "x-spec-enum-id": "8a6c4aff5be62f86", - "enum": [ - "device", - "null", - "obstruction", - "other", - "rack" - ] - }, - "description": "* `rack` - Rack\n* `device` - Device\n* `obstruction` - Obstruction\n* `other` - Other" - }, - { - "in": "query", - "name": "type__nic", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "type__nie", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "type__niew", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "type__nisw", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "type__regex", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "width", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "width__empty", - "schema": { - "type": "boolean" - } - }, - { - "in": "query", - "name": "width__gt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "width__gte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "width__lt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "width__lte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "width__n", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "x", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "x__empty", - "schema": { - "type": "boolean" - } - }, - { - "in": "query", - "name": "x__gt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "x__gte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "x__lt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "x__lte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "x__n", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "y", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "y__empty", - "schema": { - "type": "boolean" - } - }, - { - "in": "query", - "name": "y__gt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "y__gte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "y__lt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "y__lte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "y__n", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "z", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "z__empty", - "schema": { - "type": "boolean" - } - }, - { - "in": "query", - "name": "z__gt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "z__gte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "z__lt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "z__lte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "z__n", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - } - ], - "tags": [ - "plugins" - ], - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PaginatedShapeList" - } - } - }, - "description": "" - } - } - }, - "post": { - "operationId": "plugins_physical_geometry_shapes_create", - "description": "Post a list of shape objects.", - "tags": [ - "plugins" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "oneOf": [ - { - "$ref": "#/components/schemas/ShapeRequest" - }, - { - "type": "array", - "items": { - "$ref": "#/components/schemas/ShapeRequest" - } - } - ] - } - }, - "multipart/form-data": { - "schema": { - "oneOf": [ - { - "$ref": "#/components/schemas/ShapeRequest" - }, - { - "type": "array", - "items": { - "$ref": "#/components/schemas/ShapeRequest" - } - } - ] - } - } - }, - "required": true - }, - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "201": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Shape" - } - } - }, - "description": "" - } - } - }, - "put": { - "operationId": "plugins_physical_geometry_shapes_bulk_update", - "description": "Put a list of shape objects.", - "tags": [ - "plugins" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ShapeRequest" - } - } - }, - "multipart/form-data": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ShapeRequest" - } - } - } - }, - "required": true - }, - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Shape" - } - } - } - }, - "description": "" - } - } - }, - "patch": { - "operationId": "plugins_physical_geometry_shapes_bulk_partial_update", - "description": "Patch a list of shape objects.", - "tags": [ - "plugins" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ShapeRequest" - } - } - }, - "multipart/form-data": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ShapeRequest" - } - } - } - }, - "required": true - }, - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Shape" - } - } - } - }, - "description": "" - } - } - }, - "delete": { - "operationId": "plugins_physical_geometry_shapes_bulk_destroy", - "description": "Delete a list of shape objects.", - "tags": [ - "plugins" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ShapeRequest" - } - } - }, - "multipart/form-data": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ShapeRequest" - } - } - } - }, - "required": true - }, - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "204": { - "description": "No response body" - } - } - } - }, - "/api/plugins/physical-geometry/shapes/{id}/": { - "get": { - "operationId": "plugins_physical_geometry_shapes_retrieve", - "description": "Get a shape object.", - "parameters": [ - { - "in": "path", - "name": "id", - "schema": { - "type": "integer" - }, - "description": "A unique integer value identifying this shape.", - "required": true - } - ], - "tags": [ - "plugins" - ], - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Shape" - } - } - }, - "description": "" - } - } - }, - "put": { - "operationId": "plugins_physical_geometry_shapes_update", - "description": "Put a shape object.", - "parameters": [ - { - "in": "path", - "name": "id", - "schema": { - "type": "integer" - }, - "description": "A unique integer value identifying this shape.", - "required": true - } - ], - "tags": [ - "plugins" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ShapeRequest" - } - }, - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/ShapeRequest" - } - } - }, - "required": true - }, - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Shape" - } - } - }, - "description": "" - } - } - }, - "patch": { - "operationId": "plugins_physical_geometry_shapes_partial_update", - "description": "Patch a shape object.", - "parameters": [ - { - "in": "path", - "name": "id", - "schema": { - "type": "integer" - }, - "description": "A unique integer value identifying this shape.", - "required": true - } - ], - "tags": [ - "plugins" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PatchedShapeRequest" - } - }, - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/PatchedShapeRequest" - } - } - } - }, - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Shape" - } - } - }, - "description": "" - } - } - }, - "delete": { - "operationId": "plugins_physical_geometry_shapes_destroy", - "description": "Delete a shape object.", - "parameters": [ - { - "in": "path", - "name": "id", - "schema": { - "type": "integer" - }, - "description": "A unique integer value identifying this shape.", - "required": true - } - ], - "tags": [ - "plugins" - ], - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "204": { - "description": "No response body" - } - } - } - }, - "/api/plugins/physical-geometry/zones/": { - "get": { - "operationId": "plugins_physical_geometry_zones_list", - "description": "Get a list of zone objects.", - "parameters": [ - { - "in": "query", - "name": "floorplan_id", - "schema": { - "type": "array", - "items": { - "type": "integer" - } - }, - "description": "Floorplan (ID)", - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "floorplan_id__n", - "schema": { - "type": "array", - "items": { - "type": "integer" - } - }, - "description": "Floorplan (ID)", - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "height", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "height__empty", - "schema": { - "type": "boolean" - } - }, - { - "in": "query", - "name": "height__gt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "height__gte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "height__lt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "height__lte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "height__n", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "id", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "id__empty", - "schema": { - "type": "boolean" - } - }, - { - "in": "query", - "name": "id__gt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "id__gte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "id__lt", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "id__lte", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "id__n", - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__empty", - "schema": { - "type": "boolean" - } - }, - { - "in": "query", - "name": "label__ic", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__ie", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__iew", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__iregex", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__isw", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__n", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__nic", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__nie", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__niew", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__nisw", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "label__regex", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "layer_id", - "schema": { - "type": "array", - "items": { - "type": "integer" - } - }, - "description": "Layer (ID)", - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "layer_id__n", - "schema": { - "type": "array", - "items": { - "type": "integer" - } - }, - "description": "Layer (ID)", - "explode": true, - "style": "form" - }, - { - "name": "limit", - "required": false, - "in": "query", - "description": "Number of results to return per page.", - "schema": { - "type": "integer" - } - }, - { - "name": "offset", - "required": false, - "in": "query", - "description": "The initial index from which to return the results.", - "schema": { - "type": "integer" - } - }, - { - "name": "ordering", - "required": false, - "in": "query", - "description": "Which field to use when ordering the results.", - "schema": { - "type": "string" - } - }, - { - "name": "start", - "required": false, - "in": "query", - "description": "Cursor-based pagination: return results with pk >= start, ordered by pk. Mutually exclusive with offset.", - "schema": { - "type": "integer" - } - }, - { - "in": "query", - "name": "type", - "schema": { - "type": "string", - "x-spec-enum-id": "c1987b14a7be96ec", - "enum": [ - "cold-aisle", - "compute", - "cooling", - "data-hall", - "hot-aisle", - "network", - "null", - "other", - "power", - "restricted", - "storage" - ] - }, - "description": "* `hot-aisle` - Hot aisle\n* `cold-aisle` - Cold aisle\n* `data-hall` - Data hall\n* `network` - Network\n* `compute` - Compute\n* `storage` - Storage\n* `power` - Power\n* `cooling` - Cooling\n* `restricted` - Restricted\n* `other` - Other" - }, - { - "in": "query", - "name": "type__empty", - "schema": { - "type": "boolean" - } - }, - { - "in": "query", - "name": "type__ic", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "type__ie", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "type__iew", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "type__iregex", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "type__isw", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "type__n", - "schema": { - "type": "string", - "x-spec-enum-id": "c1987b14a7be96ec", - "enum": [ - "cold-aisle", - "compute", - "cooling", - "data-hall", - "hot-aisle", - "network", - "null", - "other", - "power", - "restricted", - "storage" - ] - }, - "description": "* `hot-aisle` - Hot aisle\n* `cold-aisle` - Cold aisle\n* `data-hall` - Data hall\n* `network` - Network\n* `compute` - Compute\n* `storage` - Storage\n* `power` - Power\n* `cooling` - Cooling\n* `restricted` - Restricted\n* `other` - Other" - }, - { - "in": "query", - "name": "type__nic", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "type__nie", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "type__niew", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "type__nisw", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - }, - { - "in": "query", - "name": "type__regex", - "schema": { - "type": "array", - "items": { - "type": "string" - } - }, - "explode": true, - "style": "form" - } - ], - "tags": [ - "plugins" - ], - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PaginatedZoneList" - } - } - }, - "description": "" - } - } - }, - "post": { - "operationId": "plugins_physical_geometry_zones_create", - "description": "Post a list of zone objects.", - "tags": [ - "plugins" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "oneOf": [ - { - "$ref": "#/components/schemas/ZoneRequest" - }, - { - "type": "array", - "items": { - "$ref": "#/components/schemas/ZoneRequest" - } - } - ] - } - }, - "multipart/form-data": { - "schema": { - "oneOf": [ - { - "$ref": "#/components/schemas/ZoneRequest" - }, - { - "type": "array", - "items": { - "$ref": "#/components/schemas/ZoneRequest" - } - } - ] - } - } - }, - "required": true - }, - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "201": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Zone" - } - } - }, - "description": "" - } - } - }, - "put": { - "operationId": "plugins_physical_geometry_zones_bulk_update", - "description": "Put a list of zone objects.", - "tags": [ - "plugins" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ZoneRequest" - } - } - }, - "multipart/form-data": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ZoneRequest" - } - } - } - }, - "required": true - }, - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Zone" - } - } - } - }, - "description": "" - } - } - }, - "patch": { - "operationId": "plugins_physical_geometry_zones_bulk_partial_update", - "description": "Patch a list of zone objects.", - "tags": [ - "plugins" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ZoneRequest" - } - } - }, - "multipart/form-data": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ZoneRequest" - } - } - } - }, - "required": true - }, - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Zone" - } - } - } - }, - "description": "" - } - } - }, - "delete": { - "operationId": "plugins_physical_geometry_zones_bulk_destroy", - "description": "Delete a list of zone objects.", - "tags": [ - "plugins" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ZoneRequest" - } - } - }, - "multipart/form-data": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ZoneRequest" - } - } - } - }, - "required": true - }, - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "204": { - "description": "No response body" - } - } - } - }, - "/api/plugins/physical-geometry/zones/{id}/": { - "get": { - "operationId": "plugins_physical_geometry_zones_retrieve", - "description": "Get a zone object.", - "parameters": [ - { - "in": "path", - "name": "id", - "schema": { - "type": "integer" - }, - "description": "A unique integer value identifying this zone.", - "required": true - } - ], - "tags": [ - "plugins" - ], - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Zone" - } - } - }, - "description": "" - } - } - }, - "put": { - "operationId": "plugins_physical_geometry_zones_update", - "description": "Put a zone object.", - "parameters": [ - { - "in": "path", - "name": "id", - "schema": { - "type": "integer" - }, - "description": "A unique integer value identifying this zone.", - "required": true - } - ], - "tags": [ - "plugins" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ZoneRequest" - } - }, - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/ZoneRequest" - } - } - }, - "required": true - }, - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Zone" - } - } - }, - "description": "" - } - } - }, - "patch": { - "operationId": "plugins_physical_geometry_zones_partial_update", - "description": "Patch a zone object.", - "parameters": [ - { - "in": "path", - "name": "id", - "schema": { - "type": "integer" - }, - "description": "A unique integer value identifying this zone.", - "required": true - } - ], - "tags": [ - "plugins" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PatchedZoneRequest" - } - }, - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/PatchedZoneRequest" - } - } - } - }, - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Zone" - } - } - }, - "description": "" - } - } - }, - "delete": { - "operationId": "plugins_physical_geometry_zones_destroy", - "description": "Delete a zone object.", - "parameters": [ - { - "in": "path", - "name": "id", - "schema": { - "type": "integer" - }, - "description": "A unique integer value identifying this zone.", - "required": true - } - ], - "tags": [ - "plugins" - ], - "security": [ - { - "cookieAuth": [] - }, - { - "tokenAuth": [] - } - ], - "responses": { - "204": { - "description": "No response body" - } - } - } - }, "/api/schema/": { "get": { "operationId": "schema_retrieve", @@ -241526,8 +235633,16 @@ "nullable": true }, "cable_end": { + "enum": [ + "A", + "B", + null + ], "type": "string", - "readOnly": true + "description": "* `A` - A\n* `B` - B", + "x-spec-enum-id": "1db84f9b93b261c8", + "readOnly": true, + "nullable": true }, "link_peers": { "type": "array", @@ -243207,8 +237322,16 @@ "nullable": true }, "cable_end": { + "enum": [ + "A", + "B", + null + ], "type": "string", - "readOnly": true + "description": "* `A` - A\n* `B` - B", + "x-spec-enum-id": "1db84f9b93b261c8", + "readOnly": true, + "nullable": true }, "link_peers": { "type": "array", @@ -243750,8 +237873,16 @@ "nullable": true }, "cable_end": { + "enum": [ + "A", + "B", + null + ], "type": "string", - "readOnly": true + "description": "* `A` - A\n* `B` - B", + "x-spec-enum-id": "1db84f9b93b261c8", + "readOnly": true, + "nullable": true }, "link_peers": { "type": "array", @@ -248873,169 +243004,6 @@ "protocol" ] }, - "Floorplan": { - "type": "object", - "description": "Adds support for custom fields and tags.", - "properties": { - "id": { - "type": "integer", - "readOnly": true - }, - "url": { - "type": "string", - "format": "uri", - "readOnly": true - }, - "display_url": { - "type": "string", - "format": "uri", - "readOnly": true - }, - "display": { - "type": "string", - "readOnly": true - }, - "name": { - "type": "string", - "maxLength": 100 - }, - "location": { - "type": "integer", - "description": "The location represented by the floorplan" - }, - "base_unit": { - "enum": [ - "cm", - "in" - ], - "type": "string", - "x-spec-enum-id": "7acfbd25fa72f8c6", - "description": "The base unit in which all shapes are measured\n\n* `cm` - Centimeter\n* `in` - Inch" - }, - "width": { - "type": "integer", - "maximum": 2147483647, - "minimum": 0, - "description": "Width (X axis) of the rendered floorplan expressed in the base unit" - }, - "depth": { - "type": "integer", - "maximum": 2147483647, - "minimum": 0, - "description": "Depth (Y axis) of the rendered floorplan expressed in the base unit" - }, - "grid_interval": { - "type": "integer", - "maximum": 32767, - "minimum": 1, - "nullable": true, - "description": "Grid line spacing interval (if enabled)" - }, - "description": { - "type": "string", - "maxLength": 200 - }, - "comments": { - "type": "string" - }, - "tags": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NestedTag" - } - }, - "custom_fields": { - "type": "object", - "additionalProperties": {} - }, - "created": { - "type": "string", - "format": "date-time", - "readOnly": true, - "nullable": true - }, - "last_updated": { - "type": "string", - "format": "date-time", - "readOnly": true, - "nullable": true - } - }, - "required": [ - "created", - "display", - "display_url", - "id", - "last_updated", - "location", - "name", - "url" - ] - }, - "FloorplanRequest": { - "type": "object", - "description": "Adds support for custom fields and tags.", - "properties": { - "name": { - "type": "string", - "minLength": 1, - "maxLength": 100 - }, - "location": { - "type": "integer", - "description": "The location represented by the floorplan" - }, - "base_unit": { - "enum": [ - "cm", - "in" - ], - "type": "string", - "x-spec-enum-id": "7acfbd25fa72f8c6", - "description": "The base unit in which all shapes are measured\n\n* `cm` - Centimeter\n* `in` - Inch" - }, - "width": { - "type": "integer", - "maximum": 2147483647, - "minimum": 0, - "description": "Width (X axis) of the rendered floorplan expressed in the base unit" - }, - "depth": { - "type": "integer", - "maximum": 2147483647, - "minimum": 0, - "description": "Depth (Y axis) of the rendered floorplan expressed in the base unit" - }, - "grid_interval": { - "type": "integer", - "maximum": 32767, - "minimum": 1, - "nullable": true, - "description": "Grid line spacing interval (if enabled)" - }, - "description": { - "type": "string", - "maxLength": 200 - }, - "comments": { - "type": "string" - }, - "tags": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NestedTagRequest" - } - }, - "custom_fields": { - "type": "object", - "additionalProperties": {} - } - }, - "required": [ - "location", - "name" - ] - }, "FrontPort": { "type": "object", "description": "Adds an `owner` field for models which have a ForeignKey to users.Owner.", @@ -249245,8 +243213,16 @@ "nullable": true }, "cable_end": { + "enum": [ + "A", + "B", + null + ], "type": "string", - "readOnly": true + "description": "* `A` - A\n* `B` - B", + "x-spec-enum-id": "1db84f9b93b261c8", + "readOnly": true, + "nullable": true }, "link_peers": { "type": "array", @@ -253187,8 +247163,16 @@ "nullable": true }, "cable_end": { + "enum": [ + "A", + "B", + null + ], "type": "string", - "readOnly": true + "description": "* `A` - A\n* `B` - B", + "x-spec-enum-id": "1db84f9b93b261c8", + "readOnly": true, + "nullable": true }, "wireless_link": { "allOf": [ @@ -256401,206 +250385,6 @@ "l2vpn" ] }, - "Layer": { - "type": "object", - "description": "Adds support for custom fields and tags.", - "properties": { - "id": { - "type": "integer", - "readOnly": true - }, - "url": { - "type": "string", - "format": "uri", - "readOnly": true - }, - "display": { - "type": "string", - "readOnly": true - }, - "floorplan": { - "type": "integer" - }, - "name": { - "type": "string", - "maxLength": 100 - }, - "is_visible": { - "type": "boolean" - }, - "order": { - "type": "integer", - "maximum": 1000, - "minimum": 1, - "description": "Ordering relative to other layers in the floorplan" - }, - "opacity": { - "type": "integer", - "maximum": 100, - "minimum": 0 - }, - "image": { - "type": "string", - "format": "uri", - "description": "Background image for the layer" - }, - "image_width": { - "type": "integer", - "readOnly": true - }, - "image_height": { - "type": "integer", - "readOnly": true - }, - "image_scale": { - "type": "number", - "format": "double", - "maximum": 1000000, - "minimum": -1000000, - "exclusiveMaximum": true, - "exclusiveMinimum": true, - "nullable": true, - "description": "The number of pixels per specified unit (e.g. pixels/cm)" - }, - "image_scale_unit": { - "enum": [ - "cm", - "in", - "" - ], - "type": "string", - "description": "* `cm` - Centimeter\n* `in` - Inch", - "x-spec-enum-id": "7acfbd25fa72f8c6" - }, - "image_origin_x": { - "type": "integer", - "maximum": 2147483647, - "minimum": -2147483648 - }, - "image_origin_Y": { - "type": "integer", - "maximum": 2147483647, - "minimum": -2147483648 - }, - "image_rotation": { - "type": "number", - "format": "double", - "maximum": 180, - "minimum": -180 - }, - "source_type": { - "type": "string", - "readOnly": true - }, - "source_page": { - "type": "integer", - "readOnly": true - }, - "source_filename": { - "type": "string", - "readOnly": true - }, - "created": { - "type": "string", - "format": "date-time", - "readOnly": true, - "nullable": true - }, - "last_updated": { - "type": "string", - "format": "date-time", - "readOnly": true, - "nullable": true - } - }, - "required": [ - "created", - "display", - "floorplan", - "id", - "image_height", - "image_width", - "last_updated", - "name", - "source_filename", - "source_page", - "source_type", - "url" - ] - }, - "LayerRequest": { - "type": "object", - "description": "Adds support for custom fields and tags.", - "properties": { - "floorplan": { - "type": "integer" - }, - "name": { - "type": "string", - "minLength": 1, - "maxLength": 100 - }, - "is_visible": { - "type": "boolean" - }, - "order": { - "type": "integer", - "maximum": 1000, - "minimum": 1, - "description": "Ordering relative to other layers in the floorplan" - }, - "opacity": { - "type": "integer", - "maximum": 100, - "minimum": 0 - }, - "image": { - "type": "string", - "format": "binary", - "description": "Background image for the layer" - }, - "image_scale": { - "type": "number", - "format": "double", - "maximum": 1000000, - "minimum": -1000000, - "exclusiveMaximum": true, - "exclusiveMinimum": true, - "nullable": true, - "description": "The number of pixels per specified unit (e.g. pixels/cm)" - }, - "image_scale_unit": { - "enum": [ - "cm", - "in", - "" - ], - "type": "string", - "description": "* `cm` - Centimeter\n* `in` - Inch", - "x-spec-enum-id": "7acfbd25fa72f8c6" - }, - "image_origin_x": { - "type": "integer", - "maximum": 2147483647, - "minimum": -2147483648 - }, - "image_origin_Y": { - "type": "integer", - "maximum": 2147483647, - "minimum": -2147483648 - }, - "image_rotation": { - "type": "number", - "format": "double", - "maximum": 180, - "minimum": -180 - } - }, - "required": [ - "floorplan", - "name" - ] - }, "Location": { "type": "object", "description": "Base serializer class for models inheriting from NestedGroupModel.", @@ -261267,37 +255051,6 @@ } } }, - "PaginatedFloorplanList": { - "type": "object", - "required": [ - "count", - "results" - ], - "properties": { - "count": { - "type": "integer", - "example": 123 - }, - "next": { - "type": "string", - "nullable": true, - "format": "uri", - "example": "http://api.example.org/accounts/?offset=400&limit=100" - }, - "previous": { - "type": "string", - "nullable": true, - "format": "uri", - "example": "http://api.example.org/accounts/?offset=200&limit=100" - }, - "results": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Floorplan" - } - } - } - }, "PaginatedFrontPortList": { "type": "object", "required": [ @@ -261918,37 +255671,6 @@ } } }, - "PaginatedLayerList": { - "type": "object", - "required": [ - "count", - "results" - ], - "properties": { - "count": { - "type": "integer", - "example": 123 - }, - "next": { - "type": "string", - "nullable": true, - "format": "uri", - "example": "http://api.example.org/accounts/?offset=400&limit=100" - }, - "previous": { - "type": "string", - "nullable": true, - "format": "uri", - "example": "http://api.example.org/accounts/?offset=200&limit=100" - }, - "results": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Layer" - } - } - } - }, "PaginatedLocationList": { "type": "object", "required": [ @@ -262414,37 +256136,6 @@ } } }, - "PaginatedPathList": { - "type": "object", - "required": [ - "count", - "results" - ], - "properties": { - "count": { - "type": "integer", - "example": 123 - }, - "next": { - "type": "string", - "nullable": true, - "format": "uri", - "example": "http://api.example.org/accounts/?offset=400&limit=100" - }, - "previous": { - "type": "string", - "nullable": true, - "format": "uri", - "example": "http://api.example.org/accounts/?offset=200&limit=100" - }, - "results": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - } - } - }, "PaginatedPlatformList": { "type": "object", "required": [ @@ -263282,37 +256973,6 @@ } } }, - "PaginatedShapeList": { - "type": "object", - "required": [ - "count", - "results" - ], - "properties": { - "count": { - "type": "integer", - "example": 123 - }, - "next": { - "type": "string", - "nullable": true, - "format": "uri", - "example": "http://api.example.org/accounts/?offset=400&limit=100" - }, - "previous": { - "type": "string", - "nullable": true, - "format": "uri", - "example": "http://api.example.org/accounts/?offset=200&limit=100" - }, - "results": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Shape" - } - } - } - }, "PaginatedSiteGroupList": { "type": "object", "required": [ @@ -264274,37 +257934,6 @@ } } }, - "PaginatedZoneList": { - "type": "object", - "required": [ - "count", - "results" - ], - "properties": { - "count": { - "type": "integer", - "example": 123 - }, - "next": { - "type": "string", - "nullable": true, - "format": "uri", - "example": "http://api.example.org/accounts/?offset=400&limit=100" - }, - "previous": { - "type": "string", - "nullable": true, - "format": "uri", - "example": "http://api.example.org/accounts/?offset=200&limit=100" - }, - "results": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Zone" - } - } - } - }, "PatchedASNRangeRequest": { "type": "object", "description": "Base serializer class for models inheriting from OrganizationalModel.", @@ -265652,66 +259281,6 @@ } } }, - "PatchedFloorplanRequest": { - "type": "object", - "description": "Adds support for custom fields and tags.", - "properties": { - "name": { - "type": "string", - "minLength": 1, - "maxLength": 100 - }, - "location": { - "type": "integer", - "description": "The location represented by the floorplan" - }, - "base_unit": { - "enum": [ - "cm", - "in" - ], - "type": "string", - "x-spec-enum-id": "7acfbd25fa72f8c6", - "description": "The base unit in which all shapes are measured\n\n* `cm` - Centimeter\n* `in` - Inch" - }, - "width": { - "type": "integer", - "maximum": 2147483647, - "minimum": 0, - "description": "Width (X axis) of the rendered floorplan expressed in the base unit" - }, - "depth": { - "type": "integer", - "maximum": 2147483647, - "minimum": 0, - "description": "Depth (Y axis) of the rendered floorplan expressed in the base unit" - }, - "grid_interval": { - "type": "integer", - "maximum": 32767, - "minimum": 1, - "nullable": true, - "description": "Grid line spacing interval (if enabled)" - }, - "description": { - "type": "string", - "maxLength": 200 - }, - "comments": { - "type": "string" - }, - "tags": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NestedTagRequest" - } - }, - "custom_fields": { - "type": "object", - "additionalProperties": {} - } - } - }, "PatchedGroupRequest": { "type": "object", "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)", @@ -265934,75 +259503,6 @@ } } }, - "PatchedLayerRequest": { - "type": "object", - "description": "Adds support for custom fields and tags.", - "properties": { - "floorplan": { - "type": "integer" - }, - "name": { - "type": "string", - "minLength": 1, - "maxLength": 100 - }, - "is_visible": { - "type": "boolean" - }, - "order": { - "type": "integer", - "maximum": 1000, - "minimum": 1, - "description": "Ordering relative to other layers in the floorplan" - }, - "opacity": { - "type": "integer", - "maximum": 100, - "minimum": 0 - }, - "image": { - "type": "string", - "format": "binary", - "description": "Background image for the layer" - }, - "image_scale": { - "type": "number", - "format": "double", - "maximum": 1000000, - "minimum": -1000000, - "exclusiveMaximum": true, - "exclusiveMinimum": true, - "nullable": true, - "description": "The number of pixels per specified unit (e.g. pixels/cm)" - }, - "image_scale_unit": { - "enum": [ - "cm", - "in", - "" - ], - "type": "string", - "description": "* `cm` - Centimeter\n* `in` - Inch", - "x-spec-enum-id": "7acfbd25fa72f8c6" - }, - "image_origin_x": { - "type": "integer", - "maximum": 2147483647, - "minimum": -2147483648 - }, - "image_origin_Y": { - "type": "integer", - "maximum": 2147483647, - "minimum": -2147483648 - }, - "image_rotation": { - "type": "number", - "format": "double", - "maximum": 180, - "minimum": -180 - } - } - }, "PatchedMACAddressRequest": { "type": "object", "description": "Base serializer class for models inheriting from PrimaryModel.", @@ -266490,46 +259990,6 @@ } } }, - "PatchedPathRequest": { - "type": "object", - "description": "Adds support for custom fields and tags.", - "properties": { - "floorplan": { - "type": "integer" - }, - "layer": { - "type": "integer" - }, - "label": { - "type": "string", - "maxLength": 200 - }, - "type": { - "enum": [ - "cable", - "conduit", - "other" - ], - "type": "string", - "description": "* `cable` - Cable\n* `conduit` - Conduit\n* `other` - Other", - "x-spec-enum-id": "d1dbedba6032e0ff" - }, - "coordinates": { - "type": "array", - "items": { - "type": "array", - "items": { - "type": "integer", - "maximum": 2147483647, - "minimum": 0, - "title": "Coordinates" - }, - "maxItems": 3 - }, - "minItems": 2 - } - } - }, "PatchedPowerPanelRequest": { "type": "object", "description": "Base serializer class for models inheriting from PrimaryModel.", @@ -267146,87 +260606,6 @@ } } }, - "PatchedShapeRequest": { - "type": "object", - "description": "Adds support for custom fields and tags.", - "properties": { - "floorplan": { - "type": "integer" - }, - "layer": { - "type": "integer" - }, - "label": { - "type": "string", - "maxLength": 200 - }, - "type": { - "enum": [ - "rack", - "device", - "obstruction", - "other" - ], - "type": "string", - "description": "* `rack` - Rack\n* `device` - Device\n* `obstruction` - Obstruction\n* `other` - Other", - "x-spec-enum-id": "8a6c4aff5be62f86" - }, - "x": { - "type": "integer", - "maximum": 2147483647, - "minimum": 0 - }, - "y": { - "type": "integer", - "maximum": 2147483647, - "minimum": 0 - }, - "z": { - "type": "integer", - "maximum": 2147483647, - "minimum": 0 - }, - "width": { - "type": "integer", - "maximum": 32767, - "minimum": 1 - }, - "depth": { - "type": "integer", - "maximum": 32767, - "minimum": 1 - }, - "height": { - "type": "integer", - "maximum": 32767, - "minimum": 0 - }, - "orientation": { - "enum": [ - 0, - 90, - 180, - 270 - ], - "type": "integer", - "description": "* `0` - North\n* `90` - East\n* `180` - South\n* `270` - West", - "x-spec-enum-id": "cc17b9669bd36be0", - "minimum": 0, - "maximum": 32767 - }, - "object_type": { - "type": "string", - "nullable": true - }, - "object_id": { - "type": "integer", - "maximum": 9223372036854775807, - "minimum": 0, - "format": "int64", - "nullable": true - } - } - }, "PatchedSubscriptionRequest": { "type": "object", "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)", @@ -276794,180 +270173,6 @@ } } }, - "PatchedZoneRequest": { - "type": "object", - "description": "Adds support for custom fields and tags.", - "properties": { - "floorplan": { - "type": "integer" - }, - "layer": { - "type": "integer" - }, - "label": { - "type": "string", - "maxLength": 200 - }, - "type": { - "enum": [ - "hot-aisle", - "cold-aisle", - "data-hall", - "network", - "compute", - "storage", - "power", - "cooling", - "restricted", - "other" - ], - "type": "string", - "description": "* `hot-aisle` - Hot aisle\n* `cold-aisle` - Cold aisle\n* `data-hall` - Data hall\n* `network` - Network\n* `compute` - Compute\n* `storage` - Storage\n* `power` - Power\n* `cooling` - Cooling\n* `restricted` - Restricted\n* `other` - Other", - "x-spec-enum-id": "c1987b14a7be96ec" - }, - "coordinates": { - "type": "array", - "items": { - "type": "array", - "items": { - "type": "integer", - "maximum": 2147483647, - "minimum": 0, - "title": "Coordinates" - }, - "maxItems": 2 - }, - "minItems": 3 - }, - "height": { - "type": "integer", - "maximum": 32767, - "minimum": 0 - } - } - }, - "Path": { - "type": "object", - "description": "Adds support for custom fields and tags.", - "properties": { - "id": { - "type": "integer", - "readOnly": true - }, - "url": { - "type": "string", - "format": "uri", - "readOnly": true - }, - "display": { - "type": "string", - "readOnly": true - }, - "floorplan": { - "type": "integer" - }, - "layer": { - "type": "integer" - }, - "label": { - "type": "string", - "maxLength": 200 - }, - "type": { - "enum": [ - "cable", - "conduit", - "other" - ], - "type": "string", - "description": "* `cable` - Cable\n* `conduit` - Conduit\n* `other` - Other", - "x-spec-enum-id": "d1dbedba6032e0ff" - }, - "coordinates": { - "type": "array", - "items": { - "type": "array", - "items": { - "type": "integer", - "maximum": 2147483647, - "minimum": 0, - "title": "Coordinates" - }, - "maxItems": 3 - }, - "minItems": 2 - }, - "created": { - "type": "string", - "format": "date-time", - "readOnly": true, - "nullable": true - }, - "last_updated": { - "type": "string", - "format": "date-time", - "readOnly": true, - "nullable": true - } - }, - "required": [ - "coordinates", - "created", - "display", - "floorplan", - "id", - "last_updated", - "layer", - "type", - "url" - ] - }, - "PathRequest": { - "type": "object", - "description": "Adds support for custom fields and tags.", - "properties": { - "floorplan": { - "type": "integer" - }, - "layer": { - "type": "integer" - }, - "label": { - "type": "string", - "maxLength": 200 - }, - "type": { - "enum": [ - "cable", - "conduit", - "other" - ], - "type": "string", - "description": "* `cable` - Cable\n* `conduit` - Conduit\n* `other` - Other", - "x-spec-enum-id": "d1dbedba6032e0ff" - }, - "coordinates": { - "type": "array", - "items": { - "type": "array", - "items": { - "type": "integer", - "maximum": 2147483647, - "minimum": 0, - "title": "Coordinates" - }, - "maxItems": 3 - }, - "minItems": 2 - } - }, - "required": [ - "coordinates", - "floorplan", - "layer", - "type" - ] - }, "Platform": { "type": "object", "description": "Base serializer class for models inheriting from NestedGroupModel.", @@ -277339,8 +270544,16 @@ "nullable": true }, "cable_end": { + "enum": [ + "A", + "B", + null + ], "type": "string", - "readOnly": true + "description": "* `A` - A\n* `B` - B", + "x-spec-enum-id": "1db84f9b93b261c8", + "readOnly": true, + "nullable": true }, "link_peers": { "type": "array", @@ -277928,8 +271141,16 @@ "nullable": true }, "cable_end": { + "enum": [ + "A", + "B", + null + ], "type": "string", - "readOnly": true + "description": "* `A` - A\n* `B` - B", + "x-spec-enum-id": "1db84f9b93b261c8", + "readOnly": true, + "nullable": true }, "link_peers": { "type": "array", @@ -279246,8 +272467,16 @@ "nullable": true }, "cable_end": { + "enum": [ + "A", + "B", + null + ], "type": "string", - "readOnly": true + "description": "* `A` - A\n* `B` - B", + "x-spec-enum-id": "1db84f9b93b261c8", + "readOnly": true, + "nullable": true }, "link_peers": { "type": "array", @@ -282876,8 +276105,16 @@ "nullable": true }, "cable_end": { + "enum": [ + "A", + "B", + null + ], "type": "string", - "readOnly": true + "description": "* `A` - A\n* `B` - B", + "x-spec-enum-id": "1db84f9b93b261c8", + "readOnly": true, + "nullable": true }, "link_peers": { "type": "array", @@ -284714,220 +277951,6 @@ "ports" ] }, - "Shape": { - "type": "object", - "description": "Adds support for custom fields and tags.", - "properties": { - "id": { - "type": "integer", - "readOnly": true - }, - "url": { - "type": "string", - "format": "uri", - "readOnly": true - }, - "display": { - "type": "string", - "readOnly": true - }, - "floorplan": { - "type": "integer" - }, - "layer": { - "type": "integer" - }, - "label": { - "type": "string", - "maxLength": 200 - }, - "type": { - "enum": [ - "rack", - "device", - "obstruction", - "other" - ], - "type": "string", - "description": "* `rack` - Rack\n* `device` - Device\n* `obstruction` - Obstruction\n* `other` - Other", - "x-spec-enum-id": "8a6c4aff5be62f86" - }, - "x": { - "type": "integer", - "maximum": 2147483647, - "minimum": 0 - }, - "y": { - "type": "integer", - "maximum": 2147483647, - "minimum": 0 - }, - "z": { - "type": "integer", - "maximum": 2147483647, - "minimum": 0 - }, - "width": { - "type": "integer", - "maximum": 32767, - "minimum": 1 - }, - "depth": { - "type": "integer", - "maximum": 32767, - "minimum": 1 - }, - "height": { - "type": "integer", - "maximum": 32767, - "minimum": 0 - }, - "orientation": { - "enum": [ - 0, - 90, - 180, - 270 - ], - "type": "integer", - "description": "* `0` - North\n* `90` - East\n* `180` - South\n* `270` - West", - "x-spec-enum-id": "cc17b9669bd36be0", - "minimum": 0, - "maximum": 32767 - }, - "object_type": { - "type": "string", - "nullable": true - }, - "object_id": { - "type": "integer", - "maximum": 9223372036854775807, - "minimum": 0, - "format": "int64", - "nullable": true - }, - "object": { - "readOnly": true - }, - "created": { - "type": "string", - "format": "date-time", - "readOnly": true, - "nullable": true - }, - "last_updated": { - "type": "string", - "format": "date-time", - "readOnly": true, - "nullable": true - } - }, - "required": [ - "created", - "depth", - "display", - "floorplan", - "id", - "last_updated", - "layer", - "object", - "type", - "url", - "width", - "x", - "y" - ] - }, - "ShapeRequest": { - "type": "object", - "description": "Adds support for custom fields and tags.", - "properties": { - "floorplan": { - "type": "integer" - }, - "layer": { - "type": "integer" - }, - "label": { - "type": "string", - "maxLength": 200 - }, - "type": { - "enum": [ - "rack", - "device", - "obstruction", - "other" - ], - "type": "string", - "description": "* `rack` - Rack\n* `device` - Device\n* `obstruction` - Obstruction\n* `other` - Other", - "x-spec-enum-id": "8a6c4aff5be62f86" - }, - "x": { - "type": "integer", - "maximum": 2147483647, - "minimum": 0 - }, - "y": { - "type": "integer", - "maximum": 2147483647, - "minimum": 0 - }, - "z": { - "type": "integer", - "maximum": 2147483647, - "minimum": 0 - }, - "width": { - "type": "integer", - "maximum": 32767, - "minimum": 1 - }, - "depth": { - "type": "integer", - "maximum": 32767, - "minimum": 1 - }, - "height": { - "type": "integer", - "maximum": 32767, - "minimum": 0 - }, - "orientation": { - "enum": [ - 0, - 90, - 180, - 270 - ], - "type": "integer", - "description": "* `0` - North\n* `90` - East\n* `180` - South\n* `270` - West", - "x-spec-enum-id": "cc17b9669bd36be0", - "minimum": 0, - "maximum": 32767 - }, - "object_type": { - "type": "string", - "nullable": true - }, - "object_id": { - "type": "integer", - "maximum": 9223372036854775807, - "minimum": 0, - "format": "int64", - "nullable": true - } - }, - "required": [ - "depth", - "floorplan", - "layer", - "type", - "width", - "x", - "y" - ] - }, "Site": { "type": "object", "description": "Base serializer class for models inheriting from PrimaryModel.", @@ -300447,152 +293470,6 @@ "interface_a", "interface_b" ] - }, - "Zone": { - "type": "object", - "description": "Adds support for custom fields and tags.", - "properties": { - "id": { - "type": "integer", - "readOnly": true - }, - "url": { - "type": "string", - "format": "uri", - "readOnly": true - }, - "display": { - "type": "string", - "readOnly": true - }, - "floorplan": { - "type": "integer" - }, - "layer": { - "type": "integer" - }, - "label": { - "type": "string", - "maxLength": 200 - }, - "type": { - "enum": [ - "hot-aisle", - "cold-aisle", - "data-hall", - "network", - "compute", - "storage", - "power", - "cooling", - "restricted", - "other" - ], - "type": "string", - "description": "* `hot-aisle` - Hot aisle\n* `cold-aisle` - Cold aisle\n* `data-hall` - Data hall\n* `network` - Network\n* `compute` - Compute\n* `storage` - Storage\n* `power` - Power\n* `cooling` - Cooling\n* `restricted` - Restricted\n* `other` - Other", - "x-spec-enum-id": "c1987b14a7be96ec" - }, - "coordinates": { - "type": "array", - "items": { - "type": "array", - "items": { - "type": "integer", - "maximum": 2147483647, - "minimum": 0, - "title": "Coordinates" - }, - "maxItems": 2 - }, - "minItems": 3 - }, - "height": { - "type": "integer", - "maximum": 32767, - "minimum": 0 - }, - "created": { - "type": "string", - "format": "date-time", - "readOnly": true, - "nullable": true - }, - "last_updated": { - "type": "string", - "format": "date-time", - "readOnly": true, - "nullable": true - } - }, - "required": [ - "coordinates", - "created", - "display", - "floorplan", - "id", - "last_updated", - "layer", - "type", - "url" - ] - }, - "ZoneRequest": { - "type": "object", - "description": "Adds support for custom fields and tags.", - "properties": { - "floorplan": { - "type": "integer" - }, - "layer": { - "type": "integer" - }, - "label": { - "type": "string", - "maxLength": 200 - }, - "type": { - "enum": [ - "hot-aisle", - "cold-aisle", - "data-hall", - "network", - "compute", - "storage", - "power", - "cooling", - "restricted", - "other" - ], - "type": "string", - "description": "* `hot-aisle` - Hot aisle\n* `cold-aisle` - Cold aisle\n* `data-hall` - Data hall\n* `network` - Network\n* `compute` - Compute\n* `storage` - Storage\n* `power` - Power\n* `cooling` - Cooling\n* `restricted` - Restricted\n* `other` - Other", - "x-spec-enum-id": "c1987b14a7be96ec" - }, - "coordinates": { - "type": "array", - "items": { - "type": "array", - "items": { - "type": "integer", - "maximum": 2147483647, - "minimum": 0, - "title": "Coordinates" - }, - "maxItems": 2 - }, - "minItems": 3 - }, - "height": { - "type": "integer", - "maximum": 32767, - "minimum": 0 - } - }, - "required": [ - "coordinates", - "floorplan", - "layer", - "type" - ] } }, "securitySchemes": { diff --git a/docs/release-notes/version-4.5.md b/docs/release-notes/version-4.5.md index ed5f6e301..86519d907 100644 --- a/docs/release-notes/version-4.5.md +++ b/docs/release-notes/version-4.5.md @@ -1,5 +1,17 @@ # NetBox v4.5 +## v4.5.10 (2026-05-04) + +### Bug Fixes + +* [#21990](https://github.com/netbox-community/netbox/issues/21990) - Fix erroneous deletion of device assignment when editing a virtual machine +* [#22005](https://github.com/netbox-community/netbox/issues/22005) - Fix filtering of interfaces by `connected` status to exclude incomplete cable paths +* [#22029](https://github.com/netbox-community/netbox/issues/22029) - Recast empty string values as null for unique nullable fields to avoid integrity errors +* [#22031](https://github.com/netbox-community/netbox/issues/22031) - Fix error when adding a prefix from a VLAN with no tenant/site +* [#22084](https://github.com/netbox-community/netbox/issues/22084) - Correct OpenAPI schema for `cable_end` field on cabled objects to indicate it may be null + +--- + ## v4.5.9 (2026-04-28) ### Enhancements diff --git a/netbox/dcim/api/serializers_/cables.py b/netbox/dcim/api/serializers_/cables.py index e0c2204d6..1f2eb6b5d 100644 --- a/netbox/dcim/api/serializers_/cables.py +++ b/netbox/dcim/api/serializers_/cables.py @@ -109,7 +109,8 @@ class CablePathSerializer(serializers.ModelSerializer): class CabledObjectSerializer(serializers.ModelSerializer): cable = CableSerializer(nested=True, read_only=True, allow_null=True) - cable_end = serializers.CharField(read_only=True) + # Use DRF's ChoiceField; NetBox's ChoiceField would return a value/label object. + cable_end = serializers.ChoiceField(choices=CableEndChoices, read_only=True, allow_null=True) link_peers_type = serializers.SerializerMethodField(read_only=True, allow_null=True) link_peers = serializers.SerializerMethodField(read_only=True) _occupied = serializers.SerializerMethodField(read_only=True) diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 02ed90576..05a9751dc 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -1929,8 +1929,8 @@ class PathEndpointFilterSet(django_filters.FilterSet): def filter_connected(self, queryset, name, value): if value: - return queryset.filter(_path__is_active=True) - return queryset.filter(Q(_path__isnull=True) | Q(_path__is_active=False)) + return queryset.filter(_path__is_active=True, _path__is_complete=True) + return queryset.filter(Q(_path__isnull=True) | Q(_path__is_active=False) | Q(_path__is_complete=False)) @register_filterset diff --git a/netbox/dcim/forms/bulk_edit.py b/netbox/dcim/forms/bulk_edit.py index d15ef34e1..d9ef8600f 100644 --- a/netbox/dcim/forms/bulk_edit.py +++ b/netbox/dcim/forms/bulk_edit.py @@ -1804,6 +1804,13 @@ class VirtualDeviceContextBulkEditForm(PrimaryModelBulkEditForm): ) nullable_fields = ('device', 'tenant', ) + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # The ?device= GET param is navigation context (filter), not an intent to change the + # device field — drop it from initial so Django's changed_data doesn't treat it as an edit. + self.initial.pop('device', None) + # # Addressing diff --git a/netbox/dcim/tests/test_filtersets.py b/netbox/dcim/tests/test_filtersets.py index 4fd711893..e003487dd 100644 --- a/netbox/dcim/tests/test_filtersets.py +++ b/netbox/dcim/tests/test_filtersets.py @@ -4631,6 +4631,11 @@ class InterfaceTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil ) Device.objects.bulk_create(devices) + # Expose base devices for regression tests which need custom cabling + # topologies. + cls.connection_filter_device = devices[0] + cls.connection_filter_peer_device = devices[1] + virtual_chassis.master = devices[0] virtual_chassis.save() @@ -5064,6 +5069,117 @@ class InterfaceTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil params = {'connected': False} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + def test_connected_excludes_incomplete_pass_through_path(self): + """ + Validate that connected=true requires a complete cable path, not merely + an active cable path. + + The incomplete path below models: + + interface -- front port -- rear port + + with no onward cable from the rear port. + """ + device = self.connection_filter_device + peer_device = self.connection_filter_peer_device + + connected_interface = Interface.objects.create( + device=device, + name='Connected Filter Interface', + type=InterfaceTypeChoices.TYPE_1GE_FIXED, + ) + connected_peer_interface = Interface.objects.create( + device=peer_device, + name='Connected Filter Peer Interface', + type=InterfaceTypeChoices.TYPE_1GE_FIXED, + ) + incomplete_path_interface = Interface.objects.create( + device=device, + name='Connected Filter Incomplete Path Interface', + type=InterfaceTypeChoices.TYPE_1GE_FIXED, + ) + + patch_panel = Device.objects.create( + name='Connected Filter Patch Panel', + site=device.site, + device_type=device.device_type, + role=device.role, + ) + rear_port = RearPort.objects.create( + device=patch_panel, + name='Patch Rear Port', + type=PortTypeChoices.TYPE_8P8C, + positions=1, + ) + front_port = FrontPort.objects.create( + device=patch_panel, + name='Patch Front Port', + type=PortTypeChoices.TYPE_8P8C, + ) + PortMapping.objects.create( + device=patch_panel, + front_port=front_port, + front_port_position=1, + rear_port=rear_port, + rear_port_position=1, + ) + + Cable( + a_terminations=[connected_interface], + b_terminations=[connected_peer_interface], + ).save() + Cable( + a_terminations=[incomplete_path_interface], + b_terminations=[front_port], + ).save() + + connected_interface.refresh_from_db() + connected_peer_interface.refresh_from_db() + incomplete_path_interface.refresh_from_db() + + self.assertTrue(connected_interface._path.is_active) + self.assertTrue(connected_interface._path.is_complete) + self.assertTrue(connected_peer_interface._path.is_active) + self.assertTrue(connected_peer_interface._path.is_complete) + + self.assertTrue(incomplete_path_interface._path.is_active) + self.assertFalse(incomplete_path_interface._path.is_complete) + + queryset = self.queryset.filter( + pk__in=( + connected_interface.pk, + connected_peer_interface.pk, + incomplete_path_interface.pk, + ) + ) + + params = {'cabled': 'true'} + self.assertSetEqual( + set(self.filterset(params, queryset).qs.values_list('pk', flat=True)), + { + connected_interface.pk, + connected_peer_interface.pk, + incomplete_path_interface.pk, + }, + ) + + params = {'connected': 'true'} + self.assertSetEqual( + set(self.filterset(params, queryset).qs.values_list('pk', flat=True)), + { + connected_interface.pk, + connected_peer_interface.pk, + }, + ) + + params = {'connected': 'false'} + self.assertSetEqual( + set(self.filterset(params, queryset).qs.values_list('pk', flat=True)), + { + incomplete_path_interface.pk, + }, + ) + def test_kind(self): params = {'kind': 'physical'} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 7) diff --git a/netbox/dcim/tests/test_models.py b/netbox/dcim/tests/test_models.py index f3c3a5044..3e3d1c526 100644 --- a/netbox/dcim/tests/test_models.py +++ b/netbox/dcim/tests/test_models.py @@ -638,6 +638,42 @@ class DeviceTestCase(TestCase): device2.full_clean() device2.save() + def test_empty_asset_tag_coerced_to_null_on_clean(self): + """ + An empty string assigned to a unique nullable CharField (e.g. asset_tag) must be coerced + to None on save so that multiple objects can be saved without violating the unique + constraint. Test that this is done on clean(). + """ + common_kwargs = { + 'site': Site.objects.first(), + 'device_type': DeviceType.objects.first(), + 'role': DeviceRole.objects.first(), + } + device1 = Device(name='Device 1', asset_tag='', **common_kwargs) + device1.clean() + self.assertIsNone(device1.asset_tag) + + def test_empty_asset_tag_coerced_to_null_on_save(self): + """ + An empty string assigned to a unique nullable CharField (e.g. asset_tag) must be coerced + to None on save so that multiple objects can be saved without violating the unique + constraint. Test that this is done on save(). + """ + common_kwargs = { + 'site': Site.objects.first(), + 'device_type': DeviceType.objects.first(), + 'role': DeviceRole.objects.first(), + } + device1 = Device(name='Device 1', asset_tag='', **common_kwargs) + device1.save() + device2 = Device(name='Device 2', asset_tag='', **common_kwargs) + device2.save() + + device1.refresh_from_db() + device2.refresh_from_db() + self.assertIsNone(device1.asset_tag) + self.assertIsNone(device2.asset_tag) + def test_device_label(self): device1 = Device( site=Site.objects.first(), diff --git a/netbox/dcim/tests/test_views.py b/netbox/dcim/tests/test_views.py index cb0aa6c14..a9e715020 100644 --- a/netbox/dcim/tests/test_views.py +++ b/netbox/dcim/tests/test_views.py @@ -4176,6 +4176,33 @@ class VirtualDeviceContextTestCase(ViewTestCases.PrimaryObjectViewTestCase): 'status': VirtualDeviceContextStatusChoices.STATUS_OFFLINE, } + def test_bulk_edit_device_context_preserves_device(self): + """ + Regression test: Bulk editing VDCs from the Device's VDCs tab (URL contains + ?device=) must not clear the device field on those VDCs. + """ + self.add_permissions('dcim.view_virtualdevicecontext', 'dcim.change_virtualdevicecontext') + + device = VirtualDeviceContext.objects.filter(device__isnull=False).first().device + vdcs = list(VirtualDeviceContext.objects.filter(device=device)[:3]) + pk_list = [vdc.pk for vdc in vdcs] + + data = { + 'pk': pk_list, + '_apply': True, + # Only change status — device is intentionally omitted + 'status': VirtualDeviceContextStatusChoices.STATUS_PLANNED, + } + + # Simulate navigation from Device -> VDCs tab by passing ?device= as GET param + url = reverse('dcim:virtualdevicecontext_bulk_edit') + f'?device={device.pk}' + response = self.client.post(url, data) + self.assertHttpStatus(response, 302) + + for vdc in VirtualDeviceContext.objects.filter(pk__in=pk_list): + self.assertEqual(vdc.device, device, msg=f"Device was unexpectedly cleared on VDC '{vdc.name}'") + self.assertEqual(vdc.status, VirtualDeviceContextStatusChoices.STATUS_PLANNED) + class MACAddressTestCase(ViewTestCases.PrimaryObjectViewTestCase): model = MACAddress diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 1e9986fb9..41f5a1832 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -1653,8 +1653,11 @@ class VLANView(generic.ObjectView): actions.AddObject( 'ipam.prefix', url_params={ - 'tenant': lambda ctx: ctx['object'].tenant.pk if ctx['object'].tenant else None, - 'site': lambda ctx: ctx['object'].site.pk if ctx['object'].site else None, + 'tenant': lambda ctx: ctx['object'].tenant_id, + 'scope_type': lambda ctx: ( + ContentType.objects.get_for_model(Site).pk if ctx['object'].site_id else None + ), + 'scope': lambda ctx: ctx['object'].site_id, 'vlan': lambda ctx: ctx['object'].pk, }, label=_('Add a Prefix'), diff --git a/netbox/netbox/models/__init__.py b/netbox/netbox/models/__init__.py index 2839ea802..a01472bb6 100644 --- a/netbox/netbox/models/__init__.py +++ b/netbox/netbox/models/__init__.py @@ -58,6 +58,7 @@ class BaseModel(models.Model): This class provides some important overrides to Django's default functionality, such as - Overriding the default manager to use RestrictedQuerySet - Extending `clean()` to validate GenericForeignKey fields + - Extending `clean()` and `save()` to coerce empty strings to None on unique nullable CharFields """ objects = RestrictedQuerySet.as_manager() @@ -65,11 +66,26 @@ class BaseModel(models.Model): class Meta: abstract = True + def _coerce_nullable_unique_chars(self): + """ + Coerce empty strings to None on unique nullable CharFields to avoid spurious + uniqueness violations (PostgreSQL treats two empty strings as duplicates). + """ + for field in self._meta.concrete_fields: + if ( + isinstance(field, models.CharField) + and field.null + and field.unique + and getattr(self, field.attname, None) == '' + ): + setattr(self, field.attname, None) + def clean(self): """ Validate the model for GenericForeignKey fields to ensure that the content type and object ID exist. """ super().clean() + self._coerce_nullable_unique_chars() for field in self._meta.get_fields(): if isinstance(field, GenericForeignKey): @@ -97,6 +113,10 @@ class BaseModel(models.Model): # update the GFK field value setattr(self, field.name, obj) + def save(self, *args, **kwargs): + self._coerce_nullable_unique_chars() + super().save(*args, **kwargs) + class ChangeLoggedModel(ChangeLoggingMixin, CustomValidationMixin, EventRulesMixin, BaseModel): """ diff --git a/netbox/netbox/ui/actions.py b/netbox/netbox/ui/actions.py index 4363c722d..8eb4ffbf1 100644 --- a/netbox/netbox/ui/actions.py +++ b/netbox/netbox/ui/actions.py @@ -92,14 +92,18 @@ class LinkAction(PanelAction): """ url = reverse(self.view_name, kwargs=self.view_kwargs) if self.url_params: - # If the param value is callable, call it with the context and save the result. - url_params = { - k: v(context) if callable(v) else v for k, v in self.url_params.items() - } + url_params = {} + for key, value in self.url_params.items(): + # If the param value is callable, call it with the context and save the result. + value = value(context) if callable(value) else value + # Omit parameters whose value resolved to None + if value is not None: + url_params[key] = value # Set the return URL if not already set and an object is available. if 'return_url' not in url_params and 'object' in context: url_params['return_url'] = context['object'].get_absolute_url() - url = f'{url}?{urlencode(url_params)}' + if url_params: + url = f'{url}?{urlencode(url_params)}' return url def get_context(self, context): diff --git a/netbox/virtualization/forms/bulk_edit.py b/netbox/virtualization/forms/bulk_edit.py index 6038629ed..f51e51e60 100644 --- a/netbox/virtualization/forms/bulk_edit.py +++ b/netbox/virtualization/forms/bulk_edit.py @@ -199,6 +199,10 @@ class VirtualMachineBulkEditForm(PrimaryModelBulkEditForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) + # The ?device= GET param is navigation context (filter), not an intent to change the + # device field — drop it from initial so Django's changed_data doesn't treat it as an edit. + self.initial.pop('device', None) + # Set unit labels based on configured RAM_BASE_UNIT / DISK_BASE_UNIT (MB vs MiB) self.fields['memory'].label = _('Memory ({unit})').format(unit=get_capacity_unit_label(settings.RAM_BASE_UNIT)) self.fields['disk'].label = _('Disk ({unit})').format(unit=get_capacity_unit_label(settings.DISK_BASE_UNIT)) diff --git a/netbox/virtualization/tests/test_views.py b/netbox/virtualization/tests/test_views.py index 21105a95d..dda1b35e2 100644 --- a/netbox/virtualization/tests/test_views.py +++ b/netbox/virtualization/tests/test_views.py @@ -462,6 +462,33 @@ class VirtualMachineTestCase(ViewTestCases.PrimaryObjectViewTestCase): url = reverse('virtualization:virtualmachine_interfaces', kwargs={'pk': virtualmachine.pk}) self.assertHttpStatus(self.client.get(url), 200) + def test_bulk_edit_device_context_preserves_device(self): + """ + Regression test for #21990: Bulk editing VMs from the Device's VMs tab (URL contains + ?device=) must not clear the device field on those VMs. + """ + self.add_permissions('virtualization.view_virtualmachine', 'virtualization.change_virtualmachine') + + device = VirtualMachine.objects.filter(device__isnull=False).first().device + vms = list(VirtualMachine.objects.filter(device=device)[:3]) + pk_list = [vm.pk for vm in vms] + + data = { + 'pk': pk_list, + '_apply': True, + # Only change status — device is intentionally omitted + 'status': VirtualMachineStatusChoices.STATUS_STAGED, + } + + # Simulate navigation from Device -> Virtual Machines tab by passing ?device= as GET param + url = reverse('virtualization:virtualmachine_bulk_edit') + f'?device={device.pk}' + response = self.client.post(url, data) + self.assertHttpStatus(response, 302) + + for vm in VirtualMachine.objects.filter(pk__in=pk_list): + self.assertEqual(vm.device, device, msg=f"Device was unexpectedly cleared on VM '{vm.name}'") + self.assertEqual(vm.status, VirtualMachineStatusChoices.STATUS_STAGED) + def test_virtualmachine_renderconfig(self): configtemplate = ConfigTemplate.objects.create( name='Test Config Template', diff --git a/requirements.txt b/requirements.txt index 015da9e58..8a638af25 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,7 +17,7 @@ django-taggit==6.1.0 django-timezone-field==7.2.1 djangorestframework==3.17.1 drf-spectacular==0.29.0 -drf-spectacular-sidecar==2026.4.14 +drf-spectacular-sidecar==2026.5.1 feedparser==6.0.12 gunicorn==25.3.0 Jinja2==3.1.6 @@ -30,15 +30,15 @@ mkdocstrings-python==2.0.3 netaddr==1.3.0 nh3==0.3.5 Pillow==12.2.0 -psycopg[c,pool]==3.3.3 +psycopg[c,pool]==3.3.4 PyYAML==6.0.3 requests==2.33.1 rq==2.8.0 -social-auth-app-django==5.8.0 +social-auth-app-django==5.9.0 social-auth-core==4.8.7 sorl-thumbnail==13.0.0 -strawberry-graphql==0.315.2 -strawberry-graphql-django==0.82.1 +strawberry-graphql==0.315.3 +strawberry-graphql-django==0.84.0 svgwrite==1.4.3 tablib==3.9.0 tzdata==2026.2