git: 97f588b3919b - main - net-mgmt/netbox: Update to 3.4.5

From: Kai Knoblich <kai_at_FreeBSD.org>
Date: Wed, 22 Feb 2023 07:15:09 UTC
The branch main has been updated by kai:

URL: https://cgit.FreeBSD.org/ports/commit/?id=97f588b3919babbc1e237df5f83a8418fa319ae3

commit 97f588b3919babbc1e237df5f83a8418fa319ae3
Author:     Kai Knoblich <kai@FreeBSD.org>
AuthorDate: 2023-02-22 07:04:18 +0000
Commit:     Kai Knoblich <kai@FreeBSD.org>
CommitDate: 2023-02-22 07:04:18 +0000

    net-mgmt/netbox: Update to 3.4.5
    
    Changelog since 3.3.10:
    
    It contains many bugfixes/enhancements and the following new features:
    
    * New Global Search
    * Virtual Device Contexts
    * Saved Filters
    * JSON/YAML Bulk Imports
    * Update Existing Objects via Bulk Import
    * Scheduled Reports & Scripts
    * API for Staged Changes
    
    https://netbox.readthedocs.io/en/stable/release-notes/version-3.4/
    
    MFH:            No (feature release)
---
 net-mgmt/netbox/Makefile                 |  56 +++++++--------
 net-mgmt/netbox/distinfo                 |   6 +-
 net-mgmt/netbox/files/netboxrc.sample.in |   1 +
 net-mgmt/netbox/files/pkg-message.in     |  45 ++++++++++++
 net-mgmt/netbox/pkg-plist                | 113 +++++++++++++++++++++++++------
 5 files changed, 169 insertions(+), 52 deletions(-)

diff --git a/net-mgmt/netbox/Makefile b/net-mgmt/netbox/Makefile
index be06e80d97d4..4054a7730b2b 100644
--- a/net-mgmt/netbox/Makefile
+++ b/net-mgmt/netbox/Makefile
@@ -1,6 +1,6 @@
 PORTNAME=	netbox
 DISTVERSIONPREFIX=	v
-DISTVERSION=	3.3.10
+DISTVERSION=	3.4.5
 CATEGORIES=	net-mgmt python
 
 MAINTAINER=	kai@FreeBSD.org
@@ -18,47 +18,47 @@ LICENSE_FILE=	${WRKSRC}/LICENSE.txt
 # Django packages that are known for regressions in conjunction with NetBox and
 # should therefore only be updated with caution.
 #
-# - devel/py-dj40-django-rq
-# - www/py-dj40-django-filter
-# - www/py-dj40-django-tables2
-# - www/py-dj40-djangorestframework (in conjunction with www/py-dj40-drf-yasg)
+# - devel/py-dj41-django-rq
+# - www/py-dj41-django-filter
+# - www/py-dj41-django-tables2
+# - www/py-dj41-djangorestframework (in conjunction with www/py-dj41-drf-yasg)
 #
-RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}django40>=4.0.8<4.1:www/py-django40@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}dj40-django-cors-headers>=3.13.0<4:www/py-dj40-django-cors-headers@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}dj40-django-debug-toolbar>=3.6.0<4:www/py-dj40-django-debug-toolbar@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}dj40-django-filter>=22.1<23:www/py-dj40-django-filter@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}dj40-django-graphiql-debug-toolbar>=0.2.0<1:www/py-dj40-django-graphiql-debug-toolbar@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}dj40-django-mptt>=0.14.0<0.15:www/py-dj40-django-mptt@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}dj40-django-prometheus>=2.2.0<2.3:www/py-dj40-django-prometheus@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}dj40-django-redis>=5.2.0<6:www/py-dj40-django-redis@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}dj40-django-rich>=1.4.0<2:www/py-dj40-django-rich@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}dj40-django-rq>=2.5.1<2.7:devel/py-dj40-django-rq@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}dj40-django-tables2>=2.4.1<2.5:www/py-dj40-django-tables2@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}dj40-django-taggit>=3.1.0<4:www/py-dj40-django-taggit@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}dj40-django-timezone-field>=5.0<6:www/py-dj40-django-timezone-field@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}dj40-djangorestframework>=3.14.0<3.15.0:www/py-dj40-djangorestframework@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}dj40-drf-yasg>=1.21.4<1.22:www/py-dj40-drf-yasg@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}dj40-graphene-django>=2.15.0<3:devel/py-dj40-graphene-django@${PY_FLAVOR} \
+RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}django41>=4.1.7<4.2:www/py-django41@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}dj41-django-cors-headers>=3.13.0<4:www/py-dj41-django-cors-headers@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}dj41-django-debug-toolbar>=3.7.0<4:www/py-dj41-django-debug-toolbar@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}dj41-django-filter>=22.1<23:www/py-dj41-django-filter@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}dj41-django-graphiql-debug-toolbar>=0.2.0<1:www/py-dj41-django-graphiql-debug-toolbar@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}dj41-django-mptt>=0.14.0<0.15:www/py-dj41-django-mptt@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}dj41-django-prometheus>=2.2.0<2.3:www/py-dj41-django-prometheus@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}dj41-django-redis>=5.2.0<6:www/py-dj41-django-redis@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}dj41-django-rich>=1.4.0<2:www/py-dj41-django-rich@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}dj41-django-rq>=2.7.0<2.8:devel/py-dj41-django-rq@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}dj41-django-tables2>=2.5.2<2.6:www/py-dj41-django-tables2@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}dj41-django-taggit>=3.1.0<4:www/py-dj41-django-taggit@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}dj41-django-timezone-field>=5.0<6:www/py-dj41-django-timezone-field@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}dj41-djangorestframework>=3.14.0<3.15.0:www/py-dj41-djangorestframework@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}dj41-drf-yasg>=1.21.5<1.22:www/py-dj41-drf-yasg@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}dj41-graphene-django>=3.0.0<4:devel/py-dj41-graphene-django@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}django-pglocks>=1.0.4<1.1:www/py-django-pglocks@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}bleach>=5.0.1<6:www/py-bleach@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}Jinja2>=3.0.1<4:devel/py-Jinja2@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}Jinja2>=3.1.2<4:devel/py-Jinja2@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}markdown>=3.3.7<3.4:textproc/py-markdown@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}markdown-include>=0.7.0<1:textproc/py-markdown-include@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}mkdocs-material>=8.2.11<9:textproc/py-mkdocs-material@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}mkdocs-material>=8.5.11<10:textproc/py-mkdocs-material@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}mkdocstrings>=0.17.0<1:textproc/py-mkdocstrings@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}netaddr>=0.8.0<1:net/py-netaddr@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}pillow>=9.2.0:graphics/py-pillow@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}psycopg2>=2.9.3<3:databases/py-psycopg2@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}pillow>=9.4.0:graphics/py-pillow@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}psycopg2>=2.9.5<3:databases/py-psycopg2@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}sentry-sdk>=1.5.12<2:devel/py-sentry-sdk@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}social-auth-app-django>=5.0.0<6:www/py-social-auth-app-django@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}social-auth-core>=4.3.0<5:security/py-social-auth-core@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}svgwrite>=1.4.3<2:graphics/py-svgwrite@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}tablib>=3.2.1<4:textproc/py-tablib@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}tablib>=3.3.0<4:textproc/py-tablib@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}tzdata>=2022.7:devel/py-tzdata@${PY_FLAVOR} \
-		${PYTHON_PKGNAMEPREFIX}yaml>=5.4.1<7:devel/py-yaml@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}yaml>=6.0<7:devel/py-yaml@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}gunicorn>=20.1.0<21:www/py-gunicorn@${PY_FLAVOR}
 
-USES=		cpe pgsql:10+ python:3.8+
+USES=		cpe pgsql:11+ python:3.8+
 CPE_VENDOR=	netbox_project
 USE_GITHUB=	yes
 GH_ACCOUNT=	netbox-community
diff --git a/net-mgmt/netbox/distinfo b/net-mgmt/netbox/distinfo
index 08eb0cd181f8..bd8b15e26827 100644
--- a/net-mgmt/netbox/distinfo
+++ b/net-mgmt/netbox/distinfo
@@ -1,3 +1,3 @@
-TIMESTAMP = 1670965894
-SHA256 (netbox-community-netbox-v3.3.10_GH0.tar.gz) = 18d59234db6ffbe08dc9b8eaea8cc8e022fc08f92e0714a01223ae8d7333b62b
-SIZE (netbox-community-netbox-v3.3.10_GH0.tar.gz) = 7316933
+TIMESTAMP = 1676994695
+SHA256 (netbox-community-netbox-v3.4.5_GH0.tar.gz) = 505e4551f6420a70265e927a2ad7b2fabbea5d917e396abaf410713d80fd2736
+SIZE (netbox-community-netbox-v3.4.5_GH0.tar.gz) = 7371574
diff --git a/net-mgmt/netbox/files/netboxrc.sample.in b/net-mgmt/netbox/files/netboxrc.sample.in
index 7510729b0701..f74676e1a4d4 100644
--- a/net-mgmt/netbox/files/netboxrc.sample.in
+++ b/net-mgmt/netbox/files/netboxrc.sample.in
@@ -99,6 +99,7 @@ netbox_upgrade()
 		%%LOCALBASE%%/bin/mkdocs build
 		%%PYTHON_CMD%% manage.py collectstatic --no-input
 		%%PYTHON_CMD%% manage.py remove_stale_contenttypes --no-input
+		%%PYTHON_CMD%% manage.py reindex --lazy
 		%%PYTHON_CMD%% manage.py clearsessions
 		%%PYTHON_CMD%% manage.py clearcache
 		echo "Please restart NetBox and the WSGI environment."
diff --git a/net-mgmt/netbox/files/pkg-message.in b/net-mgmt/netbox/files/pkg-message.in
index 490cbeb03501..dca61f4b8249 100644
--- a/net-mgmt/netbox/files/pkg-message.in
+++ b/net-mgmt/netbox/files/pkg-message.in
@@ -27,6 +27,7 @@ The following steps are required to finish the upgrade:
 # mkdocs build
 # python%%PYTHON_VER%% manage.py collectstatic --no-input
 # python%%PYTHON_VER%% manage.py remove_stale_contenttypes --no-input
+# python%%PYTHON_VER%% manage.py reindex --lazy
 # python%%PYTHON_VER%% manage.py clearsessions
 # python%%PYTHON_VER%% manage.py clearcache
 
@@ -280,4 +281,48 @@ following items before running the database migrations:
   documentation, etc.).
 EOD
 }
+{ type: upgrade
+  maximum_version: 3.4.5
+  message: <<EOD
+1. Please make sure that the PostgreSQL server for the NetBox instance is
+   running version 11 or higher.  This is because PostgreSQL 10 is End-of-Life
+   since November 2022 and Django 4.1 requires PostgreSQL 11 as a minimum.
+
+2. The NetBox 3.4 release contains some breaking changes, so the following
+   items should be checked as well:
+
+   * Device and virtual machine names are no longer case-sensitive.  Attempting
+     to create e.g. "device1" and "DEVICE1" within the same site will raise a
+     validation error.
+
+   * The "asn", "noc_contact", "admin_contact", and "portal_url" fields have
+     been removed from the provider model.  Please replicate any data remaining
+     in these fields to the ASN and contact models introduced in NetBox v3.1
+     prior to upgrading.
+
+   * The "content_type" fields on the CustomLink and ExportTemplate models have
+     been renamed to "content_types" and now support the assignment of multiple
+     content types per object.
+
+   * Within the Python API, the "cf" property on an object with custom fields
+     now returns deserialized values.  For example, a custom field referencing
+     an object will return the object instance rather than its numeric ID.
+
+     To access the raw serialized values, reference the object's
+     "custom_field_data" attribute instead.
+
+   * The "NetBoxModelCSVForm" class has been renamed to
+     "NetBoxModelImportForm".  Backward compatability with the previous name
+     has been retained for this release, but will be dropped in NetBox v3.5.
+
+
+3. Please note that the general update instructions got another command that
+   needs to be issued after each update:
+
+# python%%PYTHON_VER%% manage.py reindex --lazy
+
+   The netbox sample rc script has also been adapted accordingly for this
+   purpose.
+EOD
+}
 ]
diff --git a/net-mgmt/netbox/pkg-plist b/net-mgmt/netbox/pkg-plist
index b6cdd06e9fc5..dd0271d1eed3 100644
--- a/net-mgmt/netbox/pkg-plist
+++ b/net-mgmt/netbox/pkg-plist
@@ -17,7 +17,7 @@
 %%DATADIR%%/circuits/forms/bulk_edit.py
 %%DATADIR%%/circuits/forms/bulk_import.py
 %%DATADIR%%/circuits/forms/filtersets.py
-%%DATADIR%%/circuits/forms/models.py
+%%DATADIR%%/circuits/forms/model_forms.py
 %%DATADIR%%/circuits/graphql/__init__.py
 %%DATADIR%%/circuits/graphql/schema.py
 %%DATADIR%%/circuits/graphql/types.py
@@ -32,10 +32,14 @@
 %%DATADIR%%/circuits/migrations/0036_circuit_termination_date_tags_custom_fields.py
 %%DATADIR%%/circuits/migrations/0037_new_cabling_models.py
 %%DATADIR%%/circuits/migrations/0038_cabling_cleanup.py
+%%DATADIR%%/circuits/migrations/0039_unique_constraints.py
+%%DATADIR%%/circuits/migrations/0040_provider_remove_deprecated_fields.py
+%%DATADIR%%/circuits/migrations/0041_standardize_description_comments.py
 %%DATADIR%%/circuits/migrations/__init__.py
 %%DATADIR%%/circuits/models/__init__.py
 %%DATADIR%%/circuits/models/circuits.py
 %%DATADIR%%/circuits/models/providers.py
+%%DATADIR%%/circuits/search.py
 %%DATADIR%%/circuits/signals.py
 %%DATADIR%%/circuits/tables/__init__.py
 %%DATADIR%%/circuits/tables/circuits.py
@@ -67,10 +71,11 @@
 %%DATADIR%%/dcim/forms/connections.py
 %%DATADIR%%/dcim/forms/filtersets.py
 %%DATADIR%%/dcim/forms/formsets.py
-%%DATADIR%%/dcim/forms/models.py
+%%DATADIR%%/dcim/forms/model_forms.py
 %%DATADIR%%/dcim/forms/object_create.py
 %%DATADIR%%/dcim/forms/object_import.py
 %%DATADIR%%/dcim/graphql/__init__.py
+%%DATADIR%%/dcim/graphql/gfk_mixins.py
 %%DATADIR%%/dcim/graphql/mixins.py
 %%DATADIR%%/dcim/graphql/schema.py
 %%DATADIR%%/dcim/graphql/types.py
@@ -112,15 +117,23 @@
 %%DATADIR%%/dcim/migrations/0159_populate_cable_paths.py
 %%DATADIR%%/dcim/migrations/0160_populate_cable_ends.py
 %%DATADIR%%/dcim/migrations/0161_cabling_cleanup.py
+%%DATADIR%%/dcim/migrations/0162_unique_constraints.py
+%%DATADIR%%/dcim/migrations/0163_weight_fields.py
+%%DATADIR%%/dcim/migrations/0164_rack_mounting_depth.py
+%%DATADIR%%/dcim/migrations/0165_standardize_description_comments.py
+%%DATADIR%%/dcim/migrations/0166_virtualdevicecontext.py
+%%DATADIR%%/dcim/migrations/0167_module_status.py
 %%DATADIR%%/dcim/migrations/__init__.py
 %%DATADIR%%/dcim/models/__init__.py
 %%DATADIR%%/dcim/models/cables.py
 %%DATADIR%%/dcim/models/device_component_templates.py
 %%DATADIR%%/dcim/models/device_components.py
 %%DATADIR%%/dcim/models/devices.py
+%%DATADIR%%/dcim/models/mixins.py
 %%DATADIR%%/dcim/models/power.py
 %%DATADIR%%/dcim/models/racks.py
 %%DATADIR%%/dcim/models/sites.py
+%%DATADIR%%/dcim/search.py
 %%DATADIR%%/dcim/signals.py
 %%DATADIR%%/dcim/svg/__init__.py
 %%DATADIR%%/dcim/svg/cables.py
@@ -182,6 +195,7 @@
 %%DATADIR%%/docs/development/index.md
 %%DATADIR%%/docs/development/models.md
 %%DATADIR%%/docs/development/release-checklist.md
+%%DATADIR%%/docs/development/search.md
 %%DATADIR%%/docs/development/signals.md
 %%DATADIR%%/docs/development/style-guide.md
 %%DATADIR%%/docs/development/user-preferences.md
@@ -200,6 +214,7 @@
 %%DATADIR%%/docs/features/journaling.md
 %%DATADIR%%/docs/features/l2vpn-overlay.md
 %%DATADIR%%/docs/features/power-tracking.md
+%%DATADIR%%/docs/features/search.md
 %%DATADIR%%/docs/features/tenancy.md
 %%DATADIR%%/docs/features/virtualization.md
 %%DATADIR%%/docs/features/vlan-management.md
@@ -293,12 +308,16 @@
 %%DATADIR%%/docs/models/dcim/site.md
 %%DATADIR%%/docs/models/dcim/sitegroup.md
 %%DATADIR%%/docs/models/dcim/virtualchassis.md
+%%DATADIR%%/docs/models/dcim/virtualdevicecontext.md
+%%DATADIR%%/docs/models/extras/branch.md
 %%DATADIR%%/docs/models/extras/configcontext.md
 %%DATADIR%%/docs/models/extras/customfield.md
 %%DATADIR%%/docs/models/extras/customlink.md
 %%DATADIR%%/docs/models/extras/exporttemplate.md
 %%DATADIR%%/docs/models/extras/imageattachment.md
 %%DATADIR%%/docs/models/extras/journalentry.md
+%%DATADIR%%/docs/models/extras/savedfilter.md
+%%DATADIR%%/docs/models/extras/stagedchange.md
 %%DATADIR%%/docs/models/extras/tag.md
 %%DATADIR%%/docs/models/extras/webhook.md
 %%DATADIR%%/docs/models/ipam/aggregate.md
@@ -342,6 +361,8 @@
 %%DATADIR%%/docs/plugins/development/models.md
 %%DATADIR%%/docs/plugins/development/navigation.md
 %%DATADIR%%/docs/plugins/development/rest-api.md
+%%DATADIR%%/docs/plugins/development/search.md
+%%DATADIR%%/docs/plugins/development/staged-changes.md
 %%DATADIR%%/docs/plugins/development/tables.md
 %%DATADIR%%/docs/plugins/development/templates.md
 %%DATADIR%%/docs/plugins/development/views.md
@@ -366,6 +387,7 @@
 %%DATADIR%%/docs/release-notes/version-3.1.md
 %%DATADIR%%/docs/release-notes/version-3.2.md
 %%DATADIR%%/docs/release-notes/version-3.3.md
+%%DATADIR%%/docs/release-notes/version-3.4.md
 %%DATADIR%%/extras/__init__.py
 %%DATADIR%%/extras/admin.py
 %%DATADIR%%/extras/api/__init__.py
@@ -379,15 +401,17 @@
 %%DATADIR%%/extras/conditions.py
 %%DATADIR%%/extras/constants.py
 %%DATADIR%%/extras/context_managers.py
+%%DATADIR%%/extras/fields.py
 %%DATADIR%%/extras/filters.py
 %%DATADIR%%/extras/filtersets.py
 %%DATADIR%%/extras/forms/__init__.py
 %%DATADIR%%/extras/forms/bulk_edit.py
 %%DATADIR%%/extras/forms/bulk_import.py
 %%DATADIR%%/extras/forms/config.py
-%%DATADIR%%/extras/forms/customfields.py
 %%DATADIR%%/extras/forms/filtersets.py
-%%DATADIR%%/extras/forms/models.py
+%%DATADIR%%/extras/forms/mixins.py
+%%DATADIR%%/extras/forms/model_forms.py
+%%DATADIR%%/extras/forms/reports.py
 %%DATADIR%%/extras/forms/scripts.py
 %%DATADIR%%/extras/graphql/__init__.py
 %%DATADIR%%/extras/graphql/mixins.py
@@ -399,6 +423,7 @@
 %%DATADIR%%/extras/management/commands/clearcache.py
 %%DATADIR%%/extras/management/commands/housekeeping.py
 %%DATADIR%%/extras/management/commands/nbshell.py
+%%DATADIR%%/extras/management/commands/reindex.py
 %%DATADIR%%/extras/management/commands/renaturalize.py
 %%DATADIR%%/extras/management/commands/rqworker.py
 %%DATADIR%%/extras/management/commands/runreport.py
@@ -424,21 +449,32 @@
 %%DATADIR%%/extras/migrations/0075_configcontext_locations.py
 %%DATADIR%%/extras/migrations/0076_tag_slug_unicode.py
 %%DATADIR%%/extras/migrations/0077_customlink_extend_text_and_url.py
+%%DATADIR%%/extras/migrations/0078_unique_constraints.py
+%%DATADIR%%/extras/migrations/0079_scheduled_jobs.py
+%%DATADIR%%/extras/migrations/0080_customlink_content_types.py
+%%DATADIR%%/extras/migrations/0081_exporttemplate_content_types.py
+%%DATADIR%%/extras/migrations/0082_savedfilter.py
+%%DATADIR%%/extras/migrations/0083_search.py
+%%DATADIR%%/extras/migrations/0084_staging.py
 %%DATADIR%%/extras/migrations/__init__.py
 %%DATADIR%%/extras/models/__init__.py
 %%DATADIR%%/extras/models/change_logging.py
 %%DATADIR%%/extras/models/configcontexts.py
 %%DATADIR%%/extras/models/customfields.py
 %%DATADIR%%/extras/models/models.py
+%%DATADIR%%/extras/models/search.py
+%%DATADIR%%/extras/models/staging.py
 %%DATADIR%%/extras/models/tags.py
 %%DATADIR%%/extras/plugins/__init__.py
+%%DATADIR%%/extras/plugins/navigation.py
+%%DATADIR%%/extras/plugins/registration.py
+%%DATADIR%%/extras/plugins/templates.py
 %%DATADIR%%/extras/plugins/urls.py
-%%DATADIR%%/extras/plugins/utils.py
 %%DATADIR%%/extras/plugins/views.py
 %%DATADIR%%/extras/querysets.py
-%%DATADIR%%/extras/registry.py
 %%DATADIR%%/extras/reports.py
 %%DATADIR%%/extras/scripts.py
+%%DATADIR%%/extras/search.py
 %%DATADIR%%/extras/signals.py
 %%DATADIR%%/extras/tables/__init__.py
 %%DATADIR%%/extras/tables/tables.py
@@ -460,6 +496,7 @@
 %%DATADIR%%/extras/tests/dummy_plugin/models.py
 %%DATADIR%%/extras/tests/dummy_plugin/navigation.py
 %%DATADIR%%/extras/tests/dummy_plugin/preferences.py
+%%DATADIR%%/extras/tests/dummy_plugin/search.py
 %%DATADIR%%/extras/tests/dummy_plugin/template_content.py
 %%DATADIR%%/extras/tests/dummy_plugin/urls.py
 %%DATADIR%%/extras/tests/dummy_plugin/views.py
@@ -472,7 +509,6 @@
 %%DATADIR%%/extras/tests/test_forms.py
 %%DATADIR%%/extras/tests/test_models.py
 %%DATADIR%%/extras/tests/test_plugins.py
-%%DATADIR%%/extras/tests/test_registry.py
 %%DATADIR%%/extras/tests/test_scripts.py
 %%DATADIR%%/extras/tests/test_tags.py
 %%DATADIR%%/extras/tests/test_views.py
@@ -501,8 +537,9 @@
 %%DATADIR%%/ipam/forms/bulk_edit.py
 %%DATADIR%%/ipam/forms/bulk_import.py
 %%DATADIR%%/ipam/forms/filtersets.py
-%%DATADIR%%/ipam/forms/models.py
+%%DATADIR%%/ipam/forms/model_forms.py
 %%DATADIR%%/ipam/graphql/__init__.py
+%%DATADIR%%/ipam/graphql/gfk_mixins.py
 %%DATADIR%%/ipam/graphql/mixins.py
 %%DATADIR%%/ipam/graphql/schema.py
 %%DATADIR%%/ipam/graphql/types.py
@@ -527,6 +564,10 @@
 %%DATADIR%%/ipam/migrations/0058_ipaddress_nat_inside_nonunique.py
 %%DATADIR%%/ipam/migrations/0059_l2vpn.py
 %%DATADIR%%/ipam/migrations/0060_alter_l2vpn_slug.py
+%%DATADIR%%/ipam/migrations/0061_fhrpgroup_name.py
+%%DATADIR%%/ipam/migrations/0062_unique_constraints.py
+%%DATADIR%%/ipam/migrations/0063_standardize_description_comments.py
+%%DATADIR%%/ipam/migrations/0064_clear_search_cache.py
 %%DATADIR%%/ipam/migrations/__init__.py
 %%DATADIR%%/ipam/models/__init__.py
 %%DATADIR%%/ipam/models/fhrp.py
@@ -536,6 +577,7 @@
 %%DATADIR%%/ipam/models/vlans.py
 %%DATADIR%%/ipam/models/vrfs.py
 %%DATADIR%%/ipam/querysets.py
+%%DATADIR%%/ipam/search.py
 %%DATADIR%%/ipam/signals.py
 %%DATADIR%%/ipam/tables/__init__.py
 %%DATADIR%%/ipam/tables/fhrp.py
@@ -598,11 +640,15 @@
 %%DATADIR%%/netbox/middleware.py
 %%DATADIR%%/netbox/models/__init__.py
 %%DATADIR%%/netbox/models/features.py
-%%DATADIR%%/netbox/navigation_menu.py
+%%DATADIR%%/netbox/navigation/__init__.py
+%%DATADIR%%/netbox/navigation/menu.py
 %%DATADIR%%/netbox/preferences.py
-%%DATADIR%%/netbox/search.py
+%%DATADIR%%/netbox/registry.py
+%%DATADIR%%/netbox/search/__init__.py
+%%DATADIR%%/netbox/search/backends.py
 %%DATADIR%%/netbox/settings.py
 %%DATADIR%%/netbox/signals.py
+%%DATADIR%%/netbox/staging.py
 %%DATADIR%%/netbox/tables/__init__.py
 %%DATADIR%%/netbox/tables/columns.py
 %%DATADIR%%/netbox/tables/tables.py
@@ -611,10 +657,15 @@
 %%DATADIR%%/netbox/tests/test_authentication.py
 %%DATADIR%%/netbox/tests/test_config.py
 %%DATADIR%%/netbox/tests/test_graphql.py
+%%DATADIR%%/netbox/tests/test_import.py
+%%DATADIR%%/netbox/tests/test_registry.py
+%%DATADIR%%/netbox/tests/test_search.py
+%%DATADIR%%/netbox/tests/test_staging.py
 %%DATADIR%%/netbox/tests/test_tables.py
 %%DATADIR%%/netbox/tests/test_views.py
 %%DATADIR%%/netbox/urls.py
 %%DATADIR%%/netbox/views/__init__.py
+%%DATADIR%%/netbox/views/errors.py
 %%DATADIR%%/netbox/views/generic/__init__.py
 %%DATADIR%%/netbox/views/generic/base.py
 %%DATADIR%%/netbox/views/generic/bulk_views.py
@@ -622,6 +673,7 @@
 %%DATADIR%%/netbox/views/generic/mixins.py
 %%DATADIR%%/netbox/views/generic/object_views.py
 %%DATADIR%%/netbox/views/generic/utils.py
+%%DATADIR%%/netbox/views/misc.py
 %%DATADIR%%/netbox/wsgi.py
 %%DATADIR%%/project-static/.eslintignore
 %%DATADIR%%/project-static/.eslintrc
@@ -780,14 +832,14 @@
 %%DATADIR%%/templates/dcim/device/rearports.html
 %%DATADIR%%/templates/dcim/device/status.html
 %%DATADIR%%/templates/dcim/device_edit.html
-%%DATADIR%%/templates/dcim/device_import.html
-%%DATADIR%%/templates/dcim/device_import_child.html
 %%DATADIR%%/templates/dcim/device_list.html
 %%DATADIR%%/templates/dcim/devicebay.html
 %%DATADIR%%/templates/dcim/devicebay_delete.html
 %%DATADIR%%/templates/dcim/devicebay_depopulate.html
 %%DATADIR%%/templates/dcim/devicebay_populate.html
 %%DATADIR%%/templates/dcim/devicerole.html
+%%DATADIR%%/templates/dcim/devicerole/devices.html
+%%DATADIR%%/templates/dcim/devicerole/virtual_machines.html
 %%DATADIR%%/templates/dcim/devicetype.html
 %%DATADIR%%/templates/dcim/devicetype/base.html
 %%DATADIR%%/templates/dcim/devicetype/component_templates.html
@@ -795,7 +847,6 @@
 %%DATADIR%%/templates/dcim/inc/cable_termination.html
 %%DATADIR%%/templates/dcim/inc/cable_toggle_buttons.html
 %%DATADIR%%/templates/dcim/inc/connection_endpoints.html
-%%DATADIR%%/templates/dcim/inc/device_import_header.html
 %%DATADIR%%/templates/dcim/inc/endpoint_connection.html
 %%DATADIR%%/templates/dcim/inc/interface_vlans_table.html
 %%DATADIR%%/templates/dcim/inc/nonracked_devices.html
@@ -807,6 +858,7 @@
 %%DATADIR%%/templates/dcim/inventoryitem.html
 %%DATADIR%%/templates/dcim/inventoryitem_bulk_delete.html
 %%DATADIR%%/templates/dcim/inventoryitem_delete.html
+%%DATADIR%%/templates/dcim/inventoryitem_edit.html
 %%DATADIR%%/templates/dcim/inventoryitemrole.html
 %%DATADIR%%/templates/dcim/location.html
 %%DATADIR%%/templates/dcim/manufacturer.html
@@ -825,6 +877,7 @@
 %%DATADIR%%/templates/dcim/rack.html
 %%DATADIR%%/templates/dcim/rack_edit.html
 %%DATADIR%%/templates/dcim/rack_elevation_list.html
+%%DATADIR%%/templates/dcim/rack_list.html
 %%DATADIR%%/templates/dcim/rackreservation.html
 %%DATADIR%%/templates/dcim/rackrole.html
 %%DATADIR%%/templates/dcim/rearport.html
@@ -843,6 +896,7 @@
 %%DATADIR%%/templates/dcim/virtualchassis_add_member.html
 %%DATADIR%%/templates/dcim/virtualchassis_edit.html
 %%DATADIR%%/templates/dcim/virtualchassis_remove_member.html
+%%DATADIR%%/templates/dcim/virtualdevicecontext.html
 %%DATADIR%%/templates/exceptions/import_error.html
 %%DATADIR%%/templates/exceptions/permission_error.html
 %%DATADIR%%/templates/exceptions/programming_error.html
@@ -867,6 +921,7 @@
 %%DATADIR%%/templates/extras/report.html
 %%DATADIR%%/templates/extras/report_list.html
 %%DATADIR%%/templates/extras/report_result.html
+%%DATADIR%%/templates/extras/savedfilter.html
 %%DATADIR%%/templates/extras/script.html
 %%DATADIR%%/templates/extras/script_list.html
 %%DATADIR%%/templates/extras/script_result.html
@@ -883,7 +938,6 @@
 %%DATADIR%%/templates/generic/object.html
 %%DATADIR%%/templates/generic/object_delete.html
 %%DATADIR%%/templates/generic/object_edit.html
-%%DATADIR%%/templates/generic/object_import.html
 %%DATADIR%%/templates/generic/object_list.html
 %%DATADIR%%/templates/graphiql.html
 %%DATADIR%%/templates/home.html
@@ -901,8 +955,10 @@
 %%DATADIR%%/templates/inc/panels/contacts.html
 %%DATADIR%%/templates/inc/panels/custom_fields.html
 %%DATADIR%%/templates/inc/panels/image_attachments.html
+%%DATADIR%%/templates/inc/panels/services.html
 %%DATADIR%%/templates/inc/panels/tags.html
 %%DATADIR%%/templates/inc/profile_button.html
+%%DATADIR%%/templates/inc/searchbar.html
 %%DATADIR%%/templates/inc/table.html
 %%DATADIR%%/templates/inc/table_controls_htmx.html
 %%DATADIR%%/templates/inc/table_htmx.html
@@ -915,7 +971,6 @@
 %%DATADIR%%/templates/ipam/fhrpgroupassignment_edit.html
 %%DATADIR%%/templates/ipam/inc/ipaddress_edit_header.html
 %%DATADIR%%/templates/ipam/inc/panels/fhrp_groups.html
-%%DATADIR%%/templates/ipam/inc/service.html
 %%DATADIR%%/templates/ipam/inc/toggle_available.html
 %%DATADIR%%/templates/ipam/ipaddress.html
 %%DATADIR%%/templates/ipam/ipaddress_assign.html
@@ -957,6 +1012,7 @@
 %%DATADIR%%/templates/tenancy/contactrole.html
 %%DATADIR%%/templates/tenancy/tenant.html
 %%DATADIR%%/templates/tenancy/tenantgroup.html
+%%DATADIR%%/templates/users/api_token.html
 %%DATADIR%%/templates/users/api_tokens.html
 %%DATADIR%%/templates/users/base.html
 %%DATADIR%%/templates/users/password.html
@@ -994,7 +1050,7 @@
 %%DATADIR%%/tenancy/forms/bulk_import.py
 %%DATADIR%%/tenancy/forms/filtersets.py
 %%DATADIR%%/tenancy/forms/forms.py
-%%DATADIR%%/tenancy/forms/models.py
+%%DATADIR%%/tenancy/forms/model_forms.py
 %%DATADIR%%/tenancy/graphql/__init__.py
 %%DATADIR%%/tenancy/graphql/schema.py
 %%DATADIR%%/tenancy/graphql/types.py
@@ -1005,10 +1061,13 @@
 %%DATADIR%%/tenancy/migrations/0005_standardize_id_fields.py
 %%DATADIR%%/tenancy/migrations/0006_created_datetimefield.py
 %%DATADIR%%/tenancy/migrations/0007_contact_link.py
+%%DATADIR%%/tenancy/migrations/0008_unique_constraints.py
+%%DATADIR%%/tenancy/migrations/0009_standardize_description_comments.py
 %%DATADIR%%/tenancy/migrations/__init__.py
 %%DATADIR%%/tenancy/models/__init__.py
 %%DATADIR%%/tenancy/models/contacts.py
 %%DATADIR%%/tenancy/models/tenants.py
+%%DATADIR%%/tenancy/search.py
 %%DATADIR%%/tenancy/tables/__init__.py
 %%DATADIR%%/tenancy/tables/columns.py
 %%DATADIR%%/tenancy/tables/contacts.py
@@ -1073,6 +1132,7 @@
 %%DATADIR%%/utilities/forms/utils.py
 %%DATADIR%%/utilities/forms/widgets.py
 %%DATADIR%%/utilities/htmx.py
+%%DATADIR%%/utilities/json.py
 %%DATADIR%%/utilities/management/__init__.py
 %%DATADIR%%/utilities/management/commands/__init__.py
 %%DATADIR%%/utilities/management/commands/makemigrations.py
@@ -1107,9 +1167,10 @@
 %%DATADIR%%/utilities/templates/helpers/table_config_form.html
 %%DATADIR%%/utilities/templates/helpers/utilization_graph.html
 %%DATADIR%%/utilities/templates/navigation/menu.html
-%%DATADIR%%/utilities/templates/search/searchbar.html
+%%DATADIR%%/utilities/templates/tabs/model_view_tabs.html
 %%DATADIR%%/utilities/templates/widgets/clearable_file_input.html
 %%DATADIR%%/utilities/templates/widgets/colorselect_option.html
+%%DATADIR%%/utilities/templates/widgets/select_duration.html
 %%DATADIR%%/utilities/templates/widgets/select_option.html
 %%DATADIR%%/utilities/templates/widgets/select_option_with_pk.html
 %%DATADIR%%/utilities/templates/widgets/select_speed.html
@@ -1123,7 +1184,7 @@
 %%DATADIR%%/utilities/templatetags/helpers.py
 %%DATADIR%%/utilities/templatetags/navigation.py
 %%DATADIR%%/utilities/templatetags/perms.py
-%%DATADIR%%/utilities/templatetags/search.py
+%%DATADIR%%/utilities/templatetags/tabs.py
 %%DATADIR%%/utilities/testing/__init__.py
 %%DATADIR%%/utilities/testing/api.py
 %%DATADIR%%/utilities/testing/base.py
@@ -1138,6 +1199,7 @@
 %%DATADIR%%/utilities/tests/test_managers.py
 %%DATADIR%%/utilities/tests/test_ordering.py
 %%DATADIR%%/utilities/tests/test_utils.py
+%%DATADIR%%/utilities/urls.py
 %%DATADIR%%/utilities/utils.py
 %%DATADIR%%/utilities/validators.py
 %%DATADIR%%/utilities/views.py
@@ -1155,7 +1217,7 @@
 %%DATADIR%%/virtualization/forms/bulk_edit.py
 %%DATADIR%%/virtualization/forms/bulk_import.py
 %%DATADIR%%/virtualization/forms/filtersets.py
-%%DATADIR%%/virtualization/forms/models.py
+%%DATADIR%%/virtualization/forms/model_forms.py
 %%DATADIR%%/virtualization/forms/object_create.py
 %%DATADIR%%/virtualization/graphql/__init__.py
 %%DATADIR%%/virtualization/graphql/schema.py
@@ -1171,8 +1233,13 @@
 %%DATADIR%%/virtualization/migrations/0030_cluster_status.py
 %%DATADIR%%/virtualization/migrations/0031_virtualmachine_site_device.py
 %%DATADIR%%/virtualization/migrations/0032_virtualmachine_update_sites.py
+%%DATADIR%%/virtualization/migrations/0033_unique_constraints.py
+%%DATADIR%%/virtualization/migrations/0034_standardize_description_comments.py
 %%DATADIR%%/virtualization/migrations/__init__.py
-%%DATADIR%%/virtualization/models.py
+%%DATADIR%%/virtualization/models/__init__.py
+%%DATADIR%%/virtualization/models/clusters.py
+%%DATADIR%%/virtualization/models/virtualmachines.py
+%%DATADIR%%/virtualization/search.py
 %%DATADIR%%/virtualization/tables/__init__.py
 %%DATADIR%%/virtualization/tables/clusters.py
 %%DATADIR%%/virtualization/tables/virtualmachines.py
@@ -1197,7 +1264,7 @@
 %%DATADIR%%/wireless/forms/bulk_edit.py
 %%DATADIR%%/wireless/forms/bulk_import.py
 %%DATADIR%%/wireless/forms/filtersets.py
-%%DATADIR%%/wireless/forms/models.py
+%%DATADIR%%/wireless/forms/model_forms.py
 %%DATADIR%%/wireless/graphql/__init__.py
 %%DATADIR%%/wireless/graphql/schema.py
 %%DATADIR%%/wireless/graphql/types.py
@@ -1206,8 +1273,12 @@
 %%DATADIR%%/wireless/migrations/0003_created_datetimefield.py
 %%DATADIR%%/wireless/migrations/0004_wireless_tenancy.py
 %%DATADIR%%/wireless/migrations/0005_wirelesslink_interface_types.py
+%%DATADIR%%/wireless/migrations/0006_unique_constraints.py
+%%DATADIR%%/wireless/migrations/0007_standardize_description_comments.py
+%%DATADIR%%/wireless/migrations/0008_wirelesslan_status.py
 %%DATADIR%%/wireless/migrations/__init__.py
 %%DATADIR%%/wireless/models.py
+%%DATADIR%%/wireless/search.py
 %%DATADIR%%/wireless/signals.py
 %%DATADIR%%/wireless/tables/__init__.py
 %%DATADIR%%/wireless/tables/wirelesslan.py