App Code Updates for Nautobot v2¶
Update Code Import Locations¶
Most changes in code location arise from the merging of the nautobot.utilities module into the nautobot.core module.
Full table of code location changes
| Old Module | Class/Function(s) | New Module |
|---|---|---|
| nautobot.core.api.utils | TreeModelSerializerMixin | nautobot.core.api.serializers |
| nautobot.core.fields | (all) | nautobot.core.models.fields |
| nautobot.core.forms | SearchForm | nautobot.core.forms.search |
| nautobot.core.utilities | (all) | nautobot.core.views.utils |
| nautobot.dcim.fields | MACAddressCharField | nautobot.core.models.fields |
| nautobot.dcim.forms | MACAddressField | nautobot.core.forms |
| nautobot.extras.api.customfields | CustomFieldModelSerializerMixin | nautobot.core.api.serializers |
| nautobot.extras.api.relationships | RelationshipModelSerializerMixin | nautobot.core.api.serializers |
| nautobot.extras.api.serializers | NautobotModelSerializer | nautobot.core.api.serializers |
| nautobot.extras.api.serializers | NotesSerializerMixin | nautobot.core.api.serializers |
| nautobot.extras.api.serializers | TaggedModelSerializerMixin | nautobot.extras.api.mixins |
| nautobot.extras.utils | is_taggable | nautobot.core.models.utils |
| nautobot.utilities.api | (all) | nautobot.core.api.utils |
| nautobot.utilities.apps | (all) | nautobot.core.apps |
| nautobot.utilities.checks | (all) | nautobot.core.checks |
| nautobot.utilities.choices | (all) | nautobot.core.choices |
| nautobot.utilities.config | (all) | nautobot.core.utils.config |
| nautobot.utilities.constants | (all) | nautobot.core.constants |
| nautobot.utilities.deprecation | (all) | nautobot.core.utils.deprecation |
| nautobot.utilities.error_handlers | (all) | nautobot.core.views.utils |
| nautobot.utilities.exceptions | (all) | nautobot.core.exceptions |
| nautobot.utilities.factory | (all) | nautobot.core.factory |
| nautobot.utilities.fields | (all) | nautobot.core.models.fields |
| nautobot.utilities.filters | (all) | nautobot.core.filters |
| nautobot.utilities.forms | (all) | nautobot.core.forms |
| nautobot.utilities.git | (all) | nautobot.core.utils.git |
| nautobot.utilities.logging | (all) | nautobot.core.utils.logging |
| nautobot.utilities.management | (all) | nautobot.core.management |
| nautobot.utilities.ordering | (all) | nautobot.core.utils.ordering |
| nautobot.utilities.paginator | (all) | nautobot.core.views.paginator |
| nautobot.utilities.permissions | (all) | nautobot.core.utils.permissions |
| nautobot.utilities.query_functions | (all) | nautobot.core.models.query_functions |
| nautobot.utilities.querysets | (all) | nautobot.core.models.querysets |
| nautobot.utilities.tables | (all) | nautobot.core.tables |
| nautobot.utilities.tasks | (all) | nautobot.core.tasks |
| nautobot.utilities.templatetags | (all) | nautobot.core.templatetags |
| nautobot.utilities.testing | (all) | nautobot.core.testing |
| nautobot.utilities.tree_queries | (all) | nautobot.core.models.tree_queries |
| nautobot.utilities.utils | array_to_string | nautobot.core.models.utils |
| nautobot.utilities.utils | convert_querydict_to_factory_formset_acceptable_querydict | nautobot.core.utils.requests |
| nautobot.utilities.utils | count_related | nautobot.core.models.querysets |
| nautobot.utilities.utils | csv_format | nautobot.core.views.utils |
| nautobot.utilities.utils | deepmerge | nautobot.core.utils.data |
| nautobot.utilities.utils | dict_to_filter_params | nautobot.core.api.utils |
| nautobot.utilities.utils | dynamic_import | nautobot.core.api.utils |
| nautobot.utilities.utils | ensure_content_type_and_field_name_inquery_params | nautobot.core.utils.requests |
| nautobot.utilities.utils | flatten_dict | nautobot.core.utils.data |
| nautobot.utilities.utils | flatten_iterable | nautobot.core.utils.data |
| nautobot.utilities.utils | foreground_color | nautobot.core.utils.color |
| nautobot.utilities.utils | get_all_lookup_expr_for_field | nautobot.core.utils.filtering |
| nautobot.utilities.utils | get_api_version_serializer | nautobot.core.api.utils |
| nautobot.utilities.utils | get_changes_for_model | nautobot.core.utils.lookup |
| nautobot.utilities.utils | get_filterset_field | nautobot.core.utils.filtering |
| nautobot.utilities.utils | get_filterset_for_model | nautobot.core.utils.lookup |
| nautobot.utilities.utils | get_filterable_params_from_filter_params | nautobot.core.utils.requests |
| nautobot.utilities.utils | get_form_for_model | nautobot.core.utils.lookup |
| nautobot.utilities.utils | get_model_from_name | nautobot.core.utils.lookup |
| nautobot.utilities.utils | get_related_class_for_model | nautobot.core.utils.lookup |
| nautobot.utilities.utils | get_route_for_model | nautobot.core.utils.lookup |
| nautobot.utilities.utils | get_table_for_model | nautobot.core.utils.lookup |
| nautobot.utilities.utils | hex_to_rgb | nautobot.core.utils.color |
| nautobot.utilities.utils | is_taggable | nautobot.core.models.utils |
| nautobot.utilities.utils | is_uuid | nautobot.core.utils.data |
| nautobot.utilities.utils | lighten_color | nautobot.core.utils.color |
| nautobot.utilities.utils | normalize_querydict | nautobot.core.utils.requests |
| nautobot.utilities.utils | prepare_cloned_fields | nautobot.core.views.utils |
| nautobot.utilities.utils | pretty_print_query | nautobot.core.models.utils |
| nautobot.utilities.utils | render_jinja2 | nautobot.core.utils.data |
| nautobot.utilities.utils | rgb_to_hex | nautobot.core.utils.color |
| nautobot.utilities.utils | SerializerForAPIVersions | nautobot.core.api.utils |
| nautobot.utilities.utils | serialize_object | nautobot.core.models.utils |
| nautobot.utilities.utils | serialize_object_v2 | nautobot.core.models.utils |
| nautobot.utilities.utils | shallow_compare_dict | nautobot.core.utils.data |
| nautobot.utilities.utils | slugify_dots_to_dashes | nautobot.core.models.fields |
| nautobot.utilities.utils | slugify_dashes_to_underscores | nautobot.core.models.fields |
| nautobot.utilities.utils | to_meters | nautobot.core.utils.data |
| nautobot.utilities.utils | UtilizationData | nautobot.core.utils.data |
| nautobot.utilities.utils | versioned_serializer_selector | nautobot.core.api.utils |
| nautobot.utilities.validators | (all) | nautobot.core.models.validators |
| nautobot.utilities.views | (all) | nautobot.core.views.mixins |
Replace PluginMenuItem with NavMenuItem¶
In your app's navigation.py file. If you are still using PluginMenuItem from nautobot.extras.plugin, you should replace those code with NavMenuGroup, NavMenuItem, and NavMenuTab from nautobot.apps.ui.
For example:
Before:
from nautobot.extras.plugins import PluginMenuItem
menu_items = (
PluginMenuItem(
link="plugins:your_app:dashboard",
link_text="Dashboard",
permissions=["your_app.view_sync"],
),
PluginMenuItem(
link="plugins:your_app:sync_list",
link_text="History",
permissions=["your_app.view_sync"],
),
PluginMenuItem(
link="plugins:your_app:synclogentry_list",
link_text="Logs",
permissions=["your_app.view_synclogentry"],
),
)
After:
from nautobot.apps.ui import NavMenuGroup, NavMenuItem, NavMenuTab
items = [
NavMenuItem(
link="plugins:your_app:dashboard",
name="Dashboard",
permissions=["your_app.view_sync"],
),
NavMenuItem(
link="plugins:your_app:sync_list",
name="History",
permissions=["your_app.view_sync"],
),
NavMenuItem(
link="plugins:your_app:synclogentry_list",
name="Logs",
permissions=["your_app.view_synclogentry"],
),
]
menu_items = (
NavMenuTab(
name="Plugins",
groups=(NavMenuGroup(name="Your App", weight=1000, items=tuple(items)),),
),
)
Remove Tag/Tags Filter from FilterSet Definitions¶
In Nautobot 2.0, you can safely remove tag = TagFilter(...) from your filter set definitions as long as your filter sets inherit from NautobotFilterSet class and tags is added to the filter set class Meta.fields.
For example, before the filter set could look like this:
class AppModelFilterSet(BaseFilterSet):
name = MultiValueCharFilter(...)
number = MultiValueNumberFilter(...)
tag = TagFilter(...)
class Meta:
fields = ["name", "number"]
After changing the base class to NautobotFilterSet the tag filter should be removed:
class AppModelFilterSet(NautobotFilterSet):
name = MultiValueCharFilter(...)
number = MultiValueNumberFilter(...)
class Meta:
fields = ["name", "number", "tags"]
Replace DjangoFilterBackend with NautobotFilterBackend¶
If your REST API has any FilterBackend classes derived from DjangoFilterBackend, you should replace DjangoFilterBackend with NautobotFilterBackend.
App Model Serializer Inheritance¶
App Model Serializers for any models that could have a Generic Foreign Key or a Many to Many relationship from a Nautobot Core model must inherit from BaseModelSerializer at a minimum so that they have a properly generated object_type field. This also applies to the case where your model is a subclass of ChangeLoggedModel and you will have a Generic Foreign Key from ObjectChange's changed_object field. Otherwise drf-spectacular schema generation will throw an error:
(drf_spectacular.E001) Schema generation threw exception "Field name `object_type` is not valid for model `YourAppModel`.
Revamp Rest API Serializers¶
NestedSerializer classes are no longer needed in Nautobot 2.0. If any NestedSerializers exist for your models, you should just remove their class definitions and references.
After removing existing NestedSerializers, you can change the fields attribute in your serializers' class Meta to __all__ and that will automatically include all the model's fields in the serializer, including related-model fields that would previously have required a reference to a NestedSerializer. If you want to exclude certain fields of the model, you can specify a list of fields you want to display in the fields attribute instead.
Warning
Use caution around fields = "__all__" -- if your model has any fields that should not be exposed in the REST API, you should avoid using "__all__" and instead use an explicit fields list to ensure that such fields are not exposed. In some cases, it may be appropriate to use "__all__" in combination with flags such as write_only=True on specific fields, but proceed with caution and examine the REST API data carefully to ensure that its contents are as expected.
Include all model attributes:
class ExampleModelSerializer(NautobotModelSerializer):
"""Used for normal CRUD operations."""
url = serializers.HyperlinkedIdentityField(view_name="plugins-api:example_plugin-api:anotherexamplemodel-detail")
class Meta:
model = AnotherExampleModel
fields = "__all__"
Include only specified model attributes:
class ExampleModelSerializer(NautobotModelSerializer):
"""Used for normal CRUD operations."""
url = serializers.HyperlinkedIdentityField(view_name="plugins-api:example_plugin-api:anotherexamplemodel-detail")
class Meta:
model = AnotherExampleModel
# example_attribute_4 is not included in the serializer
fields = ["url", "example_attribute_1", "example_attribute_2", "example_attribute_3"]
In addition, the ?brief= API query parameter is replaced by ?depth=<0-10>. As a result, the ability to specify brief_mode in DynamicModelChoiceField, DynamicModelMultipleChoiceField, and MultiMatchModelMultipleChoiceField has also been removed. For every occurrence of the aforementioned fields where you have brief_mode set to True/False (e.g. brief_mode=True), please remove the statement, leaving other occurrences of the fields where you do not have brief_mode specified as they are. Check out our API documentation for this change.
Revamp CSV Import and Export¶
CSV Import for models are now done automatically via the Rest API. As a result of this change, CSVForm classes are no longer needed and should be deleted. In addition, the Model csv_headers attribute and to_csv method are no longer needed or used in CSV generation, and should be removed from your model definitions. Check out our release notes for this specific change.