Attach documents and external URLs to any NetBox object
Project description
Netbox Documents Plugin
A plugin designed to facilitate the storage of documents against any object within NetBox.
Features
- Attach documents to any NetBox model, including:
- Sites, Locations
- Devices, Device Types, Module Types
- Circuits, Circuit Providers
- Virtual Machines
- Upload documents to your NetBox media/ folder or any Django-supported storage backend (e.g. S3)
- Store links to external URLs to avoid duplicating remote documents
- Supports a wide array of file types: bmp, gif, jpeg, jpg, png, pdf, txt, doc, docx, xls, xlsx, xlsm, tif, tiff, drawio, svg, webp, html, pptx
- Add custom document types via plugin configuration
- Control which document types are available per model
- Documents panel appears on object detail pages with permission-aware action buttons
Compatibility
| NetBox Version | Plugin Version |
|---|---|
| 4.3+ | 0.8.2 |
| 4.3+ | 0.7.4 |
| 4.2+ | 0.7.2 |
| 4.0 - 4.1 | 0.7.0 |
| 3.6+ | 0.6.4 |
| 3.5.x | 0.6.0 |
| 3.3.x - 3.4.x | 0.5.1 |
Upgrading to 0.8.2
Breaking Changes: Version 0.8.2 is a major refactoring. Please read carefully before upgrading.
What changed
The plugin previously used 8 separate database models (SiteDocument, DeviceDocument, CircuitDocument, etc.). Version 0.8.2 replaces these with a single unified Document model using Django's ContentType framework (GenericForeignKey). This enables documents to be attached to any NetBox model.
Breaking changes
- API endpoints changed: The 8 separate API endpoints (
/api/plugins/netbox-documents/site-documents/,/api/plugins/netbox-documents/device-documents/, etc.) have been replaced with a single endpoint:/api/plugins/netbox-documents/documents/. API clients must be updated. - URL paths changed: All web UI paths have changed from model-specific paths (e.g.
/plugins/documents/site-document/) to a single path:/plugins/documents/documents/. Any bookmarks or external links will need updating. - Permissions renamed: Model-specific permissions (e.g.
view_sitedocument,add_devicedocument) are replaced with unified permissions:view_document,add_document,change_document,delete_document. Permission assignments will need updating. - FIELD_CHOICES key changed: The per-model
DocTypeChoiceskeys (e.g.DocTypeChoices.site,DocTypeChoices.device) are replaced with a single key:DocTypeChoices.document. See the configuration section below for the new approach to custom document types. - Configuration simplified: The 16 per-model settings (
enable_site_documents,site_documents_location, etc.) have been removed. They are replaced by a singledocuments_locationsetting. The documents panel now always appears on supported model detail pages. Custom document types are now configured viacustom_doc_typesinstead ofFIELD_CHOICES.
Upgrade procedure
- Back up your database before upgrading.
- Install the new version:
pip install netbox-documents==0.8.2 - Run migrations:
python manage.py migrate - Update any API integrations to use the new
/api/plugins/netbox-documents/documents/endpoint - Update any permission assignments to use the new
documentpermission names - Update your
PLUGINS_CONFIGif you usedFIELD_CHOICESfor custom document types (see below) - Restart NetBox:
sudo systemctl restart netbox - Re-index search:
python manage.py reindex netbox_documents
Installation
A working installation of NetBox 4.3+ is required.
Package Installation from PyPI
Activate your virtual env and install via pip:
$ source /opt/netbox/venv/bin/activate
(venv) $ pip install netbox-documents
To ensure the plugin is automatically re-installed during future upgrades, add the package to your local_requirements.txt:
# echo netbox-documents >> local_requirements.txt
Enable the Plugin
In the NetBox configuration.py file add or update the PLUGINS parameter:
PLUGINS = [
'netbox_documents',
]
Apply Database Migrations
(venv) $ python manage.py migrate
Restart NetBox
sudo systemctl restart netbox
Configuration
Add or update a PLUGINS_CONFIG parameter in configuration.py to configure plugin settings. All settings are optional -- the defaults are shown below:
PLUGINS_CONFIG = {
'netbox_documents': {
# Enable the global navigation menu
'enable_navigation_menu': True,
# Location of the documents panel on object detail pages (left/right)
'documents_location': 'left',
# Custom document types (see below)
'custom_doc_types': [],
# Per-model document type filtering (see below)
'allowed_doc_types': {},
}
}
Custom Document Types
Add your own document types by defining them in custom_doc_types. Each entry is a tuple of (value, label, color):
PLUGINS_CONFIG = {
'netbox_documents': {
'custom_doc_types': [
('sla', 'SLA Document', 'teal'),
('warranty', 'Warranty Document', 'cyan'),
('asbuilt', 'As-Built Drawing', 'lime'),
('audit', 'Audit Report', 'black'),
],
}
}
Custom types appear alongside the built-in types in all dropdowns and filters. Available colors: green, purple, orange, indigo, yellow, pink, blue, red, gray, teal, cyan, white, black.
The built-in document types are: diagram, floorplan, purchaseorder, quote, wirelessmodel, manual, supportcontract, circuitcontract, contract, msa, kmz, other.
Per-Model Document Type Filtering
Control which document types appear in the dropdown for each model using allowed_doc_types. Keys are model labels in app_label.model format. The special key __all__ sets the default for any model not explicitly listed:
PLUGINS_CONFIG = {
'netbox_documents': {
'allowed_doc_types': {
'dcim.site': ['diagram', 'floorplan', 'purchaseorder', 'quote', 'wirelessmodel', 'other'],
'dcim.location': ['diagram', 'floorplan', 'purchaseorder', 'quote', 'wirelessmodel', 'other'],
'dcim.device': ['diagram', 'manual', 'purchaseorder', 'quote', 'supportcontract', 'other'],
'dcim.devicetype': ['diagram', 'manual', 'purchaseorder', 'quote', 'supportcontract', 'other'],
'dcim.moduletype': ['diagram', 'manual', 'purchaseorder', 'quote', 'supportcontract', 'other'],
'circuits.circuit': ['circuitcontract', 'diagram', 'purchaseorder', 'quote', 'kmz', 'other'],
'circuits.provider': ['contract', 'msa', 'purchaseorder', 'quote', 'other'],
'virtualization.virtualmachine': ['diagram', 'manual', 'purchaseorder', 'quote', 'supportcontract', 'other'],
},
}
}
If allowed_doc_types is empty ({}), all document types are shown for all models (the default).
Use the __all__ key to set a default for all models, then override specific models as needed:
PLUGINS_CONFIG = {
'netbox_documents': {
'allowed_doc_types': {
# Default: only show these types for all models
'__all__': ['diagram', 'purchaseorder', 'quote', 'other'],
# Override: Sites also get floorplan and wirelessmodel
'dcim.site': ['diagram', 'floorplan', 'purchaseorder', 'quote', 'wirelessmodel', 'other'],
# Override: Circuits get circuit-specific types
'circuits.circuit': ['circuitcontract', 'diagram', 'purchaseorder', 'quote', 'kmz', 'other'],
},
}
}
Custom types defined in custom_doc_types can also be referenced in allowed_doc_types:
PLUGINS_CONFIG = {
'netbox_documents': {
'custom_doc_types': [
('sla', 'SLA Document', 'teal'),
],
'allowed_doc_types': {
'__all__': ['diagram', 'purchaseorder', 'quote', 'other'],
'circuits.provider': ['contract', 'msa', 'sla', 'other'],
},
}
}
API Usage
All documents are accessed through a single REST API endpoint:
GET /api/plugins/netbox-documents/documents/ # List all documents
POST /api/plugins/netbox-documents/documents/ # Create a document
GET /api/plugins/netbox-documents/documents/{id}/ # Get a document
PUT /api/plugins/netbox-documents/documents/{id}/ # Update a document
DELETE /api/plugins/netbox-documents/documents/{id}/ # Delete a document
Filter by object type and ID:
GET /api/plugins/netbox-documents/documents/?content_type=dcim.site&object_id=1
Create a document attached to a site (ID 1):
POST /api/plugins/netbox-documents/documents/
{
"name": "Network Diagram",
"document_type": "diagram",
"external_url": "https://example.com/diagram.pdf",
"content_type": "dcim.site",
"object_id": 1
}
Screenshots
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file netbox_documents-0.8.2.tar.gz.
File metadata
- Download URL: netbox_documents-0.8.2.tar.gz
- Upload date:
- Size: 27.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1ae3b7da1d406621d6953e569ddf185069262eec18c02c1f60aaa7305a2afd77
|
|
| MD5 |
d7d7aec1ddeeb65e1291f761dffde704
|
|
| BLAKE2b-256 |
109821e34707e272fa513bcdfd6f4c98330e1b50698085068690fb1d2bed3f55
|
Provenance
The following attestation bundles were made for netbox_documents-0.8.2.tar.gz:
Publisher:
publish.yml on jasonyates/netbox-documents
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
netbox_documents-0.8.2.tar.gz -
Subject digest:
1ae3b7da1d406621d6953e569ddf185069262eec18c02c1f60aaa7305a2afd77 - Sigstore transparency entry: 947445660
- Sigstore integration time:
-
Permalink:
jasonyates/netbox-documents@73d5fe0d90ef45c8587d61d86f7b722739e7e644 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/jasonyates
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@73d5fe0d90ef45c8587d61d86f7b722739e7e644 -
Trigger Event:
push
-
Statement type:
File details
Details for the file netbox_documents-0.8.2-py3-none-any.whl.
File metadata
- Download URL: netbox_documents-0.8.2-py3-none-any.whl
- Upload date:
- Size: 37.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fcb3179dfd13a694baff014ca48511e11e73f0e7fc2bcd25a8ea0bb6ce7a8bc2
|
|
| MD5 |
ee599c37715cb593278564a456061086
|
|
| BLAKE2b-256 |
bff4ad577bb3ce1df35369e44c10831148dcf183499d9bfc42ca3897d8785749
|
Provenance
The following attestation bundles were made for netbox_documents-0.8.2-py3-none-any.whl:
Publisher:
publish.yml on jasonyates/netbox-documents
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
netbox_documents-0.8.2-py3-none-any.whl -
Subject digest:
fcb3179dfd13a694baff014ca48511e11e73f0e7fc2bcd25a8ea0bb6ce7a8bc2 - Sigstore transparency entry: 947445665
- Sigstore integration time:
-
Permalink:
jasonyates/netbox-documents@73d5fe0d90ef45c8587d61d86f7b722739e7e644 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/jasonyates
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@73d5fe0d90ef45c8587d61d86f7b722739e7e644 -
Trigger Event:
push
-
Statement type: