diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index b3558959fba..f63a8f17079 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -17,7 +17,7 @@ body: What version of NetBox are you currently running? (If you don't have access to the most recent NetBox release, consider testing on our [demo instance](https://demo.netbox.dev/) before opening a bug report to see if your issue has already been addressed.) - placeholder: v3.0.3 + placeholder: v3.0.4 validations: required: true - type: dropdown @@ -25,9 +25,9 @@ body: label: Python version description: What version of Python are you currently running? options: - - 3.7 - - 3.8 - - 3.9 + - "3.7" + - "3.8" + - "3.9" validations: required: true - type: textarea diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml index 522c328fa42..d39c2210e48 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -14,7 +14,7 @@ body: attributes: label: NetBox version description: What version of NetBox are you currently running? - placeholder: v3.0.3 + placeholder: v3.0.4 validations: required: true - type: dropdown diff --git a/base_requirements.txt b/base_requirements.txt index acd8d22c8b6..11ddac63453 100644 --- a/base_requirements.txt +++ b/base_requirements.txt @@ -94,10 +94,6 @@ Pillow # https://github.com/psycopg/psycopg2 psycopg2-binary -# Extensive cryptographic library (fork of pycrypto) -# https://github.com/Legrandin/pycryptodome -pycryptodome - # YAML rendering library # https://github.com/yaml/pyyaml PyYAML diff --git a/docs/additional-features/webhooks.md b/docs/additional-features/webhooks.md index 19133adb190..3f10cb9e67f 100644 --- a/docs/additional-features/webhooks.md +++ b/docs/additional-features/webhooks.md @@ -1,85 +1,4 @@ -# Webhooks - -A webhook is a mechanism for conveying to some external system a change that took place in NetBox. For example, you may want to notify a monitoring system whenever the status of a device is updated in NetBox. This can be done by creating a webhook for the device model in NetBox and identifying the webhook receiver. When NetBox detects a change to a device, an HTTP request containing the details of the change and who made it be sent to the specified receiver. Webhooks are managed under Logging > Webhooks. - -!!! warning - Webhooks support the inclusion of user-submitted code to generate custom headers and payloads, which may pose security risks under certain conditions. Only grant permission to create or modify webhooks to trusted users. - -## Configuration - -* **Name** - A unique name for the webhook. The name is not included with outbound messages. -* **Object type(s)** - The type or types of NetBox object that will trigger the webhook. -* **Enabled** - If unchecked, the webhook will be inactive. -* **Events** - A webhook may trigger on any combination of create, update, and delete events. At least one event type must be selected. -* **HTTP method** - The type of HTTP request to send. Options include `GET`, `POST`, `PUT`, `PATCH`, and `DELETE`. -* **URL** - The fuly-qualified URL of the request to be sent. This may specify a destination port number if needed. -* **HTTP content type** - The value of the request's `Content-Type` header. (Defaults to `application/json`) -* **Additional headers** - Any additional headers to include with the request (optional). Add one header per line in the format `Name: Value`. Jinja2 templating is supported for this field (see below). -* **Body template** - The content of the request being sent (optional). Jinja2 templating is supported for this field (see below). If blank, NetBox will populate the request body with a raw dump of the webhook context. (If the HTTP cotent type is set to `application/json`, this will be formatted as a JSON object.) -* **Secret** - A secret string used to prove authenticity of the request (optional). This will append a `X-Hook-Signature` header to the request, consisting of a HMAC (SHA-512) hex digest of the request body using the secret as the key. -* **SSL verification** - Uncheck this option to disable validation of the receiver's SSL certificate. (Disable with caution!) -* **CA file path** - The file path to a particular certificate authority (CA) file to use when validating the receiver's SSL certificate (optional). - -## Jinja2 Template Support - -[Jinja2 templating](https://jinja.palletsprojects.com/) is supported for the `additional_headers` and `body_template` fields. This enables the user to convey object data in the request headers as well as to craft a customized request body. Request content can be crafted to enable the direct interaction with external systems by ensuring the outgoing message is in a format the receiver expects and understands. - -For example, you might create a NetBox webhook to [trigger a Slack message](https://api.slack.com/messaging/webhooks) any time an IP address is created. You can accomplish this using the following configuration: - -* Object type: IPAM > IP address -* HTTP method: `POST` -* URL: Slack incoming webhook URL -* HTTP content type: `application/json` -* Body template: `{"text": "IP address {{ data['address'] }} was created by {{ username }}!"}` - -### Available Context - -The following data is available as context for Jinja2 templates: - -* `event` - The type of event which triggered the webhook: created, updated, or deleted. -* `model` - The NetBox model which triggered the change. -* `timestamp` - The time at which the event occurred (in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format). -* `username` - The name of the user account associated with the change. -* `request_id` - The unique request ID. This may be used to correlate multiple changes associated with a single request. -* `data` - A detailed representation of the object in its current state. This is typically equivalent to the model's representation in NetBox's REST API. -* `snapshots` - Minimal "snapshots" of the object state both before and after the change was made; provided ass a dictionary with keys named `prechange` and `postchange`. These are not as extensive as the fully serialized representation, but contain enough information to convey what has changed. - -### Default Request Body - -If no body template is specified, the request body will be populated with a JSON object containing the context data. For example, a newly created site might appear as follows: - -```no-highlight -{ - "event": "created", - "timestamp": "2021-03-09 17:55:33.968016+00:00", - "model": "site", - "username": "jstretch", - "request_id": "fdbca812-3142-4783-b364-2e2bd5c16c6a", - "data": { - "id": 19, - "name": "Site 1", - "slug": "site-1", - "status": - "value": "active", - "label": "Active", - "id": 1 - }, - "region": null, - ... - }, - "snapshots": { - "prechange": null, - "postchange": { - "created": "2021-03-09", - "last_updated": "2021-03-09T17:55:33.851Z", - "name": "Site 1", - "slug": "site-1", - "status": "active", - ... - } - } -} -``` +{!models/extras/webhook.md!} ## Webhook Processing diff --git a/docs/customization/custom-fields.md b/docs/customization/custom-fields.md index a9acfb3f742..75741662697 100644 --- a/docs/customization/custom-fields.md +++ b/docs/customization/custom-fields.md @@ -1,44 +1,4 @@ -# Custom Fields - -Each model in NetBox is represented in the database as a discrete table, and each attribute of a model exists as a column within its table. For example, sites are stored in the `dcim_site` table, which has columns named `name`, `facility`, `physical_address`, and so on. As new attributes are added to objects throughout the development of NetBox, tables are expanded to include new rows. - -However, some users might want to store additional object attributes that are somewhat esoteric in nature, and that would not make sense to include in the core NetBox database schema. For instance, suppose your organization needs to associate each device with a ticket number correlating it with an internal support system record. This is certainly a legitimate use for NetBox, but it's not a common enough need to warrant including a field for _every_ NetBox installation. Instead, you can create a custom field to hold this data. - -Within the database, custom fields are stored as JSON data directly alongside each object. This alleviates the need for complex queries when retrieving objects. - -## Creating Custom Fields - -Custom fields may be created by navigating to Customization > Custom Fields. NetBox supports six types of custom field: - -* Text: Free-form text (up to 255 characters) -* Integer: A whole number (positive or negative) -* Boolean: True or false -* Date: A date in ISO 8601 format (YYYY-MM-DD) -* URL: This will be presented as a link in the web UI -* Selection: A selection of one of several pre-defined custom choices -* Multiple selection: A selection field which supports the assignment of multiple values - -Each custom field must have a name; this should be a simple database-friendly string, e.g. `tps_report`. You may also assign a corresponding human-friendly label (e.g. "TPS report"); the label will be displayed on web forms. A weight is also required: Higher-weight fields will be ordered lower within a form. (The default weight is 100.) If a description is provided, it will appear beneath the field in a form. - -Marking a field as required will force the user to provide a value for the field when creating a new object or when saving an existing object. A default value for the field may also be provided. Use "true" or "false" for boolean fields, or the exact value of a choice for selection fields. - -The filter logic controls how values are matched when filtering objects by the custom field. Loose filtering (the default) matches on a partial value, whereas exact matching requires a complete match of the given string to a field's value. For example, exact filtering with the string "red" will only match the exact value "red", whereas loose filtering will match on the values "red", "red-orange", or "bored". Setting the filter logic to "disabled" disables filtering by the field entirely. - -A custom field must be assigned to one or more object types, or models, in NetBox. Once created, custom fields will automatically appear as part of these models in the web UI and REST API. Note that not all models support custom fields. - -### Custom Field Validation - -NetBox supports limited custom validation for custom field values. Following are the types of validation enforced for each field type: - -* Text: Regular expression (optional) -* Integer: Minimum and/or maximum value (optional) -* Selection: Must exactly match one of the prescribed choices - -### Custom Selection Fields - -Each custom selection field must have at least two choices. These are specified as a comma-separated list. Choices appear in forms in the order they are listed. Note that choice values are saved exactly as they appear, so it's best to avoid superfluous punctuation or symbols where possible. - -If a default value is specified for a selection field, it must exactly match one of the provided choices. The value of a multiple selection field will always return a list, even if only one value is selected. +{!models/extras/customfield.md!} ## Custom Fields in Templates diff --git a/docs/customization/custom-links.md b/docs/customization/custom-links.md index 44c8f403fac..1ee366cfd59 100644 --- a/docs/customization/custom-links.md +++ b/docs/customization/custom-links.md @@ -1,57 +1 @@ -# Custom Links - -Custom links allow users to display arbitrary hyperlinks to external content within NetBox object views. These are helpful for cross-referencing related records in systems outside NetBox. For example, you might create a custom link on the device view which links to the current device in a network monitoring system. - -Custom links are created by navigating to Customization > Custom Links. Each link is associated with a particular NetBox object type (site, device, prefix, etc.) and will be displayed on relevant views. Each link is assigned text and a URL, both of which support Jinja2 templating. The text and URL are rendered with the context variable `obj` representing the current object. - -For example, you might define a link like this: - -* Text: `View NMS` -* URL: `https://nms.example.com/nodes/?name={{ obj.name }}` - -When viewing a device named Router4, this link would render as: - -```no-highlight -View NMS -``` - -Custom links appear as buttons in the top right corner of the page. Numeric weighting can be used to influence the ordering of links. - -!!! warning - Custom links rely on user-created code to generate arbitrary HTML output, which may be dangerous. Only grant permission to create or modify custom links to trusted users. - -## Context Data - -The following context data is available within the template when rendering a custom link's text or URL. - -| Variable | Description | -|----------|-------------| -| `obj` | The NetBox object being displayed | -| `debug` | A boolean indicating whether debugging is enabled | -| `request` | The current WSGI request | -| `user` | The current user (if authenticated) | -| `perms` | The [permissions](https://docs.djangoproject.com/en/stable/topics/auth/default/#permissions) assigned to the user | - -## Conditional Rendering - -Only links which render with non-empty text are included on the page. You can employ conditional Jinja2 logic to control the conditions under which a link gets rendered. - -For example, if you only want to display a link for active devices, you could set the link text to - -```jinja2 -{% if obj.status == 'active' %}View NMS{% endif %} -``` - -The link will not appear when viewing a device with any status other than "active." - -As another example, if you wanted to show only devices belonging to a certain manufacturer, you could do something like this: - -```jinja2 -{% if obj.device_type.manufacturer.name == 'Cisco' %}View NMS{% endif %} -``` - -The link will only appear when viewing a device with a manufacturer name of "Cisco." - -## Link Groups - -Group names can be specified to organize links into groups. Links with the same group name will render as a dropdown menu beneath a single button bearing the name of the group. +{!models/extras/customlink.md!} diff --git a/docs/customization/export-templates.md b/docs/customization/export-templates.md index c6097c55217..affd39aaeeb 100644 --- a/docs/customization/export-templates.md +++ b/docs/customization/export-templates.md @@ -1,40 +1,4 @@ -# Export Templates - -NetBox allows users to define custom templates that can be used when exporting objects. To create an export template, navigate to Customization > Export Templates. - -Each export template is associated with a certain type of object. For instance, if you create an export template for VLANs, your custom template will appear under the "Export" button on the VLANs list. Each export template must have a name, and may optionally designate a specific export [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) and/or file extension. - -Export templates must be written in [Jinja2](https://jinja.palletsprojects.com/). - -!!! note - The name `table` is reserved for internal use. - -!!! warning - Export templates are rendered using user-submitted code, which may pose security risks under certain conditions. Only grant permission to create or modify export templates to trusted users. - -The list of objects returned from the database when rendering an export template is stored in the `queryset` variable, which you'll typically want to iterate through using a `for` loop. Object properties can be access by name. For example: - -```jinja2 -{% for rack in queryset %} -Rack: {{ rack.name }} -Site: {{ rack.site.name }} -Height: {{ rack.u_height }}U -{% endfor %} -``` - -To access custom fields of an object within a template, use the `cf` attribute. For example, `{{ obj.cf.color }}` will return the value (if any) for a custom field named `color` on `obj`. - -If you need to use the config context data in an export template, you'll should use the function `get_config_context` to get all the config context data. For example: -``` -{% for server in queryset %} -{% set data = server.get_config_context() %} -{{ data.syslog }} -{% endfor %} -``` - -The `as_attachment` attribute of an export template controls its behavior when rendered. If true, the rendered content will be returned to the user as a downloadable file. If false, it will be displayed within the browser. (This may be handy e.g. for generating HTML content.) - -A MIME type and file extension can optionally be defined for each export template. The default MIME type is `text/plain`. +{!models/extras/exporttemplate.md!} ## REST API Integration diff --git a/docs/customization/reports.md b/docs/customization/reports.md index 2fead68ec2a..ed4faf371de 100644 --- a/docs/customization/reports.md +++ b/docs/customization/reports.md @@ -97,6 +97,20 @@ The recording of one or more failure messages will automatically flag a report a To perform additional tasks, such as sending an email or calling a webhook, after a report has been run, extend the `post_run()` method. The status of the report is available as `self.failed` and the results object is `self.result`. +By default, reports within a module are ordered alphabetically in the reports list page. To return reports in a specific order, you can define the `report_order` variable at the end of your module. The `report_order` variable is a tuple which contains each Report class in the desired order. Any reports that are omitted from this list will be listed last. + +``` +from extras.reports import Report + +class DeviceConnectionsReport(Report) + pass + +class DeviceIPsReport(Report) + pass + +report_order = (DeviceIPsReport, DeviceConnectionsReport) +``` + Once you have created a report, it will appear in the reports list. Initially, reports will have no results associated with them. To generate results, run the report. ## Running Reports diff --git a/docs/models/extras/customfield.md b/docs/models/extras/customfield.md new file mode 100644 index 00000000000..52b8bab1ea7 --- /dev/null +++ b/docs/models/extras/customfield.md @@ -0,0 +1,41 @@ +# Custom Fields + +Each model in NetBox is represented in the database as a discrete table, and each attribute of a model exists as a column within its table. For example, sites are stored in the `dcim_site` table, which has columns named `name`, `facility`, `physical_address`, and so on. As new attributes are added to objects throughout the development of NetBox, tables are expanded to include new rows. + +However, some users might want to store additional object attributes that are somewhat esoteric in nature, and that would not make sense to include in the core NetBox database schema. For instance, suppose your organization needs to associate each device with a ticket number correlating it with an internal support system record. This is certainly a legitimate use for NetBox, but it's not a common enough need to warrant including a field for _every_ NetBox installation. Instead, you can create a custom field to hold this data. + +Within the database, custom fields are stored as JSON data directly alongside each object. This alleviates the need for complex queries when retrieving objects. + +## Creating Custom Fields + +Custom fields may be created by navigating to Customization > Custom Fields. NetBox supports six types of custom field: + +* Text: Free-form text (up to 255 characters) +* Integer: A whole number (positive or negative) +* Boolean: True or false +* Date: A date in ISO 8601 format (YYYY-MM-DD) +* URL: This will be presented as a link in the web UI +* Selection: A selection of one of several pre-defined custom choices +* Multiple selection: A selection field which supports the assignment of multiple values + +Each custom field must have a name; this should be a simple database-friendly string, e.g. `tps_report`. You may also assign a corresponding human-friendly label (e.g. "TPS report"); the label will be displayed on web forms. A weight is also required: Higher-weight fields will be ordered lower within a form. (The default weight is 100.) If a description is provided, it will appear beneath the field in a form. + +Marking a field as required will force the user to provide a value for the field when creating a new object or when saving an existing object. A default value for the field may also be provided. Use "true" or "false" for boolean fields, or the exact value of a choice for selection fields. + +The filter logic controls how values are matched when filtering objects by the custom field. Loose filtering (the default) matches on a partial value, whereas exact matching requires a complete match of the given string to a field's value. For example, exact filtering with the string "red" will only match the exact value "red", whereas loose filtering will match on the values "red", "red-orange", or "bored". Setting the filter logic to "disabled" disables filtering by the field entirely. + +A custom field must be assigned to one or more object types, or models, in NetBox. Once created, custom fields will automatically appear as part of these models in the web UI and REST API. Note that not all models support custom fields. + +### Custom Field Validation + +NetBox supports limited custom validation for custom field values. Following are the types of validation enforced for each field type: + +* Text: Regular expression (optional) +* Integer: Minimum and/or maximum value (optional) +* Selection: Must exactly match one of the prescribed choices + +### Custom Selection Fields + +Each custom selection field must have at least two choices. These are specified as a comma-separated list. Choices appear in forms in the order they are listed. Note that choice values are saved exactly as they appear, so it's best to avoid superfluous punctuation or symbols where possible. + +If a default value is specified for a selection field, it must exactly match one of the provided choices. The value of a multiple selection field will always return a list, even if only one value is selected. diff --git a/docs/models/extras/customlink.md b/docs/models/extras/customlink.md new file mode 100644 index 00000000000..44c8f403fac --- /dev/null +++ b/docs/models/extras/customlink.md @@ -0,0 +1,57 @@ +# Custom Links + +Custom links allow users to display arbitrary hyperlinks to external content within NetBox object views. These are helpful for cross-referencing related records in systems outside NetBox. For example, you might create a custom link on the device view which links to the current device in a network monitoring system. + +Custom links are created by navigating to Customization > Custom Links. Each link is associated with a particular NetBox object type (site, device, prefix, etc.) and will be displayed on relevant views. Each link is assigned text and a URL, both of which support Jinja2 templating. The text and URL are rendered with the context variable `obj` representing the current object. + +For example, you might define a link like this: + +* Text: `View NMS` +* URL: `https://nms.example.com/nodes/?name={{ obj.name }}` + +When viewing a device named Router4, this link would render as: + +```no-highlight +View NMS +``` + +Custom links appear as buttons in the top right corner of the page. Numeric weighting can be used to influence the ordering of links. + +!!! warning + Custom links rely on user-created code to generate arbitrary HTML output, which may be dangerous. Only grant permission to create or modify custom links to trusted users. + +## Context Data + +The following context data is available within the template when rendering a custom link's text or URL. + +| Variable | Description | +|----------|-------------| +| `obj` | The NetBox object being displayed | +| `debug` | A boolean indicating whether debugging is enabled | +| `request` | The current WSGI request | +| `user` | The current user (if authenticated) | +| `perms` | The [permissions](https://docs.djangoproject.com/en/stable/topics/auth/default/#permissions) assigned to the user | + +## Conditional Rendering + +Only links which render with non-empty text are included on the page. You can employ conditional Jinja2 logic to control the conditions under which a link gets rendered. + +For example, if you only want to display a link for active devices, you could set the link text to + +```jinja2 +{% if obj.status == 'active' %}View NMS{% endif %} +``` + +The link will not appear when viewing a device with any status other than "active." + +As another example, if you wanted to show only devices belonging to a certain manufacturer, you could do something like this: + +```jinja2 +{% if obj.device_type.manufacturer.name == 'Cisco' %}View NMS{% endif %} +``` + +The link will only appear when viewing a device with a manufacturer name of "Cisco." + +## Link Groups + +Group names can be specified to organize links into groups. Links with the same group name will render as a dropdown menu beneath a single button bearing the name of the group. diff --git a/docs/models/extras/exporttemplate.md b/docs/models/extras/exporttemplate.md new file mode 100644 index 00000000000..e76a3ad47fc --- /dev/null +++ b/docs/models/extras/exporttemplate.md @@ -0,0 +1,37 @@ +# Export Templates + +NetBox allows users to define custom templates that can be used when exporting objects. To create an export template, navigate to Customization > Export Templates. + +Each export template is associated with a certain type of object. For instance, if you create an export template for VLANs, your custom template will appear under the "Export" button on the VLANs list. Each export template must have a name, and may optionally designate a specific export [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) and/or file extension. + +Export templates must be written in [Jinja2](https://jinja.palletsprojects.com/). + +!!! note + The name `table` is reserved for internal use. + +!!! warning + Export templates are rendered using user-submitted code, which may pose security risks under certain conditions. Only grant permission to create or modify export templates to trusted users. + +The list of objects returned from the database when rendering an export template is stored in the `queryset` variable, which you'll typically want to iterate through using a `for` loop. Object properties can be access by name. For example: + +```jinja2 +{% for rack in queryset %} +Rack: {{ rack.name }} +Site: {{ rack.site.name }} +Height: {{ rack.u_height }}U +{% endfor %} +``` + +To access custom fields of an object within a template, use the `cf` attribute. For example, `{{ obj.cf.color }}` will return the value (if any) for a custom field named `color` on `obj`. + +If you need to use the config context data in an export template, you'll should use the function `get_config_context` to get all the config context data. For example: +``` +{% for server in queryset %} +{% set data = server.get_config_context() %} +{{ data.syslog }} +{% endfor %} +``` + +The `as_attachment` attribute of an export template controls its behavior when rendered. If true, the rendered content will be returned to the user as a downloadable file. If false, it will be displayed within the browser. (This may be handy e.g. for generating HTML content.) + +A MIME type and file extension can optionally be defined for each export template. The default MIME type is `text/plain`. diff --git a/docs/models/extras/webhook.md b/docs/models/extras/webhook.md new file mode 100644 index 00000000000..ee5e9d05993 --- /dev/null +++ b/docs/models/extras/webhook.md @@ -0,0 +1,82 @@ +# Webhooks + +A webhook is a mechanism for conveying to some external system a change that took place in NetBox. For example, you may want to notify a monitoring system whenever the status of a device is updated in NetBox. This can be done by creating a webhook for the device model in NetBox and identifying the webhook receiver. When NetBox detects a change to a device, an HTTP request containing the details of the change and who made it be sent to the specified receiver. Webhooks are managed under Logging > Webhooks. + +!!! warning + Webhooks support the inclusion of user-submitted code to generate custom headers and payloads, which may pose security risks under certain conditions. Only grant permission to create or modify webhooks to trusted users. + +## Configuration + +* **Name** - A unique name for the webhook. The name is not included with outbound messages. +* **Object type(s)** - The type or types of NetBox object that will trigger the webhook. +* **Enabled** - If unchecked, the webhook will be inactive. +* **Events** - A webhook may trigger on any combination of create, update, and delete events. At least one event type must be selected. +* **HTTP method** - The type of HTTP request to send. Options include `GET`, `POST`, `PUT`, `PATCH`, and `DELETE`. +* **URL** - The fuly-qualified URL of the request to be sent. This may specify a destination port number if needed. +* **HTTP content type** - The value of the request's `Content-Type` header. (Defaults to `application/json`) +* **Additional headers** - Any additional headers to include with the request (optional). Add one header per line in the format `Name: Value`. Jinja2 templating is supported for this field (see below). +* **Body template** - The content of the request being sent (optional). Jinja2 templating is supported for this field (see below). If blank, NetBox will populate the request body with a raw dump of the webhook context. (If the HTTP cotent type is set to `application/json`, this will be formatted as a JSON object.) +* **Secret** - A secret string used to prove authenticity of the request (optional). This will append a `X-Hook-Signature` header to the request, consisting of a HMAC (SHA-512) hex digest of the request body using the secret as the key. +* **SSL verification** - Uncheck this option to disable validation of the receiver's SSL certificate. (Disable with caution!) +* **CA file path** - The file path to a particular certificate authority (CA) file to use when validating the receiver's SSL certificate (optional). + +## Jinja2 Template Support + +[Jinja2 templating](https://jinja.palletsprojects.com/) is supported for the `additional_headers` and `body_template` fields. This enables the user to convey object data in the request headers as well as to craft a customized request body. Request content can be crafted to enable the direct interaction with external systems by ensuring the outgoing message is in a format the receiver expects and understands. + +For example, you might create a NetBox webhook to [trigger a Slack message](https://api.slack.com/messaging/webhooks) any time an IP address is created. You can accomplish this using the following configuration: + +* Object type: IPAM > IP address +* HTTP method: `POST` +* URL: Slack incoming webhook URL +* HTTP content type: `application/json` +* Body template: `{"text": "IP address {{ data['address'] }} was created by {{ username }}!"}` + +### Available Context + +The following data is available as context for Jinja2 templates: + +* `event` - The type of event which triggered the webhook: created, updated, or deleted. +* `model` - The NetBox model which triggered the change. +* `timestamp` - The time at which the event occurred (in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format). +* `username` - The name of the user account associated with the change. +* `request_id` - The unique request ID. This may be used to correlate multiple changes associated with a single request. +* `data` - A detailed representation of the object in its current state. This is typically equivalent to the model's representation in NetBox's REST API. +* `snapshots` - Minimal "snapshots" of the object state both before and after the change was made; provided ass a dictionary with keys named `prechange` and `postchange`. These are not as extensive as the fully serialized representation, but contain enough information to convey what has changed. + +### Default Request Body + +If no body template is specified, the request body will be populated with a JSON object containing the context data. For example, a newly created site might appear as follows: + +```json +{ + "event": "created", + "timestamp": "2021-03-09 17:55:33.968016+00:00", + "model": "site", + "username": "jstretch", + "request_id": "fdbca812-3142-4783-b364-2e2bd5c16c6a", + "data": { + "id": 19, + "name": "Site 1", + "slug": "site-1", + "status": + "value": "active", + "label": "Active", + "id": 1 + }, + "region": null, + ... + }, + "snapshots": { + "prechange": null, + "postchange": { + "created": "2021-03-09", + "last_updated": "2021-03-09T17:55:33.851Z", + "name": "Site 1", + "slug": "site-1", + "status": "active", + ... + } + } +} +``` diff --git a/docs/models/ipam/iprange.md b/docs/models/ipam/iprange.md index ab712e5b25f..7b0457f27f5 100644 --- a/docs/models/ipam/iprange.md +++ b/docs/models/ipam/iprange.md @@ -9,3 +9,6 @@ IP also ranges share the same functional roles as prefixes and VLANs, although t * Deprecated - No longer in use The status of a range does _not_ have any impact on its member IP addresses, which may have their statuses modified separately. + +!!! note + The maximum supported size of an IP range is 2^32 - 1. diff --git a/docs/release-notes/version-3.0.md b/docs/release-notes/version-3.0.md index 522a026e3c9..bd381798691 100644 --- a/docs/release-notes/version-3.0.md +++ b/docs/release-notes/version-3.0.md @@ -1,5 +1,35 @@ # NetBox v3.0 +## v3.0.4 (2021-09-29) + +### Enhancements + +* [#6917](https://github.com/netbox-community/netbox/issues/6917) - Make IP assigned checkmark in IP table link to interface +* [#6973](https://github.com/netbox-community/netbox/issues/6973) - Enable custom ordering of reports +* [#7022](https://github.com/netbox-community/netbox/issues/7022) - Add ITA type C (CEE 7/16) power port type +* [#7118](https://github.com/netbox-community/netbox/issues/7118) - Render URL custom fields as hyperlinks in object tables +* [#7314](https://github.com/netbox-community/netbox/issues/7314) - Add SMA 905/906 fiber port types +* [#7323](https://github.com/netbox-community/netbox/issues/7323) - Add serial filter field for racks & devices +* [#7372](https://github.com/netbox-community/netbox/issues/7372) - Link to local docs for model from object add/edit views +* [#7389](https://github.com/netbox-community/netbox/issues/7389) - Linkify tenant group in tenants list + +### Bug Fixes + +* [#7252](https://github.com/netbox-community/netbox/issues/7252) - Validate IP range size does not exceed max supported value +* [#7294](https://github.com/netbox-community/netbox/issues/7294) - Fix SVG rendering for cable traces ending at unoccupied front ports +* [#7304](https://github.com/netbox-community/netbox/issues/7304) - Require explicit values for all required choice fields during CSV import +* [#7321](https://github.com/netbox-community/netbox/issues/7321) - Don't overwrite multi-select custom fields during bulk edit +* [#7324](https://github.com/netbox-community/netbox/issues/7324) - Fix TypeError exception in web UI when filtering objects using single-choice filters +* [#7333](https://github.com/netbox-community/netbox/issues/7333) - Prevent inadvertent deletion of prior change records when deleting objects +* [#7341](https://github.com/netbox-community/netbox/issues/7341) - Fix incorrect URL in circuit breadcrumbs +* [#7353](https://github.com/netbox-community/netbox/issues/7353) - Fix bulk creation of device/VM components via list view +* [#7356](https://github.com/netbox-community/netbox/issues/7356) - Fix display of model documentation when adding device components +* [#7358](https://github.com/netbox-community/netbox/issues/7358) - Add missing `choices` column to custom field CSV import form +* [#7360](https://github.com/netbox-community/netbox/issues/7360) - Correct redirection URL after removing child device from device bay +* [#7365](https://github.com/netbox-community/netbox/issues/7365) - Optimize performance when calculating prefix utilization +* [#7374](https://github.com/netbox-community/netbox/issues/7374) - Add missing `face` parameter to API elevations request when editing device +* [#7392](https://github.com/netbox-community/netbox/issues/7392) - Fix "help" links for custom fields, other models + ## v3.0.3 (2021-09-20) ### Enhancements diff --git a/netbox/circuits/forms.py b/netbox/circuits/forms.py deleted file mode 100644 index f43a3cfff09..00000000000 --- a/netbox/circuits/forms.py +++ /dev/null @@ -1,513 +0,0 @@ -from django import forms -from django.utils.translation import gettext as _ - -from dcim.models import Region, Site, SiteGroup -from extras.forms import ( - AddRemoveTagsForm, CustomFieldModelBulkEditForm, CustomFieldModelFilterForm, CustomFieldModelForm, CustomFieldModelCSVForm, -) -from extras.models import Tag -from tenancy.forms import TenancyFilterForm, TenancyForm -from tenancy.models import Tenant -from utilities.forms import ( - add_blank_choice, BootstrapMixin, CommentField, CSVChoiceField, CSVModelChoiceField, DatePicker, - DynamicModelChoiceField, DynamicModelMultipleChoiceField, SelectSpeedWidget, SmallTextarea, SlugField, - StaticSelect, StaticSelectMultiple, TagFilterField, -) -from .choices import CircuitStatusChoices -from .models import * - - -# -# Providers -# - -class ProviderForm(BootstrapMixin, CustomFieldModelForm): - slug = SlugField() - comments = CommentField() - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = Provider - fields = [ - 'name', 'slug', 'asn', 'account', 'portal_url', 'noc_contact', 'admin_contact', 'comments', 'tags', - ] - fieldsets = ( - ('Provider', ('name', 'slug', 'asn', 'tags')), - ('Support Info', ('account', 'portal_url', 'noc_contact', 'admin_contact')), - ) - widgets = { - 'noc_contact': SmallTextarea( - attrs={'rows': 5} - ), - 'admin_contact': SmallTextarea( - attrs={'rows': 5} - ), - } - help_texts = { - 'name': "Full name of the provider", - 'asn': "BGP autonomous system number (if applicable)", - 'portal_url': "URL of the provider's customer support portal", - 'noc_contact': "NOC email address and phone number", - 'admin_contact': "Administrative contact email address and phone number", - } - - -class ProviderCSVForm(CustomFieldModelCSVForm): - slug = SlugField() - - class Meta: - model = Provider - fields = ( - 'name', 'slug', 'asn', 'account', 'portal_url', 'noc_contact', 'admin_contact', 'comments', - ) - - -class ProviderBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Provider.objects.all(), - widget=forms.MultipleHiddenInput - ) - asn = forms.IntegerField( - required=False, - label='ASN' - ) - account = forms.CharField( - max_length=30, - required=False, - label='Account number' - ) - portal_url = forms.URLField( - required=False, - label='Portal' - ) - noc_contact = forms.CharField( - required=False, - widget=SmallTextarea, - label='NOC contact' - ) - admin_contact = forms.CharField( - required=False, - widget=SmallTextarea, - label='Admin contact' - ) - comments = CommentField( - widget=SmallTextarea, - label='Comments' - ) - - class Meta: - nullable_fields = [ - 'asn', 'account', 'portal_url', 'noc_contact', 'admin_contact', 'comments', - ] - - -class ProviderFilterForm(BootstrapMixin, CustomFieldModelFilterForm): - model = Provider - field_groups = [ - ['q', 'tag'], - ['region_id', 'site_group_id', 'site_id'], - ['asn'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - region_id = DynamicModelMultipleChoiceField( - queryset=Region.objects.all(), - required=False, - label=_('Region'), - fetch_trigger='open' - ) - site_group_id = DynamicModelMultipleChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - label=_('Site group'), - fetch_trigger='open' - ) - site_id = DynamicModelMultipleChoiceField( - queryset=Site.objects.all(), - required=False, - query_params={ - 'region_id': '$region_id', - 'site_group_id': '$site_group_id', - }, - label=_('Site'), - fetch_trigger='open' - ) - asn = forms.IntegerField( - required=False, - label=_('ASN') - ) - tag = TagFilterField(model) - - -# -# Provider networks -# - -class ProviderNetworkForm(BootstrapMixin, CustomFieldModelForm): - provider = DynamicModelChoiceField( - queryset=Provider.objects.all() - ) - comments = CommentField() - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = ProviderNetwork - fields = [ - 'provider', 'name', 'description', 'comments', 'tags', - ] - fieldsets = ( - ('Provider Network', ('provider', 'name', 'description', 'tags')), - ) - - -class ProviderNetworkCSVForm(CustomFieldModelCSVForm): - provider = CSVModelChoiceField( - queryset=Provider.objects.all(), - to_field_name='name', - help_text='Assigned provider' - ) - - class Meta: - model = ProviderNetwork - fields = [ - 'provider', 'name', 'description', 'comments', - ] - - -class ProviderNetworkBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=ProviderNetwork.objects.all(), - widget=forms.MultipleHiddenInput - ) - provider = DynamicModelChoiceField( - queryset=Provider.objects.all(), - required=False - ) - description = forms.CharField( - max_length=100, - required=False - ) - comments = CommentField( - widget=SmallTextarea, - label='Comments' - ) - - class Meta: - nullable_fields = [ - 'description', 'comments', - ] - - -class ProviderNetworkFilterForm(BootstrapMixin, CustomFieldModelFilterForm): - model = ProviderNetwork - field_groups = ( - ('q', 'tag'), - ('provider_id',), - ) - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - provider_id = DynamicModelMultipleChoiceField( - queryset=Provider.objects.all(), - required=False, - label=_('Provider'), - fetch_trigger='open' - ) - tag = TagFilterField(model) - - -# -# Circuit types -# - -class CircuitTypeForm(BootstrapMixin, CustomFieldModelForm): - slug = SlugField() - - class Meta: - model = CircuitType - fields = [ - 'name', 'slug', 'description', - ] - - -class CircuitTypeBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=CircuitType.objects.all(), - widget=forms.MultipleHiddenInput - ) - description = forms.CharField( - max_length=200, - required=False - ) - - class Meta: - nullable_fields = ['description'] - - -class CircuitTypeCSVForm(CustomFieldModelCSVForm): - slug = SlugField() - - class Meta: - model = CircuitType - fields = ('name', 'slug', 'description') - help_texts = { - 'name': 'Name of circuit type', - } - - -class CircuitTypeFilterForm(BootstrapMixin, CustomFieldModelFilterForm): - model = CircuitType - field_groups = [ - ['q'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - - -# -# Circuits -# - -class CircuitForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): - provider = DynamicModelChoiceField( - queryset=Provider.objects.all() - ) - type = DynamicModelChoiceField( - queryset=CircuitType.objects.all() - ) - comments = CommentField() - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = Circuit - fields = [ - 'cid', 'type', 'provider', 'status', 'install_date', 'commit_rate', 'description', 'tenant_group', 'tenant', - 'comments', 'tags', - ] - fieldsets = ( - ('Circuit', ('provider', 'cid', 'type', 'status', 'install_date', 'commit_rate', 'description', 'tags')), - ('Tenancy', ('tenant_group', 'tenant')), - ) - help_texts = { - 'cid': "Unique circuit ID", - 'commit_rate': "Committed rate", - } - widgets = { - 'status': StaticSelect(), - 'install_date': DatePicker(), - 'commit_rate': SelectSpeedWidget(), - } - - -class CircuitCSVForm(CustomFieldModelCSVForm): - provider = CSVModelChoiceField( - queryset=Provider.objects.all(), - to_field_name='name', - help_text='Assigned provider' - ) - type = CSVModelChoiceField( - queryset=CircuitType.objects.all(), - to_field_name='name', - help_text='Type of circuit' - ) - status = CSVChoiceField( - choices=CircuitStatusChoices, - required=False, - help_text='Operational status' - ) - tenant = CSVModelChoiceField( - queryset=Tenant.objects.all(), - required=False, - to_field_name='name', - help_text='Assigned tenant' - ) - - class Meta: - model = Circuit - fields = [ - 'cid', 'provider', 'type', 'status', 'tenant', 'install_date', 'commit_rate', 'description', 'comments', - ] - - -class CircuitBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Circuit.objects.all(), - widget=forms.MultipleHiddenInput - ) - type = DynamicModelChoiceField( - queryset=CircuitType.objects.all(), - required=False - ) - provider = DynamicModelChoiceField( - queryset=Provider.objects.all(), - required=False - ) - status = forms.ChoiceField( - choices=add_blank_choice(CircuitStatusChoices), - required=False, - initial='', - widget=StaticSelect() - ) - tenant = DynamicModelChoiceField( - queryset=Tenant.objects.all(), - required=False - ) - commit_rate = forms.IntegerField( - required=False, - label='Commit rate (Kbps)' - ) - description = forms.CharField( - max_length=100, - required=False - ) - comments = CommentField( - widget=SmallTextarea, - label='Comments' - ) - - class Meta: - nullable_fields = [ - 'tenant', 'commit_rate', 'description', 'comments', - ] - - -class CircuitFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm): - model = Circuit - field_groups = [ - ['q', 'tag'], - ['provider_id', 'provider_network_id'], - ['type_id', 'status', 'commit_rate'], - ['region_id', 'site_group_id', 'site_id'], - ['tenant_group_id', 'tenant_id'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - type_id = DynamicModelMultipleChoiceField( - queryset=CircuitType.objects.all(), - required=False, - label=_('Type'), - fetch_trigger='open' - ) - provider_id = DynamicModelMultipleChoiceField( - queryset=Provider.objects.all(), - required=False, - label=_('Provider'), - fetch_trigger='open' - ) - provider_network_id = DynamicModelMultipleChoiceField( - queryset=ProviderNetwork.objects.all(), - required=False, - query_params={ - 'provider_id': '$provider_id' - }, - label=_('Provider network'), - fetch_trigger='open' - ) - status = forms.MultipleChoiceField( - choices=CircuitStatusChoices, - required=False, - widget=StaticSelectMultiple() - ) - region_id = DynamicModelMultipleChoiceField( - queryset=Region.objects.all(), - required=False, - label=_('Region'), - fetch_trigger='open' - ) - site_group_id = DynamicModelMultipleChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - label=_('Site group'), - fetch_trigger='open' - ) - site_id = DynamicModelMultipleChoiceField( - queryset=Site.objects.all(), - required=False, - query_params={ - 'region_id': '$region_id', - 'site_group_id': '$site_group_id', - }, - label=_('Site'), - fetch_trigger='open' - ) - commit_rate = forms.IntegerField( - required=False, - min_value=0, - label=_('Commit rate (Kbps)') - ) - tag = TagFilterField(model) - - -# -# Circuit terminations -# - -class CircuitTerminationForm(BootstrapMixin, forms.ModelForm): - region = DynamicModelChoiceField( - queryset=Region.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - } - ) - site_group = DynamicModelChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - } - ) - site = DynamicModelChoiceField( - queryset=Site.objects.all(), - query_params={ - 'region_id': '$region', - 'group_id': '$site_group', - }, - required=False - ) - provider_network = DynamicModelChoiceField( - queryset=ProviderNetwork.objects.all(), - required=False - ) - - class Meta: - model = CircuitTermination - fields = [ - 'term_side', 'region', 'site_group', 'site', 'provider_network', 'mark_connected', 'port_speed', - 'upstream_speed', 'xconnect_id', 'pp_info', 'description', - ] - help_texts = { - 'port_speed': "Physical circuit speed", - 'xconnect_id': "ID of the local cross-connect", - 'pp_info': "Patch panel ID and port number(s)" - } - widgets = { - 'term_side': forms.HiddenInput(), - 'port_speed': SelectSpeedWidget(), - 'upstream_speed': SelectSpeedWidget(), - } - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - self.fields['provider_network'].widget.add_query_param('provider_id', self.instance.circuit.provider_id) diff --git a/netbox/circuits/forms/__init__.py b/netbox/circuits/forms/__init__.py new file mode 100644 index 00000000000..5c23f833afb --- /dev/null +++ b/netbox/circuits/forms/__init__.py @@ -0,0 +1,4 @@ +from .bulk_edit import * +from .bulk_import import * +from .filtersets import * +from .models import * diff --git a/netbox/circuits/forms/bulk_edit.py b/netbox/circuits/forms/bulk_edit.py new file mode 100644 index 00000000000..638426a5e79 --- /dev/null +++ b/netbox/circuits/forms/bulk_edit.py @@ -0,0 +1,135 @@ +from django import forms + +from circuits.choices import CircuitStatusChoices +from circuits.models import * +from extras.forms import AddRemoveTagsForm, CustomFieldModelBulkEditForm +from tenancy.models import Tenant +from utilities.forms import ( + add_blank_choice, BootstrapMixin, CommentField, DynamicModelChoiceField, SmallTextarea, StaticSelect, +) + +__all__ = ( + 'CircuitBulkEditForm', + 'CircuitTypeBulkEditForm', + 'ProviderBulkEditForm', + 'ProviderNetworkBulkEditForm', +) + + +class ProviderBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=Provider.objects.all(), + widget=forms.MultipleHiddenInput + ) + asn = forms.IntegerField( + required=False, + label='ASN' + ) + account = forms.CharField( + max_length=30, + required=False, + label='Account number' + ) + portal_url = forms.URLField( + required=False, + label='Portal' + ) + noc_contact = forms.CharField( + required=False, + widget=SmallTextarea, + label='NOC contact' + ) + admin_contact = forms.CharField( + required=False, + widget=SmallTextarea, + label='Admin contact' + ) + comments = CommentField( + widget=SmallTextarea, + label='Comments' + ) + + class Meta: + nullable_fields = [ + 'asn', 'account', 'portal_url', 'noc_contact', 'admin_contact', 'comments', + ] + + +class ProviderNetworkBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=ProviderNetwork.objects.all(), + widget=forms.MultipleHiddenInput + ) + provider = DynamicModelChoiceField( + queryset=Provider.objects.all(), + required=False + ) + description = forms.CharField( + max_length=100, + required=False + ) + comments = CommentField( + widget=SmallTextarea, + label='Comments' + ) + + class Meta: + nullable_fields = [ + 'description', 'comments', + ] + + +class CircuitTypeBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=CircuitType.objects.all(), + widget=forms.MultipleHiddenInput + ) + description = forms.CharField( + max_length=200, + required=False + ) + + class Meta: + nullable_fields = ['description'] + + +class CircuitBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=Circuit.objects.all(), + widget=forms.MultipleHiddenInput + ) + type = DynamicModelChoiceField( + queryset=CircuitType.objects.all(), + required=False + ) + provider = DynamicModelChoiceField( + queryset=Provider.objects.all(), + required=False + ) + status = forms.ChoiceField( + choices=add_blank_choice(CircuitStatusChoices), + required=False, + initial='', + widget=StaticSelect() + ) + tenant = DynamicModelChoiceField( + queryset=Tenant.objects.all(), + required=False + ) + commit_rate = forms.IntegerField( + required=False, + label='Commit rate (Kbps)' + ) + description = forms.CharField( + max_length=100, + required=False + ) + comments = CommentField( + widget=SmallTextarea, + label='Comments' + ) + + class Meta: + nullable_fields = [ + 'tenant', 'commit_rate', 'description', 'comments', + ] diff --git a/netbox/circuits/forms/bulk_import.py b/netbox/circuits/forms/bulk_import.py new file mode 100644 index 00000000000..af5ec442597 --- /dev/null +++ b/netbox/circuits/forms/bulk_import.py @@ -0,0 +1,76 @@ +from circuits.choices import CircuitStatusChoices +from circuits.models import * +from extras.forms import CustomFieldModelCSVForm +from tenancy.models import Tenant +from utilities.forms import CSVChoiceField, CSVModelChoiceField, SlugField + +__all__ = ( + 'CircuitCSVForm', + 'CircuitTypeCSVForm', + 'ProviderCSVForm', + 'ProviderNetworkCSVForm', +) + + +class ProviderCSVForm(CustomFieldModelCSVForm): + slug = SlugField() + + class Meta: + model = Provider + fields = ( + 'name', 'slug', 'asn', 'account', 'portal_url', 'noc_contact', 'admin_contact', 'comments', + ) + + +class ProviderNetworkCSVForm(CustomFieldModelCSVForm): + provider = CSVModelChoiceField( + queryset=Provider.objects.all(), + to_field_name='name', + help_text='Assigned provider' + ) + + class Meta: + model = ProviderNetwork + fields = [ + 'provider', 'name', 'description', 'comments', + ] + + +class CircuitTypeCSVForm(CustomFieldModelCSVForm): + slug = SlugField() + + class Meta: + model = CircuitType + fields = ('name', 'slug', 'description') + help_texts = { + 'name': 'Name of circuit type', + } + + +class CircuitCSVForm(CustomFieldModelCSVForm): + provider = CSVModelChoiceField( + queryset=Provider.objects.all(), + to_field_name='name', + help_text='Assigned provider' + ) + type = CSVModelChoiceField( + queryset=CircuitType.objects.all(), + to_field_name='name', + help_text='Type of circuit' + ) + status = CSVChoiceField( + choices=CircuitStatusChoices, + help_text='Operational status' + ) + tenant = CSVModelChoiceField( + queryset=Tenant.objects.all(), + required=False, + to_field_name='name', + help_text='Assigned tenant' + ) + + class Meta: + model = Circuit + fields = [ + 'cid', 'provider', 'type', 'status', 'tenant', 'install_date', 'commit_rate', 'description', 'comments', + ] diff --git a/netbox/circuits/forms/filtersets.py b/netbox/circuits/forms/filtersets.py new file mode 100644 index 00000000000..63b65414883 --- /dev/null +++ b/netbox/circuits/forms/filtersets.py @@ -0,0 +1,159 @@ +from django import forms +from django.utils.translation import gettext as _ + +from circuits.choices import CircuitStatusChoices +from circuits.models import * +from dcim.models import Region, Site, SiteGroup +from extras.forms import CustomFieldModelFilterForm +from tenancy.forms import TenancyFilterForm +from utilities.forms import BootstrapMixin, DynamicModelMultipleChoiceField, StaticSelectMultiple, TagFilterField + +__all__ = ( + 'CircuitFilterForm', + 'CircuitTypeFilterForm', + 'ProviderFilterForm', + 'ProviderNetworkFilterForm', +) + + +class ProviderFilterForm(BootstrapMixin, CustomFieldModelFilterForm): + model = Provider + field_groups = [ + ['q', 'tag'], + ['region_id', 'site_group_id', 'site_id'], + ['asn'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + region_id = DynamicModelMultipleChoiceField( + queryset=Region.objects.all(), + required=False, + label=_('Region'), + fetch_trigger='open' + ) + site_group_id = DynamicModelMultipleChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + label=_('Site group'), + fetch_trigger='open' + ) + site_id = DynamicModelMultipleChoiceField( + queryset=Site.objects.all(), + required=False, + query_params={ + 'region_id': '$region_id', + 'site_group_id': '$site_group_id', + }, + label=_('Site'), + fetch_trigger='open' + ) + asn = forms.IntegerField( + required=False, + label=_('ASN') + ) + tag = TagFilterField(model) + + +class ProviderNetworkFilterForm(BootstrapMixin, CustomFieldModelFilterForm): + model = ProviderNetwork + field_groups = ( + ('q', 'tag'), + ('provider_id',), + ) + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + provider_id = DynamicModelMultipleChoiceField( + queryset=Provider.objects.all(), + required=False, + label=_('Provider'), + fetch_trigger='open' + ) + tag = TagFilterField(model) + + +class CircuitTypeFilterForm(BootstrapMixin, CustomFieldModelFilterForm): + model = CircuitType + field_groups = [ + ['q'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + + +class CircuitFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm): + model = Circuit + field_groups = [ + ['q', 'tag'], + ['provider_id', 'provider_network_id'], + ['type_id', 'status', 'commit_rate'], + ['region_id', 'site_group_id', 'site_id'], + ['tenant_group_id', 'tenant_id'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + type_id = DynamicModelMultipleChoiceField( + queryset=CircuitType.objects.all(), + required=False, + label=_('Type'), + fetch_trigger='open' + ) + provider_id = DynamicModelMultipleChoiceField( + queryset=Provider.objects.all(), + required=False, + label=_('Provider'), + fetch_trigger='open' + ) + provider_network_id = DynamicModelMultipleChoiceField( + queryset=ProviderNetwork.objects.all(), + required=False, + query_params={ + 'provider_id': '$provider_id' + }, + label=_('Provider network'), + fetch_trigger='open' + ) + status = forms.MultipleChoiceField( + choices=CircuitStatusChoices, + required=False, + widget=StaticSelectMultiple() + ) + region_id = DynamicModelMultipleChoiceField( + queryset=Region.objects.all(), + required=False, + label=_('Region'), + fetch_trigger='open' + ) + site_group_id = DynamicModelMultipleChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + label=_('Site group'), + fetch_trigger='open' + ) + site_id = DynamicModelMultipleChoiceField( + queryset=Site.objects.all(), + required=False, + query_params={ + 'region_id': '$region_id', + 'site_group_id': '$site_group_id', + }, + label=_('Site'), + fetch_trigger='open' + ) + commit_rate = forms.IntegerField( + required=False, + min_value=0, + label=_('Commit rate (Kbps)') + ) + tag = TagFilterField(model) diff --git a/netbox/circuits/forms/models.py b/netbox/circuits/forms/models.py new file mode 100644 index 00000000000..6599392934e --- /dev/null +++ b/netbox/circuits/forms/models.py @@ -0,0 +1,168 @@ +from django import forms + +from circuits.models import * +from dcim.models import Region, Site, SiteGroup +from extras.forms import CustomFieldModelForm +from extras.models import Tag +from tenancy.forms import TenancyForm +from utilities.forms import ( + BootstrapMixin, CommentField, DatePicker, DynamicModelChoiceField, DynamicModelMultipleChoiceField, + SelectSpeedWidget, SmallTextarea, SlugField, StaticSelect, +) + +__all__ = ( + 'CircuitForm', + 'CircuitTerminationForm', + 'CircuitTypeForm', + 'ProviderForm', + 'ProviderNetworkForm', +) + + +class ProviderForm(BootstrapMixin, CustomFieldModelForm): + slug = SlugField() + comments = CommentField() + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = Provider + fields = [ + 'name', 'slug', 'asn', 'account', 'portal_url', 'noc_contact', 'admin_contact', 'comments', 'tags', + ] + fieldsets = ( + ('Provider', ('name', 'slug', 'asn', 'tags')), + ('Support Info', ('account', 'portal_url', 'noc_contact', 'admin_contact')), + ) + widgets = { + 'noc_contact': SmallTextarea( + attrs={'rows': 5} + ), + 'admin_contact': SmallTextarea( + attrs={'rows': 5} + ), + } + help_texts = { + 'name': "Full name of the provider", + 'asn': "BGP autonomous system number (if applicable)", + 'portal_url': "URL of the provider's customer support portal", + 'noc_contact': "NOC email address and phone number", + 'admin_contact': "Administrative contact email address and phone number", + } + + +class ProviderNetworkForm(BootstrapMixin, CustomFieldModelForm): + provider = DynamicModelChoiceField( + queryset=Provider.objects.all() + ) + comments = CommentField() + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = ProviderNetwork + fields = [ + 'provider', 'name', 'description', 'comments', 'tags', + ] + fieldsets = ( + ('Provider Network', ('provider', 'name', 'description', 'tags')), + ) + + +class CircuitTypeForm(BootstrapMixin, CustomFieldModelForm): + slug = SlugField() + + class Meta: + model = CircuitType + fields = [ + 'name', 'slug', 'description', + ] + + +class CircuitForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): + provider = DynamicModelChoiceField( + queryset=Provider.objects.all() + ) + type = DynamicModelChoiceField( + queryset=CircuitType.objects.all() + ) + comments = CommentField() + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = Circuit + fields = [ + 'cid', 'type', 'provider', 'status', 'install_date', 'commit_rate', 'description', 'tenant_group', 'tenant', + 'comments', 'tags', + ] + fieldsets = ( + ('Circuit', ('provider', 'cid', 'type', 'status', 'install_date', 'commit_rate', 'description', 'tags')), + ('Tenancy', ('tenant_group', 'tenant')), + ) + help_texts = { + 'cid': "Unique circuit ID", + 'commit_rate': "Committed rate", + } + widgets = { + 'status': StaticSelect(), + 'install_date': DatePicker(), + 'commit_rate': SelectSpeedWidget(), + } + + +class CircuitTerminationForm(BootstrapMixin, forms.ModelForm): + region = DynamicModelChoiceField( + queryset=Region.objects.all(), + required=False, + initial_params={ + 'sites': '$site' + } + ) + site_group = DynamicModelChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + initial_params={ + 'sites': '$site' + } + ) + site = DynamicModelChoiceField( + queryset=Site.objects.all(), + query_params={ + 'region_id': '$region', + 'group_id': '$site_group', + }, + required=False + ) + provider_network = DynamicModelChoiceField( + queryset=ProviderNetwork.objects.all(), + required=False + ) + + class Meta: + model = CircuitTermination + fields = [ + 'term_side', 'region', 'site_group', 'site', 'provider_network', 'mark_connected', 'port_speed', + 'upstream_speed', 'xconnect_id', 'pp_info', 'description', + ] + help_texts = { + 'port_speed': "Physical circuit speed", + 'xconnect_id': "ID of the local cross-connect", + 'pp_info': "Patch panel ID and port number(s)" + } + widgets = { + 'term_side': forms.HiddenInput(), + 'port_speed': SelectSpeedWidget(), + 'upstream_speed': SelectSpeedWidget(), + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + self.fields['provider_network'].widget.add_query_param('provider_id', self.instance.circuit.provider_id) diff --git a/netbox/circuits/tests/test_views.py b/netbox/circuits/tests/test_views.py index b6401b2fabd..ccb4a869a3a 100644 --- a/netbox/circuits/tests/test_views.py +++ b/netbox/circuits/tests/test_views.py @@ -122,10 +122,10 @@ class CircuitTestCase(ViewTestCases.PrimaryObjectViewTestCase): } cls.csv_data = ( - "cid,provider,type", - "Circuit 4,Provider 1,Circuit Type 1", - "Circuit 5,Provider 1,Circuit Type 1", - "Circuit 6,Provider 1,Circuit Type 1", + "cid,provider,type,status", + "Circuit 4,Provider 1,Circuit Type 1,active", + "Circuit 5,Provider 1,Circuit Type 1,active", + "Circuit 6,Provider 1,Circuit Type 1,active", ) cls.bulk_edit_data = { diff --git a/netbox/dcim/choices.py b/netbox/dcim/choices.py index df0b1651b2a..f8fbab86bad 100644 --- a/netbox/dcim/choices.py +++ b/netbox/dcim/choices.py @@ -316,6 +316,7 @@ class PowerPortTypeChoices(ChoiceSet): TYPE_CS8365C = 'cs8365c' TYPE_CS8465C = 'cs8465c' # ITA/international + TYPE_ITA_C = 'ita-c' TYPE_ITA_E = 'ita-e' TYPE_ITA_F = 'ita-f' TYPE_ITA_EF = 'ita-ef' @@ -421,6 +422,7 @@ class PowerPortTypeChoices(ChoiceSet): (TYPE_CS8465C, 'CS8465C'), )), ('International/ITA', ( + (TYPE_ITA_C, 'ITA Type C (CEE 7/16)'), (TYPE_ITA_E, 'ITA Type E (CEE 7/5)'), (TYPE_ITA_F, 'ITA Type F (CEE 7/4)'), (TYPE_ITA_EF, 'ITA Type E/F (CEE 7/7)'), @@ -967,6 +969,8 @@ class PortTypeChoices(ChoiceSet): TYPE_SPLICE = 'splice' TYPE_CS = 'cs' TYPE_SN = 'sn' + TYPE_SMA_905 = 'sma-905' + TYPE_SMA_906 = 'sma-906' TYPE_URM_P2 = 'urm-p2' TYPE_URM_P4 = 'urm-p4' TYPE_URM_P8 = 'urm-p8' @@ -1010,6 +1014,8 @@ class PortTypeChoices(ChoiceSet): (TYPE_ST, 'ST'), (TYPE_CS, 'CS'), (TYPE_SN, 'SN'), + (TYPE_SMA_905, 'SMA 905'), + (TYPE_SMA_906, 'SMA 906'), (TYPE_URM_P2, 'URM-P2'), (TYPE_URM_P4, 'URM-P4'), (TYPE_URM_P8, 'URM-P8'), diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py deleted file mode 100644 index 56c0f046beb..00000000000 --- a/netbox/dcim/forms.py +++ /dev/null @@ -1,5527 +0,0 @@ -import re - -from django import forms -from django.contrib.auth.models import User -from django.contrib.contenttypes.models import ContentType -from django.contrib.postgres.forms.array import SimpleArrayField -from django.core.exceptions import ObjectDoesNotExist -from django.utils.safestring import mark_safe -from django.utils.translation import gettext as _ -from netaddr import EUI -from netaddr.core import AddrFormatError -from timezone_field import TimeZoneFormField - -from circuits.models import Circuit, CircuitTermination, Provider -from extras.forms import ( - AddRemoveTagsForm, CustomFieldModelBulkEditForm, CustomFieldModelCSVForm, CustomFieldModelFilterForm, CustomFieldModelForm, - CustomFieldsMixin, LocalConfigContextFilterForm, -) -from extras.models import Tag -from ipam.constants import BGP_ASN_MAX, BGP_ASN_MIN -from ipam.models import IPAddress, VLAN, VLANGroup -from tenancy.forms import TenancyFilterForm, TenancyForm -from tenancy.models import Tenant -from utilities.forms import ( - APISelect, APISelectMultiple, add_blank_choice, BootstrapMixin, BulkEditForm, BulkEditNullBooleanSelect, - ClearableFileInput, ColorField, CommentField, CSVChoiceField, CSVContentTypeField, CSVModelChoiceField, - CSVTypedChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, ExpandableNameField, form_from_model, - JSONField, NumericArrayField, SelectWithPK, SmallTextarea, SlugField, StaticSelect, StaticSelectMultiple, - TagFilterField, BOOLEAN_WITH_BLANK_CHOICES, -) -from virtualization.models import Cluster, ClusterGroup -from .choices import * -from .constants import * -from .models import * - -DEVICE_BY_PK_RE = r'{\d+\}' - -INTERFACE_MODE_HELP_TEXT = """ -Access: One untagged VLAN
-Tagged: One untagged VLAN and/or one or more tagged VLANs
-Tagged (All): Implies all VLANs are available (w/optional untagged VLAN) -""" - - -def get_device_by_name_or_pk(name): - """ - Attempt to retrieve a device by either its name or primary key ('{pk}'). - """ - if re.match(DEVICE_BY_PK_RE, name): - pk = name.strip('{}') - device = Device.objects.get(pk=pk) - else: - device = Device.objects.get(name=name) - return device - - -class DeviceComponentFilterForm(BootstrapMixin, CustomFieldModelFilterForm): - field_order = [ - 'q', 'name', 'label', 'region_id', 'site_group_id', 'site_id', - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - name = forms.CharField( - required=False - ) - label = forms.CharField( - required=False - ) - region_id = DynamicModelMultipleChoiceField( - queryset=Region.objects.all(), - required=False, - label=_('Region'), - fetch_trigger='open' - ) - site_group_id = DynamicModelMultipleChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - label=_('Site group'), - fetch_trigger='open' - ) - site_id = DynamicModelMultipleChoiceField( - queryset=Site.objects.all(), - required=False, - query_params={ - 'region_id': '$region_id', - 'group_id': '$site_group_id', - }, - label=_('Site'), - fetch_trigger='open' - ) - location_id = DynamicModelMultipleChoiceField( - queryset=Location.objects.all(), - required=False, - query_params={ - 'site_id': '$site_id', - }, - label=_('Location'), - fetch_trigger='open' - ) - device_id = DynamicModelMultipleChoiceField( - queryset=Device.objects.all(), - required=False, - query_params={ - 'site_id': '$site_id', - 'location_id': '$location_id', - }, - label=_('Device'), - fetch_trigger='open' - ) - - -class InterfaceCommonForm(forms.Form): - mac_address = forms.CharField( - empty_value=None, - required=False, - label='MAC address' - ) - mtu = forms.IntegerField( - required=False, - min_value=INTERFACE_MTU_MIN, - max_value=INTERFACE_MTU_MAX, - label='MTU' - ) - - def clean(self): - super().clean() - - parent_field = 'device' if 'device' in self.cleaned_data else 'virtual_machine' - tagged_vlans = self.cleaned_data.get('tagged_vlans') - - # Untagged interfaces cannot be assigned tagged VLANs - if self.cleaned_data['mode'] == InterfaceModeChoices.MODE_ACCESS and tagged_vlans: - raise forms.ValidationError({ - 'mode': "An access interface cannot have tagged VLANs assigned." - }) - - # Remove all tagged VLAN assignments from "tagged all" interfaces - elif self.cleaned_data['mode'] == InterfaceModeChoices.MODE_TAGGED_ALL: - self.cleaned_data['tagged_vlans'] = [] - - # Validate tagged VLANs; must be a global VLAN or in the same site - elif self.cleaned_data['mode'] == InterfaceModeChoices.MODE_TAGGED and tagged_vlans: - valid_sites = [None, self.cleaned_data[parent_field].site] - invalid_vlans = [str(v) for v in tagged_vlans if v.site not in valid_sites] - - if invalid_vlans: - raise forms.ValidationError({ - 'tagged_vlans': f"The tagged VLANs ({', '.join(invalid_vlans)}) must belong to the same site as " - f"the interface's parent device/VM, or they must be global" - }) - - -class ComponentForm(forms.Form): - """ - Subclass this form when facilitating the creation of one or more device component or component templates based on - a name pattern. - """ - name_pattern = ExpandableNameField( - label='Name' - ) - label_pattern = ExpandableNameField( - label='Label', - required=False, - help_text='Alphanumeric ranges are supported. (Must match the number of names being created.)' - ) - - def clean(self): - super().clean() - - # Validate that the number of components being created from both the name_pattern and label_pattern are equal - if self.cleaned_data['label_pattern']: - name_pattern_count = len(self.cleaned_data['name_pattern']) - label_pattern_count = len(self.cleaned_data['label_pattern']) - if name_pattern_count != label_pattern_count: - raise forms.ValidationError({ - 'label_pattern': f'The provided name pattern will create {name_pattern_count} components, however ' - f'{label_pattern_count} labels will be generated. These counts must match.' - }, code='label_pattern_mismatch') - - -# -# Fields -# - -class MACAddressField(forms.Field): - widget = forms.CharField - default_error_messages = { - 'invalid': 'MAC address must be in EUI-48 format', - } - - def to_python(self, value): - value = super().to_python(value) - - # Validate MAC address format - try: - value = EUI(value.strip()) - except AddrFormatError: - raise forms.ValidationError(self.error_messages['invalid'], code='invalid') - - return value - - -# -# Regions -# - -class RegionForm(BootstrapMixin, CustomFieldModelForm): - parent = DynamicModelChoiceField( - queryset=Region.objects.all(), - required=False - ) - slug = SlugField() - - class Meta: - model = Region - fields = ( - 'parent', 'name', 'slug', 'description', - ) - - -class RegionCSVForm(CustomFieldModelCSVForm): - parent = CSVModelChoiceField( - queryset=Region.objects.all(), - required=False, - to_field_name='name', - help_text='Name of parent region' - ) - - class Meta: - model = Region - fields = ('name', 'slug', 'parent', 'description') - - -class RegionBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Region.objects.all(), - widget=forms.MultipleHiddenInput - ) - parent = DynamicModelChoiceField( - queryset=Region.objects.all(), - required=False - ) - description = forms.CharField( - max_length=200, - required=False - ) - - class Meta: - nullable_fields = ['parent', 'description'] - - -class RegionFilterForm(BootstrapMixin, CustomFieldModelFilterForm): - model = Region - field_groups = [ - ['q'], - ['parent_id'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - parent_id = DynamicModelMultipleChoiceField( - queryset=Region.objects.all(), - required=False, - label=_('Parent region'), - fetch_trigger='open' - ) - - -# -# Site groups -# - -class SiteGroupForm(BootstrapMixin, CustomFieldModelForm): - parent = DynamicModelChoiceField( - queryset=SiteGroup.objects.all(), - required=False - ) - slug = SlugField() - - class Meta: - model = SiteGroup - fields = ( - 'parent', 'name', 'slug', 'description', - ) - - -class SiteGroupCSVForm(CustomFieldModelCSVForm): - parent = CSVModelChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - to_field_name='name', - help_text='Name of parent site group' - ) - - class Meta: - model = SiteGroup - fields = ('name', 'slug', 'parent', 'description') - - -class SiteGroupBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=SiteGroup.objects.all(), - widget=forms.MultipleHiddenInput - ) - parent = DynamicModelChoiceField( - queryset=SiteGroup.objects.all(), - required=False - ) - description = forms.CharField( - max_length=200, - required=False - ) - - class Meta: - nullable_fields = ['parent', 'description'] - - -class SiteGroupFilterForm(BootstrapMixin, CustomFieldModelFilterForm): - model = SiteGroup - field_groups = [ - ['q'], - ['parent_id'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - parent_id = DynamicModelMultipleChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - label=_('Parent group'), - fetch_trigger='open' - ) - - -# -# Sites -# - -class SiteForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): - region = DynamicModelChoiceField( - queryset=Region.objects.all(), - required=False - ) - group = DynamicModelChoiceField( - queryset=SiteGroup.objects.all(), - required=False - ) - slug = SlugField() - time_zone = TimeZoneFormField( - choices=add_blank_choice(TimeZoneFormField().choices), - required=False, - widget=StaticSelect() - ) - comments = CommentField() - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = Site - fields = [ - 'name', 'slug', 'status', 'region', 'group', 'tenant_group', 'tenant', 'facility', 'asn', 'time_zone', - 'description', 'physical_address', 'shipping_address', 'latitude', 'longitude', 'contact_name', - 'contact_phone', 'contact_email', 'comments', 'tags', - ] - fieldsets = ( - ('Site', ( - 'name', 'slug', 'status', 'region', 'group', 'facility', 'asn', 'time_zone', 'description', 'tags', - )), - ('Tenancy', ('tenant_group', 'tenant')), - ('Contact Info', ( - 'physical_address', 'shipping_address', 'latitude', 'longitude', 'contact_name', 'contact_phone', - 'contact_email', - )), - ) - widgets = { - 'physical_address': SmallTextarea( - attrs={ - 'rows': 3, - } - ), - 'shipping_address': SmallTextarea( - attrs={ - 'rows': 3, - } - ), - 'status': StaticSelect(), - 'time_zone': StaticSelect(), - } - help_texts = { - 'name': "Full name of the site", - 'facility': "Data center provider and facility (e.g. Equinix NY7)", - 'asn': "BGP autonomous system number", - 'time_zone': "Local time zone", - 'description': "Short description (will appear in sites list)", - 'physical_address': "Physical location of the building (e.g. for GPS)", - 'shipping_address': "If different from the physical address", - 'latitude': "Latitude in decimal format (xx.yyyyyy)", - 'longitude': "Longitude in decimal format (xx.yyyyyy)" - } - - -class SiteCSVForm(CustomFieldModelCSVForm): - status = CSVChoiceField( - choices=SiteStatusChoices, - required=False, - help_text='Operational status' - ) - region = CSVModelChoiceField( - queryset=Region.objects.all(), - required=False, - to_field_name='name', - help_text='Assigned region' - ) - group = CSVModelChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - to_field_name='name', - help_text='Assigned group' - ) - tenant = CSVModelChoiceField( - queryset=Tenant.objects.all(), - required=False, - to_field_name='name', - help_text='Assigned tenant' - ) - - class Meta: - model = Site - fields = ( - 'name', 'slug', 'status', 'region', 'group', 'tenant', 'facility', 'asn', 'time_zone', 'description', - 'physical_address', 'shipping_address', 'latitude', 'longitude', 'contact_name', 'contact_phone', - 'contact_email', 'comments', - ) - help_texts = { - 'time_zone': mark_safe( - 'Time zone (available options)' - ) - } - - -class SiteBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Site.objects.all(), - widget=forms.MultipleHiddenInput - ) - status = forms.ChoiceField( - choices=add_blank_choice(SiteStatusChoices), - required=False, - initial='', - widget=StaticSelect() - ) - region = DynamicModelChoiceField( - queryset=Region.objects.all(), - required=False - ) - group = DynamicModelChoiceField( - queryset=SiteGroup.objects.all(), - required=False - ) - tenant = DynamicModelChoiceField( - queryset=Tenant.objects.all(), - required=False - ) - asn = forms.IntegerField( - min_value=BGP_ASN_MIN, - max_value=BGP_ASN_MAX, - required=False, - label='ASN' - ) - description = forms.CharField( - max_length=100, - required=False - ) - time_zone = TimeZoneFormField( - choices=add_blank_choice(TimeZoneFormField().choices), - required=False, - widget=StaticSelect() - ) - - class Meta: - nullable_fields = [ - 'region', 'group', 'tenant', 'asn', 'description', 'time_zone', - ] - - -class SiteFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm): - model = Site - field_order = ['q', 'status', 'region_id', 'tenant_group_id', 'tenant_id'] - field_groups = [ - ['q', 'tag'], - ['status', 'region_id', 'group_id'], - ['tenant_group_id', 'tenant_id'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - status = forms.MultipleChoiceField( - choices=SiteStatusChoices, - required=False, - widget=StaticSelectMultiple(), - ) - region_id = DynamicModelMultipleChoiceField( - queryset=Region.objects.all(), - required=False, - label=_('Region'), - fetch_trigger='open' - ) - group_id = DynamicModelMultipleChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - label=_('Site group'), - fetch_trigger='open' - ) - tag = TagFilterField(model) - - -# -# Locations -# - -class LocationForm(BootstrapMixin, CustomFieldModelForm): - region = DynamicModelChoiceField( - queryset=Region.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - } - ) - site_group = DynamicModelChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - } - ) - site = DynamicModelChoiceField( - queryset=Site.objects.all(), - query_params={ - 'region_id': '$region', - 'group_id': '$site_group', - } - ) - parent = DynamicModelChoiceField( - queryset=Location.objects.all(), - required=False, - query_params={ - 'site_id': '$site' - } - ) - slug = SlugField() - - class Meta: - model = Location - fields = ( - 'region', 'site_group', 'site', 'parent', 'name', 'slug', 'description', - ) - - -class LocationCSVForm(CustomFieldModelCSVForm): - site = CSVModelChoiceField( - queryset=Site.objects.all(), - to_field_name='name', - help_text='Assigned site' - ) - parent = CSVModelChoiceField( - queryset=Location.objects.all(), - required=False, - to_field_name='name', - help_text='Parent location', - error_messages={ - 'invalid_choice': 'Location not found.', - } - ) - - class Meta: - model = Location - fields = ('site', 'parent', 'name', 'slug', 'description') - - -class LocationBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Location.objects.all(), - widget=forms.MultipleHiddenInput - ) - site = DynamicModelChoiceField( - queryset=Site.objects.all(), - required=False - ) - parent = DynamicModelChoiceField( - queryset=Location.objects.all(), - required=False, - query_params={ - 'site_id': '$site' - } - ) - description = forms.CharField( - max_length=200, - required=False - ) - - class Meta: - nullable_fields = ['parent', 'description'] - - -class LocationFilterForm(BootstrapMixin, CustomFieldModelFilterForm): - model = Location - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - region_id = DynamicModelMultipleChoiceField( - queryset=Region.objects.all(), - required=False, - label=_('Region'), - fetch_trigger='open' - ) - site_group_id = DynamicModelMultipleChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - label=_('Site group'), - fetch_trigger='open' - ) - site_id = DynamicModelMultipleChoiceField( - queryset=Site.objects.all(), - required=False, - query_params={ - 'region_id': '$region_id', - 'group_id': '$site_group_id', - }, - label=_('Site'), - fetch_trigger='open' - ) - parent_id = DynamicModelMultipleChoiceField( - queryset=Location.objects.all(), - required=False, - query_params={ - 'region_id': '$region_id', - 'site_id': '$site_id', - }, - label=_('Parent'), - fetch_trigger='open' - ) - - -# -# Rack roles -# - -class RackRoleForm(BootstrapMixin, CustomFieldModelForm): - slug = SlugField() - - class Meta: - model = RackRole - fields = [ - 'name', 'slug', 'color', 'description', - ] - - -class RackRoleCSVForm(CustomFieldModelCSVForm): - slug = SlugField() - - class Meta: - model = RackRole - fields = ('name', 'slug', 'color', 'description') - help_texts = { - 'color': mark_safe('RGB color in hexadecimal (e.g. 00ff00)'), - } - - -class RackRoleBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=RackRole.objects.all(), - widget=forms.MultipleHiddenInput - ) - color = ColorField( - required=False - ) - description = forms.CharField( - max_length=200, - required=False - ) - - class Meta: - nullable_fields = ['color', 'description'] - - -class RackRoleFilterForm(BootstrapMixin, CustomFieldModelFilterForm): - model = RackRole - field_groups = [ - ['q'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - - -# -# Racks -# - -class RackForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): - region = DynamicModelChoiceField( - queryset=Region.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - } - ) - site_group = DynamicModelChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - } - ) - site = DynamicModelChoiceField( - queryset=Site.objects.all(), - query_params={ - 'region_id': '$region', - 'group_id': '$site_group', - } - ) - location = DynamicModelChoiceField( - queryset=Location.objects.all(), - required=False, - query_params={ - 'site_id': '$site' - } - ) - role = DynamicModelChoiceField( - queryset=RackRole.objects.all(), - required=False - ) - comments = CommentField() - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = Rack - fields = [ - 'region', 'site_group', 'site', 'location', 'name', 'facility_id', 'tenant_group', 'tenant', 'status', - 'role', 'serial', 'asset_tag', 'type', 'width', 'u_height', 'desc_units', 'outer_width', 'outer_depth', - 'outer_unit', 'comments', 'tags', - ] - help_texts = { - 'site': "The site at which the rack exists", - 'name': "Organizational rack name", - 'facility_id': "The unique rack ID assigned by the facility", - 'u_height': "Height in rack units", - } - widgets = { - 'status': StaticSelect(), - 'type': StaticSelect(), - 'width': StaticSelect(), - 'outer_unit': StaticSelect(), - } - - -class RackCSVForm(CustomFieldModelCSVForm): - site = CSVModelChoiceField( - queryset=Site.objects.all(), - to_field_name='name' - ) - location = CSVModelChoiceField( - queryset=Location.objects.all(), - required=False, - to_field_name='name' - ) - tenant = CSVModelChoiceField( - queryset=Tenant.objects.all(), - required=False, - to_field_name='name', - help_text='Name of assigned tenant' - ) - status = CSVChoiceField( - choices=RackStatusChoices, - required=False, - help_text='Operational status' - ) - role = CSVModelChoiceField( - queryset=RackRole.objects.all(), - required=False, - to_field_name='name', - help_text='Name of assigned role' - ) - type = CSVChoiceField( - choices=RackTypeChoices, - required=False, - help_text='Rack type' - ) - width = forms.ChoiceField( - choices=RackWidthChoices, - help_text='Rail-to-rail width (in inches)' - ) - outer_unit = CSVChoiceField( - choices=RackDimensionUnitChoices, - required=False, - help_text='Unit for outer dimensions' - ) - - class Meta: - model = Rack - fields = ( - 'site', 'location', 'name', 'facility_id', 'tenant', 'status', 'role', 'type', 'serial', 'asset_tag', - 'width', 'u_height', 'desc_units', 'outer_width', 'outer_depth', 'outer_unit', 'comments', - ) - - def __init__(self, data=None, *args, **kwargs): - super().__init__(data, *args, **kwargs) - - if data: - - # Limit location queryset by assigned site - params = {f"site__{self.fields['site'].to_field_name}": data.get('site')} - self.fields['location'].queryset = self.fields['location'].queryset.filter(**params) - - -class RackBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Rack.objects.all(), - widget=forms.MultipleHiddenInput - ) - region = DynamicModelChoiceField( - queryset=Region.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - } - ) - site_group = DynamicModelChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - } - ) - site = DynamicModelChoiceField( - queryset=Site.objects.all(), - required=False, - query_params={ - 'region_id': '$region', - 'group_id': '$site_group', - } - ) - location = DynamicModelChoiceField( - queryset=Location.objects.all(), - required=False, - query_params={ - 'site_id': '$site' - } - ) - tenant = DynamicModelChoiceField( - queryset=Tenant.objects.all(), - required=False - ) - status = forms.ChoiceField( - choices=add_blank_choice(RackStatusChoices), - required=False, - initial='', - widget=StaticSelect() - ) - role = DynamicModelChoiceField( - queryset=RackRole.objects.all(), - required=False - ) - serial = forms.CharField( - max_length=50, - required=False, - label='Serial Number' - ) - asset_tag = forms.CharField( - max_length=50, - required=False - ) - type = forms.ChoiceField( - choices=add_blank_choice(RackTypeChoices), - required=False, - widget=StaticSelect() - ) - width = forms.ChoiceField( - choices=add_blank_choice(RackWidthChoices), - required=False, - widget=StaticSelect() - ) - u_height = forms.IntegerField( - required=False, - label='Height (U)' - ) - desc_units = forms.NullBooleanField( - required=False, - widget=BulkEditNullBooleanSelect, - label='Descending units' - ) - outer_width = forms.IntegerField( - required=False, - min_value=1 - ) - outer_depth = forms.IntegerField( - required=False, - min_value=1 - ) - outer_unit = forms.ChoiceField( - choices=add_blank_choice(RackDimensionUnitChoices), - required=False, - widget=StaticSelect() - ) - comments = CommentField( - widget=SmallTextarea, - label='Comments' - ) - - class Meta: - nullable_fields = [ - 'location', 'tenant', 'role', 'serial', 'asset_tag', 'outer_width', 'outer_depth', 'outer_unit', 'comments', - ] - - -class RackFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm): - model = Rack - field_order = ['q', 'region_id', 'site_id', 'location_id', 'status', 'role_id', 'tenant_group_id', 'tenant_id'] - field_groups = [ - ['q', 'tag'], - ['region_id', 'site_id', 'location_id'], - ['status', 'role_id'], - ['type', 'width', 'asset_tag'], - ['tenant_group_id', 'tenant_id'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - region_id = DynamicModelMultipleChoiceField( - queryset=Region.objects.all(), - required=False, - label=_('Region'), - fetch_trigger='open' - ) - site_id = DynamicModelMultipleChoiceField( - queryset=Site.objects.all(), - required=False, - query_params={ - 'region_id': '$region_id' - }, - label=_('Site'), - fetch_trigger='open' - ) - location_id = DynamicModelMultipleChoiceField( - queryset=Location.objects.all(), - required=False, - null_option='None', - query_params={ - 'site_id': '$site_id' - }, - label=_('Location'), - fetch_trigger='open' - ) - status = forms.MultipleChoiceField( - choices=RackStatusChoices, - required=False, - widget=StaticSelectMultiple() - ) - type = forms.MultipleChoiceField( - choices=RackTypeChoices, - required=False, - widget=StaticSelectMultiple() - ) - width = forms.MultipleChoiceField( - choices=RackWidthChoices, - required=False, - widget=StaticSelectMultiple() - ) - role_id = DynamicModelMultipleChoiceField( - queryset=RackRole.objects.all(), - required=False, - null_option='None', - label=_('Role'), - fetch_trigger='open' - ) - asset_tag = forms.CharField( - required=False - ) - tag = TagFilterField(model) - - -# -# Rack elevations -# - -class RackElevationFilterForm(RackFilterForm): - field_order = [ - 'q', 'region_id', 'site_id', 'location_id', 'id', 'status', 'role_id', 'tenant_group_id', - 'tenant_id', - ] - id = DynamicModelMultipleChoiceField( - queryset=Rack.objects.all(), - label=_('Rack'), - required=False, - query_params={ - 'site_id': '$site_id', - 'location_id': '$location_id', - }, - fetch_trigger='open' - ) - - -# -# Rack reservations -# - -class RackReservationForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): - region = DynamicModelChoiceField( - queryset=Region.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - }, - fetch_trigger='open' - ) - site_group = DynamicModelChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - }, - fetch_trigger='open' - ) - site = DynamicModelChoiceField( - queryset=Site.objects.all(), - required=False, - query_params={ - 'region_id': '$region', - 'group_id': '$site_group', - }, - fetch_trigger='open' - ) - location = DynamicModelChoiceField( - queryset=Location.objects.all(), - required=False, - query_params={ - 'site_id': '$site' - }, - fetch_trigger='open' - ) - rack = DynamicModelChoiceField( - queryset=Rack.objects.all(), - query_params={ - 'site_id': '$site', - 'location_id': '$location', - }, - fetch_trigger='open' - ) - units = NumericArrayField( - base_field=forms.IntegerField(), - help_text="Comma-separated list of numeric unit IDs. A range may be specified using a hyphen." - ) - user = forms.ModelChoiceField( - queryset=User.objects.order_by( - 'username' - ), - widget=StaticSelect() - ) - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False, - fetch_trigger='open' - ) - - class Meta: - model = RackReservation - fields = [ - 'region', 'site_group', 'site', 'location', 'rack', 'units', 'user', 'tenant_group', 'tenant', - 'description', 'tags', - ] - fieldsets = ( - ('Reservation', ('region', 'site', 'location', 'rack', 'units', 'user', 'description', 'tags')), - ('Tenancy', ('tenant_group', 'tenant')), - ) - - -class RackReservationCSVForm(CustomFieldModelCSVForm): - site = CSVModelChoiceField( - queryset=Site.objects.all(), - to_field_name='name', - help_text='Parent site' - ) - location = CSVModelChoiceField( - queryset=Location.objects.all(), - to_field_name='name', - required=False, - help_text="Rack's location (if any)" - ) - rack = CSVModelChoiceField( - queryset=Rack.objects.all(), - to_field_name='name', - help_text='Rack' - ) - units = SimpleArrayField( - base_field=forms.IntegerField(), - required=True, - help_text='Comma-separated list of individual unit numbers' - ) - tenant = CSVModelChoiceField( - queryset=Tenant.objects.all(), - required=False, - to_field_name='name', - help_text='Assigned tenant' - ) - - class Meta: - model = RackReservation - fields = ('site', 'location', 'rack', 'units', 'tenant', 'description') - - def __init__(self, data=None, *args, **kwargs): - super().__init__(data, *args, **kwargs) - - if data: - - # Limit location queryset by assigned site - params = {f"site__{self.fields['site'].to_field_name}": data.get('site')} - self.fields['location'].queryset = self.fields['location'].queryset.filter(**params) - - # Limit rack queryset by assigned site and group - params = { - f"site__{self.fields['site'].to_field_name}": data.get('site'), - f"location__{self.fields['location'].to_field_name}": data.get('location'), - } - self.fields['rack'].queryset = self.fields['rack'].queryset.filter(**params) - - -class RackReservationBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=RackReservation.objects.all(), - widget=forms.MultipleHiddenInput() - ) - user = forms.ModelChoiceField( - queryset=User.objects.order_by( - 'username' - ), - required=False, - widget=StaticSelect() - ) - tenant = DynamicModelChoiceField( - queryset=Tenant.objects.all(), - required=False - ) - description = forms.CharField( - max_length=100, - required=False - ) - - class Meta: - nullable_fields = [] - - -class RackReservationFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm): - model = RackReservation - field_order = ['q', 'region_id', 'site_id', 'location_id', 'user_id', 'tenant_group_id', 'tenant_id'] - field_groups = [ - ['q', 'tag'], - ['user_id'], - ['region_id', 'site_id', 'location_id'], - ['tenant_group_id', 'tenant_id'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - region_id = DynamicModelMultipleChoiceField( - queryset=Region.objects.all(), - required=False, - label=_('Region'), - fetch_trigger='open' - ) - site_id = DynamicModelMultipleChoiceField( - queryset=Site.objects.all(), - required=False, - query_params={ - 'region_id': '$region_id' - }, - label=_('Site'), - fetch_trigger='open' - ) - location_id = DynamicModelMultipleChoiceField( - queryset=Location.objects.prefetch_related('site'), - required=False, - label=_('Location'), - null_option='None', - fetch_trigger='open' - ) - user_id = DynamicModelMultipleChoiceField( - queryset=User.objects.all(), - required=False, - label=_('User'), - widget=APISelectMultiple( - api_url='/api/users/users/', - ), - fetch_trigger='open' - ) - tag = TagFilterField(model) - - -# -# Manufacturers -# - -class ManufacturerForm(BootstrapMixin, CustomFieldModelForm): - slug = SlugField() - - class Meta: - model = Manufacturer - fields = [ - 'name', 'slug', 'description', - ] - - -class ManufacturerCSVForm(CustomFieldModelCSVForm): - - class Meta: - model = Manufacturer - fields = ('name', 'slug', 'description') - - -class ManufacturerBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Manufacturer.objects.all(), - widget=forms.MultipleHiddenInput - ) - description = forms.CharField( - max_length=200, - required=False - ) - - class Meta: - nullable_fields = ['description'] - - -class ManufacturerFilterForm(BootstrapMixin, CustomFieldModelFilterForm): - model = Manufacturer - field_groups = [ - ['q'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - - -# -# Device types -# - -class DeviceTypeForm(BootstrapMixin, CustomFieldModelForm): - manufacturer = DynamicModelChoiceField( - queryset=Manufacturer.objects.all() - ) - slug = SlugField( - slug_source='model' - ) - comments = CommentField() - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = DeviceType - fields = [ - 'manufacturer', 'model', 'slug', 'part_number', 'u_height', 'is_full_depth', 'subdevice_role', - 'front_image', 'rear_image', 'comments', 'tags', - ] - fieldsets = ( - ('Device Type', ( - 'manufacturer', 'model', 'slug', 'part_number', 'u_height', 'is_full_depth', 'subdevice_role', 'tags', - )), - ('Images', ('front_image', 'rear_image')), - ) - widgets = { - 'subdevice_role': StaticSelect(), - 'front_image': ClearableFileInput(attrs={ - 'accept': DEVICETYPE_IMAGE_FORMATS - }), - 'rear_image': ClearableFileInput(attrs={ - 'accept': DEVICETYPE_IMAGE_FORMATS - }) - } - - -class DeviceTypeImportForm(BootstrapMixin, forms.ModelForm): - manufacturer = forms.ModelChoiceField( - queryset=Manufacturer.objects.all(), - to_field_name='name' - ) - - class Meta: - model = DeviceType - fields = [ - 'manufacturer', 'model', 'slug', 'part_number', 'u_height', 'is_full_depth', 'subdevice_role', - 'comments', - ] - - -class DeviceTypeBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=DeviceType.objects.all(), - widget=forms.MultipleHiddenInput() - ) - manufacturer = DynamicModelChoiceField( - queryset=Manufacturer.objects.all(), - required=False - ) - u_height = forms.IntegerField( - min_value=1, - required=False - ) - is_full_depth = forms.NullBooleanField( - required=False, - widget=BulkEditNullBooleanSelect(), - label='Is full depth' - ) - - class Meta: - nullable_fields = [] - - -class DeviceTypeFilterForm(BootstrapMixin, CustomFieldModelFilterForm): - model = DeviceType - field_groups = [ - ['q', 'tag'], - ['manufacturer_id', 'subdevice_role'], - ['console_ports', 'console_server_ports', 'power_ports', 'power_outlets', 'interfaces', 'pass_through_ports'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - manufacturer_id = DynamicModelMultipleChoiceField( - queryset=Manufacturer.objects.all(), - required=False, - label=_('Manufacturer'), - fetch_trigger='open' - ) - subdevice_role = forms.MultipleChoiceField( - choices=add_blank_choice(SubdeviceRoleChoices), - required=False, - widget=StaticSelectMultiple() - ) - console_ports = forms.NullBooleanField( - required=False, - label='Has console ports', - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - console_server_ports = forms.NullBooleanField( - required=False, - label='Has console server ports', - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - power_ports = forms.NullBooleanField( - required=False, - label='Has power ports', - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - power_outlets = forms.NullBooleanField( - required=False, - label='Has power outlets', - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - interfaces = forms.NullBooleanField( - required=False, - label='Has interfaces', - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - pass_through_ports = forms.NullBooleanField( - required=False, - label='Has pass-through ports', - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - tag = TagFilterField(model) - - -# -# Device component templates -# - -class ComponentTemplateCreateForm(BootstrapMixin, ComponentForm): - """ - Base form for the creation of device component templates (subclassed from ComponentTemplateModel). - """ - manufacturer = DynamicModelChoiceField( - queryset=Manufacturer.objects.all(), - required=False, - initial_params={ - 'device_types': 'device_type' - } - ) - device_type = DynamicModelChoiceField( - queryset=DeviceType.objects.all(), - query_params={ - 'manufacturer_id': '$manufacturer' - } - ) - description = forms.CharField( - required=False - ) - - -class ConsolePortTemplateForm(BootstrapMixin, forms.ModelForm): - - class Meta: - model = ConsolePortTemplate - fields = [ - 'device_type', 'name', 'label', 'type', 'description', - ] - widgets = { - 'device_type': forms.HiddenInput(), - } - - -class ConsolePortTemplateCreateForm(ComponentTemplateCreateForm): - type = forms.ChoiceField( - choices=add_blank_choice(ConsolePortTypeChoices), - widget=StaticSelect() - ) - field_order = ('manufacturer', 'device_type', 'name_pattern', 'label_pattern', 'type', 'description') - - -class ConsolePortTemplateBulkEditForm(BootstrapMixin, BulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=ConsolePortTemplate.objects.all(), - widget=forms.MultipleHiddenInput() - ) - label = forms.CharField( - max_length=64, - required=False - ) - type = forms.ChoiceField( - choices=add_blank_choice(ConsolePortTypeChoices), - required=False, - widget=StaticSelect() - ) - - class Meta: - nullable_fields = ('label', 'type', 'description') - - -class ConsoleServerPortTemplateForm(BootstrapMixin, forms.ModelForm): - - class Meta: - model = ConsoleServerPortTemplate - fields = [ - 'device_type', 'name', 'label', 'type', 'description', - ] - widgets = { - 'device_type': forms.HiddenInput(), - } - - -class ConsoleServerPortTemplateCreateForm(ComponentTemplateCreateForm): - type = forms.ChoiceField( - choices=add_blank_choice(ConsolePortTypeChoices), - widget=StaticSelect() - ) - field_order = ('manufacturer', 'device_type', 'name_pattern', 'label_pattern', 'type', 'description') - - -class ConsoleServerPortTemplateBulkEditForm(BootstrapMixin, BulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=ConsoleServerPortTemplate.objects.all(), - widget=forms.MultipleHiddenInput() - ) - label = forms.CharField( - max_length=64, - required=False - ) - type = forms.ChoiceField( - choices=add_blank_choice(ConsolePortTypeChoices), - required=False, - widget=StaticSelect() - ) - description = forms.CharField( - required=False - ) - - class Meta: - nullable_fields = ('label', 'type', 'description') - - -class PowerPortTemplateForm(BootstrapMixin, forms.ModelForm): - - class Meta: - model = PowerPortTemplate - fields = [ - 'device_type', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description', - ] - widgets = { - 'device_type': forms.HiddenInput(), - } - - -class PowerPortTemplateCreateForm(ComponentTemplateCreateForm): - type = forms.ChoiceField( - choices=add_blank_choice(PowerPortTypeChoices), - required=False - ) - maximum_draw = forms.IntegerField( - min_value=1, - required=False, - help_text="Maximum power draw (watts)" - ) - allocated_draw = forms.IntegerField( - min_value=1, - required=False, - help_text="Allocated power draw (watts)" - ) - field_order = ( - 'manufacturer', 'device_type', 'name_pattern', 'label_pattern', 'type', 'maximum_draw', 'allocated_draw', - 'description', - ) - - -class PowerPortTemplateBulkEditForm(BootstrapMixin, BulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=PowerPortTemplate.objects.all(), - widget=forms.MultipleHiddenInput() - ) - label = forms.CharField( - max_length=64, - required=False - ) - type = forms.ChoiceField( - choices=add_blank_choice(PowerPortTypeChoices), - required=False, - widget=StaticSelect() - ) - maximum_draw = forms.IntegerField( - min_value=1, - required=False, - help_text="Maximum power draw (watts)" - ) - allocated_draw = forms.IntegerField( - min_value=1, - required=False, - help_text="Allocated power draw (watts)" - ) - description = forms.CharField( - required=False - ) - - class Meta: - nullable_fields = ('label', 'type', 'maximum_draw', 'allocated_draw', 'description') - - -class PowerOutletTemplateForm(BootstrapMixin, forms.ModelForm): - - class Meta: - model = PowerOutletTemplate - fields = [ - 'device_type', 'name', 'label', 'type', 'power_port', 'feed_leg', 'description', - ] - widgets = { - 'device_type': forms.HiddenInput(), - } - - def __init__(self, *args, **kwargs): - - super().__init__(*args, **kwargs) - - # Limit power_port choices to current DeviceType - if hasattr(self.instance, 'device_type'): - self.fields['power_port'].queryset = PowerPortTemplate.objects.filter( - device_type=self.instance.device_type - ) - - -class PowerOutletTemplateCreateForm(ComponentTemplateCreateForm): - type = forms.ChoiceField( - choices=add_blank_choice(PowerOutletTypeChoices), - required=False - ) - power_port = forms.ModelChoiceField( - queryset=PowerPortTemplate.objects.all(), - required=False - ) - feed_leg = forms.ChoiceField( - choices=add_blank_choice(PowerOutletFeedLegChoices), - required=False, - widget=StaticSelect() - ) - field_order = ( - 'manufacturer', 'device_type', 'name_pattern', 'label_pattern', 'type', 'power_port', 'feed_leg', - 'description', - ) - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - # Limit power_port choices to current DeviceType - device_type = DeviceType.objects.get( - pk=self.initial.get('device_type') or self.data.get('device_type') - ) - self.fields['power_port'].queryset = PowerPortTemplate.objects.filter( - device_type=device_type - ) - - -class PowerOutletTemplateBulkEditForm(BootstrapMixin, BulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=PowerOutletTemplate.objects.all(), - widget=forms.MultipleHiddenInput() - ) - device_type = forms.ModelChoiceField( - queryset=DeviceType.objects.all(), - required=False, - disabled=True, - widget=forms.HiddenInput() - ) - label = forms.CharField( - max_length=64, - required=False - ) - type = forms.ChoiceField( - choices=add_blank_choice(PowerOutletTypeChoices), - required=False, - widget=StaticSelect() - ) - power_port = forms.ModelChoiceField( - queryset=PowerPortTemplate.objects.all(), - required=False - ) - feed_leg = forms.ChoiceField( - choices=add_blank_choice(PowerOutletFeedLegChoices), - required=False, - widget=StaticSelect() - ) - description = forms.CharField( - required=False - ) - - class Meta: - nullable_fields = ('label', 'type', 'power_port', 'feed_leg', 'description') - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - # Limit power_port queryset to PowerPortTemplates which belong to the parent DeviceType - if 'device_type' in self.initial: - device_type = DeviceType.objects.filter(pk=self.initial['device_type']).first() - self.fields['power_port'].queryset = PowerPortTemplate.objects.filter(device_type=device_type) - else: - self.fields['power_port'].choices = () - self.fields['power_port'].widget.attrs['disabled'] = True - - -class InterfaceTemplateForm(BootstrapMixin, forms.ModelForm): - - class Meta: - model = InterfaceTemplate - fields = [ - 'device_type', 'name', 'label', 'type', 'mgmt_only', 'description', - ] - widgets = { - 'device_type': forms.HiddenInput(), - 'type': StaticSelect(), - } - - -class InterfaceTemplateCreateForm(ComponentTemplateCreateForm): - type = forms.ChoiceField( - choices=InterfaceTypeChoices, - widget=StaticSelect() - ) - mgmt_only = forms.BooleanField( - required=False, - label='Management only' - ) - field_order = ('manufacturer', 'device_type', 'name_pattern', 'label_pattern', 'type', 'mgmt_only', 'description') - - -class InterfaceTemplateBulkEditForm(BootstrapMixin, BulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=InterfaceTemplate.objects.all(), - widget=forms.MultipleHiddenInput() - ) - label = forms.CharField( - max_length=64, - required=False - ) - type = forms.ChoiceField( - choices=add_blank_choice(InterfaceTypeChoices), - required=False, - widget=StaticSelect() - ) - mgmt_only = forms.NullBooleanField( - required=False, - widget=BulkEditNullBooleanSelect, - label='Management only' - ) - description = forms.CharField( - required=False - ) - - class Meta: - nullable_fields = ('label', 'description') - - -class FrontPortTemplateForm(BootstrapMixin, forms.ModelForm): - - class Meta: - model = FrontPortTemplate - fields = [ - 'device_type', 'name', 'label', 'type', 'color', 'rear_port', 'rear_port_position', 'description', - ] - widgets = { - 'device_type': forms.HiddenInput(), - 'rear_port': StaticSelect(), - } - - def __init__(self, *args, **kwargs): - - super().__init__(*args, **kwargs) - - # Limit rear_port choices to current DeviceType - if hasattr(self.instance, 'device_type'): - self.fields['rear_port'].queryset = RearPortTemplate.objects.filter( - device_type=self.instance.device_type - ) - - -class FrontPortTemplateCreateForm(ComponentTemplateCreateForm): - type = forms.ChoiceField( - choices=PortTypeChoices, - widget=StaticSelect() - ) - color = ColorField( - required=False - ) - rear_port_set = forms.MultipleChoiceField( - choices=[], - label='Rear ports', - help_text='Select one rear port assignment for each front port being created.', - ) - field_order = ( - 'manufacturer', 'device_type', 'name_pattern', 'label_pattern', 'type', 'color', 'rear_port_set', 'description', - ) - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - device_type = DeviceType.objects.get( - pk=self.initial.get('device_type') or self.data.get('device_type') - ) - - # Determine which rear port positions are occupied. These will be excluded from the list of available mappings. - occupied_port_positions = [ - (front_port.rear_port_id, front_port.rear_port_position) - for front_port in device_type.frontporttemplates.all() - ] - - # Populate rear port choices - choices = [] - rear_ports = RearPortTemplate.objects.filter(device_type=device_type) - for rear_port in rear_ports: - for i in range(1, rear_port.positions + 1): - if (rear_port.pk, i) not in occupied_port_positions: - choices.append( - ('{}:{}'.format(rear_port.pk, i), '{}:{}'.format(rear_port.name, i)) - ) - self.fields['rear_port_set'].choices = choices - - def clean(self): - super().clean() - - # Validate that the number of ports being created equals the number of selected (rear port, position) tuples - front_port_count = len(self.cleaned_data['name_pattern']) - rear_port_count = len(self.cleaned_data['rear_port_set']) - if front_port_count != rear_port_count: - raise forms.ValidationError({ - 'rear_port_set': 'The provided name pattern will create {} ports, however {} rear port assignments ' - 'were selected. These counts must match.'.format(front_port_count, rear_port_count) - }) - - def get_iterative_data(self, iteration): - - # Assign rear port and position from selected set - rear_port, position = self.cleaned_data['rear_port_set'][iteration].split(':') - - return { - 'rear_port': int(rear_port), - 'rear_port_position': int(position), - } - - -class FrontPortTemplateBulkEditForm(BootstrapMixin, BulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=FrontPortTemplate.objects.all(), - widget=forms.MultipleHiddenInput() - ) - label = forms.CharField( - max_length=64, - required=False - ) - type = forms.ChoiceField( - choices=add_blank_choice(PortTypeChoices), - required=False, - widget=StaticSelect() - ) - color = ColorField( - required=False - ) - description = forms.CharField( - required=False - ) - - class Meta: - nullable_fields = ('description',) - - -class RearPortTemplateForm(BootstrapMixin, forms.ModelForm): - - class Meta: - model = RearPortTemplate - fields = [ - 'device_type', 'name', 'label', 'type', 'color', 'positions', 'description', - ] - widgets = { - 'device_type': forms.HiddenInput(), - 'type': StaticSelect(), - } - - -class RearPortTemplateCreateForm(ComponentTemplateCreateForm): - type = forms.ChoiceField( - choices=PortTypeChoices, - widget=StaticSelect(), - ) - color = ColorField( - required=False - ) - positions = forms.IntegerField( - min_value=REARPORT_POSITIONS_MIN, - max_value=REARPORT_POSITIONS_MAX, - initial=1, - help_text='The number of front ports which may be mapped to each rear port' - ) - field_order = ( - 'manufacturer', 'device_type', 'name_pattern', 'label_pattern', 'type', 'color', 'positions', 'description', - ) - - -class RearPortTemplateBulkEditForm(BootstrapMixin, BulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=RearPortTemplate.objects.all(), - widget=forms.MultipleHiddenInput() - ) - label = forms.CharField( - max_length=64, - required=False - ) - type = forms.ChoiceField( - choices=add_blank_choice(PortTypeChoices), - required=False, - widget=StaticSelect() - ) - color = ColorField( - required=False - ) - description = forms.CharField( - required=False - ) - - class Meta: - nullable_fields = ('description',) - - -class DeviceBayTemplateForm(BootstrapMixin, forms.ModelForm): - - class Meta: - model = DeviceBayTemplate - fields = [ - 'device_type', 'name', 'label', 'description', - ] - widgets = { - 'device_type': forms.HiddenInput(), - } - - -class DeviceBayTemplateCreateForm(ComponentTemplateCreateForm): - field_order = ('manufacturer', 'device_type', 'name_pattern', 'label_pattern', 'description') - - -class DeviceBayTemplateBulkEditForm(BootstrapMixin, BulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=DeviceBayTemplate.objects.all(), - widget=forms.MultipleHiddenInput() - ) - label = forms.CharField( - max_length=64, - required=False - ) - description = forms.CharField( - required=False - ) - - class Meta: - nullable_fields = ('label', 'description') - - -# -# Component template import forms -# - -class ComponentTemplateImportForm(BootstrapMixin, forms.ModelForm): - - def __init__(self, device_type, data=None, *args, **kwargs): - - # Must pass the parent DeviceType on form initialization - data.update({ - 'device_type': device_type.pk, - }) - - super().__init__(data, *args, **kwargs) - - def clean_device_type(self): - - data = self.cleaned_data['device_type'] - - # Limit fields referencing other components to the parent DeviceType - for field_name, field in self.fields.items(): - if isinstance(field, forms.ModelChoiceField) and field_name != 'device_type': - field.queryset = field.queryset.filter(device_type=data) - - return data - - -class ConsolePortTemplateImportForm(ComponentTemplateImportForm): - - class Meta: - model = ConsolePortTemplate - fields = [ - 'device_type', 'name', 'label', 'type', 'description', - ] - - -class ConsoleServerPortTemplateImportForm(ComponentTemplateImportForm): - - class Meta: - model = ConsoleServerPortTemplate - fields = [ - 'device_type', 'name', 'label', 'type', 'description', - ] - - -class PowerPortTemplateImportForm(ComponentTemplateImportForm): - - class Meta: - model = PowerPortTemplate - fields = [ - 'device_type', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description', - ] - - -class PowerOutletTemplateImportForm(ComponentTemplateImportForm): - power_port = forms.ModelChoiceField( - queryset=PowerPortTemplate.objects.all(), - to_field_name='name', - required=False - ) - - class Meta: - model = PowerOutletTemplate - fields = [ - 'device_type', 'name', 'label', 'type', 'power_port', 'feed_leg', 'description', - ] - - -class InterfaceTemplateImportForm(ComponentTemplateImportForm): - type = forms.ChoiceField( - choices=InterfaceTypeChoices.CHOICES - ) - - class Meta: - model = InterfaceTemplate - fields = [ - 'device_type', 'name', 'label', 'type', 'mgmt_only', 'description', - ] - - -class FrontPortTemplateImportForm(ComponentTemplateImportForm): - type = forms.ChoiceField( - choices=PortTypeChoices.CHOICES - ) - rear_port = forms.ModelChoiceField( - queryset=RearPortTemplate.objects.all(), - to_field_name='name' - ) - - class Meta: - model = FrontPortTemplate - fields = [ - 'device_type', 'name', 'type', 'rear_port', 'rear_port_position', 'label', 'description', - ] - - -class RearPortTemplateImportForm(ComponentTemplateImportForm): - type = forms.ChoiceField( - choices=PortTypeChoices.CHOICES - ) - - class Meta: - model = RearPortTemplate - fields = [ - 'device_type', 'name', 'type', 'positions', 'label', 'description', - ] - - -class DeviceBayTemplateImportForm(ComponentTemplateImportForm): - - class Meta: - model = DeviceBayTemplate - fields = [ - 'device_type', 'name', 'label', 'description', - ] - - -# -# Device roles -# - -class DeviceRoleForm(BootstrapMixin, CustomFieldModelForm): - slug = SlugField() - - class Meta: - model = DeviceRole - fields = [ - 'name', 'slug', 'color', 'vm_role', 'description', - ] - - -class DeviceRoleCSVForm(CustomFieldModelCSVForm): - slug = SlugField() - - class Meta: - model = DeviceRole - fields = ('name', 'slug', 'color', 'vm_role', 'description') - help_texts = { - 'color': mark_safe('RGB color in hexadecimal (e.g. 00ff00)'), - } - - -class DeviceRoleBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=DeviceRole.objects.all(), - widget=forms.MultipleHiddenInput - ) - color = ColorField( - required=False - ) - vm_role = forms.NullBooleanField( - required=False, - widget=BulkEditNullBooleanSelect, - label='VM role' - ) - description = forms.CharField( - max_length=200, - required=False - ) - - class Meta: - nullable_fields = ['color', 'description'] - - -class DeviceRoleFilterForm(BootstrapMixin, CustomFieldModelFilterForm): - model = DeviceRole - field_groups = [ - ['q'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - - -# -# Platforms -# - -class PlatformForm(BootstrapMixin, CustomFieldModelForm): - manufacturer = DynamicModelChoiceField( - queryset=Manufacturer.objects.all(), - required=False - ) - slug = SlugField( - max_length=64 - ) - - class Meta: - model = Platform - fields = [ - 'name', 'slug', 'manufacturer', 'napalm_driver', 'napalm_args', 'description', - ] - widgets = { - 'napalm_args': SmallTextarea(), - } - - -class PlatformCSVForm(CustomFieldModelCSVForm): - slug = SlugField() - manufacturer = CSVModelChoiceField( - queryset=Manufacturer.objects.all(), - required=False, - to_field_name='name', - help_text='Limit platform assignments to this manufacturer' - ) - - class Meta: - model = Platform - fields = ('name', 'slug', 'manufacturer', 'napalm_driver', 'napalm_args', 'description') - - -class PlatformBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Platform.objects.all(), - widget=forms.MultipleHiddenInput - ) - manufacturer = DynamicModelChoiceField( - queryset=Manufacturer.objects.all(), - required=False - ) - napalm_driver = forms.CharField( - max_length=50, - required=False - ) - # TODO: Bulk edit support for napalm_args - description = forms.CharField( - max_length=200, - required=False - ) - - class Meta: - nullable_fields = ['manufacturer', 'napalm_driver', 'description'] - - -class PlatformFilterForm(BootstrapMixin, CustomFieldModelFilterForm): - model = Platform - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - manufacturer_id = DynamicModelMultipleChoiceField( - queryset=Manufacturer.objects.all(), - required=False, - label=_('Manufacturer'), - fetch_trigger='open' - ) - - -# -# Devices -# - -class DeviceForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): - region = DynamicModelChoiceField( - queryset=Region.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - } - ) - site_group = DynamicModelChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - } - ) - site = DynamicModelChoiceField( - queryset=Site.objects.all(), - query_params={ - 'region_id': '$region', - 'group_id': '$site_group', - } - ) - location = DynamicModelChoiceField( - queryset=Location.objects.all(), - required=False, - query_params={ - 'site_id': '$site' - }, - initial_params={ - 'racks': '$rack' - } - ) - rack = DynamicModelChoiceField( - queryset=Rack.objects.all(), - required=False, - query_params={ - 'site_id': '$site', - 'location_id': '$location', - } - ) - position = forms.IntegerField( - required=False, - help_text="The lowest-numbered unit occupied by the device", - widget=APISelect( - api_url='/api/dcim/racks/{{rack}}/elevation/', - attrs={ - 'disabled-indicator': 'device', - 'data-query-param-face': "[\"$face\"]" - } - ) - ) - manufacturer = DynamicModelChoiceField( - queryset=Manufacturer.objects.all(), - required=False, - initial_params={ - 'device_types': '$device_type' - } - ) - device_type = DynamicModelChoiceField( - queryset=DeviceType.objects.all(), - query_params={ - 'manufacturer_id': '$manufacturer' - } - ) - device_role = DynamicModelChoiceField( - queryset=DeviceRole.objects.all() - ) - platform = DynamicModelChoiceField( - queryset=Platform.objects.all(), - required=False, - query_params={ - 'manufacturer_id': ['$manufacturer', 'null'] - } - ) - cluster_group = DynamicModelChoiceField( - queryset=ClusterGroup.objects.all(), - required=False, - null_option='None', - initial_params={ - 'clusters': '$cluster' - } - ) - cluster = DynamicModelChoiceField( - queryset=Cluster.objects.all(), - required=False, - query_params={ - 'group_id': '$cluster_group' - } - ) - comments = CommentField() - local_context_data = JSONField( - required=False, - label='' - ) - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = Device - fields = [ - 'name', 'device_role', 'device_type', 'serial', 'asset_tag', 'region', 'site_group', 'site', 'rack', - 'location', 'position', 'face', 'status', 'platform', 'primary_ip4', 'primary_ip6', 'cluster_group', - 'cluster', 'tenant_group', 'tenant', 'comments', 'tags', 'local_context_data' - ] - help_texts = { - 'device_role': "The function this device serves", - 'serial': "Chassis serial number", - 'local_context_data': "Local config context data overwrites all source contexts in the final rendered " - "config context", - } - widgets = { - 'face': StaticSelect(), - 'status': StaticSelect(), - 'primary_ip4': StaticSelect(), - 'primary_ip6': StaticSelect(), - } - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - if self.instance.pk: - - # Compile list of choices for primary IPv4 and IPv6 addresses - for family in [4, 6]: - ip_choices = [(None, '---------')] - - # Gather PKs of all interfaces belonging to this Device or a peer VirtualChassis member - interface_ids = self.instance.vc_interfaces(if_master=False).values_list('pk', flat=True) - - # Collect interface IPs - interface_ips = IPAddress.objects.filter( - address__family=family, - assigned_object_type=ContentType.objects.get_for_model(Interface), - assigned_object_id__in=interface_ids - ).prefetch_related('assigned_object') - if interface_ips: - ip_list = [(ip.id, f'{ip.address} ({ip.assigned_object})') for ip in interface_ips] - ip_choices.append(('Interface IPs', ip_list)) - # Collect NAT IPs - nat_ips = IPAddress.objects.prefetch_related('nat_inside').filter( - address__family=family, - nat_inside__assigned_object_type=ContentType.objects.get_for_model(Interface), - nat_inside__assigned_object_id__in=interface_ids - ).prefetch_related('assigned_object') - if nat_ips: - ip_list = [(ip.id, f'{ip.address} (NAT)') for ip in nat_ips] - ip_choices.append(('NAT IPs', ip_list)) - self.fields['primary_ip{}'.format(family)].choices = ip_choices - - # If editing an existing device, exclude it from the list of occupied rack units. This ensures that a device - # can be flipped from one face to another. - self.fields['position'].widget.add_query_param('exclude', self.instance.pk) - - # Limit platform by manufacturer - self.fields['platform'].queryset = Platform.objects.filter( - Q(manufacturer__isnull=True) | Q(manufacturer=self.instance.device_type.manufacturer) - ) - - # Disable rack assignment if this is a child device installed in a parent device - if self.instance.device_type.is_child_device and hasattr(self.instance, 'parent_bay'): - self.fields['site'].disabled = True - self.fields['rack'].disabled = True - self.initial['site'] = self.instance.parent_bay.device.site_id - self.initial['rack'] = self.instance.parent_bay.device.rack_id - - else: - - # An object that doesn't exist yet can't have any IPs assigned to it - self.fields['primary_ip4'].choices = [] - self.fields['primary_ip4'].widget.attrs['readonly'] = True - self.fields['primary_ip6'].choices = [] - self.fields['primary_ip6'].widget.attrs['readonly'] = True - - # Rack position - position = self.data.get('position') or self.initial.get('position') - if position: - self.fields['position'].widget.choices = [(position, f'U{position}')] - - -class BaseDeviceCSVForm(CustomFieldModelCSVForm): - device_role = CSVModelChoiceField( - queryset=DeviceRole.objects.all(), - to_field_name='name', - help_text='Assigned role' - ) - tenant = CSVModelChoiceField( - queryset=Tenant.objects.all(), - required=False, - to_field_name='name', - help_text='Assigned tenant' - ) - manufacturer = CSVModelChoiceField( - queryset=Manufacturer.objects.all(), - to_field_name='name', - help_text='Device type manufacturer' - ) - device_type = CSVModelChoiceField( - queryset=DeviceType.objects.all(), - to_field_name='model', - help_text='Device type model' - ) - platform = CSVModelChoiceField( - queryset=Platform.objects.all(), - required=False, - to_field_name='name', - help_text='Assigned platform' - ) - status = CSVChoiceField( - choices=DeviceStatusChoices, - help_text='Operational status' - ) - virtual_chassis = CSVModelChoiceField( - queryset=VirtualChassis.objects.all(), - to_field_name='name', - required=False, - help_text='Virtual chassis' - ) - cluster = CSVModelChoiceField( - queryset=Cluster.objects.all(), - to_field_name='name', - required=False, - help_text='Virtualization cluster' - ) - - class Meta: - fields = [] - model = Device - help_texts = { - 'vc_position': 'Virtual chassis position', - 'vc_priority': 'Virtual chassis priority', - } - - def __init__(self, data=None, *args, **kwargs): - super().__init__(data, *args, **kwargs) - - if data: - - # Limit device type queryset by manufacturer - params = {f"manufacturer__{self.fields['manufacturer'].to_field_name}": data.get('manufacturer')} - self.fields['device_type'].queryset = self.fields['device_type'].queryset.filter(**params) - - -class DeviceCSVForm(BaseDeviceCSVForm): - site = CSVModelChoiceField( - queryset=Site.objects.all(), - to_field_name='name', - help_text='Assigned site' - ) - location = CSVModelChoiceField( - queryset=Location.objects.all(), - to_field_name='name', - required=False, - help_text="Assigned location (if any)" - ) - rack = CSVModelChoiceField( - queryset=Rack.objects.all(), - to_field_name='name', - required=False, - help_text="Assigned rack (if any)" - ) - face = CSVChoiceField( - choices=DeviceFaceChoices, - required=False, - help_text='Mounted rack face' - ) - - class Meta(BaseDeviceCSVForm.Meta): - fields = [ - 'name', 'device_role', 'tenant', 'manufacturer', 'device_type', 'platform', 'serial', 'asset_tag', 'status', - 'site', 'location', 'rack', 'position', 'face', 'virtual_chassis', 'vc_position', 'vc_priority', 'cluster', - 'comments', - ] - - def __init__(self, data=None, *args, **kwargs): - super().__init__(data, *args, **kwargs) - - if data: - - # Limit location queryset by assigned site - params = {f"site__{self.fields['site'].to_field_name}": data.get('site')} - self.fields['location'].queryset = self.fields['location'].queryset.filter(**params) - - # Limit rack queryset by assigned site and group - params = { - f"site__{self.fields['site'].to_field_name}": data.get('site'), - f"location__{self.fields['location'].to_field_name}": data.get('location'), - } - self.fields['rack'].queryset = self.fields['rack'].queryset.filter(**params) - - -class ChildDeviceCSVForm(BaseDeviceCSVForm): - parent = CSVModelChoiceField( - queryset=Device.objects.all(), - to_field_name='name', - help_text='Parent device' - ) - device_bay = CSVModelChoiceField( - queryset=DeviceBay.objects.all(), - to_field_name='name', - help_text='Device bay in which this device is installed' - ) - - class Meta(BaseDeviceCSVForm.Meta): - fields = [ - 'name', 'device_role', 'tenant', 'manufacturer', 'device_type', 'platform', 'serial', 'asset_tag', 'status', - 'parent', 'device_bay', 'virtual_chassis', 'vc_position', 'vc_priority', 'cluster', 'comments', - ] - - def __init__(self, data=None, *args, **kwargs): - super().__init__(data, *args, **kwargs) - - if data: - - # Limit device bay queryset by parent device - params = {f"device__{self.fields['parent'].to_field_name}": data.get('parent')} - self.fields['device_bay'].queryset = self.fields['device_bay'].queryset.filter(**params) - - def clean(self): - super().clean() - - # Set parent_bay reverse relationship - device_bay = self.cleaned_data.get('device_bay') - if device_bay: - self.instance.parent_bay = device_bay - - # Inherit site and rack from parent device - parent = self.cleaned_data.get('parent') - if parent: - self.instance.site = parent.site - self.instance.rack = parent.rack - - -class DeviceBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Device.objects.all(), - widget=forms.MultipleHiddenInput() - ) - manufacturer = DynamicModelChoiceField( - queryset=Manufacturer.objects.all(), - required=False - ) - device_type = DynamicModelChoiceField( - queryset=DeviceType.objects.all(), - required=False, - query_params={ - 'manufacturer_id': '$manufacturer' - } - ) - device_role = DynamicModelChoiceField( - queryset=DeviceRole.objects.all(), - required=False - ) - site = DynamicModelChoiceField( - queryset=Site.objects.all(), - required=False - ) - location = DynamicModelChoiceField( - queryset=Location.objects.all(), - required=False, - query_params={ - 'site_id': '$site' - } - ) - tenant = DynamicModelChoiceField( - queryset=Tenant.objects.all(), - required=False - ) - platform = DynamicModelChoiceField( - queryset=Platform.objects.all(), - required=False - ) - status = forms.ChoiceField( - choices=add_blank_choice(DeviceStatusChoices), - required=False, - widget=StaticSelect() - ) - serial = forms.CharField( - max_length=50, - required=False, - label='Serial Number' - ) - - class Meta: - nullable_fields = [ - 'tenant', 'platform', 'serial', - ] - - -class DeviceFilterForm(BootstrapMixin, LocalConfigContextFilterForm, TenancyFilterForm, CustomFieldModelFilterForm): - model = Device - field_order = [ - 'q', 'region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id', 'status', 'role_id', 'tenant_group_id', - 'tenant_id', 'manufacturer_id', 'device_type_id', 'asset_tag', 'mac_address', 'has_primary_ip', - ] - field_groups = [ - ['q', 'tag'], - ['region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id'], - ['status', 'role_id', 'asset_tag', 'mac_address'], - ['manufacturer_id', 'device_type_id', 'platform_id'], - ['tenant_group_id', 'tenant_id'], - [ - 'has_primary_ip', 'virtual_chassis_member', 'console_ports', 'console_server_ports', 'power_ports', - 'power_outlets', 'interfaces', 'pass_through_ports', 'local_context_data', - ], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - region_id = DynamicModelMultipleChoiceField( - queryset=Region.objects.all(), - required=False, - label=_('Region'), - fetch_trigger='open' - ) - site_group_id = DynamicModelMultipleChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - label=_('Site group'), - fetch_trigger='open' - ) - site_id = DynamicModelMultipleChoiceField( - queryset=Site.objects.all(), - required=False, - query_params={ - 'region_id': '$region_id', - 'group_id': '$site_group_id', - }, - label=_('Site'), - fetch_trigger='open' - ) - location_id = DynamicModelMultipleChoiceField( - queryset=Location.objects.all(), - required=False, - null_option='None', - query_params={ - 'site_id': '$site_id' - }, - label=_('Location'), - fetch_trigger='open' - ) - rack_id = DynamicModelMultipleChoiceField( - queryset=Rack.objects.all(), - required=False, - null_option='None', - query_params={ - 'site_id': '$site_id', - 'location_id': '$location_id', - }, - label=_('Rack'), - fetch_trigger='open' - ) - role_id = DynamicModelMultipleChoiceField( - queryset=DeviceRole.objects.all(), - required=False, - label=_('Role'), - fetch_trigger='open' - ) - manufacturer_id = DynamicModelMultipleChoiceField( - queryset=Manufacturer.objects.all(), - required=False, - label=_('Manufacturer'), - fetch_trigger='open' - ) - device_type_id = DynamicModelMultipleChoiceField( - queryset=DeviceType.objects.all(), - required=False, - query_params={ - 'manufacturer_id': '$manufacturer_id' - }, - label=_('Model'), - fetch_trigger='open' - ) - platform_id = DynamicModelMultipleChoiceField( - queryset=Platform.objects.all(), - required=False, - null_option='None', - label=_('Platform'), - fetch_trigger='open' - ) - status = forms.MultipleChoiceField( - choices=DeviceStatusChoices, - required=False, - widget=StaticSelectMultiple() - ) - asset_tag = forms.CharField( - required=False - ) - mac_address = forms.CharField( - required=False, - label='MAC address' - ) - has_primary_ip = forms.NullBooleanField( - required=False, - label='Has a primary IP', - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - virtual_chassis_member = forms.NullBooleanField( - required=False, - label='Virtual chassis member', - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - console_ports = forms.NullBooleanField( - required=False, - label='Has console ports', - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - console_server_ports = forms.NullBooleanField( - required=False, - label='Has console server ports', - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - power_ports = forms.NullBooleanField( - required=False, - label='Has power ports', - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - power_outlets = forms.NullBooleanField( - required=False, - label='Has power outlets', - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - interfaces = forms.NullBooleanField( - required=False, - label='Has interfaces', - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - pass_through_ports = forms.NullBooleanField( - required=False, - label='Has pass-through ports', - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - tag = TagFilterField(model) - - -# -# Device components -# - -class ComponentCreateForm(BootstrapMixin, CustomFieldsMixin, ComponentForm): - """ - Base form for the creation of device components (models subclassed from ComponentModel). - """ - device = DynamicModelChoiceField( - queryset=Device.objects.all() - ) - description = forms.CharField( - max_length=200, - required=False - ) - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - -class DeviceBulkAddComponentForm(BootstrapMixin, CustomFieldsMixin, ComponentForm): - pk = forms.ModelMultipleChoiceField( - queryset=Device.objects.all(), - widget=forms.MultipleHiddenInput() - ) - description = forms.CharField( - max_length=100, - required=False - ) - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - -# -# Console ports -# - - -class ConsolePortFilterForm(DeviceComponentFilterForm): - model = ConsolePort - field_groups = [ - ['q', 'tag'], - ['name', 'label', 'type', 'speed'], - ['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'], - ] - type = forms.MultipleChoiceField( - choices=ConsolePortTypeChoices, - required=False, - widget=StaticSelectMultiple() - ) - speed = forms.MultipleChoiceField( - choices=ConsolePortSpeedChoices, - required=False, - widget=StaticSelectMultiple() - ) - tag = TagFilterField(model) - - -class ConsolePortForm(BootstrapMixin, CustomFieldModelForm): - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = ConsolePort - fields = [ - 'device', 'name', 'label', 'type', 'speed', 'mark_connected', 'description', 'tags', - ] - widgets = { - 'device': forms.HiddenInput(), - } - - -class ConsolePortCreateForm(ComponentCreateForm): - model = ConsolePort - type = forms.ChoiceField( - choices=add_blank_choice(ConsolePortTypeChoices), - required=False, - widget=StaticSelect() - ) - speed = forms.ChoiceField( - choices=add_blank_choice(ConsolePortSpeedChoices), - required=False, - widget=StaticSelect() - ) - field_order = ('device', 'name_pattern', 'label_pattern', 'type', 'speed', 'mark_connected', 'description', 'tags') - - -class ConsolePortBulkCreateForm( - form_from_model(ConsolePort, ['type', 'speed', 'mark_connected']), - DeviceBulkAddComponentForm -): - model = ConsolePort - field_order = ('name_pattern', 'label_pattern', 'type', 'mark_connected', 'description', 'tags') - - -class ConsolePortBulkEditForm( - form_from_model(ConsolePort, ['label', 'type', 'speed', 'mark_connected', 'description']), - BootstrapMixin, - AddRemoveTagsForm, - CustomFieldModelBulkEditForm -): - pk = forms.ModelMultipleChoiceField( - queryset=ConsolePort.objects.all(), - widget=forms.MultipleHiddenInput() - ) - mark_connected = forms.NullBooleanField( - required=False, - widget=BulkEditNullBooleanSelect - ) - - class Meta: - nullable_fields = ['label', 'description'] - - -class ConsolePortCSVForm(CustomFieldModelCSVForm): - device = CSVModelChoiceField( - queryset=Device.objects.all(), - to_field_name='name' - ) - type = CSVChoiceField( - choices=ConsolePortTypeChoices, - required=False, - help_text='Port type' - ) - speed = CSVTypedChoiceField( - choices=ConsolePortSpeedChoices, - coerce=int, - empty_value=None, - required=False, - help_text='Port speed in bps' - ) - - class Meta: - model = ConsolePort - fields = ('device', 'name', 'label', 'type', 'speed', 'mark_connected', 'description') - - -# -# Console server ports -# - - -class ConsoleServerPortFilterForm(DeviceComponentFilterForm): - model = ConsoleServerPort - field_groups = [ - ['q', 'tag'], - ['name', 'label', 'type', 'speed'], - ['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'], - ] - type = forms.MultipleChoiceField( - choices=ConsolePortTypeChoices, - required=False, - widget=StaticSelectMultiple() - ) - speed = forms.MultipleChoiceField( - choices=ConsolePortSpeedChoices, - required=False, - widget=StaticSelectMultiple() - ) - tag = TagFilterField(model) - - -class ConsoleServerPortForm(BootstrapMixin, CustomFieldModelForm): - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = ConsoleServerPort - fields = [ - 'device', 'name', 'label', 'type', 'speed', 'mark_connected', 'description', 'tags', - ] - widgets = { - 'device': forms.HiddenInput(), - } - - -class ConsoleServerPortCreateForm(ComponentCreateForm): - model = ConsoleServerPort - type = forms.ChoiceField( - choices=add_blank_choice(ConsolePortTypeChoices), - required=False, - widget=StaticSelect() - ) - speed = forms.ChoiceField( - choices=add_blank_choice(ConsolePortSpeedChoices), - required=False, - widget=StaticSelect() - ) - field_order = ('device', 'name_pattern', 'label_pattern', 'type', 'speed', 'mark_connected', 'description', 'tags') - - -class ConsoleServerPortBulkCreateForm( - form_from_model(ConsoleServerPort, ['type', 'speed', 'mark_connected']), - DeviceBulkAddComponentForm -): - model = ConsoleServerPort - field_order = ('name_pattern', 'label_pattern', 'type', 'speed', 'description', 'tags') - - -class ConsoleServerPortBulkEditForm( - form_from_model(ConsoleServerPort, ['label', 'type', 'speed', 'mark_connected', 'description']), - BootstrapMixin, - AddRemoveTagsForm, - CustomFieldModelBulkEditForm -): - pk = forms.ModelMultipleChoiceField( - queryset=ConsoleServerPort.objects.all(), - widget=forms.MultipleHiddenInput() - ) - mark_connected = forms.NullBooleanField( - required=False, - widget=BulkEditNullBooleanSelect - ) - - class Meta: - nullable_fields = ['label', 'description'] - - -class ConsoleServerPortCSVForm(CustomFieldModelCSVForm): - device = CSVModelChoiceField( - queryset=Device.objects.all(), - to_field_name='name' - ) - type = CSVChoiceField( - choices=ConsolePortTypeChoices, - required=False, - help_text='Port type' - ) - speed = CSVTypedChoiceField( - choices=ConsolePortSpeedChoices, - coerce=int, - empty_value=None, - required=False, - help_text='Port speed in bps' - ) - - class Meta: - model = ConsoleServerPort - fields = ('device', 'name', 'label', 'type', 'speed', 'mark_connected', 'description') - - -# -# Power ports -# - - -class PowerPortFilterForm(DeviceComponentFilterForm): - model = PowerPort - field_groups = [ - ['q', 'tag'], - ['name', 'label', 'type'], - ['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'], - ] - type = forms.MultipleChoiceField( - choices=PowerPortTypeChoices, - required=False, - widget=StaticSelectMultiple() - ) - tag = TagFilterField(model) - - -class PowerPortForm(BootstrapMixin, CustomFieldModelForm): - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = PowerPort - fields = [ - 'device', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', 'mark_connected', 'description', - 'tags', - ] - widgets = { - 'device': forms.HiddenInput(), - } - - -class PowerPortCreateForm(ComponentCreateForm): - model = PowerPort - type = forms.ChoiceField( - choices=add_blank_choice(PowerPortTypeChoices), - required=False, - widget=StaticSelect() - ) - maximum_draw = forms.IntegerField( - min_value=1, - required=False, - help_text="Maximum draw in watts" - ) - allocated_draw = forms.IntegerField( - min_value=1, - required=False, - help_text="Allocated draw in watts" - ) - field_order = ( - 'device', 'name_pattern', 'label_pattern', 'type', 'maximum_draw', 'allocated_draw', 'mark_connected', - 'description', 'tags', - ) - - -class PowerPortBulkCreateForm( - form_from_model(PowerPort, ['type', 'maximum_draw', 'allocated_draw', 'mark_connected']), - DeviceBulkAddComponentForm -): - model = PowerPort - field_order = ('name_pattern', 'label_pattern', 'type', 'maximum_draw', 'allocated_draw', 'description', 'tags') - - -class PowerPortBulkEditForm( - form_from_model(PowerPort, ['label', 'type', 'maximum_draw', 'allocated_draw', 'mark_connected', 'description']), - BootstrapMixin, - AddRemoveTagsForm, - CustomFieldModelBulkEditForm -): - pk = forms.ModelMultipleChoiceField( - queryset=PowerPort.objects.all(), - widget=forms.MultipleHiddenInput() - ) - mark_connected = forms.NullBooleanField( - required=False, - widget=BulkEditNullBooleanSelect - ) - - class Meta: - nullable_fields = ['label', 'description'] - - -class PowerPortCSVForm(CustomFieldModelCSVForm): - device = CSVModelChoiceField( - queryset=Device.objects.all(), - to_field_name='name' - ) - type = CSVChoiceField( - choices=PowerPortTypeChoices, - required=False, - help_text='Port type' - ) - - class Meta: - model = PowerPort - fields = ( - 'device', 'name', 'label', 'type', 'mark_connected', 'maximum_draw', 'allocated_draw', 'description', - ) - - -# -# Power outlets -# - - -class PowerOutletFilterForm(DeviceComponentFilterForm): - model = PowerOutlet - field_groups = [ - ['q', 'tag'], - ['name', 'label', 'type'], - ['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'], - ] - type = forms.MultipleChoiceField( - choices=PowerOutletTypeChoices, - required=False, - widget=StaticSelectMultiple() - ) - tag = TagFilterField(model) - - -class PowerOutletForm(BootstrapMixin, CustomFieldModelForm): - power_port = forms.ModelChoiceField( - queryset=PowerPort.objects.all(), - required=False - ) - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = PowerOutlet - fields = [ - 'device', 'name', 'label', 'type', 'power_port', 'feed_leg', 'mark_connected', 'description', 'tags', - ] - widgets = { - 'device': forms.HiddenInput(), - } - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - # Limit power_port choices to the local device - if hasattr(self.instance, 'device'): - self.fields['power_port'].queryset = PowerPort.objects.filter( - device=self.instance.device - ) - - -class PowerOutletCreateForm(ComponentCreateForm): - model = PowerOutlet - type = forms.ChoiceField( - choices=add_blank_choice(PowerOutletTypeChoices), - required=False, - widget=StaticSelect() - ) - power_port = forms.ModelChoiceField( - queryset=PowerPort.objects.all(), - required=False - ) - feed_leg = forms.ChoiceField( - choices=add_blank_choice(PowerOutletFeedLegChoices), - required=False - ) - field_order = ( - 'device', 'name_pattern', 'label_pattern', 'type', 'power_port', 'feed_leg', 'mark_connected', 'description', - 'tags', - ) - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - # Limit power_port queryset to PowerPorts which belong to the parent Device - device = Device.objects.get( - pk=self.initial.get('device') or self.data.get('device') - ) - self.fields['power_port'].queryset = PowerPort.objects.filter(device=device) - - -class PowerOutletBulkCreateForm( - form_from_model(PowerOutlet, ['type', 'feed_leg', 'mark_connected']), - DeviceBulkAddComponentForm -): - model = PowerOutlet - field_order = ('name_pattern', 'label_pattern', 'type', 'feed_leg', 'description', 'tags') - - -class PowerOutletBulkEditForm( - form_from_model(PowerOutlet, ['label', 'type', 'feed_leg', 'power_port', 'mark_connected', 'description']), - BootstrapMixin, - AddRemoveTagsForm, - CustomFieldModelBulkEditForm -): - pk = forms.ModelMultipleChoiceField( - queryset=PowerOutlet.objects.all(), - widget=forms.MultipleHiddenInput() - ) - device = forms.ModelChoiceField( - queryset=Device.objects.all(), - required=False, - disabled=True, - widget=forms.HiddenInput() - ) - mark_connected = forms.NullBooleanField( - required=False, - widget=BulkEditNullBooleanSelect - ) - - class Meta: - nullable_fields = ['label', 'type', 'feed_leg', 'power_port', 'description'] - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - # Limit power_port queryset to PowerPorts which belong to the parent Device - if 'device' in self.initial: - device = Device.objects.filter(pk=self.initial['device']).first() - self.fields['power_port'].queryset = PowerPort.objects.filter(device=device) - else: - self.fields['power_port'].choices = () - self.fields['power_port'].widget.attrs['disabled'] = True - - -class PowerOutletCSVForm(CustomFieldModelCSVForm): - device = CSVModelChoiceField( - queryset=Device.objects.all(), - to_field_name='name' - ) - type = CSVChoiceField( - choices=PowerOutletTypeChoices, - required=False, - help_text='Outlet type' - ) - power_port = CSVModelChoiceField( - queryset=PowerPort.objects.all(), - required=False, - to_field_name='name', - help_text='Local power port which feeds this outlet' - ) - feed_leg = CSVChoiceField( - choices=PowerOutletFeedLegChoices, - required=False, - help_text='Electrical phase (for three-phase circuits)' - ) - - class Meta: - model = PowerOutlet - fields = ('device', 'name', 'label', 'type', 'mark_connected', 'power_port', 'feed_leg', 'description') - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - # Limit PowerPort choices to those belonging to this device (or VC master) - if self.is_bound: - try: - device = self.fields['device'].to_python(self.data['device']) - except forms.ValidationError: - device = None - else: - try: - device = self.instance.device - except Device.DoesNotExist: - device = None - - if device: - self.fields['power_port'].queryset = PowerPort.objects.filter( - device__in=[device, device.get_vc_master()] - ) - else: - self.fields['power_port'].queryset = PowerPort.objects.none() - - -# -# Interfaces -# - - -class InterfaceFilterForm(DeviceComponentFilterForm): - model = Interface - field_groups = [ - ['q', 'tag'], - ['name', 'label', 'type', 'enabled', 'mgmt_only', 'mac_address'], - ['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'], - ] - type = forms.MultipleChoiceField( - choices=InterfaceTypeChoices, - required=False, - widget=StaticSelectMultiple() - ) - enabled = forms.NullBooleanField( - required=False, - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - mgmt_only = forms.NullBooleanField( - required=False, - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - mac_address = forms.CharField( - required=False, - label='MAC address' - ) - tag = TagFilterField(model) - - -class InterfaceForm(BootstrapMixin, InterfaceCommonForm, CustomFieldModelForm): - parent = DynamicModelChoiceField( - queryset=Interface.objects.all(), - required=False, - label='Parent interface' - ) - lag = DynamicModelChoiceField( - queryset=Interface.objects.all(), - required=False, - label='LAG interface', - query_params={ - 'type': 'lag', - } - ) - vlan_group = DynamicModelChoiceField( - queryset=VLANGroup.objects.all(), - required=False, - label='VLAN group' - ) - untagged_vlan = DynamicModelChoiceField( - queryset=VLAN.objects.all(), - required=False, - label='Untagged VLAN', - query_params={ - 'group_id': '$vlan_group', - } - ) - tagged_vlans = DynamicModelMultipleChoiceField( - queryset=VLAN.objects.all(), - required=False, - label='Tagged VLANs', - query_params={ - 'group_id': '$vlan_group', - } - ) - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = Interface - fields = [ - 'device', 'name', 'label', 'type', 'enabled', 'parent', 'lag', 'mac_address', 'mtu', 'mgmt_only', - 'mark_connected', 'description', 'mode', 'untagged_vlan', 'tagged_vlans', 'tags', - ] - widgets = { - 'device': forms.HiddenInput(), - 'type': StaticSelect(), - 'mode': StaticSelect(), - } - labels = { - 'mode': '802.1Q Mode', - } - help_texts = { - 'mode': INTERFACE_MODE_HELP_TEXT, - } - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - device = Device.objects.get(pk=self.data['device']) if self.is_bound else self.instance.device - - # Restrict parent/LAG interface assignment by device/VC - self.fields['parent'].widget.add_query_param('device_id', device.pk) - if device.virtual_chassis and device.virtual_chassis.master: - # Get available LAG interfaces by VirtualChassis master - self.fields['lag'].widget.add_query_param('device_id', device.virtual_chassis.master.pk) - else: - self.fields['lag'].widget.add_query_param('device_id', device.pk) - - # Limit VLAN choices by device - self.fields['untagged_vlan'].widget.add_query_param('available_on_device', device.pk) - self.fields['tagged_vlans'].widget.add_query_param('available_on_device', device.pk) - - -class InterfaceCreateForm(ComponentCreateForm, InterfaceCommonForm): - model = Interface - type = forms.ChoiceField( - choices=InterfaceTypeChoices, - widget=StaticSelect(), - ) - enabled = forms.BooleanField( - required=False, - initial=True - ) - parent = DynamicModelChoiceField( - queryset=Interface.objects.all(), - required=False, - query_params={ - 'device_id': '$device', - } - ) - lag = DynamicModelChoiceField( - queryset=Interface.objects.all(), - required=False, - query_params={ - 'device_id': '$device', - 'type': 'lag', - } - ) - mac_address = forms.CharField( - required=False, - label='MAC Address' - ) - mgmt_only = forms.BooleanField( - required=False, - label='Management only', - help_text='This interface is used only for out-of-band management' - ) - mode = forms.ChoiceField( - choices=add_blank_choice(InterfaceModeChoices), - required=False, - widget=StaticSelect(), - ) - untagged_vlan = DynamicModelChoiceField( - queryset=VLAN.objects.all(), - required=False - ) - tagged_vlans = DynamicModelMultipleChoiceField( - queryset=VLAN.objects.all(), - required=False - ) - field_order = ( - 'device', 'name_pattern', 'label_pattern', 'type', 'enabled', 'parent', 'lag', 'mtu', 'mac_address', - 'description', 'mgmt_only', 'mark_connected', 'mode', 'untagged_vlan', 'tagged_vlans', 'tags' - ) - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - # Limit VLAN choices by device - device_id = self.initial.get('device') or self.data.get('device') - self.fields['untagged_vlan'].widget.add_query_param('available_on_device', device_id) - self.fields['tagged_vlans'].widget.add_query_param('available_on_device', device_id) - - -class InterfaceBulkCreateForm( - form_from_model(Interface, ['type', 'enabled', 'mtu', 'mgmt_only', 'mark_connected']), - DeviceBulkAddComponentForm -): - model = Interface - field_order = ( - 'name_pattern', 'label_pattern', 'type', 'enabled', 'mtu', 'mgmt_only', 'mark_connected', 'description', 'tags', - ) - - -class InterfaceBulkEditForm( - form_from_model(Interface, [ - 'label', 'type', 'parent', 'lag', 'mac_address', 'mtu', 'mgmt_only', 'mark_connected', 'description', 'mode', - ]), - BootstrapMixin, - AddRemoveTagsForm, - CustomFieldModelBulkEditForm -): - pk = forms.ModelMultipleChoiceField( - queryset=Interface.objects.all(), - widget=forms.MultipleHiddenInput() - ) - device = forms.ModelChoiceField( - queryset=Device.objects.all(), - required=False, - disabled=True, - widget=forms.HiddenInput() - ) - enabled = forms.NullBooleanField( - required=False, - widget=BulkEditNullBooleanSelect - ) - parent = DynamicModelChoiceField( - queryset=Interface.objects.all(), - required=False - ) - lag = DynamicModelChoiceField( - queryset=Interface.objects.all(), - required=False, - query_params={ - 'type': 'lag', - } - ) - mgmt_only = forms.NullBooleanField( - required=False, - widget=BulkEditNullBooleanSelect, - label='Management only' - ) - mark_connected = forms.NullBooleanField( - required=False, - widget=BulkEditNullBooleanSelect - ) - untagged_vlan = DynamicModelChoiceField( - queryset=VLAN.objects.all(), - required=False - ) - tagged_vlans = DynamicModelMultipleChoiceField( - queryset=VLAN.objects.all(), - required=False - ) - - class Meta: - nullable_fields = [ - 'label', 'parent', 'lag', 'mac_address', 'mtu', 'description', 'mode', 'untagged_vlan', 'tagged_vlans' - ] - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - if 'device' in self.initial: - device = Device.objects.filter(pk=self.initial['device']).first() - - # Restrict parent/LAG interface assignment by device - self.fields['parent'].widget.add_query_param('device_id', device.pk) - self.fields['lag'].widget.add_query_param('device_id', device.pk) - - # Limit VLAN choices by device - self.fields['untagged_vlan'].widget.add_query_param('available_on_device', device.pk) - self.fields['tagged_vlans'].widget.add_query_param('available_on_device', device.pk) - - else: - # See #4523 - if 'pk' in self.initial: - site = None - interfaces = Interface.objects.filter(pk__in=self.initial['pk']).prefetch_related('device__site') - - # Check interface sites. First interface should set site, further interfaces will either continue the - # loop or reset back to no site and break the loop. - for interface in interfaces: - if site is None: - site = interface.device.site - elif interface.device.site is not site: - site = None - break - - if site is not None: - self.fields['untagged_vlan'].widget.add_query_param('site_id', site.pk) - self.fields['tagged_vlans'].widget.add_query_param('site_id', site.pk) - - self.fields['parent'].choices = () - self.fields['parent'].widget.attrs['disabled'] = True - self.fields['lag'].choices = () - self.fields['lag'].widget.attrs['disabled'] = True - - def clean(self): - super().clean() - - # Untagged interfaces cannot be assigned tagged VLANs - if self.cleaned_data['mode'] == InterfaceModeChoices.MODE_ACCESS and self.cleaned_data['tagged_vlans']: - raise forms.ValidationError({ - 'mode': "An access interface cannot have tagged VLANs assigned." - }) - - # Remove all tagged VLAN assignments from "tagged all" interfaces - elif self.cleaned_data['mode'] == InterfaceModeChoices.MODE_TAGGED_ALL: - self.cleaned_data['tagged_vlans'] = [] - - -class InterfaceCSVForm(CustomFieldModelCSVForm): - device = CSVModelChoiceField( - queryset=Device.objects.all(), - to_field_name='name' - ) - parent = CSVModelChoiceField( - queryset=Interface.objects.all(), - required=False, - to_field_name='name', - help_text='Parent interface' - ) - lag = CSVModelChoiceField( - queryset=Interface.objects.all(), - required=False, - to_field_name='name', - help_text='Parent LAG interface' - ) - type = CSVChoiceField( - choices=InterfaceTypeChoices, - help_text='Physical medium' - ) - mode = CSVChoiceField( - choices=InterfaceModeChoices, - required=False, - help_text='IEEE 802.1Q operational mode (for L2 interfaces)' - ) - - class Meta: - model = Interface - fields = ( - 'device', 'name', 'label', 'parent', 'lag', 'type', 'enabled', 'mark_connected', 'mac_address', 'mtu', - 'mgmt_only', 'description', 'mode', - ) - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - # Limit LAG choices to interfaces belonging to this device (or virtual chassis) - device = None - if self.is_bound and 'device' in self.data: - try: - device = self.fields['device'].to_python(self.data['device']) - except forms.ValidationError: - pass - if device and device.virtual_chassis: - self.fields['lag'].queryset = Interface.objects.filter( - Q(device=device) | Q(device__virtual_chassis=device.virtual_chassis), - type=InterfaceTypeChoices.TYPE_LAG - ) - self.fields['parent'].queryset = Interface.objects.filter( - Q(device=device) | Q(device__virtual_chassis=device.virtual_chassis) - ) - elif device: - self.fields['lag'].queryset = Interface.objects.filter( - device=device, - type=InterfaceTypeChoices.TYPE_LAG - ) - self.fields['parent'].queryset = Interface.objects.filter(device=device) - else: - self.fields['lag'].queryset = Interface.objects.none() - self.fields['parent'].queryset = Interface.objects.none() - - def clean_enabled(self): - # Make sure enabled is True when it's not included in the uploaded data - if 'enabled' not in self.data: - return True - else: - return self.cleaned_data['enabled'] - - -# -# Front pass-through ports -# - -class FrontPortFilterForm(DeviceComponentFilterForm): - field_groups = [ - ['q', 'tag'], - ['name', 'label', 'type', 'color'], - ['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'], - ] - model = FrontPort - type = forms.MultipleChoiceField( - choices=PortTypeChoices, - required=False, - widget=StaticSelectMultiple() - ) - color = ColorField( - required=False - ) - tag = TagFilterField(model) - - -class FrontPortForm(BootstrapMixin, CustomFieldModelForm): - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = FrontPort - fields = [ - 'device', 'name', 'label', 'type', 'color', 'rear_port', 'rear_port_position', 'mark_connected', - 'description', 'tags', - ] - widgets = { - 'device': forms.HiddenInput(), - 'type': StaticSelect(), - 'rear_port': StaticSelect(), - } - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - # Limit RearPort choices to the local device - if hasattr(self.instance, 'device'): - self.fields['rear_port'].queryset = self.fields['rear_port'].queryset.filter( - device=self.instance.device - ) - - -# TODO: Merge with FrontPortTemplateCreateForm to remove duplicate logic -class FrontPortCreateForm(ComponentCreateForm): - model = FrontPort - type = forms.ChoiceField( - choices=PortTypeChoices, - widget=StaticSelect(), - ) - color = ColorField( - required=False - ) - rear_port_set = forms.MultipleChoiceField( - choices=[], - label='Rear ports', - help_text='Select one rear port assignment for each front port being created.', - ) - field_order = ( - 'device', 'name_pattern', 'label_pattern', 'type', 'color', 'rear_port_set', 'mark_connected', 'description', - 'tags', - ) - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - device = Device.objects.get( - pk=self.initial.get('device') or self.data.get('device') - ) - - # Determine which rear port positions are occupied. These will be excluded from the list of available - # mappings. - occupied_port_positions = [ - (front_port.rear_port_id, front_port.rear_port_position) - for front_port in device.frontports.all() - ] - - # Populate rear port choices - choices = [] - rear_ports = RearPort.objects.filter(device=device) - for rear_port in rear_ports: - for i in range(1, rear_port.positions + 1): - if (rear_port.pk, i) not in occupied_port_positions: - choices.append( - ('{}:{}'.format(rear_port.pk, i), '{}:{}'.format(rear_port.name, i)) - ) - self.fields['rear_port_set'].choices = choices - - def clean(self): - super().clean() - - # Validate that the number of ports being created equals the number of selected (rear port, position) tuples - front_port_count = len(self.cleaned_data['name_pattern']) - rear_port_count = len(self.cleaned_data['rear_port_set']) - if front_port_count != rear_port_count: - raise forms.ValidationError({ - 'rear_port_set': 'The provided name pattern will create {} ports, however {} rear port assignments ' - 'were selected. These counts must match.'.format(front_port_count, rear_port_count) - }) - - def get_iterative_data(self, iteration): - - # Assign rear port and position from selected set - rear_port, position = self.cleaned_data['rear_port_set'][iteration].split(':') - - return { - 'rear_port': int(rear_port), - 'rear_port_position': int(position), - } - - -# class FrontPortBulkCreateForm( -# form_from_model(FrontPort, ['label', 'type', 'description', 'tags']), -# DeviceBulkAddComponentForm -# ): -# pass - - -class FrontPortBulkEditForm( - form_from_model(FrontPort, ['label', 'type', 'color', 'mark_connected', 'description']), - BootstrapMixin, - AddRemoveTagsForm, - CustomFieldModelBulkEditForm -): - pk = forms.ModelMultipleChoiceField( - queryset=FrontPort.objects.all(), - widget=forms.MultipleHiddenInput() - ) - - class Meta: - nullable_fields = ['label', 'description'] - - -class FrontPortCSVForm(CustomFieldModelCSVForm): - device = CSVModelChoiceField( - queryset=Device.objects.all(), - to_field_name='name' - ) - rear_port = CSVModelChoiceField( - queryset=RearPort.objects.all(), - to_field_name='name', - help_text='Corresponding rear port' - ) - type = CSVChoiceField( - choices=PortTypeChoices, - help_text='Physical medium classification' - ) - - class Meta: - model = FrontPort - fields = ( - 'device', 'name', 'label', 'type', 'color', 'mark_connected', 'rear_port', 'rear_port_position', - 'description', - ) - help_texts = { - 'rear_port_position': 'Mapped position on corresponding rear port', - } - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - # Limit RearPort choices to those belonging to this device (or VC master) - if self.is_bound: - try: - device = self.fields['device'].to_python(self.data['device']) - except forms.ValidationError: - device = None - else: - try: - device = self.instance.device - except Device.DoesNotExist: - device = None - - if device: - self.fields['rear_port'].queryset = RearPort.objects.filter( - device__in=[device, device.get_vc_master()] - ) - else: - self.fields['rear_port'].queryset = RearPort.objects.none() - - -# -# Rear pass-through ports -# - -class RearPortFilterForm(DeviceComponentFilterForm): - model = RearPort - field_groups = [ - ['q', 'tag'], - ['name', 'label', 'type', 'color'], - ['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'], - ] - type = forms.MultipleChoiceField( - choices=PortTypeChoices, - required=False, - widget=StaticSelectMultiple() - ) - color = ColorField( - required=False - ) - tag = TagFilterField(model) - - -class RearPortForm(BootstrapMixin, CustomFieldModelForm): - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = RearPort - fields = [ - 'device', 'name', 'label', 'type', 'color', 'positions', 'mark_connected', 'description', 'tags', - ] - widgets = { - 'device': forms.HiddenInput(), - 'type': StaticSelect(), - } - - -class RearPortCreateForm(ComponentCreateForm): - model = RearPort - type = forms.ChoiceField( - choices=PortTypeChoices, - widget=StaticSelect(), - ) - color = ColorField( - required=False - ) - positions = forms.IntegerField( - min_value=REARPORT_POSITIONS_MIN, - max_value=REARPORT_POSITIONS_MAX, - initial=1, - help_text='The number of front ports which may be mapped to each rear port' - ) - field_order = ( - 'device', 'name_pattern', 'label_pattern', 'type', 'color', 'positions', 'mark_connected', 'description', - 'tags', - ) - - -class RearPortBulkCreateForm( - form_from_model(RearPort, ['type', 'color', 'positions', 'mark_connected']), - DeviceBulkAddComponentForm -): - model = RearPort - field_order = ('name_pattern', 'label_pattern', 'type', 'positions', 'mark_connected', 'description', 'tags') - - -class RearPortBulkEditForm( - form_from_model(RearPort, ['label', 'type', 'color', 'mark_connected', 'description']), - BootstrapMixin, - AddRemoveTagsForm, - CustomFieldModelBulkEditForm -): - pk = forms.ModelMultipleChoiceField( - queryset=RearPort.objects.all(), - widget=forms.MultipleHiddenInput() - ) - - class Meta: - nullable_fields = ['label', 'description'] - - -class RearPortCSVForm(CustomFieldModelCSVForm): - device = CSVModelChoiceField( - queryset=Device.objects.all(), - to_field_name='name' - ) - type = CSVChoiceField( - help_text='Physical medium classification', - choices=PortTypeChoices, - ) - - class Meta: - model = RearPort - fields = ('device', 'name', 'label', 'type', 'color', 'mark_connected', 'positions', 'description') - help_texts = { - 'positions': 'Number of front ports which may be mapped' - } - - -# -# Device bays -# - -class DeviceBayFilterForm(DeviceComponentFilterForm): - model = DeviceBay - field_groups = [ - ['q', 'tag'], - ['name', 'label'], - ['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'], - ] - tag = TagFilterField(model) - - -class DeviceBayForm(BootstrapMixin, CustomFieldModelForm): - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = DeviceBay - fields = [ - 'device', 'name', 'label', 'description', 'tags', - ] - widgets = { - 'device': forms.HiddenInput(), - } - - -class DeviceBayCreateForm(ComponentCreateForm): - model = DeviceBay - field_order = ('device', 'name_pattern', 'label_pattern', 'description', 'tags') - - -class PopulateDeviceBayForm(BootstrapMixin, forms.Form): - installed_device = forms.ModelChoiceField( - queryset=Device.objects.all(), - label='Child Device', - help_text="Child devices must first be created and assigned to the site/rack of the parent device.", - widget=StaticSelect(), - ) - - def __init__(self, device_bay, *args, **kwargs): - - super().__init__(*args, **kwargs) - - self.fields['installed_device'].queryset = Device.objects.filter( - site=device_bay.device.site, - rack=device_bay.device.rack, - parent_bay__isnull=True, - device_type__u_height=0, - device_type__subdevice_role=SubdeviceRoleChoices.ROLE_CHILD - ).exclude(pk=device_bay.device.pk) - - -class DeviceBayBulkCreateForm(DeviceBulkAddComponentForm): - model = DeviceBay - field_order = ('name_pattern', 'label_pattern', 'description', 'tags') - - -class DeviceBayBulkEditForm( - form_from_model(DeviceBay, ['label', 'description']), - BootstrapMixin, - AddRemoveTagsForm, - CustomFieldModelBulkEditForm -): - pk = forms.ModelMultipleChoiceField( - queryset=DeviceBay.objects.all(), - widget=forms.MultipleHiddenInput() - ) - - class Meta: - nullable_fields = ['label', 'description'] - - -class DeviceBayCSVForm(CustomFieldModelCSVForm): - device = CSVModelChoiceField( - queryset=Device.objects.all(), - to_field_name='name' - ) - installed_device = CSVModelChoiceField( - queryset=Device.objects.all(), - required=False, - to_field_name='name', - help_text='Child device installed within this bay', - error_messages={ - 'invalid_choice': 'Child device not found.', - } - ) - - class Meta: - model = DeviceBay - fields = ('device', 'name', 'label', 'installed_device', 'description') - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - # Limit installed device choices to devices of the correct type and location - if self.is_bound: - try: - device = self.fields['device'].to_python(self.data['device']) - except forms.ValidationError: - device = None - else: - try: - device = self.instance.device - except Device.DoesNotExist: - device = None - - if device: - self.fields['installed_device'].queryset = Device.objects.filter( - site=device.site, - rack=device.rack, - parent_bay__isnull=True, - device_type__u_height=0, - device_type__subdevice_role=SubdeviceRoleChoices.ROLE_CHILD - ).exclude(pk=device.pk) - else: - self.fields['installed_device'].queryset = Interface.objects.none() - - -# -# Inventory items -# - -class InventoryItemForm(BootstrapMixin, CustomFieldModelForm): - device = DynamicModelChoiceField( - queryset=Device.objects.all() - ) - parent = DynamicModelChoiceField( - queryset=InventoryItem.objects.all(), - required=False, - query_params={ - 'device_id': '$device' - } - ) - manufacturer = DynamicModelChoiceField( - queryset=Manufacturer.objects.all(), - required=False - ) - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = InventoryItem - fields = [ - 'device', 'parent', 'name', 'label', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'description', - 'tags', - ] - - -class InventoryItemCreateForm(ComponentCreateForm): - model = InventoryItem - manufacturer = DynamicModelChoiceField( - queryset=Manufacturer.objects.all(), - required=False - ) - parent = DynamicModelChoiceField( - queryset=InventoryItem.objects.all(), - required=False, - query_params={ - 'device_id': '$device' - } - ) - part_id = forms.CharField( - max_length=50, - required=False, - label='Part ID' - ) - serial = forms.CharField( - max_length=50, - required=False, - ) - asset_tag = forms.CharField( - max_length=50, - required=False, - ) - field_order = ( - 'device', 'parent', 'name_pattern', 'label_pattern', 'manufacturer', 'part_id', 'serial', 'asset_tag', - 'description', 'tags', - ) - - -class InventoryItemCSVForm(CustomFieldModelCSVForm): - device = CSVModelChoiceField( - queryset=Device.objects.all(), - to_field_name='name' - ) - manufacturer = CSVModelChoiceField( - queryset=Manufacturer.objects.all(), - to_field_name='name', - required=False - ) - parent = CSVModelChoiceField( - queryset=Device.objects.all(), - to_field_name='name', - required=False, - help_text='Parent inventory item' - ) - - class Meta: - model = InventoryItem - fields = ( - 'device', 'name', 'label', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'discovered', 'description', - ) - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - # Limit parent choices to inventory items belonging to this device - device = None - if self.is_bound and 'device' in self.data: - try: - device = self.fields['device'].to_python(self.data['device']) - except forms.ValidationError: - pass - if device: - self.fields['parent'].queryset = InventoryItem.objects.filter(device=device) - else: - self.fields['parent'].queryset = InventoryItem.objects.none() - - -class InventoryItemBulkCreateForm( - form_from_model(InventoryItem, ['manufacturer', 'part_id', 'serial', 'asset_tag', 'discovered']), - DeviceBulkAddComponentForm -): - model = InventoryItem - field_order = ( - 'name_pattern', 'label_pattern', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'discovered', 'description', - 'tags', - ) - - -class InventoryItemBulkEditForm( - form_from_model(InventoryItem, ['label', 'manufacturer', 'part_id', 'description']), - BootstrapMixin, - AddRemoveTagsForm, - CustomFieldModelBulkEditForm -): - pk = forms.ModelMultipleChoiceField( - queryset=InventoryItem.objects.all(), - widget=forms.MultipleHiddenInput() - ) - manufacturer = DynamicModelChoiceField( - queryset=Manufacturer.objects.all(), - required=False - ) - - class Meta: - nullable_fields = ['label', 'manufacturer', 'part_id', 'description'] - - -class InventoryItemFilterForm(DeviceComponentFilterForm): - model = InventoryItem - field_groups = [ - ['q', 'tag'], - ['name', 'label', 'manufacturer_id', 'serial', 'asset_tag', 'discovered'], - ['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'], - ] - manufacturer_id = DynamicModelMultipleChoiceField( - queryset=Manufacturer.objects.all(), - required=False, - label=_('Manufacturer'), - fetch_trigger='open' - ) - serial = forms.CharField( - required=False - ) - asset_tag = forms.CharField( - required=False - ) - discovered = forms.NullBooleanField( - required=False, - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - tag = TagFilterField(model) - - -# -# Cables -# - -class ConnectCableToDeviceForm(BootstrapMixin, CustomFieldModelForm): - """ - Base form for connecting a Cable to a Device component - """ - termination_b_region = DynamicModelChoiceField( - queryset=Region.objects.all(), - label='Region', - required=False - ) - termination_b_site_group = DynamicModelChoiceField( - queryset=SiteGroup.objects.all(), - label='Site group', - required=False - ) - termination_b_site = DynamicModelChoiceField( - queryset=Site.objects.all(), - label='Site', - required=False, - query_params={ - 'region_id': '$termination_b_region', - 'group_id': '$termination_b_site_group', - } - ) - termination_b_location = DynamicModelChoiceField( - queryset=Location.objects.all(), - label='Location', - required=False, - null_option='None', - query_params={ - 'site_id': '$termination_b_site' - } - ) - termination_b_rack = DynamicModelChoiceField( - queryset=Rack.objects.all(), - label='Rack', - required=False, - null_option='None', - query_params={ - 'site_id': '$termination_b_site', - 'location_id': '$termination_b_location', - } - ) - termination_b_device = DynamicModelChoiceField( - queryset=Device.objects.all(), - label='Device', - required=False, - query_params={ - 'site_id': '$termination_b_site', - 'location_id': '$termination_b_location', - 'rack_id': '$termination_b_rack', - } - ) - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = Cable - fields = [ - 'termination_b_region', 'termination_b_site', 'termination_b_rack', 'termination_b_device', - 'termination_b_id', 'type', 'status', 'label', 'color', 'length', 'length_unit', 'tags', - ] - widgets = { - 'status': StaticSelect, - 'type': StaticSelect, - 'length_unit': StaticSelect, - } - - def clean_termination_b_id(self): - # Return the PK rather than the object - return getattr(self.cleaned_data['termination_b_id'], 'pk', None) - - -class ConnectCableToConsolePortForm(ConnectCableToDeviceForm): - termination_b_id = DynamicModelChoiceField( - queryset=ConsolePort.objects.all(), - label='Name', - disabled_indicator='_occupied', - query_params={ - 'device_id': '$termination_b_device' - } - ) - - -class ConnectCableToConsoleServerPortForm(ConnectCableToDeviceForm): - termination_b_id = DynamicModelChoiceField( - queryset=ConsoleServerPort.objects.all(), - label='Name', - disabled_indicator='_occupied', - query_params={ - 'device_id': '$termination_b_device' - } - ) - - -class ConnectCableToPowerPortForm(ConnectCableToDeviceForm): - termination_b_id = DynamicModelChoiceField( - queryset=PowerPort.objects.all(), - label='Name', - disabled_indicator='_occupied', - query_params={ - 'device_id': '$termination_b_device' - } - ) - - -class ConnectCableToPowerOutletForm(ConnectCableToDeviceForm): - termination_b_id = DynamicModelChoiceField( - queryset=PowerOutlet.objects.all(), - label='Name', - disabled_indicator='_occupied', - query_params={ - 'device_id': '$termination_b_device' - } - ) - - -class ConnectCableToInterfaceForm(ConnectCableToDeviceForm): - termination_b_id = DynamicModelChoiceField( - queryset=Interface.objects.all(), - label='Name', - disabled_indicator='_occupied', - query_params={ - 'device_id': '$termination_b_device', - 'kind': 'physical', - } - ) - - -class ConnectCableToFrontPortForm(ConnectCableToDeviceForm): - termination_b_id = DynamicModelChoiceField( - queryset=FrontPort.objects.all(), - label='Name', - disabled_indicator='_occupied', - query_params={ - 'device_id': '$termination_b_device' - } - ) - - -class ConnectCableToRearPortForm(ConnectCableToDeviceForm): - termination_b_id = DynamicModelChoiceField( - queryset=RearPort.objects.all(), - label='Name', - disabled_indicator='_occupied', - query_params={ - 'device_id': '$termination_b_device' - } - ) - - -class ConnectCableToCircuitTerminationForm(BootstrapMixin, CustomFieldModelForm): - termination_b_provider = DynamicModelChoiceField( - queryset=Provider.objects.all(), - label='Provider', - required=False - ) - termination_b_region = DynamicModelChoiceField( - queryset=Region.objects.all(), - label='Region', - required=False - ) - termination_b_site_group = DynamicModelChoiceField( - queryset=SiteGroup.objects.all(), - label='Site group', - required=False - ) - termination_b_site = DynamicModelChoiceField( - queryset=Site.objects.all(), - label='Site', - required=False, - query_params={ - 'region_id': '$termination_b_region', - 'group_id': '$termination_b_site_group', - } - ) - termination_b_circuit = DynamicModelChoiceField( - queryset=Circuit.objects.all(), - label='Circuit', - query_params={ - 'provider_id': '$termination_b_provider', - 'site_id': '$termination_b_site', - } - ) - termination_b_id = DynamicModelChoiceField( - queryset=CircuitTermination.objects.all(), - label='Side', - disabled_indicator='_occupied', - query_params={ - 'circuit_id': '$termination_b_circuit' - } - ) - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = Cable - fields = [ - 'termination_b_provider', 'termination_b_region', 'termination_b_site', 'termination_b_circuit', - 'termination_b_id', 'type', 'status', 'label', 'color', 'length', 'length_unit', 'tags', - ] - - def clean_termination_b_id(self): - # Return the PK rather than the object - return getattr(self.cleaned_data['termination_b_id'], 'pk', None) - - -class ConnectCableToPowerFeedForm(BootstrapMixin, CustomFieldModelForm): - termination_b_region = DynamicModelChoiceField( - queryset=Region.objects.all(), - label='Region', - required=False - ) - termination_b_site_group = DynamicModelChoiceField( - queryset=SiteGroup.objects.all(), - label='Site group', - required=False - ) - termination_b_site = DynamicModelChoiceField( - queryset=Site.objects.all(), - label='Site', - required=False, - query_params={ - 'region_id': '$termination_b_region', - 'group_id': '$termination_b_site_group', - } - ) - termination_b_location = DynamicModelChoiceField( - queryset=Location.objects.all(), - label='Location', - required=False, - query_params={ - 'site_id': '$termination_b_site' - } - ) - termination_b_powerpanel = DynamicModelChoiceField( - queryset=PowerPanel.objects.all(), - label='Power Panel', - required=False, - query_params={ - 'site_id': '$termination_b_site', - 'location_id': '$termination_b_location', - } - ) - termination_b_id = DynamicModelChoiceField( - queryset=PowerFeed.objects.all(), - label='Name', - disabled_indicator='_occupied', - query_params={ - 'power_panel_id': '$termination_b_powerpanel' - } - ) - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = Cable - fields = [ - 'termination_b_location', 'termination_b_powerpanel', 'termination_b_id', 'type', 'status', 'label', - 'color', 'length', 'length_unit', 'tags', - ] - - def clean_termination_b_id(self): - # Return the PK rather than the object - return getattr(self.cleaned_data['termination_b_id'], 'pk', None) - - -class CableForm(BootstrapMixin, CustomFieldModelForm): - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = Cable - fields = [ - 'type', 'status', 'label', 'color', 'length', 'length_unit', 'tags', - ] - widgets = { - 'status': StaticSelect, - 'type': StaticSelect, - 'length_unit': StaticSelect, - } - error_messages = { - 'length': { - 'max_value': 'Maximum length is 32767 (any unit)' - } - } - - -class CableCSVForm(CustomFieldModelCSVForm): - # Termination A - side_a_device = CSVModelChoiceField( - queryset=Device.objects.all(), - to_field_name='name', - help_text='Side A device' - ) - side_a_type = CSVContentTypeField( - queryset=ContentType.objects.all(), - limit_choices_to=CABLE_TERMINATION_MODELS, - help_text='Side A type' - ) - side_a_name = forms.CharField( - help_text='Side A component name' - ) - - # Termination B - side_b_device = CSVModelChoiceField( - queryset=Device.objects.all(), - to_field_name='name', - help_text='Side B device' - ) - side_b_type = CSVContentTypeField( - queryset=ContentType.objects.all(), - limit_choices_to=CABLE_TERMINATION_MODELS, - help_text='Side B type' - ) - side_b_name = forms.CharField( - help_text='Side B component name' - ) - - # Cable attributes - status = CSVChoiceField( - choices=CableStatusChoices, - required=False, - help_text='Connection status' - ) - type = CSVChoiceField( - choices=CableTypeChoices, - required=False, - help_text='Physical medium classification' - ) - length_unit = CSVChoiceField( - choices=CableLengthUnitChoices, - required=False, - help_text='Length unit' - ) - - class Meta: - model = Cable - fields = [ - 'side_a_device', 'side_a_type', 'side_a_name', 'side_b_device', 'side_b_type', 'side_b_name', 'type', - 'status', 'label', 'color', 'length', 'length_unit', - ] - help_texts = { - 'color': mark_safe('RGB color in hexadecimal (e.g. 00ff00)'), - } - - def _clean_side(self, side): - """ - Derive a Cable's A/B termination objects. - - :param side: 'a' or 'b' - """ - assert side in 'ab', f"Invalid side designation: {side}" - - device = self.cleaned_data.get(f'side_{side}_device') - content_type = self.cleaned_data.get(f'side_{side}_type') - name = self.cleaned_data.get(f'side_{side}_name') - if not device or not content_type or not name: - return None - - model = content_type.model_class() - try: - termination_object = model.objects.get(device=device, name=name) - if termination_object.cable is not None: - raise forms.ValidationError(f"Side {side.upper()}: {device} {termination_object} is already connected") - except ObjectDoesNotExist: - raise forms.ValidationError(f"{side.upper()} side termination not found: {device} {name}") - - setattr(self.instance, f'termination_{side}', termination_object) - return termination_object - - def clean_side_a_name(self): - return self._clean_side('a') - - def clean_side_b_name(self): - return self._clean_side('b') - - def clean_length_unit(self): - # Avoid trying to save as NULL - length_unit = self.cleaned_data.get('length_unit', None) - return length_unit if length_unit is not None else '' - - -class CableBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Cable.objects.all(), - widget=forms.MultipleHiddenInput - ) - type = forms.ChoiceField( - choices=add_blank_choice(CableTypeChoices), - required=False, - initial='', - widget=StaticSelect() - ) - status = forms.ChoiceField( - choices=add_blank_choice(CableStatusChoices), - required=False, - widget=StaticSelect(), - initial='' - ) - label = forms.CharField( - max_length=100, - required=False - ) - color = ColorField( - required=False - ) - length = forms.DecimalField( - min_value=0, - required=False - ) - length_unit = forms.ChoiceField( - choices=add_blank_choice(CableLengthUnitChoices), - required=False, - initial='', - widget=StaticSelect() - ) - - class Meta: - nullable_fields = [ - 'type', 'status', 'label', 'color', 'length', - ] - - def clean(self): - super().clean() - - # Validate length/unit - length = self.cleaned_data.get('length') - length_unit = self.cleaned_data.get('length_unit') - if length and not length_unit: - raise forms.ValidationError({ - 'length_unit': "Must specify a unit when setting length" - }) - - -class CableFilterForm(BootstrapMixin, CustomFieldModelFilterForm): - model = Cable - field_groups = [ - ['q', 'tag'], - ['site_id', 'rack_id', 'device_id'], - ['type', 'status', 'color'], - ['tenant_id'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - region_id = DynamicModelMultipleChoiceField( - queryset=Region.objects.all(), - required=False, - label=_('Region'), - fetch_trigger='open' - ) - site_id = DynamicModelMultipleChoiceField( - queryset=Site.objects.all(), - required=False, - query_params={ - 'region_id': '$region_id' - }, - label=_('Site'), - fetch_trigger='open' - ) - tenant_id = DynamicModelMultipleChoiceField( - queryset=Tenant.objects.all(), - required=False, - label=_('Tenant'), - fetch_trigger='open' - ) - rack_id = DynamicModelMultipleChoiceField( - queryset=Rack.objects.all(), - required=False, - label=_('Rack'), - null_option='None', - query_params={ - 'site_id': '$site_id' - }, - fetch_trigger='open' - ) - type = forms.MultipleChoiceField( - choices=add_blank_choice(CableTypeChoices), - required=False, - widget=StaticSelect() - ) - status = forms.ChoiceField( - required=False, - choices=add_blank_choice(CableStatusChoices), - widget=StaticSelect() - ) - color = ColorField( - required=False - ) - device_id = DynamicModelMultipleChoiceField( - queryset=Device.objects.all(), - required=False, - query_params={ - 'site_id': '$site_id', - 'tenant_id': '$tenant_id', - 'rack_id': '$rack_id', - }, - label=_('Device'), - fetch_trigger='open' - ) - tag = TagFilterField(model) - - -# -# Connections -# - -class ConsoleConnectionFilterForm(BootstrapMixin, forms.Form): - region_id = DynamicModelMultipleChoiceField( - queryset=Region.objects.all(), - required=False, - label=_('Region'), - fetch_trigger='open' - ) - site_id = DynamicModelMultipleChoiceField( - queryset=Site.objects.all(), - required=False, - query_params={ - 'region_id': '$region_id' - }, - label=_('Site'), - fetch_trigger='open' - ) - device_id = DynamicModelMultipleChoiceField( - queryset=Device.objects.all(), - required=False, - query_params={ - 'site_id': '$site_id' - }, - label=_('Device'), - fetch_trigger='open' - ) - - -class PowerConnectionFilterForm(BootstrapMixin, forms.Form): - region_id = DynamicModelMultipleChoiceField( - queryset=Region.objects.all(), - required=False, - label=_('Region'), - fetch_trigger='open' - ) - site_id = DynamicModelMultipleChoiceField( - queryset=Site.objects.all(), - required=False, - query_params={ - 'region_id': '$region_id' - }, - label=_('Site'), - fetch_trigger='open' - ) - device_id = DynamicModelMultipleChoiceField( - queryset=Device.objects.all(), - required=False, - query_params={ - 'site_id': '$site_id' - }, - label=_('Device'), - fetch_trigger='open' - ) - - -class InterfaceConnectionFilterForm(BootstrapMixin, forms.Form): - region_id = DynamicModelMultipleChoiceField( - queryset=Region.objects.all(), - required=False, - label=_('Region'), - fetch_trigger='open' - ) - site_id = DynamicModelMultipleChoiceField( - queryset=Site.objects.all(), - required=False, - query_params={ - 'region_id': '$region_id' - }, - label=_('Site'), - fetch_trigger='open' - ) - device_id = DynamicModelMultipleChoiceField( - queryset=Device.objects.all(), - required=False, - query_params={ - 'site_id': '$site_id' - }, - label=_('Device'), - fetch_trigger='open' - ) - - -# -# Virtual chassis -# - -class DeviceSelectionForm(forms.Form): - pk = forms.ModelMultipleChoiceField( - queryset=Device.objects.all(), - widget=forms.MultipleHiddenInput() - ) - - -class VirtualChassisCreateForm(BootstrapMixin, CustomFieldModelForm): - region = DynamicModelChoiceField( - queryset=Region.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - } - ) - site_group = DynamicModelChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - } - ) - site = DynamicModelChoiceField( - queryset=Site.objects.all(), - required=False, - query_params={ - 'region_id': '$region', - 'group_id': '$site_group', - } - ) - rack = DynamicModelChoiceField( - queryset=Rack.objects.all(), - required=False, - null_option='None', - query_params={ - 'site_id': '$site' - } - ) - members = DynamicModelMultipleChoiceField( - queryset=Device.objects.all(), - required=False, - query_params={ - 'site_id': '$site', - 'rack_id': '$rack', - } - ) - initial_position = forms.IntegerField( - initial=1, - required=False, - help_text='Position of the first member device. Increases by one for each additional member.' - ) - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = VirtualChassis - fields = [ - 'name', 'domain', 'region', 'site_group', 'site', 'rack', 'members', 'initial_position', 'tags', - ] - - def save(self, *args, **kwargs): - instance = super().save(*args, **kwargs) - - # Assign VC members - if instance.pk: - initial_position = self.cleaned_data.get('initial_position') or 1 - for i, member in enumerate(self.cleaned_data['members'], start=initial_position): - member.virtual_chassis = instance - member.vc_position = i - member.save() - - return instance - - -class VirtualChassisForm(BootstrapMixin, CustomFieldModelForm): - master = forms.ModelChoiceField( - queryset=Device.objects.all(), - required=False, - ) - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = VirtualChassis - fields = [ - 'name', 'domain', 'master', 'tags', - ] - widgets = { - 'master': SelectWithPK(), - } - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - self.fields['master'].queryset = Device.objects.filter(virtual_chassis=self.instance) - - -class BaseVCMemberFormSet(forms.BaseModelFormSet): - - def clean(self): - super().clean() - - # Check for duplicate VC position values - vc_position_list = [] - for form in self.forms: - vc_position = form.cleaned_data.get('vc_position') - if vc_position: - if vc_position in vc_position_list: - error_msg = 'A virtual chassis member already exists in position {}.'.format(vc_position) - form.add_error('vc_position', error_msg) - vc_position_list.append(vc_position) - - -class DeviceVCMembershipForm(forms.ModelForm): - - class Meta: - model = Device - fields = [ - 'vc_position', 'vc_priority', - ] - labels = { - 'vc_position': 'Position', - 'vc_priority': 'Priority', - } - - def __init__(self, validate_vc_position=False, *args, **kwargs): - super().__init__(*args, **kwargs) - - # Require VC position (only required when the Device is a VirtualChassis member) - self.fields['vc_position'].required = True - - # Add bootstrap classes to form elements. - self.fields['vc_position'].widget.attrs = {'class': 'form-control'} - self.fields['vc_priority'].widget.attrs = {'class': 'form-control'} - - # Validation of vc_position is optional. This is only required when adding a new member to an existing - # VirtualChassis. Otherwise, vc_position validation is handled by BaseVCMemberFormSet. - self.validate_vc_position = validate_vc_position - - def clean_vc_position(self): - vc_position = self.cleaned_data['vc_position'] - - if self.validate_vc_position: - conflicting_members = Device.objects.filter( - virtual_chassis=self.instance.virtual_chassis, - vc_position=vc_position - ) - if conflicting_members.exists(): - raise forms.ValidationError( - 'A virtual chassis member already exists in position {}.'.format(vc_position) - ) - - return vc_position - - -class VCMemberSelectForm(BootstrapMixin, forms.Form): - region = DynamicModelChoiceField( - queryset=Region.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - } - ) - site_group = DynamicModelChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - } - ) - site = DynamicModelChoiceField( - queryset=Site.objects.all(), - required=False, - query_params={ - 'region_id': '$region', - 'group_id': '$site_group', - } - ) - rack = DynamicModelChoiceField( - queryset=Rack.objects.all(), - required=False, - null_option='None', - query_params={ - 'site_id': '$site' - } - ) - device = DynamicModelChoiceField( - queryset=Device.objects.all(), - query_params={ - 'site_id': '$site', - 'rack_id': '$rack', - 'virtual_chassis_id': 'null', - } - ) - - def clean_device(self): - device = self.cleaned_data['device'] - if device.virtual_chassis is not None: - raise forms.ValidationError( - f"Device {device} is already assigned to a virtual chassis." - ) - return device - - -class VirtualChassisBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=VirtualChassis.objects.all(), - widget=forms.MultipleHiddenInput() - ) - domain = forms.CharField( - max_length=30, - required=False - ) - - class Meta: - nullable_fields = ['domain'] - - -class VirtualChassisCSVForm(CustomFieldModelCSVForm): - master = CSVModelChoiceField( - queryset=Device.objects.all(), - to_field_name='name', - required=False, - help_text='Master device' - ) - - class Meta: - model = VirtualChassis - fields = ('name', 'domain', 'master') - - -class VirtualChassisFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm): - model = VirtualChassis - field_order = ['q', 'region_id', 'site_group_id', 'site_id', 'tenant_group_id', 'tenant_id'] - field_groups = [ - ['q', 'tag'], - ['region_id', 'site_group_id', 'site_id'], - ['tenant_group_id', 'tenant_id'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - region_id = DynamicModelMultipleChoiceField( - queryset=Region.objects.all(), - required=False, - label=_('Region'), - fetch_trigger='open' - ) - site_group_id = DynamicModelMultipleChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - label=_('Site group'), - fetch_trigger='open' - ) - site_id = DynamicModelMultipleChoiceField( - queryset=Site.objects.all(), - required=False, - query_params={ - 'region_id': '$region_id', - 'group_id': '$site_group_id', - }, - label=_('Site'), - fetch_trigger='open' - ) - tag = TagFilterField(model) - - -# -# Power panels -# - -class PowerPanelForm(BootstrapMixin, CustomFieldModelForm): - region = DynamicModelChoiceField( - queryset=Region.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - } - ) - site_group = DynamicModelChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - } - ) - site = DynamicModelChoiceField( - queryset=Site.objects.all(), - query_params={ - 'region_id': '$region', - 'group_id': '$site_group', - } - ) - location = DynamicModelChoiceField( - queryset=Location.objects.all(), - required=False, - query_params={ - 'site_id': '$site' - } - ) - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = PowerPanel - fields = [ - 'region', 'site_group', 'site', 'location', 'name', 'tags', - ] - fieldsets = ( - ('Power Panel', ('region', 'site_group', 'site', 'location', 'name', 'tags')), - ) - - -class PowerPanelCSVForm(CustomFieldModelCSVForm): - site = CSVModelChoiceField( - queryset=Site.objects.all(), - to_field_name='name', - help_text='Name of parent site' - ) - location = CSVModelChoiceField( - queryset=Location.objects.all(), - required=False, - to_field_name='name' - ) - - class Meta: - model = PowerPanel - fields = ('site', 'location', 'name') - - def __init__(self, data=None, *args, **kwargs): - super().__init__(data, *args, **kwargs) - - if data: - - # Limit group queryset by assigned site - params = {f"site__{self.fields['site'].to_field_name}": data.get('site')} - self.fields['location'].queryset = self.fields['location'].queryset.filter(**params) - - -class PowerPanelBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=PowerPanel.objects.all(), - widget=forms.MultipleHiddenInput - ) - region = DynamicModelChoiceField( - queryset=Region.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - } - ) - site_group = DynamicModelChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - } - ) - site = DynamicModelChoiceField( - queryset=Site.objects.all(), - required=False, - query_params={ - 'region_id': '$region', - 'group_id': '$site_group', - } - ) - location = DynamicModelChoiceField( - queryset=Location.objects.all(), - required=False, - query_params={ - 'site_id': '$site' - } - ) - - class Meta: - nullable_fields = ['location'] - - -class PowerPanelFilterForm(BootstrapMixin, CustomFieldModelFilterForm): - model = PowerPanel - field_groups = ( - ('q', 'tag'), - ('region_id', 'site_group_id', 'site_id', 'location_id') - ) - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - region_id = DynamicModelMultipleChoiceField( - queryset=Region.objects.all(), - required=False, - label=_('Region'), - fetch_trigger='open' - ) - site_group_id = DynamicModelMultipleChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - label=_('Site group'), - fetch_trigger='open' - ) - site_id = DynamicModelMultipleChoiceField( - queryset=Site.objects.all(), - required=False, - query_params={ - 'region_id': '$region_id', - 'group_id': '$site_group_id', - }, - label=_('Site'), - fetch_trigger='open' - ) - location_id = DynamicModelMultipleChoiceField( - queryset=Location.objects.all(), - required=False, - null_option='None', - query_params={ - 'site_id': '$site_id' - }, - label=_('Location'), - fetch_trigger='open' - ) - tag = TagFilterField(model) - - -# -# Power feeds -# - -class PowerFeedForm(BootstrapMixin, CustomFieldModelForm): - region = DynamicModelChoiceField( - queryset=Region.objects.all(), - required=False, - initial_params={ - 'sites__powerpanel': '$power_panel' - } - ) - site_group = DynamicModelChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - } - ) - site = DynamicModelChoiceField( - queryset=Site.objects.all(), - required=False, - initial_params={ - 'powerpanel': '$power_panel' - }, - query_params={ - 'region_id': '$region', - 'group_id': '$site_group', - } - ) - power_panel = DynamicModelChoiceField( - queryset=PowerPanel.objects.all(), - query_params={ - 'site_id': '$site' - } - ) - rack = DynamicModelChoiceField( - queryset=Rack.objects.all(), - required=False, - query_params={ - 'site_id': '$site' - } - ) - comments = CommentField() - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = PowerFeed - fields = [ - 'region', 'site_group', 'site', 'power_panel', 'rack', 'name', 'status', 'type', 'mark_connected', 'supply', - 'phase', 'voltage', 'amperage', 'max_utilization', 'comments', 'tags', - ] - fieldsets = ( - ('Power Panel', ('region', 'site', 'power_panel')), - ('Power Feed', ('rack', 'name', 'status', 'type', 'mark_connected', 'tags')), - ('Characteristics', ('supply', 'voltage', 'amperage', 'phase', 'max_utilization')), - ) - widgets = { - 'status': StaticSelect(), - 'type': StaticSelect(), - 'supply': StaticSelect(), - 'phase': StaticSelect(), - } - - -class PowerFeedCSVForm(CustomFieldModelCSVForm): - site = CSVModelChoiceField( - queryset=Site.objects.all(), - to_field_name='name', - help_text='Assigned site' - ) - power_panel = CSVModelChoiceField( - queryset=PowerPanel.objects.all(), - to_field_name='name', - help_text='Upstream power panel' - ) - location = CSVModelChoiceField( - queryset=Location.objects.all(), - to_field_name='name', - required=False, - help_text="Rack's location (if any)" - ) - rack = CSVModelChoiceField( - queryset=Rack.objects.all(), - to_field_name='name', - required=False, - help_text='Rack' - ) - status = CSVChoiceField( - choices=PowerFeedStatusChoices, - required=False, - help_text='Operational status' - ) - type = CSVChoiceField( - choices=PowerFeedTypeChoices, - required=False, - help_text='Primary or redundant' - ) - supply = CSVChoiceField( - choices=PowerFeedSupplyChoices, - required=False, - help_text='Supply type (AC/DC)' - ) - phase = CSVChoiceField( - choices=PowerFeedPhaseChoices, - required=False, - help_text='Single or three-phase' - ) - - class Meta: - model = PowerFeed - fields = ( - 'site', 'power_panel', 'location', 'rack', 'name', 'status', 'type', 'mark_connected', 'supply', 'phase', - 'voltage', 'amperage', 'max_utilization', 'comments', - ) - - def __init__(self, data=None, *args, **kwargs): - super().__init__(data, *args, **kwargs) - - if data: - - # Limit power_panel queryset by site - params = {f"site__{self.fields['site'].to_field_name}": data.get('site')} - self.fields['power_panel'].queryset = self.fields['power_panel'].queryset.filter(**params) - - # Limit location queryset by site - params = {f"site__{self.fields['site'].to_field_name}": data.get('site')} - self.fields['location'].queryset = self.fields['location'].queryset.filter(**params) - - # Limit rack queryset by site and group - params = { - f"site__{self.fields['site'].to_field_name}": data.get('site'), - f"location__{self.fields['location'].to_field_name}": data.get('location'), - } - self.fields['rack'].queryset = self.fields['rack'].queryset.filter(**params) - - -class PowerFeedBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=PowerFeed.objects.all(), - widget=forms.MultipleHiddenInput - ) - power_panel = DynamicModelChoiceField( - queryset=PowerPanel.objects.all(), - required=False - ) - rack = DynamicModelChoiceField( - queryset=Rack.objects.all(), - required=False, - ) - status = forms.ChoiceField( - choices=add_blank_choice(PowerFeedStatusChoices), - required=False, - initial='', - widget=StaticSelect() - ) - type = forms.ChoiceField( - choices=add_blank_choice(PowerFeedTypeChoices), - required=False, - initial='', - widget=StaticSelect() - ) - supply = forms.ChoiceField( - choices=add_blank_choice(PowerFeedSupplyChoices), - required=False, - initial='', - widget=StaticSelect() - ) - phase = forms.ChoiceField( - choices=add_blank_choice(PowerFeedPhaseChoices), - required=False, - initial='', - widget=StaticSelect() - ) - voltage = forms.IntegerField( - required=False - ) - amperage = forms.IntegerField( - required=False - ) - max_utilization = forms.IntegerField( - required=False - ) - mark_connected = forms.NullBooleanField( - required=False, - widget=BulkEditNullBooleanSelect - ) - comments = CommentField( - widget=SmallTextarea, - label='Comments' - ) - - class Meta: - nullable_fields = [ - 'location', 'comments', - ] - - -class PowerFeedFilterForm(BootstrapMixin, CustomFieldModelFilterForm): - model = PowerFeed - field_groups = [ - ['q', 'tag'], - ['region_id', 'site_group_id', 'site_id'], - ['power_panel_id', 'rack_id'], - ['status', 'type', 'supply', 'phase', 'voltage', 'amperage', 'max_utilization'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - region_id = DynamicModelMultipleChoiceField( - queryset=Region.objects.all(), - required=False, - label=_('Region'), - fetch_trigger='open' - ) - site_group_id = DynamicModelMultipleChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - label=_('Site group'), - fetch_trigger='open' - ) - site_id = DynamicModelMultipleChoiceField( - queryset=Site.objects.all(), - required=False, - query_params={ - 'region_id': '$region_id' - }, - label=_('Site'), - fetch_trigger='open' - ) - power_panel_id = DynamicModelMultipleChoiceField( - queryset=PowerPanel.objects.all(), - required=False, - null_option='None', - query_params={ - 'site_id': '$site_id' - }, - label=_('Power panel'), - fetch_trigger='open' - ) - rack_id = DynamicModelMultipleChoiceField( - queryset=Rack.objects.all(), - required=False, - null_option='None', - query_params={ - 'site_id': '$site_id' - }, - label=_('Rack'), - fetch_trigger='open' - ) - status = forms.MultipleChoiceField( - choices=PowerFeedStatusChoices, - required=False, - widget=StaticSelectMultiple() - ) - type = forms.ChoiceField( - choices=add_blank_choice(PowerFeedTypeChoices), - required=False, - widget=StaticSelect() - ) - supply = forms.ChoiceField( - choices=add_blank_choice(PowerFeedSupplyChoices), - required=False, - widget=StaticSelect() - ) - phase = forms.ChoiceField( - choices=add_blank_choice(PowerFeedPhaseChoices), - required=False, - widget=StaticSelect() - ) - voltage = forms.IntegerField( - required=False - ) - amperage = forms.IntegerField( - required=False - ) - max_utilization = forms.IntegerField( - required=False - ) - tag = TagFilterField(model) diff --git a/netbox/dcim/forms/__init__.py b/netbox/dcim/forms/__init__.py new file mode 100644 index 00000000000..322abff9a65 --- /dev/null +++ b/netbox/dcim/forms/__init__.py @@ -0,0 +1,10 @@ +from .fields import * +from .models import * +from .filtersets import * +from .object_create import * +from .object_import import * +from .bulk_create import * +from .bulk_edit import * +from .bulk_import import * +from .connections import * +from .formsets import * diff --git a/netbox/dcim/forms/bulk_create.py b/netbox/dcim/forms/bulk_create.py new file mode 100644 index 00000000000..3464280f14f --- /dev/null +++ b/netbox/dcim/forms/bulk_create.py @@ -0,0 +1,111 @@ +from django import forms + +from dcim.models import * +from extras.forms import CustomFieldsMixin +from extras.models import Tag +from utilities.forms import BootstrapMixin, DynamicModelMultipleChoiceField, form_from_model +from .object_create import ComponentForm + +__all__ = ( + 'ConsolePortBulkCreateForm', + 'ConsoleServerPortBulkCreateForm', + 'DeviceBayBulkCreateForm', + # 'FrontPortBulkCreateForm', + 'InterfaceBulkCreateForm', + 'InventoryItemBulkCreateForm', + 'PowerOutletBulkCreateForm', + 'PowerPortBulkCreateForm', + 'RearPortBulkCreateForm', +) + + +# +# Device components +# + +class DeviceBulkAddComponentForm(BootstrapMixin, CustomFieldsMixin, ComponentForm): + pk = forms.ModelMultipleChoiceField( + queryset=Device.objects.all(), + widget=forms.MultipleHiddenInput() + ) + description = forms.CharField( + max_length=100, + required=False + ) + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + +class ConsolePortBulkCreateForm( + form_from_model(ConsolePort, ['type', 'speed', 'mark_connected']), + DeviceBulkAddComponentForm +): + model = ConsolePort + field_order = ('name_pattern', 'label_pattern', 'type', 'mark_connected', 'description', 'tags') + + +class ConsoleServerPortBulkCreateForm( + form_from_model(ConsoleServerPort, ['type', 'speed', 'mark_connected']), + DeviceBulkAddComponentForm +): + model = ConsoleServerPort + field_order = ('name_pattern', 'label_pattern', 'type', 'speed', 'description', 'tags') + + +class PowerPortBulkCreateForm( + form_from_model(PowerPort, ['type', 'maximum_draw', 'allocated_draw', 'mark_connected']), + DeviceBulkAddComponentForm +): + model = PowerPort + field_order = ('name_pattern', 'label_pattern', 'type', 'maximum_draw', 'allocated_draw', 'description', 'tags') + + +class PowerOutletBulkCreateForm( + form_from_model(PowerOutlet, ['type', 'feed_leg', 'mark_connected']), + DeviceBulkAddComponentForm +): + model = PowerOutlet + field_order = ('name_pattern', 'label_pattern', 'type', 'feed_leg', 'description', 'tags') + + +class InterfaceBulkCreateForm( + form_from_model(Interface, ['type', 'enabled', 'mtu', 'mgmt_only', 'mark_connected']), + DeviceBulkAddComponentForm +): + model = Interface + field_order = ( + 'name_pattern', 'label_pattern', 'type', 'enabled', 'mtu', 'mgmt_only', 'mark_connected', 'description', 'tags', + ) + + +# class FrontPortBulkCreateForm( +# form_from_model(FrontPort, ['label', 'type', 'description', 'tags']), +# DeviceBulkAddComponentForm +# ): +# pass + + +class RearPortBulkCreateForm( + form_from_model(RearPort, ['type', 'color', 'positions', 'mark_connected']), + DeviceBulkAddComponentForm +): + model = RearPort + field_order = ('name_pattern', 'label_pattern', 'type', 'positions', 'mark_connected', 'description', 'tags') + + +class DeviceBayBulkCreateForm(DeviceBulkAddComponentForm): + model = DeviceBay + field_order = ('name_pattern', 'label_pattern', 'description', 'tags') + + +class InventoryItemBulkCreateForm( + form_from_model(InventoryItem, ['manufacturer', 'part_id', 'serial', 'asset_tag', 'discovered']), + DeviceBulkAddComponentForm +): + model = InventoryItem + field_order = ( + 'name_pattern', 'label_pattern', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'discovered', 'description', + 'tags', + ) diff --git a/netbox/dcim/forms/bulk_edit.py b/netbox/dcim/forms/bulk_edit.py new file mode 100644 index 00000000000..c1b1bcb3a3a --- /dev/null +++ b/netbox/dcim/forms/bulk_edit.py @@ -0,0 +1,1090 @@ +from django import forms +from django.contrib.auth.models import User +from timezone_field import TimeZoneFormField + +from dcim.choices import * +from dcim.constants import * +from dcim.models import * +from extras.forms import AddRemoveTagsForm, CustomFieldModelBulkEditForm +from ipam.constants import BGP_ASN_MAX, BGP_ASN_MIN +from ipam.models import VLAN +from tenancy.models import Tenant +from utilities.forms import ( + add_blank_choice, BootstrapMixin, BulkEditForm, BulkEditNullBooleanSelect, ColorField, CommentField, + DynamicModelChoiceField, DynamicModelMultipleChoiceField, form_from_model, SmallTextarea, StaticSelect, +) + +__all__ = ( + 'CableBulkEditForm', + 'ConsolePortBulkEditForm', + 'ConsolePortTemplateBulkEditForm', + 'ConsoleServerPortBulkEditForm', + 'ConsoleServerPortTemplateBulkEditForm', + 'DeviceBayBulkEditForm', + 'DeviceBayTemplateBulkEditForm', + 'DeviceBulkEditForm', + 'DeviceRoleBulkEditForm', + 'DeviceTypeBulkEditForm', + 'FrontPortBulkEditForm', + 'FrontPortTemplateBulkEditForm', + 'InterfaceBulkEditForm', + 'InterfaceTemplateBulkEditForm', + 'InventoryItemBulkEditForm', + 'LocationBulkEditForm', + 'ManufacturerBulkEditForm', + 'PlatformBulkEditForm', + 'PowerFeedBulkEditForm', + 'PowerOutletBulkEditForm', + 'PowerOutletTemplateBulkEditForm', + 'PowerPanelBulkEditForm', + 'PowerPortBulkEditForm', + 'PowerPortTemplateBulkEditForm', + 'RackBulkEditForm', + 'RackReservationBulkEditForm', + 'RackRoleBulkEditForm', + 'RearPortBulkEditForm', + 'RearPortTemplateBulkEditForm', + 'RegionBulkEditForm', + 'SiteBulkEditForm', + 'SiteGroupBulkEditForm', + 'VirtualChassisBulkEditForm', +) + + +class RegionBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=Region.objects.all(), + widget=forms.MultipleHiddenInput + ) + parent = DynamicModelChoiceField( + queryset=Region.objects.all(), + required=False + ) + description = forms.CharField( + max_length=200, + required=False + ) + + class Meta: + nullable_fields = ['parent', 'description'] + + +class SiteGroupBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=SiteGroup.objects.all(), + widget=forms.MultipleHiddenInput + ) + parent = DynamicModelChoiceField( + queryset=SiteGroup.objects.all(), + required=False + ) + description = forms.CharField( + max_length=200, + required=False + ) + + class Meta: + nullable_fields = ['parent', 'description'] + + +class SiteBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=Site.objects.all(), + widget=forms.MultipleHiddenInput + ) + status = forms.ChoiceField( + choices=add_blank_choice(SiteStatusChoices), + required=False, + initial='', + widget=StaticSelect() + ) + region = DynamicModelChoiceField( + queryset=Region.objects.all(), + required=False + ) + group = DynamicModelChoiceField( + queryset=SiteGroup.objects.all(), + required=False + ) + tenant = DynamicModelChoiceField( + queryset=Tenant.objects.all(), + required=False + ) + asn = forms.IntegerField( + min_value=BGP_ASN_MIN, + max_value=BGP_ASN_MAX, + required=False, + label='ASN' + ) + description = forms.CharField( + max_length=100, + required=False + ) + time_zone = TimeZoneFormField( + choices=add_blank_choice(TimeZoneFormField().choices), + required=False, + widget=StaticSelect() + ) + + class Meta: + nullable_fields = [ + 'region', 'group', 'tenant', 'asn', 'description', 'time_zone', + ] + + +class LocationBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=Location.objects.all(), + widget=forms.MultipleHiddenInput + ) + site = DynamicModelChoiceField( + queryset=Site.objects.all(), + required=False + ) + parent = DynamicModelChoiceField( + queryset=Location.objects.all(), + required=False, + query_params={ + 'site_id': '$site' + } + ) + description = forms.CharField( + max_length=200, + required=False + ) + + class Meta: + nullable_fields = ['parent', 'description'] + + +class RackRoleBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=RackRole.objects.all(), + widget=forms.MultipleHiddenInput + ) + color = ColorField( + required=False + ) + description = forms.CharField( + max_length=200, + required=False + ) + + class Meta: + nullable_fields = ['color', 'description'] + + +class RackBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=Rack.objects.all(), + widget=forms.MultipleHiddenInput + ) + region = DynamicModelChoiceField( + queryset=Region.objects.all(), + required=False, + initial_params={ + 'sites': '$site' + } + ) + site_group = DynamicModelChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + initial_params={ + 'sites': '$site' + } + ) + site = DynamicModelChoiceField( + queryset=Site.objects.all(), + required=False, + query_params={ + 'region_id': '$region', + 'group_id': '$site_group', + } + ) + location = DynamicModelChoiceField( + queryset=Location.objects.all(), + required=False, + query_params={ + 'site_id': '$site' + } + ) + tenant = DynamicModelChoiceField( + queryset=Tenant.objects.all(), + required=False + ) + status = forms.ChoiceField( + choices=add_blank_choice(RackStatusChoices), + required=False, + initial='', + widget=StaticSelect() + ) + role = DynamicModelChoiceField( + queryset=RackRole.objects.all(), + required=False + ) + serial = forms.CharField( + max_length=50, + required=False, + label='Serial Number' + ) + asset_tag = forms.CharField( + max_length=50, + required=False + ) + type = forms.ChoiceField( + choices=add_blank_choice(RackTypeChoices), + required=False, + widget=StaticSelect() + ) + width = forms.ChoiceField( + choices=add_blank_choice(RackWidthChoices), + required=False, + widget=StaticSelect() + ) + u_height = forms.IntegerField( + required=False, + label='Height (U)' + ) + desc_units = forms.NullBooleanField( + required=False, + widget=BulkEditNullBooleanSelect, + label='Descending units' + ) + outer_width = forms.IntegerField( + required=False, + min_value=1 + ) + outer_depth = forms.IntegerField( + required=False, + min_value=1 + ) + outer_unit = forms.ChoiceField( + choices=add_blank_choice(RackDimensionUnitChoices), + required=False, + widget=StaticSelect() + ) + comments = CommentField( + widget=SmallTextarea, + label='Comments' + ) + + class Meta: + nullable_fields = [ + 'location', 'tenant', 'role', 'serial', 'asset_tag', 'outer_width', 'outer_depth', 'outer_unit', 'comments', + ] + + +class RackReservationBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=RackReservation.objects.all(), + widget=forms.MultipleHiddenInput() + ) + user = forms.ModelChoiceField( + queryset=User.objects.order_by( + 'username' + ), + required=False, + widget=StaticSelect() + ) + tenant = DynamicModelChoiceField( + queryset=Tenant.objects.all(), + required=False + ) + description = forms.CharField( + max_length=100, + required=False + ) + + class Meta: + nullable_fields = [] + + +class ManufacturerBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=Manufacturer.objects.all(), + widget=forms.MultipleHiddenInput + ) + description = forms.CharField( + max_length=200, + required=False + ) + + class Meta: + nullable_fields = ['description'] + + +class DeviceTypeBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=DeviceType.objects.all(), + widget=forms.MultipleHiddenInput() + ) + manufacturer = DynamicModelChoiceField( + queryset=Manufacturer.objects.all(), + required=False + ) + u_height = forms.IntegerField( + min_value=1, + required=False + ) + is_full_depth = forms.NullBooleanField( + required=False, + widget=BulkEditNullBooleanSelect(), + label='Is full depth' + ) + + class Meta: + nullable_fields = [] + + +class DeviceRoleBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=DeviceRole.objects.all(), + widget=forms.MultipleHiddenInput + ) + color = ColorField( + required=False + ) + vm_role = forms.NullBooleanField( + required=False, + widget=BulkEditNullBooleanSelect, + label='VM role' + ) + description = forms.CharField( + max_length=200, + required=False + ) + + class Meta: + nullable_fields = ['color', 'description'] + + +class PlatformBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=Platform.objects.all(), + widget=forms.MultipleHiddenInput + ) + manufacturer = DynamicModelChoiceField( + queryset=Manufacturer.objects.all(), + required=False + ) + napalm_driver = forms.CharField( + max_length=50, + required=False + ) + # TODO: Bulk edit support for napalm_args + description = forms.CharField( + max_length=200, + required=False + ) + + class Meta: + nullable_fields = ['manufacturer', 'napalm_driver', 'description'] + + +class DeviceBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=Device.objects.all(), + widget=forms.MultipleHiddenInput() + ) + manufacturer = DynamicModelChoiceField( + queryset=Manufacturer.objects.all(), + required=False + ) + device_type = DynamicModelChoiceField( + queryset=DeviceType.objects.all(), + required=False, + query_params={ + 'manufacturer_id': '$manufacturer' + } + ) + device_role = DynamicModelChoiceField( + queryset=DeviceRole.objects.all(), + required=False + ) + site = DynamicModelChoiceField( + queryset=Site.objects.all(), + required=False + ) + location = DynamicModelChoiceField( + queryset=Location.objects.all(), + required=False, + query_params={ + 'site_id': '$site' + } + ) + tenant = DynamicModelChoiceField( + queryset=Tenant.objects.all(), + required=False + ) + platform = DynamicModelChoiceField( + queryset=Platform.objects.all(), + required=False + ) + status = forms.ChoiceField( + choices=add_blank_choice(DeviceStatusChoices), + required=False, + widget=StaticSelect() + ) + serial = forms.CharField( + max_length=50, + required=False, + label='Serial Number' + ) + + class Meta: + nullable_fields = [ + 'tenant', 'platform', 'serial', + ] + + +class CableBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=Cable.objects.all(), + widget=forms.MultipleHiddenInput + ) + type = forms.ChoiceField( + choices=add_blank_choice(CableTypeChoices), + required=False, + initial='', + widget=StaticSelect() + ) + status = forms.ChoiceField( + choices=add_blank_choice(CableStatusChoices), + required=False, + widget=StaticSelect(), + initial='' + ) + label = forms.CharField( + max_length=100, + required=False + ) + color = ColorField( + required=False + ) + length = forms.DecimalField( + min_value=0, + required=False + ) + length_unit = forms.ChoiceField( + choices=add_blank_choice(CableLengthUnitChoices), + required=False, + initial='', + widget=StaticSelect() + ) + + class Meta: + nullable_fields = [ + 'type', 'status', 'label', 'color', 'length', + ] + + def clean(self): + super().clean() + + # Validate length/unit + length = self.cleaned_data.get('length') + length_unit = self.cleaned_data.get('length_unit') + if length and not length_unit: + raise forms.ValidationError({ + 'length_unit': "Must specify a unit when setting length" + }) + + +class VirtualChassisBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=VirtualChassis.objects.all(), + widget=forms.MultipleHiddenInput() + ) + domain = forms.CharField( + max_length=30, + required=False + ) + + class Meta: + nullable_fields = ['domain'] + + +class PowerPanelBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=PowerPanel.objects.all(), + widget=forms.MultipleHiddenInput + ) + region = DynamicModelChoiceField( + queryset=Region.objects.all(), + required=False, + initial_params={ + 'sites': '$site' + } + ) + site_group = DynamicModelChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + initial_params={ + 'sites': '$site' + } + ) + site = DynamicModelChoiceField( + queryset=Site.objects.all(), + required=False, + query_params={ + 'region_id': '$region', + 'group_id': '$site_group', + } + ) + location = DynamicModelChoiceField( + queryset=Location.objects.all(), + required=False, + query_params={ + 'site_id': '$site' + } + ) + + class Meta: + nullable_fields = ['location'] + + +class PowerFeedBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=PowerFeed.objects.all(), + widget=forms.MultipleHiddenInput + ) + power_panel = DynamicModelChoiceField( + queryset=PowerPanel.objects.all(), + required=False + ) + rack = DynamicModelChoiceField( + queryset=Rack.objects.all(), + required=False, + ) + status = forms.ChoiceField( + choices=add_blank_choice(PowerFeedStatusChoices), + required=False, + initial='', + widget=StaticSelect() + ) + type = forms.ChoiceField( + choices=add_blank_choice(PowerFeedTypeChoices), + required=False, + initial='', + widget=StaticSelect() + ) + supply = forms.ChoiceField( + choices=add_blank_choice(PowerFeedSupplyChoices), + required=False, + initial='', + widget=StaticSelect() + ) + phase = forms.ChoiceField( + choices=add_blank_choice(PowerFeedPhaseChoices), + required=False, + initial='', + widget=StaticSelect() + ) + voltage = forms.IntegerField( + required=False + ) + amperage = forms.IntegerField( + required=False + ) + max_utilization = forms.IntegerField( + required=False + ) + mark_connected = forms.NullBooleanField( + required=False, + widget=BulkEditNullBooleanSelect + ) + comments = CommentField( + widget=SmallTextarea, + label='Comments' + ) + + class Meta: + nullable_fields = [ + 'location', 'comments', + ] + + +# +# Device component templates +# + +class ConsolePortTemplateBulkEditForm(BootstrapMixin, BulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=ConsolePortTemplate.objects.all(), + widget=forms.MultipleHiddenInput() + ) + label = forms.CharField( + max_length=64, + required=False + ) + type = forms.ChoiceField( + choices=add_blank_choice(ConsolePortTypeChoices), + required=False, + widget=StaticSelect() + ) + + class Meta: + nullable_fields = ('label', 'type', 'description') + + +class ConsoleServerPortTemplateBulkEditForm(BootstrapMixin, BulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=ConsoleServerPortTemplate.objects.all(), + widget=forms.MultipleHiddenInput() + ) + label = forms.CharField( + max_length=64, + required=False + ) + type = forms.ChoiceField( + choices=add_blank_choice(ConsolePortTypeChoices), + required=False, + widget=StaticSelect() + ) + description = forms.CharField( + required=False + ) + + class Meta: + nullable_fields = ('label', 'type', 'description') + + +class PowerPortTemplateBulkEditForm(BootstrapMixin, BulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=PowerPortTemplate.objects.all(), + widget=forms.MultipleHiddenInput() + ) + label = forms.CharField( + max_length=64, + required=False + ) + type = forms.ChoiceField( + choices=add_blank_choice(PowerPortTypeChoices), + required=False, + widget=StaticSelect() + ) + maximum_draw = forms.IntegerField( + min_value=1, + required=False, + help_text="Maximum power draw (watts)" + ) + allocated_draw = forms.IntegerField( + min_value=1, + required=False, + help_text="Allocated power draw (watts)" + ) + description = forms.CharField( + required=False + ) + + class Meta: + nullable_fields = ('label', 'type', 'maximum_draw', 'allocated_draw', 'description') + + +class PowerOutletTemplateBulkEditForm(BootstrapMixin, BulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=PowerOutletTemplate.objects.all(), + widget=forms.MultipleHiddenInput() + ) + device_type = forms.ModelChoiceField( + queryset=DeviceType.objects.all(), + required=False, + disabled=True, + widget=forms.HiddenInput() + ) + label = forms.CharField( + max_length=64, + required=False + ) + type = forms.ChoiceField( + choices=add_blank_choice(PowerOutletTypeChoices), + required=False, + widget=StaticSelect() + ) + power_port = forms.ModelChoiceField( + queryset=PowerPortTemplate.objects.all(), + required=False + ) + feed_leg = forms.ChoiceField( + choices=add_blank_choice(PowerOutletFeedLegChoices), + required=False, + widget=StaticSelect() + ) + description = forms.CharField( + required=False + ) + + class Meta: + nullable_fields = ('label', 'type', 'power_port', 'feed_leg', 'description') + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Limit power_port queryset to PowerPortTemplates which belong to the parent DeviceType + if 'device_type' in self.initial: + device_type = DeviceType.objects.filter(pk=self.initial['device_type']).first() + self.fields['power_port'].queryset = PowerPortTemplate.objects.filter(device_type=device_type) + else: + self.fields['power_port'].choices = () + self.fields['power_port'].widget.attrs['disabled'] = True + + +class InterfaceTemplateBulkEditForm(BootstrapMixin, BulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=InterfaceTemplate.objects.all(), + widget=forms.MultipleHiddenInput() + ) + label = forms.CharField( + max_length=64, + required=False + ) + type = forms.ChoiceField( + choices=add_blank_choice(InterfaceTypeChoices), + required=False, + widget=StaticSelect() + ) + mgmt_only = forms.NullBooleanField( + required=False, + widget=BulkEditNullBooleanSelect, + label='Management only' + ) + description = forms.CharField( + required=False + ) + + class Meta: + nullable_fields = ('label', 'description') + + +class FrontPortTemplateBulkEditForm(BootstrapMixin, BulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=FrontPortTemplate.objects.all(), + widget=forms.MultipleHiddenInput() + ) + label = forms.CharField( + max_length=64, + required=False + ) + type = forms.ChoiceField( + choices=add_blank_choice(PortTypeChoices), + required=False, + widget=StaticSelect() + ) + color = ColorField( + required=False + ) + description = forms.CharField( + required=False + ) + + class Meta: + nullable_fields = ('description',) + + +class RearPortTemplateBulkEditForm(BootstrapMixin, BulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=RearPortTemplate.objects.all(), + widget=forms.MultipleHiddenInput() + ) + label = forms.CharField( + max_length=64, + required=False + ) + type = forms.ChoiceField( + choices=add_blank_choice(PortTypeChoices), + required=False, + widget=StaticSelect() + ) + color = ColorField( + required=False + ) + description = forms.CharField( + required=False + ) + + class Meta: + nullable_fields = ('description',) + + +class DeviceBayTemplateBulkEditForm(BootstrapMixin, BulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=DeviceBayTemplate.objects.all(), + widget=forms.MultipleHiddenInput() + ) + label = forms.CharField( + max_length=64, + required=False + ) + description = forms.CharField( + required=False + ) + + class Meta: + nullable_fields = ('label', 'description') + + +# +# Device components +# + +class ConsolePortBulkEditForm( + form_from_model(ConsolePort, ['label', 'type', 'speed', 'mark_connected', 'description']), + BootstrapMixin, + AddRemoveTagsForm, + CustomFieldModelBulkEditForm +): + pk = forms.ModelMultipleChoiceField( + queryset=ConsolePort.objects.all(), + widget=forms.MultipleHiddenInput() + ) + mark_connected = forms.NullBooleanField( + required=False, + widget=BulkEditNullBooleanSelect + ) + + class Meta: + nullable_fields = ['label', 'description'] + + +class ConsoleServerPortBulkEditForm( + form_from_model(ConsoleServerPort, ['label', 'type', 'speed', 'mark_connected', 'description']), + BootstrapMixin, + AddRemoveTagsForm, + CustomFieldModelBulkEditForm +): + pk = forms.ModelMultipleChoiceField( + queryset=ConsoleServerPort.objects.all(), + widget=forms.MultipleHiddenInput() + ) + mark_connected = forms.NullBooleanField( + required=False, + widget=BulkEditNullBooleanSelect + ) + + class Meta: + nullable_fields = ['label', 'description'] + + +class PowerPortBulkEditForm( + form_from_model(PowerPort, ['label', 'type', 'maximum_draw', 'allocated_draw', 'mark_connected', 'description']), + BootstrapMixin, + AddRemoveTagsForm, + CustomFieldModelBulkEditForm +): + pk = forms.ModelMultipleChoiceField( + queryset=PowerPort.objects.all(), + widget=forms.MultipleHiddenInput() + ) + mark_connected = forms.NullBooleanField( + required=False, + widget=BulkEditNullBooleanSelect + ) + + class Meta: + nullable_fields = ['label', 'description'] + + +class PowerOutletBulkEditForm( + form_from_model(PowerOutlet, ['label', 'type', 'feed_leg', 'power_port', 'mark_connected', 'description']), + BootstrapMixin, + AddRemoveTagsForm, + CustomFieldModelBulkEditForm +): + pk = forms.ModelMultipleChoiceField( + queryset=PowerOutlet.objects.all(), + widget=forms.MultipleHiddenInput() + ) + device = forms.ModelChoiceField( + queryset=Device.objects.all(), + required=False, + disabled=True, + widget=forms.HiddenInput() + ) + mark_connected = forms.NullBooleanField( + required=False, + widget=BulkEditNullBooleanSelect + ) + + class Meta: + nullable_fields = ['label', 'type', 'feed_leg', 'power_port', 'description'] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Limit power_port queryset to PowerPorts which belong to the parent Device + if 'device' in self.initial: + device = Device.objects.filter(pk=self.initial['device']).first() + self.fields['power_port'].queryset = PowerPort.objects.filter(device=device) + else: + self.fields['power_port'].choices = () + self.fields['power_port'].widget.attrs['disabled'] = True + + +class InterfaceBulkEditForm( + form_from_model(Interface, [ + 'label', 'type', 'parent', 'lag', 'mac_address', 'mtu', 'mgmt_only', 'mark_connected', 'description', 'mode', + ]), + BootstrapMixin, + AddRemoveTagsForm, + CustomFieldModelBulkEditForm +): + pk = forms.ModelMultipleChoiceField( + queryset=Interface.objects.all(), + widget=forms.MultipleHiddenInput() + ) + device = forms.ModelChoiceField( + queryset=Device.objects.all(), + required=False, + disabled=True, + widget=forms.HiddenInput() + ) + enabled = forms.NullBooleanField( + required=False, + widget=BulkEditNullBooleanSelect + ) + parent = DynamicModelChoiceField( + queryset=Interface.objects.all(), + required=False + ) + lag = DynamicModelChoiceField( + queryset=Interface.objects.all(), + required=False, + query_params={ + 'type': 'lag', + } + ) + mgmt_only = forms.NullBooleanField( + required=False, + widget=BulkEditNullBooleanSelect, + label='Management only' + ) + mark_connected = forms.NullBooleanField( + required=False, + widget=BulkEditNullBooleanSelect + ) + untagged_vlan = DynamicModelChoiceField( + queryset=VLAN.objects.all(), + required=False + ) + tagged_vlans = DynamicModelMultipleChoiceField( + queryset=VLAN.objects.all(), + required=False + ) + + class Meta: + nullable_fields = [ + 'label', 'parent', 'lag', 'mac_address', 'mtu', 'description', 'mode', 'untagged_vlan', 'tagged_vlans' + ] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + if 'device' in self.initial: + device = Device.objects.filter(pk=self.initial['device']).first() + + # Restrict parent/LAG interface assignment by device + self.fields['parent'].widget.add_query_param('device_id', device.pk) + self.fields['lag'].widget.add_query_param('device_id', device.pk) + + # Limit VLAN choices by device + self.fields['untagged_vlan'].widget.add_query_param('available_on_device', device.pk) + self.fields['tagged_vlans'].widget.add_query_param('available_on_device', device.pk) + + else: + # See #4523 + if 'pk' in self.initial: + site = None + interfaces = Interface.objects.filter(pk__in=self.initial['pk']).prefetch_related('device__site') + + # Check interface sites. First interface should set site, further interfaces will either continue the + # loop or reset back to no site and break the loop. + for interface in interfaces: + if site is None: + site = interface.device.site + elif interface.device.site is not site: + site = None + break + + if site is not None: + self.fields['untagged_vlan'].widget.add_query_param('site_id', site.pk) + self.fields['tagged_vlans'].widget.add_query_param('site_id', site.pk) + + self.fields['parent'].choices = () + self.fields['parent'].widget.attrs['disabled'] = True + self.fields['lag'].choices = () + self.fields['lag'].widget.attrs['disabled'] = True + + def clean(self): + super().clean() + + # Untagged interfaces cannot be assigned tagged VLANs + if self.cleaned_data['mode'] == InterfaceModeChoices.MODE_ACCESS and self.cleaned_data['tagged_vlans']: + raise forms.ValidationError({ + 'mode': "An access interface cannot have tagged VLANs assigned." + }) + + # Remove all tagged VLAN assignments from "tagged all" interfaces + elif self.cleaned_data['mode'] == InterfaceModeChoices.MODE_TAGGED_ALL: + self.cleaned_data['tagged_vlans'] = [] + + +class FrontPortBulkEditForm( + form_from_model(FrontPort, ['label', 'type', 'color', 'mark_connected', 'description']), + BootstrapMixin, + AddRemoveTagsForm, + CustomFieldModelBulkEditForm +): + pk = forms.ModelMultipleChoiceField( + queryset=FrontPort.objects.all(), + widget=forms.MultipleHiddenInput() + ) + + class Meta: + nullable_fields = ['label', 'description'] + + +class RearPortBulkEditForm( + form_from_model(RearPort, ['label', 'type', 'color', 'mark_connected', 'description']), + BootstrapMixin, + AddRemoveTagsForm, + CustomFieldModelBulkEditForm +): + pk = forms.ModelMultipleChoiceField( + queryset=RearPort.objects.all(), + widget=forms.MultipleHiddenInput() + ) + + class Meta: + nullable_fields = ['label', 'description'] + + +class DeviceBayBulkEditForm( + form_from_model(DeviceBay, ['label', 'description']), + BootstrapMixin, + AddRemoveTagsForm, + CustomFieldModelBulkEditForm +): + pk = forms.ModelMultipleChoiceField( + queryset=DeviceBay.objects.all(), + widget=forms.MultipleHiddenInput() + ) + + class Meta: + nullable_fields = ['label', 'description'] + + +class InventoryItemBulkEditForm( + form_from_model(InventoryItem, ['label', 'manufacturer', 'part_id', 'description']), + BootstrapMixin, + AddRemoveTagsForm, + CustomFieldModelBulkEditForm +): + pk = forms.ModelMultipleChoiceField( + queryset=InventoryItem.objects.all(), + widget=forms.MultipleHiddenInput() + ) + manufacturer = DynamicModelChoiceField( + queryset=Manufacturer.objects.all(), + required=False + ) + + class Meta: + nullable_fields = ['label', 'manufacturer', 'part_id', 'description'] diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py new file mode 100644 index 00000000000..072cdf0e09b --- /dev/null +++ b/netbox/dcim/forms/bulk_import.py @@ -0,0 +1,970 @@ +from django import forms +from django.contrib.contenttypes.models import ContentType +from django.contrib.postgres.forms.array import SimpleArrayField +from django.core.exceptions import ObjectDoesNotExist +from django.utils.safestring import mark_safe + +from dcim.choices import * +from dcim.constants import * +from dcim.models import * +from extras.forms import CustomFieldModelCSVForm +from tenancy.models import Tenant +from utilities.forms import CSVChoiceField, CSVContentTypeField, CSVModelChoiceField, CSVTypedChoiceField, SlugField +from virtualization.models import Cluster + +__all__ = ( + 'CableCSVForm', + 'ChildDeviceCSVForm', + 'ConsolePortCSVForm', + 'ConsoleServerPortCSVForm', + 'DeviceBayCSVForm', + 'DeviceCSVForm', + 'DeviceRoleCSVForm', + 'FrontPortCSVForm', + 'InterfaceCSVForm', + 'InventoryItemCSVForm', + 'LocationCSVForm', + 'ManufacturerCSVForm', + 'PlatformCSVForm', + 'PowerFeedCSVForm', + 'PowerOutletCSVForm', + 'PowerPanelCSVForm', + 'PowerPortCSVForm', + 'RackCSVForm', + 'RackReservationCSVForm', + 'RackRoleCSVForm', + 'RearPortCSVForm', + 'RegionCSVForm', + 'SiteCSVForm', + 'SiteGroupCSVForm', + 'VirtualChassisCSVForm', +) + + +class RegionCSVForm(CustomFieldModelCSVForm): + parent = CSVModelChoiceField( + queryset=Region.objects.all(), + required=False, + to_field_name='name', + help_text='Name of parent region' + ) + + class Meta: + model = Region + fields = ('name', 'slug', 'parent', 'description') + + +class SiteGroupCSVForm(CustomFieldModelCSVForm): + parent = CSVModelChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + to_field_name='name', + help_text='Name of parent site group' + ) + + class Meta: + model = SiteGroup + fields = ('name', 'slug', 'parent', 'description') + + +class SiteCSVForm(CustomFieldModelCSVForm): + status = CSVChoiceField( + choices=SiteStatusChoices, + help_text='Operational status' + ) + region = CSVModelChoiceField( + queryset=Region.objects.all(), + required=False, + to_field_name='name', + help_text='Assigned region' + ) + group = CSVModelChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + to_field_name='name', + help_text='Assigned group' + ) + tenant = CSVModelChoiceField( + queryset=Tenant.objects.all(), + required=False, + to_field_name='name', + help_text='Assigned tenant' + ) + + class Meta: + model = Site + fields = ( + 'name', 'slug', 'status', 'region', 'group', 'tenant', 'facility', 'asn', 'time_zone', 'description', + 'physical_address', 'shipping_address', 'latitude', 'longitude', 'contact_name', 'contact_phone', + 'contact_email', 'comments', + ) + help_texts = { + 'time_zone': mark_safe( + 'Time zone (available options)' + ) + } + + +class LocationCSVForm(CustomFieldModelCSVForm): + site = CSVModelChoiceField( + queryset=Site.objects.all(), + to_field_name='name', + help_text='Assigned site' + ) + parent = CSVModelChoiceField( + queryset=Location.objects.all(), + required=False, + to_field_name='name', + help_text='Parent location', + error_messages={ + 'invalid_choice': 'Location not found.', + } + ) + + class Meta: + model = Location + fields = ('site', 'parent', 'name', 'slug', 'description') + + +class RackRoleCSVForm(CustomFieldModelCSVForm): + slug = SlugField() + + class Meta: + model = RackRole + fields = ('name', 'slug', 'color', 'description') + help_texts = { + 'color': mark_safe('RGB color in hexadecimal (e.g. 00ff00)'), + } + + +class RackCSVForm(CustomFieldModelCSVForm): + site = CSVModelChoiceField( + queryset=Site.objects.all(), + to_field_name='name' + ) + location = CSVModelChoiceField( + queryset=Location.objects.all(), + required=False, + to_field_name='name' + ) + tenant = CSVModelChoiceField( + queryset=Tenant.objects.all(), + required=False, + to_field_name='name', + help_text='Name of assigned tenant' + ) + status = CSVChoiceField( + choices=RackStatusChoices, + help_text='Operational status' + ) + role = CSVModelChoiceField( + queryset=RackRole.objects.all(), + required=False, + to_field_name='name', + help_text='Name of assigned role' + ) + type = CSVChoiceField( + choices=RackTypeChoices, + required=False, + help_text='Rack type' + ) + width = forms.ChoiceField( + choices=RackWidthChoices, + help_text='Rail-to-rail width (in inches)' + ) + outer_unit = CSVChoiceField( + choices=RackDimensionUnitChoices, + required=False, + help_text='Unit for outer dimensions' + ) + + class Meta: + model = Rack + fields = ( + 'site', 'location', 'name', 'facility_id', 'tenant', 'status', 'role', 'type', 'serial', 'asset_tag', + 'width', 'u_height', 'desc_units', 'outer_width', 'outer_depth', 'outer_unit', 'comments', + ) + + def __init__(self, data=None, *args, **kwargs): + super().__init__(data, *args, **kwargs) + + if data: + + # Limit location queryset by assigned site + params = {f"site__{self.fields['site'].to_field_name}": data.get('site')} + self.fields['location'].queryset = self.fields['location'].queryset.filter(**params) + + +class RackReservationCSVForm(CustomFieldModelCSVForm): + site = CSVModelChoiceField( + queryset=Site.objects.all(), + to_field_name='name', + help_text='Parent site' + ) + location = CSVModelChoiceField( + queryset=Location.objects.all(), + to_field_name='name', + required=False, + help_text="Rack's location (if any)" + ) + rack = CSVModelChoiceField( + queryset=Rack.objects.all(), + to_field_name='name', + help_text='Rack' + ) + units = SimpleArrayField( + base_field=forms.IntegerField(), + required=True, + help_text='Comma-separated list of individual unit numbers' + ) + tenant = CSVModelChoiceField( + queryset=Tenant.objects.all(), + required=False, + to_field_name='name', + help_text='Assigned tenant' + ) + + class Meta: + model = RackReservation + fields = ('site', 'location', 'rack', 'units', 'tenant', 'description') + + def __init__(self, data=None, *args, **kwargs): + super().__init__(data, *args, **kwargs) + + if data: + + # Limit location queryset by assigned site + params = {f"site__{self.fields['site'].to_field_name}": data.get('site')} + self.fields['location'].queryset = self.fields['location'].queryset.filter(**params) + + # Limit rack queryset by assigned site and group + params = { + f"site__{self.fields['site'].to_field_name}": data.get('site'), + f"location__{self.fields['location'].to_field_name}": data.get('location'), + } + self.fields['rack'].queryset = self.fields['rack'].queryset.filter(**params) + + +class ManufacturerCSVForm(CustomFieldModelCSVForm): + + class Meta: + model = Manufacturer + fields = ('name', 'slug', 'description') + + +class DeviceRoleCSVForm(CustomFieldModelCSVForm): + slug = SlugField() + + class Meta: + model = DeviceRole + fields = ('name', 'slug', 'color', 'vm_role', 'description') + help_texts = { + 'color': mark_safe('RGB color in hexadecimal (e.g. 00ff00)'), + } + + +class PlatformCSVForm(CustomFieldModelCSVForm): + slug = SlugField() + manufacturer = CSVModelChoiceField( + queryset=Manufacturer.objects.all(), + required=False, + to_field_name='name', + help_text='Limit platform assignments to this manufacturer' + ) + + class Meta: + model = Platform + fields = ('name', 'slug', 'manufacturer', 'napalm_driver', 'napalm_args', 'description') + + +class BaseDeviceCSVForm(CustomFieldModelCSVForm): + device_role = CSVModelChoiceField( + queryset=DeviceRole.objects.all(), + to_field_name='name', + help_text='Assigned role' + ) + tenant = CSVModelChoiceField( + queryset=Tenant.objects.all(), + required=False, + to_field_name='name', + help_text='Assigned tenant' + ) + manufacturer = CSVModelChoiceField( + queryset=Manufacturer.objects.all(), + to_field_name='name', + help_text='Device type manufacturer' + ) + device_type = CSVModelChoiceField( + queryset=DeviceType.objects.all(), + to_field_name='model', + help_text='Device type model' + ) + platform = CSVModelChoiceField( + queryset=Platform.objects.all(), + required=False, + to_field_name='name', + help_text='Assigned platform' + ) + status = CSVChoiceField( + choices=DeviceStatusChoices, + help_text='Operational status' + ) + virtual_chassis = CSVModelChoiceField( + queryset=VirtualChassis.objects.all(), + to_field_name='name', + required=False, + help_text='Virtual chassis' + ) + cluster = CSVModelChoiceField( + queryset=Cluster.objects.all(), + to_field_name='name', + required=False, + help_text='Virtualization cluster' + ) + + class Meta: + fields = [] + model = Device + help_texts = { + 'vc_position': 'Virtual chassis position', + 'vc_priority': 'Virtual chassis priority', + } + + def __init__(self, data=None, *args, **kwargs): + super().__init__(data, *args, **kwargs) + + if data: + + # Limit device type queryset by manufacturer + params = {f"manufacturer__{self.fields['manufacturer'].to_field_name}": data.get('manufacturer')} + self.fields['device_type'].queryset = self.fields['device_type'].queryset.filter(**params) + + +class DeviceCSVForm(BaseDeviceCSVForm): + site = CSVModelChoiceField( + queryset=Site.objects.all(), + to_field_name='name', + help_text='Assigned site' + ) + location = CSVModelChoiceField( + queryset=Location.objects.all(), + to_field_name='name', + required=False, + help_text="Assigned location (if any)" + ) + rack = CSVModelChoiceField( + queryset=Rack.objects.all(), + to_field_name='name', + required=False, + help_text="Assigned rack (if any)" + ) + face = CSVChoiceField( + choices=DeviceFaceChoices, + required=False, + help_text='Mounted rack face' + ) + + class Meta(BaseDeviceCSVForm.Meta): + fields = [ + 'name', 'device_role', 'tenant', 'manufacturer', 'device_type', 'platform', 'serial', 'asset_tag', 'status', + 'site', 'location', 'rack', 'position', 'face', 'virtual_chassis', 'vc_position', 'vc_priority', 'cluster', + 'comments', + ] + + def __init__(self, data=None, *args, **kwargs): + super().__init__(data, *args, **kwargs) + + if data: + + # Limit location queryset by assigned site + params = {f"site__{self.fields['site'].to_field_name}": data.get('site')} + self.fields['location'].queryset = self.fields['location'].queryset.filter(**params) + + # Limit rack queryset by assigned site and group + params = { + f"site__{self.fields['site'].to_field_name}": data.get('site'), + f"location__{self.fields['location'].to_field_name}": data.get('location'), + } + self.fields['rack'].queryset = self.fields['rack'].queryset.filter(**params) + + +class ChildDeviceCSVForm(BaseDeviceCSVForm): + parent = CSVModelChoiceField( + queryset=Device.objects.all(), + to_field_name='name', + help_text='Parent device' + ) + device_bay = CSVModelChoiceField( + queryset=DeviceBay.objects.all(), + to_field_name='name', + help_text='Device bay in which this device is installed' + ) + + class Meta(BaseDeviceCSVForm.Meta): + fields = [ + 'name', 'device_role', 'tenant', 'manufacturer', 'device_type', 'platform', 'serial', 'asset_tag', 'status', + 'parent', 'device_bay', 'virtual_chassis', 'vc_position', 'vc_priority', 'cluster', 'comments', + ] + + def __init__(self, data=None, *args, **kwargs): + super().__init__(data, *args, **kwargs) + + if data: + + # Limit device bay queryset by parent device + params = {f"device__{self.fields['parent'].to_field_name}": data.get('parent')} + self.fields['device_bay'].queryset = self.fields['device_bay'].queryset.filter(**params) + + def clean(self): + super().clean() + + # Set parent_bay reverse relationship + device_bay = self.cleaned_data.get('device_bay') + if device_bay: + self.instance.parent_bay = device_bay + + # Inherit site and rack from parent device + parent = self.cleaned_data.get('parent') + if parent: + self.instance.site = parent.site + self.instance.rack = parent.rack + + +# +# Device components +# + +class ConsolePortCSVForm(CustomFieldModelCSVForm): + device = CSVModelChoiceField( + queryset=Device.objects.all(), + to_field_name='name' + ) + type = CSVChoiceField( + choices=ConsolePortTypeChoices, + required=False, + help_text='Port type' + ) + speed = CSVTypedChoiceField( + choices=ConsolePortSpeedChoices, + coerce=int, + empty_value=None, + required=False, + help_text='Port speed in bps' + ) + + class Meta: + model = ConsolePort + fields = ('device', 'name', 'label', 'type', 'speed', 'mark_connected', 'description') + + +class ConsoleServerPortCSVForm(CustomFieldModelCSVForm): + device = CSVModelChoiceField( + queryset=Device.objects.all(), + to_field_name='name' + ) + type = CSVChoiceField( + choices=ConsolePortTypeChoices, + required=False, + help_text='Port type' + ) + speed = CSVTypedChoiceField( + choices=ConsolePortSpeedChoices, + coerce=int, + empty_value=None, + required=False, + help_text='Port speed in bps' + ) + + class Meta: + model = ConsoleServerPort + fields = ('device', 'name', 'label', 'type', 'speed', 'mark_connected', 'description') + + +class PowerPortCSVForm(CustomFieldModelCSVForm): + device = CSVModelChoiceField( + queryset=Device.objects.all(), + to_field_name='name' + ) + type = CSVChoiceField( + choices=PowerPortTypeChoices, + required=False, + help_text='Port type' + ) + + class Meta: + model = PowerPort + fields = ( + 'device', 'name', 'label', 'type', 'mark_connected', 'maximum_draw', 'allocated_draw', 'description', + ) + + +class PowerOutletCSVForm(CustomFieldModelCSVForm): + device = CSVModelChoiceField( + queryset=Device.objects.all(), + to_field_name='name' + ) + type = CSVChoiceField( + choices=PowerOutletTypeChoices, + required=False, + help_text='Outlet type' + ) + power_port = CSVModelChoiceField( + queryset=PowerPort.objects.all(), + required=False, + to_field_name='name', + help_text='Local power port which feeds this outlet' + ) + feed_leg = CSVChoiceField( + choices=PowerOutletFeedLegChoices, + required=False, + help_text='Electrical phase (for three-phase circuits)' + ) + + class Meta: + model = PowerOutlet + fields = ('device', 'name', 'label', 'type', 'mark_connected', 'power_port', 'feed_leg', 'description') + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Limit PowerPort choices to those belonging to this device (or VC master) + if self.is_bound: + try: + device = self.fields['device'].to_python(self.data['device']) + except forms.ValidationError: + device = None + else: + try: + device = self.instance.device + except Device.DoesNotExist: + device = None + + if device: + self.fields['power_port'].queryset = PowerPort.objects.filter( + device__in=[device, device.get_vc_master()] + ) + else: + self.fields['power_port'].queryset = PowerPort.objects.none() + + +class InterfaceCSVForm(CustomFieldModelCSVForm): + device = CSVModelChoiceField( + queryset=Device.objects.all(), + to_field_name='name' + ) + parent = CSVModelChoiceField( + queryset=Interface.objects.all(), + required=False, + to_field_name='name', + help_text='Parent interface' + ) + lag = CSVModelChoiceField( + queryset=Interface.objects.all(), + required=False, + to_field_name='name', + help_text='Parent LAG interface' + ) + type = CSVChoiceField( + choices=InterfaceTypeChoices, + help_text='Physical medium' + ) + mode = CSVChoiceField( + choices=InterfaceModeChoices, + required=False, + help_text='IEEE 802.1Q operational mode (for L2 interfaces)' + ) + + class Meta: + model = Interface + fields = ( + 'device', 'name', 'label', 'parent', 'lag', 'type', 'enabled', 'mark_connected', 'mac_address', 'mtu', + 'mgmt_only', 'description', 'mode', + ) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Limit LAG choices to interfaces belonging to this device (or virtual chassis) + device = None + if self.is_bound and 'device' in self.data: + try: + device = self.fields['device'].to_python(self.data['device']) + except forms.ValidationError: + pass + if device and device.virtual_chassis: + self.fields['lag'].queryset = Interface.objects.filter( + Q(device=device) | Q(device__virtual_chassis=device.virtual_chassis), + type=InterfaceTypeChoices.TYPE_LAG + ) + self.fields['parent'].queryset = Interface.objects.filter( + Q(device=device) | Q(device__virtual_chassis=device.virtual_chassis) + ) + elif device: + self.fields['lag'].queryset = Interface.objects.filter( + device=device, + type=InterfaceTypeChoices.TYPE_LAG + ) + self.fields['parent'].queryset = Interface.objects.filter(device=device) + else: + self.fields['lag'].queryset = Interface.objects.none() + self.fields['parent'].queryset = Interface.objects.none() + + def clean_enabled(self): + # Make sure enabled is True when it's not included in the uploaded data + if 'enabled' not in self.data: + return True + else: + return self.cleaned_data['enabled'] + + +class FrontPortCSVForm(CustomFieldModelCSVForm): + device = CSVModelChoiceField( + queryset=Device.objects.all(), + to_field_name='name' + ) + rear_port = CSVModelChoiceField( + queryset=RearPort.objects.all(), + to_field_name='name', + help_text='Corresponding rear port' + ) + type = CSVChoiceField( + choices=PortTypeChoices, + help_text='Physical medium classification' + ) + + class Meta: + model = FrontPort + fields = ( + 'device', 'name', 'label', 'type', 'color', 'mark_connected', 'rear_port', 'rear_port_position', + 'description', + ) + help_texts = { + 'rear_port_position': 'Mapped position on corresponding rear port', + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Limit RearPort choices to those belonging to this device (or VC master) + if self.is_bound: + try: + device = self.fields['device'].to_python(self.data['device']) + except forms.ValidationError: + device = None + else: + try: + device = self.instance.device + except Device.DoesNotExist: + device = None + + if device: + self.fields['rear_port'].queryset = RearPort.objects.filter( + device__in=[device, device.get_vc_master()] + ) + else: + self.fields['rear_port'].queryset = RearPort.objects.none() + + +class RearPortCSVForm(CustomFieldModelCSVForm): + device = CSVModelChoiceField( + queryset=Device.objects.all(), + to_field_name='name' + ) + type = CSVChoiceField( + help_text='Physical medium classification', + choices=PortTypeChoices, + ) + + class Meta: + model = RearPort + fields = ('device', 'name', 'label', 'type', 'color', 'mark_connected', 'positions', 'description') + help_texts = { + 'positions': 'Number of front ports which may be mapped' + } + + +class DeviceBayCSVForm(CustomFieldModelCSVForm): + device = CSVModelChoiceField( + queryset=Device.objects.all(), + to_field_name='name' + ) + installed_device = CSVModelChoiceField( + queryset=Device.objects.all(), + required=False, + to_field_name='name', + help_text='Child device installed within this bay', + error_messages={ + 'invalid_choice': 'Child device not found.', + } + ) + + class Meta: + model = DeviceBay + fields = ('device', 'name', 'label', 'installed_device', 'description') + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Limit installed device choices to devices of the correct type and location + if self.is_bound: + try: + device = self.fields['device'].to_python(self.data['device']) + except forms.ValidationError: + device = None + else: + try: + device = self.instance.device + except Device.DoesNotExist: + device = None + + if device: + self.fields['installed_device'].queryset = Device.objects.filter( + site=device.site, + rack=device.rack, + parent_bay__isnull=True, + device_type__u_height=0, + device_type__subdevice_role=SubdeviceRoleChoices.ROLE_CHILD + ).exclude(pk=device.pk) + else: + self.fields['installed_device'].queryset = Interface.objects.none() + + +class InventoryItemCSVForm(CustomFieldModelCSVForm): + device = CSVModelChoiceField( + queryset=Device.objects.all(), + to_field_name='name' + ) + manufacturer = CSVModelChoiceField( + queryset=Manufacturer.objects.all(), + to_field_name='name', + required=False + ) + parent = CSVModelChoiceField( + queryset=Device.objects.all(), + to_field_name='name', + required=False, + help_text='Parent inventory item' + ) + + class Meta: + model = InventoryItem + fields = ( + 'device', 'name', 'label', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'discovered', 'description', + ) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Limit parent choices to inventory items belonging to this device + device = None + if self.is_bound and 'device' in self.data: + try: + device = self.fields['device'].to_python(self.data['device']) + except forms.ValidationError: + pass + if device: + self.fields['parent'].queryset = InventoryItem.objects.filter(device=device) + else: + self.fields['parent'].queryset = InventoryItem.objects.none() + + +class CableCSVForm(CustomFieldModelCSVForm): + # Termination A + side_a_device = CSVModelChoiceField( + queryset=Device.objects.all(), + to_field_name='name', + help_text='Side A device' + ) + side_a_type = CSVContentTypeField( + queryset=ContentType.objects.all(), + limit_choices_to=CABLE_TERMINATION_MODELS, + help_text='Side A type' + ) + side_a_name = forms.CharField( + help_text='Side A component name' + ) + + # Termination B + side_b_device = CSVModelChoiceField( + queryset=Device.objects.all(), + to_field_name='name', + help_text='Side B device' + ) + side_b_type = CSVContentTypeField( + queryset=ContentType.objects.all(), + limit_choices_to=CABLE_TERMINATION_MODELS, + help_text='Side B type' + ) + side_b_name = forms.CharField( + help_text='Side B component name' + ) + + # Cable attributes + status = CSVChoiceField( + choices=CableStatusChoices, + required=False, + help_text='Connection status' + ) + type = CSVChoiceField( + choices=CableTypeChoices, + required=False, + help_text='Physical medium classification' + ) + length_unit = CSVChoiceField( + choices=CableLengthUnitChoices, + required=False, + help_text='Length unit' + ) + + class Meta: + model = Cable + fields = [ + 'side_a_device', 'side_a_type', 'side_a_name', 'side_b_device', 'side_b_type', 'side_b_name', 'type', + 'status', 'label', 'color', 'length', 'length_unit', + ] + help_texts = { + 'color': mark_safe('RGB color in hexadecimal (e.g. 00ff00)'), + } + + def _clean_side(self, side): + """ + Derive a Cable's A/B termination objects. + + :param side: 'a' or 'b' + """ + assert side in 'ab', f"Invalid side designation: {side}" + + device = self.cleaned_data.get(f'side_{side}_device') + content_type = self.cleaned_data.get(f'side_{side}_type') + name = self.cleaned_data.get(f'side_{side}_name') + if not device or not content_type or not name: + return None + + model = content_type.model_class() + try: + termination_object = model.objects.get(device=device, name=name) + if termination_object.cable is not None: + raise forms.ValidationError(f"Side {side.upper()}: {device} {termination_object} is already connected") + except ObjectDoesNotExist: + raise forms.ValidationError(f"{side.upper()} side termination not found: {device} {name}") + + setattr(self.instance, f'termination_{side}', termination_object) + return termination_object + + def clean_side_a_name(self): + return self._clean_side('a') + + def clean_side_b_name(self): + return self._clean_side('b') + + def clean_length_unit(self): + # Avoid trying to save as NULL + length_unit = self.cleaned_data.get('length_unit', None) + return length_unit if length_unit is not None else '' + + +class VirtualChassisCSVForm(CustomFieldModelCSVForm): + master = CSVModelChoiceField( + queryset=Device.objects.all(), + to_field_name='name', + required=False, + help_text='Master device' + ) + + class Meta: + model = VirtualChassis + fields = ('name', 'domain', 'master') + + +class PowerPanelCSVForm(CustomFieldModelCSVForm): + site = CSVModelChoiceField( + queryset=Site.objects.all(), + to_field_name='name', + help_text='Name of parent site' + ) + location = CSVModelChoiceField( + queryset=Location.objects.all(), + required=False, + to_field_name='name' + ) + + class Meta: + model = PowerPanel + fields = ('site', 'location', 'name') + + def __init__(self, data=None, *args, **kwargs): + super().__init__(data, *args, **kwargs) + + if data: + + # Limit group queryset by assigned site + params = {f"site__{self.fields['site'].to_field_name}": data.get('site')} + self.fields['location'].queryset = self.fields['location'].queryset.filter(**params) + + +class PowerFeedCSVForm(CustomFieldModelCSVForm): + site = CSVModelChoiceField( + queryset=Site.objects.all(), + to_field_name='name', + help_text='Assigned site' + ) + power_panel = CSVModelChoiceField( + queryset=PowerPanel.objects.all(), + to_field_name='name', + help_text='Upstream power panel' + ) + location = CSVModelChoiceField( + queryset=Location.objects.all(), + to_field_name='name', + required=False, + help_text="Rack's location (if any)" + ) + rack = CSVModelChoiceField( + queryset=Rack.objects.all(), + to_field_name='name', + required=False, + help_text='Rack' + ) + status = CSVChoiceField( + choices=PowerFeedStatusChoices, + help_text='Operational status' + ) + type = CSVChoiceField( + choices=PowerFeedTypeChoices, + help_text='Primary or redundant' + ) + supply = CSVChoiceField( + choices=PowerFeedSupplyChoices, + help_text='Supply type (AC/DC)' + ) + phase = CSVChoiceField( + choices=PowerFeedPhaseChoices, + help_text='Single or three-phase' + ) + + class Meta: + model = PowerFeed + fields = ( + 'site', 'power_panel', 'location', 'rack', 'name', 'status', 'type', 'mark_connected', 'supply', 'phase', + 'voltage', 'amperage', 'max_utilization', 'comments', + ) + + def __init__(self, data=None, *args, **kwargs): + super().__init__(data, *args, **kwargs) + + if data: + + # Limit power_panel queryset by site + params = {f"site__{self.fields['site'].to_field_name}": data.get('site')} + self.fields['power_panel'].queryset = self.fields['power_panel'].queryset.filter(**params) + + # Limit location queryset by site + params = {f"site__{self.fields['site'].to_field_name}": data.get('site')} + self.fields['location'].queryset = self.fields['location'].queryset.filter(**params) + + # Limit rack queryset by site and group + params = { + f"site__{self.fields['site'].to_field_name}": data.get('site'), + f"location__{self.fields['location'].to_field_name}": data.get('location'), + } + self.fields['rack'].queryset = self.fields['rack'].queryset.filter(**params) diff --git a/netbox/dcim/forms/common.py b/netbox/dcim/forms/common.py new file mode 100644 index 00000000000..f484b48e197 --- /dev/null +++ b/netbox/dcim/forms/common.py @@ -0,0 +1,49 @@ +from django import forms + +from dcim.choices import * +from dcim.constants import * + +__all__ = ( + 'InterfaceCommonForm', +) + + +class InterfaceCommonForm(forms.Form): + mac_address = forms.CharField( + empty_value=None, + required=False, + label='MAC address' + ) + mtu = forms.IntegerField( + required=False, + min_value=INTERFACE_MTU_MIN, + max_value=INTERFACE_MTU_MAX, + label='MTU' + ) + + def clean(self): + super().clean() + + parent_field = 'device' if 'device' in self.cleaned_data else 'virtual_machine' + tagged_vlans = self.cleaned_data.get('tagged_vlans') + + # Untagged interfaces cannot be assigned tagged VLANs + if self.cleaned_data['mode'] == InterfaceModeChoices.MODE_ACCESS and tagged_vlans: + raise forms.ValidationError({ + 'mode': "An access interface cannot have tagged VLANs assigned." + }) + + # Remove all tagged VLAN assignments from "tagged all" interfaces + elif self.cleaned_data['mode'] == InterfaceModeChoices.MODE_TAGGED_ALL: + self.cleaned_data['tagged_vlans'] = [] + + # Validate tagged VLANs; must be a global VLAN or in the same site + elif self.cleaned_data['mode'] == InterfaceModeChoices.MODE_TAGGED and tagged_vlans: + valid_sites = [None, self.cleaned_data[parent_field].site] + invalid_vlans = [str(v) for v in tagged_vlans if v.site not in valid_sites] + + if invalid_vlans: + raise forms.ValidationError({ + 'tagged_vlans': f"The tagged VLANs ({', '.join(invalid_vlans)}) must belong to the same site as " + f"the interface's parent device/VM, or they must be global" + }) diff --git a/netbox/dcim/forms/connections.py b/netbox/dcim/forms/connections.py new file mode 100644 index 00000000000..a2ceea6cf0f --- /dev/null +++ b/netbox/dcim/forms/connections.py @@ -0,0 +1,289 @@ +from circuits.models import Circuit, CircuitTermination, Provider +from dcim.models import * +from extras.forms import CustomFieldModelForm +from extras.models import Tag +from utilities.forms import BootstrapMixin, DynamicModelChoiceField, DynamicModelMultipleChoiceField, StaticSelect + +__all__ = ( + 'ConnectCableToCircuitTerminationForm', + 'ConnectCableToConsolePortForm', + 'ConnectCableToConsoleServerPortForm', + 'ConnectCableToFrontPortForm', + 'ConnectCableToInterfaceForm', + 'ConnectCableToPowerFeedForm', + 'ConnectCableToPowerPortForm', + 'ConnectCableToPowerOutletForm', + 'ConnectCableToRearPortForm', +) + + +class ConnectCableToDeviceForm(BootstrapMixin, CustomFieldModelForm): + """ + Base form for connecting a Cable to a Device component + """ + termination_b_region = DynamicModelChoiceField( + queryset=Region.objects.all(), + label='Region', + required=False + ) + termination_b_site_group = DynamicModelChoiceField( + queryset=SiteGroup.objects.all(), + label='Site group', + required=False + ) + termination_b_site = DynamicModelChoiceField( + queryset=Site.objects.all(), + label='Site', + required=False, + query_params={ + 'region_id': '$termination_b_region', + 'group_id': '$termination_b_site_group', + } + ) + termination_b_location = DynamicModelChoiceField( + queryset=Location.objects.all(), + label='Location', + required=False, + null_option='None', + query_params={ + 'site_id': '$termination_b_site' + } + ) + termination_b_rack = DynamicModelChoiceField( + queryset=Rack.objects.all(), + label='Rack', + required=False, + null_option='None', + query_params={ + 'site_id': '$termination_b_site', + 'location_id': '$termination_b_location', + } + ) + termination_b_device = DynamicModelChoiceField( + queryset=Device.objects.all(), + label='Device', + required=False, + query_params={ + 'site_id': '$termination_b_site', + 'location_id': '$termination_b_location', + 'rack_id': '$termination_b_rack', + } + ) + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = Cable + fields = [ + 'termination_b_region', 'termination_b_site', 'termination_b_rack', 'termination_b_device', + 'termination_b_id', 'type', 'status', 'label', 'color', 'length', 'length_unit', 'tags', + ] + widgets = { + 'status': StaticSelect, + 'type': StaticSelect, + 'length_unit': StaticSelect, + } + + def clean_termination_b_id(self): + # Return the PK rather than the object + return getattr(self.cleaned_data['termination_b_id'], 'pk', None) + + +class ConnectCableToConsolePortForm(ConnectCableToDeviceForm): + termination_b_id = DynamicModelChoiceField( + queryset=ConsolePort.objects.all(), + label='Name', + disabled_indicator='_occupied', + query_params={ + 'device_id': '$termination_b_device' + } + ) + + +class ConnectCableToConsoleServerPortForm(ConnectCableToDeviceForm): + termination_b_id = DynamicModelChoiceField( + queryset=ConsoleServerPort.objects.all(), + label='Name', + disabled_indicator='_occupied', + query_params={ + 'device_id': '$termination_b_device' + } + ) + + +class ConnectCableToPowerPortForm(ConnectCableToDeviceForm): + termination_b_id = DynamicModelChoiceField( + queryset=PowerPort.objects.all(), + label='Name', + disabled_indicator='_occupied', + query_params={ + 'device_id': '$termination_b_device' + } + ) + + +class ConnectCableToPowerOutletForm(ConnectCableToDeviceForm): + termination_b_id = DynamicModelChoiceField( + queryset=PowerOutlet.objects.all(), + label='Name', + disabled_indicator='_occupied', + query_params={ + 'device_id': '$termination_b_device' + } + ) + + +class ConnectCableToInterfaceForm(ConnectCableToDeviceForm): + termination_b_id = DynamicModelChoiceField( + queryset=Interface.objects.all(), + label='Name', + disabled_indicator='_occupied', + query_params={ + 'device_id': '$termination_b_device', + 'kind': 'physical', + } + ) + + +class ConnectCableToFrontPortForm(ConnectCableToDeviceForm): + termination_b_id = DynamicModelChoiceField( + queryset=FrontPort.objects.all(), + label='Name', + disabled_indicator='_occupied', + query_params={ + 'device_id': '$termination_b_device' + } + ) + + +class ConnectCableToRearPortForm(ConnectCableToDeviceForm): + termination_b_id = DynamicModelChoiceField( + queryset=RearPort.objects.all(), + label='Name', + disabled_indicator='_occupied', + query_params={ + 'device_id': '$termination_b_device' + } + ) + + +class ConnectCableToCircuitTerminationForm(BootstrapMixin, CustomFieldModelForm): + termination_b_provider = DynamicModelChoiceField( + queryset=Provider.objects.all(), + label='Provider', + required=False + ) + termination_b_region = DynamicModelChoiceField( + queryset=Region.objects.all(), + label='Region', + required=False + ) + termination_b_site_group = DynamicModelChoiceField( + queryset=SiteGroup.objects.all(), + label='Site group', + required=False + ) + termination_b_site = DynamicModelChoiceField( + queryset=Site.objects.all(), + label='Site', + required=False, + query_params={ + 'region_id': '$termination_b_region', + 'group_id': '$termination_b_site_group', + } + ) + termination_b_circuit = DynamicModelChoiceField( + queryset=Circuit.objects.all(), + label='Circuit', + query_params={ + 'provider_id': '$termination_b_provider', + 'site_id': '$termination_b_site', + } + ) + termination_b_id = DynamicModelChoiceField( + queryset=CircuitTermination.objects.all(), + label='Side', + disabled_indicator='_occupied', + query_params={ + 'circuit_id': '$termination_b_circuit' + } + ) + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = Cable + fields = [ + 'termination_b_provider', 'termination_b_region', 'termination_b_site', 'termination_b_circuit', + 'termination_b_id', 'type', 'status', 'label', 'color', 'length', 'length_unit', 'tags', + ] + + def clean_termination_b_id(self): + # Return the PK rather than the object + return getattr(self.cleaned_data['termination_b_id'], 'pk', None) + + +class ConnectCableToPowerFeedForm(BootstrapMixin, CustomFieldModelForm): + termination_b_region = DynamicModelChoiceField( + queryset=Region.objects.all(), + label='Region', + required=False + ) + termination_b_site_group = DynamicModelChoiceField( + queryset=SiteGroup.objects.all(), + label='Site group', + required=False + ) + termination_b_site = DynamicModelChoiceField( + queryset=Site.objects.all(), + label='Site', + required=False, + query_params={ + 'region_id': '$termination_b_region', + 'group_id': '$termination_b_site_group', + } + ) + termination_b_location = DynamicModelChoiceField( + queryset=Location.objects.all(), + label='Location', + required=False, + query_params={ + 'site_id': '$termination_b_site' + } + ) + termination_b_powerpanel = DynamicModelChoiceField( + queryset=PowerPanel.objects.all(), + label='Power Panel', + required=False, + query_params={ + 'site_id': '$termination_b_site', + 'location_id': '$termination_b_location', + } + ) + termination_b_id = DynamicModelChoiceField( + queryset=PowerFeed.objects.all(), + label='Name', + disabled_indicator='_occupied', + query_params={ + 'power_panel_id': '$termination_b_powerpanel' + } + ) + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = Cable + fields = [ + 'termination_b_location', 'termination_b_powerpanel', 'termination_b_id', 'type', 'status', 'label', + 'color', 'length', 'length_unit', 'tags', + ] + + def clean_termination_b_id(self): + # Return the PK rather than the object + return getattr(self.cleaned_data['termination_b_id'], 'pk', None) diff --git a/netbox/dcim/forms/fields.py b/netbox/dcim/forms/fields.py new file mode 100644 index 00000000000..25a20667b97 --- /dev/null +++ b/netbox/dcim/forms/fields.py @@ -0,0 +1,25 @@ +from django import forms +from netaddr import EUI +from netaddr.core import AddrFormatError + +__all__ = ( + 'MACAddressField', +) + + +class MACAddressField(forms.Field): + widget = forms.CharField + default_error_messages = { + 'invalid': 'MAC address must be in EUI-48 format', + } + + def to_python(self, value): + value = super().to_python(value) + + # Validate MAC address format + try: + value = EUI(value.strip()) + except AddrFormatError: + raise forms.ValidationError(self.error_messages['invalid'], code='invalid') + + return value diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py new file mode 100644 index 00000000000..95ff9aa3dd1 --- /dev/null +++ b/netbox/dcim/forms/filtersets.py @@ -0,0 +1,1143 @@ +from django import forms +from django.contrib.auth.models import User +from django.utils.translation import gettext as _ + +from dcim.choices import * +from dcim.constants import * +from dcim.models import * +from extras.forms import CustomFieldModelFilterForm, LocalConfigContextFilterForm +from tenancy.forms import TenancyFilterForm +from tenancy.models import Tenant +from utilities.forms import ( + APISelectMultiple, add_blank_choice, BootstrapMixin, ColorField, DynamicModelMultipleChoiceField, StaticSelect, + StaticSelectMultiple, TagFilterField, BOOLEAN_WITH_BLANK_CHOICES, +) + +__all__ = ( + 'CableFilterForm', + 'ConsoleConnectionFilterForm', + 'ConsolePortFilterForm', + 'ConsoleServerPortFilterForm', + 'DeviceBayFilterForm', + 'DeviceFilterForm', + 'DeviceRoleFilterForm', + 'DeviceTypeFilterForm', + 'FrontPortFilterForm', + 'InterfaceConnectionFilterForm', + 'InterfaceFilterForm', + 'InventoryItemFilterForm', + 'LocationFilterForm', + 'ManufacturerFilterForm', + 'PlatformFilterForm', + 'PowerConnectionFilterForm', + 'PowerFeedFilterForm', + 'PowerOutletFilterForm', + 'PowerPanelFilterForm', + 'PowerPortFilterForm', + 'RackFilterForm', + 'RackElevationFilterForm', + 'RackReservationFilterForm', + 'RackRoleFilterForm', + 'RearPortFilterForm', + 'RegionFilterForm', + 'SiteFilterForm', + 'SiteGroupFilterForm', + 'VirtualChassisFilterForm', +) + + +class DeviceComponentFilterForm(BootstrapMixin, CustomFieldModelFilterForm): + field_order = [ + 'q', 'name', 'label', 'region_id', 'site_group_id', 'site_id', + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + name = forms.CharField( + required=False + ) + label = forms.CharField( + required=False + ) + region_id = DynamicModelMultipleChoiceField( + queryset=Region.objects.all(), + required=False, + label=_('Region'), + fetch_trigger='open' + ) + site_group_id = DynamicModelMultipleChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + label=_('Site group'), + fetch_trigger='open' + ) + site_id = DynamicModelMultipleChoiceField( + queryset=Site.objects.all(), + required=False, + query_params={ + 'region_id': '$region_id', + 'group_id': '$site_group_id', + }, + label=_('Site'), + fetch_trigger='open' + ) + location_id = DynamicModelMultipleChoiceField( + queryset=Location.objects.all(), + required=False, + query_params={ + 'site_id': '$site_id', + }, + label=_('Location'), + fetch_trigger='open' + ) + device_id = DynamicModelMultipleChoiceField( + queryset=Device.objects.all(), + required=False, + query_params={ + 'site_id': '$site_id', + 'location_id': '$location_id', + }, + label=_('Device'), + fetch_trigger='open' + ) + + +class RegionFilterForm(BootstrapMixin, CustomFieldModelFilterForm): + model = Region + field_groups = [ + ['q'], + ['parent_id'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + parent_id = DynamicModelMultipleChoiceField( + queryset=Region.objects.all(), + required=False, + label=_('Parent region'), + fetch_trigger='open' + ) + + +class SiteGroupFilterForm(BootstrapMixin, CustomFieldModelFilterForm): + model = SiteGroup + field_groups = [ + ['q'], + ['parent_id'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + parent_id = DynamicModelMultipleChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + label=_('Parent group'), + fetch_trigger='open' + ) + + +class SiteFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm): + model = Site + field_order = ['q', 'status', 'region_id', 'tenant_group_id', 'tenant_id'] + field_groups = [ + ['q', 'tag'], + ['status', 'region_id', 'group_id'], + ['tenant_group_id', 'tenant_id'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + status = forms.MultipleChoiceField( + choices=SiteStatusChoices, + required=False, + widget=StaticSelectMultiple(), + ) + region_id = DynamicModelMultipleChoiceField( + queryset=Region.objects.all(), + required=False, + label=_('Region'), + fetch_trigger='open' + ) + group_id = DynamicModelMultipleChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + label=_('Site group'), + fetch_trigger='open' + ) + tag = TagFilterField(model) + + +class LocationFilterForm(BootstrapMixin, CustomFieldModelFilterForm): + model = Location + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + region_id = DynamicModelMultipleChoiceField( + queryset=Region.objects.all(), + required=False, + label=_('Region'), + fetch_trigger='open' + ) + site_group_id = DynamicModelMultipleChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + label=_('Site group'), + fetch_trigger='open' + ) + site_id = DynamicModelMultipleChoiceField( + queryset=Site.objects.all(), + required=False, + query_params={ + 'region_id': '$region_id', + 'group_id': '$site_group_id', + }, + label=_('Site'), + fetch_trigger='open' + ) + parent_id = DynamicModelMultipleChoiceField( + queryset=Location.objects.all(), + required=False, + query_params={ + 'region_id': '$region_id', + 'site_id': '$site_id', + }, + label=_('Parent'), + fetch_trigger='open' + ) + + +class RackRoleFilterForm(BootstrapMixin, CustomFieldModelFilterForm): + model = RackRole + field_groups = [ + ['q'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + + +class RackFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm): + model = Rack + field_order = ['q', 'region_id', 'site_id', 'location_id', 'status', 'role_id', 'tenant_group_id', 'tenant_id'] + field_groups = [ + ['q', 'tag'], + ['region_id', 'site_id', 'location_id'], + ['status', 'role_id'], + ['type', 'width', 'serial', 'asset_tag'], + ['tenant_group_id', 'tenant_id'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + region_id = DynamicModelMultipleChoiceField( + queryset=Region.objects.all(), + required=False, + label=_('Region'), + fetch_trigger='open' + ) + site_id = DynamicModelMultipleChoiceField( + queryset=Site.objects.all(), + required=False, + query_params={ + 'region_id': '$region_id' + }, + label=_('Site'), + fetch_trigger='open' + ) + location_id = DynamicModelMultipleChoiceField( + queryset=Location.objects.all(), + required=False, + null_option='None', + query_params={ + 'site_id': '$site_id' + }, + label=_('Location'), + fetch_trigger='open' + ) + status = forms.MultipleChoiceField( + choices=RackStatusChoices, + required=False, + widget=StaticSelectMultiple() + ) + type = forms.MultipleChoiceField( + choices=RackTypeChoices, + required=False, + widget=StaticSelectMultiple() + ) + width = forms.MultipleChoiceField( + choices=RackWidthChoices, + required=False, + widget=StaticSelectMultiple() + ) + role_id = DynamicModelMultipleChoiceField( + queryset=RackRole.objects.all(), + required=False, + null_option='None', + label=_('Role'), + fetch_trigger='open' + ) + serial = forms.CharField( + required=False + ) + asset_tag = forms.CharField( + required=False + ) + tag = TagFilterField(model) + + +class RackElevationFilterForm(RackFilterForm): + field_order = [ + 'q', 'region_id', 'site_id', 'location_id', 'id', 'status', 'role_id', 'tenant_group_id', + 'tenant_id', + ] + id = DynamicModelMultipleChoiceField( + queryset=Rack.objects.all(), + label=_('Rack'), + required=False, + query_params={ + 'site_id': '$site_id', + 'location_id': '$location_id', + }, + fetch_trigger='open' + ) + + +class RackReservationFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm): + model = RackReservation + field_order = ['q', 'region_id', 'site_id', 'location_id', 'user_id', 'tenant_group_id', 'tenant_id'] + field_groups = [ + ['q', 'tag'], + ['user_id'], + ['region_id', 'site_id', 'location_id'], + ['tenant_group_id', 'tenant_id'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + region_id = DynamicModelMultipleChoiceField( + queryset=Region.objects.all(), + required=False, + label=_('Region'), + fetch_trigger='open' + ) + site_id = DynamicModelMultipleChoiceField( + queryset=Site.objects.all(), + required=False, + query_params={ + 'region_id': '$region_id' + }, + label=_('Site'), + fetch_trigger='open' + ) + location_id = DynamicModelMultipleChoiceField( + queryset=Location.objects.prefetch_related('site'), + required=False, + label=_('Location'), + null_option='None', + fetch_trigger='open' + ) + user_id = DynamicModelMultipleChoiceField( + queryset=User.objects.all(), + required=False, + label=_('User'), + widget=APISelectMultiple( + api_url='/api/users/users/', + ), + fetch_trigger='open' + ) + tag = TagFilterField(model) + + +class ManufacturerFilterForm(BootstrapMixin, CustomFieldModelFilterForm): + model = Manufacturer + field_groups = [ + ['q'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + + +class DeviceTypeFilterForm(BootstrapMixin, CustomFieldModelFilterForm): + model = DeviceType + field_groups = [ + ['q', 'tag'], + ['manufacturer_id', 'subdevice_role'], + ['console_ports', 'console_server_ports', 'power_ports', 'power_outlets', 'interfaces', 'pass_through_ports'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + manufacturer_id = DynamicModelMultipleChoiceField( + queryset=Manufacturer.objects.all(), + required=False, + label=_('Manufacturer'), + fetch_trigger='open' + ) + subdevice_role = forms.MultipleChoiceField( + choices=add_blank_choice(SubdeviceRoleChoices), + required=False, + widget=StaticSelectMultiple() + ) + console_ports = forms.NullBooleanField( + required=False, + label='Has console ports', + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + console_server_ports = forms.NullBooleanField( + required=False, + label='Has console server ports', + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + power_ports = forms.NullBooleanField( + required=False, + label='Has power ports', + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + power_outlets = forms.NullBooleanField( + required=False, + label='Has power outlets', + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + interfaces = forms.NullBooleanField( + required=False, + label='Has interfaces', + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + pass_through_ports = forms.NullBooleanField( + required=False, + label='Has pass-through ports', + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + tag = TagFilterField(model) + + +class DeviceRoleFilterForm(BootstrapMixin, CustomFieldModelFilterForm): + model = DeviceRole + field_groups = [ + ['q'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + + +class PlatformFilterForm(BootstrapMixin, CustomFieldModelFilterForm): + model = Platform + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + manufacturer_id = DynamicModelMultipleChoiceField( + queryset=Manufacturer.objects.all(), + required=False, + label=_('Manufacturer'), + fetch_trigger='open' + ) + + +class DeviceFilterForm(BootstrapMixin, LocalConfigContextFilterForm, TenancyFilterForm, CustomFieldModelFilterForm): + model = Device + field_order = [ + 'q', 'region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id', 'status', 'role_id', 'tenant_group_id', + 'tenant_id', 'manufacturer_id', 'device_type_id', 'asset_tag', 'mac_address', 'has_primary_ip', + ] + field_groups = [ + ['q', 'tag'], + ['region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id'], + ['status', 'role_id', 'serial', 'asset_tag', 'mac_address'], + ['manufacturer_id', 'device_type_id', 'platform_id'], + ['tenant_group_id', 'tenant_id'], + [ + 'has_primary_ip', 'virtual_chassis_member', 'console_ports', 'console_server_ports', 'power_ports', + 'power_outlets', 'interfaces', 'pass_through_ports', 'local_context_data', + ], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + region_id = DynamicModelMultipleChoiceField( + queryset=Region.objects.all(), + required=False, + label=_('Region'), + fetch_trigger='open' + ) + site_group_id = DynamicModelMultipleChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + label=_('Site group'), + fetch_trigger='open' + ) + site_id = DynamicModelMultipleChoiceField( + queryset=Site.objects.all(), + required=False, + query_params={ + 'region_id': '$region_id', + 'group_id': '$site_group_id', + }, + label=_('Site'), + fetch_trigger='open' + ) + location_id = DynamicModelMultipleChoiceField( + queryset=Location.objects.all(), + required=False, + null_option='None', + query_params={ + 'site_id': '$site_id' + }, + label=_('Location'), + fetch_trigger='open' + ) + rack_id = DynamicModelMultipleChoiceField( + queryset=Rack.objects.all(), + required=False, + null_option='None', + query_params={ + 'site_id': '$site_id', + 'location_id': '$location_id', + }, + label=_('Rack'), + fetch_trigger='open' + ) + role_id = DynamicModelMultipleChoiceField( + queryset=DeviceRole.objects.all(), + required=False, + label=_('Role'), + fetch_trigger='open' + ) + manufacturer_id = DynamicModelMultipleChoiceField( + queryset=Manufacturer.objects.all(), + required=False, + label=_('Manufacturer'), + fetch_trigger='open' + ) + device_type_id = DynamicModelMultipleChoiceField( + queryset=DeviceType.objects.all(), + required=False, + query_params={ + 'manufacturer_id': '$manufacturer_id' + }, + label=_('Model'), + fetch_trigger='open' + ) + platform_id = DynamicModelMultipleChoiceField( + queryset=Platform.objects.all(), + required=False, + null_option='None', + label=_('Platform'), + fetch_trigger='open' + ) + status = forms.MultipleChoiceField( + choices=DeviceStatusChoices, + required=False, + widget=StaticSelectMultiple() + ) + serial = forms.CharField( + required=False + ) + asset_tag = forms.CharField( + required=False + ) + mac_address = forms.CharField( + required=False, + label='MAC address' + ) + has_primary_ip = forms.NullBooleanField( + required=False, + label='Has a primary IP', + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + virtual_chassis_member = forms.NullBooleanField( + required=False, + label='Virtual chassis member', + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + console_ports = forms.NullBooleanField( + required=False, + label='Has console ports', + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + console_server_ports = forms.NullBooleanField( + required=False, + label='Has console server ports', + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + power_ports = forms.NullBooleanField( + required=False, + label='Has power ports', + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + power_outlets = forms.NullBooleanField( + required=False, + label='Has power outlets', + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + interfaces = forms.NullBooleanField( + required=False, + label='Has interfaces', + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + pass_through_ports = forms.NullBooleanField( + required=False, + label='Has pass-through ports', + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + tag = TagFilterField(model) + + +class VirtualChassisFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm): + model = VirtualChassis + field_order = ['q', 'region_id', 'site_group_id', 'site_id', 'tenant_group_id', 'tenant_id'] + field_groups = [ + ['q', 'tag'], + ['region_id', 'site_group_id', 'site_id'], + ['tenant_group_id', 'tenant_id'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + region_id = DynamicModelMultipleChoiceField( + queryset=Region.objects.all(), + required=False, + label=_('Region'), + fetch_trigger='open' + ) + site_group_id = DynamicModelMultipleChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + label=_('Site group'), + fetch_trigger='open' + ) + site_id = DynamicModelMultipleChoiceField( + queryset=Site.objects.all(), + required=False, + query_params={ + 'region_id': '$region_id', + 'group_id': '$site_group_id', + }, + label=_('Site'), + fetch_trigger='open' + ) + tag = TagFilterField(model) + + +class CableFilterForm(BootstrapMixin, CustomFieldModelFilterForm): + model = Cable + field_groups = [ + ['q', 'tag'], + ['site_id', 'rack_id', 'device_id'], + ['type', 'status', 'color'], + ['tenant_id'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + region_id = DynamicModelMultipleChoiceField( + queryset=Region.objects.all(), + required=False, + label=_('Region'), + fetch_trigger='open' + ) + site_id = DynamicModelMultipleChoiceField( + queryset=Site.objects.all(), + required=False, + query_params={ + 'region_id': '$region_id' + }, + label=_('Site'), + fetch_trigger='open' + ) + tenant_id = DynamicModelMultipleChoiceField( + queryset=Tenant.objects.all(), + required=False, + label=_('Tenant'), + fetch_trigger='open' + ) + rack_id = DynamicModelMultipleChoiceField( + queryset=Rack.objects.all(), + required=False, + label=_('Rack'), + null_option='None', + query_params={ + 'site_id': '$site_id' + }, + fetch_trigger='open' + ) + type = forms.MultipleChoiceField( + choices=add_blank_choice(CableTypeChoices), + required=False, + widget=StaticSelect() + ) + status = forms.ChoiceField( + required=False, + choices=add_blank_choice(CableStatusChoices), + widget=StaticSelect() + ) + color = ColorField( + required=False + ) + device_id = DynamicModelMultipleChoiceField( + queryset=Device.objects.all(), + required=False, + query_params={ + 'site_id': '$site_id', + 'tenant_id': '$tenant_id', + 'rack_id': '$rack_id', + }, + label=_('Device'), + fetch_trigger='open' + ) + tag = TagFilterField(model) + + +class PowerPanelFilterForm(BootstrapMixin, CustomFieldModelFilterForm): + model = PowerPanel + field_groups = ( + ('q', 'tag'), + ('region_id', 'site_group_id', 'site_id', 'location_id') + ) + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + region_id = DynamicModelMultipleChoiceField( + queryset=Region.objects.all(), + required=False, + label=_('Region'), + fetch_trigger='open' + ) + site_group_id = DynamicModelMultipleChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + label=_('Site group'), + fetch_trigger='open' + ) + site_id = DynamicModelMultipleChoiceField( + queryset=Site.objects.all(), + required=False, + query_params={ + 'region_id': '$region_id', + 'group_id': '$site_group_id', + }, + label=_('Site'), + fetch_trigger='open' + ) + location_id = DynamicModelMultipleChoiceField( + queryset=Location.objects.all(), + required=False, + null_option='None', + query_params={ + 'site_id': '$site_id' + }, + label=_('Location'), + fetch_trigger='open' + ) + tag = TagFilterField(model) + + +class PowerFeedFilterForm(BootstrapMixin, CustomFieldModelFilterForm): + model = PowerFeed + field_groups = [ + ['q', 'tag'], + ['region_id', 'site_group_id', 'site_id'], + ['power_panel_id', 'rack_id'], + ['status', 'type', 'supply', 'phase', 'voltage', 'amperage', 'max_utilization'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + region_id = DynamicModelMultipleChoiceField( + queryset=Region.objects.all(), + required=False, + label=_('Region'), + fetch_trigger='open' + ) + site_group_id = DynamicModelMultipleChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + label=_('Site group'), + fetch_trigger='open' + ) + site_id = DynamicModelMultipleChoiceField( + queryset=Site.objects.all(), + required=False, + query_params={ + 'region_id': '$region_id' + }, + label=_('Site'), + fetch_trigger='open' + ) + power_panel_id = DynamicModelMultipleChoiceField( + queryset=PowerPanel.objects.all(), + required=False, + null_option='None', + query_params={ + 'site_id': '$site_id' + }, + label=_('Power panel'), + fetch_trigger='open' + ) + rack_id = DynamicModelMultipleChoiceField( + queryset=Rack.objects.all(), + required=False, + null_option='None', + query_params={ + 'site_id': '$site_id' + }, + label=_('Rack'), + fetch_trigger='open' + ) + status = forms.MultipleChoiceField( + choices=PowerFeedStatusChoices, + required=False, + widget=StaticSelectMultiple() + ) + type = forms.ChoiceField( + choices=add_blank_choice(PowerFeedTypeChoices), + required=False, + widget=StaticSelect() + ) + supply = forms.ChoiceField( + choices=add_blank_choice(PowerFeedSupplyChoices), + required=False, + widget=StaticSelect() + ) + phase = forms.ChoiceField( + choices=add_blank_choice(PowerFeedPhaseChoices), + required=False, + widget=StaticSelect() + ) + voltage = forms.IntegerField( + required=False + ) + amperage = forms.IntegerField( + required=False + ) + max_utilization = forms.IntegerField( + required=False + ) + tag = TagFilterField(model) + + +# +# Device components +# + +class ConsolePortFilterForm(DeviceComponentFilterForm): + model = ConsolePort + field_groups = [ + ['q', 'tag'], + ['name', 'label', 'type', 'speed'], + ['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'], + ] + type = forms.MultipleChoiceField( + choices=ConsolePortTypeChoices, + required=False, + widget=StaticSelectMultiple() + ) + speed = forms.MultipleChoiceField( + choices=ConsolePortSpeedChoices, + required=False, + widget=StaticSelectMultiple() + ) + tag = TagFilterField(model) + + +class ConsoleServerPortFilterForm(DeviceComponentFilterForm): + model = ConsoleServerPort + field_groups = [ + ['q', 'tag'], + ['name', 'label', 'type', 'speed'], + ['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'], + ] + type = forms.MultipleChoiceField( + choices=ConsolePortTypeChoices, + required=False, + widget=StaticSelectMultiple() + ) + speed = forms.MultipleChoiceField( + choices=ConsolePortSpeedChoices, + required=False, + widget=StaticSelectMultiple() + ) + tag = TagFilterField(model) + + +class PowerPortFilterForm(DeviceComponentFilterForm): + model = PowerPort + field_groups = [ + ['q', 'tag'], + ['name', 'label', 'type'], + ['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'], + ] + type = forms.MultipleChoiceField( + choices=PowerPortTypeChoices, + required=False, + widget=StaticSelectMultiple() + ) + tag = TagFilterField(model) + + +class PowerOutletFilterForm(DeviceComponentFilterForm): + model = PowerOutlet + field_groups = [ + ['q', 'tag'], + ['name', 'label', 'type'], + ['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'], + ] + type = forms.MultipleChoiceField( + choices=PowerOutletTypeChoices, + required=False, + widget=StaticSelectMultiple() + ) + tag = TagFilterField(model) + + +class InterfaceFilterForm(DeviceComponentFilterForm): + model = Interface + field_groups = [ + ['q', 'tag'], + ['name', 'label', 'type', 'enabled', 'mgmt_only', 'mac_address'], + ['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'], + ] + type = forms.MultipleChoiceField( + choices=InterfaceTypeChoices, + required=False, + widget=StaticSelectMultiple() + ) + enabled = forms.NullBooleanField( + required=False, + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + mgmt_only = forms.NullBooleanField( + required=False, + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + mac_address = forms.CharField( + required=False, + label='MAC address' + ) + tag = TagFilterField(model) + + +class FrontPortFilterForm(DeviceComponentFilterForm): + field_groups = [ + ['q', 'tag'], + ['name', 'label', 'type', 'color'], + ['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'], + ] + model = FrontPort + type = forms.MultipleChoiceField( + choices=PortTypeChoices, + required=False, + widget=StaticSelectMultiple() + ) + color = ColorField( + required=False + ) + tag = TagFilterField(model) + + +class RearPortFilterForm(DeviceComponentFilterForm): + model = RearPort + field_groups = [ + ['q', 'tag'], + ['name', 'label', 'type', 'color'], + ['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'], + ] + type = forms.MultipleChoiceField( + choices=PortTypeChoices, + required=False, + widget=StaticSelectMultiple() + ) + color = ColorField( + required=False + ) + tag = TagFilterField(model) + + +class DeviceBayFilterForm(DeviceComponentFilterForm): + model = DeviceBay + field_groups = [ + ['q', 'tag'], + ['name', 'label'], + ['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'], + ] + tag = TagFilterField(model) + + +class InventoryItemFilterForm(DeviceComponentFilterForm): + model = InventoryItem + field_groups = [ + ['q', 'tag'], + ['name', 'label', 'manufacturer_id', 'serial', 'asset_tag', 'discovered'], + ['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'], + ] + manufacturer_id = DynamicModelMultipleChoiceField( + queryset=Manufacturer.objects.all(), + required=False, + label=_('Manufacturer'), + fetch_trigger='open' + ) + serial = forms.CharField( + required=False + ) + asset_tag = forms.CharField( + required=False + ) + discovered = forms.NullBooleanField( + required=False, + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + tag = TagFilterField(model) + + +# +# Connections +# + +class ConsoleConnectionFilterForm(BootstrapMixin, forms.Form): + region_id = DynamicModelMultipleChoiceField( + queryset=Region.objects.all(), + required=False, + label=_('Region'), + fetch_trigger='open' + ) + site_id = DynamicModelMultipleChoiceField( + queryset=Site.objects.all(), + required=False, + query_params={ + 'region_id': '$region_id' + }, + label=_('Site'), + fetch_trigger='open' + ) + device_id = DynamicModelMultipleChoiceField( + queryset=Device.objects.all(), + required=False, + query_params={ + 'site_id': '$site_id' + }, + label=_('Device'), + fetch_trigger='open' + ) + + +class PowerConnectionFilterForm(BootstrapMixin, forms.Form): + region_id = DynamicModelMultipleChoiceField( + queryset=Region.objects.all(), + required=False, + label=_('Region'), + fetch_trigger='open' + ) + site_id = DynamicModelMultipleChoiceField( + queryset=Site.objects.all(), + required=False, + query_params={ + 'region_id': '$region_id' + }, + label=_('Site'), + fetch_trigger='open' + ) + device_id = DynamicModelMultipleChoiceField( + queryset=Device.objects.all(), + required=False, + query_params={ + 'site_id': '$site_id' + }, + label=_('Device'), + fetch_trigger='open' + ) + + +class InterfaceConnectionFilterForm(BootstrapMixin, forms.Form): + region_id = DynamicModelMultipleChoiceField( + queryset=Region.objects.all(), + required=False, + label=_('Region'), + fetch_trigger='open' + ) + site_id = DynamicModelMultipleChoiceField( + queryset=Site.objects.all(), + required=False, + query_params={ + 'region_id': '$region_id' + }, + label=_('Site'), + fetch_trigger='open' + ) + device_id = DynamicModelMultipleChoiceField( + queryset=Device.objects.all(), + required=False, + query_params={ + 'site_id': '$site_id' + }, + label=_('Device'), + fetch_trigger='open' + ) diff --git a/netbox/dcim/forms/formsets.py b/netbox/dcim/forms/formsets.py new file mode 100644 index 00000000000..6109a157531 --- /dev/null +++ b/netbox/dcim/forms/formsets.py @@ -0,0 +1,21 @@ +from django import forms + +__all__ = ( + 'BaseVCMemberFormSet', +) + + +class BaseVCMemberFormSet(forms.BaseModelFormSet): + + def clean(self): + super().clean() + + # Check for duplicate VC position values + vc_position_list = [] + for form in self.forms: + vc_position = form.cleaned_data.get('vc_position') + if vc_position: + if vc_position in vc_position_list: + error_msg = f"A virtual chassis member already exists in position {vc_position}." + form.add_error('vc_position', error_msg) + vc_position_list.append(vc_position) diff --git a/netbox/dcim/forms/models.py b/netbox/dcim/forms/models.py new file mode 100644 index 00000000000..8331cbb10aa --- /dev/null +++ b/netbox/dcim/forms/models.py @@ -0,0 +1,1232 @@ +from django import forms +from django.contrib.auth.models import User +from django.contrib.contenttypes.models import ContentType +from timezone_field import TimeZoneFormField + +from dcim.choices import * +from dcim.constants import * +from dcim.models import * +from extras.forms import CustomFieldModelForm +from extras.models import Tag +from ipam.models import IPAddress, VLAN, VLANGroup +from tenancy.forms import TenancyForm +from utilities.forms import ( + APISelect, add_blank_choice, BootstrapMixin, ClearableFileInput, CommentField, DynamicModelChoiceField, + DynamicModelMultipleChoiceField, JSONField, NumericArrayField, SelectWithPK, SmallTextarea, + SlugField, StaticSelect, +) +from virtualization.models import Cluster, ClusterGroup +from .common import InterfaceCommonForm + +__all__ = ( + 'CableForm', + 'ConsolePortForm', + 'ConsolePortTemplateForm', + 'ConsoleServerPortForm', + 'ConsoleServerPortTemplateForm', + 'DeviceBayForm', + 'DeviceBayTemplateForm', + 'DeviceForm', + 'DeviceRoleForm', + 'DeviceTypeForm', + 'DeviceVCMembershipForm', + 'FrontPortForm', + 'FrontPortTemplateForm', + 'InterfaceForm', + 'InterfaceTemplateForm', + 'InventoryItemForm', + 'LocationForm', + 'ManufacturerForm', + 'PlatformForm', + 'PowerFeedForm', + 'PowerOutletForm', + 'PowerOutletTemplateForm', + 'PowerPanelForm', + 'PowerPortForm', + 'PowerPortTemplateForm', + 'RackForm', + 'RackReservationForm', + 'RackRoleForm', + 'RearPortForm', + 'RearPortTemplateForm', + 'RegionForm', + 'SiteForm', + 'SiteGroupForm', + 'VirtualChassisForm', +) + +INTERFACE_MODE_HELP_TEXT = """ +Access: One untagged VLAN
+Tagged: One untagged VLAN and/or one or more tagged VLANs
+Tagged (All): Implies all VLANs are available (w/optional untagged VLAN) +""" + + +class RegionForm(BootstrapMixin, CustomFieldModelForm): + parent = DynamicModelChoiceField( + queryset=Region.objects.all(), + required=False + ) + slug = SlugField() + + class Meta: + model = Region + fields = ( + 'parent', 'name', 'slug', 'description', + ) + + +class SiteGroupForm(BootstrapMixin, CustomFieldModelForm): + parent = DynamicModelChoiceField( + queryset=SiteGroup.objects.all(), + required=False + ) + slug = SlugField() + + class Meta: + model = SiteGroup + fields = ( + 'parent', 'name', 'slug', 'description', + ) + + +class SiteForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): + region = DynamicModelChoiceField( + queryset=Region.objects.all(), + required=False + ) + group = DynamicModelChoiceField( + queryset=SiteGroup.objects.all(), + required=False + ) + slug = SlugField() + time_zone = TimeZoneFormField( + choices=add_blank_choice(TimeZoneFormField().choices), + required=False, + widget=StaticSelect() + ) + comments = CommentField() + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = Site + fields = [ + 'name', 'slug', 'status', 'region', 'group', 'tenant_group', 'tenant', 'facility', 'asn', 'time_zone', + 'description', 'physical_address', 'shipping_address', 'latitude', 'longitude', 'contact_name', + 'contact_phone', 'contact_email', 'comments', 'tags', + ] + fieldsets = ( + ('Site', ( + 'name', 'slug', 'status', 'region', 'group', 'facility', 'asn', 'time_zone', 'description', 'tags', + )), + ('Tenancy', ('tenant_group', 'tenant')), + ('Contact Info', ( + 'physical_address', 'shipping_address', 'latitude', 'longitude', 'contact_name', 'contact_phone', + 'contact_email', + )), + ) + widgets = { + 'physical_address': SmallTextarea( + attrs={ + 'rows': 3, + } + ), + 'shipping_address': SmallTextarea( + attrs={ + 'rows': 3, + } + ), + 'status': StaticSelect(), + 'time_zone': StaticSelect(), + } + help_texts = { + 'name': "Full name of the site", + 'facility': "Data center provider and facility (e.g. Equinix NY7)", + 'asn': "BGP autonomous system number", + 'time_zone': "Local time zone", + 'description': "Short description (will appear in sites list)", + 'physical_address': "Physical location of the building (e.g. for GPS)", + 'shipping_address': "If different from the physical address", + 'latitude': "Latitude in decimal format (xx.yyyyyy)", + 'longitude': "Longitude in decimal format (xx.yyyyyy)" + } + + +class LocationForm(BootstrapMixin, CustomFieldModelForm): + region = DynamicModelChoiceField( + queryset=Region.objects.all(), + required=False, + initial_params={ + 'sites': '$site' + } + ) + site_group = DynamicModelChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + initial_params={ + 'sites': '$site' + } + ) + site = DynamicModelChoiceField( + queryset=Site.objects.all(), + query_params={ + 'region_id': '$region', + 'group_id': '$site_group', + } + ) + parent = DynamicModelChoiceField( + queryset=Location.objects.all(), + required=False, + query_params={ + 'site_id': '$site' + } + ) + slug = SlugField() + + class Meta: + model = Location + fields = ( + 'region', 'site_group', 'site', 'parent', 'name', 'slug', 'description', + ) + + +class RackRoleForm(BootstrapMixin, CustomFieldModelForm): + slug = SlugField() + + class Meta: + model = RackRole + fields = [ + 'name', 'slug', 'color', 'description', + ] + + +class RackForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): + region = DynamicModelChoiceField( + queryset=Region.objects.all(), + required=False, + initial_params={ + 'sites': '$site' + } + ) + site_group = DynamicModelChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + initial_params={ + 'sites': '$site' + } + ) + site = DynamicModelChoiceField( + queryset=Site.objects.all(), + query_params={ + 'region_id': '$region', + 'group_id': '$site_group', + } + ) + location = DynamicModelChoiceField( + queryset=Location.objects.all(), + required=False, + query_params={ + 'site_id': '$site' + } + ) + role = DynamicModelChoiceField( + queryset=RackRole.objects.all(), + required=False + ) + comments = CommentField() + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = Rack + fields = [ + 'region', 'site_group', 'site', 'location', 'name', 'facility_id', 'tenant_group', 'tenant', 'status', + 'role', 'serial', 'asset_tag', 'type', 'width', 'u_height', 'desc_units', 'outer_width', 'outer_depth', + 'outer_unit', 'comments', 'tags', + ] + help_texts = { + 'site': "The site at which the rack exists", + 'name': "Organizational rack name", + 'facility_id': "The unique rack ID assigned by the facility", + 'u_height': "Height in rack units", + } + widgets = { + 'status': StaticSelect(), + 'type': StaticSelect(), + 'width': StaticSelect(), + 'outer_unit': StaticSelect(), + } + + +class RackReservationForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): + region = DynamicModelChoiceField( + queryset=Region.objects.all(), + required=False, + initial_params={ + 'sites': '$site' + }, + fetch_trigger='open' + ) + site_group = DynamicModelChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + initial_params={ + 'sites': '$site' + }, + fetch_trigger='open' + ) + site = DynamicModelChoiceField( + queryset=Site.objects.all(), + required=False, + query_params={ + 'region_id': '$region', + 'group_id': '$site_group', + }, + fetch_trigger='open' + ) + location = DynamicModelChoiceField( + queryset=Location.objects.all(), + required=False, + query_params={ + 'site_id': '$site' + }, + fetch_trigger='open' + ) + rack = DynamicModelChoiceField( + queryset=Rack.objects.all(), + query_params={ + 'site_id': '$site', + 'location_id': '$location', + }, + fetch_trigger='open' + ) + units = NumericArrayField( + base_field=forms.IntegerField(), + help_text="Comma-separated list of numeric unit IDs. A range may be specified using a hyphen." + ) + user = forms.ModelChoiceField( + queryset=User.objects.order_by( + 'username' + ), + widget=StaticSelect() + ) + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False, + fetch_trigger='open' + ) + + class Meta: + model = RackReservation + fields = [ + 'region', 'site_group', 'site', 'location', 'rack', 'units', 'user', 'tenant_group', 'tenant', + 'description', 'tags', + ] + fieldsets = ( + ('Reservation', ('region', 'site', 'location', 'rack', 'units', 'user', 'description', 'tags')), + ('Tenancy', ('tenant_group', 'tenant')), + ) + + +class ManufacturerForm(BootstrapMixin, CustomFieldModelForm): + slug = SlugField() + + class Meta: + model = Manufacturer + fields = [ + 'name', 'slug', 'description', + ] + + +class DeviceTypeForm(BootstrapMixin, CustomFieldModelForm): + manufacturer = DynamicModelChoiceField( + queryset=Manufacturer.objects.all() + ) + slug = SlugField( + slug_source='model' + ) + comments = CommentField() + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = DeviceType + fields = [ + 'manufacturer', 'model', 'slug', 'part_number', 'u_height', 'is_full_depth', 'subdevice_role', + 'front_image', 'rear_image', 'comments', 'tags', + ] + fieldsets = ( + ('Device Type', ( + 'manufacturer', 'model', 'slug', 'part_number', 'u_height', 'is_full_depth', 'subdevice_role', 'tags', + )), + ('Images', ('front_image', 'rear_image')), + ) + widgets = { + 'subdevice_role': StaticSelect(), + 'front_image': ClearableFileInput(attrs={ + 'accept': DEVICETYPE_IMAGE_FORMATS + }), + 'rear_image': ClearableFileInput(attrs={ + 'accept': DEVICETYPE_IMAGE_FORMATS + }) + } + + +class DeviceRoleForm(BootstrapMixin, CustomFieldModelForm): + slug = SlugField() + + class Meta: + model = DeviceRole + fields = [ + 'name', 'slug', 'color', 'vm_role', 'description', + ] + + +class PlatformForm(BootstrapMixin, CustomFieldModelForm): + manufacturer = DynamicModelChoiceField( + queryset=Manufacturer.objects.all(), + required=False + ) + slug = SlugField( + max_length=64 + ) + + class Meta: + model = Platform + fields = [ + 'name', 'slug', 'manufacturer', 'napalm_driver', 'napalm_args', 'description', + ] + widgets = { + 'napalm_args': SmallTextarea(), + } + + +class DeviceForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): + region = DynamicModelChoiceField( + queryset=Region.objects.all(), + required=False, + initial_params={ + 'sites': '$site' + } + ) + site_group = DynamicModelChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + initial_params={ + 'sites': '$site' + } + ) + site = DynamicModelChoiceField( + queryset=Site.objects.all(), + query_params={ + 'region_id': '$region', + 'group_id': '$site_group', + } + ) + location = DynamicModelChoiceField( + queryset=Location.objects.all(), + required=False, + query_params={ + 'site_id': '$site' + }, + initial_params={ + 'racks': '$rack' + } + ) + rack = DynamicModelChoiceField( + queryset=Rack.objects.all(), + required=False, + query_params={ + 'site_id': '$site', + 'location_id': '$location', + } + ) + position = forms.IntegerField( + required=False, + help_text="The lowest-numbered unit occupied by the device", + widget=APISelect( + api_url='/api/dcim/racks/{{rack}}/elevation/', + attrs={ + 'disabled-indicator': 'device', + 'data-dynamic-params': '[{"fieldName":"face","queryParam":"face"}]' + } + ) + ) + manufacturer = DynamicModelChoiceField( + queryset=Manufacturer.objects.all(), + required=False, + initial_params={ + 'device_types': '$device_type' + } + ) + device_type = DynamicModelChoiceField( + queryset=DeviceType.objects.all(), + query_params={ + 'manufacturer_id': '$manufacturer' + } + ) + device_role = DynamicModelChoiceField( + queryset=DeviceRole.objects.all() + ) + platform = DynamicModelChoiceField( + queryset=Platform.objects.all(), + required=False, + query_params={ + 'manufacturer_id': ['$manufacturer', 'null'] + } + ) + cluster_group = DynamicModelChoiceField( + queryset=ClusterGroup.objects.all(), + required=False, + null_option='None', + initial_params={ + 'clusters': '$cluster' + } + ) + cluster = DynamicModelChoiceField( + queryset=Cluster.objects.all(), + required=False, + query_params={ + 'group_id': '$cluster_group' + } + ) + comments = CommentField() + local_context_data = JSONField( + required=False, + label='' + ) + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = Device + fields = [ + 'name', 'device_role', 'device_type', 'serial', 'asset_tag', 'region', 'site_group', 'site', 'rack', + 'location', 'position', 'face', 'status', 'platform', 'primary_ip4', 'primary_ip6', 'cluster_group', + 'cluster', 'tenant_group', 'tenant', 'comments', 'tags', 'local_context_data' + ] + help_texts = { + 'device_role': "The function this device serves", + 'serial': "Chassis serial number", + 'local_context_data': "Local config context data overwrites all source contexts in the final rendered " + "config context", + } + widgets = { + 'face': StaticSelect(), + 'status': StaticSelect(), + 'primary_ip4': StaticSelect(), + 'primary_ip6': StaticSelect(), + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + if self.instance.pk: + + # Compile list of choices for primary IPv4 and IPv6 addresses + for family in [4, 6]: + ip_choices = [(None, '---------')] + + # Gather PKs of all interfaces belonging to this Device or a peer VirtualChassis member + interface_ids = self.instance.vc_interfaces(if_master=False).values_list('pk', flat=True) + + # Collect interface IPs + interface_ips = IPAddress.objects.filter( + address__family=family, + assigned_object_type=ContentType.objects.get_for_model(Interface), + assigned_object_id__in=interface_ids + ).prefetch_related('assigned_object') + if interface_ips: + ip_list = [(ip.id, f'{ip.address} ({ip.assigned_object})') for ip in interface_ips] + ip_choices.append(('Interface IPs', ip_list)) + # Collect NAT IPs + nat_ips = IPAddress.objects.prefetch_related('nat_inside').filter( + address__family=family, + nat_inside__assigned_object_type=ContentType.objects.get_for_model(Interface), + nat_inside__assigned_object_id__in=interface_ids + ).prefetch_related('assigned_object') + if nat_ips: + ip_list = [(ip.id, f'{ip.address} (NAT)') for ip in nat_ips] + ip_choices.append(('NAT IPs', ip_list)) + self.fields['primary_ip{}'.format(family)].choices = ip_choices + + # If editing an existing device, exclude it from the list of occupied rack units. This ensures that a device + # can be flipped from one face to another. + self.fields['position'].widget.add_query_param('exclude', self.instance.pk) + + # Limit platform by manufacturer + self.fields['platform'].queryset = Platform.objects.filter( + Q(manufacturer__isnull=True) | Q(manufacturer=self.instance.device_type.manufacturer) + ) + + # Disable rack assignment if this is a child device installed in a parent device + if self.instance.device_type.is_child_device and hasattr(self.instance, 'parent_bay'): + self.fields['site'].disabled = True + self.fields['rack'].disabled = True + self.initial['site'] = self.instance.parent_bay.device.site_id + self.initial['rack'] = self.instance.parent_bay.device.rack_id + + else: + + # An object that doesn't exist yet can't have any IPs assigned to it + self.fields['primary_ip4'].choices = [] + self.fields['primary_ip4'].widget.attrs['readonly'] = True + self.fields['primary_ip6'].choices = [] + self.fields['primary_ip6'].widget.attrs['readonly'] = True + + # Rack position + position = self.data.get('position') or self.initial.get('position') + if position: + self.fields['position'].widget.choices = [(position, f'U{position}')] + + +class CableForm(BootstrapMixin, CustomFieldModelForm): + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = Cable + fields = [ + 'type', 'status', 'label', 'color', 'length', 'length_unit', 'tags', + ] + widgets = { + 'status': StaticSelect, + 'type': StaticSelect, + 'length_unit': StaticSelect, + } + error_messages = { + 'length': { + 'max_value': 'Maximum length is 32767 (any unit)' + } + } + + +class PowerPanelForm(BootstrapMixin, CustomFieldModelForm): + region = DynamicModelChoiceField( + queryset=Region.objects.all(), + required=False, + initial_params={ + 'sites': '$site' + } + ) + site_group = DynamicModelChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + initial_params={ + 'sites': '$site' + } + ) + site = DynamicModelChoiceField( + queryset=Site.objects.all(), + query_params={ + 'region_id': '$region', + 'group_id': '$site_group', + } + ) + location = DynamicModelChoiceField( + queryset=Location.objects.all(), + required=False, + query_params={ + 'site_id': '$site' + } + ) + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = PowerPanel + fields = [ + 'region', 'site_group', 'site', 'location', 'name', 'tags', + ] + fieldsets = ( + ('Power Panel', ('region', 'site_group', 'site', 'location', 'name', 'tags')), + ) + + +class PowerFeedForm(BootstrapMixin, CustomFieldModelForm): + region = DynamicModelChoiceField( + queryset=Region.objects.all(), + required=False, + initial_params={ + 'sites__powerpanel': '$power_panel' + } + ) + site_group = DynamicModelChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + initial_params={ + 'sites': '$site' + } + ) + site = DynamicModelChoiceField( + queryset=Site.objects.all(), + required=False, + initial_params={ + 'powerpanel': '$power_panel' + }, + query_params={ + 'region_id': '$region', + 'group_id': '$site_group', + } + ) + power_panel = DynamicModelChoiceField( + queryset=PowerPanel.objects.all(), + query_params={ + 'site_id': '$site' + } + ) + rack = DynamicModelChoiceField( + queryset=Rack.objects.all(), + required=False, + query_params={ + 'site_id': '$site' + } + ) + comments = CommentField() + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = PowerFeed + fields = [ + 'region', 'site_group', 'site', 'power_panel', 'rack', 'name', 'status', 'type', 'mark_connected', 'supply', + 'phase', 'voltage', 'amperage', 'max_utilization', 'comments', 'tags', + ] + fieldsets = ( + ('Power Panel', ('region', 'site', 'power_panel')), + ('Power Feed', ('rack', 'name', 'status', 'type', 'mark_connected', 'tags')), + ('Characteristics', ('supply', 'voltage', 'amperage', 'phase', 'max_utilization')), + ) + widgets = { + 'status': StaticSelect(), + 'type': StaticSelect(), + 'supply': StaticSelect(), + 'phase': StaticSelect(), + } + + +# +# Virtual chassis +# + +class VirtualChassisForm(BootstrapMixin, CustomFieldModelForm): + master = forms.ModelChoiceField( + queryset=Device.objects.all(), + required=False, + ) + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = VirtualChassis + fields = [ + 'name', 'domain', 'master', 'tags', + ] + widgets = { + 'master': SelectWithPK(), + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + self.fields['master'].queryset = Device.objects.filter(virtual_chassis=self.instance) + + +class DeviceVCMembershipForm(forms.ModelForm): + + class Meta: + model = Device + fields = [ + 'vc_position', 'vc_priority', + ] + labels = { + 'vc_position': 'Position', + 'vc_priority': 'Priority', + } + + def __init__(self, validate_vc_position=False, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Require VC position (only required when the Device is a VirtualChassis member) + self.fields['vc_position'].required = True + + # Add bootstrap classes to form elements. + self.fields['vc_position'].widget.attrs = {'class': 'form-control'} + self.fields['vc_priority'].widget.attrs = {'class': 'form-control'} + + # Validation of vc_position is optional. This is only required when adding a new member to an existing + # VirtualChassis. Otherwise, vc_position validation is handled by BaseVCMemberFormSet. + self.validate_vc_position = validate_vc_position + + def clean_vc_position(self): + vc_position = self.cleaned_data['vc_position'] + + if self.validate_vc_position: + conflicting_members = Device.objects.filter( + virtual_chassis=self.instance.virtual_chassis, + vc_position=vc_position + ) + if conflicting_members.exists(): + raise forms.ValidationError( + 'A virtual chassis member already exists in position {}.'.format(vc_position) + ) + + return vc_position + + +class VCMemberSelectForm(BootstrapMixin, forms.Form): + region = DynamicModelChoiceField( + queryset=Region.objects.all(), + required=False, + initial_params={ + 'sites': '$site' + } + ) + site_group = DynamicModelChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + initial_params={ + 'sites': '$site' + } + ) + site = DynamicModelChoiceField( + queryset=Site.objects.all(), + required=False, + query_params={ + 'region_id': '$region', + 'group_id': '$site_group', + } + ) + rack = DynamicModelChoiceField( + queryset=Rack.objects.all(), + required=False, + null_option='None', + query_params={ + 'site_id': '$site' + } + ) + device = DynamicModelChoiceField( + queryset=Device.objects.all(), + query_params={ + 'site_id': '$site', + 'rack_id': '$rack', + 'virtual_chassis_id': 'null', + } + ) + + def clean_device(self): + device = self.cleaned_data['device'] + if device.virtual_chassis is not None: + raise forms.ValidationError( + f"Device {device} is already assigned to a virtual chassis." + ) + return device + + +# +# Device component templates +# + + +class ConsolePortTemplateForm(BootstrapMixin, forms.ModelForm): + + class Meta: + model = ConsolePortTemplate + fields = [ + 'device_type', 'name', 'label', 'type', 'description', + ] + widgets = { + 'device_type': forms.HiddenInput(), + } + + +class ConsoleServerPortTemplateForm(BootstrapMixin, forms.ModelForm): + + class Meta: + model = ConsoleServerPortTemplate + fields = [ + 'device_type', 'name', 'label', 'type', 'description', + ] + widgets = { + 'device_type': forms.HiddenInput(), + } + + +class PowerPortTemplateForm(BootstrapMixin, forms.ModelForm): + + class Meta: + model = PowerPortTemplate + fields = [ + 'device_type', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description', + ] + widgets = { + 'device_type': forms.HiddenInput(), + } + + +class PowerOutletTemplateForm(BootstrapMixin, forms.ModelForm): + + class Meta: + model = PowerOutletTemplate + fields = [ + 'device_type', 'name', 'label', 'type', 'power_port', 'feed_leg', 'description', + ] + widgets = { + 'device_type': forms.HiddenInput(), + } + + def __init__(self, *args, **kwargs): + + super().__init__(*args, **kwargs) + + # Limit power_port choices to current DeviceType + if hasattr(self.instance, 'device_type'): + self.fields['power_port'].queryset = PowerPortTemplate.objects.filter( + device_type=self.instance.device_type + ) + + +class InterfaceTemplateForm(BootstrapMixin, forms.ModelForm): + + class Meta: + model = InterfaceTemplate + fields = [ + 'device_type', 'name', 'label', 'type', 'mgmt_only', 'description', + ] + widgets = { + 'device_type': forms.HiddenInput(), + 'type': StaticSelect(), + } + + +class FrontPortTemplateForm(BootstrapMixin, forms.ModelForm): + + class Meta: + model = FrontPortTemplate + fields = [ + 'device_type', 'name', 'label', 'type', 'color', 'rear_port', 'rear_port_position', 'description', + ] + widgets = { + 'device_type': forms.HiddenInput(), + 'rear_port': StaticSelect(), + } + + def __init__(self, *args, **kwargs): + + super().__init__(*args, **kwargs) + + # Limit rear_port choices to current DeviceType + if hasattr(self.instance, 'device_type'): + self.fields['rear_port'].queryset = RearPortTemplate.objects.filter( + device_type=self.instance.device_type + ) + + +class RearPortTemplateForm(BootstrapMixin, forms.ModelForm): + + class Meta: + model = RearPortTemplate + fields = [ + 'device_type', 'name', 'label', 'type', 'color', 'positions', 'description', + ] + widgets = { + 'device_type': forms.HiddenInput(), + 'type': StaticSelect(), + } + + +class DeviceBayTemplateForm(BootstrapMixin, forms.ModelForm): + + class Meta: + model = DeviceBayTemplate + fields = [ + 'device_type', 'name', 'label', 'description', + ] + widgets = { + 'device_type': forms.HiddenInput(), + } + + +# +# Device components +# + +class ConsolePortForm(BootstrapMixin, CustomFieldModelForm): + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = ConsolePort + fields = [ + 'device', 'name', 'label', 'type', 'speed', 'mark_connected', 'description', 'tags', + ] + widgets = { + 'device': forms.HiddenInput(), + } + + +class ConsoleServerPortForm(BootstrapMixin, CustomFieldModelForm): + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = ConsoleServerPort + fields = [ + 'device', 'name', 'label', 'type', 'speed', 'mark_connected', 'description', 'tags', + ] + widgets = { + 'device': forms.HiddenInput(), + } + + +class PowerPortForm(BootstrapMixin, CustomFieldModelForm): + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = PowerPort + fields = [ + 'device', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', 'mark_connected', 'description', + 'tags', + ] + widgets = { + 'device': forms.HiddenInput(), + } + + +class PowerOutletForm(BootstrapMixin, CustomFieldModelForm): + power_port = forms.ModelChoiceField( + queryset=PowerPort.objects.all(), + required=False + ) + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = PowerOutlet + fields = [ + 'device', 'name', 'label', 'type', 'power_port', 'feed_leg', 'mark_connected', 'description', 'tags', + ] + widgets = { + 'device': forms.HiddenInput(), + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Limit power_port choices to the local device + if hasattr(self.instance, 'device'): + self.fields['power_port'].queryset = PowerPort.objects.filter( + device=self.instance.device + ) + + +class InterfaceForm(BootstrapMixin, InterfaceCommonForm, CustomFieldModelForm): + parent = DynamicModelChoiceField( + queryset=Interface.objects.all(), + required=False, + label='Parent interface' + ) + lag = DynamicModelChoiceField( + queryset=Interface.objects.all(), + required=False, + label='LAG interface', + query_params={ + 'type': 'lag', + } + ) + vlan_group = DynamicModelChoiceField( + queryset=VLANGroup.objects.all(), + required=False, + label='VLAN group' + ) + untagged_vlan = DynamicModelChoiceField( + queryset=VLAN.objects.all(), + required=False, + label='Untagged VLAN', + query_params={ + 'group_id': '$vlan_group', + } + ) + tagged_vlans = DynamicModelMultipleChoiceField( + queryset=VLAN.objects.all(), + required=False, + label='Tagged VLANs', + query_params={ + 'group_id': '$vlan_group', + } + ) + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = Interface + fields = [ + 'device', 'name', 'label', 'type', 'enabled', 'parent', 'lag', 'mac_address', 'mtu', 'mgmt_only', + 'mark_connected', 'description', 'mode', 'untagged_vlan', 'tagged_vlans', 'tags', + ] + widgets = { + 'device': forms.HiddenInput(), + 'type': StaticSelect(), + 'mode': StaticSelect(), + } + labels = { + 'mode': '802.1Q Mode', + } + help_texts = { + 'mode': INTERFACE_MODE_HELP_TEXT, + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + device = Device.objects.get(pk=self.data['device']) if self.is_bound else self.instance.device + + # Restrict parent/LAG interface assignment by device/VC + self.fields['parent'].widget.add_query_param('device_id', device.pk) + if device.virtual_chassis and device.virtual_chassis.master: + # Get available LAG interfaces by VirtualChassis master + self.fields['lag'].widget.add_query_param('device_id', device.virtual_chassis.master.pk) + else: + self.fields['lag'].widget.add_query_param('device_id', device.pk) + + # Limit VLAN choices by device + self.fields['untagged_vlan'].widget.add_query_param('available_on_device', device.pk) + self.fields['tagged_vlans'].widget.add_query_param('available_on_device', device.pk) + + +class FrontPortForm(BootstrapMixin, CustomFieldModelForm): + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = FrontPort + fields = [ + 'device', 'name', 'label', 'type', 'color', 'rear_port', 'rear_port_position', 'mark_connected', + 'description', 'tags', + ] + widgets = { + 'device': forms.HiddenInput(), + 'type': StaticSelect(), + 'rear_port': StaticSelect(), + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Limit RearPort choices to the local device + if hasattr(self.instance, 'device'): + self.fields['rear_port'].queryset = self.fields['rear_port'].queryset.filter( + device=self.instance.device + ) + + +class RearPortForm(BootstrapMixin, CustomFieldModelForm): + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = RearPort + fields = [ + 'device', 'name', 'label', 'type', 'color', 'positions', 'mark_connected', 'description', 'tags', + ] + widgets = { + 'device': forms.HiddenInput(), + 'type': StaticSelect(), + } + + +class DeviceBayForm(BootstrapMixin, CustomFieldModelForm): + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = DeviceBay + fields = [ + 'device', 'name', 'label', 'description', 'tags', + ] + widgets = { + 'device': forms.HiddenInput(), + } + + +class PopulateDeviceBayForm(BootstrapMixin, forms.Form): + installed_device = forms.ModelChoiceField( + queryset=Device.objects.all(), + label='Child Device', + help_text="Child devices must first be created and assigned to the site/rack of the parent device.", + widget=StaticSelect(), + ) + + def __init__(self, device_bay, *args, **kwargs): + + super().__init__(*args, **kwargs) + + self.fields['installed_device'].queryset = Device.objects.filter( + site=device_bay.device.site, + rack=device_bay.device.rack, + parent_bay__isnull=True, + device_type__u_height=0, + device_type__subdevice_role=SubdeviceRoleChoices.ROLE_CHILD + ).exclude(pk=device_bay.device.pk) + + +class InventoryItemForm(BootstrapMixin, CustomFieldModelForm): + device = DynamicModelChoiceField( + queryset=Device.objects.all() + ) + parent = DynamicModelChoiceField( + queryset=InventoryItem.objects.all(), + required=False, + query_params={ + 'device_id': '$device' + } + ) + manufacturer = DynamicModelChoiceField( + queryset=Manufacturer.objects.all(), + required=False + ) + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = InventoryItem + fields = [ + 'device', 'parent', 'name', 'label', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'description', + 'tags', + ] diff --git a/netbox/dcim/forms/object_create.py b/netbox/dcim/forms/object_create.py new file mode 100644 index 00000000000..7577ad3553f --- /dev/null +++ b/netbox/dcim/forms/object_create.py @@ -0,0 +1,614 @@ +from django import forms + +from dcim.choices import * +from dcim.constants import * +from dcim.models import * +from extras.forms import CustomFieldModelForm, CustomFieldsMixin +from extras.models import Tag +from ipam.models import VLAN +from utilities.forms import ( + add_blank_choice, BootstrapMixin, ColorField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, + ExpandableNameField, StaticSelect, +) +from .common import InterfaceCommonForm + +__all__ = ( + 'ConsolePortCreateForm', + 'ConsolePortTemplateCreateForm', + 'ConsoleServerPortCreateForm', + 'ConsoleServerPortTemplateCreateForm', + 'DeviceBayCreateForm', + 'DeviceBayTemplateCreateForm', + 'FrontPortCreateForm', + 'FrontPortTemplateCreateForm', + 'InterfaceCreateForm', + 'InterfaceTemplateCreateForm', + 'InventoryItemCreateForm', + 'PowerOutletCreateForm', + 'PowerOutletTemplateCreateForm', + 'PowerPortCreateForm', + 'PowerPortTemplateCreateForm', + 'RearPortCreateForm', + 'RearPortTemplateCreateForm', + 'VirtualChassisCreateForm', +) + + +class ComponentForm(forms.Form): + """ + Subclass this form when facilitating the creation of one or more device component or component templates based on + a name pattern. + """ + name_pattern = ExpandableNameField( + label='Name' + ) + label_pattern = ExpandableNameField( + label='Label', + required=False, + help_text='Alphanumeric ranges are supported. (Must match the number of names being created.)' + ) + + def clean(self): + super().clean() + + # Validate that the number of components being created from both the name_pattern and label_pattern are equal + if self.cleaned_data['label_pattern']: + name_pattern_count = len(self.cleaned_data['name_pattern']) + label_pattern_count = len(self.cleaned_data['label_pattern']) + if name_pattern_count != label_pattern_count: + raise forms.ValidationError({ + 'label_pattern': f'The provided name pattern will create {name_pattern_count} components, however ' + f'{label_pattern_count} labels will be generated. These counts must match.' + }, code='label_pattern_mismatch') + + +class VirtualChassisCreateForm(BootstrapMixin, CustomFieldModelForm): + region = DynamicModelChoiceField( + queryset=Region.objects.all(), + required=False, + initial_params={ + 'sites': '$site' + } + ) + site_group = DynamicModelChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + initial_params={ + 'sites': '$site' + } + ) + site = DynamicModelChoiceField( + queryset=Site.objects.all(), + required=False, + query_params={ + 'region_id': '$region', + 'group_id': '$site_group', + } + ) + rack = DynamicModelChoiceField( + queryset=Rack.objects.all(), + required=False, + null_option='None', + query_params={ + 'site_id': '$site' + } + ) + members = DynamicModelMultipleChoiceField( + queryset=Device.objects.all(), + required=False, + query_params={ + 'site_id': '$site', + 'rack_id': '$rack', + } + ) + initial_position = forms.IntegerField( + initial=1, + required=False, + help_text='Position of the first member device. Increases by one for each additional member.' + ) + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = VirtualChassis + fields = [ + 'name', 'domain', 'region', 'site_group', 'site', 'rack', 'members', 'initial_position', 'tags', + ] + + def save(self, *args, **kwargs): + instance = super().save(*args, **kwargs) + + # Assign VC members + if instance.pk: + initial_position = self.cleaned_data.get('initial_position') or 1 + for i, member in enumerate(self.cleaned_data['members'], start=initial_position): + member.virtual_chassis = instance + member.vc_position = i + member.save() + + return instance + + +# +# Component templates +# + +class ComponentTemplateCreateForm(BootstrapMixin, ComponentForm): + """ + Base form for the creation of device component templates (subclassed from ComponentTemplateModel). + """ + manufacturer = DynamicModelChoiceField( + queryset=Manufacturer.objects.all(), + required=False, + initial_params={ + 'device_types': 'device_type' + } + ) + device_type = DynamicModelChoiceField( + queryset=DeviceType.objects.all(), + query_params={ + 'manufacturer_id': '$manufacturer' + } + ) + description = forms.CharField( + required=False + ) + + +class ConsolePortTemplateCreateForm(ComponentTemplateCreateForm): + type = forms.ChoiceField( + choices=add_blank_choice(ConsolePortTypeChoices), + widget=StaticSelect() + ) + field_order = ('manufacturer', 'device_type', 'name_pattern', 'label_pattern', 'type', 'description') + + +class ConsoleServerPortTemplateCreateForm(ComponentTemplateCreateForm): + type = forms.ChoiceField( + choices=add_blank_choice(ConsolePortTypeChoices), + widget=StaticSelect() + ) + field_order = ('manufacturer', 'device_type', 'name_pattern', 'label_pattern', 'type', 'description') + + +class PowerPortTemplateCreateForm(ComponentTemplateCreateForm): + type = forms.ChoiceField( + choices=add_blank_choice(PowerPortTypeChoices), + required=False + ) + maximum_draw = forms.IntegerField( + min_value=1, + required=False, + help_text="Maximum power draw (watts)" + ) + allocated_draw = forms.IntegerField( + min_value=1, + required=False, + help_text="Allocated power draw (watts)" + ) + field_order = ( + 'manufacturer', 'device_type', 'name_pattern', 'label_pattern', 'type', 'maximum_draw', 'allocated_draw', + 'description', + ) + + +class PowerOutletTemplateCreateForm(ComponentTemplateCreateForm): + type = forms.ChoiceField( + choices=add_blank_choice(PowerOutletTypeChoices), + required=False + ) + power_port = forms.ModelChoiceField( + queryset=PowerPortTemplate.objects.all(), + required=False + ) + feed_leg = forms.ChoiceField( + choices=add_blank_choice(PowerOutletFeedLegChoices), + required=False, + widget=StaticSelect() + ) + field_order = ( + 'manufacturer', 'device_type', 'name_pattern', 'label_pattern', 'type', 'power_port', 'feed_leg', + 'description', + ) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Limit power_port choices to current DeviceType + device_type = DeviceType.objects.get( + pk=self.initial.get('device_type') or self.data.get('device_type') + ) + self.fields['power_port'].queryset = PowerPortTemplate.objects.filter( + device_type=device_type + ) + + +class InterfaceTemplateCreateForm(ComponentTemplateCreateForm): + type = forms.ChoiceField( + choices=InterfaceTypeChoices, + widget=StaticSelect() + ) + mgmt_only = forms.BooleanField( + required=False, + label='Management only' + ) + field_order = ('manufacturer', 'device_type', 'name_pattern', 'label_pattern', 'type', 'mgmt_only', 'description') + + +class FrontPortTemplateCreateForm(ComponentTemplateCreateForm): + type = forms.ChoiceField( + choices=PortTypeChoices, + widget=StaticSelect() + ) + color = ColorField( + required=False + ) + rear_port_set = forms.MultipleChoiceField( + choices=[], + label='Rear ports', + help_text='Select one rear port assignment for each front port being created.', + ) + field_order = ( + 'manufacturer', 'device_type', 'name_pattern', 'label_pattern', 'type', 'color', 'rear_port_set', 'description', + ) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + device_type = DeviceType.objects.get( + pk=self.initial.get('device_type') or self.data.get('device_type') + ) + + # Determine which rear port positions are occupied. These will be excluded from the list of available mappings. + occupied_port_positions = [ + (front_port.rear_port_id, front_port.rear_port_position) + for front_port in device_type.frontporttemplates.all() + ] + + # Populate rear port choices + choices = [] + rear_ports = RearPortTemplate.objects.filter(device_type=device_type) + for rear_port in rear_ports: + for i in range(1, rear_port.positions + 1): + if (rear_port.pk, i) not in occupied_port_positions: + choices.append( + ('{}:{}'.format(rear_port.pk, i), '{}:{}'.format(rear_port.name, i)) + ) + self.fields['rear_port_set'].choices = choices + + def clean(self): + super().clean() + + # Validate that the number of ports being created equals the number of selected (rear port, position) tuples + front_port_count = len(self.cleaned_data['name_pattern']) + rear_port_count = len(self.cleaned_data['rear_port_set']) + if front_port_count != rear_port_count: + raise forms.ValidationError({ + 'rear_port_set': 'The provided name pattern will create {} ports, however {} rear port assignments ' + 'were selected. These counts must match.'.format(front_port_count, rear_port_count) + }) + + def get_iterative_data(self, iteration): + + # Assign rear port and position from selected set + rear_port, position = self.cleaned_data['rear_port_set'][iteration].split(':') + + return { + 'rear_port': int(rear_port), + 'rear_port_position': int(position), + } + + +class RearPortTemplateCreateForm(ComponentTemplateCreateForm): + type = forms.ChoiceField( + choices=PortTypeChoices, + widget=StaticSelect(), + ) + color = ColorField( + required=False + ) + positions = forms.IntegerField( + min_value=REARPORT_POSITIONS_MIN, + max_value=REARPORT_POSITIONS_MAX, + initial=1, + help_text='The number of front ports which may be mapped to each rear port' + ) + field_order = ( + 'manufacturer', 'device_type', 'name_pattern', 'label_pattern', 'type', 'color', 'positions', 'description', + ) + + +class DeviceBayTemplateCreateForm(ComponentTemplateCreateForm): + field_order = ('manufacturer', 'device_type', 'name_pattern', 'label_pattern', 'description') + + +# +# Device components +# + +class ComponentCreateForm(BootstrapMixin, CustomFieldsMixin, ComponentForm): + """ + Base form for the creation of device components (models subclassed from ComponentModel). + """ + device = DynamicModelChoiceField( + queryset=Device.objects.all() + ) + description = forms.CharField( + max_length=200, + required=False + ) + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + +class ConsolePortCreateForm(ComponentCreateForm): + model = ConsolePort + type = forms.ChoiceField( + choices=add_blank_choice(ConsolePortTypeChoices), + required=False, + widget=StaticSelect() + ) + speed = forms.ChoiceField( + choices=add_blank_choice(ConsolePortSpeedChoices), + required=False, + widget=StaticSelect() + ) + field_order = ('device', 'name_pattern', 'label_pattern', 'type', 'speed', 'mark_connected', 'description', 'tags') + + +class ConsoleServerPortCreateForm(ComponentCreateForm): + model = ConsoleServerPort + type = forms.ChoiceField( + choices=add_blank_choice(ConsolePortTypeChoices), + required=False, + widget=StaticSelect() + ) + speed = forms.ChoiceField( + choices=add_blank_choice(ConsolePortSpeedChoices), + required=False, + widget=StaticSelect() + ) + field_order = ('device', 'name_pattern', 'label_pattern', 'type', 'speed', 'mark_connected', 'description', 'tags') + + +class PowerPortCreateForm(ComponentCreateForm): + model = PowerPort + type = forms.ChoiceField( + choices=add_blank_choice(PowerPortTypeChoices), + required=False, + widget=StaticSelect() + ) + maximum_draw = forms.IntegerField( + min_value=1, + required=False, + help_text="Maximum draw in watts" + ) + allocated_draw = forms.IntegerField( + min_value=1, + required=False, + help_text="Allocated draw in watts" + ) + field_order = ( + 'device', 'name_pattern', 'label_pattern', 'type', 'maximum_draw', 'allocated_draw', 'mark_connected', + 'description', 'tags', + ) + + +class PowerOutletCreateForm(ComponentCreateForm): + model = PowerOutlet + type = forms.ChoiceField( + choices=add_blank_choice(PowerOutletTypeChoices), + required=False, + widget=StaticSelect() + ) + power_port = forms.ModelChoiceField( + queryset=PowerPort.objects.all(), + required=False + ) + feed_leg = forms.ChoiceField( + choices=add_blank_choice(PowerOutletFeedLegChoices), + required=False + ) + field_order = ( + 'device', 'name_pattern', 'label_pattern', 'type', 'power_port', 'feed_leg', 'mark_connected', 'description', + 'tags', + ) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Limit power_port queryset to PowerPorts which belong to the parent Device + device = Device.objects.get( + pk=self.initial.get('device') or self.data.get('device') + ) + self.fields['power_port'].queryset = PowerPort.objects.filter(device=device) + + +class InterfaceCreateForm(ComponentCreateForm, InterfaceCommonForm): + model = Interface + type = forms.ChoiceField( + choices=InterfaceTypeChoices, + widget=StaticSelect(), + ) + enabled = forms.BooleanField( + required=False, + initial=True + ) + parent = DynamicModelChoiceField( + queryset=Interface.objects.all(), + required=False, + query_params={ + 'device_id': '$device', + } + ) + lag = DynamicModelChoiceField( + queryset=Interface.objects.all(), + required=False, + query_params={ + 'device_id': '$device', + 'type': 'lag', + } + ) + mac_address = forms.CharField( + required=False, + label='MAC Address' + ) + mgmt_only = forms.BooleanField( + required=False, + label='Management only', + help_text='This interface is used only for out-of-band management' + ) + mode = forms.ChoiceField( + choices=add_blank_choice(InterfaceModeChoices), + required=False, + widget=StaticSelect(), + ) + untagged_vlan = DynamicModelChoiceField( + queryset=VLAN.objects.all(), + required=False + ) + tagged_vlans = DynamicModelMultipleChoiceField( + queryset=VLAN.objects.all(), + required=False + ) + field_order = ( + 'device', 'name_pattern', 'label_pattern', 'type', 'enabled', 'parent', 'lag', 'mtu', 'mac_address', + 'description', 'mgmt_only', 'mark_connected', 'mode', 'untagged_vlan', 'tagged_vlans', 'tags' + ) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Limit VLAN choices by device + device_id = self.initial.get('device') or self.data.get('device') + self.fields['untagged_vlan'].widget.add_query_param('available_on_device', device_id) + self.fields['tagged_vlans'].widget.add_query_param('available_on_device', device_id) + + +class FrontPortCreateForm(ComponentCreateForm): + model = FrontPort + type = forms.ChoiceField( + choices=PortTypeChoices, + widget=StaticSelect(), + ) + color = ColorField( + required=False + ) + rear_port_set = forms.MultipleChoiceField( + choices=[], + label='Rear ports', + help_text='Select one rear port assignment for each front port being created.', + ) + field_order = ( + 'device', 'name_pattern', 'label_pattern', 'type', 'color', 'rear_port_set', 'mark_connected', 'description', + 'tags', + ) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + device = Device.objects.get( + pk=self.initial.get('device') or self.data.get('device') + ) + + # Determine which rear port positions are occupied. These will be excluded from the list of available + # mappings. + occupied_port_positions = [ + (front_port.rear_port_id, front_port.rear_port_position) + for front_port in device.frontports.all() + ] + + # Populate rear port choices + choices = [] + rear_ports = RearPort.objects.filter(device=device) + for rear_port in rear_ports: + for i in range(1, rear_port.positions + 1): + if (rear_port.pk, i) not in occupied_port_positions: + choices.append( + ('{}:{}'.format(rear_port.pk, i), '{}:{}'.format(rear_port.name, i)) + ) + self.fields['rear_port_set'].choices = choices + + def clean(self): + super().clean() + + # Validate that the number of ports being created equals the number of selected (rear port, position) tuples + front_port_count = len(self.cleaned_data['name_pattern']) + rear_port_count = len(self.cleaned_data['rear_port_set']) + if front_port_count != rear_port_count: + raise forms.ValidationError({ + 'rear_port_set': 'The provided name pattern will create {} ports, however {} rear port assignments ' + 'were selected. These counts must match.'.format(front_port_count, rear_port_count) + }) + + def get_iterative_data(self, iteration): + + # Assign rear port and position from selected set + rear_port, position = self.cleaned_data['rear_port_set'][iteration].split(':') + + return { + 'rear_port': int(rear_port), + 'rear_port_position': int(position), + } + + +class RearPortCreateForm(ComponentCreateForm): + model = RearPort + type = forms.ChoiceField( + choices=PortTypeChoices, + widget=StaticSelect(), + ) + color = ColorField( + required=False + ) + positions = forms.IntegerField( + min_value=REARPORT_POSITIONS_MIN, + max_value=REARPORT_POSITIONS_MAX, + initial=1, + help_text='The number of front ports which may be mapped to each rear port' + ) + field_order = ( + 'device', 'name_pattern', 'label_pattern', 'type', 'color', 'positions', 'mark_connected', 'description', + 'tags', + ) + + +class DeviceBayCreateForm(ComponentCreateForm): + model = DeviceBay + field_order = ('device', 'name_pattern', 'label_pattern', 'description', 'tags') + + +class InventoryItemCreateForm(ComponentCreateForm): + model = InventoryItem + manufacturer = DynamicModelChoiceField( + queryset=Manufacturer.objects.all(), + required=False + ) + parent = DynamicModelChoiceField( + queryset=InventoryItem.objects.all(), + required=False, + query_params={ + 'device_id': '$device' + } + ) + part_id = forms.CharField( + max_length=50, + required=False, + label='Part ID' + ) + serial = forms.CharField( + max_length=50, + required=False, + ) + asset_tag = forms.CharField( + max_length=50, + required=False, + ) + field_order = ( + 'device', 'parent', 'name_pattern', 'label_pattern', 'manufacturer', 'part_id', 'serial', 'asset_tag', + 'description', 'tags', + ) diff --git a/netbox/dcim/forms/object_import.py b/netbox/dcim/forms/object_import.py new file mode 100644 index 00000000000..0596261a6d0 --- /dev/null +++ b/netbox/dcim/forms/object_import.py @@ -0,0 +1,148 @@ +from django import forms + +from dcim.choices import InterfaceTypeChoices, PortTypeChoices +from dcim.models import * +from utilities.forms import BootstrapMixin + +__all__ = ( + 'ConsolePortTemplateImportForm', + 'ConsoleServerPortTemplateImportForm', + 'DeviceBayTemplateImportForm', + 'DeviceTypeImportForm', + 'FrontPortTemplateImportForm', + 'InterfaceTemplateImportForm', + 'PowerOutletTemplateImportForm', + 'PowerPortTemplateImportForm', + 'RearPortTemplateImportForm', +) + + +class DeviceTypeImportForm(BootstrapMixin, forms.ModelForm): + manufacturer = forms.ModelChoiceField( + queryset=Manufacturer.objects.all(), + to_field_name='name' + ) + + class Meta: + model = DeviceType + fields = [ + 'manufacturer', 'model', 'slug', 'part_number', 'u_height', 'is_full_depth', 'subdevice_role', + 'comments', + ] + + +# +# Component template import forms +# + +class ComponentTemplateImportForm(BootstrapMixin, forms.ModelForm): + + def __init__(self, device_type, data=None, *args, **kwargs): + + # Must pass the parent DeviceType on form initialization + data.update({ + 'device_type': device_type.pk, + }) + + super().__init__(data, *args, **kwargs) + + def clean_device_type(self): + + data = self.cleaned_data['device_type'] + + # Limit fields referencing other components to the parent DeviceType + for field_name, field in self.fields.items(): + if isinstance(field, forms.ModelChoiceField) and field_name != 'device_type': + field.queryset = field.queryset.filter(device_type=data) + + return data + + +class ConsolePortTemplateImportForm(ComponentTemplateImportForm): + + class Meta: + model = ConsolePortTemplate + fields = [ + 'device_type', 'name', 'label', 'type', 'description', + ] + + +class ConsoleServerPortTemplateImportForm(ComponentTemplateImportForm): + + class Meta: + model = ConsoleServerPortTemplate + fields = [ + 'device_type', 'name', 'label', 'type', 'description', + ] + + +class PowerPortTemplateImportForm(ComponentTemplateImportForm): + + class Meta: + model = PowerPortTemplate + fields = [ + 'device_type', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description', + ] + + +class PowerOutletTemplateImportForm(ComponentTemplateImportForm): + power_port = forms.ModelChoiceField( + queryset=PowerPortTemplate.objects.all(), + to_field_name='name', + required=False + ) + + class Meta: + model = PowerOutletTemplate + fields = [ + 'device_type', 'name', 'label', 'type', 'power_port', 'feed_leg', 'description', + ] + + +class InterfaceTemplateImportForm(ComponentTemplateImportForm): + type = forms.ChoiceField( + choices=InterfaceTypeChoices.CHOICES + ) + + class Meta: + model = InterfaceTemplate + fields = [ + 'device_type', 'name', 'label', 'type', 'mgmt_only', 'description', + ] + + +class FrontPortTemplateImportForm(ComponentTemplateImportForm): + type = forms.ChoiceField( + choices=PortTypeChoices.CHOICES + ) + rear_port = forms.ModelChoiceField( + queryset=RearPortTemplate.objects.all(), + to_field_name='name' + ) + + class Meta: + model = FrontPortTemplate + fields = [ + 'device_type', 'name', 'type', 'rear_port', 'rear_port_position', 'label', 'description', + ] + + +class RearPortTemplateImportForm(ComponentTemplateImportForm): + type = forms.ChoiceField( + choices=PortTypeChoices.CHOICES + ) + + class Meta: + model = RearPortTemplate + fields = [ + 'device_type', 'name', 'type', 'positions', 'label', 'description', + ] + + +class DeviceBayTemplateImportForm(ComponentTemplateImportForm): + + class Meta: + model = DeviceBayTemplate + fields = [ + 'device_type', 'name', 'label', 'description', + ] diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index 6a81e2cf199..a321c80595a 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -185,11 +185,10 @@ class PathEndpoint(models.Model): # Construct the complete path path = [self, *self._path.get_path()] - if self._path.destination: - path.append(self._path.destination) - while len(path) % 3: - # Pad to ensure we have complete three-tuples (e.g. for paths that end at a RearPort) - path.insert(-1, None) + while (len(path) + 1) % 3: + # Pad to ensure we have complete three-tuples (e.g. for paths that end at a non-connected FrontPort) + path.append(None) + path.append(self._path.destination) # Return the path as a list of three-tuples (A termination, cable, B termination) return list(zip(*[iter(path)] * 3)) diff --git a/netbox/dcim/svg.py b/netbox/dcim/svg.py index 4789dd2d6d0..2064734ad73 100644 --- a/netbox/dcim/svg.py +++ b/netbox/dcim/svg.py @@ -482,7 +482,7 @@ class CableTraceSVG: ) parent_objects.append(parent_object) - else: + elif far_end: # Attachment attachment = self._draw_attachment() diff --git a/netbox/dcim/tests/test_forms.py b/netbox/dcim/tests/test_forms.py index 6eeffbc965c..3b2a9eff052 100644 --- a/netbox/dcim/tests/test_forms.py +++ b/netbox/dcim/tests/test_forms.py @@ -1,5 +1,6 @@ from django.test import TestCase +from dcim.choices import DeviceFaceChoices, DeviceStatusChoices, InterfaceTypeChoices from dcim.forms import * from dcim.models import * from virtualization.models import Cluster, ClusterGroup, ClusterType diff --git a/netbox/dcim/tests/test_views.py b/netbox/dcim/tests/test_views.py index c38dc4ea7c3..18eaeec3b08 100644 --- a/netbox/dcim/tests/test_views.py +++ b/netbox/dcim/tests/test_views.py @@ -322,10 +322,10 @@ class RackTestCase(ViewTestCases.PrimaryObjectViewTestCase): } cls.csv_data = ( - "site,location,name,width,u_height", - "Site 1,,Rack 4,19,42", - "Site 1,Location 1,Rack 5,19,42", - "Site 2,Location 2,Rack 6,19,42", + "site,location,name,status,width,u_height", + "Site 1,,Rack 4,active,19,42", + "Site 1,Location 1,Rack 5,active,19,42", + "Site 2,Location 2,Rack 6,active,19,42", ) cls.bulk_edit_data = { @@ -1991,10 +1991,10 @@ class PowerFeedTestCase(ViewTestCases.PrimaryObjectViewTestCase): } cls.csv_data = ( - "site,power_panel,name,voltage,amperage,max_utilization", - "Site 1,Power Panel 1,Power Feed 4,120,20,80", - "Site 1,Power Panel 1,Power Feed 5,120,20,80", - "Site 1,Power Panel 1,Power Feed 6,120,20,80", + "site,power_panel,name,status,type,supply,phase,voltage,amperage,max_utilization", + "Site 1,Power Panel 1,Power Feed 4,active,primary,ac,single-phase,120,20,80", + "Site 1,Power Panel 1,Power Feed 5,active,primary,ac,single-phase,120,20,80", + "Site 1,Power Panel 1,Power Feed 6,active,primary,ac,single-phase,120,20,80", ) cls.bulk_edit_data = { diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 63f2be5c865..a82d7dadfc2 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -1,11 +1,10 @@ -import logging from collections import OrderedDict from django.contrib import messages from django.contrib.contenttypes.models import ContentType from django.core.paginator import EmptyPage, PageNotAnInteger from django.db import transaction -from django.db.models import F, Prefetch +from django.db.models import Prefetch from django.forms import ModelMultipleChoiceField, MultipleHiddenInput, modelformset_factory from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse @@ -2169,9 +2168,10 @@ class DeviceBayDepopulateView(generic.ObjectEditView): removed_device = device_bay.installed_device device_bay.installed_device = None device_bay.save() - messages.success(request, "{} has been removed from {}.".format(removed_device, device_bay)) + messages.success(request, f"{removed_device} has been removed from {device_bay}.") + return_url = self.get_return_url(request, device_bay.device) - return redirect('dcim:device', pk=device_bay.device.pk) + return redirect(return_url) return render(request, 'dcim/devicebay_depopulate.html', { 'device_bay': device_bay, diff --git a/netbox/extras/forms.py b/netbox/extras/forms.py deleted file mode 100644 index 4a4f95213e7..00000000000 --- a/netbox/extras/forms.py +++ /dev/null @@ -1,982 +0,0 @@ -from django import forms -from django.contrib.auth.models import User -from django.contrib.contenttypes.models import ContentType -from django.utils.safestring import mark_safe -from django.utils.translation import gettext as _ - -from dcim.models import DeviceRole, DeviceType, Platform, Region, Site, SiteGroup -from tenancy.models import Tenant, TenantGroup -from utilities.forms import ( - add_blank_choice, APISelectMultiple, BootstrapMixin, BulkEditForm, BulkEditNullBooleanSelect, ColorField, - CommentField, ContentTypeChoiceField, ContentTypeMultipleChoiceField, CSVContentTypeField, CSVModelForm, - CSVMultipleContentTypeField, DateTimePicker, DynamicModelMultipleChoiceField, JSONField, SlugField, StaticSelect, - StaticSelectMultiple, BOOLEAN_WITH_BLANK_CHOICES, -) -from virtualization.models import Cluster, ClusterGroup -from .choices import * -from .models import * -from .utils import FeatureQuery - - -# -# Custom fields -# - -class CustomFieldForm(BootstrapMixin, forms.ModelForm): - content_types = ContentTypeMultipleChoiceField( - queryset=ContentType.objects.all(), - limit_choices_to=FeatureQuery('custom_fields') - ) - - class Meta: - model = CustomField - fields = '__all__' - fieldsets = ( - ('Custom Field', ('name', 'label', 'type', 'weight', 'required', 'description')), - ('Assigned Models', ('content_types',)), - ('Behavior', ('filter_logic',)), - ('Values', ('default', 'choices')), - ('Validation', ('validation_minimum', 'validation_maximum', 'validation_regex')), - ) - - -class CustomFieldCSVForm(CSVModelForm): - content_types = CSVMultipleContentTypeField( - queryset=ContentType.objects.all(), - limit_choices_to=FeatureQuery('custom_fields'), - help_text="One or more assigned object types" - ) - - class Meta: - model = CustomField - fields = ( - 'name', 'label', 'type', 'content_types', 'required', 'description', 'weight', 'filter_logic', 'default', - 'weight', - ) - - -class CustomFieldBulkEditForm(BootstrapMixin, BulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=CustomField.objects.all(), - widget=forms.MultipleHiddenInput - ) - description = forms.CharField( - required=False - ) - required = forms.NullBooleanField( - required=False, - widget=BulkEditNullBooleanSelect() - ) - weight = forms.IntegerField( - required=False - ) - - class Meta: - nullable_fields = [] - - -class CustomFieldFilterForm(BootstrapMixin, forms.Form): - field_groups = [ - ['q'], - ['type', 'content_types'], - ['weight', 'required'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - content_types = ContentTypeMultipleChoiceField( - queryset=ContentType.objects.all(), - limit_choices_to=FeatureQuery('custom_fields'), - required=False - ) - type = forms.MultipleChoiceField( - choices=CustomFieldTypeChoices, - required=False, - widget=StaticSelectMultiple(), - label=_('Field type') - ) - weight = forms.IntegerField( - required=False - ) - required = forms.NullBooleanField( - required=False, - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - - -# -# Custom links -# - -class CustomLinkForm(BootstrapMixin, forms.ModelForm): - content_type = ContentTypeChoiceField( - queryset=ContentType.objects.all(), - limit_choices_to=FeatureQuery('custom_links') - ) - - class Meta: - model = CustomLink - fields = '__all__' - fieldsets = ( - ('Custom Link', ('name', 'content_type', 'weight', 'group_name', 'button_class', 'new_window')), - ('Templates', ('link_text', 'link_url')), - ) - widgets = { - 'link_text': forms.Textarea(attrs={'class': 'font-monospace'}), - 'link_url': forms.Textarea(attrs={'class': 'font-monospace'}), - } - help_texts = { - 'link_text': 'Jinja2 template code for the link text. Reference the object as {{ obj }}. ' - 'Links which render as empty text will not be displayed.', - 'link_url': 'Jinja2 template code for the link URL. Reference the object as {{ obj }}.', - } - - -class CustomLinkCSVForm(CSVModelForm): - content_type = CSVContentTypeField( - queryset=ContentType.objects.all(), - limit_choices_to=FeatureQuery('custom_links'), - help_text="Assigned object type" - ) - - class Meta: - model = CustomLink - fields = ( - 'name', 'content_type', 'weight', 'group_name', 'button_class', 'new_window', 'link_text', 'link_url', - ) - - -class CustomLinkBulkEditForm(BootstrapMixin, BulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=CustomLink.objects.all(), - widget=forms.MultipleHiddenInput - ) - content_type = ContentTypeChoiceField( - queryset=ContentType.objects.all(), - limit_choices_to=FeatureQuery('custom_fields'), - required=False - ) - new_window = forms.NullBooleanField( - required=False, - widget=BulkEditNullBooleanSelect() - ) - weight = forms.IntegerField( - required=False - ) - button_class = forms.ChoiceField( - choices=CustomLinkButtonClassChoices, - required=False, - widget=StaticSelect() - ) - - class Meta: - nullable_fields = [] - - -class CustomLinkFilterForm(BootstrapMixin, forms.Form): - field_groups = [ - ['q'], - ['content_type', 'weight', 'new_window'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - content_type = ContentTypeChoiceField( - queryset=ContentType.objects.all(), - limit_choices_to=FeatureQuery('custom_fields'), - required=False - ) - weight = forms.IntegerField( - required=False - ) - new_window = forms.NullBooleanField( - required=False, - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - - -# -# Export templates -# - -class ExportTemplateForm(BootstrapMixin, forms.ModelForm): - content_type = ContentTypeChoiceField( - queryset=ContentType.objects.all(), - limit_choices_to=FeatureQuery('custom_links') - ) - - class Meta: - model = ExportTemplate - fields = '__all__' - fieldsets = ( - ('Custom Link', ('name', 'content_type', 'description')), - ('Template', ('template_code',)), - ('Rendering', ('mime_type', 'file_extension', 'as_attachment')), - ) - widgets = { - 'template_code': forms.Textarea(attrs={'class': 'font-monospace'}), - } - - -class ExportTemplateCSVForm(CSVModelForm): - content_type = CSVContentTypeField( - queryset=ContentType.objects.all(), - limit_choices_to=FeatureQuery('export_templates'), - help_text="Assigned object type" - ) - - class Meta: - model = ExportTemplate - fields = ( - 'name', 'content_type', 'description', 'mime_type', 'file_extension', 'as_attachment', 'template_code', - ) - - -class ExportTemplateBulkEditForm(BootstrapMixin, BulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=ExportTemplate.objects.all(), - widget=forms.MultipleHiddenInput - ) - content_type = ContentTypeChoiceField( - queryset=ContentType.objects.all(), - limit_choices_to=FeatureQuery('custom_fields'), - required=False - ) - description = forms.CharField( - max_length=200, - required=False - ) - mime_type = forms.CharField( - max_length=50, - required=False - ) - file_extension = forms.CharField( - max_length=15, - required=False - ) - as_attachment = forms.NullBooleanField( - required=False, - widget=BulkEditNullBooleanSelect() - ) - - class Meta: - nullable_fields = ['description', 'mime_type', 'file_extension'] - - -class ExportTemplateFilterForm(BootstrapMixin, forms.Form): - field_groups = [ - ['q'], - ['content_type', 'mime_type', 'file_extension', 'as_attachment'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - content_type = ContentTypeChoiceField( - queryset=ContentType.objects.all(), - limit_choices_to=FeatureQuery('custom_fields'), - required=False - ) - mime_type = forms.CharField( - required=False, - label=_('MIME type') - ) - file_extension = forms.CharField( - required=False - ) - as_attachment = forms.NullBooleanField( - required=False, - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - - -# -# Webhooks -# - -class WebhookForm(BootstrapMixin, forms.ModelForm): - content_types = ContentTypeMultipleChoiceField( - queryset=ContentType.objects.all(), - limit_choices_to=FeatureQuery('webhooks') - ) - - class Meta: - model = Webhook - fields = '__all__' - fieldsets = ( - ('Webhook', ('name', 'enabled')), - ('Assigned Models', ('content_types',)), - ('Events', ('type_create', 'type_update', 'type_delete')), - ('HTTP Request', ( - 'payload_url', 'http_method', 'http_content_type', 'additional_headers', 'body_template', 'secret', - )), - ('SSL', ('ssl_verification', 'ca_file_path')), - ) - widgets = { - 'additional_headers': forms.Textarea(attrs={'class': 'font-monospace'}), - 'body_template': forms.Textarea(attrs={'class': 'font-monospace'}), - } - - -class WebhookCSVForm(CSVModelForm): - content_types = CSVMultipleContentTypeField( - queryset=ContentType.objects.all(), - limit_choices_to=FeatureQuery('webhooks'), - help_text="One or more assigned object types" - ) - - class Meta: - model = Webhook - fields = ( - 'name', 'enabled', 'content_types', 'type_create', 'type_update', 'type_delete', 'payload_url', - 'http_method', 'http_content_type', 'additional_headers', 'body_template', 'secret', 'ssl_verification', - 'ca_file_path' - ) - - -class WebhookBulkEditForm(BootstrapMixin, BulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Webhook.objects.all(), - widget=forms.MultipleHiddenInput - ) - enabled = forms.NullBooleanField( - required=False, - widget=BulkEditNullBooleanSelect() - ) - type_create = forms.NullBooleanField( - required=False, - widget=BulkEditNullBooleanSelect() - ) - type_update = forms.NullBooleanField( - required=False, - widget=BulkEditNullBooleanSelect() - ) - type_delete = forms.NullBooleanField( - required=False, - widget=BulkEditNullBooleanSelect() - ) - http_method = forms.ChoiceField( - choices=WebhookHttpMethodChoices, - required=False - ) - payload_url = forms.CharField( - required=False - ) - ssl_verification = forms.NullBooleanField( - required=False, - widget=BulkEditNullBooleanSelect() - ) - secret = forms.CharField( - required=False - ) - ca_file_path = forms.CharField( - required=False - ) - - class Meta: - nullable_fields = ['secret', 'ca_file_path'] - - -class WebhookFilterForm(BootstrapMixin, forms.Form): - field_groups = [ - ['q'], - ['content_types', 'http_method', 'enabled'], - ['type_create', 'type_update', 'type_delete'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - content_types = ContentTypeMultipleChoiceField( - queryset=ContentType.objects.all(), - limit_choices_to=FeatureQuery('custom_fields'), - required=False - ) - http_method = forms.MultipleChoiceField( - choices=WebhookHttpMethodChoices, - required=False, - widget=StaticSelectMultiple(), - label=_('HTTP method') - ) - enabled = forms.NullBooleanField( - required=False, - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - type_create = forms.NullBooleanField( - required=False, - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - type_update = forms.NullBooleanField( - required=False, - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - type_delete = forms.NullBooleanField( - required=False, - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - - -# -# Custom field models -# - -class CustomFieldsMixin: - """ - Extend a Form to include custom field support. - """ - def __init__(self, *args, **kwargs): - self.custom_fields = [] - - super().__init__(*args, **kwargs) - - self._append_customfield_fields() - - def _get_content_type(self): - """ - Return the ContentType of the form's model. - """ - if not hasattr(self, 'model'): - raise NotImplementedError(f"{self.__class__.__name__} must specify a model class.") - return ContentType.objects.get_for_model(self.model) - - def _get_form_field(self, customfield): - return customfield.to_form_field() - - def _append_customfield_fields(self): - """ - Append form fields for all CustomFields assigned to this object type. - """ - content_type = self._get_content_type() - - # Append form fields; assign initial values if modifying and existing object - for customfield in CustomField.objects.filter(content_types=content_type): - field_name = f'cf_{customfield.name}' - self.fields[field_name] = self._get_form_field(customfield) - - # Annotate the field in the list of CustomField form fields - self.custom_fields.append(field_name) - - -class CustomFieldModelForm(CustomFieldsMixin, forms.ModelForm): - """ - Extend ModelForm to include custom field support. - """ - def _get_content_type(self): - return ContentType.objects.get_for_model(self._meta.model) - - def _get_form_field(self, customfield): - if self.instance.pk: - form_field = customfield.to_form_field(set_initial=False) - form_field.initial = self.instance.custom_field_data.get(customfield.name, None) - return form_field - - return customfield.to_form_field() - - def clean(self): - - # Save custom field data on instance - for cf_name in self.custom_fields: - key = cf_name[3:] # Strip "cf_" from field name - value = self.cleaned_data.get(cf_name) - empty_values = self.fields[cf_name].empty_values - # Convert "empty" values to null - self.instance.custom_field_data[key] = value if value not in empty_values else None - - return super().clean() - - -class CustomFieldModelCSVForm(CSVModelForm, CustomFieldModelForm): - - def _get_form_field(self, customfield): - return customfield.to_form_field(for_csv_import=True) - - -class CustomFieldModelBulkEditForm(BulkEditForm): - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - self.custom_fields = [] - self.obj_type = ContentType.objects.get_for_model(self.model) - - # Add all applicable CustomFields to the form - custom_fields = CustomField.objects.filter(content_types=self.obj_type) - for cf in custom_fields: - # Annotate non-required custom fields as nullable - if not cf.required: - self.nullable_fields.append(cf.name) - self.fields[cf.name] = cf.to_form_field(set_initial=False, enforce_required=False) - # Annotate this as a custom field - self.custom_fields.append(cf.name) - - -class CustomFieldModelFilterForm(forms.Form): - - def __init__(self, *args, **kwargs): - - self.obj_type = ContentType.objects.get_for_model(self.model) - - super().__init__(*args, **kwargs) - - # Add all applicable CustomFields to the form - self.custom_field_filters = [] - custom_fields = CustomField.objects.filter(content_types=self.obj_type).exclude( - filter_logic=CustomFieldFilterLogicChoices.FILTER_DISABLED - ) - for cf in custom_fields: - field_name = 'cf_{}'.format(cf.name) - self.fields[field_name] = cf.to_form_field(set_initial=True, enforce_required=False) - self.custom_field_filters.append(field_name) - - -# -# Tags -# - -class TagForm(BootstrapMixin, forms.ModelForm): - slug = SlugField() - - class Meta: - model = Tag - fields = [ - 'name', 'slug', 'color', 'description' - ] - fieldsets = ( - ('Tag', ('name', 'slug', 'color', 'description')), - ) - - -class TagCSVForm(CSVModelForm): - slug = SlugField() - - class Meta: - model = Tag - fields = ('name', 'slug', 'color', 'description') - help_texts = { - 'color': mark_safe('RGB color in hexadecimal (e.g. 00ff00)'), - } - - -class AddRemoveTagsForm(forms.Form): - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - # Add add/remove tags fields - self.fields['add_tags'] = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - self.fields['remove_tags'] = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - -class TagFilterForm(BootstrapMixin, forms.Form): - model = Tag - q = forms.CharField( - required=False, - label=_('Search') - ) - content_type_id = ContentTypeMultipleChoiceField( - queryset=ContentType.objects.filter(FeatureQuery('tags').get_query()), - required=False, - label=_('Tagged object type') - ) - - -class TagBulkEditForm(BootstrapMixin, BulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Tag.objects.all(), - widget=forms.MultipleHiddenInput - ) - color = ColorField( - required=False - ) - description = forms.CharField( - max_length=200, - required=False - ) - - class Meta: - nullable_fields = ['description'] - - -# -# Config contexts -# - -class ConfigContextForm(BootstrapMixin, forms.ModelForm): - regions = DynamicModelMultipleChoiceField( - queryset=Region.objects.all(), - required=False - ) - site_groups = DynamicModelMultipleChoiceField( - queryset=SiteGroup.objects.all(), - required=False - ) - sites = DynamicModelMultipleChoiceField( - queryset=Site.objects.all(), - required=False - ) - device_types = DynamicModelMultipleChoiceField( - queryset=DeviceType.objects.all(), - required=False - ) - roles = DynamicModelMultipleChoiceField( - queryset=DeviceRole.objects.all(), - required=False - ) - platforms = DynamicModelMultipleChoiceField( - queryset=Platform.objects.all(), - required=False - ) - cluster_groups = DynamicModelMultipleChoiceField( - queryset=ClusterGroup.objects.all(), - required=False - ) - clusters = DynamicModelMultipleChoiceField( - queryset=Cluster.objects.all(), - required=False - ) - tenant_groups = DynamicModelMultipleChoiceField( - queryset=TenantGroup.objects.all(), - required=False - ) - tenants = DynamicModelMultipleChoiceField( - queryset=Tenant.objects.all(), - required=False - ) - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - data = JSONField( - label='' - ) - - class Meta: - model = ConfigContext - fields = ( - 'name', 'weight', 'description', 'is_active', 'regions', 'site_groups', 'sites', 'roles', 'device_types', - 'platforms', 'cluster_groups', 'clusters', 'tenant_groups', 'tenants', 'tags', 'data', - ) - - -class ConfigContextBulkEditForm(BootstrapMixin, BulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=ConfigContext.objects.all(), - widget=forms.MultipleHiddenInput - ) - weight = forms.IntegerField( - required=False, - min_value=0 - ) - is_active = forms.NullBooleanField( - required=False, - widget=BulkEditNullBooleanSelect() - ) - description = forms.CharField( - required=False, - max_length=100 - ) - - class Meta: - nullable_fields = [ - 'description', - ] - - -class ConfigContextFilterForm(BootstrapMixin, forms.Form): - field_groups = [ - ['q', 'tag'], - ['region_id', 'site_group_id', 'site_id'], - ['device_type_id', 'platform_id', 'role_id'], - ['cluster_group_id', 'cluster_id'], - ['tenant_group_id', 'tenant_id'] - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - region_id = DynamicModelMultipleChoiceField( - queryset=Region.objects.all(), - required=False, - label=_('Regions'), - fetch_trigger='open' - ) - site_group_id = DynamicModelMultipleChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - label=_('Site groups'), - fetch_trigger='open' - ) - site_id = DynamicModelMultipleChoiceField( - queryset=Site.objects.all(), - required=False, - label=_('Sites'), - fetch_trigger='open' - ) - device_type_id = DynamicModelMultipleChoiceField( - queryset=DeviceType.objects.all(), - required=False, - label=_('Device types'), - fetch_trigger='open' - ) - role_id = DynamicModelMultipleChoiceField( - queryset=DeviceRole.objects.all(), - required=False, - label=_('Roles'), - fetch_trigger='open' - ) - platform_id = DynamicModelMultipleChoiceField( - queryset=Platform.objects.all(), - required=False, - label=_('Platforms'), - fetch_trigger='open' - ) - cluster_group_id = DynamicModelMultipleChoiceField( - queryset=ClusterGroup.objects.all(), - required=False, - label=_('Cluster groups'), - fetch_trigger='open' - ) - cluster_id = DynamicModelMultipleChoiceField( - queryset=Cluster.objects.all(), - required=False, - label=_('Clusters'), - fetch_trigger='open' - ) - tenant_group_id = DynamicModelMultipleChoiceField( - queryset=TenantGroup.objects.all(), - required=False, - label=_('Tenant groups'), - fetch_trigger='open' - ) - tenant_id = DynamicModelMultipleChoiceField( - queryset=Tenant.objects.all(), - required=False, - label=_('Tenant'), - fetch_trigger='open' - ) - tag = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - to_field_name='slug', - required=False, - label=_('Tags'), - fetch_trigger='open' - ) - - -# -# Filter form for local config context data -# - -class LocalConfigContextFilterForm(forms.Form): - local_context_data = forms.NullBooleanField( - required=False, - label=_('Has local config context data'), - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - - -# -# Image attachments -# - -class ImageAttachmentForm(BootstrapMixin, forms.ModelForm): - - class Meta: - model = ImageAttachment - fields = [ - 'name', 'image', - ] - - -# -# Journal entries -# - -class JournalEntryForm(BootstrapMixin, forms.ModelForm): - comments = CommentField() - - kind = forms.ChoiceField( - choices=add_blank_choice(JournalEntryKindChoices), - required=False, - widget=StaticSelect() - ) - - class Meta: - model = JournalEntry - fields = ['assigned_object_type', 'assigned_object_id', 'kind', 'comments'] - widgets = { - 'assigned_object_type': forms.HiddenInput, - 'assigned_object_id': forms.HiddenInput, - } - - -class JournalEntryBulkEditForm(BootstrapMixin, BulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=JournalEntry.objects.all(), - widget=forms.MultipleHiddenInput - ) - kind = forms.ChoiceField( - choices=JournalEntryKindChoices, - required=False - ) - comments = forms.CharField( - required=False, - widget=forms.Textarea() - ) - - class Meta: - nullable_fields = [] - - -class JournalEntryFilterForm(BootstrapMixin, forms.Form): - model = JournalEntry - field_groups = [ - ['q'], - ['created_before', 'created_after', 'created_by_id'], - ['assigned_object_type_id', 'kind'] - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - created_after = forms.DateTimeField( - required=False, - label=_('After'), - widget=DateTimePicker() - ) - created_before = forms.DateTimeField( - required=False, - label=_('Before'), - widget=DateTimePicker() - ) - created_by_id = DynamicModelMultipleChoiceField( - queryset=User.objects.all(), - required=False, - label=_('User'), - widget=APISelectMultiple( - api_url='/api/users/users/', - ), - fetch_trigger='open' - ) - assigned_object_type_id = DynamicModelMultipleChoiceField( - queryset=ContentType.objects.all(), - required=False, - label=_('Object Type'), - widget=APISelectMultiple( - api_url='/api/extras/content-types/', - ), - fetch_trigger='open' - ) - kind = forms.ChoiceField( - choices=add_blank_choice(JournalEntryKindChoices), - required=False, - widget=StaticSelect() - ) - - -# -# Change logging -# - -class ObjectChangeFilterForm(BootstrapMixin, forms.Form): - model = ObjectChange - field_groups = [ - ['q'], - ['time_before', 'time_after', 'action'], - ['user_id', 'changed_object_type_id'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - time_after = forms.DateTimeField( - required=False, - label=_('After'), - widget=DateTimePicker() - ) - time_before = forms.DateTimeField( - required=False, - label=_('Before'), - widget=DateTimePicker() - ) - action = forms.ChoiceField( - choices=add_blank_choice(ObjectChangeActionChoices), - required=False, - widget=StaticSelect() - ) - user_id = DynamicModelMultipleChoiceField( - queryset=User.objects.all(), - required=False, - label=_('User'), - widget=APISelectMultiple( - api_url='/api/users/users/', - ), - fetch_trigger='open' - ) - changed_object_type_id = DynamicModelMultipleChoiceField( - queryset=ContentType.objects.all(), - required=False, - label=_('Object Type'), - widget=APISelectMultiple( - api_url='/api/extras/content-types/', - ), - fetch_trigger='open' - ) - - -# -# Scripts -# - -class ScriptForm(BootstrapMixin, forms.Form): - _commit = forms.BooleanField( - required=False, - initial=True, - label="Commit changes", - help_text="Commit changes to the database (uncheck for a dry-run)" - ) - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - # Move _commit to the end of the form - commit = self.fields.pop('_commit') - self.fields['_commit'] = commit - - @property - def requires_input(self): - """ - A boolean indicating whether the form requires user input (ignore the _commit field). - """ - return bool(len(self.fields) > 1) diff --git a/netbox/extras/forms/__init__.py b/netbox/extras/forms/__init__.py new file mode 100644 index 00000000000..1584e2f510b --- /dev/null +++ b/netbox/extras/forms/__init__.py @@ -0,0 +1,6 @@ +from .models import * +from .filtersets import * +from .bulk_edit import * +from .bulk_import import * +from .customfields import * +from .scripts import * diff --git a/netbox/extras/forms/bulk_edit.py b/netbox/extras/forms/bulk_edit.py new file mode 100644 index 00000000000..b85a74a5b62 --- /dev/null +++ b/netbox/extras/forms/bulk_edit.py @@ -0,0 +1,199 @@ +from django import forms +from django.contrib.contenttypes.models import ContentType + +from extras.choices import * +from extras.models import * +from extras.utils import FeatureQuery +from utilities.forms import ( + BootstrapMixin, BulkEditForm, BulkEditNullBooleanSelect, ColorField, ContentTypeChoiceField, StaticSelect, +) + +__all__ = ( + 'ConfigContextBulkEditForm', + 'CustomFieldBulkEditForm', + 'CustomLinkBulkEditForm', + 'ExportTemplateBulkEditForm', + 'JournalEntryBulkEditForm', + 'TagBulkEditForm', + 'WebhookBulkEditForm', +) + + +class CustomFieldBulkEditForm(BootstrapMixin, BulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=CustomField.objects.all(), + widget=forms.MultipleHiddenInput + ) + description = forms.CharField( + required=False + ) + required = forms.NullBooleanField( + required=False, + widget=BulkEditNullBooleanSelect() + ) + weight = forms.IntegerField( + required=False + ) + + class Meta: + nullable_fields = [] + + +class CustomLinkBulkEditForm(BootstrapMixin, BulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=CustomLink.objects.all(), + widget=forms.MultipleHiddenInput + ) + content_type = ContentTypeChoiceField( + queryset=ContentType.objects.all(), + limit_choices_to=FeatureQuery('custom_fields'), + required=False + ) + new_window = forms.NullBooleanField( + required=False, + widget=BulkEditNullBooleanSelect() + ) + weight = forms.IntegerField( + required=False + ) + button_class = forms.ChoiceField( + choices=CustomLinkButtonClassChoices, + required=False, + widget=StaticSelect() + ) + + class Meta: + nullable_fields = [] + + +class ExportTemplateBulkEditForm(BootstrapMixin, BulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=ExportTemplate.objects.all(), + widget=forms.MultipleHiddenInput + ) + content_type = ContentTypeChoiceField( + queryset=ContentType.objects.all(), + limit_choices_to=FeatureQuery('custom_fields'), + required=False + ) + description = forms.CharField( + max_length=200, + required=False + ) + mime_type = forms.CharField( + max_length=50, + required=False + ) + file_extension = forms.CharField( + max_length=15, + required=False + ) + as_attachment = forms.NullBooleanField( + required=False, + widget=BulkEditNullBooleanSelect() + ) + + class Meta: + nullable_fields = ['description', 'mime_type', 'file_extension'] + + +class WebhookBulkEditForm(BootstrapMixin, BulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=Webhook.objects.all(), + widget=forms.MultipleHiddenInput + ) + enabled = forms.NullBooleanField( + required=False, + widget=BulkEditNullBooleanSelect() + ) + type_create = forms.NullBooleanField( + required=False, + widget=BulkEditNullBooleanSelect() + ) + type_update = forms.NullBooleanField( + required=False, + widget=BulkEditNullBooleanSelect() + ) + type_delete = forms.NullBooleanField( + required=False, + widget=BulkEditNullBooleanSelect() + ) + http_method = forms.ChoiceField( + choices=WebhookHttpMethodChoices, + required=False + ) + payload_url = forms.CharField( + required=False + ) + ssl_verification = forms.NullBooleanField( + required=False, + widget=BulkEditNullBooleanSelect() + ) + secret = forms.CharField( + required=False + ) + ca_file_path = forms.CharField( + required=False + ) + + class Meta: + nullable_fields = ['secret', 'ca_file_path'] + + +class TagBulkEditForm(BootstrapMixin, BulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=Tag.objects.all(), + widget=forms.MultipleHiddenInput + ) + color = ColorField( + required=False + ) + description = forms.CharField( + max_length=200, + required=False + ) + + class Meta: + nullable_fields = ['description'] + + +class ConfigContextBulkEditForm(BootstrapMixin, BulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=ConfigContext.objects.all(), + widget=forms.MultipleHiddenInput + ) + weight = forms.IntegerField( + required=False, + min_value=0 + ) + is_active = forms.NullBooleanField( + required=False, + widget=BulkEditNullBooleanSelect() + ) + description = forms.CharField( + required=False, + max_length=100 + ) + + class Meta: + nullable_fields = [ + 'description', + ] + + +class JournalEntryBulkEditForm(BootstrapMixin, BulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=JournalEntry.objects.all(), + widget=forms.MultipleHiddenInput + ) + kind = forms.ChoiceField( + choices=JournalEntryKindChoices, + required=False + ) + comments = forms.CharField( + required=False, + widget=forms.Textarea() + ) + + class Meta: + nullable_fields = [] diff --git a/netbox/extras/forms/bulk_import.py b/netbox/extras/forms/bulk_import.py new file mode 100644 index 00000000000..fb8cf53e81b --- /dev/null +++ b/netbox/extras/forms/bulk_import.py @@ -0,0 +1,91 @@ +from django import forms +from django.contrib.contenttypes.models import ContentType +from django.contrib.postgres.forms import SimpleArrayField +from django.utils.safestring import mark_safe + +from extras.models import * +from extras.utils import FeatureQuery +from utilities.forms import CSVContentTypeField, CSVModelForm, CSVMultipleContentTypeField, SlugField + +__all__ = ( + 'CustomFieldCSVForm', + 'CustomLinkCSVForm', + 'ExportTemplateCSVForm', + 'TagCSVForm', + 'WebhookCSVForm', +) + + +class CustomFieldCSVForm(CSVModelForm): + content_types = CSVMultipleContentTypeField( + queryset=ContentType.objects.all(), + limit_choices_to=FeatureQuery('custom_fields'), + help_text="One or more assigned object types" + ) + choices = SimpleArrayField( + base_field=forms.CharField(), + required=False, + help_text='Comma-separated list of field choices' + ) + + class Meta: + model = CustomField + fields = ( + 'name', 'label', 'type', 'content_types', 'required', 'description', 'weight', 'filter_logic', 'default', + 'choices', 'weight', + ) + + +class CustomLinkCSVForm(CSVModelForm): + content_type = CSVContentTypeField( + queryset=ContentType.objects.all(), + limit_choices_to=FeatureQuery('custom_links'), + help_text="Assigned object type" + ) + + class Meta: + model = CustomLink + fields = ( + 'name', 'content_type', 'weight', 'group_name', 'button_class', 'new_window', 'link_text', 'link_url', + ) + + +class ExportTemplateCSVForm(CSVModelForm): + content_type = CSVContentTypeField( + queryset=ContentType.objects.all(), + limit_choices_to=FeatureQuery('export_templates'), + help_text="Assigned object type" + ) + + class Meta: + model = ExportTemplate + fields = ( + 'name', 'content_type', 'description', 'mime_type', 'file_extension', 'as_attachment', 'template_code', + ) + + +class WebhookCSVForm(CSVModelForm): + content_types = CSVMultipleContentTypeField( + queryset=ContentType.objects.all(), + limit_choices_to=FeatureQuery('webhooks'), + help_text="One or more assigned object types" + ) + + class Meta: + model = Webhook + fields = ( + 'name', 'enabled', 'content_types', 'type_create', 'type_update', 'type_delete', 'payload_url', + 'http_method', 'http_content_type', 'additional_headers', 'body_template', 'secret', 'ssl_verification', + 'ca_file_path' + ) + + +class TagCSVForm(CSVModelForm): + slug = SlugField() + + class Meta: + model = Tag + fields = ('name', 'slug', 'color', 'description') + help_texts = { + 'color': mark_safe('RGB color in hexadecimal (e.g. 00ff00)'), + } diff --git a/netbox/extras/forms/customfields.py b/netbox/extras/forms/customfields.py new file mode 100644 index 00000000000..9f68467fa00 --- /dev/null +++ b/netbox/extras/forms/customfields.py @@ -0,0 +1,123 @@ +from django import forms +from django.contrib.contenttypes.models import ContentType + +from extras.choices import * +from extras.models import * +from utilities.forms import BulkEditForm, CSVModelForm + +__all__ = ( + 'CustomFieldModelCSVForm', + 'CustomFieldModelBulkEditForm', + 'CustomFieldModelFilterForm', + 'CustomFieldModelForm', + 'CustomFieldsMixin', +) + + +class CustomFieldsMixin: + """ + Extend a Form to include custom field support. + """ + def __init__(self, *args, **kwargs): + self.custom_fields = [] + + super().__init__(*args, **kwargs) + + self._append_customfield_fields() + + def _get_content_type(self): + """ + Return the ContentType of the form's model. + """ + if not hasattr(self, 'model'): + raise NotImplementedError(f"{self.__class__.__name__} must specify a model class.") + return ContentType.objects.get_for_model(self.model) + + def _get_form_field(self, customfield): + return customfield.to_form_field() + + def _append_customfield_fields(self): + """ + Append form fields for all CustomFields assigned to this object type. + """ + content_type = self._get_content_type() + + # Append form fields; assign initial values if modifying and existing object + for customfield in CustomField.objects.filter(content_types=content_type): + field_name = f'cf_{customfield.name}' + self.fields[field_name] = self._get_form_field(customfield) + + # Annotate the field in the list of CustomField form fields + self.custom_fields.append(field_name) + + +class CustomFieldModelForm(CustomFieldsMixin, forms.ModelForm): + """ + Extend ModelForm to include custom field support. + """ + def _get_content_type(self): + return ContentType.objects.get_for_model(self._meta.model) + + def _get_form_field(self, customfield): + if self.instance.pk: + form_field = customfield.to_form_field(set_initial=False) + form_field.initial = self.instance.custom_field_data.get(customfield.name, None) + return form_field + + return customfield.to_form_field() + + def clean(self): + + # Save custom field data on instance + for cf_name in self.custom_fields: + key = cf_name[3:] # Strip "cf_" from field name + value = self.cleaned_data.get(cf_name) + empty_values = self.fields[cf_name].empty_values + # Convert "empty" values to null + self.instance.custom_field_data[key] = value if value not in empty_values else None + + return super().clean() + + +class CustomFieldModelCSVForm(CSVModelForm, CustomFieldModelForm): + + def _get_form_field(self, customfield): + return customfield.to_form_field(for_csv_import=True) + + +class CustomFieldModelBulkEditForm(BulkEditForm): + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + self.custom_fields = [] + self.obj_type = ContentType.objects.get_for_model(self.model) + + # Add all applicable CustomFields to the form + custom_fields = CustomField.objects.filter(content_types=self.obj_type) + for cf in custom_fields: + # Annotate non-required custom fields as nullable + if not cf.required: + self.nullable_fields.append(cf.name) + self.fields[cf.name] = cf.to_form_field(set_initial=False, enforce_required=False) + # Annotate this as a custom field + self.custom_fields.append(cf.name) + + +class CustomFieldModelFilterForm(forms.Form): + + def __init__(self, *args, **kwargs): + + self.obj_type = ContentType.objects.get_for_model(self.model) + + super().__init__(*args, **kwargs) + + # Add all applicable CustomFields to the form + self.custom_field_filters = [] + custom_fields = CustomField.objects.filter(content_types=self.obj_type).exclude( + filter_logic=CustomFieldFilterLogicChoices.FILTER_DISABLED + ) + for cf in custom_fields: + field_name = 'cf_{}'.format(cf.name) + self.fields[field_name] = cf.to_form_field(set_initial=True, enforce_required=False) + self.custom_field_filters.append(field_name) diff --git a/netbox/extras/forms/filtersets.py b/netbox/extras/forms/filtersets.py new file mode 100644 index 00000000000..6196ba8da5e --- /dev/null +++ b/netbox/extras/forms/filtersets.py @@ -0,0 +1,364 @@ +from django import forms +from django.contrib.auth.models import User +from django.contrib.contenttypes.models import ContentType +from django.utils.translation import gettext as _ + +from dcim.models import DeviceRole, DeviceType, Platform, Region, Site, SiteGroup +from extras.choices import * +from extras.models import * +from extras.utils import FeatureQuery +from tenancy.models import Tenant, TenantGroup +from utilities.forms import ( + add_blank_choice, APISelectMultiple, BootstrapMixin, ContentTypeChoiceField, + ContentTypeMultipleChoiceField, DateTimePicker, DynamicModelMultipleChoiceField, StaticSelect, + StaticSelectMultiple, BOOLEAN_WITH_BLANK_CHOICES, +) +from virtualization.models import Cluster, ClusterGroup + +__all__ = ( + 'ConfigContextFilterForm', + 'CustomFieldFilterForm', + 'CustomLinkFilterForm', + 'ExportTemplateFilterForm', + 'JournalEntryFilterForm', + 'LocalConfigContextFilterForm', + 'ObjectChangeFilterForm', + 'TagFilterForm', + 'WebhookFilterForm', +) + + +class CustomFieldFilterForm(BootstrapMixin, forms.Form): + field_groups = [ + ['q'], + ['type', 'content_types'], + ['weight', 'required'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + content_types = ContentTypeMultipleChoiceField( + queryset=ContentType.objects.all(), + limit_choices_to=FeatureQuery('custom_fields'), + required=False + ) + type = forms.MultipleChoiceField( + choices=CustomFieldTypeChoices, + required=False, + widget=StaticSelectMultiple(), + label=_('Field type') + ) + weight = forms.IntegerField( + required=False + ) + required = forms.NullBooleanField( + required=False, + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + + +class CustomLinkFilterForm(BootstrapMixin, forms.Form): + field_groups = [ + ['q'], + ['content_type', 'weight', 'new_window'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + content_type = ContentTypeChoiceField( + queryset=ContentType.objects.all(), + limit_choices_to=FeatureQuery('custom_fields'), + required=False + ) + weight = forms.IntegerField( + required=False + ) + new_window = forms.NullBooleanField( + required=False, + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + + +class ExportTemplateFilterForm(BootstrapMixin, forms.Form): + field_groups = [ + ['q'], + ['content_type', 'mime_type', 'file_extension', 'as_attachment'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + content_type = ContentTypeChoiceField( + queryset=ContentType.objects.all(), + limit_choices_to=FeatureQuery('custom_fields'), + required=False + ) + mime_type = forms.CharField( + required=False, + label=_('MIME type') + ) + file_extension = forms.CharField( + required=False + ) + as_attachment = forms.NullBooleanField( + required=False, + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + + +class WebhookFilterForm(BootstrapMixin, forms.Form): + field_groups = [ + ['q'], + ['content_types', 'http_method', 'enabled'], + ['type_create', 'type_update', 'type_delete'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + content_types = ContentTypeMultipleChoiceField( + queryset=ContentType.objects.all(), + limit_choices_to=FeatureQuery('custom_fields'), + required=False + ) + http_method = forms.MultipleChoiceField( + choices=WebhookHttpMethodChoices, + required=False, + widget=StaticSelectMultiple(), + label=_('HTTP method') + ) + enabled = forms.NullBooleanField( + required=False, + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + type_create = forms.NullBooleanField( + required=False, + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + type_update = forms.NullBooleanField( + required=False, + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + type_delete = forms.NullBooleanField( + required=False, + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + + +class TagFilterForm(BootstrapMixin, forms.Form): + model = Tag + q = forms.CharField( + required=False, + label=_('Search') + ) + content_type_id = ContentTypeMultipleChoiceField( + queryset=ContentType.objects.filter(FeatureQuery('tags').get_query()), + required=False, + label=_('Tagged object type') + ) + + +class ConfigContextFilterForm(BootstrapMixin, forms.Form): + field_groups = [ + ['q', 'tag'], + ['region_id', 'site_group_id', 'site_id'], + ['device_type_id', 'platform_id', 'role_id'], + ['cluster_group_id', 'cluster_id'], + ['tenant_group_id', 'tenant_id'] + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + region_id = DynamicModelMultipleChoiceField( + queryset=Region.objects.all(), + required=False, + label=_('Regions'), + fetch_trigger='open' + ) + site_group_id = DynamicModelMultipleChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + label=_('Site groups'), + fetch_trigger='open' + ) + site_id = DynamicModelMultipleChoiceField( + queryset=Site.objects.all(), + required=False, + label=_('Sites'), + fetch_trigger='open' + ) + device_type_id = DynamicModelMultipleChoiceField( + queryset=DeviceType.objects.all(), + required=False, + label=_('Device types'), + fetch_trigger='open' + ) + role_id = DynamicModelMultipleChoiceField( + queryset=DeviceRole.objects.all(), + required=False, + label=_('Roles'), + fetch_trigger='open' + ) + platform_id = DynamicModelMultipleChoiceField( + queryset=Platform.objects.all(), + required=False, + label=_('Platforms'), + fetch_trigger='open' + ) + cluster_group_id = DynamicModelMultipleChoiceField( + queryset=ClusterGroup.objects.all(), + required=False, + label=_('Cluster groups'), + fetch_trigger='open' + ) + cluster_id = DynamicModelMultipleChoiceField( + queryset=Cluster.objects.all(), + required=False, + label=_('Clusters'), + fetch_trigger='open' + ) + tenant_group_id = DynamicModelMultipleChoiceField( + queryset=TenantGroup.objects.all(), + required=False, + label=_('Tenant groups'), + fetch_trigger='open' + ) + tenant_id = DynamicModelMultipleChoiceField( + queryset=Tenant.objects.all(), + required=False, + label=_('Tenant'), + fetch_trigger='open' + ) + tag = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + to_field_name='slug', + required=False, + label=_('Tags'), + fetch_trigger='open' + ) + + +class LocalConfigContextFilterForm(forms.Form): + local_context_data = forms.NullBooleanField( + required=False, + label=_('Has local config context data'), + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + + +class JournalEntryFilterForm(BootstrapMixin, forms.Form): + model = JournalEntry + field_groups = [ + ['q'], + ['created_before', 'created_after', 'created_by_id'], + ['assigned_object_type_id', 'kind'] + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + created_after = forms.DateTimeField( + required=False, + label=_('After'), + widget=DateTimePicker() + ) + created_before = forms.DateTimeField( + required=False, + label=_('Before'), + widget=DateTimePicker() + ) + created_by_id = DynamicModelMultipleChoiceField( + queryset=User.objects.all(), + required=False, + label=_('User'), + widget=APISelectMultiple( + api_url='/api/users/users/', + ), + fetch_trigger='open' + ) + assigned_object_type_id = DynamicModelMultipleChoiceField( + queryset=ContentType.objects.all(), + required=False, + label=_('Object Type'), + widget=APISelectMultiple( + api_url='/api/extras/content-types/', + ), + fetch_trigger='open' + ) + kind = forms.ChoiceField( + choices=add_blank_choice(JournalEntryKindChoices), + required=False, + widget=StaticSelect() + ) + + +class ObjectChangeFilterForm(BootstrapMixin, forms.Form): + model = ObjectChange + field_groups = [ + ['q'], + ['time_before', 'time_after', 'action'], + ['user_id', 'changed_object_type_id'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + time_after = forms.DateTimeField( + required=False, + label=_('After'), + widget=DateTimePicker() + ) + time_before = forms.DateTimeField( + required=False, + label=_('Before'), + widget=DateTimePicker() + ) + action = forms.ChoiceField( + choices=add_blank_choice(ObjectChangeActionChoices), + required=False, + widget=StaticSelect() + ) + user_id = DynamicModelMultipleChoiceField( + queryset=User.objects.all(), + required=False, + label=_('User'), + widget=APISelectMultiple( + api_url='/api/users/users/', + ), + fetch_trigger='open' + ) + changed_object_type_id = DynamicModelMultipleChoiceField( + queryset=ContentType.objects.all(), + required=False, + label=_('Object Type'), + widget=APISelectMultiple( + api_url='/api/extras/content-types/', + ), + fetch_trigger='open' + ) diff --git a/netbox/extras/forms/models.py b/netbox/extras/forms/models.py new file mode 100644 index 00000000000..7e462e62bda --- /dev/null +++ b/netbox/extras/forms/models.py @@ -0,0 +1,223 @@ +from django import forms +from django.contrib.contenttypes.models import ContentType + +from dcim.models import DeviceRole, DeviceType, Platform, Region, Site, SiteGroup +from extras.choices import * +from extras.models import * +from extras.utils import FeatureQuery +from tenancy.models import Tenant, TenantGroup +from utilities.forms import ( + add_blank_choice, BootstrapMixin, CommentField, ContentTypeChoiceField, + ContentTypeMultipleChoiceField, DynamicModelMultipleChoiceField, JSONField, SlugField, StaticSelect, +) +from virtualization.models import Cluster, ClusterGroup + +__all__ = ( + 'AddRemoveTagsForm', + 'ConfigContextForm', + 'CustomFieldForm', + 'CustomLinkForm', + 'ExportTemplateForm', + 'ImageAttachmentForm', + 'JournalEntryForm', + 'TagForm', + 'WebhookForm', +) + + +class CustomFieldForm(BootstrapMixin, forms.ModelForm): + content_types = ContentTypeMultipleChoiceField( + queryset=ContentType.objects.all(), + limit_choices_to=FeatureQuery('custom_fields') + ) + + class Meta: + model = CustomField + fields = '__all__' + fieldsets = ( + ('Custom Field', ('name', 'label', 'type', 'weight', 'required', 'description')), + ('Assigned Models', ('content_types',)), + ('Behavior', ('filter_logic',)), + ('Values', ('default', 'choices')), + ('Validation', ('validation_minimum', 'validation_maximum', 'validation_regex')), + ) + + +class CustomLinkForm(BootstrapMixin, forms.ModelForm): + content_type = ContentTypeChoiceField( + queryset=ContentType.objects.all(), + limit_choices_to=FeatureQuery('custom_links') + ) + + class Meta: + model = CustomLink + fields = '__all__' + fieldsets = ( + ('Custom Link', ('name', 'content_type', 'weight', 'group_name', 'button_class', 'new_window')), + ('Templates', ('link_text', 'link_url')), + ) + widgets = { + 'link_text': forms.Textarea(attrs={'class': 'font-monospace'}), + 'link_url': forms.Textarea(attrs={'class': 'font-monospace'}), + } + help_texts = { + 'link_text': 'Jinja2 template code for the link text. Reference the object as {{ obj }}. ' + 'Links which render as empty text will not be displayed.', + 'link_url': 'Jinja2 template code for the link URL. Reference the object as {{ obj }}.', + } + + +class ExportTemplateForm(BootstrapMixin, forms.ModelForm): + content_type = ContentTypeChoiceField( + queryset=ContentType.objects.all(), + limit_choices_to=FeatureQuery('custom_links') + ) + + class Meta: + model = ExportTemplate + fields = '__all__' + fieldsets = ( + ('Custom Link', ('name', 'content_type', 'description')), + ('Template', ('template_code',)), + ('Rendering', ('mime_type', 'file_extension', 'as_attachment')), + ) + widgets = { + 'template_code': forms.Textarea(attrs={'class': 'font-monospace'}), + } + + +class WebhookForm(BootstrapMixin, forms.ModelForm): + content_types = ContentTypeMultipleChoiceField( + queryset=ContentType.objects.all(), + limit_choices_to=FeatureQuery('webhooks') + ) + + class Meta: + model = Webhook + fields = '__all__' + fieldsets = ( + ('Webhook', ('name', 'enabled')), + ('Assigned Models', ('content_types',)), + ('Events', ('type_create', 'type_update', 'type_delete')), + ('HTTP Request', ( + 'payload_url', 'http_method', 'http_content_type', 'additional_headers', 'body_template', 'secret', + )), + ('SSL', ('ssl_verification', 'ca_file_path')), + ) + widgets = { + 'additional_headers': forms.Textarea(attrs={'class': 'font-monospace'}), + 'body_template': forms.Textarea(attrs={'class': 'font-monospace'}), + } + + +class TagForm(BootstrapMixin, forms.ModelForm): + slug = SlugField() + + class Meta: + model = Tag + fields = [ + 'name', 'slug', 'color', 'description' + ] + fieldsets = ( + ('Tag', ('name', 'slug', 'color', 'description')), + ) + + +class AddRemoveTagsForm(forms.Form): + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Add add/remove tags fields + self.fields['add_tags'] = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + self.fields['remove_tags'] = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + +class ConfigContextForm(BootstrapMixin, forms.ModelForm): + regions = DynamicModelMultipleChoiceField( + queryset=Region.objects.all(), + required=False + ) + site_groups = DynamicModelMultipleChoiceField( + queryset=SiteGroup.objects.all(), + required=False + ) + sites = DynamicModelMultipleChoiceField( + queryset=Site.objects.all(), + required=False + ) + device_types = DynamicModelMultipleChoiceField( + queryset=DeviceType.objects.all(), + required=False + ) + roles = DynamicModelMultipleChoiceField( + queryset=DeviceRole.objects.all(), + required=False + ) + platforms = DynamicModelMultipleChoiceField( + queryset=Platform.objects.all(), + required=False + ) + cluster_groups = DynamicModelMultipleChoiceField( + queryset=ClusterGroup.objects.all(), + required=False + ) + clusters = DynamicModelMultipleChoiceField( + queryset=Cluster.objects.all(), + required=False + ) + tenant_groups = DynamicModelMultipleChoiceField( + queryset=TenantGroup.objects.all(), + required=False + ) + tenants = DynamicModelMultipleChoiceField( + queryset=Tenant.objects.all(), + required=False + ) + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + data = JSONField( + label='' + ) + + class Meta: + model = ConfigContext + fields = ( + 'name', 'weight', 'description', 'is_active', 'regions', 'site_groups', 'sites', 'roles', 'device_types', + 'platforms', 'cluster_groups', 'clusters', 'tenant_groups', 'tenants', 'tags', 'data', + ) + + +class ImageAttachmentForm(BootstrapMixin, forms.ModelForm): + + class Meta: + model = ImageAttachment + fields = [ + 'name', 'image', + ] + + +class JournalEntryForm(BootstrapMixin, forms.ModelForm): + comments = CommentField() + + kind = forms.ChoiceField( + choices=add_blank_choice(JournalEntryKindChoices), + required=False, + widget=StaticSelect() + ) + + class Meta: + model = JournalEntry + fields = ['assigned_object_type', 'assigned_object_id', 'kind', 'comments'] + widgets = { + 'assigned_object_type': forms.HiddenInput, + 'assigned_object_id': forms.HiddenInput, + } diff --git a/netbox/extras/forms/scripts.py b/netbox/extras/forms/scripts.py new file mode 100644 index 00000000000..380b4364c55 --- /dev/null +++ b/netbox/extras/forms/scripts.py @@ -0,0 +1,30 @@ +from django import forms + +from utilities.forms import BootstrapMixin + +__all__ = ( + 'ScriptForm', +) + + +class ScriptForm(BootstrapMixin, forms.Form): + _commit = forms.BooleanField( + required=False, + initial=True, + label="Commit changes", + help_text="Commit changes to the database (uncheck for a dry-run)" + ) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Move _commit to the end of the form + commit = self.fields.pop('_commit') + self.fields['_commit'] = commit + + @property + def requires_input(self): + """ + A boolean indicating whether the form requires user input (ignore the _commit field). + """ + return bool(len(self.fields) > 1) diff --git a/netbox/extras/graphql/mixins.py b/netbox/extras/graphql/mixins.py index 3cf12896b0b..462ba721f85 100644 --- a/netbox/extras/graphql/mixins.py +++ b/netbox/extras/graphql/mixins.py @@ -1,6 +1,9 @@ import graphene +from django.contrib.contenttypes.models import ContentType from graphene.types.generic import GenericScalar +from extras.models import ObjectChange + __all__ = ( 'ChangelogMixin', 'ConfigContextMixin', @@ -15,7 +18,12 @@ class ChangelogMixin: changelog = graphene.List('extras.graphql.types.ObjectChangeType') def resolve_changelog(self, info): - return self.object_changes.restrict(info.context.user, 'view') + content_type = ContentType.objects.get_for_model(self) + object_changes = ObjectChange.objects.filter( + changed_object_type=content_type, + changed_object_id=self.pk + ) + return object_changes.restrict(info.context.user, 'view') class ConfigContextMixin: diff --git a/netbox/extras/reports.py b/netbox/extras/reports.py index 64fbffb46a3..cc623b37c33 100644 --- a/netbox/extras/reports.py +++ b/netbox/extras/reports.py @@ -59,8 +59,10 @@ def get_reports(): # defined. for importer, module_name, _ in pkgutil.iter_modules([settings.REPORTS_ROOT]): module = importer.find_module(module_name).load_module(module_name) - report_list = [cls() for _, cls in inspect.getmembers(module, is_report)] - module_list.append((module_name, report_list)) + report_order = getattr(module, "report_order", ()) + ordered_reports = [cls() for cls in report_order if is_report(cls)] + unordered_reports = [cls() for _, cls in inspect.getmembers(module, is_report) if cls not in report_order] + module_list.append((module_name, [*ordered_reports, *unordered_reports])) return module_list diff --git a/netbox/extras/tests/test_customfields.py b/netbox/extras/tests/test_customfields.py index c2a2da3dc1b..32c473678e1 100644 --- a/netbox/extras/tests/test_customfields.py +++ b/netbox/extras/tests/test_customfields.py @@ -506,10 +506,10 @@ class CustomFieldImportTest(TestCase): Import a Site in CSV format, including a value for each CustomField. """ data = ( - ('name', 'slug', 'cf_text', 'cf_integer', 'cf_boolean', 'cf_date', 'cf_url', 'cf_select'), - ('Site 1', 'site-1', 'ABC', '123', 'True', '2020-01-01', 'http://example.com/1', 'Choice A'), - ('Site 2', 'site-2', 'DEF', '456', 'False', '2020-01-02', 'http://example.com/2', 'Choice B'), - ('Site 3', 'site-3', '', '', '', '', '', ''), + ('name', 'slug', 'status', 'cf_text', 'cf_integer', 'cf_boolean', 'cf_date', 'cf_url', 'cf_select'), + ('Site 1', 'site-1', 'active', 'ABC', '123', 'True', '2020-01-01', 'http://example.com/1', 'Choice A'), + ('Site 2', 'site-2', 'active', 'DEF', '456', 'False', '2020-01-02', 'http://example.com/2', 'Choice B'), + ('Site 3', 'site-3', 'active', '', '', '', '', '', ''), ) csv_data = '\n'.join(','.join(row) for row in data) diff --git a/netbox/extras/tests/test_views.py b/netbox/extras/tests/test_views.py index 7f2aa41a880..72d965fd00b 100644 --- a/netbox/extras/tests/test_views.py +++ b/netbox/extras/tests/test_views.py @@ -39,10 +39,10 @@ class CustomFieldTestCase(ViewTestCases.PrimaryObjectViewTestCase): } cls.csv_data = ( - "name,label,type,content_types,weight,filter_logic", - "field4,Field 4,text,dcim.site,100,exact", - "field5,Field 5,text,dcim.site,100,exact", - "field6,Field 6,text,dcim.site,100,exact", + 'name,label,type,content_types,weight,filter_logic,choices', + 'field4,Field 4,text,dcim.site,100,exact,', + 'field5,Field 5,integer,dcim.site,100,exact,', + 'field6,Field 6,select,dcim.site,100,exact,"A,B,C"', ) cls.bulk_edit_data = { diff --git a/netbox/ipam/forms.py b/netbox/ipam/forms.py deleted file mode 100644 index c72884b3c0e..00000000000 --- a/netbox/ipam/forms.py +++ /dev/null @@ -1,1881 +0,0 @@ -from django import forms -from django.contrib.contenttypes.models import ContentType -from django.utils.translation import gettext as _ - -from dcim.models import Device, Interface, Location, Rack, Region, Site, SiteGroup -from extras.forms import ( - AddRemoveTagsForm, CustomFieldModelBulkEditForm, CustomFieldModelCSVForm, CustomFieldModelForm, - CustomFieldModelFilterForm, -) -from extras.models import Tag -from tenancy.forms import TenancyFilterForm, TenancyForm -from tenancy.models import Tenant -from utilities.forms import ( - add_blank_choice, BootstrapMixin, BulkEditNullBooleanSelect, ContentTypeChoiceField, CSVChoiceField, - CSVContentTypeField, CSVModelChoiceField, DatePicker, DynamicModelChoiceField, DynamicModelMultipleChoiceField, - ExpandableIPAddressField, NumericArrayField, SlugField, StaticSelect, StaticSelectMultiple, TagFilterField, - BOOLEAN_WITH_BLANK_CHOICES, -) -from virtualization.models import Cluster, ClusterGroup, VirtualMachine, VMInterface -from .choices import * -from .constants import * -from .models import * - -PREFIX_MASK_LENGTH_CHOICES = add_blank_choice([ - (i, i) for i in range(PREFIX_LENGTH_MIN, PREFIX_LENGTH_MAX + 1) -]) - -IPADDRESS_MASK_LENGTH_CHOICES = add_blank_choice([ - (i, i) for i in range(IPADDRESS_MASK_LENGTH_MIN, IPADDRESS_MASK_LENGTH_MAX + 1) -]) - - -# -# VRFs -# - -class VRFForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): - import_targets = DynamicModelMultipleChoiceField( - queryset=RouteTarget.objects.all(), - required=False - ) - export_targets = DynamicModelMultipleChoiceField( - queryset=RouteTarget.objects.all(), - required=False - ) - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = VRF - fields = [ - 'name', 'rd', 'enforce_unique', 'description', 'import_targets', 'export_targets', 'tenant_group', 'tenant', - 'tags', - ] - fieldsets = ( - ('VRF', ('name', 'rd', 'enforce_unique', 'description', 'tags')), - ('Route Targets', ('import_targets', 'export_targets')), - ('Tenancy', ('tenant_group', 'tenant')), - ) - labels = { - 'rd': "RD", - } - help_texts = { - 'rd': "Route distinguisher in any format", - } - - -class VRFCSVForm(CustomFieldModelCSVForm): - tenant = CSVModelChoiceField( - queryset=Tenant.objects.all(), - required=False, - to_field_name='name', - help_text='Assigned tenant' - ) - - class Meta: - model = VRF - fields = ('name', 'rd', 'tenant', 'enforce_unique', 'description') - - -class VRFBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=VRF.objects.all(), - widget=forms.MultipleHiddenInput() - ) - tenant = DynamicModelChoiceField( - queryset=Tenant.objects.all(), - required=False - ) - enforce_unique = forms.NullBooleanField( - required=False, - widget=BulkEditNullBooleanSelect(), - label='Enforce unique space' - ) - description = forms.CharField( - max_length=100, - required=False - ) - - class Meta: - nullable_fields = [ - 'tenant', 'description', - ] - - -class VRFFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm): - model = VRF - field_groups = [ - ['q', 'tag'], - ['import_target_id', 'export_target_id'], - ['tenant_group_id', 'tenant_id'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - import_target_id = DynamicModelMultipleChoiceField( - queryset=RouteTarget.objects.all(), - required=False, - label=_('Import targets'), - fetch_trigger='open' - ) - export_target_id = DynamicModelMultipleChoiceField( - queryset=RouteTarget.objects.all(), - required=False, - label=_('Export targets'), - fetch_trigger='open' - ) - tag = TagFilterField(model) - - -# -# Route targets -# - -class RouteTargetForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = RouteTarget - fields = [ - 'name', 'description', 'tenant_group', 'tenant', 'tags', - ] - fieldsets = ( - ('Route Target', ('name', 'description', 'tags')), - ('Tenancy', ('tenant_group', 'tenant')), - ) - - -class RouteTargetCSVForm(CustomFieldModelCSVForm): - tenant = CSVModelChoiceField( - queryset=Tenant.objects.all(), - required=False, - to_field_name='name', - help_text='Assigned tenant' - ) - - class Meta: - model = RouteTarget - fields = ('name', 'description', 'tenant') - - -class RouteTargetBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=RouteTarget.objects.all(), - widget=forms.MultipleHiddenInput() - ) - tenant = DynamicModelChoiceField( - queryset=Tenant.objects.all(), - required=False - ) - description = forms.CharField( - max_length=200, - required=False - ) - - class Meta: - nullable_fields = [ - 'tenant', 'description', - ] - - -class RouteTargetFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm): - model = RouteTarget - field_groups = [ - ['q', 'tag'], - ['importing_vrf_id', 'exporting_vrf_id'], - ['tenant_group_id', 'tenant_id'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - importing_vrf_id = DynamicModelMultipleChoiceField( - queryset=VRF.objects.all(), - required=False, - label=_('Imported by VRF'), - fetch_trigger='open' - ) - exporting_vrf_id = DynamicModelMultipleChoiceField( - queryset=VRF.objects.all(), - required=False, - label=_('Exported by VRF'), - fetch_trigger='open' - ) - tag = TagFilterField(model) - - -# -# RIRs -# - -class RIRForm(BootstrapMixin, CustomFieldModelForm): - slug = SlugField() - - class Meta: - model = RIR - fields = [ - 'name', 'slug', 'is_private', 'description', - ] - - -class RIRCSVForm(CustomFieldModelCSVForm): - slug = SlugField() - - class Meta: - model = RIR - fields = ('name', 'slug', 'is_private', 'description') - help_texts = { - 'name': 'RIR name', - } - - -class RIRBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=RIR.objects.all(), - widget=forms.MultipleHiddenInput - ) - is_private = forms.NullBooleanField( - required=False, - widget=BulkEditNullBooleanSelect - ) - description = forms.CharField( - max_length=200, - required=False - ) - - class Meta: - nullable_fields = ['is_private', 'description'] - - -class RIRFilterForm(BootstrapMixin, CustomFieldModelFilterForm): - model = RIR - field_groups = [ - ['q'], - ['is_private'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - is_private = forms.NullBooleanField( - required=False, - label=_('Private'), - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - - -# -# Aggregates -# - -class AggregateForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): - rir = DynamicModelChoiceField( - queryset=RIR.objects.all(), - label='RIR' - ) - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = Aggregate - fields = [ - 'prefix', 'rir', 'date_added', 'description', 'tenant_group', 'tenant', 'tags', - ] - fieldsets = ( - ('Aggregate', ('prefix', 'rir', 'date_added', 'description', 'tags')), - ('Tenancy', ('tenant_group', 'tenant')), - ) - help_texts = { - 'prefix': "IPv4 or IPv6 network", - 'rir': "Regional Internet Registry responsible for this prefix", - } - widgets = { - 'date_added': DatePicker(), - } - - -class AggregateCSVForm(CustomFieldModelCSVForm): - rir = CSVModelChoiceField( - queryset=RIR.objects.all(), - to_field_name='name', - help_text='Assigned RIR' - ) - tenant = CSVModelChoiceField( - queryset=Tenant.objects.all(), - required=False, - to_field_name='name', - help_text='Assigned tenant' - ) - - class Meta: - model = Aggregate - fields = ('prefix', 'rir', 'tenant', 'date_added', 'description') - - -class AggregateBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Aggregate.objects.all(), - widget=forms.MultipleHiddenInput() - ) - rir = DynamicModelChoiceField( - queryset=RIR.objects.all(), - required=False, - label='RIR' - ) - tenant = DynamicModelChoiceField( - queryset=Tenant.objects.all(), - required=False - ) - date_added = forms.DateField( - required=False - ) - description = forms.CharField( - max_length=100, - required=False - ) - - class Meta: - nullable_fields = [ - 'date_added', 'description', - ] - widgets = { - 'date_added': DatePicker(), - } - - -class AggregateFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm): - model = Aggregate - field_groups = [ - ['q', 'tag'], - ['family', 'rir_id'], - ['tenant_group_id', 'tenant_id'] - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - family = forms.ChoiceField( - required=False, - choices=add_blank_choice(IPAddressFamilyChoices), - label=_('Address family'), - widget=StaticSelect() - ) - rir_id = DynamicModelMultipleChoiceField( - queryset=RIR.objects.all(), - required=False, - label=_('RIR'), - fetch_trigger='open' - ) - tag = TagFilterField(model) - - -# -# Roles -# - -class RoleForm(BootstrapMixin, CustomFieldModelForm): - slug = SlugField() - - class Meta: - model = Role - fields = [ - 'name', 'slug', 'weight', 'description', - ] - - -class RoleCSVForm(CustomFieldModelCSVForm): - slug = SlugField() - - class Meta: - model = Role - fields = ('name', 'slug', 'weight', 'description') - - -class RoleBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Role.objects.all(), - widget=forms.MultipleHiddenInput - ) - weight = forms.IntegerField( - required=False - ) - description = forms.CharField( - max_length=200, - required=False - ) - - class Meta: - nullable_fields = ['description'] - - -class RoleFilterForm(BootstrapMixin, CustomFieldModelFilterForm): - model = Role - field_groups = [ - ['q'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - - -# -# Prefixes -# - -class PrefixForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): - vrf = DynamicModelChoiceField( - queryset=VRF.objects.all(), - required=False, - label='VRF' - ) - region = DynamicModelChoiceField( - queryset=Region.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - } - ) - site_group = DynamicModelChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - } - ) - site = DynamicModelChoiceField( - queryset=Site.objects.all(), - required=False, - null_option='None', - query_params={ - 'region_id': '$region', - 'group_id': '$site_group', - } - ) - vlan_group = DynamicModelChoiceField( - queryset=VLANGroup.objects.all(), - required=False, - label='VLAN group', - null_option='None', - query_params={ - 'site_id': '$site' - }, - initial_params={ - 'vlans': '$vlan' - } - ) - vlan = DynamicModelChoiceField( - queryset=VLAN.objects.all(), - required=False, - label='VLAN', - query_params={ - 'site_id': '$site', - 'group_id': '$vlan_group', - } - ) - role = DynamicModelChoiceField( - queryset=Role.objects.all(), - required=False - ) - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = Prefix - fields = [ - 'prefix', 'vrf', 'site', 'vlan', 'status', 'role', 'is_pool', 'mark_utilized', 'description', - 'tenant_group', 'tenant', 'tags', - ] - fieldsets = ( - ('Prefix', ('prefix', 'status', 'vrf', 'role', 'is_pool', 'mark_utilized', 'description', 'tags')), - ('Site/VLAN Assignment', ('region', 'site_group', 'site', 'vlan_group', 'vlan')), - ('Tenancy', ('tenant_group', 'tenant')), - ) - widgets = { - 'status': StaticSelect(), - } - - -class PrefixCSVForm(CustomFieldModelCSVForm): - vrf = CSVModelChoiceField( - queryset=VRF.objects.all(), - to_field_name='name', - required=False, - help_text='Assigned VRF' - ) - tenant = CSVModelChoiceField( - queryset=Tenant.objects.all(), - required=False, - to_field_name='name', - help_text='Assigned tenant' - ) - site = CSVModelChoiceField( - queryset=Site.objects.all(), - required=False, - to_field_name='name', - help_text='Assigned site' - ) - vlan_group = CSVModelChoiceField( - queryset=VLANGroup.objects.all(), - required=False, - to_field_name='name', - help_text="VLAN's group (if any)" - ) - vlan = CSVModelChoiceField( - queryset=VLAN.objects.all(), - required=False, - to_field_name='vid', - help_text="Assigned VLAN" - ) - status = CSVChoiceField( - choices=PrefixStatusChoices, - help_text='Operational status' - ) - role = CSVModelChoiceField( - queryset=Role.objects.all(), - required=False, - to_field_name='name', - help_text='Functional role' - ) - - class Meta: - model = Prefix - fields = ( - 'prefix', 'vrf', 'tenant', 'site', 'vlan_group', 'vlan', 'status', 'role', 'is_pool', 'mark_utilized', - 'description', - ) - - def __init__(self, data=None, *args, **kwargs): - super().__init__(data, *args, **kwargs) - - if data: - - # Limit VLAN queryset by assigned site and/or group (if specified) - params = {} - if data.get('site'): - params[f"site__{self.fields['site'].to_field_name}"] = data.get('site') - if data.get('vlan_group'): - params[f"group__{self.fields['vlan_group'].to_field_name}"] = data.get('vlan_group') - if params: - self.fields['vlan'].queryset = self.fields['vlan'].queryset.filter(**params) - - -class PrefixBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Prefix.objects.all(), - widget=forms.MultipleHiddenInput() - ) - region = DynamicModelChoiceField( - queryset=Region.objects.all(), - required=False - ) - site_group = DynamicModelChoiceField( - queryset=SiteGroup.objects.all(), - required=False - ) - site = DynamicModelChoiceField( - queryset=Site.objects.all(), - required=False, - query_params={ - 'region_id': '$region', - 'group_id': '$site_group', - } - ) - vrf = DynamicModelChoiceField( - queryset=VRF.objects.all(), - required=False, - label='VRF' - ) - prefix_length = forms.IntegerField( - min_value=PREFIX_LENGTH_MIN, - max_value=PREFIX_LENGTH_MAX, - required=False - ) - tenant = DynamicModelChoiceField( - queryset=Tenant.objects.all(), - required=False - ) - status = forms.ChoiceField( - choices=add_blank_choice(PrefixStatusChoices), - required=False, - widget=StaticSelect() - ) - role = DynamicModelChoiceField( - queryset=Role.objects.all(), - required=False - ) - is_pool = forms.NullBooleanField( - required=False, - widget=BulkEditNullBooleanSelect(), - label='Is a pool' - ) - mark_utilized = forms.NullBooleanField( - required=False, - widget=BulkEditNullBooleanSelect(), - label='Treat as 100% utilized' - ) - description = forms.CharField( - max_length=100, - required=False - ) - - class Meta: - nullable_fields = [ - 'site', 'vrf', 'tenant', 'role', 'description', - ] - - -class PrefixFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm): - model = Prefix - field_groups = [ - ['q', 'tag'], - ['within_include', 'family', 'status', 'role_id', 'mask_length', 'is_pool', 'mark_utilized'], - ['vrf_id', 'present_in_vrf_id'], - ['region_id', 'site_group_id', 'site_id'], - ['tenant_group_id', 'tenant_id'] - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - mask_length__lte = forms.IntegerField( - widget=forms.HiddenInput() - ) - within_include = forms.CharField( - required=False, - widget=forms.TextInput( - attrs={ - 'placeholder': 'Prefix', - } - ), - label=_('Search within') - ) - family = forms.ChoiceField( - required=False, - choices=add_blank_choice(IPAddressFamilyChoices), - label=_('Address family'), - widget=StaticSelect() - ) - mask_length = forms.MultipleChoiceField( - required=False, - choices=PREFIX_MASK_LENGTH_CHOICES, - label=_('Mask length'), - widget=StaticSelectMultiple() - ) - vrf_id = DynamicModelMultipleChoiceField( - queryset=VRF.objects.all(), - required=False, - label=_('Assigned VRF'), - null_option='Global', - fetch_trigger='open' - ) - present_in_vrf_id = DynamicModelChoiceField( - queryset=VRF.objects.all(), - required=False, - label=_('Present in VRF'), - fetch_trigger='open' - ) - status = forms.MultipleChoiceField( - choices=PrefixStatusChoices, - required=False, - widget=StaticSelectMultiple() - ) - region_id = DynamicModelMultipleChoiceField( - queryset=Region.objects.all(), - required=False, - label=_('Region'), - fetch_trigger='open' - ) - site_group_id = DynamicModelMultipleChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - label=_('Site group'), - fetch_trigger='open' - ) - site_id = DynamicModelMultipleChoiceField( - queryset=Site.objects.all(), - required=False, - null_option='None', - query_params={ - 'region_id': '$region_id' - }, - label=_('Site'), - fetch_trigger='open' - ) - role_id = DynamicModelMultipleChoiceField( - queryset=Role.objects.all(), - required=False, - null_option='None', - label=_('Role'), - fetch_trigger='open' - ) - is_pool = forms.NullBooleanField( - required=False, - label=_('Is a pool'), - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - mark_utilized = forms.NullBooleanField( - required=False, - label=_('Marked as 100% utilized'), - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - tag = TagFilterField(model) - - -# -# IP ranges -# - -class IPRangeForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): - vrf = DynamicModelChoiceField( - queryset=VRF.objects.all(), - required=False, - label='VRF' - ) - role = DynamicModelChoiceField( - queryset=Role.objects.all(), - required=False - ) - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = IPRange - fields = [ - 'vrf', 'start_address', 'end_address', 'status', 'role', 'description', 'tenant_group', 'tenant', 'tags', - ] - fieldsets = ( - ('IP Range', ('vrf', 'start_address', 'end_address', 'role', 'status', 'description', 'tags')), - ('Tenancy', ('tenant_group', 'tenant')), - ) - widgets = { - 'status': StaticSelect(), - } - - -class IPRangeCSVForm(CustomFieldModelCSVForm): - vrf = CSVModelChoiceField( - queryset=VRF.objects.all(), - to_field_name='name', - required=False, - help_text='Assigned VRF' - ) - tenant = CSVModelChoiceField( - queryset=Tenant.objects.all(), - required=False, - to_field_name='name', - help_text='Assigned tenant' - ) - status = CSVChoiceField( - choices=IPRangeStatusChoices, - help_text='Operational status' - ) - role = CSVModelChoiceField( - queryset=Role.objects.all(), - required=False, - to_field_name='name', - help_text='Functional role' - ) - - class Meta: - model = IPRange - fields = ( - 'start_address', 'end_address', 'vrf', 'tenant', 'status', 'role', 'description', - ) - - -class IPRangeBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=IPRange.objects.all(), - widget=forms.MultipleHiddenInput() - ) - vrf = DynamicModelChoiceField( - queryset=VRF.objects.all(), - required=False, - label='VRF' - ) - tenant = DynamicModelChoiceField( - queryset=Tenant.objects.all(), - required=False - ) - status = forms.ChoiceField( - choices=add_blank_choice(IPRangeStatusChoices), - required=False, - widget=StaticSelect() - ) - role = DynamicModelChoiceField( - queryset=Role.objects.all(), - required=False - ) - description = forms.CharField( - max_length=100, - required=False - ) - - class Meta: - nullable_fields = [ - 'vrf', 'tenant', 'role', 'description', - ] - - -class IPRangeFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm): - model = IPRange - field_groups = [ - ['q', 'tag'], - ['family', 'vrf_id', 'status', 'role_id'], - ['tenant_group_id', 'tenant_id'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - family = forms.ChoiceField( - required=False, - choices=add_blank_choice(IPAddressFamilyChoices), - label=_('Address family'), - widget=StaticSelect() - ) - vrf_id = DynamicModelMultipleChoiceField( - queryset=VRF.objects.all(), - required=False, - label=_('Assigned VRF'), - null_option='Global', - fetch_trigger='open' - ) - status = forms.MultipleChoiceField( - choices=PrefixStatusChoices, - required=False, - widget=StaticSelectMultiple() - ) - role_id = DynamicModelMultipleChoiceField( - queryset=Role.objects.all(), - required=False, - null_option='None', - label=_('Role'), - fetch_trigger='open' - ) - tag = TagFilterField(model) - - -# -# IP addresses -# - -class IPAddressForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): - device = DynamicModelChoiceField( - queryset=Device.objects.all(), - required=False, - initial_params={ - 'interfaces': '$interface' - } - ) - interface = DynamicModelChoiceField( - queryset=Interface.objects.all(), - required=False, - query_params={ - 'device_id': '$device' - } - ) - virtual_machine = DynamicModelChoiceField( - queryset=VirtualMachine.objects.all(), - required=False, - initial_params={ - 'interfaces': '$vminterface' - } - ) - vminterface = DynamicModelChoiceField( - queryset=VMInterface.objects.all(), - required=False, - label='Interface', - query_params={ - 'virtual_machine_id': '$virtual_machine' - } - ) - vrf = DynamicModelChoiceField( - queryset=VRF.objects.all(), - required=False, - label='VRF' - ) - nat_region = DynamicModelChoiceField( - queryset=Region.objects.all(), - required=False, - label='Region', - initial_params={ - 'sites': '$nat_site' - } - ) - nat_site_group = DynamicModelChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - label='Site group', - initial_params={ - 'sites': '$nat_site' - } - ) - nat_site = DynamicModelChoiceField( - queryset=Site.objects.all(), - required=False, - label='Site', - query_params={ - 'region_id': '$nat_region', - 'group_id': '$nat_site_group', - } - ) - nat_rack = DynamicModelChoiceField( - queryset=Rack.objects.all(), - required=False, - label='Rack', - null_option='None', - query_params={ - 'site_id': '$site' - } - ) - nat_device = DynamicModelChoiceField( - queryset=Device.objects.all(), - required=False, - label='Device', - query_params={ - 'site_id': '$site', - 'rack_id': '$nat_rack', - } - ) - nat_cluster = DynamicModelChoiceField( - queryset=Cluster.objects.all(), - required=False, - label='Cluster' - ) - nat_virtual_machine = DynamicModelChoiceField( - queryset=VirtualMachine.objects.all(), - required=False, - label='Virtual Machine', - query_params={ - 'cluster_id': '$nat_cluster', - } - ) - nat_vrf = DynamicModelChoiceField( - queryset=VRF.objects.all(), - required=False, - label='VRF' - ) - nat_inside = DynamicModelChoiceField( - queryset=IPAddress.objects.all(), - required=False, - label='IP Address', - query_params={ - 'device_id': '$nat_device', - 'virtual_machine_id': '$nat_virtual_machine', - 'vrf_id': '$nat_vrf', - } - ) - primary_for_parent = forms.BooleanField( - required=False, - label='Make this the primary IP for the device/VM' - ) - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = IPAddress - fields = [ - 'address', 'vrf', 'status', 'role', 'dns_name', 'description', 'primary_for_parent', 'nat_site', 'nat_rack', - 'nat_device', 'nat_cluster', 'nat_virtual_machine', 'nat_vrf', 'nat_inside', 'tenant_group', 'tenant', - 'tags', - ] - widgets = { - 'status': StaticSelect(), - 'role': StaticSelect(), - } - - def __init__(self, *args, **kwargs): - - # Initialize helper selectors - instance = kwargs.get('instance') - initial = kwargs.get('initial', {}).copy() - if instance: - if type(instance.assigned_object) is Interface: - initial['interface'] = instance.assigned_object - elif type(instance.assigned_object) is VMInterface: - initial['vminterface'] = instance.assigned_object - if instance.nat_inside: - nat_inside_parent = instance.nat_inside.assigned_object - if type(nat_inside_parent) is Interface: - initial['nat_site'] = nat_inside_parent.device.site.pk - if nat_inside_parent.device.rack: - initial['nat_rack'] = nat_inside_parent.device.rack.pk - initial['nat_device'] = nat_inside_parent.device.pk - elif type(nat_inside_parent) is VMInterface: - initial['nat_cluster'] = nat_inside_parent.virtual_machine.cluster.pk - initial['nat_virtual_machine'] = nat_inside_parent.virtual_machine.pk - kwargs['initial'] = initial - - super().__init__(*args, **kwargs) - - # Initialize primary_for_parent if IP address is already assigned - if self.instance.pk and self.instance.assigned_object: - parent = self.instance.assigned_object.parent_object - if ( - self.instance.address.version == 4 and parent.primary_ip4_id == self.instance.pk or - self.instance.address.version == 6 and parent.primary_ip6_id == self.instance.pk - ): - self.initial['primary_for_parent'] = True - - def clean(self): - super().clean() - - # Cannot select both a device interface and a VM interface - if self.cleaned_data.get('interface') and self.cleaned_data.get('vminterface'): - raise forms.ValidationError("Cannot select both a device interface and a virtual machine interface") - self.instance.assigned_object = self.cleaned_data.get('interface') or self.cleaned_data.get('vminterface') - - # Primary IP assignment is only available if an interface has been assigned. - interface = self.cleaned_data.get('interface') or self.cleaned_data.get('vminterface') - if self.cleaned_data.get('primary_for_parent') and not interface: - self.add_error( - 'primary_for_parent', "Only IP addresses assigned to an interface can be designated as primary IPs." - ) - - def save(self, *args, **kwargs): - ipaddress = super().save(*args, **kwargs) - - # Assign/clear this IPAddress as the primary for the associated Device/VirtualMachine. - interface = self.instance.assigned_object - if interface: - parent = interface.parent_object - if self.cleaned_data['primary_for_parent']: - if ipaddress.address.version == 4: - parent.primary_ip4 = ipaddress - else: - parent.primary_ip6 = ipaddress - parent.save() - elif ipaddress.address.version == 4 and parent.primary_ip4 == ipaddress: - parent.primary_ip4 = None - parent.save() - elif ipaddress.address.version == 6 and parent.primary_ip6 == ipaddress: - parent.primary_ip6 = None - parent.save() - - return ipaddress - - -class IPAddressBulkCreateForm(BootstrapMixin, forms.Form): - pattern = ExpandableIPAddressField( - label='Address pattern' - ) - - -class IPAddressBulkAddForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): - vrf = DynamicModelChoiceField( - queryset=VRF.objects.all(), - required=False, - label='VRF' - ) - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = IPAddress - fields = [ - 'address', 'vrf', 'status', 'role', 'dns_name', 'description', 'tenant_group', 'tenant', 'tags', - ] - widgets = { - 'status': StaticSelect(), - 'role': StaticSelect(), - } - - -class IPAddressCSVForm(CustomFieldModelCSVForm): - vrf = CSVModelChoiceField( - queryset=VRF.objects.all(), - to_field_name='name', - required=False, - help_text='Assigned VRF' - ) - tenant = CSVModelChoiceField( - queryset=Tenant.objects.all(), - to_field_name='name', - required=False, - help_text='Assigned tenant' - ) - status = CSVChoiceField( - choices=IPAddressStatusChoices, - required=False, - help_text='Operational status' - ) - role = CSVChoiceField( - choices=IPAddressRoleChoices, - required=False, - help_text='Functional role' - ) - device = CSVModelChoiceField( - queryset=Device.objects.all(), - required=False, - to_field_name='name', - help_text='Parent device of assigned interface (if any)' - ) - virtual_machine = CSVModelChoiceField( - queryset=VirtualMachine.objects.all(), - required=False, - to_field_name='name', - help_text='Parent VM of assigned interface (if any)' - ) - interface = CSVModelChoiceField( - queryset=Interface.objects.none(), # Can also refer to VMInterface - required=False, - to_field_name='name', - help_text='Assigned interface' - ) - is_primary = forms.BooleanField( - help_text='Make this the primary IP for the assigned device', - required=False - ) - - class Meta: - model = IPAddress - fields = [ - 'address', 'vrf', 'tenant', 'status', 'role', 'device', 'virtual_machine', 'interface', 'is_primary', - 'dns_name', 'description', - ] - - def __init__(self, data=None, *args, **kwargs): - super().__init__(data, *args, **kwargs) - - if data: - - # Limit interface queryset by assigned device - if data.get('device'): - self.fields['interface'].queryset = Interface.objects.filter( - **{f"device__{self.fields['device'].to_field_name}": data['device']} - ) - - # Limit interface queryset by assigned device - elif data.get('virtual_machine'): - self.fields['interface'].queryset = VMInterface.objects.filter( - **{f"virtual_machine__{self.fields['virtual_machine'].to_field_name}": data['virtual_machine']} - ) - - def clean(self): - super().clean() - - device = self.cleaned_data.get('device') - virtual_machine = self.cleaned_data.get('virtual_machine') - is_primary = self.cleaned_data.get('is_primary') - - # Validate is_primary - if is_primary and not device and not virtual_machine: - raise forms.ValidationError("No device or virtual machine specified; cannot set as primary IP") - - def save(self, *args, **kwargs): - - # Set interface assignment - if self.cleaned_data['interface']: - self.instance.assigned_object = self.cleaned_data['interface'] - - ipaddress = super().save(*args, **kwargs) - - # Set as primary for device/VM - if self.cleaned_data['is_primary']: - parent = self.cleaned_data['device'] or self.cleaned_data['virtual_machine'] - if self.instance.address.version == 4: - parent.primary_ip4 = ipaddress - elif self.instance.address.version == 6: - parent.primary_ip6 = ipaddress - parent.save() - - return ipaddress - - -class IPAddressBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=IPAddress.objects.all(), - widget=forms.MultipleHiddenInput() - ) - vrf = DynamicModelChoiceField( - queryset=VRF.objects.all(), - required=False, - label='VRF' - ) - mask_length = forms.IntegerField( - min_value=IPADDRESS_MASK_LENGTH_MIN, - max_value=IPADDRESS_MASK_LENGTH_MAX, - required=False - ) - tenant = DynamicModelChoiceField( - queryset=Tenant.objects.all(), - required=False - ) - status = forms.ChoiceField( - choices=add_blank_choice(IPAddressStatusChoices), - required=False, - widget=StaticSelect() - ) - role = forms.ChoiceField( - choices=add_blank_choice(IPAddressRoleChoices), - required=False, - widget=StaticSelect() - ) - dns_name = forms.CharField( - max_length=255, - required=False - ) - description = forms.CharField( - max_length=100, - required=False - ) - - class Meta: - nullable_fields = [ - 'vrf', 'role', 'tenant', 'dns_name', 'description', - ] - - -class IPAddressAssignForm(BootstrapMixin, forms.Form): - vrf_id = DynamicModelChoiceField( - queryset=VRF.objects.all(), - required=False, - label='VRF' - ) - q = forms.CharField( - required=False, - label='Search', - ) - - -class IPAddressFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm): - model = IPAddress - field_order = [ - 'q', 'parent', 'family', 'mask_length', 'vrf_id', 'present_in_vrf_id', 'status', 'role', - 'assigned_to_interface', 'tenant_group_id', 'tenant_id', - ] - field_groups = [ - ['q', 'tag'], - ['parent', 'family', 'status', 'role', 'mask_length', 'assigned_to_interface'], - ['vrf_id', 'present_in_vrf_id'], - ['tenant_group_id', 'tenant_id'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - parent = forms.CharField( - required=False, - widget=forms.TextInput( - attrs={ - 'placeholder': 'Prefix', - } - ), - label='Parent Prefix' - ) - family = forms.ChoiceField( - required=False, - choices=add_blank_choice(IPAddressFamilyChoices), - label=_('Address family'), - widget=StaticSelect() - ) - mask_length = forms.ChoiceField( - required=False, - choices=IPADDRESS_MASK_LENGTH_CHOICES, - label=_('Mask length'), - widget=StaticSelect() - ) - vrf_id = DynamicModelMultipleChoiceField( - queryset=VRF.objects.all(), - required=False, - label=_('Assigned VRF'), - null_option='Global', - fetch_trigger='open' - ) - present_in_vrf_id = DynamicModelChoiceField( - queryset=VRF.objects.all(), - required=False, - label=_('Present in VRF'), - fetch_trigger='open' - ) - status = forms.MultipleChoiceField( - choices=IPAddressStatusChoices, - required=False, - widget=StaticSelectMultiple() - ) - role = forms.MultipleChoiceField( - choices=IPAddressRoleChoices, - required=False, - widget=StaticSelectMultiple() - ) - assigned_to_interface = forms.NullBooleanField( - required=False, - label=_('Assigned to an interface'), - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - tag = TagFilterField(model) - - -# -# VLAN groups -# - -class VLANGroupForm(BootstrapMixin, CustomFieldModelForm): - scope_type = ContentTypeChoiceField( - queryset=ContentType.objects.filter(model__in=VLANGROUP_SCOPE_TYPES), - required=False, - widget=StaticSelect - ) - region = DynamicModelChoiceField( - queryset=Region.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - } - ) - sitegroup = DynamicModelChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - }, - label='Site group' - ) - site = DynamicModelChoiceField( - queryset=Site.objects.all(), - required=False, - initial_params={ - 'locations': '$location' - }, - query_params={ - 'region_id': '$region', - 'group_id': '$sitegroup', - } - ) - location = DynamicModelChoiceField( - queryset=Location.objects.all(), - required=False, - initial_params={ - 'racks': '$rack' - }, - query_params={ - 'site_id': '$site', - } - ) - rack = DynamicModelChoiceField( - queryset=Rack.objects.all(), - required=False, - query_params={ - 'site_id': '$site', - 'location_id': '$location', - } - ) - clustergroup = DynamicModelChoiceField( - queryset=ClusterGroup.objects.all(), - required=False, - initial_params={ - 'clusters': '$cluster' - }, - label='Cluster group' - ) - cluster = DynamicModelChoiceField( - queryset=Cluster.objects.all(), - required=False, - query_params={ - 'group_id': '$clustergroup', - } - ) - slug = SlugField() - - class Meta: - model = VLANGroup - fields = [ - 'name', 'slug', 'description', 'scope_type', 'region', 'sitegroup', 'site', 'location', 'rack', - 'clustergroup', 'cluster', - ] - fieldsets = ( - ('VLAN Group', ('name', 'slug', 'description')), - ('Scope', ('scope_type', 'region', 'sitegroup', 'site', 'location', 'rack', 'clustergroup', 'cluster')), - ) - widgets = { - 'scope_type': StaticSelect, - } - - def __init__(self, *args, **kwargs): - instance = kwargs.get('instance') - initial = kwargs.get('initial', {}) - - if instance is not None and instance.scope: - initial[instance.scope_type.model] = instance.scope - - kwargs['initial'] = initial - - super().__init__(*args, **kwargs) - - def clean(self): - super().clean() - - # Assign scope based on scope_type - if self.cleaned_data.get('scope_type'): - scope_field = self.cleaned_data['scope_type'].model - self.instance.scope = self.cleaned_data.get(scope_field) - else: - self.instance.scope_id = None - - -class VLANGroupCSVForm(CustomFieldModelCSVForm): - slug = SlugField() - scope_type = CSVContentTypeField( - queryset=ContentType.objects.filter(model__in=VLANGROUP_SCOPE_TYPES), - required=False, - label='Scope type (app & model)' - ) - - class Meta: - model = VLANGroup - fields = ('name', 'slug', 'scope_type', 'scope_id', 'description') - labels = { - 'scope_id': 'Scope ID', - } - - -class VLANGroupBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=VLANGroup.objects.all(), - widget=forms.MultipleHiddenInput - ) - site = DynamicModelChoiceField( - queryset=Site.objects.all(), - required=False - ) - description = forms.CharField( - max_length=200, - required=False - ) - - class Meta: - nullable_fields = ['site', 'description'] - - -class VLANGroupFilterForm(BootstrapMixin, CustomFieldModelFilterForm): - field_groups = [ - ['q'], - ['region', 'sitegroup', 'site', 'location', 'rack'] - ] - model = VLANGroup - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - region = DynamicModelMultipleChoiceField( - queryset=Region.objects.all(), - required=False, - label=_('Region'), - fetch_trigger='open' - ) - sitegroup = DynamicModelMultipleChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - label=_('Site group'), - fetch_trigger='open' - ) - site = DynamicModelMultipleChoiceField( - queryset=Site.objects.all(), - required=False, - label=_('Site'), - fetch_trigger='open' - ) - location = DynamicModelMultipleChoiceField( - queryset=Location.objects.all(), - required=False, - label=_('Location'), - fetch_trigger='open' - ) - rack = DynamicModelMultipleChoiceField( - queryset=Rack.objects.all(), - required=False, - label=_('Rack'), - fetch_trigger='open' - ) - - -# -# VLANs -# - -class VLANForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): - # VLANGroup assignment fields - scope_type = forms.ChoiceField( - choices=( - ('', ''), - ('dcim.region', 'Region'), - ('dcim.sitegroup', 'Site group'), - ('dcim.site', 'Site'), - ('dcim.location', 'Location'), - ('dcim.rack', 'Rack'), - ('virtualization.clustergroup', 'Cluster group'), - ('virtualization.cluster', 'Cluster'), - ), - required=False, - widget=StaticSelect, - label='Group scope' - ) - group = DynamicModelChoiceField( - queryset=VLANGroup.objects.all(), - required=False, - query_params={ - 'scope_type': '$scope_type', - }, - label='VLAN Group' - ) - - # Site assignment fields - region = DynamicModelChoiceField( - queryset=Region.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - }, - label='Region' - ) - sitegroup = DynamicModelChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - }, - label='Site group' - ) - site = DynamicModelChoiceField( - queryset=Site.objects.all(), - required=False, - null_option='None', - query_params={ - 'region_id': '$region', - 'group_id': '$sitegroup', - } - ) - - # Other fields - role = DynamicModelChoiceField( - queryset=Role.objects.all(), - required=False - ) - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = VLAN - fields = [ - 'site', 'group', 'vid', 'name', 'status', 'role', 'description', 'tenant_group', 'tenant', 'tags', - ] - help_texts = { - 'site': "Leave blank if this VLAN spans multiple sites", - 'group': "VLAN group (optional)", - 'vid': "Configured VLAN ID", - 'name': "Configured VLAN name", - 'status': "Operational status of this VLAN", - 'role': "The primary function of this VLAN", - } - widgets = { - 'status': StaticSelect(), - } - - -class VLANCSVForm(CustomFieldModelCSVForm): - site = CSVModelChoiceField( - queryset=Site.objects.all(), - required=False, - to_field_name='name', - help_text='Assigned site' - ) - group = CSVModelChoiceField( - queryset=VLANGroup.objects.all(), - required=False, - to_field_name='name', - help_text='Assigned VLAN group' - ) - tenant = CSVModelChoiceField( - queryset=Tenant.objects.all(), - to_field_name='name', - required=False, - help_text='Assigned tenant' - ) - status = CSVChoiceField( - choices=VLANStatusChoices, - help_text='Operational status' - ) - role = CSVModelChoiceField( - queryset=Role.objects.all(), - required=False, - to_field_name='name', - help_text='Functional role' - ) - - class Meta: - model = VLAN - fields = ('site', 'group', 'vid', 'name', 'tenant', 'status', 'role', 'description') - help_texts = { - 'vid': 'Numeric VLAN ID (1-4095)', - 'name': 'VLAN name', - } - - -class VLANBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=VLAN.objects.all(), - widget=forms.MultipleHiddenInput() - ) - region = DynamicModelChoiceField( - queryset=Region.objects.all(), - required=False - ) - site_group = DynamicModelChoiceField( - queryset=SiteGroup.objects.all(), - required=False - ) - site = DynamicModelChoiceField( - queryset=Site.objects.all(), - required=False, - query_params={ - 'region_id': '$region', - 'group_id': '$site_group', - } - ) - group = DynamicModelChoiceField( - queryset=VLANGroup.objects.all(), - required=False, - query_params={ - 'site_id': '$site' - } - ) - tenant = DynamicModelChoiceField( - queryset=Tenant.objects.all(), - required=False - ) - status = forms.ChoiceField( - choices=add_blank_choice(VLANStatusChoices), - required=False, - widget=StaticSelect() - ) - role = DynamicModelChoiceField( - queryset=Role.objects.all(), - required=False - ) - description = forms.CharField( - max_length=100, - required=False - ) - - class Meta: - nullable_fields = [ - 'site', 'group', 'tenant', 'role', 'description', - ] - - -class VLANFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm): - model = VLAN - field_groups = [ - ['q', 'tag'], - ['region_id', 'site_group_id', 'site_id'], - ['group_id', 'status', 'role_id'], - ['tenant_group_id', 'tenant_id'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - region_id = DynamicModelMultipleChoiceField( - queryset=Region.objects.all(), - required=False, - label=_('Region'), - fetch_trigger='open' - ) - site_group_id = DynamicModelMultipleChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - label=_('Site group'), - fetch_trigger='open' - ) - site_id = DynamicModelMultipleChoiceField( - queryset=Site.objects.all(), - required=False, - null_option='None', - query_params={ - 'region': '$region' - }, - label=_('Site'), - fetch_trigger='open' - ) - group_id = DynamicModelMultipleChoiceField( - queryset=VLANGroup.objects.all(), - required=False, - null_option='None', - query_params={ - 'region': '$region' - }, - label=_('VLAN group'), - fetch_trigger='open' - ) - status = forms.MultipleChoiceField( - choices=VLANStatusChoices, - required=False, - widget=StaticSelectMultiple() - ) - role_id = DynamicModelMultipleChoiceField( - queryset=Role.objects.all(), - required=False, - null_option='None', - label=_('Role'), - fetch_trigger='open' - ) - tag = TagFilterField(model) - - -# -# Services -# - -class ServiceForm(BootstrapMixin, CustomFieldModelForm): - ports = NumericArrayField( - base_field=forms.IntegerField( - min_value=SERVICE_PORT_MIN, - max_value=SERVICE_PORT_MAX - ), - help_text="Comma-separated list of one or more port numbers. A range may be specified using a hyphen." - ) - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = Service - fields = [ - 'name', 'protocol', 'ports', 'ipaddresses', 'description', 'tags', - ] - help_texts = { - 'ipaddresses': "IP address assignment is optional. If no IPs are selected, the service is assumed to be " - "reachable via all IPs assigned to the device.", - } - widgets = { - 'protocol': StaticSelect(), - 'ipaddresses': StaticSelectMultiple(), - } - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - # Limit IP address choices to those assigned to interfaces of the parent device/VM - if self.instance.device: - self.fields['ipaddresses'].queryset = IPAddress.objects.filter( - interface__in=self.instance.device.vc_interfaces().values_list('id', flat=True) - ) - elif self.instance.virtual_machine: - self.fields['ipaddresses'].queryset = IPAddress.objects.filter( - vminterface__in=self.instance.virtual_machine.interfaces.values_list('id', flat=True) - ) - else: - self.fields['ipaddresses'].choices = [] - - -class ServiceFilterForm(BootstrapMixin, CustomFieldModelFilterForm): - model = Service - field_groups = ( - ('q', 'tag'), - ('protocol', 'port'), - ) - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - protocol = forms.ChoiceField( - choices=add_blank_choice(ServiceProtocolChoices), - required=False, - widget=StaticSelectMultiple() - ) - port = forms.IntegerField( - required=False, - ) - tag = TagFilterField(model) - - -class ServiceCSVForm(CustomFieldModelCSVForm): - device = CSVModelChoiceField( - queryset=Device.objects.all(), - required=False, - to_field_name='name', - help_text='Required if not assigned to a VM' - ) - virtual_machine = CSVModelChoiceField( - queryset=VirtualMachine.objects.all(), - required=False, - to_field_name='name', - help_text='Required if not assigned to a device' - ) - protocol = CSVChoiceField( - choices=ServiceProtocolChoices, - help_text='IP protocol' - ) - - class Meta: - model = Service - fields = ('device', 'virtual_machine', 'name', 'protocol', 'ports', 'description') - - -class ServiceBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Service.objects.all(), - widget=forms.MultipleHiddenInput() - ) - protocol = forms.ChoiceField( - choices=add_blank_choice(ServiceProtocolChoices), - required=False, - widget=StaticSelect() - ) - ports = NumericArrayField( - base_field=forms.IntegerField( - min_value=SERVICE_PORT_MIN, - max_value=SERVICE_PORT_MAX - ), - required=False - ) - description = forms.CharField( - max_length=100, - required=False - ) - - class Meta: - nullable_fields = [ - 'description', - ] diff --git a/netbox/ipam/forms/__init__.py b/netbox/ipam/forms/__init__.py new file mode 100644 index 00000000000..fc3352358f5 --- /dev/null +++ b/netbox/ipam/forms/__init__.py @@ -0,0 +1,5 @@ +from .models import * +from .filtersets import * +from .bulk_create import * +from .bulk_edit import * +from .bulk_import import * diff --git a/netbox/ipam/forms/bulk_create.py b/netbox/ipam/forms/bulk_create.py new file mode 100644 index 00000000000..790474c6e3e --- /dev/null +++ b/netbox/ipam/forms/bulk_create.py @@ -0,0 +1,13 @@ +from django import forms + +from utilities.forms import BootstrapMixin, ExpandableIPAddressField + +__all__ = ( + 'IPAddressBulkCreateForm', +) + + +class IPAddressBulkCreateForm(BootstrapMixin, forms.Form): + pattern = ExpandableIPAddressField( + label='Address pattern' + ) diff --git a/netbox/ipam/forms/bulk_edit.py b/netbox/ipam/forms/bulk_edit.py new file mode 100644 index 00000000000..895dbe20059 --- /dev/null +++ b/netbox/ipam/forms/bulk_edit.py @@ -0,0 +1,378 @@ +from django import forms + +from dcim.models import Region, Site, SiteGroup +from extras.forms import AddRemoveTagsForm, CustomFieldModelBulkEditForm +from ipam.choices import * +from ipam.constants import * +from ipam.models import * +from tenancy.models import Tenant +from utilities.forms import ( + add_blank_choice, BootstrapMixin, BulkEditNullBooleanSelect, DatePicker, DynamicModelChoiceField, NumericArrayField, + StaticSelect, +) + +__all__ = ( + 'AggregateBulkEditForm', + 'IPAddressBulkEditForm', + 'IPRangeBulkEditForm', + 'PrefixBulkEditForm', + 'RIRBulkEditForm', + 'RoleBulkEditForm', + 'RouteTargetBulkEditForm', + 'ServiceBulkEditForm', + 'VLANBulkEditForm', + 'VLANGroupBulkEditForm', + 'VRFBulkEditForm', +) + + +class VRFBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=VRF.objects.all(), + widget=forms.MultipleHiddenInput() + ) + tenant = DynamicModelChoiceField( + queryset=Tenant.objects.all(), + required=False + ) + enforce_unique = forms.NullBooleanField( + required=False, + widget=BulkEditNullBooleanSelect(), + label='Enforce unique space' + ) + description = forms.CharField( + max_length=100, + required=False + ) + + class Meta: + nullable_fields = [ + 'tenant', 'description', + ] + + +class RouteTargetBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=RouteTarget.objects.all(), + widget=forms.MultipleHiddenInput() + ) + tenant = DynamicModelChoiceField( + queryset=Tenant.objects.all(), + required=False + ) + description = forms.CharField( + max_length=200, + required=False + ) + + class Meta: + nullable_fields = [ + 'tenant', 'description', + ] + + +class RIRBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=RIR.objects.all(), + widget=forms.MultipleHiddenInput + ) + is_private = forms.NullBooleanField( + required=False, + widget=BulkEditNullBooleanSelect + ) + description = forms.CharField( + max_length=200, + required=False + ) + + class Meta: + nullable_fields = ['is_private', 'description'] + + +class AggregateBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=Aggregate.objects.all(), + widget=forms.MultipleHiddenInput() + ) + rir = DynamicModelChoiceField( + queryset=RIR.objects.all(), + required=False, + label='RIR' + ) + tenant = DynamicModelChoiceField( + queryset=Tenant.objects.all(), + required=False + ) + date_added = forms.DateField( + required=False + ) + description = forms.CharField( + max_length=100, + required=False + ) + + class Meta: + nullable_fields = [ + 'date_added', 'description', + ] + widgets = { + 'date_added': DatePicker(), + } + + +class RoleBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=Role.objects.all(), + widget=forms.MultipleHiddenInput + ) + weight = forms.IntegerField( + required=False + ) + description = forms.CharField( + max_length=200, + required=False + ) + + class Meta: + nullable_fields = ['description'] + + +class PrefixBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=Prefix.objects.all(), + widget=forms.MultipleHiddenInput() + ) + region = DynamicModelChoiceField( + queryset=Region.objects.all(), + required=False + ) + site_group = DynamicModelChoiceField( + queryset=SiteGroup.objects.all(), + required=False + ) + site = DynamicModelChoiceField( + queryset=Site.objects.all(), + required=False, + query_params={ + 'region_id': '$region', + 'group_id': '$site_group', + } + ) + vrf = DynamicModelChoiceField( + queryset=VRF.objects.all(), + required=False, + label='VRF' + ) + prefix_length = forms.IntegerField( + min_value=PREFIX_LENGTH_MIN, + max_value=PREFIX_LENGTH_MAX, + required=False + ) + tenant = DynamicModelChoiceField( + queryset=Tenant.objects.all(), + required=False + ) + status = forms.ChoiceField( + choices=add_blank_choice(PrefixStatusChoices), + required=False, + widget=StaticSelect() + ) + role = DynamicModelChoiceField( + queryset=Role.objects.all(), + required=False + ) + is_pool = forms.NullBooleanField( + required=False, + widget=BulkEditNullBooleanSelect(), + label='Is a pool' + ) + mark_utilized = forms.NullBooleanField( + required=False, + widget=BulkEditNullBooleanSelect(), + label='Treat as 100% utilized' + ) + description = forms.CharField( + max_length=100, + required=False + ) + + class Meta: + nullable_fields = [ + 'site', 'vrf', 'tenant', 'role', 'description', + ] + + +class IPRangeBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=IPRange.objects.all(), + widget=forms.MultipleHiddenInput() + ) + vrf = DynamicModelChoiceField( + queryset=VRF.objects.all(), + required=False, + label='VRF' + ) + tenant = DynamicModelChoiceField( + queryset=Tenant.objects.all(), + required=False + ) + status = forms.ChoiceField( + choices=add_blank_choice(IPRangeStatusChoices), + required=False, + widget=StaticSelect() + ) + role = DynamicModelChoiceField( + queryset=Role.objects.all(), + required=False + ) + description = forms.CharField( + max_length=100, + required=False + ) + + class Meta: + nullable_fields = [ + 'vrf', 'tenant', 'role', 'description', + ] + + +class IPAddressBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=IPAddress.objects.all(), + widget=forms.MultipleHiddenInput() + ) + vrf = DynamicModelChoiceField( + queryset=VRF.objects.all(), + required=False, + label='VRF' + ) + mask_length = forms.IntegerField( + min_value=IPADDRESS_MASK_LENGTH_MIN, + max_value=IPADDRESS_MASK_LENGTH_MAX, + required=False + ) + tenant = DynamicModelChoiceField( + queryset=Tenant.objects.all(), + required=False + ) + status = forms.ChoiceField( + choices=add_blank_choice(IPAddressStatusChoices), + required=False, + widget=StaticSelect() + ) + role = forms.ChoiceField( + choices=add_blank_choice(IPAddressRoleChoices), + required=False, + widget=StaticSelect() + ) + dns_name = forms.CharField( + max_length=255, + required=False + ) + description = forms.CharField( + max_length=100, + required=False + ) + + class Meta: + nullable_fields = [ + 'vrf', 'role', 'tenant', 'dns_name', 'description', + ] + + +class VLANGroupBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=VLANGroup.objects.all(), + widget=forms.MultipleHiddenInput + ) + site = DynamicModelChoiceField( + queryset=Site.objects.all(), + required=False + ) + description = forms.CharField( + max_length=200, + required=False + ) + + class Meta: + nullable_fields = ['site', 'description'] + + +class VLANBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=VLAN.objects.all(), + widget=forms.MultipleHiddenInput() + ) + region = DynamicModelChoiceField( + queryset=Region.objects.all(), + required=False + ) + site_group = DynamicModelChoiceField( + queryset=SiteGroup.objects.all(), + required=False + ) + site = DynamicModelChoiceField( + queryset=Site.objects.all(), + required=False, + query_params={ + 'region_id': '$region', + 'group_id': '$site_group', + } + ) + group = DynamicModelChoiceField( + queryset=VLANGroup.objects.all(), + required=False, + query_params={ + 'site_id': '$site' + } + ) + tenant = DynamicModelChoiceField( + queryset=Tenant.objects.all(), + required=False + ) + status = forms.ChoiceField( + choices=add_blank_choice(VLANStatusChoices), + required=False, + widget=StaticSelect() + ) + role = DynamicModelChoiceField( + queryset=Role.objects.all(), + required=False + ) + description = forms.CharField( + max_length=100, + required=False + ) + + class Meta: + nullable_fields = [ + 'site', 'group', 'tenant', 'role', 'description', + ] + + +class ServiceBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=Service.objects.all(), + widget=forms.MultipleHiddenInput() + ) + protocol = forms.ChoiceField( + choices=add_blank_choice(ServiceProtocolChoices), + required=False, + widget=StaticSelect() + ) + ports = NumericArrayField( + base_field=forms.IntegerField( + min_value=SERVICE_PORT_MIN, + max_value=SERVICE_PORT_MAX + ), + required=False + ) + description = forms.CharField( + max_length=100, + required=False + ) + + class Meta: + nullable_fields = [ + 'description', + ] diff --git a/netbox/ipam/forms/bulk_import.py b/netbox/ipam/forms/bulk_import.py new file mode 100644 index 00000000000..49d5014f927 --- /dev/null +++ b/netbox/ipam/forms/bulk_import.py @@ -0,0 +1,361 @@ +from django import forms +from django.contrib.contenttypes.models import ContentType + +from dcim.models import Device, Interface, Site +from extras.forms import CustomFieldModelCSVForm +from ipam.choices import * +from ipam.constants import * +from ipam.models import * +from tenancy.models import Tenant +from utilities.forms import CSVChoiceField, CSVContentTypeField, CSVModelChoiceField, SlugField +from virtualization.models import VirtualMachine, VMInterface + +__all__ = ( + 'AggregateCSVForm', + 'IPAddressCSVForm', + 'IPRangeCSVForm', + 'PrefixCSVForm', + 'RIRCSVForm', + 'RoleCSVForm', + 'RouteTargetCSVForm', + 'ServiceCSVForm', + 'VLANCSVForm', + 'VLANGroupCSVForm', + 'VRFCSVForm', +) + + +class VRFCSVForm(CustomFieldModelCSVForm): + tenant = CSVModelChoiceField( + queryset=Tenant.objects.all(), + required=False, + to_field_name='name', + help_text='Assigned tenant' + ) + + class Meta: + model = VRF + fields = ('name', 'rd', 'tenant', 'enforce_unique', 'description') + + +class RouteTargetCSVForm(CustomFieldModelCSVForm): + tenant = CSVModelChoiceField( + queryset=Tenant.objects.all(), + required=False, + to_field_name='name', + help_text='Assigned tenant' + ) + + class Meta: + model = RouteTarget + fields = ('name', 'description', 'tenant') + + +class RIRCSVForm(CustomFieldModelCSVForm): + slug = SlugField() + + class Meta: + model = RIR + fields = ('name', 'slug', 'is_private', 'description') + help_texts = { + 'name': 'RIR name', + } + + +class AggregateCSVForm(CustomFieldModelCSVForm): + rir = CSVModelChoiceField( + queryset=RIR.objects.all(), + to_field_name='name', + help_text='Assigned RIR' + ) + tenant = CSVModelChoiceField( + queryset=Tenant.objects.all(), + required=False, + to_field_name='name', + help_text='Assigned tenant' + ) + + class Meta: + model = Aggregate + fields = ('prefix', 'rir', 'tenant', 'date_added', 'description') + + +class RoleCSVForm(CustomFieldModelCSVForm): + slug = SlugField() + + class Meta: + model = Role + fields = ('name', 'slug', 'weight', 'description') + + +class PrefixCSVForm(CustomFieldModelCSVForm): + vrf = CSVModelChoiceField( + queryset=VRF.objects.all(), + to_field_name='name', + required=False, + help_text='Assigned VRF' + ) + tenant = CSVModelChoiceField( + queryset=Tenant.objects.all(), + required=False, + to_field_name='name', + help_text='Assigned tenant' + ) + site = CSVModelChoiceField( + queryset=Site.objects.all(), + required=False, + to_field_name='name', + help_text='Assigned site' + ) + vlan_group = CSVModelChoiceField( + queryset=VLANGroup.objects.all(), + required=False, + to_field_name='name', + help_text="VLAN's group (if any)" + ) + vlan = CSVModelChoiceField( + queryset=VLAN.objects.all(), + required=False, + to_field_name='vid', + help_text="Assigned VLAN" + ) + status = CSVChoiceField( + choices=PrefixStatusChoices, + help_text='Operational status' + ) + role = CSVModelChoiceField( + queryset=Role.objects.all(), + required=False, + to_field_name='name', + help_text='Functional role' + ) + + class Meta: + model = Prefix + fields = ( + 'prefix', 'vrf', 'tenant', 'site', 'vlan_group', 'vlan', 'status', 'role', 'is_pool', 'mark_utilized', + 'description', + ) + + def __init__(self, data=None, *args, **kwargs): + super().__init__(data, *args, **kwargs) + + if data: + + # Limit VLAN queryset by assigned site and/or group (if specified) + params = {} + if data.get('site'): + params[f"site__{self.fields['site'].to_field_name}"] = data.get('site') + if data.get('vlan_group'): + params[f"group__{self.fields['vlan_group'].to_field_name}"] = data.get('vlan_group') + if params: + self.fields['vlan'].queryset = self.fields['vlan'].queryset.filter(**params) + + +class IPRangeCSVForm(CustomFieldModelCSVForm): + vrf = CSVModelChoiceField( + queryset=VRF.objects.all(), + to_field_name='name', + required=False, + help_text='Assigned VRF' + ) + tenant = CSVModelChoiceField( + queryset=Tenant.objects.all(), + required=False, + to_field_name='name', + help_text='Assigned tenant' + ) + status = CSVChoiceField( + choices=IPRangeStatusChoices, + help_text='Operational status' + ) + role = CSVModelChoiceField( + queryset=Role.objects.all(), + required=False, + to_field_name='name', + help_text='Functional role' + ) + + class Meta: + model = IPRange + fields = ( + 'start_address', 'end_address', 'vrf', 'tenant', 'status', 'role', 'description', + ) + + +class IPAddressCSVForm(CustomFieldModelCSVForm): + vrf = CSVModelChoiceField( + queryset=VRF.objects.all(), + to_field_name='name', + required=False, + help_text='Assigned VRF' + ) + tenant = CSVModelChoiceField( + queryset=Tenant.objects.all(), + to_field_name='name', + required=False, + help_text='Assigned tenant' + ) + status = CSVChoiceField( + choices=IPAddressStatusChoices, + help_text='Operational status' + ) + role = CSVChoiceField( + choices=IPAddressRoleChoices, + required=False, + help_text='Functional role' + ) + device = CSVModelChoiceField( + queryset=Device.objects.all(), + required=False, + to_field_name='name', + help_text='Parent device of assigned interface (if any)' + ) + virtual_machine = CSVModelChoiceField( + queryset=VirtualMachine.objects.all(), + required=False, + to_field_name='name', + help_text='Parent VM of assigned interface (if any)' + ) + interface = CSVModelChoiceField( + queryset=Interface.objects.none(), # Can also refer to VMInterface + required=False, + to_field_name='name', + help_text='Assigned interface' + ) + is_primary = forms.BooleanField( + help_text='Make this the primary IP for the assigned device', + required=False + ) + + class Meta: + model = IPAddress + fields = [ + 'address', 'vrf', 'tenant', 'status', 'role', 'device', 'virtual_machine', 'interface', 'is_primary', + 'dns_name', 'description', + ] + + def __init__(self, data=None, *args, **kwargs): + super().__init__(data, *args, **kwargs) + + if data: + + # Limit interface queryset by assigned device + if data.get('device'): + self.fields['interface'].queryset = Interface.objects.filter( + **{f"device__{self.fields['device'].to_field_name}": data['device']} + ) + + # Limit interface queryset by assigned device + elif data.get('virtual_machine'): + self.fields['interface'].queryset = VMInterface.objects.filter( + **{f"virtual_machine__{self.fields['virtual_machine'].to_field_name}": data['virtual_machine']} + ) + + def clean(self): + super().clean() + + device = self.cleaned_data.get('device') + virtual_machine = self.cleaned_data.get('virtual_machine') + is_primary = self.cleaned_data.get('is_primary') + + # Validate is_primary + if is_primary and not device and not virtual_machine: + raise forms.ValidationError("No device or virtual machine specified; cannot set as primary IP") + + def save(self, *args, **kwargs): + + # Set interface assignment + if self.cleaned_data['interface']: + self.instance.assigned_object = self.cleaned_data['interface'] + + ipaddress = super().save(*args, **kwargs) + + # Set as primary for device/VM + if self.cleaned_data['is_primary']: + parent = self.cleaned_data['device'] or self.cleaned_data['virtual_machine'] + if self.instance.address.version == 4: + parent.primary_ip4 = ipaddress + elif self.instance.address.version == 6: + parent.primary_ip6 = ipaddress + parent.save() + + return ipaddress + + +class VLANGroupCSVForm(CustomFieldModelCSVForm): + slug = SlugField() + scope_type = CSVContentTypeField( + queryset=ContentType.objects.filter(model__in=VLANGROUP_SCOPE_TYPES), + required=False, + label='Scope type (app & model)' + ) + + class Meta: + model = VLANGroup + fields = ('name', 'slug', 'scope_type', 'scope_id', 'description') + labels = { + 'scope_id': 'Scope ID', + } + + +class VLANCSVForm(CustomFieldModelCSVForm): + site = CSVModelChoiceField( + queryset=Site.objects.all(), + required=False, + to_field_name='name', + help_text='Assigned site' + ) + group = CSVModelChoiceField( + queryset=VLANGroup.objects.all(), + required=False, + to_field_name='name', + help_text='Assigned VLAN group' + ) + tenant = CSVModelChoiceField( + queryset=Tenant.objects.all(), + to_field_name='name', + required=False, + help_text='Assigned tenant' + ) + status = CSVChoiceField( + choices=VLANStatusChoices, + help_text='Operational status' + ) + role = CSVModelChoiceField( + queryset=Role.objects.all(), + required=False, + to_field_name='name', + help_text='Functional role' + ) + + class Meta: + model = VLAN + fields = ('site', 'group', 'vid', 'name', 'tenant', 'status', 'role', 'description') + help_texts = { + 'vid': 'Numeric VLAN ID (1-4095)', + 'name': 'VLAN name', + } + + +class ServiceCSVForm(CustomFieldModelCSVForm): + device = CSVModelChoiceField( + queryset=Device.objects.all(), + required=False, + to_field_name='name', + help_text='Required if not assigned to a VM' + ) + virtual_machine = CSVModelChoiceField( + queryset=VirtualMachine.objects.all(), + required=False, + to_field_name='name', + help_text='Required if not assigned to a device' + ) + protocol = CSVChoiceField( + choices=ServiceProtocolChoices, + help_text='IP protocol' + ) + + class Meta: + model = Service + fields = ('device', 'virtual_machine', 'name', 'protocol', 'ports', 'description') diff --git a/netbox/ipam/forms/filtersets.py b/netbox/ipam/forms/filtersets.py new file mode 100644 index 00000000000..8bc0f10fb53 --- /dev/null +++ b/netbox/ipam/forms/filtersets.py @@ -0,0 +1,486 @@ +from django import forms +from django.utils.translation import gettext as _ + +from dcim.models import Location, Rack, Region, Site, SiteGroup +from extras.forms import CustomFieldModelFilterForm +from ipam.choices import * +from ipam.constants import * +from ipam.models import * +from tenancy.forms import TenancyFilterForm +from utilities.forms import ( + add_blank_choice, BootstrapMixin, DynamicModelChoiceField, DynamicModelMultipleChoiceField, StaticSelect, + StaticSelectMultiple, TagFilterField, BOOLEAN_WITH_BLANK_CHOICES, +) + +__all__ = ( + 'AggregateFilterForm', + 'IPAddressFilterForm', + 'IPRangeFilterForm', + 'PrefixFilterForm', + 'RIRFilterForm', + 'RoleFilterForm', + 'RouteTargetFilterForm', + 'ServiceFilterForm', + 'VLANFilterForm', + 'VLANGroupFilterForm', + 'VRFFilterForm', +) + +PREFIX_MASK_LENGTH_CHOICES = add_blank_choice([ + (i, i) for i in range(PREFIX_LENGTH_MIN, PREFIX_LENGTH_MAX + 1) +]) + +IPADDRESS_MASK_LENGTH_CHOICES = add_blank_choice([ + (i, i) for i in range(IPADDRESS_MASK_LENGTH_MIN, IPADDRESS_MASK_LENGTH_MAX + 1) +]) + + +class VRFFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm): + model = VRF + field_groups = [ + ['q', 'tag'], + ['import_target_id', 'export_target_id'], + ['tenant_group_id', 'tenant_id'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + import_target_id = DynamicModelMultipleChoiceField( + queryset=RouteTarget.objects.all(), + required=False, + label=_('Import targets'), + fetch_trigger='open' + ) + export_target_id = DynamicModelMultipleChoiceField( + queryset=RouteTarget.objects.all(), + required=False, + label=_('Export targets'), + fetch_trigger='open' + ) + tag = TagFilterField(model) + + +class RouteTargetFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm): + model = RouteTarget + field_groups = [ + ['q', 'tag'], + ['importing_vrf_id', 'exporting_vrf_id'], + ['tenant_group_id', 'tenant_id'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + importing_vrf_id = DynamicModelMultipleChoiceField( + queryset=VRF.objects.all(), + required=False, + label=_('Imported by VRF'), + fetch_trigger='open' + ) + exporting_vrf_id = DynamicModelMultipleChoiceField( + queryset=VRF.objects.all(), + required=False, + label=_('Exported by VRF'), + fetch_trigger='open' + ) + tag = TagFilterField(model) + + +class RIRFilterForm(BootstrapMixin, CustomFieldModelFilterForm): + model = RIR + field_groups = [ + ['q'], + ['is_private'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + is_private = forms.NullBooleanField( + required=False, + label=_('Private'), + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + + +class AggregateFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm): + model = Aggregate + field_groups = [ + ['q', 'tag'], + ['family', 'rir_id'], + ['tenant_group_id', 'tenant_id'] + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + family = forms.ChoiceField( + required=False, + choices=add_blank_choice(IPAddressFamilyChoices), + label=_('Address family'), + widget=StaticSelect() + ) + rir_id = DynamicModelMultipleChoiceField( + queryset=RIR.objects.all(), + required=False, + label=_('RIR'), + fetch_trigger='open' + ) + tag = TagFilterField(model) + + +class RoleFilterForm(BootstrapMixin, CustomFieldModelFilterForm): + model = Role + field_groups = [ + ['q'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + + +class PrefixFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm): + model = Prefix + field_groups = [ + ['q', 'tag'], + ['within_include', 'family', 'status', 'role_id', 'mask_length', 'is_pool', 'mark_utilized'], + ['vrf_id', 'present_in_vrf_id'], + ['region_id', 'site_group_id', 'site_id'], + ['tenant_group_id', 'tenant_id'] + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + mask_length__lte = forms.IntegerField( + widget=forms.HiddenInput() + ) + within_include = forms.CharField( + required=False, + widget=forms.TextInput( + attrs={ + 'placeholder': 'Prefix', + } + ), + label=_('Search within') + ) + family = forms.ChoiceField( + required=False, + choices=add_blank_choice(IPAddressFamilyChoices), + label=_('Address family'), + widget=StaticSelect() + ) + mask_length = forms.MultipleChoiceField( + required=False, + choices=PREFIX_MASK_LENGTH_CHOICES, + label=_('Mask length'), + widget=StaticSelectMultiple() + ) + vrf_id = DynamicModelMultipleChoiceField( + queryset=VRF.objects.all(), + required=False, + label=_('Assigned VRF'), + null_option='Global', + fetch_trigger='open' + ) + present_in_vrf_id = DynamicModelChoiceField( + queryset=VRF.objects.all(), + required=False, + label=_('Present in VRF'), + fetch_trigger='open' + ) + status = forms.MultipleChoiceField( + choices=PrefixStatusChoices, + required=False, + widget=StaticSelectMultiple() + ) + region_id = DynamicModelMultipleChoiceField( + queryset=Region.objects.all(), + required=False, + label=_('Region'), + fetch_trigger='open' + ) + site_group_id = DynamicModelMultipleChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + label=_('Site group'), + fetch_trigger='open' + ) + site_id = DynamicModelMultipleChoiceField( + queryset=Site.objects.all(), + required=False, + null_option='None', + query_params={ + 'region_id': '$region_id' + }, + label=_('Site'), + fetch_trigger='open' + ) + role_id = DynamicModelMultipleChoiceField( + queryset=Role.objects.all(), + required=False, + null_option='None', + label=_('Role'), + fetch_trigger='open' + ) + is_pool = forms.NullBooleanField( + required=False, + label=_('Is a pool'), + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + mark_utilized = forms.NullBooleanField( + required=False, + label=_('Marked as 100% utilized'), + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + tag = TagFilterField(model) + + +class IPRangeFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm): + model = IPRange + field_groups = [ + ['q', 'tag'], + ['family', 'vrf_id', 'status', 'role_id'], + ['tenant_group_id', 'tenant_id'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + family = forms.ChoiceField( + required=False, + choices=add_blank_choice(IPAddressFamilyChoices), + label=_('Address family'), + widget=StaticSelect() + ) + vrf_id = DynamicModelMultipleChoiceField( + queryset=VRF.objects.all(), + required=False, + label=_('Assigned VRF'), + null_option='Global', + fetch_trigger='open' + ) + status = forms.MultipleChoiceField( + choices=PrefixStatusChoices, + required=False, + widget=StaticSelectMultiple() + ) + role_id = DynamicModelMultipleChoiceField( + queryset=Role.objects.all(), + required=False, + null_option='None', + label=_('Role'), + fetch_trigger='open' + ) + tag = TagFilterField(model) + + +class IPAddressFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm): + model = IPAddress + field_order = [ + 'q', 'parent', 'family', 'mask_length', 'vrf_id', 'present_in_vrf_id', 'status', 'role', + 'assigned_to_interface', 'tenant_group_id', 'tenant_id', + ] + field_groups = [ + ['q', 'tag'], + ['parent', 'family', 'status', 'role', 'mask_length', 'assigned_to_interface'], + ['vrf_id', 'present_in_vrf_id'], + ['tenant_group_id', 'tenant_id'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + parent = forms.CharField( + required=False, + widget=forms.TextInput( + attrs={ + 'placeholder': 'Prefix', + } + ), + label='Parent Prefix' + ) + family = forms.ChoiceField( + required=False, + choices=add_blank_choice(IPAddressFamilyChoices), + label=_('Address family'), + widget=StaticSelect() + ) + mask_length = forms.ChoiceField( + required=False, + choices=IPADDRESS_MASK_LENGTH_CHOICES, + label=_('Mask length'), + widget=StaticSelect() + ) + vrf_id = DynamicModelMultipleChoiceField( + queryset=VRF.objects.all(), + required=False, + label=_('Assigned VRF'), + null_option='Global', + fetch_trigger='open' + ) + present_in_vrf_id = DynamicModelChoiceField( + queryset=VRF.objects.all(), + required=False, + label=_('Present in VRF'), + fetch_trigger='open' + ) + status = forms.MultipleChoiceField( + choices=IPAddressStatusChoices, + required=False, + widget=StaticSelectMultiple() + ) + role = forms.MultipleChoiceField( + choices=IPAddressRoleChoices, + required=False, + widget=StaticSelectMultiple() + ) + assigned_to_interface = forms.NullBooleanField( + required=False, + label=_('Assigned to an interface'), + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + tag = TagFilterField(model) + + +class VLANGroupFilterForm(BootstrapMixin, CustomFieldModelFilterForm): + field_groups = [ + ['q'], + ['region', 'sitegroup', 'site', 'location', 'rack'] + ] + model = VLANGroup + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + region = DynamicModelMultipleChoiceField( + queryset=Region.objects.all(), + required=False, + label=_('Region'), + fetch_trigger='open' + ) + sitegroup = DynamicModelMultipleChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + label=_('Site group'), + fetch_trigger='open' + ) + site = DynamicModelMultipleChoiceField( + queryset=Site.objects.all(), + required=False, + label=_('Site'), + fetch_trigger='open' + ) + location = DynamicModelMultipleChoiceField( + queryset=Location.objects.all(), + required=False, + label=_('Location'), + fetch_trigger='open' + ) + rack = DynamicModelMultipleChoiceField( + queryset=Rack.objects.all(), + required=False, + label=_('Rack'), + fetch_trigger='open' + ) + + +class VLANFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm): + model = VLAN + field_groups = [ + ['q', 'tag'], + ['region_id', 'site_group_id', 'site_id'], + ['group_id', 'status', 'role_id'], + ['tenant_group_id', 'tenant_id'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + region_id = DynamicModelMultipleChoiceField( + queryset=Region.objects.all(), + required=False, + label=_('Region'), + fetch_trigger='open' + ) + site_group_id = DynamicModelMultipleChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + label=_('Site group'), + fetch_trigger='open' + ) + site_id = DynamicModelMultipleChoiceField( + queryset=Site.objects.all(), + required=False, + null_option='None', + query_params={ + 'region': '$region' + }, + label=_('Site'), + fetch_trigger='open' + ) + group_id = DynamicModelMultipleChoiceField( + queryset=VLANGroup.objects.all(), + required=False, + null_option='None', + query_params={ + 'region': '$region' + }, + label=_('VLAN group'), + fetch_trigger='open' + ) + status = forms.MultipleChoiceField( + choices=VLANStatusChoices, + required=False, + widget=StaticSelectMultiple() + ) + role_id = DynamicModelMultipleChoiceField( + queryset=Role.objects.all(), + required=False, + null_option='None', + label=_('Role'), + fetch_trigger='open' + ) + tag = TagFilterField(model) + + +class ServiceFilterForm(BootstrapMixin, CustomFieldModelFilterForm): + model = Service + field_groups = ( + ('q', 'tag'), + ('protocol', 'port'), + ) + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + protocol = forms.ChoiceField( + choices=add_blank_choice(ServiceProtocolChoices), + required=False, + widget=StaticSelectMultiple() + ) + port = forms.IntegerField( + required=False, + ) + tag = TagFilterField(model) diff --git a/netbox/ipam/forms/models.py b/netbox/ipam/forms/models.py new file mode 100644 index 00000000000..d28f7b3aeb2 --- /dev/null +++ b/netbox/ipam/forms/models.py @@ -0,0 +1,691 @@ +from django import forms +from django.contrib.contenttypes.models import ContentType + +from dcim.models import Device, Interface, Location, Rack, Region, Site, SiteGroup +from extras.forms import CustomFieldModelForm +from extras.models import Tag +from ipam.constants import * +from ipam.models import * +from tenancy.forms import TenancyForm +from utilities.forms import ( + BootstrapMixin, ContentTypeChoiceField, DatePicker, DynamicModelChoiceField, DynamicModelMultipleChoiceField, + NumericArrayField, SlugField, StaticSelect, StaticSelectMultiple, +) +from virtualization.models import Cluster, ClusterGroup, VirtualMachine, VMInterface + +__all__ = ( + 'AggregateForm', + 'IPAddressAssignForm', + 'IPAddressBulkAddForm', + 'IPAddressForm', + 'IPRangeForm', + 'PrefixForm', + 'RIRForm', + 'RoleForm', + 'RouteTargetForm', + 'ServiceForm', + 'VLANForm', + 'VLANGroupForm', + 'VRFForm', +) + + +class VRFForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): + import_targets = DynamicModelMultipleChoiceField( + queryset=RouteTarget.objects.all(), + required=False + ) + export_targets = DynamicModelMultipleChoiceField( + queryset=RouteTarget.objects.all(), + required=False + ) + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = VRF + fields = [ + 'name', 'rd', 'enforce_unique', 'description', 'import_targets', 'export_targets', 'tenant_group', 'tenant', + 'tags', + ] + fieldsets = ( + ('VRF', ('name', 'rd', 'enforce_unique', 'description', 'tags')), + ('Route Targets', ('import_targets', 'export_targets')), + ('Tenancy', ('tenant_group', 'tenant')), + ) + labels = { + 'rd': "RD", + } + help_texts = { + 'rd': "Route distinguisher in any format", + } + + +class RouteTargetForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = RouteTarget + fields = [ + 'name', 'description', 'tenant_group', 'tenant', 'tags', + ] + fieldsets = ( + ('Route Target', ('name', 'description', 'tags')), + ('Tenancy', ('tenant_group', 'tenant')), + ) + + +class RIRForm(BootstrapMixin, CustomFieldModelForm): + slug = SlugField() + + class Meta: + model = RIR + fields = [ + 'name', 'slug', 'is_private', 'description', + ] + + +class AggregateForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): + rir = DynamicModelChoiceField( + queryset=RIR.objects.all(), + label='RIR' + ) + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = Aggregate + fields = [ + 'prefix', 'rir', 'date_added', 'description', 'tenant_group', 'tenant', 'tags', + ] + fieldsets = ( + ('Aggregate', ('prefix', 'rir', 'date_added', 'description', 'tags')), + ('Tenancy', ('tenant_group', 'tenant')), + ) + help_texts = { + 'prefix': "IPv4 or IPv6 network", + 'rir': "Regional Internet Registry responsible for this prefix", + } + widgets = { + 'date_added': DatePicker(), + } + + +class RoleForm(BootstrapMixin, CustomFieldModelForm): + slug = SlugField() + + class Meta: + model = Role + fields = [ + 'name', 'slug', 'weight', 'description', + ] + + +class PrefixForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): + vrf = DynamicModelChoiceField( + queryset=VRF.objects.all(), + required=False, + label='VRF' + ) + region = DynamicModelChoiceField( + queryset=Region.objects.all(), + required=False, + initial_params={ + 'sites': '$site' + } + ) + site_group = DynamicModelChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + initial_params={ + 'sites': '$site' + } + ) + site = DynamicModelChoiceField( + queryset=Site.objects.all(), + required=False, + null_option='None', + query_params={ + 'region_id': '$region', + 'group_id': '$site_group', + } + ) + vlan_group = DynamicModelChoiceField( + queryset=VLANGroup.objects.all(), + required=False, + label='VLAN group', + null_option='None', + query_params={ + 'site_id': '$site' + }, + initial_params={ + 'vlans': '$vlan' + } + ) + vlan = DynamicModelChoiceField( + queryset=VLAN.objects.all(), + required=False, + label='VLAN', + query_params={ + 'site_id': '$site', + 'group_id': '$vlan_group', + } + ) + role = DynamicModelChoiceField( + queryset=Role.objects.all(), + required=False + ) + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = Prefix + fields = [ + 'prefix', 'vrf', 'site', 'vlan', 'status', 'role', 'is_pool', 'mark_utilized', 'description', + 'tenant_group', 'tenant', 'tags', + ] + fieldsets = ( + ('Prefix', ('prefix', 'status', 'vrf', 'role', 'is_pool', 'mark_utilized', 'description', 'tags')), + ('Site/VLAN Assignment', ('region', 'site_group', 'site', 'vlan_group', 'vlan')), + ('Tenancy', ('tenant_group', 'tenant')), + ) + widgets = { + 'status': StaticSelect(), + } + + +class IPRangeForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): + vrf = DynamicModelChoiceField( + queryset=VRF.objects.all(), + required=False, + label='VRF' + ) + role = DynamicModelChoiceField( + queryset=Role.objects.all(), + required=False + ) + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = IPRange + fields = [ + 'vrf', 'start_address', 'end_address', 'status', 'role', 'description', 'tenant_group', 'tenant', 'tags', + ] + fieldsets = ( + ('IP Range', ('vrf', 'start_address', 'end_address', 'role', 'status', 'description', 'tags')), + ('Tenancy', ('tenant_group', 'tenant')), + ) + widgets = { + 'status': StaticSelect(), + } + + +class IPAddressForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): + device = DynamicModelChoiceField( + queryset=Device.objects.all(), + required=False, + initial_params={ + 'interfaces': '$interface' + } + ) + interface = DynamicModelChoiceField( + queryset=Interface.objects.all(), + required=False, + query_params={ + 'device_id': '$device' + } + ) + virtual_machine = DynamicModelChoiceField( + queryset=VirtualMachine.objects.all(), + required=False, + initial_params={ + 'interfaces': '$vminterface' + } + ) + vminterface = DynamicModelChoiceField( + queryset=VMInterface.objects.all(), + required=False, + label='Interface', + query_params={ + 'virtual_machine_id': '$virtual_machine' + } + ) + vrf = DynamicModelChoiceField( + queryset=VRF.objects.all(), + required=False, + label='VRF' + ) + nat_region = DynamicModelChoiceField( + queryset=Region.objects.all(), + required=False, + label='Region', + initial_params={ + 'sites': '$nat_site' + } + ) + nat_site_group = DynamicModelChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + label='Site group', + initial_params={ + 'sites': '$nat_site' + } + ) + nat_site = DynamicModelChoiceField( + queryset=Site.objects.all(), + required=False, + label='Site', + query_params={ + 'region_id': '$nat_region', + 'group_id': '$nat_site_group', + } + ) + nat_rack = DynamicModelChoiceField( + queryset=Rack.objects.all(), + required=False, + label='Rack', + null_option='None', + query_params={ + 'site_id': '$site' + } + ) + nat_device = DynamicModelChoiceField( + queryset=Device.objects.all(), + required=False, + label='Device', + query_params={ + 'site_id': '$site', + 'rack_id': '$nat_rack', + } + ) + nat_cluster = DynamicModelChoiceField( + queryset=Cluster.objects.all(), + required=False, + label='Cluster' + ) + nat_virtual_machine = DynamicModelChoiceField( + queryset=VirtualMachine.objects.all(), + required=False, + label='Virtual Machine', + query_params={ + 'cluster_id': '$nat_cluster', + } + ) + nat_vrf = DynamicModelChoiceField( + queryset=VRF.objects.all(), + required=False, + label='VRF' + ) + nat_inside = DynamicModelChoiceField( + queryset=IPAddress.objects.all(), + required=False, + label='IP Address', + query_params={ + 'device_id': '$nat_device', + 'virtual_machine_id': '$nat_virtual_machine', + 'vrf_id': '$nat_vrf', + } + ) + primary_for_parent = forms.BooleanField( + required=False, + label='Make this the primary IP for the device/VM' + ) + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = IPAddress + fields = [ + 'address', 'vrf', 'status', 'role', 'dns_name', 'description', 'primary_for_parent', 'nat_site', 'nat_rack', + 'nat_device', 'nat_cluster', 'nat_virtual_machine', 'nat_vrf', 'nat_inside', 'tenant_group', 'tenant', + 'tags', + ] + widgets = { + 'status': StaticSelect(), + 'role': StaticSelect(), + } + + def __init__(self, *args, **kwargs): + + # Initialize helper selectors + instance = kwargs.get('instance') + initial = kwargs.get('initial', {}).copy() + if instance: + if type(instance.assigned_object) is Interface: + initial['interface'] = instance.assigned_object + elif type(instance.assigned_object) is VMInterface: + initial['vminterface'] = instance.assigned_object + if instance.nat_inside: + nat_inside_parent = instance.nat_inside.assigned_object + if type(nat_inside_parent) is Interface: + initial['nat_site'] = nat_inside_parent.device.site.pk + if nat_inside_parent.device.rack: + initial['nat_rack'] = nat_inside_parent.device.rack.pk + initial['nat_device'] = nat_inside_parent.device.pk + elif type(nat_inside_parent) is VMInterface: + initial['nat_cluster'] = nat_inside_parent.virtual_machine.cluster.pk + initial['nat_virtual_machine'] = nat_inside_parent.virtual_machine.pk + kwargs['initial'] = initial + + super().__init__(*args, **kwargs) + + # Initialize primary_for_parent if IP address is already assigned + if self.instance.pk and self.instance.assigned_object: + parent = self.instance.assigned_object.parent_object + if ( + self.instance.address.version == 4 and parent.primary_ip4_id == self.instance.pk or + self.instance.address.version == 6 and parent.primary_ip6_id == self.instance.pk + ): + self.initial['primary_for_parent'] = True + + def clean(self): + super().clean() + + # Cannot select both a device interface and a VM interface + if self.cleaned_data.get('interface') and self.cleaned_data.get('vminterface'): + raise forms.ValidationError("Cannot select both a device interface and a virtual machine interface") + self.instance.assigned_object = self.cleaned_data.get('interface') or self.cleaned_data.get('vminterface') + + # Primary IP assignment is only available if an interface has been assigned. + interface = self.cleaned_data.get('interface') or self.cleaned_data.get('vminterface') + if self.cleaned_data.get('primary_for_parent') and not interface: + self.add_error( + 'primary_for_parent', "Only IP addresses assigned to an interface can be designated as primary IPs." + ) + + def save(self, *args, **kwargs): + ipaddress = super().save(*args, **kwargs) + + # Assign/clear this IPAddress as the primary for the associated Device/VirtualMachine. + interface = self.instance.assigned_object + if interface: + parent = interface.parent_object + if self.cleaned_data['primary_for_parent']: + if ipaddress.address.version == 4: + parent.primary_ip4 = ipaddress + else: + parent.primary_ip6 = ipaddress + parent.save() + elif ipaddress.address.version == 4 and parent.primary_ip4 == ipaddress: + parent.primary_ip4 = None + parent.save() + elif ipaddress.address.version == 6 and parent.primary_ip6 == ipaddress: + parent.primary_ip6 = None + parent.save() + + return ipaddress + + +class IPAddressBulkAddForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): + vrf = DynamicModelChoiceField( + queryset=VRF.objects.all(), + required=False, + label='VRF' + ) + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = IPAddress + fields = [ + 'address', 'vrf', 'status', 'role', 'dns_name', 'description', 'tenant_group', 'tenant', 'tags', + ] + widgets = { + 'status': StaticSelect(), + 'role': StaticSelect(), + } + + +class IPAddressAssignForm(BootstrapMixin, forms.Form): + vrf_id = DynamicModelChoiceField( + queryset=VRF.objects.all(), + required=False, + label='VRF' + ) + q = forms.CharField( + required=False, + label='Search', + ) + + +class VLANGroupForm(BootstrapMixin, CustomFieldModelForm): + scope_type = ContentTypeChoiceField( + queryset=ContentType.objects.filter(model__in=VLANGROUP_SCOPE_TYPES), + required=False, + widget=StaticSelect + ) + region = DynamicModelChoiceField( + queryset=Region.objects.all(), + required=False, + initial_params={ + 'sites': '$site' + } + ) + sitegroup = DynamicModelChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + initial_params={ + 'sites': '$site' + }, + label='Site group' + ) + site = DynamicModelChoiceField( + queryset=Site.objects.all(), + required=False, + initial_params={ + 'locations': '$location' + }, + query_params={ + 'region_id': '$region', + 'group_id': '$sitegroup', + } + ) + location = DynamicModelChoiceField( + queryset=Location.objects.all(), + required=False, + initial_params={ + 'racks': '$rack' + }, + query_params={ + 'site_id': '$site', + } + ) + rack = DynamicModelChoiceField( + queryset=Rack.objects.all(), + required=False, + query_params={ + 'site_id': '$site', + 'location_id': '$location', + } + ) + clustergroup = DynamicModelChoiceField( + queryset=ClusterGroup.objects.all(), + required=False, + initial_params={ + 'clusters': '$cluster' + }, + label='Cluster group' + ) + cluster = DynamicModelChoiceField( + queryset=Cluster.objects.all(), + required=False, + query_params={ + 'group_id': '$clustergroup', + } + ) + slug = SlugField() + + class Meta: + model = VLANGroup + fields = [ + 'name', 'slug', 'description', 'scope_type', 'region', 'sitegroup', 'site', 'location', 'rack', + 'clustergroup', 'cluster', + ] + fieldsets = ( + ('VLAN Group', ('name', 'slug', 'description')), + ('Scope', ('scope_type', 'region', 'sitegroup', 'site', 'location', 'rack', 'clustergroup', 'cluster')), + ) + widgets = { + 'scope_type': StaticSelect, + } + + def __init__(self, *args, **kwargs): + instance = kwargs.get('instance') + initial = kwargs.get('initial', {}) + + if instance is not None and instance.scope: + initial[instance.scope_type.model] = instance.scope + + kwargs['initial'] = initial + + super().__init__(*args, **kwargs) + + def clean(self): + super().clean() + + # Assign scope based on scope_type + if self.cleaned_data.get('scope_type'): + scope_field = self.cleaned_data['scope_type'].model + self.instance.scope = self.cleaned_data.get(scope_field) + else: + self.instance.scope_id = None + + +class VLANForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): + # VLANGroup assignment fields + scope_type = forms.ChoiceField( + choices=( + ('', ''), + ('dcim.region', 'Region'), + ('dcim.sitegroup', 'Site group'), + ('dcim.site', 'Site'), + ('dcim.location', 'Location'), + ('dcim.rack', 'Rack'), + ('virtualization.clustergroup', 'Cluster group'), + ('virtualization.cluster', 'Cluster'), + ), + required=False, + widget=StaticSelect, + label='Group scope' + ) + group = DynamicModelChoiceField( + queryset=VLANGroup.objects.all(), + required=False, + query_params={ + 'scope_type': '$scope_type', + }, + label='VLAN Group' + ) + + # Site assignment fields + region = DynamicModelChoiceField( + queryset=Region.objects.all(), + required=False, + initial_params={ + 'sites': '$site' + }, + label='Region' + ) + sitegroup = DynamicModelChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + initial_params={ + 'sites': '$site' + }, + label='Site group' + ) + site = DynamicModelChoiceField( + queryset=Site.objects.all(), + required=False, + null_option='None', + query_params={ + 'region_id': '$region', + 'group_id': '$sitegroup', + } + ) + + # Other fields + role = DynamicModelChoiceField( + queryset=Role.objects.all(), + required=False + ) + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = VLAN + fields = [ + 'site', 'group', 'vid', 'name', 'status', 'role', 'description', 'tenant_group', 'tenant', 'tags', + ] + help_texts = { + 'site': "Leave blank if this VLAN spans multiple sites", + 'group': "VLAN group (optional)", + 'vid': "Configured VLAN ID", + 'name': "Configured VLAN name", + 'status': "Operational status of this VLAN", + 'role': "The primary function of this VLAN", + } + widgets = { + 'status': StaticSelect(), + } + + +class ServiceForm(BootstrapMixin, CustomFieldModelForm): + ports = NumericArrayField( + base_field=forms.IntegerField( + min_value=SERVICE_PORT_MIN, + max_value=SERVICE_PORT_MAX + ), + help_text="Comma-separated list of one or more port numbers. A range may be specified using a hyphen." + ) + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = Service + fields = [ + 'name', 'protocol', 'ports', 'ipaddresses', 'description', 'tags', + ] + help_texts = { + 'ipaddresses': "IP address assignment is optional. If no IPs are selected, the service is assumed to be " + "reachable via all IPs assigned to the device.", + } + widgets = { + 'protocol': StaticSelect(), + 'ipaddresses': StaticSelectMultiple(), + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Limit IP address choices to those assigned to interfaces of the parent device/VM + if self.instance.device: + self.fields['ipaddresses'].queryset = IPAddress.objects.filter( + interface__in=self.instance.device.vc_interfaces().values_list('id', flat=True) + ) + elif self.instance.virtual_machine: + self.fields['ipaddresses'].queryset = IPAddress.objects.filter( + vminterface__in=self.instance.virtual_machine.interfaces.values_list('id', flat=True) + ) + else: + self.fields['ipaddresses'].choices = [] diff --git a/netbox/ipam/models/ip.py b/netbox/ipam/models/ip.py index 3e2e671caa2..4fc2b5dbb59 100644 --- a/netbox/ipam/models/ip.py +++ b/netbox/ipam/models/ip.py @@ -487,11 +487,9 @@ class Prefix(PrimaryModel): utilization = int(float(child_prefixes.size) / self.prefix.size * 100) else: # Compile an IPSet to avoid counting duplicate IPs - child_ips = netaddr.IPSet() - for iprange in self.get_child_ranges(): - child_ips.add(iprange.range) - for ip in self.get_child_ips(): - child_ips.add(ip.address.ip) + child_ips = netaddr.IPSet( + [_.range for _ in self.get_child_ranges()] + [_.address.ip for _ in self.get_child_ips()] + ) prefix_size = self.prefix.size if self.prefix.version == 4 and self.prefix.prefixlen < 31 and not self.is_pool: @@ -600,6 +598,11 @@ class IPRange(PrimaryModel): if overlapping_range: raise ValidationError(f"Defined addresses overlap with range {overlapping_range} in VRF {self.vrf}") + # Validate maximum size + MAX_SIZE = 2 ** 32 - 1 + if int(self.end_address.ip - self.start_address.ip) + 1 > MAX_SIZE: + raise ValidationError(f"Defined range exceeds maximum supported size ({MAX_SIZE})") + def save(self, *args, **kwargs): # Record the range's size (number of IP addresses) diff --git a/netbox/ipam/tables/ip.py b/netbox/ipam/tables/ip.py index 2e59a681c64..57adbb1b8e4 100644 --- a/netbox/ipam/tables/ip.py +++ b/netbox/ipam/tables/ip.py @@ -318,7 +318,8 @@ class IPAddressTable(BaseTable): verbose_name='NAT (Inside)' ) assigned = BooleanColumn( - accessor='assigned_object_id', + accessor='assigned_object', + linkify=True, verbose_name='Assigned' ) tags = TagColumn( diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index a720eb484c9..15680bea0bd 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -16,7 +16,7 @@ from django.core.validators import URLValidator # Environment setup # -VERSION = '3.0.3' +VERSION = '3.0.4' # Hostname HOSTNAME = platform.node() diff --git a/netbox/netbox/views/generic.py b/netbox/netbox/views/generic.py index b0503312827..41a8cee256f 100644 --- a/netbox/netbox/views/generic.py +++ b/netbox/netbox/views/generic.py @@ -824,14 +824,14 @@ class BulkEditView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): if form.cleaned_data[name]: getattr(obj, name).set(form.cleaned_data[name]) # Normal fields - elif form.cleaned_data[name] not in (None, '', []): + elif name in form.changed_data: setattr(obj, name, form.cleaned_data[name]) # Update custom fields for name in custom_fields: if name in form.nullable_fields and name in nullified_fields: obj.custom_field_data[name] = None - elif form.cleaned_data.get(name) not in (None, ''): + elif name in form.changed_data: obj.custom_field_data[name] = form.cleaned_data[name] obj.full_clean() @@ -1100,6 +1100,7 @@ class ComponentCreateView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View form = self.form(initial=request.GET) return render(request, self.template_name, { + 'obj': self.queryset.model(), 'obj_type': self.queryset.model._meta.verbose_name, 'form': form, 'return_url': self.get_return_url(request), diff --git a/netbox/project-static/dist/netbox.js b/netbox/project-static/dist/netbox.js index 0b93ac20f57..d4be77e3273 100644 --- a/netbox/project-static/dist/netbox.js +++ b/netbox/project-static/dist/netbox.js @@ -1,12 +1,12 @@ -(()=>{var rb=Object.create;var ei=Object.defineProperty,ob=Object.defineProperties,sb=Object.getOwnPropertyDescriptor,ab=Object.getOwnPropertyDescriptors,lb=Object.getOwnPropertyNames,Vl=Object.getOwnPropertySymbols,cb=Object.getPrototypeOf,Yl=Object.prototype.hasOwnProperty,ub=Object.prototype.propertyIsEnumerable;var Wo=(t,e,n)=>e in t?ei(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,K=(t,e)=>{for(var n in e||(e={}))Yl.call(e,n)&&Wo(t,n,e[n]);if(Vl)for(var n of Vl(e))ub.call(e,n)&&Wo(t,n,e[n]);return t},tr=(t,e)=>ob(t,ab(e)),Ul=t=>ei(t,"__esModule",{value:!0});var x=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),db=(t,e)=>{Ul(t);for(var n in e)ei(t,n,{get:e[n],enumerable:!0})},fb=(t,e,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of lb(e))!Yl.call(t,i)&&i!=="default"&&ei(t,i,{get:()=>e[i],enumerable:!(n=sb(e,i))||n.enumerable});return t},Le=t=>fb(Ul(ei(t!=null?rb(cb(t)):{},"default",t&&t.__esModule&&"default"in t?{get:()=>t.default,enumerable:!0}:{value:t,enumerable:!0})),t);var Q=(t,e,n)=>(Wo(t,typeof e!="symbol"?e+"":e,n),n);var Ne=(t,e,n)=>new Promise((i,o)=>{var s=d=>{try{c(n.next(d))}catch(u){o(u)}},a=d=>{try{c(n.throw(d))}catch(u){o(u)}},c=d=>d.done?i(d.value):Promise.resolve(d.value).then(s,a);c((n=n.apply(t,e)).next())});var de=x((AP,Cu)=>{var Or=function(t){return t&&t.Math==Math&&t};Cu.exports=Or(typeof globalThis=="object"&&globalThis)||Or(typeof window=="object"&&window)||Or(typeof self=="object"&&self)||Or(typeof global=="object"&&global)||function(){return this}()||Function("return this")()});var ye=x((CP,Lu)=>{Lu.exports=function(t){try{return!!t()}catch(e){return!0}}});var Rt=x((LP,Du)=>{var dS=ye();Du.exports=!dS(function(){return Object.defineProperty({},1,{get:function(){return 7}})[1]!=7})});var xs=x(ku=>{"use strict";var Mu={}.propertyIsEnumerable,Iu=Object.getOwnPropertyDescriptor,fS=Iu&&!Mu.call({1:2},1);ku.f=fS?function(e){var n=Iu(this,e);return!!n&&n.enumerable}:Mu});var Ar=x((MP,Pu)=>{Pu.exports=function(t,e){return{enumerable:!(t&1),configurable:!(t&2),writable:!(t&4),value:e}}});var Nn=x((IP,Nu)=>{var hS={}.toString;Nu.exports=function(t){return hS.call(t).slice(8,-1)}});var Ti=x((kP,Ru)=>{var pS=ye(),mS=Nn(),gS="".split;Ru.exports=pS(function(){return!Object("z").propertyIsEnumerable(0)})?function(t){return mS(t)=="String"?gS.call(t,""):Object(t)}:Object});var un=x((PP,ju)=>{ju.exports=function(t){if(t==null)throw TypeError("Can't call method on "+t);return t}});var Rn=x((NP,Hu)=>{var vS=Ti(),bS=un();Hu.exports=function(t){return vS(bS(t))}});var He=x((RP,qu)=>{qu.exports=function(t){return typeof t=="object"?t!==null:typeof t=="function"}});var xi=x((jP,$u)=>{var Os=de(),yS=function(t){return typeof t=="function"?t:void 0};$u.exports=function(t,e){return arguments.length<2?yS(Os[t]):Os[t]&&Os[t][e]}});var Bu=x((HP,Fu)=>{var ES=xi();Fu.exports=ES("navigator","userAgent")||""});var Lr=x((qP,Ku)=>{var zu=de(),As=Bu(),Wu=zu.process,Vu=zu.Deno,Yu=Wu&&Wu.versions||Vu&&Vu.version,Uu=Yu&&Yu.v8,nt,Cr;Uu?(nt=Uu.split("."),Cr=nt[0]<4?1:nt[0]+nt[1]):As&&(nt=As.match(/Edge\/(\d+)/),(!nt||nt[1]>=74)&&(nt=As.match(/Chrome\/(\d+)/),nt&&(Cr=nt[1])));Ku.exports=Cr&&+Cr});var Cs=x(($P,Xu)=>{var Gu=Lr(),_S=ye();Xu.exports=!!Object.getOwnPropertySymbols&&!_S(function(){var t=Symbol();return!String(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&Gu&&Gu<41})});var Ls=x((FP,Qu)=>{var SS=Cs();Qu.exports=SS&&!Symbol.sham&&typeof Symbol.iterator=="symbol"});var Dr=x((BP,Ju)=>{var wS=xi(),TS=Ls();Ju.exports=TS?function(t){return typeof t=="symbol"}:function(t){var e=wS("Symbol");return typeof e=="function"&&Object(t)instanceof e}});var ed=x((zP,Zu)=>{var Ds=He();Zu.exports=function(t,e){var n,i;if(e==="string"&&typeof(n=t.toString)=="function"&&!Ds(i=n.call(t))||typeof(n=t.valueOf)=="function"&&!Ds(i=n.call(t))||e!=="string"&&typeof(n=t.toString)=="function"&&!Ds(i=n.call(t)))return i;throw TypeError("Can't convert object to primitive value")}});var Mr=x((WP,td)=>{td.exports=!1});var Ir=x((VP,id)=>{var nd=de();id.exports=function(t,e){try{Object.defineProperty(nd,t,{value:e,configurable:!0,writable:!0})}catch(n){nd[t]=e}return e}});var kr=x((YP,od)=>{var xS=de(),OS=Ir(),rd="__core-js_shared__",AS=xS[rd]||OS(rd,{});od.exports=AS});var Pr=x((UP,ad)=>{var CS=Mr(),sd=kr();(ad.exports=function(t,e){return sd[t]||(sd[t]=e!==void 0?e:{})})("versions",[]).push({version:"3.16.4",mode:CS?"pure":"global",copyright:"\xA9 2021 Denis Pushkarev (zloirock.ru)"})});var dn=x((KP,ld)=>{var LS=un();ld.exports=function(t){return Object(LS(t))}});var We=x((GP,cd)=>{var DS=dn(),MS={}.hasOwnProperty;cd.exports=Object.hasOwn||function(e,n){return MS.call(DS(e),n)}});var Nr=x((XP,ud)=>{var IS=0,kS=Math.random();ud.exports=function(t){return"Symbol("+String(t===void 0?"":t)+")_"+(++IS+kS).toString(36)}});var Se=x((QP,hd)=>{var PS=de(),NS=Pr(),dd=We(),RS=Nr(),fd=Cs(),jS=Ls(),Oi=NS("wks"),Ai=PS.Symbol,HS=jS?Ai:Ai&&Ai.withoutSetter||RS;hd.exports=function(t){return(!dd(Oi,t)||!(fd||typeof Oi[t]=="string"))&&(fd&&dd(Ai,t)?Oi[t]=Ai[t]:Oi[t]=HS("Symbol."+t)),Oi[t]}});var vd=x((JP,gd)=>{var pd=He(),md=Dr(),qS=ed(),$S=Se(),FS=$S("toPrimitive");gd.exports=function(t,e){if(!pd(t)||md(t))return t;var n=t[FS],i;if(n!==void 0){if(e===void 0&&(e="default"),i=n.call(t,e),!pd(i)||md(i))return i;throw TypeError("Can't convert object to primitive value")}return e===void 0&&(e="number"),qS(t,e)}});var Ms=x((ZP,bd)=>{var BS=vd(),zS=Dr();bd.exports=function(t){var e=BS(t,"string");return zS(e)?e:String(e)}});var ks=x((eN,Ed)=>{var WS=de(),yd=He(),Is=WS.document,VS=yd(Is)&&yd(Is.createElement);Ed.exports=function(t){return VS?Is.createElement(t):{}}});var Ps=x((tN,_d)=>{var YS=Rt(),US=ye(),KS=ks();_d.exports=!YS&&!US(function(){return Object.defineProperty(KS("div"),"a",{get:function(){return 7}}).a!=7})});var Ns=x(wd=>{var GS=Rt(),XS=xs(),QS=Ar(),JS=Rn(),ZS=Ms(),ew=We(),tw=Ps(),Sd=Object.getOwnPropertyDescriptor;wd.f=GS?Sd:function(e,n){if(e=JS(e),n=ZS(n),tw)try{return Sd(e,n)}catch(i){}if(ew(e,n))return QS(!XS.f.call(e,n),e[n])}});var qe=x((iN,Td)=>{var nw=He();Td.exports=function(t){if(!nw(t))throw TypeError(String(t)+" is not an object");return t}});var jt=x(Ad=>{var iw=Rt(),rw=Ps(),xd=qe(),ow=Ms(),Od=Object.defineProperty;Ad.f=iw?Od:function(e,n,i){if(xd(e),n=ow(n),xd(i),rw)try{return Od(e,n,i)}catch(o){}if("get"in i||"set"in i)throw TypeError("Accessors not supported");return"value"in i&&(e[n]=i.value),e}});var St=x((oN,Cd)=>{var sw=Rt(),aw=jt(),lw=Ar();Cd.exports=sw?function(t,e,n){return aw.f(t,e,lw(1,n))}:function(t,e,n){return t[e]=n,t}});var js=x((sN,Ld)=>{var Rs=kr(),cw=Function.toString;typeof Rs.inspectSource!="function"&&(Rs.inspectSource=function(t){return cw.call(t)});Ld.exports=Rs.inspectSource});var Hs=x((aN,Md)=>{var uw=de(),dw=js(),Dd=uw.WeakMap;Md.exports=typeof Dd=="function"&&/native code/.test(dw(Dd))});var Rr=x((lN,kd)=>{var fw=Pr(),hw=Nr(),Id=fw("keys");kd.exports=function(t){return Id[t]||(Id[t]=hw(t))}});var Ci=x((cN,Pd)=>{Pd.exports={}});var hn=x((uN,Hd)=>{var pw=Hs(),mw=de(),gw=He(),vw=St(),qs=We(),$s=kr(),bw=Rr(),yw=Ci(),Nd="Object already initialized",Ew=mw.WeakMap,jr,Li,Hr,_w=function(t){return Hr(t)?Li(t):jr(t,{})},Sw=function(t){return function(e){var n;if(!gw(e)||(n=Li(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return n}};pw||$s.state?(Ht=$s.state||($s.state=new Ew),Rd=Ht.get,Fs=Ht.has,jd=Ht.set,jr=function(t,e){if(Fs.call(Ht,t))throw new TypeError(Nd);return e.facade=t,jd.call(Ht,t,e),e},Li=function(t){return Rd.call(Ht,t)||{}},Hr=function(t){return Fs.call(Ht,t)}):(fn=bw("state"),yw[fn]=!0,jr=function(t,e){if(qs(t,fn))throw new TypeError(Nd);return e.facade=t,vw(t,fn,e),e},Li=function(t){return qs(t,fn)?t[fn]:{}},Hr=function(t){return qs(t,fn)});var Ht,Rd,Fs,jd,fn;Hd.exports={set:jr,get:Li,has:Hr,enforce:_w,getterFor:Sw}});var pn=x((dN,Fd)=>{var ww=de(),qd=St(),Tw=We(),xw=Ir(),Ow=js(),$d=hn(),Aw=$d.get,Cw=$d.enforce,Lw=String(String).split("String");(Fd.exports=function(t,e,n,i){var o=i?!!i.unsafe:!1,s=i?!!i.enumerable:!1,a=i?!!i.noTargetGet:!1,c;if(typeof n=="function"&&(typeof e=="string"&&!Tw(n,"name")&&qd(n,"name",e),c=Cw(n),c.source||(c.source=Lw.join(typeof e=="string"?e:""))),t===ww){s?t[e]=n:xw(e,n);return}else o?!a&&t[e]&&(s=!0):delete t[e];s?t[e]=n:qd(t,e,n)})(Function.prototype,"toString",function(){return typeof this=="function"&&Aw(this).source||Ow(this)})});var Di=x((fN,Bd)=>{var Dw=Math.ceil,Mw=Math.floor;Bd.exports=function(t){return isNaN(t=+t)?0:(t>0?Mw:Dw)(t)}});var mn=x((hN,zd)=>{var Iw=Di(),kw=Math.min;zd.exports=function(t){return t>0?kw(Iw(t),9007199254740991):0}});var Vd=x((pN,Wd)=>{var Pw=Di(),Nw=Math.max,Rw=Math.min;Wd.exports=function(t,e){var n=Pw(t);return n<0?Nw(n+e,0):Rw(n,e)}});var Kd=x((mN,Ud)=>{var jw=Rn(),Hw=mn(),qw=Vd(),Yd=function(t){return function(e,n,i){var o=jw(e),s=Hw(o.length),a=qw(i,s),c;if(t&&n!=n){for(;s>a;)if(c=o[a++],c!=c)return!0}else for(;s>a;a++)if((t||a in o)&&o[a]===n)return t||a||0;return!t&&-1}};Ud.exports={includes:Yd(!0),indexOf:Yd(!1)}});var zs=x((gN,Gd)=>{var Bs=We(),$w=Rn(),Fw=Kd().indexOf,Bw=Ci();Gd.exports=function(t,e){var n=$w(t),i=0,o=[],s;for(s in n)!Bs(Bw,s)&&Bs(n,s)&&o.push(s);for(;e.length>i;)Bs(n,s=e[i++])&&(~Fw(o,s)||o.push(s));return o}});var qr=x((vN,Xd)=>{Xd.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]});var $r=x(Qd=>{var zw=zs(),Ww=qr(),Vw=Ww.concat("length","prototype");Qd.f=Object.getOwnPropertyNames||function(e){return zw(e,Vw)}});var Ws=x(Jd=>{Jd.f=Object.getOwnPropertySymbols});var ef=x((EN,Zd)=>{var Yw=xi(),Uw=$r(),Kw=Ws(),Gw=qe();Zd.exports=Yw("Reflect","ownKeys")||function(e){var n=Uw.f(Gw(e)),i=Kw.f;return i?n.concat(i(e)):n}});var nf=x((_N,tf)=>{var Xw=We(),Qw=ef(),Jw=Ns(),Zw=jt();tf.exports=function(t,e){for(var n=Qw(e),i=Zw.f,o=Jw.f,s=0;s{var eT=ye(),tT=/#|\.prototype\./,Mi=function(t,e){var n=iT[nT(t)];return n==oT?!0:n==rT?!1:typeof e=="function"?eT(e):!!e},nT=Mi.normalize=function(t){return String(t).replace(tT,".").toLowerCase()},iT=Mi.data={},rT=Mi.NATIVE="N",oT=Mi.POLYFILL="P";rf.exports=Mi});var it=x((wN,of)=>{var Ys=de(),sT=Ns().f,aT=St(),lT=pn(),cT=Ir(),uT=nf(),dT=Vs();of.exports=function(t,e){var n=t.target,i=t.global,o=t.stat,s,a,c,d,u,l;if(i?a=Ys:o?a=Ys[n]||cT(n,{}):a=(Ys[n]||{}).prototype,a)for(c in e){if(u=e[c],t.noTargetGet?(l=sT(a,c),d=l&&l.value):d=a[c],s=dT(i?c:n+(o?".":"#")+c,t.forced),!s&&d!==void 0){if(typeof u==typeof d)continue;uT(u,d)}(t.sham||d&&d.sham)&&aT(u,"sham",!0),lT(a,c,u,t)}}});var Us=x((TN,sf)=>{sf.exports=function(t){if(typeof t!="function")throw TypeError(String(t)+" is not a function");return t}});var Ks=x((xN,af)=>{var fT=Us();af.exports=function(t,e,n){if(fT(t),e===void 0)return t;switch(n){case 0:return function(){return t.call(e)};case 1:return function(i){return t.call(e,i)};case 2:return function(i,o){return t.call(e,i,o)};case 3:return function(i,o,s){return t.call(e,i,o,s)}}return function(){return t.apply(e,arguments)}}});var cf=x((ON,lf)=>{var hT=Nn();lf.exports=Array.isArray||function(e){return hT(e)=="Array"}});var ff=x((AN,df)=>{var pT=He(),uf=cf(),mT=Se(),gT=mT("species");df.exports=function(t){var e;return uf(t)&&(e=t.constructor,typeof e=="function"&&(e===Array||uf(e.prototype))?e=void 0:pT(e)&&(e=e[gT],e===null&&(e=void 0))),e===void 0?Array:e}});var pf=x((CN,hf)=>{var vT=ff();hf.exports=function(t,e){return new(vT(t))(e===0?0:e)}});var Fr=x((LN,gf)=>{var bT=Ks(),yT=Ti(),ET=dn(),_T=mn(),ST=pf(),mf=[].push,qt=function(t){var e=t==1,n=t==2,i=t==3,o=t==4,s=t==6,a=t==7,c=t==5||s;return function(d,u,l,m){for(var f=ET(d),p=yT(f),g=bT(u,l,3),v=_T(p.length),h=0,y=m||ST,_=e?y(d,v):n||a?y(d,0):void 0,A,O;v>h;h++)if((c||h in p)&&(A=p[h],O=g(A,h,f),t))if(e)_[h]=O;else if(O)switch(t){case 3:return!0;case 5:return A;case 6:return h;case 2:mf.call(_,A)}else switch(t){case 4:return!1;case 7:mf.call(_,A)}return s?-1:i||o?o:_}};gf.exports={forEach:qt(0),map:qt(1),filter:qt(2),some:qt(3),every:qt(4),find:qt(5),findIndex:qt(6),filterReject:qt(7)}});var Gs=x((DN,vf)=>{"use strict";var wT=ye();vf.exports=function(t,e){var n=[][t];return!!n&&wT(function(){n.call(null,e||function(){throw 1},1)})}});var Xs=x((MN,bf)=>{"use strict";var TT=Fr().forEach,xT=Gs(),OT=xT("forEach");bf.exports=OT?[].forEach:function(e){return TT(this,e,arguments.length>1?arguments[1]:void 0)}});var Qs=x((kN,Ef)=>{Ef.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}});var wf=x((NN,Sf)=>{var MT=!!(typeof window!="undefined"&&window.document&&window.document.createElement);Sf.exports=MT});var xf=x((RN,Tf)=>{var IT=ye(),kT=Se(),PT=Lr(),NT=kT("species");Tf.exports=function(t){return PT>=51||!IT(function(){var e=[],n=e.constructor={};return n[NT]=function(){return{foo:1}},e[t](Boolean).foo!==1})}});var ea=x((HN,Of)=>{var $T=zs(),FT=qr();Of.exports=Object.keys||function(e){return $T(e,FT)}});var Cf=x((qN,Af)=>{var BT=Rt(),zT=jt(),WT=qe(),VT=ea();Af.exports=BT?Object.defineProperties:function(e,n){WT(e);for(var i=VT(n),o=i.length,s=0,a;o>s;)zT.f(e,a=i[s++],n[a]);return e}});var Df=x(($N,Lf)=>{var YT=xi();Lf.exports=YT("document","documentElement")});var Wr=x((FN,jf)=>{var UT=qe(),KT=Cf(),Mf=qr(),GT=Ci(),XT=Df(),QT=ks(),JT=Rr(),If=">",kf="<",ta="prototype",na="script",Pf=JT("IE_PROTO"),ia=function(){},Nf=function(t){return kf+na+If+t+kf+"/"+na+If},Rf=function(t){t.write(Nf("")),t.close();var e=t.parentWindow.Object;return t=null,e},ZT=function(){var t=QT("iframe"),e="java"+na+":",n;return t.style.display="none",XT.appendChild(t),t.src=String(e),n=t.contentWindow.document,n.open(),n.write(Nf("document.F=Object")),n.close(),n.F},Br,zr=function(){try{Br=new ActiveXObject("htmlfile")}catch(e){}zr=typeof document!="undefined"?document.domain&&Br?Rf(Br):ZT():Rf(Br);for(var t=Mf.length;t--;)delete zr[ta][Mf[t]];return zr()};GT[Pf]=!0;jf.exports=Object.create||function(e,n){var i;return e!==null?(ia[ta]=UT(e),i=new ia,ia[ta]=null,i[Pf]=e):i=zr(),n===void 0?i:KT(i,n)}});var qf=x((BN,Hf)=>{var ex=Se(),tx=Wr(),nx=jt(),ra=ex("unscopables"),oa=Array.prototype;oa[ra]==null&&nx.f(oa,ra,{configurable:!0,value:tx(null)});Hf.exports=function(t){oa[ra][t]=!0}});var jn=x((zN,$f)=>{$f.exports={}});var Bf=x((WN,Ff)=>{var ix=ye();Ff.exports=!ix(function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype})});var sa=x((VN,Wf)=>{var rx=We(),ox=dn(),sx=Rr(),ax=Bf(),zf=sx("IE_PROTO"),lx=Object.prototype;Wf.exports=ax?Object.getPrototypeOf:function(t){return t=ox(t),rx(t,zf)?t[zf]:typeof t.constructor=="function"&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?lx:null}});var ua=x((YN,Kf)=>{"use strict";var cx=ye(),Vf=sa(),ux=St(),dx=We(),fx=Se(),hx=Mr(),aa=fx("iterator"),Yf=!1,px=function(){return this},gn,la,ca;[].keys&&(ca=[].keys(),"next"in ca?(la=Vf(Vf(ca)),la!==Object.prototype&&(gn=la)):Yf=!0);var Uf=gn==null||cx(function(){var t={};return gn[aa].call(t)!==t});Uf&&(gn={});(!hx||Uf)&&!dx(gn,aa)&&ux(gn,aa,px);Kf.exports={IteratorPrototype:gn,BUGGY_SAFARI_ITERATORS:Yf}});var Vr=x((UN,Xf)=>{var mx=jt().f,gx=We(),vx=Se(),Gf=vx("toStringTag");Xf.exports=function(t,e,n){t&&!gx(t=n?t:t.prototype,Gf)&&mx(t,Gf,{configurable:!0,value:e})}});var Jf=x((KN,Qf)=>{"use strict";var bx=ua().IteratorPrototype,yx=Wr(),Ex=Ar(),_x=Vr(),Sx=jn(),wx=function(){return this};Qf.exports=function(t,e,n){var i=e+" Iterator";return t.prototype=yx(bx,{next:Ex(1,n)}),_x(t,i,!1,!0),Sx[i]=wx,t}});var eh=x((GN,Zf)=>{var Tx=He();Zf.exports=function(t){if(!Tx(t)&&t!==null)throw TypeError("Can't set "+String(t)+" as a prototype");return t}});var da=x((XN,th)=>{var xx=qe(),Ox=eh();th.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var t=!1,e={},n;try{n=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set,n.call(e,[]),t=e instanceof Array}catch(i){}return function(o,s){return xx(o),Ox(s),t?n.call(o,s):o.__proto__=s,o}}():void 0)});var pa=x((QN,uh)=>{"use strict";var Ax=it(),Cx=Jf(),nh=sa(),ih=da(),Lx=Vr(),rh=St(),Dx=pn(),Mx=Se(),fa=Mr(),oh=jn(),sh=ua(),ha=sh.IteratorPrototype,Yr=sh.BUGGY_SAFARI_ITERATORS,ki=Mx("iterator"),ah="keys",Ur="values",lh="entries",ch=function(){return this};uh.exports=function(t,e,n,i,o,s,a){Cx(n,e,i);var c=function(y){if(y===o&&f)return f;if(!Yr&&y in l)return l[y];switch(y){case ah:return function(){return new n(this,y)};case Ur:return function(){return new n(this,y)};case lh:return function(){return new n(this,y)}}return function(){return new n(this)}},d=e+" Iterator",u=!1,l=t.prototype,m=l[ki]||l["@@iterator"]||o&&l[o],f=!Yr&&m||c(o),p=e=="Array"&&l.entries||m,g,v,h;if(p&&(g=nh(p.call(new t)),ha!==Object.prototype&&g.next&&(!fa&&nh(g)!==ha&&(ih?ih(g,ha):typeof g[ki]!="function"&&rh(g,ki,ch)),Lx(g,d,!0,!0),fa&&(oh[d]=ch))),o==Ur&&m&&m.name!==Ur&&(u=!0,f=function(){return m.call(this)}),(!fa||a)&&l[ki]!==f&&rh(l,ki,f),oh[e]=f,o)if(v={values:c(Ur),keys:s?f:c(ah),entries:c(lh)},a)for(h in v)(Yr||u||!(h in l))&&Dx(l,h,v[h]);else Ax({target:e,proto:!0,forced:Yr||u},v);return v}});var ga=x((JN,ph)=>{"use strict";var Ix=Rn(),ma=qf(),dh=jn(),fh=hn(),kx=pa(),hh="Array Iterator",Px=fh.set,Nx=fh.getterFor(hh);ph.exports=kx(Array,"Array",function(t,e){Px(this,{type:hh,target:Ix(t),index:0,kind:e})},function(){var t=Nx(this),e=t.target,n=t.kind,i=t.index++;return!e||i>=e.length?(t.target=void 0,{value:void 0,done:!0}):n=="keys"?{value:i,done:!1}:n=="values"?{value:e[i],done:!1}:{value:[i,e[i]],done:!1}},"values");dh.Arguments=dh.Array;ma("keys");ma("values");ma("entries")});var bh=x((ZN,vh)=>{"use strict";var mh=Rt(),Rx=ye(),va=ea(),jx=Ws(),Hx=xs(),qx=dn(),$x=Ti(),Hn=Object.assign,gh=Object.defineProperty;vh.exports=!Hn||Rx(function(){if(mh&&Hn({b:1},Hn(gh({},"a",{enumerable:!0,get:function(){gh(this,"b",{value:3,enumerable:!1})}}),{b:2})).b!==1)return!0;var t={},e={},n=Symbol(),i="abcdefghijklmnopqrst";return t[n]=7,i.split("").forEach(function(o){e[o]=o}),Hn({},t)[n]!=7||va(Hn({},e)).join("")!=i})?function(e,n){for(var i=qx(e),o=arguments.length,s=1,a=jx.f,c=Hx.f;o>s;)for(var d=$x(arguments[s++]),u=a?va(d).concat(a(d)):va(d),l=u.length,m=0,f;l>m;)f=u[m++],(!mh||c.call(d,f))&&(i[f]=d[f]);return i}:Hn});var Kr=x((tR,_h)=>{var Bx=Se(),zx=Bx("toStringTag"),Eh={};Eh[zx]="z";_h.exports=String(Eh)==="[object z]"});var ba=x((nR,Sh)=>{var Wx=Kr(),Gr=Nn(),Vx=Se(),Yx=Vx("toStringTag"),Ux=Gr(function(){return arguments}())=="Arguments",Kx=function(t,e){try{return t[e]}catch(n){}};Sh.exports=Wx?Gr:function(t){var e,n,i;return t===void 0?"Undefined":t===null?"Null":typeof(n=Kx(e=Object(t),Yx))=="string"?n:Ux?Gr(e):(i=Gr(e))=="Object"&&typeof e.callee=="function"?"Arguments":i}});var Th=x((iR,wh)=>{"use strict";var Gx=Kr(),Xx=ba();wh.exports=Gx?{}.toString:function(){return"[object "+Xx(this)+"]"}});var $t=x((oR,xh)=>{var eO=Dr();xh.exports=function(t){if(eO(t))throw TypeError("Cannot convert a Symbol value to a string");return String(t)}});var ya=x((sR,Oh)=>{Oh.exports=` -\v\f\r \xA0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF`});var Ch=x((aR,Ah)=>{var tO=un(),nO=$t(),iO=ya(),Xr="["+iO+"]",rO=RegExp("^"+Xr+Xr+"*"),oO=RegExp(Xr+Xr+"*$"),Ea=function(t){return function(e){var n=nO(tO(e));return t&1&&(n=n.replace(rO,"")),t&2&&(n=n.replace(oO,"")),n}};Ah.exports={start:Ea(1),end:Ea(2),trim:Ea(3)}});var Mh=x((lR,Dh)=>{var sO=de(),aO=$t(),lO=Ch().trim,Lh=ya(),Qr=sO.parseInt,cO=/^[+-]?0[Xx]/,uO=Qr(Lh+"08")!==8||Qr(Lh+"0x16")!==22;Dh.exports=uO?function(e,n){var i=lO(aO(e));return Qr(i,n>>>0||(cO.test(i)?16:10))}:Qr});var _a=x((uR,Ph)=>{var fO=Di(),hO=$t(),pO=un(),kh=function(t){return function(e,n){var i=hO(pO(e)),o=fO(n),s=i.length,a,c;return o<0||o>=s?t?"":void 0:(a=i.charCodeAt(o),a<55296||a>56319||o+1===s||(c=i.charCodeAt(o+1))<56320||c>57343?t?i.charAt(o):a:t?i.slice(o,o+2):(a-55296<<10)+(c-56320)+65536)}};Ph.exports={codeAt:kh(!1),charAt:kh(!0)}});var Sa=x((fR,jh)=>{var EO=pn();jh.exports=function(t,e,n){for(var i in e)EO(t,i,e[i],n);return t}});var Fh=x((hR,$h)=>{var _O=Rn(),Hh=$r().f,SO={}.toString,qh=typeof window=="object"&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],wO=function(t){try{return Hh(t)}catch(e){return qh.slice()}};$h.exports.f=function(e){return qh&&SO.call(e)=="[object Window]"?wO(e):Hh(_O(e))}});var zh=x((pR,Bh)=>{var TO=ye();Bh.exports=!TO(function(){return Object.isExtensible(Object.preventExtensions({}))})});var Jr=x((mR,Yh)=>{var xO=it(),OO=Ci(),AO=He(),wa=We(),CO=jt().f,Wh=$r(),LO=Fh(),DO=Nr(),MO=zh(),Vh=!1,wt=DO("meta"),IO=0,Ta=Object.isExtensible||function(){return!0},xa=function(t){CO(t,wt,{value:{objectID:"O"+IO++,weakData:{}}})},kO=function(t,e){if(!AO(t))return typeof t=="symbol"?t:(typeof t=="string"?"S":"P")+t;if(!wa(t,wt)){if(!Ta(t))return"F";if(!e)return"E";xa(t)}return t[wt].objectID},PO=function(t,e){if(!wa(t,wt)){if(!Ta(t))return!0;if(!e)return!1;xa(t)}return t[wt].weakData},NO=function(t){return MO&&Vh&&Ta(t)&&!wa(t,wt)&&xa(t),t},RO=function(){jO.enable=function(){},Vh=!0;var t=Wh.f,e=[].splice,n={};n[wt]=1,t(n).length&&(Wh.f=function(i){for(var o=t(i),s=0,a=o.length;s{var HO=Se(),qO=jn(),$O=HO("iterator"),FO=Array.prototype;Uh.exports=function(t){return t!==void 0&&(qO.Array===t||FO[$O]===t)}});var Oa=x((vR,Gh)=>{var BO=ba(),zO=jn(),WO=Se(),VO=WO("iterator");Gh.exports=function(t){if(t!=null)return t[VO]||t["@@iterator"]||zO[BO(t)]}});var Qh=x((bR,Xh)=>{var YO=qe(),UO=Oa();Xh.exports=function(t,e){var n=arguments.length<2?UO(t):e;if(typeof n!="function")throw TypeError(String(t)+" is not iterable");return YO(n.call(t))}});var ep=x((yR,Zh)=>{var Jh=qe();Zh.exports=function(t,e,n){var i,o;Jh(t);try{if(i=t.return,i===void 0){if(e==="throw")throw n;return n}i=i.call(t)}catch(s){o=!0,i=s}if(e==="throw")throw n;if(o)throw i;return Jh(i),n}});var Aa=x((ER,np)=>{var KO=qe(),GO=Kh(),XO=mn(),QO=Ks(),JO=Qh(),ZO=Oa(),tp=ep(),Pi=function(t,e){this.stopped=t,this.result=e};np.exports=function(t,e,n){var i=n&&n.that,o=!!(n&&n.AS_ENTRIES),s=!!(n&&n.IS_ITERATOR),a=!!(n&&n.INTERRUPTED),c=QO(e,i,1+o+a),d,u,l,m,f,p,g,v=function(y){return d&&tp(d,"return",y),new Pi(!0,y)},h=function(y){return o?(KO(y),a?c(y[0],y[1],v):c(y[0],y[1])):a?c(y,v):c(y)};if(s)d=t;else{if(u=ZO(t),typeof u!="function")throw TypeError("Target is not iterable");if(GO(u)){for(l=0,m=XO(t.length);m>l;l++)if(f=h(t[l]),f&&f instanceof Pi)return f;return new Pi(!1)}d=JO(t,u)}for(p=d.next;!(g=p.call(d)).done;){try{f=h(g.value)}catch(y){tp(d,"throw",y)}if(typeof f=="object"&&f&&f instanceof Pi)return f}return new Pi(!1)}});var Ca=x((_R,ip)=>{ip.exports=function(t,e,n){if(!(t instanceof e))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return t}});var lp=x((SR,ap)=>{var eA=Se(),rp=eA("iterator"),op=!1;try{sp=0,La={next:function(){return{done:!!sp++}},return:function(){op=!0}},La[rp]=function(){return this},Array.from(La,function(){throw 2})}catch(t){}var sp,La;ap.exports=function(t,e){if(!e&&!op)return!1;var n=!1;try{var i={};i[rp]=function(){return{next:function(){return{done:n=!0}}}},t(i)}catch(o){}return n}});var dp=x((wR,up)=>{var tA=He(),cp=da();up.exports=function(t,e,n){var i,o;return cp&&typeof(i=e.constructor)=="function"&&i!==n&&tA(o=i.prototype)&&o!==n.prototype&&cp(t,o),t}});var pp=x((TR,hp)=>{"use strict";var nA=it(),iA=de(),fp=Vs(),rA=pn(),oA=Jr(),sA=Aa(),aA=Ca(),Da=He(),Ma=ye(),lA=lp(),cA=Vr(),uA=dp();hp.exports=function(t,e,n){var i=t.indexOf("Map")!==-1,o=t.indexOf("Weak")!==-1,s=i?"set":"add",a=iA[t],c=a&&a.prototype,d=a,u={},l=function(y){var _=c[y];rA(c,y,y=="add"?function(O){return _.call(this,O===0?0:O),this}:y=="delete"?function(A){return o&&!Da(A)?!1:_.call(this,A===0?0:A)}:y=="get"?function(O){return o&&!Da(O)?void 0:_.call(this,O===0?0:O)}:y=="has"?function(O){return o&&!Da(O)?!1:_.call(this,O===0?0:O)}:function(O,k){return _.call(this,O===0?0:O,k),this})},m=fp(t,typeof a!="function"||!(o||c.forEach&&!Ma(function(){new a().entries().next()})));if(m)d=n.getConstructor(e,t,i,s),oA.enable();else if(fp(t,!0)){var f=new d,p=f[s](o?{}:-0,1)!=f,g=Ma(function(){f.has(1)}),v=lA(function(y){new a(y)}),h=!o&&Ma(function(){for(var y=new a,_=5;_--;)y[s](_,_);return!y.has(-0)});v||(d=e(function(y,_){aA(y,d,t);var A=uA(new a,y,d);return _!=null&&sA(_,A[s],{that:A,AS_ENTRIES:i}),A}),d.prototype=c,c.constructor=d),(g||h)&&(l("delete"),l("has"),i&&l("get")),(h||p)&&l(s),o&&c.clear&&delete c.clear}return u[t]=d,nA({global:!0,forced:d!=a},u),cA(d,t),o||n.setStrong(d,t,i),d}});var _p=x((xR,Ep)=>{"use strict";var mp=Sa(),Zr=Jr().getWeakData,dA=qe(),Ia=He(),fA=Ca(),hA=Aa(),gp=Fr(),vp=We(),bp=hn(),pA=bp.set,mA=bp.getterFor,gA=gp.find,vA=gp.findIndex,bA=0,eo=function(t){return t.frozen||(t.frozen=new yp)},yp=function(){this.entries=[]},ka=function(t,e){return gA(t.entries,function(n){return n[0]===e})};yp.prototype={get:function(t){var e=ka(this,t);if(e)return e[1]},has:function(t){return!!ka(this,t)},set:function(t,e){var n=ka(this,t);n?n[1]=e:this.entries.push([t,e])},delete:function(t){var e=vA(this.entries,function(n){return n[0]===t});return~e&&this.entries.splice(e,1),!!~e}};Ep.exports={getConstructor:function(t,e,n,i){var o=t(function(c,d){fA(c,o,e),pA(c,{type:e,id:bA++,frozen:void 0}),d!=null&&hA(d,c[i],{that:c,AS_ENTRIES:n})}),s=mA(e),a=function(c,d,u){var l=s(c),m=Zr(dA(d),!0);return m===!0?eo(l).set(d,u):m[l.id]=u,c};return mp(o.prototype,{delete:function(c){var d=s(this);if(!Ia(c))return!1;var u=Zr(c);return u===!0?eo(d).delete(c):u&&vp(u,d.id)&&delete u[d.id]},has:function(d){var u=s(this);if(!Ia(d))return!1;var l=Zr(d);return l===!0?eo(u).has(d):l&&vp(l,u.id)}}),mp(o.prototype,n?{get:function(d){var u=s(this);if(Ia(d)){var l=Zr(d);return l===!0?eo(u).get(d):l?l[u.id]:void 0}},set:function(d,u){return a(this,d,u)}}:{add:function(d){return a(this,d,!0)}}),o}}});var Op=x((OR,xp)=>{"use strict";var Sp=de(),yA=Sa(),EA=Jr(),_A=pp(),wp=_p(),to=He(),no=hn().enforce,SA=Hs(),wA=!Sp.ActiveXObject&&"ActiveXObject"in Sp,io=Object.isExtensible,Ni,Tp=function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}},TA=xp.exports=_A("WeakMap",Tp,wp);SA&&wA&&(Ni=wp.getConstructor(Tp,"WeakMap",!0),EA.enable(),qn=TA.prototype,Pa=qn.delete,Ri=qn.has,Na=qn.get,Ra=qn.set,yA(qn,{delete:function(t){if(to(t)&&!io(t)){var e=no(this);return e.frozen||(e.frozen=new Ni),Pa.call(this,t)||e.frozen.delete(t)}return Pa.call(this,t)},has:function(e){if(to(e)&&!io(e)){var n=no(this);return n.frozen||(n.frozen=new Ni),Ri.call(this,e)||n.frozen.has(e)}return Ri.call(this,e)},get:function(e){if(to(e)&&!io(e)){var n=no(this);return n.frozen||(n.frozen=new Ni),Ri.call(this,e)?Na.call(this,e):n.frozen.get(e)}return Na.call(this,e)},set:function(e,n){if(to(e)&&!io(e)){var i=no(this);i.frozen||(i.frozen=new Ni),Ri.call(this,e)?Ra.call(this,e,n):i.frozen.set(e,n)}else Ra.call(this,e,n);return this}}));var qn,Pa,Ri,Na,Ra});var Pp=x((CR,kp)=>{var Dp="Expected a function",Mp=0/0,OA="[object Symbol]",AA=/^\s+|\s+$/g,CA=/^[-+]0x[0-9a-f]+$/i,LA=/^0b[01]+$/i,DA=/^0o[0-7]+$/i,MA=parseInt,IA=typeof global=="object"&&global&&global.Object===Object&&global,kA=typeof self=="object"&&self&&self.Object===Object&&self,PA=IA||kA||Function("return this")(),NA=Object.prototype,RA=NA.toString,jA=Math.max,HA=Math.min,Fa=function(){return PA.Date.now()};function qA(t,e,n){var i,o,s,a,c,d,u=0,l=!1,m=!1,f=!0;if(typeof t!="function")throw new TypeError(Dp);e=Ip(e)||0,oo(n)&&(l=!!n.leading,m="maxWait"in n,s=m?jA(Ip(n.maxWait)||0,e):s,f="trailing"in n?!!n.trailing:f);function p(M){var H=i,$=o;return i=o=void 0,u=M,a=t.apply($,H),a}function g(M){return u=M,c=setTimeout(y,e),l?p(M):a}function v(M){var H=M-d,$=M-u,G=e-H;return m?HA(G,s-$):G}function h(M){var H=M-d,$=M-u;return d===void 0||H>=e||H<0||m&&$>=s}function y(){var M=Fa();if(h(M))return _(M);c=setTimeout(y,v(M))}function _(M){return c=void 0,f&&i?p(M):(i=o=void 0,a)}function A(){c!==void 0&&clearTimeout(c),u=0,i=d=o=c=void 0}function O(){return c===void 0?a:_(Fa())}function k(){var M=Fa(),H=h(M);if(i=arguments,o=this,d=M,H){if(c===void 0)return g(d);if(m)return c=setTimeout(y,e),p(d)}return c===void 0&&(c=setTimeout(y,e)),a}return k.cancel=A,k.flush=O,k}function $A(t,e,n){var i=!0,o=!0;if(typeof t!="function")throw new TypeError(Dp);return oo(n)&&(i="leading"in n?!!n.leading:i,o="trailing"in n?!!n.trailing:o),qA(t,e,{leading:i,maxWait:e,trailing:o})}function oo(t){var e=typeof t;return!!t&&(e=="object"||e=="function")}function FA(t){return!!t&&typeof t=="object"}function BA(t){return typeof t=="symbol"||FA(t)&&RA.call(t)==OA}function Ip(t){if(typeof t=="number")return t;if(BA(t))return Mp;if(oo(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=oo(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=t.replace(AA,"");var n=LA.test(t);return n||DA.test(t)?MA(t.slice(2),n?2:8):CA.test(t)?Mp:+t}kp.exports=$A});var Hp=x((LR,jp)=>{var zA="Expected a function",Np=0/0,WA="[object Symbol]",VA=/^\s+|\s+$/g,YA=/^[-+]0x[0-9a-f]+$/i,UA=/^0b[01]+$/i,KA=/^0o[0-7]+$/i,GA=parseInt,XA=typeof global=="object"&&global&&global.Object===Object&&global,QA=typeof self=="object"&&self&&self.Object===Object&&self,JA=XA||QA||Function("return this")(),ZA=Object.prototype,e0=ZA.toString,t0=Math.max,n0=Math.min,Ba=function(){return JA.Date.now()};function i0(t,e,n){var i,o,s,a,c,d,u=0,l=!1,m=!1,f=!0;if(typeof t!="function")throw new TypeError(zA);e=Rp(e)||0,za(n)&&(l=!!n.leading,m="maxWait"in n,s=m?t0(Rp(n.maxWait)||0,e):s,f="trailing"in n?!!n.trailing:f);function p(M){var H=i,$=o;return i=o=void 0,u=M,a=t.apply($,H),a}function g(M){return u=M,c=setTimeout(y,e),l?p(M):a}function v(M){var H=M-d,$=M-u,G=e-H;return m?n0(G,s-$):G}function h(M){var H=M-d,$=M-u;return d===void 0||H>=e||H<0||m&&$>=s}function y(){var M=Ba();if(h(M))return _(M);c=setTimeout(y,v(M))}function _(M){return c=void 0,f&&i?p(M):(i=o=void 0,a)}function A(){c!==void 0&&clearTimeout(c),u=0,i=d=o=c=void 0}function O(){return c===void 0?a:_(Ba())}function k(){var M=Ba(),H=h(M);if(i=arguments,o=this,d=M,H){if(c===void 0)return g(d);if(m)return c=setTimeout(y,e),p(d)}return c===void 0&&(c=setTimeout(y,e)),a}return k.cancel=A,k.flush=O,k}function za(t){var e=typeof t;return!!t&&(e=="object"||e=="function")}function r0(t){return!!t&&typeof t=="object"}function o0(t){return typeof t=="symbol"||r0(t)&&e0.call(t)==WA}function Rp(t){if(typeof t=="number")return t;if(o0(t))return Np;if(za(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=za(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=t.replace(VA,"");var n=UA.test(t);return n||KA.test(t)?GA(t.slice(2),n?2:8):YA.test(t)?Np:+t}jp.exports=i0});var Up=x((DR,Yp)=>{var s0="Expected a function",qp="__lodash_hash_undefined__",a0="[object Function]",l0="[object GeneratorFunction]",c0=/[\\^$.*+?()[\]{}|]/g,u0=/^\[object .+?Constructor\]$/,d0=typeof global=="object"&&global&&global.Object===Object&&global,f0=typeof self=="object"&&self&&self.Object===Object&&self,$p=d0||f0||Function("return this")();function h0(t,e){return t==null?void 0:t[e]}function p0(t){var e=!1;if(t!=null&&typeof t.toString!="function")try{e=!!(t+"")}catch(n){}return e}var m0=Array.prototype,g0=Function.prototype,Fp=Object.prototype,Wa=$p["__core-js_shared__"],Bp=function(){var t=/[^.]+$/.exec(Wa&&Wa.keys&&Wa.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}(),zp=g0.toString,Va=Fp.hasOwnProperty,v0=Fp.toString,b0=RegExp("^"+zp.call(Va).replace(c0,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),y0=m0.splice,E0=Wp($p,"Map"),Hi=Wp(Object,"create");function bn(t){var e=-1,n=t?t.length:0;for(this.clear();++e-1}function D0(t,e){var n=this.__data__,i=so(n,t);return i<0?n.push([t,e]):n[i][1]=e,this}$n.prototype.clear=O0;$n.prototype.delete=A0;$n.prototype.get=C0;$n.prototype.has=L0;$n.prototype.set=D0;function yn(t){var e=-1,n=t?t.length:0;for(this.clear();++e{var X0=Us(),Q0=dn(),J0=Ti(),Z0=mn(),dm=function(t){return function(e,n,i,o){X0(n);var s=Q0(e),a=J0(s),c=Z0(s.length),d=t?c-1:0,u=t?-1:1;if(i<2)for(;;){if(d in a){o=a[d],d+=u;break}if(d+=u,t?d<0:c<=d)throw TypeError("Reduce of empty array with no initial value")}for(;t?d>=0:c>d;d+=u)d in a&&(o=n(o,a[d],d,s));return o}};fm.exports={left:dm(!1),right:dm(!0)}});var mm=x((Bj,pm)=>{var eC=Nn(),tC=de();pm.exports=eC(tC.process)=="process"});var ym=x((Vj,bm)=>{"use strict";var fC=qe();bm.exports=function(){var t=fC(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.dotAll&&(e+="s"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}});var Sm=x(rl=>{var Em=ye(),hC=de(),_m=hC.RegExp;rl.UNSUPPORTED_Y=Em(function(){var t=_m("a","y");return t.lastIndex=2,t.exec("abcd")!=null});rl.BROKEN_CARET=Em(function(){var t=_m("^r","gy");return t.lastIndex=2,t.exec("str")!=null})});var Tm=x((Uj,wm)=>{var pC=ye(),mC=de(),gC=mC.RegExp;wm.exports=pC(function(){var t=gC(".","s");return!(t.dotAll&&t.exec(` -`)&&t.flags==="s")})});var Om=x((Kj,xm)=>{var vC=ye(),bC=de(),yC=bC.RegExp;xm.exports=vC(function(){var t=yC("(?b)","g");return t.exec("b").groups.a!=="b"||"b".replace(t,"$c")!=="bc"})});var vo=x((Gj,Lm)=>{"use strict";var EC=$t(),_C=ym(),Am=Sm(),SC=Pr(),wC=Wr(),TC=hn().get,xC=Tm(),OC=Om(),go=RegExp.prototype.exec,AC=SC("native-string-replace",String.prototype.replace),ol=go,sl=function(){var t=/a/,e=/b*/g;return go.call(t,"a"),go.call(e,"a"),t.lastIndex!==0||e.lastIndex!==0}(),Cm=Am.UNSUPPORTED_Y||Am.BROKEN_CARET,al=/()??/.exec("")[1]!==void 0,CC=sl||al||Cm||xC||OC;CC&&(ol=function(e){var n=this,i=TC(n),o=EC(e),s=i.raw,a,c,d,u,l,m,f;if(s)return s.lastIndex=n.lastIndex,a=ol.call(s,o),n.lastIndex=s.lastIndex,a;var p=i.groups,g=Cm&&n.sticky,v=_C.call(n),h=n.source,y=0,_=o;if(g&&(v=v.replace("y",""),v.indexOf("g")===-1&&(v+="g"),_=o.slice(n.lastIndex),n.lastIndex>0&&(!n.multiline||n.multiline&&o.charAt(n.lastIndex-1)!==` -`)&&(h="(?: "+h+")",_=" "+_,y++),c=new RegExp("^(?:"+h+")",v)),al&&(c=new RegExp("^"+h+"$(?!\\s)",v)),sl&&(d=n.lastIndex),u=go.call(g?c:n,_),g?u?(u.input=u.input.slice(y),u[0]=u[0].slice(y),u.index=n.lastIndex,n.lastIndex+=u[0].length):n.lastIndex=0:sl&&u&&(n.lastIndex=n.global?u.index+u[0].length:d),al&&u&&u.length>1&&AC.call(u[0],c,function(){for(l=1;l{"use strict";var LC=it(),Dm=vo();LC({target:"RegExp",proto:!0,forced:/./.exec!==Dm},{exec:Dm})});var ul=x((Jj,Pm)=>{"use strict";ll();var Mm=pn(),DC=vo(),Im=ye(),km=Se(),MC=St(),IC=km("species"),cl=RegExp.prototype;Pm.exports=function(t,e,n,i){var o=km(t),s=!Im(function(){var u={};return u[o]=function(){return 7},""[t](u)!=7}),a=s&&!Im(function(){var u=!1,l=/a/;return t==="split"&&(l={},l.constructor={},l.constructor[IC]=function(){return l},l.flags="",l[o]=/./[o]),l.exec=function(){return u=!0,null},l[o](""),!u});if(!s||!a||n){var c=/./[o],d=e(o,""[t],function(u,l,m,f,p){var g=l.exec;return g===DC||g===cl.exec?s&&!p?{done:!0,value:c.call(l,m,f)}:{done:!0,value:u.call(m,l,f)}:{done:!1}});Mm(String.prototype,t,d[0]),Mm(cl,o,d[1])}i&&MC(cl[o],"sham",!0)}});var dl=x((Zj,Nm)=>{"use strict";var kC=_a().charAt;Nm.exports=function(t,e,n){return e+(n?kC(t,e).length:1)}});var fl=x((e1,Rm)=>{var PC=Nn(),NC=vo();Rm.exports=function(t,e){var n=t.exec;if(typeof n=="function"){var i=n.call(t,e);if(typeof i!="object")throw TypeError("RegExp exec method returned something other than an Object or null");return i}if(PC(t)!=="RegExp")throw TypeError("RegExp#exec called on incompatible receiver");return NC.call(t,e)}});var qm=x((n1,Hm)=>{var FC=dn(),BC=Math.floor,zC="".replace,WC=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,VC=/\$([$&'`]|\d{1,2})/g;Hm.exports=function(t,e,n,i,o,s){var a=n+t.length,c=i.length,d=VC;return o!==void 0&&(o=FC(o),d=WC),zC.call(s,d,function(u,l){var m;switch(l.charAt(0)){case"$":return"$";case"&":return t;case"`":return e.slice(0,n);case"'":return e.slice(a);case"<":m=o[l.slice(1,-1)];break;default:var f=+l;if(f===0)return u;if(f>c){var p=BC(f/10);return p===0?u:p<=c?i[p-1]===void 0?l.charAt(1):i[p-1]+l.charAt(1):u}m=i[f-1]}return m===void 0?"":m})}});var Wm=x(vl=>{"use strict";vl.parse=uL;vl.serialize=dL;var aL=decodeURIComponent,lL=encodeURIComponent,cL=/; */,_o=/^[\u0009\u0020-\u007e\u0080-\u00ff]+$/;function uL(t,e){if(typeof t!="string")throw new TypeError("argument str must be a string");for(var n={},i=e||{},o=t.split(cL),s=i.decode||aL,a=0;a{(function(t,e){typeof define=="function"&&define.amd?define(e):typeof wo=="object"&&wo.exports?wo.exports=e():t.EvEmitter=e()})(typeof window!="undefined"?window:lg,function(){"use strict";function t(){}var e=t.prototype;return e.on=function(n,i){if(!(!n||!i)){var o=this._events=this._events||{},s=o[n]=o[n]||[];return s.indexOf(i)==-1&&s.push(i),this}},e.once=function(n,i){if(!(!n||!i)){this.on(n,i);var o=this._onceEvents=this._onceEvents||{},s=o[n]=o[n]||{};return s[i]=!0,this}},e.off=function(n,i){var o=this._events&&this._events[n];if(!(!o||!o.length)){var s=o.indexOf(i);return s!=-1&&o.splice(s,1),this}},e.emitEvent=function(n,i){var o=this._events&&this._events[n];if(!(!o||!o.length)){o=o.slice(0),i=i||[];for(var s=this._onceEvents&&this._onceEvents[n],a=0;a{(function(t,e){typeof define=="function"&&define.amd?define(e):typeof To=="object"&&To.exports?To.exports=e():t.getSize=e()})(window,function(){"use strict";function e(f){var p=parseFloat(f),g=f.indexOf("%")==-1&&!isNaN(p);return g&&p}function n(){}var i=typeof console=="undefined"?n:function(f){console.error(f)},o=["paddingLeft","paddingRight","paddingTop","paddingBottom","marginLeft","marginRight","marginTop","marginBottom","borderLeftWidth","borderRightWidth","borderTopWidth","borderBottomWidth"],s=o.length;function a(){for(var f={width:0,height:0,innerWidth:0,innerHeight:0,outerWidth:0,outerHeight:0},p=0;pb)","g");return t.exec("b").groups.a!=="b"||"b".replace(t,"$c")!=="bc"})});var vo=x((Uj,Lm)=>{"use strict";var yC=$t(),EC=ym(),Am=Sm(),_C=Pr(),SC=Wr(),wC=hn().get,TC=Tm(),xC=Om(),go=RegExp.prototype.exec,OC=_C("native-string-replace",String.prototype.replace),ol=go,sl=function(){var t=/a/,e=/b*/g;return go.call(t,"a"),go.call(e,"a"),t.lastIndex!==0||e.lastIndex!==0}(),Cm=Am.UNSUPPORTED_Y||Am.BROKEN_CARET,al=/()??/.exec("")[1]!==void 0,AC=sl||al||Cm||TC||xC;AC&&(ol=function(e){var n=this,i=wC(n),o=yC(e),s=i.raw,a,c,d,u,l,m,f;if(s)return s.lastIndex=n.lastIndex,a=ol.call(s,o),n.lastIndex=s.lastIndex,a;var p=i.groups,g=Cm&&n.sticky,v=EC.call(n),h=n.source,y=0,_=o;if(g&&(v=v.replace("y",""),v.indexOf("g")===-1&&(v+="g"),_=o.slice(n.lastIndex),n.lastIndex>0&&(!n.multiline||n.multiline&&o.charAt(n.lastIndex-1)!==` +`)&&(h="(?: "+h+")",_=" "+_,y++),c=new RegExp("^(?:"+h+")",v)),al&&(c=new RegExp("^"+h+"$(?!\\s)",v)),sl&&(d=n.lastIndex),u=go.call(g?c:n,_),g?u?(u.input=u.input.slice(y),u[0]=u[0].slice(y),u.index=n.lastIndex,n.lastIndex+=u[0].length):n.lastIndex=0:sl&&u&&(n.lastIndex=n.global?u.index+u[0].length:d),al&&u&&u.length>1&&OC.call(u[0],c,function(){for(l=1;l{"use strict";var CC=it(),Dm=vo();CC({target:"RegExp",proto:!0,forced:/./.exec!==Dm},{exec:Dm})});var ul=x((Xj,Pm)=>{"use strict";ll();var Mm=pn(),LC=vo(),Im=ye(),km=Se(),DC=St(),MC=km("species"),cl=RegExp.prototype;Pm.exports=function(t,e,n,i){var o=km(t),s=!Im(function(){var u={};return u[o]=function(){return 7},""[t](u)!=7}),a=s&&!Im(function(){var u=!1,l=/a/;return t==="split"&&(l={},l.constructor={},l.constructor[MC]=function(){return l},l.flags="",l[o]=/./[o]),l.exec=function(){return u=!0,null},l[o](""),!u});if(!s||!a||n){var c=/./[o],d=e(o,""[t],function(u,l,m,f,p){var g=l.exec;return g===LC||g===cl.exec?s&&!p?{done:!0,value:c.call(l,m,f)}:{done:!0,value:u.call(m,l,f)}:{done:!1}});Mm(String.prototype,t,d[0]),Mm(cl,o,d[1])}i&&DC(cl[o],"sham",!0)}});var dl=x((Qj,Nm)=>{"use strict";var IC=_a().charAt;Nm.exports=function(t,e,n){return e+(n?IC(t,e).length:1)}});var fl=x((Jj,Rm)=>{var kC=Nn(),PC=vo();Rm.exports=function(t,e){var n=t.exec;if(typeof n=="function"){var i=n.call(t,e);if(typeof i!="object")throw TypeError("RegExp exec method returned something other than an Object or null");return i}if(kC(t)!=="RegExp")throw TypeError("RegExp#exec called on incompatible receiver");return PC.call(t,e)}});var qm=x((e1,Hm)=>{var $C=dn(),BC=Math.floor,FC="".replace,zC=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,WC=/\$([$&'`]|\d{1,2})/g;Hm.exports=function(t,e,n,i,o,s){var a=n+t.length,c=i.length,d=WC;return o!==void 0&&(o=$C(o),d=zC),FC.call(s,d,function(u,l){var m;switch(l.charAt(0)){case"$":return"$";case"&":return t;case"`":return e.slice(0,n);case"'":return e.slice(a);case"<":m=o[l.slice(1,-1)];break;default:var f=+l;if(f===0)return u;if(f>c){var p=BC(f/10);return p===0?u:p<=c?i[p-1]===void 0?l.charAt(1):i[p-1]+l.charAt(1):u}m=i[f-1]}return m===void 0?"":m})}});var Wm=x(vl=>{"use strict";vl.parse=cL;vl.serialize=uL;var sL=decodeURIComponent,aL=encodeURIComponent,lL=/; */,_o=/^[\u0009\u0020-\u007e\u0080-\u00ff]+$/;function cL(t,e){if(typeof t!="string")throw new TypeError("argument str must be a string");for(var n={},i=e||{},o=t.split(lL),s=i.decode||sL,a=0;a{(function(t,e){typeof define=="function"&&define.amd?define(e):typeof wo=="object"&&wo.exports?wo.exports=e():t.EvEmitter=e()})(typeof window!="undefined"?window:ag,function(){"use strict";function t(){}var e=t.prototype;return e.on=function(n,i){if(!(!n||!i)){var o=this._events=this._events||{},s=o[n]=o[n]||[];return s.indexOf(i)==-1&&s.push(i),this}},e.once=function(n,i){if(!(!n||!i)){this.on(n,i);var o=this._onceEvents=this._onceEvents||{},s=o[n]=o[n]||{};return s[i]=!0,this}},e.off=function(n,i){var o=this._events&&this._events[n];if(!(!o||!o.length)){var s=o.indexOf(i);return s!=-1&&o.splice(s,1),this}},e.emitEvent=function(n,i){var o=this._events&&this._events[n];if(!(!o||!o.length)){o=o.slice(0),i=i||[];for(var s=this._onceEvents&&this._onceEvents[n],a=0;a{(function(t,e){typeof define=="function"&&define.amd?define(e):typeof To=="object"&&To.exports?To.exports=e():t.getSize=e()})(window,function(){"use strict";function e(f){var p=parseFloat(f),g=f.indexOf("%")==-1&&!isNaN(p);return g&&p}function n(){}var i=typeof console=="undefined"?n:function(f){console.error(f)},o=["paddingLeft","paddingRight","paddingTop","paddingBottom","marginLeft","marginRight","marginTop","marginBottom","borderLeftWidth","borderRightWidth","borderTopWidth","borderBottomWidth"],s=o.length;function a(){for(var f={width:0,height:0,innerWidth:0,innerHeight:0,outerWidth:0,outerHeight:0},p=0;p")!=="7"});YC("replace",function(t,e,n){var i=$m?"$":"$0";return[function(s,a){var c=QC(this),d=s==null?void 0:s[pl];return d!==void 0?d.call(s,c,a):e.call(Bn(c),s,a)},function(o,s){var a=KC(this),c=Bn(o);if(typeof s=="string"&&s.indexOf(i)===-1&&s.indexOf("$<")===-1){var d=n(e,a,c,s);if(d.done)return d.value}var u=typeof s=="function";u||(s=Bn(s));var l=a.global;if(l){var m=a.unicode;a.lastIndex=0}for(var f=[];;){var p=eL(a,c);if(p===null||(f.push(p),!l))break;var g=Bn(p[0]);g===""&&(a.lastIndex=JC(c,XC(a.lastIndex),m))}for(var v="",h=0,y=0;y=h&&(v+=c.slice(h,A)+$,h=A+_.length)}return v+c.slice(h)}]},!sL||!oL||$m);var yo=function(e){var n=Array.prototype.reduce.call(e,function(i,o){var s=o.name.match(/data-simplebar-(.+)/);if(s){var a=s[1].replace(/\W+(.)/g,function(c,d){return d.toUpperCase()});switch(o.value){case"true":i[a]=!0;break;case"false":i[a]=!1;break;case void 0:i[a]=!0;break;default:i[a]=o.value}}return i},{});return n};function Ft(t){return!t||!t.ownerDocument||!t.ownerDocument.defaultView?window:t.ownerDocument.defaultView}function Eo(t){return!t||!t.ownerDocument?document:t.ownerDocument}var zn=null,Bm=null;bo.default&&window.addEventListener("resize",function(){Bm!==window.devicePixelRatio&&(Bm=window.devicePixelRatio,zn=null)});function zm(t){if(zn===null){var e=Eo(t);if(typeof e=="undefined")return zn=0,zn;var n=e.body,i=e.createElement("div");i.classList.add("simplebar-hide-scrollbar"),n.appendChild(i);var o=i.getBoundingClientRect().right;n.removeChild(i),zn=o}return zn}var he=function(){function t(n,i){var o=this;this.onScroll=function(){var s=Ft(o.el);o.scrollXTicking||(s.requestAnimationFrame(o.scrollX),o.scrollXTicking=!0),o.scrollYTicking||(s.requestAnimationFrame(o.scrollY),o.scrollYTicking=!0)},this.scrollX=function(){o.axis.x.isOverflowing&&(o.showScrollbar("x"),o.positionScrollbar("x")),o.scrollXTicking=!1},this.scrollY=function(){o.axis.y.isOverflowing&&(o.showScrollbar("y"),o.positionScrollbar("y")),o.scrollYTicking=!1},this.onMouseEnter=function(){o.showScrollbar("x"),o.showScrollbar("y")},this.onMouseMove=function(s){o.mouseX=s.clientX,o.mouseY=s.clientY,(o.axis.x.isOverflowing||o.axis.x.forceVisible)&&o.onMouseMoveForAxis("x"),(o.axis.y.isOverflowing||o.axis.y.forceVisible)&&o.onMouseMoveForAxis("y")},this.onMouseLeave=function(){o.onMouseMove.cancel(),(o.axis.x.isOverflowing||o.axis.x.forceVisible)&&o.onMouseLeaveForAxis("x"),(o.axis.y.isOverflowing||o.axis.y.forceVisible)&&o.onMouseLeaveForAxis("y"),o.mouseX=-1,o.mouseY=-1},this.onWindowResize=function(){o.scrollbarWidth=o.getScrollbarWidth(),o.hideNativeScrollbar()},this.hideScrollbars=function(){o.axis.x.track.rect=o.axis.x.track.el.getBoundingClientRect(),o.axis.y.track.rect=o.axis.y.track.el.getBoundingClientRect(),o.isWithinBounds(o.axis.y.track.rect)||(o.axis.y.scrollbar.el.classList.remove(o.classNames.visible),o.axis.y.isVisible=!1),o.isWithinBounds(o.axis.x.track.rect)||(o.axis.x.scrollbar.el.classList.remove(o.classNames.visible),o.axis.x.isVisible=!1)},this.onPointerEvent=function(s){var a,c;o.axis.x.track.rect=o.axis.x.track.el.getBoundingClientRect(),o.axis.y.track.rect=o.axis.y.track.el.getBoundingClientRect(),(o.axis.x.isOverflowing||o.axis.x.forceVisible)&&(a=o.isWithinBounds(o.axis.x.track.rect)),(o.axis.y.isOverflowing||o.axis.y.forceVisible)&&(c=o.isWithinBounds(o.axis.y.track.rect)),(a||c)&&(s.preventDefault(),s.stopPropagation(),s.type==="mousedown"&&(a&&(o.axis.x.scrollbar.rect=o.axis.x.scrollbar.el.getBoundingClientRect(),o.isWithinBounds(o.axis.x.scrollbar.rect)?o.onDragStart(s,"x"):o.onTrackClick(s,"x")),c&&(o.axis.y.scrollbar.rect=o.axis.y.scrollbar.el.getBoundingClientRect(),o.isWithinBounds(o.axis.y.scrollbar.rect)?o.onDragStart(s,"y"):o.onTrackClick(s,"y"))))},this.drag=function(s){var a,c=o.axis[o.draggedAxis].track,d=c.rect[o.axis[o.draggedAxis].sizeAttr],u=o.axis[o.draggedAxis].scrollbar,l=o.contentWrapperEl[o.axis[o.draggedAxis].scrollSizeAttr],m=parseInt(o.elStyles[o.axis[o.draggedAxis].sizeAttr],10);s.preventDefault(),s.stopPropagation(),o.draggedAxis==="y"?a=s.pageY:a=s.pageX;var f=a-c.rect[o.axis[o.draggedAxis].offsetAttr]-o.axis[o.draggedAxis].dragOffset,p=f/(d-u.size),g=p*(l-m);o.draggedAxis==="x"&&(g=o.isRtl&&t.getRtlHelpers().isRtlScrollbarInverted?g-(d+u.size):g,g=o.isRtl&&t.getRtlHelpers().isRtlScrollingInverted?-g:g),o.contentWrapperEl[o.axis[o.draggedAxis].scrollOffsetAttr]=g},this.onEndDrag=function(s){var a=Eo(o.el),c=Ft(o.el);s.preventDefault(),s.stopPropagation(),o.el.classList.remove(o.classNames.dragging),a.removeEventListener("mousemove",o.drag,!0),a.removeEventListener("mouseup",o.onEndDrag,!0),o.removePreventClickId=c.setTimeout(function(){a.removeEventListener("click",o.preventClick,!0),a.removeEventListener("dblclick",o.preventClick,!0),o.removePreventClickId=null})},this.preventClick=function(s){s.preventDefault(),s.stopPropagation()},this.el=n,this.minScrollbarWidth=20,this.options=Object.assign({},t.defaultOptions,{},i),this.classNames=Object.assign({},t.defaultOptions.classNames,{},this.options.classNames),this.axis={x:{scrollOffsetAttr:"scrollLeft",sizeAttr:"width",scrollSizeAttr:"scrollWidth",offsetSizeAttr:"offsetWidth",offsetAttr:"left",overflowAttr:"overflowX",dragOffset:0,isOverflowing:!0,isVisible:!1,forceVisible:!1,track:{},scrollbar:{}},y:{scrollOffsetAttr:"scrollTop",sizeAttr:"height",scrollSizeAttr:"scrollHeight",offsetSizeAttr:"offsetHeight",offsetAttr:"top",overflowAttr:"overflowY",dragOffset:0,isOverflowing:!0,isVisible:!1,forceVisible:!1,track:{},scrollbar:{}}},this.removePreventClickId=null,!t.instances.has(this.el)&&(this.recalculate=(0,ml.default)(this.recalculate.bind(this),64),this.onMouseMove=(0,ml.default)(this.onMouseMove.bind(this),64),this.hideScrollbars=(0,gl.default)(this.hideScrollbars.bind(this),this.options.timeout),this.onWindowResize=(0,gl.default)(this.onWindowResize.bind(this),64,{leading:!0}),t.getRtlHelpers=(0,Fm.default)(t.getRtlHelpers),this.init())}t.getRtlHelpers=function(){var i=document.createElement("div");i.innerHTML='
';var o=i.firstElementChild;document.body.appendChild(o);var s=o.firstElementChild;o.scrollLeft=0;var a=t.getOffset(o),c=t.getOffset(s);o.scrollLeft=999;var d=t.getOffset(s);return{isRtlScrollingInverted:a.left!==c.left&&c.left-d.left!=0,isRtlScrollbarInverted:a.left!==c.left}},t.getOffset=function(i){var o=i.getBoundingClientRect(),s=Eo(i),a=Ft(i);return{top:o.top+(a.pageYOffset||s.documentElement.scrollTop),left:o.left+(a.pageXOffset||s.documentElement.scrollLeft)}};var e=t.prototype;return e.init=function(){t.instances.set(this.el,this),bo.default&&(this.initDOM(),this.scrollbarWidth=this.getScrollbarWidth(),this.recalculate(),this.initListeners())},e.initDOM=function(){var i=this;if(Array.prototype.filter.call(this.el.children,function(a){return a.classList.contains(i.classNames.wrapper)}).length)this.wrapperEl=this.el.querySelector("."+this.classNames.wrapper),this.contentWrapperEl=this.options.scrollableNode||this.el.querySelector("."+this.classNames.contentWrapper),this.contentEl=this.options.contentNode||this.el.querySelector("."+this.classNames.contentEl),this.offsetEl=this.el.querySelector("."+this.classNames.offset),this.maskEl=this.el.querySelector("."+this.classNames.mask),this.placeholderEl=this.findChild(this.wrapperEl,"."+this.classNames.placeholder),this.heightAutoObserverWrapperEl=this.el.querySelector("."+this.classNames.heightAutoObserverWrapperEl),this.heightAutoObserverEl=this.el.querySelector("."+this.classNames.heightAutoObserverEl),this.axis.x.track.el=this.findChild(this.el,"."+this.classNames.track+"."+this.classNames.horizontal),this.axis.y.track.el=this.findChild(this.el,"."+this.classNames.track+"."+this.classNames.vertical);else{for(this.wrapperEl=document.createElement("div"),this.contentWrapperEl=document.createElement("div"),this.offsetEl=document.createElement("div"),this.maskEl=document.createElement("div"),this.contentEl=document.createElement("div"),this.placeholderEl=document.createElement("div"),this.heightAutoObserverWrapperEl=document.createElement("div"),this.heightAutoObserverEl=document.createElement("div"),this.wrapperEl.classList.add(this.classNames.wrapper),this.contentWrapperEl.classList.add(this.classNames.contentWrapper),this.offsetEl.classList.add(this.classNames.offset),this.maskEl.classList.add(this.classNames.mask),this.contentEl.classList.add(this.classNames.contentEl),this.placeholderEl.classList.add(this.classNames.placeholder),this.heightAutoObserverWrapperEl.classList.add(this.classNames.heightAutoObserverWrapperEl),this.heightAutoObserverEl.classList.add(this.classNames.heightAutoObserverEl);this.el.firstChild;)this.contentEl.appendChild(this.el.firstChild);this.contentWrapperEl.appendChild(this.contentEl),this.offsetEl.appendChild(this.contentWrapperEl),this.maskEl.appendChild(this.offsetEl),this.heightAutoObserverWrapperEl.appendChild(this.heightAutoObserverEl),this.wrapperEl.appendChild(this.heightAutoObserverWrapperEl),this.wrapperEl.appendChild(this.maskEl),this.wrapperEl.appendChild(this.placeholderEl),this.el.appendChild(this.wrapperEl)}if(!this.axis.x.track.el||!this.axis.y.track.el){var o=document.createElement("div"),s=document.createElement("div");o.classList.add(this.classNames.track),s.classList.add(this.classNames.scrollbar),o.appendChild(s),this.axis.x.track.el=o.cloneNode(!0),this.axis.x.track.el.classList.add(this.classNames.horizontal),this.axis.y.track.el=o.cloneNode(!0),this.axis.y.track.el.classList.add(this.classNames.vertical),this.el.appendChild(this.axis.x.track.el),this.el.appendChild(this.axis.y.track.el)}this.axis.x.scrollbar.el=this.axis.x.track.el.querySelector("."+this.classNames.scrollbar),this.axis.y.scrollbar.el=this.axis.y.track.el.querySelector("."+this.classNames.scrollbar),this.options.autoHide||(this.axis.x.scrollbar.el.classList.add(this.classNames.visible),this.axis.y.scrollbar.el.classList.add(this.classNames.visible)),this.el.setAttribute("data-simplebar","init")},e.initListeners=function(){var i=this,o=Ft(this.el);this.options.autoHide&&this.el.addEventListener("mouseenter",this.onMouseEnter),["mousedown","click","dblclick"].forEach(function(c){i.el.addEventListener(c,i.onPointerEvent,!0)}),["touchstart","touchend","touchmove"].forEach(function(c){i.el.addEventListener(c,i.onPointerEvent,{capture:!0,passive:!0})}),this.el.addEventListener("mousemove",this.onMouseMove),this.el.addEventListener("mouseleave",this.onMouseLeave),this.contentWrapperEl.addEventListener("scroll",this.onScroll),o.addEventListener("resize",this.onWindowResize);var s=!1,a=o.ResizeObserver||nl;this.resizeObserver=new a(function(){!s||i.recalculate()}),this.resizeObserver.observe(this.el),this.resizeObserver.observe(this.contentEl),o.requestAnimationFrame(function(){s=!0}),this.mutationObserver=new o.MutationObserver(this.recalculate),this.mutationObserver.observe(this.contentEl,{childList:!0,subtree:!0,characterData:!0})},e.recalculate=function(){var i=Ft(this.el);this.elStyles=i.getComputedStyle(this.el),this.isRtl=this.elStyles.direction==="rtl";var o=this.heightAutoObserverEl.offsetHeight<=1,s=this.heightAutoObserverEl.offsetWidth<=1,a=this.contentEl.offsetWidth,c=this.contentWrapperEl.offsetWidth,d=this.elStyles.overflowX,u=this.elStyles.overflowY;this.contentEl.style.padding=this.elStyles.paddingTop+" "+this.elStyles.paddingRight+" "+this.elStyles.paddingBottom+" "+this.elStyles.paddingLeft,this.wrapperEl.style.margin="-"+this.elStyles.paddingTop+" -"+this.elStyles.paddingRight+" -"+this.elStyles.paddingBottom+" -"+this.elStyles.paddingLeft;var l=this.contentEl.scrollHeight,m=this.contentEl.scrollWidth;this.contentWrapperEl.style.height=o?"auto":"100%",this.placeholderEl.style.width=s?a+"px":"auto",this.placeholderEl.style.height=l+"px";var f=this.contentWrapperEl.offsetHeight;this.axis.x.isOverflowing=m>a,this.axis.y.isOverflowing=l>f,this.axis.x.isOverflowing=d==="hidden"?!1:this.axis.x.isOverflowing,this.axis.y.isOverflowing=u==="hidden"?!1:this.axis.y.isOverflowing,this.axis.x.forceVisible=this.options.forceVisible==="x"||this.options.forceVisible===!0,this.axis.y.forceVisible=this.options.forceVisible==="y"||this.options.forceVisible===!0,this.hideNativeScrollbar();var p=this.axis.x.isOverflowing?this.scrollbarWidth:0,g=this.axis.y.isOverflowing?this.scrollbarWidth:0;this.axis.x.isOverflowing=this.axis.x.isOverflowing&&m>c-g,this.axis.y.isOverflowing=this.axis.y.isOverflowing&&l>f-p,this.axis.x.scrollbar.size=this.getScrollbarSize("x"),this.axis.y.scrollbar.size=this.getScrollbarSize("y"),this.axis.x.scrollbar.el.style.width=this.axis.x.scrollbar.size+"px",this.axis.y.scrollbar.el.style.height=this.axis.y.scrollbar.size+"px",this.positionScrollbar("x"),this.positionScrollbar("y"),this.toggleTrackVisibility("x"),this.toggleTrackVisibility("y")},e.getScrollbarSize=function(i){if(i===void 0&&(i="y"),!this.axis[i].isOverflowing)return 0;var o=this.contentEl[this.axis[i].scrollSizeAttr],s=this.axis[i].track.el[this.axis[i].offsetSizeAttr],a,c=s/o;return a=Math.max(~~(c*s),this.options.scrollbarMinSize),this.options.scrollbarMaxSize&&(a=Math.min(a,this.options.scrollbarMaxSize)),a},e.positionScrollbar=function(i){if(i===void 0&&(i="y"),!!this.axis[i].isOverflowing){var o=this.contentWrapperEl[this.axis[i].scrollSizeAttr],s=this.axis[i].track.el[this.axis[i].offsetSizeAttr],a=parseInt(this.elStyles[this.axis[i].sizeAttr],10),c=this.axis[i].scrollbar,d=this.contentWrapperEl[this.axis[i].scrollOffsetAttr];d=i==="x"&&this.isRtl&&t.getRtlHelpers().isRtlScrollingInverted?-d:d;var u=d/(o-a),l=~~((s-c.size)*u);l=i==="x"&&this.isRtl&&t.getRtlHelpers().isRtlScrollbarInverted?l+(s-c.size):l,c.el.style.transform=i==="x"?"translate3d("+l+"px, 0, 0)":"translate3d(0, "+l+"px, 0)"}},e.toggleTrackVisibility=function(i){i===void 0&&(i="y");var o=this.axis[i].track.el,s=this.axis[i].scrollbar.el;this.axis[i].isOverflowing||this.axis[i].forceVisible?(o.style.visibility="visible",this.contentWrapperEl.style[this.axis[i].overflowAttr]="scroll"):(o.style.visibility="hidden",this.contentWrapperEl.style[this.axis[i].overflowAttr]="hidden"),this.axis[i].isOverflowing?s.style.display="block":s.style.display="none"},e.hideNativeScrollbar=function(){this.offsetEl.style[this.isRtl?"left":"right"]=this.axis.y.isOverflowing||this.axis.y.forceVisible?"-"+this.scrollbarWidth+"px":0,this.offsetEl.style.bottom=this.axis.x.isOverflowing||this.axis.x.forceVisible?"-"+this.scrollbarWidth+"px":0},e.onMouseMoveForAxis=function(i){i===void 0&&(i="y"),this.axis[i].track.rect=this.axis[i].track.el.getBoundingClientRect(),this.axis[i].scrollbar.rect=this.axis[i].scrollbar.el.getBoundingClientRect();var o=this.isWithinBounds(this.axis[i].scrollbar.rect);o?this.axis[i].scrollbar.el.classList.add(this.classNames.hover):this.axis[i].scrollbar.el.classList.remove(this.classNames.hover),this.isWithinBounds(this.axis[i].track.rect)?(this.showScrollbar(i),this.axis[i].track.el.classList.add(this.classNames.hover)):this.axis[i].track.el.classList.remove(this.classNames.hover)},e.onMouseLeaveForAxis=function(i){i===void 0&&(i="y"),this.axis[i].track.el.classList.remove(this.classNames.hover),this.axis[i].scrollbar.el.classList.remove(this.classNames.hover)},e.showScrollbar=function(i){i===void 0&&(i="y");var o=this.axis[i].scrollbar.el;this.axis[i].isVisible||(o.classList.add(this.classNames.visible),this.axis[i].isVisible=!0),this.options.autoHide&&this.hideScrollbars()},e.onDragStart=function(i,o){o===void 0&&(o="y");var s=Eo(this.el),a=Ft(this.el),c=this.axis[o].scrollbar,d=o==="y"?i.pageY:i.pageX;this.axis[o].dragOffset=d-c.rect[this.axis[o].offsetAttr],this.draggedAxis=o,this.el.classList.add(this.classNames.dragging),s.addEventListener("mousemove",this.drag,!0),s.addEventListener("mouseup",this.onEndDrag,!0),this.removePreventClickId===null?(s.addEventListener("click",this.preventClick,!0),s.addEventListener("dblclick",this.preventClick,!0)):(a.clearTimeout(this.removePreventClickId),this.removePreventClickId=null)},e.onTrackClick=function(i,o){var s=this;if(o===void 0&&(o="y"),!!this.options.clickOnTrack){var a=Ft(this.el);this.axis[o].scrollbar.rect=this.axis[o].scrollbar.el.getBoundingClientRect();var c=this.axis[o].scrollbar,d=c.rect[this.axis[o].offsetAttr],u=parseInt(this.elStyles[this.axis[o].sizeAttr],10),l=this.contentWrapperEl[this.axis[o].scrollOffsetAttr],m=o==="y"?this.mouseY-d:this.mouseX-d,f=m<0?-1:1,p=f===-1?l-u:l+u,g=function v(){if(f===-1){if(l>p){var h;l-=s.options.clickOnTrackSpeed,s.contentWrapperEl.scrollTo((h={},h[s.axis[o].offsetAttr]=l,h)),a.requestAnimationFrame(v)}}else if(l=i.left&&this.mouseX<=i.left+i.width&&this.mouseY>=i.top&&this.mouseY<=i.top+i.height},e.findChild=function(i,o){var s=i.matches||i.webkitMatchesSelector||i.mozMatchesSelector||i.msMatchesSelector;return Array.prototype.filter.call(i.children,function(a){return s.call(a,o)})[0]},t}();he.defaultOptions={autoHide:!0,forceVisible:!1,clickOnTrack:!0,clickOnTrackSpeed:40,classNames:{contentEl:"simplebar-content",contentWrapper:"simplebar-content-wrapper",offset:"simplebar-offset",mask:"simplebar-mask",wrapper:"simplebar-wrapper",placeholder:"simplebar-placeholder",scrollbar:"simplebar-scrollbar",track:"simplebar-track",heightAutoObserverWrapperEl:"simplebar-height-auto-observer-wrapper",heightAutoObserverEl:"simplebar-height-auto-observer",visible:"simplebar-visible",horizontal:"simplebar-horizontal",vertical:"simplebar-vertical",hover:"simplebar-hover",dragging:"simplebar-dragging"},scrollbarMinSize:25,scrollbarMaxSize:0,timeout:1e3};he.instances=new WeakMap;he.initDOMLoadedElements=function(){document.removeEventListener("DOMContentLoaded",this.initDOMLoadedElements),window.removeEventListener("load",this.initDOMLoadedElements),Array.prototype.forEach.call(document.querySelectorAll("[data-simplebar]"),function(t){t.getAttribute("data-simplebar")!=="init"&&!he.instances.has(t)&&new he(t,yo(t.attributes))})};he.removeObserver=function(){this.globalObserver.disconnect()};he.initHtmlApi=function(){this.initDOMLoadedElements=this.initDOMLoadedElements.bind(this),typeof MutationObserver!="undefined"&&(this.globalObserver=new MutationObserver(he.handleMutations),this.globalObserver.observe(document,{childList:!0,subtree:!0})),document.readyState==="complete"||document.readyState!=="loading"&&!document.documentElement.doScroll?window.setTimeout(this.initDOMLoadedElements):(document.addEventListener("DOMContentLoaded",this.initDOMLoadedElements),window.addEventListener("load",this.initDOMLoadedElements))};he.handleMutations=function(t){t.forEach(function(e){Array.prototype.forEach.call(e.addedNodes,function(n){n.nodeType===1&&(n.hasAttribute("data-simplebar")?!he.instances.has(n)&&document.documentElement.contains(n)&&new he(n,yo(n.attributes)):Array.prototype.forEach.call(n.querySelectorAll("[data-simplebar]"),function(i){i.getAttribute("data-simplebar")!=="init"&&!he.instances.has(i)&&document.documentElement.contains(i)&&new he(i,yo(i.attributes))}))}),Array.prototype.forEach.call(e.removedNodes,function(n){n.nodeType===1&&(n.getAttribute("data-simplebar")==="init"?he.instances.has(n)&&!document.documentElement.contains(n)&&he.instances.get(n).unMount():Array.prototype.forEach.call(n.querySelectorAll('[data-simplebar="init"]'),function(i){he.instances.has(i)&&!document.documentElement.contains(i)&&he.instances.get(i).unMount()}))})})};he.getOptions=yo;bo.default&&he.initHtmlApi();var Vm=Le(Wm());function Ym(t){return"error"in t&&"exception"in t}function Wn(t){return"error"in t}function Um(t){return typeof t.next=="string"}function ie(t){let e=["","null","undefined"];return Array.isArray(t)?t.length>0:typeof t=="string"&&!e.includes(t)||typeof t=="number"||typeof t=="boolean"?!0:typeof t=="object"&&t!==null}function Fi(t){return t.every(e=>typeof e!="undefined"&&e!==null)}function Bi(t){for(let e of t.options)e.selected&&(e.selected=!1);t.value=""}function bl(t){return typeof t!==null&&typeof t!="undefined"}function hL(){let{csrftoken:t}=Vm.default.parse(document.cookie);if(typeof t=="undefined")throw new Error("Invalid or missing CSRF token");return t}function Km(t,e,n){return Ne(this,null,function*(){let i=hL(),o=new Headers({"X-CSRFToken":i}),s;typeof n!="undefined"&&(s=JSON.stringify(n),o.set("content-type","application/json"));let a=yield fetch(t,{method:e,body:s,headers:o,credentials:"same-origin"}),c=a.headers.get("Content-Type");if(typeof c=="string"&&c.includes("text"))return{error:yield a.text()};let d=yield a.json();return!a.ok&&Array.isArray(d)?{error:d.join(` -`)}:!a.ok&&"detail"in d?{error:d.detail}:d})}function So(t,e){return Ne(this,null,function*(){return yield Km(t,"PATCH",e)})}function pL(t){return Ne(this,null,function*(){return yield Km(t,"GET")})}function Gm(t){return Ne(this,null,function*(){return yield pL(t)})}function*R(...t){for(let e of t)for(let n of document.querySelectorAll(e))n!==null&&(yield n)}function ae(t){return document.getElementById(t)}function Xm(t,e=0){let n=e,i=document.getElementById("content-title");i!==null&&(n+=i.getBoundingClientRect().bottom);let o=t.getBoundingClientRect().top+window.pageYOffset+n;window.scrollTo({top:o,behavior:"smooth"})}function Qm(t){let e=[];for(let n of t.querySelectorAll("select"))if(n!==null){let i={name:n.name,options:[]};for(let o of n.options)o.selected&&i.options.push(o.value);e=[...e,i]}return e}function zi(t,e){t!==null&&(typeof e=="undefined"?window.getComputedStyle(t).display==="none"?t.style.display="":t.style.display="none":e==="show"?t.style.display="":t.style.display="none")}function*Jm(t){for(let e of t.querySelectorAll("td"))e!==null&&ie(e.innerText)&&e.innerText!=="\u2014"&&(yield e.innerText.replaceAll(/[\n\r]/g,"").trim())}function Ie(t,e,n){function i(s){return!!(typeof n=="string"&&s!==null&&s.matches(n))}function o(s){if(s!==null&&s.parentElement!==null&&!i(s)){for(let a of s.parentElement.querySelectorAll(e))if(a!==null)return a;return o(s.parentElement.parentElement)}return null}return o(t)}function Vn(t,e,n=null,i=[]){let o=document.createElement(t);if(e!==null)for(let s of Object.keys(e)){let a=s,c=e[a];a in o&&(o[a]=c)}n!==null&&n.length>0&&o.classList.add(...n);for(let s of i)o.appendChild(s);return o}function Zm(t,e){let n=new Map;for(let i of t){let o=i[e];n.has(o)||n.set(o,i)}return Array.from(n.values())}function mL(t){t.preventDefault();let e=t.currentTarget;if(e!==null){let n=Ie(e,"form"),i=e.getAttribute("href");n!==null&&ie(i)&&(n.setAttribute("action",i),n.submit())}}function eg(){for(let t of R("a.formaction"))t.addEventListener("click",mL)}function gL(t,e){let n=new Set;for(let i of e.querySelectorAll("*[name]"))i.validity.valid?(i.classList.contains("is-invalid")&&i.classList.remove("is-invalid"),i.classList.contains("is-valid")||i.classList.add("is-valid")):(n.add(i.name),i.classList.contains("is-valid")&&i.classList.remove("is-valid"),i.classList.contains("is-invalid")||i.classList.add("is-invalid"));if(n.size!==0){let i=e.elements.namedItem(Array.from(n)[0]);Xm(i),t.preventDefault()}}function tg(){for(let t of R("form")){let e=t.querySelectorAll("button[type=submit]");for(let n of e)n.addEventListener("click",i=>gL(i,t))}}function ng(){for(let t of R("a.set_speed"))if(t!==null){let e=function(n){n.preventDefault();let i=t.getAttribute("data"),o=document.getElementById(t.target);o!==null&&i!==null&&(o.value=i)};t.addEventListener("click",e)}}var yl={vlangroup_edit:{region:{hide:["id_sitegroup","id_site","id_location","id_rack","id_clustergroup","id_cluster"],show:["id_region"]},"site group":{hide:["id_region","id_site","id_location","id_rack","id_clustergroup","id_cluster"],show:["id_sitegroup"]},site:{hide:["id_location","id_rack","id_clustergroup","id_cluster"],show:["id_region","id_sitegroup","id_site"]},location:{hide:["id_rack","id_clustergroup","id_cluster"],show:["id_region","id_sitegroup","id_site","id_location"]},rack:{hide:["id_clustergroup","id_cluster"],show:["id_region","id_sitegroup","id_site","id_location","id_rack"]},"cluster group":{hide:["id_region","id_sitegroup","id_site","id_location","id_rack","id_cluster"],show:["id_clustergroup"]},cluster:{hide:["id_region","id_sitegroup","id_site","id_location","id_rack"],show:["id_clustergroup","id_cluster"]},default:{hide:["id_region","id_sitegroup","id_site","id_location","id_rack","id_clustergroup","id_cluster"],show:[]}}};function El(t,e){var n;for(let i of R(t)){let o=(n=i.parentElement)==null?void 0:n.parentElement;o!==null&&(e==="show"?zi(o,"show"):zi(o,"hide"))}}function ig(t,e){let n=e.options[e.selectedIndex].innerText.toLowerCase();for(let[i,o]of Object.entries(yl[t]))if(n.endsWith(i)){for(let s of o.hide)El(`#${s}`,"hide");for(let s of o.show)El(`#${s}`,"show");break}else for(let s of yl[t].default.hide)El(`#${s}`,"hide")}function rg(){for(let t of Object.keys(yl))for(let e of R(`html[data-netbox-url-name="${t}"] #id_scope_type`))ig(t,e),e.addEventListener("change",()=>ig(t,e))}function vL(t){var n,i;let e=(i=(n=t==null?void 0:t.parentElement)==null?void 0:n.parentElement)!=null?i:null;return e!==null&&e.classList.contains("row")?e:null}function st(t,e){let n=vL(t);if(t!==null&&n!==null){zi(n,e);let i=new Event(`netbox.select.disabled.${t.name}`);switch(e){case"hide":t.disabled=!0,t.dispatchEvent(i);break;case"show":t.disabled=!1,t.dispatchEvent(i)}}}function bL(){let t=[ae("id_tagged_vlans"),ae("id_untagged_vlan"),ae("id_vlan_group")];if(Fi(t)){let[e,n]=t;Bi(n),Bi(e);for(let i of t)st(i,"hide")}}function yL(){let t=[ae("id_tagged_vlans"),ae("id_untagged_vlan"),ae("id_vlan_group")];if(Fi(t)){let[e,n,i]=t;Bi(e),st(i,"show"),st(n,"show"),st(e,"hide")}}function EL(){let t=[ae("id_tagged_vlans"),ae("id_untagged_vlan"),ae("id_vlan_group")];if(Fi(t)){let[e,n,i]=t;st(e,"show"),st(i,"show"),st(n,"show")}}function _L(){let t=[ae("id_tagged_vlans"),ae("id_untagged_vlan"),ae("id_vlan_group")];if(Fi(t)){let[e,n,i]=t;Bi(e),st(i,"show"),st(n,"show"),st(e,"hide")}}function og(t){switch(t.value){case"access":yL();break;case"tagged":EL();break;case"tagged-all":_L();break;case"":bL();break}}function sg(){let t=ae("id_mode");t!==null&&(t.addEventListener("change",()=>og(t)),og(t))}function ag(){for(let t of[eg,tg,ng,rg,sg])t()}var pg=Le(hg());window.Collapse=Me;window.Modal=Nt;window.Popover=an;window.Toast=_t;window.Tooltip=et;function SL(){for(let t of R(".masonry"))new pg.default(t,{itemSelector:".masonry-item",percentPosition:!0})}function wL(){for(let t of R('[data-bs-toggle="tooltip"]'))new et(t,{container:"body"})}function TL(){for(let t of R('[data-bs-toggle="modal"]'))new Nt(t)}function Sn(t,e,n,i){let o="mdi-alert";switch(t){case"warning":o="mdi-alert";break;case"success":o="mdi-check-circle";break;case"info":o="mdi-information";break;case"danger":o="mdi-alert";break}let s=document.createElement("div");s.setAttribute("class","toast-container position-fixed bottom-0 end-0 m-3");let a=document.createElement("div");a.setAttribute("class",`toast bg-${t}`),a.setAttribute("role","alert"),a.setAttribute("aria-live","assertive"),a.setAttribute("aria-atomic","true");let c=document.createElement("div");c.setAttribute("class",`toast-header bg-${t} text-body`);let d=document.createElement("i");d.setAttribute("class",`mdi ${o}`);let u=document.createElement("strong");u.setAttribute("class","me-auto ms-1"),u.innerText=e;let l=document.createElement("button");l.setAttribute("type","button"),l.setAttribute("class","btn-close"),l.setAttribute("data-bs-dismiss","toast"),l.setAttribute("aria-label","Close");let m=document.createElement("div");if(m.setAttribute("class","toast-body"),c.appendChild(d),c.appendChild(u),typeof i!="undefined"){let p=document.createElement("small");p.setAttribute("class","text-muted"),c.appendChild(p)}return c.appendChild(l),m.innerText=n.trim(),a.appendChild(c),a.appendChild(m),s.appendChild(a),document.body.appendChild(s),new _t(a)}function xL(){let{hash:t}=location;if(t&&t.match(/^#tab_.+$/)){let e=t.replace("tab_","");for(let n of R(`ul.nav.nav-tabs .nav-link[data-bs-target="${e}"]`))new cn(n).show()}}function OL(){let t=document.querySelectorAll(".sidebar .accordion-item");function e(n){for(let i of t)i!==n?i.classList.remove("is-open"):i.classList.toggle("is-open")}for(let n of t)for(let i of n.querySelectorAll(".accordion-button"))i.addEventListener("click",()=>{e(n)})}function AL(){for(let t of R("a.image-preview")){let e=`${Math.round(window.innerWidth/4)}px`,n=Vn("img",{src:t.href});n.style.maxWidth=e;let i=Vn("div",null,null,[n]);new an(t,{customClass:"image-preview-popover",trigger:"hover",html:!0,content:i})}}function mg(){for(let t of[wL,TL,SL,xL,AL,OL])t()}var wl=Le(Sl());function LL(t,e){var c;let n=t.currentTarget,i=Ie(n,"span.search-obj-selected"),o=Ie(n,"input.search-obj-type"),s=n.getAttribute("data-search-value"),a="";i!==null&&o!==null&&(ie(s)&&a!==s?(a=s,i.innerHTML=(c=e.textContent)!=null?c:"Error",o.value=s):(a="",i.innerHTML="All Objects",o.value=""))}function DL(){for(let t of R(".search-obj-selector"))for(let e of t.querySelectorAll("li > button.dropdown-item"))e.addEventListener("click",n=>LL(n,e))}function ML(){var t;for(let e of R("input.interface-filter")){let o=function(s){let a=s.target,c=new RegExp(a.value.toLowerCase().trim());for(let d of i){let u=d.querySelector('input[type="checkbox"][name="pk"]');u!==null&&(u.checked=!1);let l=d.getAttribute("data-name");typeof l=="string"&&(c.test(l.toLowerCase().trim())?d.classList.contains("d-none")&&d.classList.remove("d-none"):d.classList.add("d-none"))}},n=Ie(e,"table"),i=Array.from((t=n==null?void 0:n.querySelectorAll("tbody > tr"))!=null?t:[]).filter(s=>s!==null);e.addEventListener("keyup",(0,wl.default)(o,300))}}function IL(){var t;for(let e of R("input.object-filter")){let o=function(s){let a=s.target,c=new RegExp(a.value.toLowerCase().trim());for(let d of i){let u=d.querySelector('input[type="checkbox"][name="pk"]');u!==null&&(u.checked=!1);for(let l of Jm(d))if(c.test(l.toLowerCase())){d.classList.remove("d-none");break}else d.classList.add("d-none")}},n=Ie(e,"table"),i=Array.from((t=n==null?void 0:n.querySelectorAll("tbody > tr"))!=null?t:[]).filter(s=>s!==null);e.addEventListener("keyup",(0,wl.default)(o,300))}}function vg(){for(let t of[DL,IL,ML])t()}function bg(t,e,n){return Math.min(Math.max(t,n),e)}var Yn=class extends Error{constructor(e){super(`Failed to parse color: "${e}"`)}};function kL(t){if(typeof t!="string")throw new Yn(t);if(t.trim().toLowerCase()==="transparent")return[0,0,0,0];let e=t.trim();e=qL.test(t)?function(a){let c=a.toLowerCase().trim(),d=PL[function(u){let l=5381,m=u.length;for(;m;)l=33*l^u.charCodeAt(--m);return(l>>>0)%2341}(c)];if(!d)throw new Yn(a);return`#${d}`}(t):t;let n=NL.exec(e);if(n){let a=Array.from(n).slice(1);return[...a.slice(0,3).map(c=>parseInt(Wi(c,2),16)),parseInt(Wi(a[3]||"f",2),16)/255]}let i=RL.exec(e);if(i){let a=Array.from(i).slice(1);return[...a.slice(0,3).map(c=>parseInt(c,16)),parseInt(a[3]||"ff",16)/255]}let o=jL.exec(e);if(o){let a=Array.from(o).slice(1);return[...a.slice(0,3).map(c=>parseInt(c,10)),parseFloat(a[3]||"1")]}let s=HL.exec(e);if(s){let[a,c,d,u]=Array.from(s).slice(1).map(parseFloat);if(bg(0,100,c)!==c)throw new Yn(t);if(bg(0,100,d)!==d)throw new Yn(t);return[...$L(a,c,d),u||1]}throw new Yn(t)}var yg=t=>parseInt(t.replace(/_/g,""),36),PL="1q29ehhb 1n09sgk7 1kl1ekf_ _yl4zsno 16z9eiv3 1p29lhp8 _bd9zg04 17u0____ _iw9zhe5 _to73___ _r45e31e _7l6g016 _jh8ouiv _zn3qba8 1jy4zshs 11u87k0u 1ro9yvyo 1aj3xael 1gz9zjz0 _3w8l4xo 1bf1ekf_ _ke3v___ _4rrkb__ 13j776yz _646mbhl _nrjr4__ _le6mbhl 1n37ehkb _m75f91n _qj3bzfz 1939yygw 11i5z6x8 _1k5f8xs 1509441m 15t5lwgf _ae2th1n _tg1ugcv 1lp1ugcv 16e14up_ _h55rw7n _ny9yavn _7a11xb_ 1ih442g9 _pv442g9 1mv16xof 14e6y7tu 1oo9zkds 17d1cisi _4v9y70f _y98m8kc 1019pq0v 12o9zda8 _348j4f4 1et50i2o _8epa8__ _ts6senj 1o350i2o 1mi9eiuo 1259yrp0 1ln80gnw _632xcoy 1cn9zldc _f29edu4 1n490c8q _9f9ziet 1b94vk74 _m49zkct 1kz6s73a 1eu9dtog _q58s1rz 1dy9sjiq __u89jo3 _aj5nkwg _ld89jo3 13h9z6wx _qa9z2ii _l119xgq _bs5arju 1hj4nwk9 1qt4nwk9 1ge6wau6 14j9zlcw 11p1edc_ _ms1zcxe _439shk6 _jt9y70f _754zsow 1la40eju _oq5p___ _x279qkz 1fa5r3rv _yd2d9ip _424tcku _8y1di2_ _zi2uabw _yy7rn9h 12yz980_ __39ljp6 1b59zg0x _n39zfzp 1fy9zest _b33k___ _hp9wq92 1il50hz4 _io472ub _lj9z3eo 19z9ykg0 _8t8iu3a 12b9bl4a 1ak5yw0o _896v4ku _tb8k8lv _s59zi6t _c09ze0p 1lg80oqn 1id9z8wb _238nba5 1kq6wgdi _154zssg _tn3zk49 _da9y6tc 1sg7cv4f _r12jvtt 1gq5fmkz 1cs9rvci _lp9jn1c _xw1tdnb 13f9zje6 16f6973h _vo7ir40 _bt5arjf _rc45e4t _hr4e100 10v4e100 _hc9zke2 _w91egv_ _sj2r1kk 13c87yx8 _vqpds__ _ni8ggk8 _tj9yqfb 1ia2j4r4 _7x9b10u 1fc9ld4j 1eq9zldr _5j9lhpx _ez9zl6o _md61fzm".split(" ").reduce((t,e)=>{let n=yg(e.substring(0,3)),i=yg(e.substring(3)).toString(16),o="";for(let s=0;s<6-i.length;s++)o+="0";return t[n]=`${o}${i}`,t},{}),Wi=(t,e)=>Array.from(Array(e)).map(()=>t).join(""),NL=new RegExp(`^#${Wi("([a-f0-9])",3)}([a-f0-9])?$`,"i"),RL=new RegExp(`^#${Wi("([a-f0-9]{2})",3)}([a-f0-9]{2})?$`,"i"),jL=new RegExp(`^rgba?\\(\\s*(\\d+)\\s*${Wi(",\\s*(\\d+)\\s*",2)}(?:,\\s*([\\d.]+))?\\s*\\)$`,"i"),HL=/^hsla?\(\s*([\d.]+)\s*,\s*([\d.]+)%\s*,\s*([\d.]+)%(?:\s*,\s*([\d.]+))?\s*\)$/i,qL=/^[a-z]+$/i,Eg=t=>Math.round(255*t),$L=(t,e,n)=>{let i=n/100;if(e===0)return[i,i,i].map(Eg);let o=(t%360+360)%360/60,s=(1-Math.abs(2*i-1))*(e/100),a=s*(1-Math.abs(o%2-1)),c=0,d=0,u=0;o>=0&&o<1?(c=s,d=a):o>=1&&o<2?(c=a,d=s):o>=2&&o<3?(d=s,u=a):o>=3&&o<4?(d=a,u=s):o>=4&&o<5?(c=a,u=s):o>=5&&o<6&&(c=s,u=a);let l=i-s/2;return[c+l,d+l,u+l].map(Eg)};function FL(t){if(t==="transparent")return 0;function e(s){let a=s/255;return a<=.03928?a/12.92:Math.pow((a+.055)/1.055,2.4)}let[n,i,o]=kL(t);return .2126*e(n)+.7152*e(i)+.0722*e(o)}function BL(t){return FL(t)>.179}function Vi(t){return BL(t)?"#000":"#fff"}var Yg=Le(Sl()),Ol=Le(qg());var Mo={};(function(t,e){typeof Mo=="object"&&typeof module=="object"?module.exports=e():typeof define=="function"&&define.amd?define([],e):typeof Mo=="object"?Mo.SlimSelect=e():t.SlimSelect=e()})(window,function(){return n={},t.m=e=[function(i,o,s){"use strict";function a(d,u){u=u||{bubbles:!1,cancelable:!1,detail:void 0};var l=document.createEvent("CustomEvent");return l.initCustomEvent(d,u.bubbles,u.cancelable,u.detail),l}var c;o.__esModule=!0,o.hasClassInTree=function(d,u){function l(m,f){return f&&m&&m.classList&&m.classList.contains(f)?m:null}return l(d,u)||function m(f,p){return f&&f!==document?l(f,p)?f:m(f.parentNode,p):null}(d,u)},o.ensureElementInView=function(d,u){var l=d.scrollTop+d.offsetTop,m=l+d.clientHeight,f=u.offsetTop,p=f+u.clientHeight;f=window.innerHeight?"above":l?u:"below"},o.debounce=function(d,u,l){var m;return u===void 0&&(u=100),l===void 0&&(l=!1),function(){for(var f=[],p=0;p[^<>]*'+v+"")},o.kebabCase=function(d){var u=d.replace(/[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g,function(l){return"-"+l.toLowerCase()});return d[0]===d[0].toUpperCase()?u.substring(1):u},typeof(c=window).CustomEvent!="function"&&(a.prototype=c.Event.prototype,c.CustomEvent=a)},function(i,o,s){"use strict";o.__esModule=!0;var a=(c.prototype.newOption=function(u){return{id:u.id?u.id:String(Math.floor(1e8*Math.random())),value:u.value?u.value:"",text:u.text?u.text:"",innerHTML:u.innerHTML?u.innerHTML:"",selected:!!u.selected&&u.selected,display:u.display===void 0||u.display,disabled:!!u.disabled&&u.disabled,placeholder:!!u.placeholder&&u.placeholder,class:u.class?u.class:void 0,data:u.data?u.data:{},mandatory:!!u.mandatory&&u.mandatory}},c.prototype.add=function(u){this.data.push({id:String(Math.floor(1e8*Math.random())),value:u.value,text:u.text,innerHTML:"",selected:!1,display:!0,disabled:!1,placeholder:!1,class:void 0,mandatory:u.mandatory,data:{}})},c.prototype.parseSelectData=function(){this.data=[];for(var u=0,l=this.main.select.element.childNodes;u',placeholder:this.placeholder,searchPlaceholder:"Filter",onChange:()=>this.handleSlimChange()}),this.getStaticParams(),this.getDynamicParams(),this.getPathKeys();for(let[a,c]of this.staticParams.entries())this.queryParams.set(a,c);for(let a of this.dynamicParams.keys())this.updateQueryParams(a);for(let a of this.pathValues.keys())this.updatePathValues(a);this.queryParams.set("brief",[!0]),this.updateQueryUrl(),this.resetClasses(),this.setSlimStyles(),this.initResetButton(),this.initRefreshButton(),this.addEventListeners();let o=this.base.getAttribute("data-fetch-trigger"),s=this.base.closest(".content-container .collapse");switch(Bg(o)?this.trigger=o:s!==null?this.trigger="collapse":this.trigger="load",this.trigger){case"collapse":s!==null&&(s.addEventListener("show.bs.collapse",()=>this.loadData()),s.addEventListener("hide.bs.collapse",()=>this.resetOptions()));break;case"open":this.slim.beforeOpen=()=>this.loadData();break;case"load":Promise.all([this.loadData()]);break}}get options(){return this.slim.data.data.filter(Vg)}set options(e){let n=e;this.nullOption!==null&&(n=[this.nullOption,...n]);let i=Zm(n,"value"),o=typeof i.find(a=>a.value==="")!="undefined",s=i.findIndex(a=>a.value==="");o&&s>=0?i[s]=this.emptyOption:i.unshift(this.emptyOption),this.slim.setData(i)}resetOptions(){this.options=[this.emptyOption]}disable(){this.slim.slim.singleSelected!==null?this.slim.slim.singleSelected.container.hasAttribute("disabled")||this.slim.slim.singleSelected.container.setAttribute("disabled",""):this.slim.slim.multiSelected!==null&&(this.slim.slim.multiSelected.container.hasAttribute("disabled")||this.slim.slim.multiSelected.container.setAttribute("disabled","")),this.slim.disable()}enable(){this.slim.slim.singleSelected!==null?this.slim.slim.singleSelected.container.hasAttribute("disabled")&&this.slim.slim.singleSelected.container.removeAttribute("disabled"):this.slim.slim.multiSelected!==null&&this.slim.slim.multiSelected.container.hasAttribute("disabled")&&this.slim.slim.multiSelected.container.removeAttribute("disabled"),this.slim.enable()}addEventListeners(){let e=(0,Yg.default)(i=>this.handleSearch(i),300,!1);this.slim.slim.search.input.addEventListener("keyup",i=>{if(!i.key.match(/^(Arrow|Enter|Tab).*/))return e(i)}),this.slim.slim.search.input.addEventListener("paste",i=>e(i)),this.slim.slim.list.addEventListener("scroll",()=>this.handleScroll()),this.base.addEventListener(`netbox.select.atbottom.${this.name}`,()=>this.fetchOptions(this.more,"merge")),this.base.addEventListener(`netbox.select.disabled.${this.name}`,i=>this.handleDisableEnable(i));let n=new Set([...this.dynamicParams.keys(),...this.pathValues.keys()]);for(let i of n){let o=document.querySelector(`[name="${i}"]`);o!==null&&o.addEventListener("change",s=>this.handleEvent(s)),this.base.addEventListener(`netbox.select.onload.${i}`,s=>this.handleEvent(s))}}loadData(){return Ne(this,null,function*(){try{this.disable(),yield this.getOptions("replace")}catch(e){console.error(e)}finally{this.setOptionStyles(),this.enable(),this.base.dispatchEvent(this.loadEvent)}})}getPreselectedOptions(){return Array.from(this.base.options).filter(e=>e.selected).filter(e=>!(e.value==="---------"||e.innerText==="---------"))}processOptions(e,n="merge"){return Ne(this,null,function*(){let i=this.getPreselectedOptions(),o=i.map(c=>c.getAttribute("value")).filter(ie),s=i.map(c=>({value:c.value,text:c.innerText,selected:!0,disabled:!1})),a=[];for(let c of e.results){let d=c.display;typeof c._depth=="number"&&c._depth>0&&(d=`${"\u2500".repeat(c._depth)} ${d}`);let u={},l=c.id.toString(),m,f,p;for(let[v,h]of Object.entries(c)){if(!["id","slug"].includes(v)&&["string","number","boolean"].includes(typeof h)){let y=v.replaceAll("_","-");u[y]=String(h)}this.disabledAttributes.some(y=>y.toLowerCase()===v.toLowerCase())&&(typeof h=="string"&&h.toLowerCase()!=="false"||typeof h=="boolean"&&h===!0||typeof h=="number"&&h>0)&&(p=!0)}o.some(v=>this.disabledOptions.includes(v))&&(p=!0),o.includes(l)&&(f=!0,p=!1);let g={value:l,text:d,data:u,style:m,selected:f,disabled:p};a=[...a,g]}switch(n){case"merge":this.options=[...this.options,...a];break;case"replace":this.options=[...s,...a];break}Um(e)?this.more=e.next:this.more=null})}fetchOptions(e,n="merge"){return Ne(this,null,function*(){if(typeof e=="string"){let i=yield Gm(e);if(Wn(i))return Ym(i)?this.handleError(i.exception,i.error):this.handleError(`Error Fetching Options for field '${this.name}'`,i.error);yield this.processOptions(i,n)}})}getOptions(e="merge"){return Ne(this,null,function*(){if(this.queryUrl.includes("{{")){this.resetOptions();return}yield this.fetchOptions(this.queryUrl,e)})}handleSearch(e){return Ne(this,null,function*(){let{value:n}=e.target,i=Ol.default.stringifyUrl({url:this.queryUrl,query:{q:n}});yield this.fetchOptions(i,"merge"),this.slim.data.search(n),this.slim.render()})}handleScroll(){let e=this.slim.slim.list.scrollTop+this.slim.slim.list.offsetHeight===this.slim.slim.list.scrollHeight;this.atBottom&&!e?(this.atBottom=!1,this.base.dispatchEvent(this.bottomEvent)):!this.atBottom&&e&&(this.atBottom=!0,this.base.dispatchEvent(this.bottomEvent))}handleEvent(e){let n=e.target;this.updateQueryParams(n.name),this.updatePathValues(n.name),this.updateQueryUrl(),Promise.all([this.loadData()])}handleDisableEnable(e){let n=e.target;n.disabled===!0?this.disable():n.disabled===!1&&this.enable()}handleError(e,n){Sn("danger",e,n).show(),this.resetOptions()}handleSlimChange(){let e=this.slim.slim;e&&(e.container.classList.contains("is-invalid")||this.base.classList.contains("is-invalid"))&&(e.container.classList.remove("is-invalid"),this.base.classList.remove("is-invalid")),this.base.dispatchEvent(this.loadEvent)}updateQueryUrl(){let e={};for(let[o,s]of this.queryParams.entries())e[o]=s;let n=this.url;for(let[o,s]of this.pathValues.entries())for(let a of this.url.matchAll(new RegExp(`({{${o}}})`,"g")))ie(s)&&(n=n.replaceAll(a[1],s.toString()));let i=Ol.default.stringifyUrl({url:n,query:e});this.queryUrl!==i&&(this.queryUrl=i,this.base.setAttribute("data-url",i))}updateQueryParams(e){let n=document.querySelector(`[name="${e}"]`);if(n!==null){let i=[];if(n.multiple?i=Array.from(n.options).filter(o=>o.selected).map(o=>o.value):n.value!==""&&(i=[n.value]),i.length>0){this.dynamicParams.updateValue(e,i);let o=this.dynamicParams.get(e);if(typeof o!="undefined"){let{queryParam:s,queryValue:a}=o,c=[];if(this.staticParams.has(s)){let d=this.staticParams.get(s);typeof d!="undefined"&&(c=[...d,...a])}else c=a;c.length>0?this.queryParams.set(s,c):this.queryParams.delete(s)}}else{let o=this.dynamicParams.queryParam(e);o!==null&&this.queryParams.delete(o)}}}updatePathValues(e){let n=e.replaceAll(/^id_/gi,""),i=ae(`id_${n}`);i!==null&&this.url.includes("{{")&&Boolean(this.url.match(new RegExp(`({{(${e})}})`,"g")))&&(ie(i.value)?this.pathValues.set(e,i.value):this.pathValues.set(e,""))}getPlaceholder(){let e=this.name;if(this.base.id){let n=document.querySelector(`label[for="${this.base.id}"]`);n!==null&&(e=`Select ${n.innerText.trim()}`)}return e}getDisabledOptions(){var n;let e=[];if(Fg(this.base))try{let i=JSON.parse((n=this.base.getAttribute("data-query-param-exclude"))!=null?n:"[]");e=[...e,...i]}catch(i){console.group(`Unable to parse data-query-param-exclude value on select element '${this.name}'`),console.warn(i),console.groupEnd()}return e}getDisabledAttributes(){let e=[...Ug],n=this.base.getAttribute("disabled-indicator");return ie(n)&&(e=[...e,n]),e}getPathKeys(){for(let e of this.url.matchAll(new RegExp("{{(.+)}}","g")))this.pathValues.set(e[1],"")}getDynamicParams(){let e=this.base.getAttribute("data-dynamic-params");try{this.dynamicParams.addFromJson(e)}catch(n){console.group(`Unable to determine dynamic query parameters for select field '${this.name}'`),console.warn(n),console.groupEnd()}}getStaticParams(){let e=this.base.getAttribute("data-static-params");try{if(ie(e)){let n=JSON.parse(e);if(Wg(n))for(let{queryParam:i,queryValue:o}of n)Array.isArray(o)?this.staticParams.set(i,o):this.staticParams.set(i,[o])}}catch(n){console.group(`Unable to determine static query parameters for select field '${this.name}'`),console.warn(n),console.groupEnd()}}setSlimStyles(){let{width:e,height:n}=this.slim.slim.container.getBoundingClientRect();this.base.style.opacity="0",this.base.style.width=`${e}px`,this.base.style.height=`${n}px`,this.base.style.display="block",this.base.style.position="absolute",this.base.style.pointerEvents="none"}setOptionStyles(){for(let e of this.options)if("data"in e&&"id"in e&&typeof e.data!="undefined"&&typeof e.id!="undefined"&&"color"in e.data){let n=e.id,i=e.data,o=document.createElement("style"),s=`#${i.color}`,a=Vi(s);o.setAttribute("data-netbox",n),o.innerHTML=` + `}}function jv(){r.calendarContainer.classList.add("hasWeeks");var b=u("div","flatpickr-weekwrapper");b.appendChild(u("span","flatpickr-weekday",r.l10n.weekAbbreviation));var E=u("div","flatpickr-weeks");return b.appendChild(E),{weekWrapper:b,weekNumbers:E}}function Ro(b,E){E===void 0&&(E=!0);var w=E?b:b-r.currentMonth;w<0&&r._hidePrevMonthArrow===!0||w>0&&r._hideNextMonthArrow===!0||(r.currentMonth+=w,(r.currentMonth<0||r.currentMonth>11)&&(r.currentYear+=r.currentMonth>11?1:-1,r.currentMonth=(r.currentMonth+12)%12,ie("onYearChange"),Gn()),Ki(),ie("onMonthChange"),Ji())}function Hv(b,E){b===void 0&&(b=!0),E===void 0&&(E=!0),r.input.value="",r.altInput!==void 0&&(r.altInput.value=""),r.mobileInput!==void 0&&(r.mobileInput.value=""),r.selectedDates=[],r.latestSelectedDateObj=void 0,E===!0&&(r.currentYear=r._initialDate.getFullYear(),r.currentMonth=r._initialDate.getMonth()),r.showTimeInput=!1,r.config.enableTime===!0&&Te(),r.redraw(),b&&ie("onChange")}function qv(){r.isOpen=!1,r.isMobile||(r.calendarContainer!==void 0&&r.calendarContainer.classList.remove("open"),r._input!==void 0&&r._input.classList.remove("active")),ie("onClose")}function $v(){r.config!==void 0&&ie("onDestroy");for(var b=r._handlers.length;b--;){var E=r._handlers[b];E.element.removeEventListener(E.event,E.handler,E.options)}if(r._handlers=[],r.mobileInput)r.mobileInput.parentNode&&r.mobileInput.parentNode.removeChild(r.mobileInput),r.mobileInput=void 0;else if(r.calendarContainer&&r.calendarContainer.parentNode)if(r.config.static&&r.calendarContainer.parentNode){var w=r.calendarContainer.parentNode;if(w.lastChild&&w.removeChild(w.lastChild),w.parentNode){for(;w.firstChild;)w.parentNode.insertBefore(w.firstChild,w);w.parentNode.removeChild(w)}}else r.calendarContainer.parentNode.removeChild(r.calendarContainer);r.altInput&&(r.input.type="text",r.altInput.parentNode&&r.altInput.parentNode.removeChild(r.altInput),delete r.altInput),r.input&&(r.input.type=r.input._type,r.input.classList.remove("flatpickr-input"),r.input.removeAttribute("readonly"),r.input.value=""),["_showTimeInput","latestSelectedDateObj","_hideNextMonthArrow","_hidePrevMonthArrow","__hideNextMonthArrow","__hidePrevMonthArrow","isMobile","isOpen","selectedDateElem","minDateHasTime","maxDateHasTime","days","daysContainer","_input","_positionElement","innerContainer","rContainer","monthNav","todayDateElem","calendarContainer","weekdayContainer","prevMonthNav","nextMonthNav","monthsDropdownContainer","currentMonthElement","currentYearElement","navigationCurrentMonth","selectedDateElem","config"].forEach(function(D){try{delete r[D]}catch(R){}})}function Xn(b){return r.config.appendTo&&r.config.appendTo.contains(b)?!0:r.calendarContainer.contains(b)}function jo(b){if(r.isOpen&&!r.config.inline){var E=p(b),w=Xn(E),D=E===r.input||E===r.altInput||r.element.contains(E)||b.path&&b.path.indexOf&&(~b.path.indexOf(r.input)||~b.path.indexOf(r.altInput)),R=b.type==="blur"?D&&b.relatedTarget&&!Xn(b.relatedTarget):!D&&!w&&!Xn(b.relatedTarget),P=!r.config.ignoredFocusElements.some(function(B){return B.contains(E)});R&&P&&(r.timeContainer!==void 0&&r.minuteElement!==void 0&&r.hourElement!==void 0&&q(),r.close(),r.config.mode==="range"&&r.selectedDates.length===1&&(r.clear(!1),r.redraw()))}}function Gi(b){if(!(!b||r.config.minDate&&br.config.maxDate.getFullYear())){var E=b,w=r.currentYear!==E;r.currentYear=E||r.currentYear,r.config.maxDate&&r.currentYear===r.config.maxDate.getFullYear()?r.currentMonth=Math.min(r.config.maxDate.getMonth(),r.currentMonth):r.config.minDate&&r.currentYear===r.config.minDate.getFullYear()&&(r.currentMonth=Math.max(r.config.minDate.getMonth(),r.currentMonth)),w&&(r.redraw(),ie("onYearChange"),Gn())}}function zt(b,E){E===void 0&&(E=!0);var w=r.parseDate(b,void 0,E);if(r.config.minDate&&w&&k(w,r.config.minDate,E!==void 0?E:!r.minDateHasTime)<0||r.config.maxDate&&w&&k(w,r.config.maxDate,E!==void 0?E:!r.maxDateHasTime)>0)return!1;if(r.config.enable.length===0&&r.config.disable.length===0)return!0;if(w===void 0)return!1;for(var D=r.config.enable.length>0,R=D?r.config.enable:r.config.disable,P=0,B=void 0;P=B.from.getTime()&&w.getTime()<=B.to.getTime())return D}return!D}function Xi(b){return r.daysContainer!==void 0?b.className.indexOf("hidden")===-1&&r.daysContainer.contains(b):!1}function Bv(b){var E=b.target===r._input,w=r.config.allowInput,D=r.isOpen&&(!w||!E),R=r.config.inline&&E&&!w;if(b.keyCode===13&&E){if(w)return r.setDate(r._input.value,!0,b.target===r.altInput?r.config.altFormat:r.config.dateFormat),b.target.blur();r.open()}else if(Xn(b.target)||D||R){var P=!!r.timeContainer&&r.timeContainer.contains(b.target);switch(b.keyCode){case 13:P?(b.preventDefault(),q(),qo()):Bl(b);break;case 27:b.preventDefault(),qo();break;case 8:case 46:E&&!r.config.allowInput&&(b.preventDefault(),r.clear());break;case 37:case 39:if(!P&&!E){if(b.preventDefault(),r.daysContainer!==void 0&&(w===!1||document.activeElement&&Xi(document.activeElement))){var B=b.keyCode===39?1:-1;b.ctrlKey?(b.stopPropagation(),Ro(B),At(ct(1),0)):At(void 0,B)}}else r.hourElement&&r.hourElement.focus();break;case 38:case 40:b.preventDefault();var V=b.keyCode===40?1:-1;r.daysContainer&&b.target.$i!==void 0||b.target===r.input||b.target===r.altInput?b.ctrlKey?(b.stopPropagation(),Gi(r.currentYear-V),At(ct(1),0)):P||At(void 0,V*7):b.target===r.currentYearElement?Gi(r.currentYear-V):r.config.enableTime&&(!P&&r.hourElement&&r.hourElement.focus(),q(b),r._debouncedChange());break;case 9:if(P){var U=[r.hourElement,r.minuteElement,r.secondElement,r.amPM].concat(r.pluginElements).filter(function(xe){return xe}),X=U.indexOf(b.target);if(X!==-1){var J=U[X+(b.shiftKey?-1:1)];b.preventDefault(),(J||r._input).focus()}}else!r.config.noCalendar&&r.daysContainer&&r.daysContainer.contains(b.target)&&b.shiftKey&&(b.preventDefault(),r._input.focus());break;default:break}}if(r.amPM!==void 0&&b.target===r.amPM)switch(b.key){case r.l10n.amPM[0].charAt(0):case r.l10n.amPM[0].charAt(0).toLowerCase():r.amPM.textContent=r.l10n.amPM[0],ee(),ut();break;case r.l10n.amPM[1].charAt(0):case r.l10n.amPM[1].charAt(0).toLowerCase():r.amPM.textContent=r.l10n.amPM[1],ee(),ut();break}(E||Xn(b.target))&&ie("onKeyDown",b)}function Ho(b){if(!(r.selectedDates.length!==1||b&&(!b.classList.contains("flatpickr-day")||b.classList.contains("flatpickr-disabled")))){for(var E=b?b.dateObj.getTime():r.days.firstElementChild.dateObj.getTime(),w=r.parseDate(r.selectedDates[0],void 0,!0).getTime(),D=Math.min(E,r.selectedDates[0].getTime()),R=Math.max(E,r.selectedDates[0].getTime()),P=!1,B=0,V=0,U=D;UD&&UB)?B=U:U>w&&(!V||U0&&ht0&&ht>V;if(er)return ft.classList.add("notAllowed"),["inRange","startRange","endRange"].forEach(function(Zn){ft.classList.remove(Zn)}),"continue";if(P&&!er)return"continue";["startRange","inRange","endRange","notAllowed"].forEach(function(Zn){ft.classList.remove(Zn)}),b!==void 0&&(b.classList.add(E<=r.selectedDates[0].getTime()?"startRange":"endRange"),wE&&ht===w&&ft.classList.add("endRange"),ht>=B&&(V===0||ht<=V)&&M(ht,w,E)&&ft.classList.add("inRange"))},dt=0,Jn=J.children.length;dt0||w.getMinutes()>0||w.getSeconds()>0),r.selectedDates&&(r.selectedDates=r.selectedDates.filter(function(R){return zt(R)}),!r.selectedDates.length&&b==="min"&&we(w),ut()),r.daysContainer&&($l(),w!==void 0?r.currentYearElement[b]=w.getFullYear().toString():r.currentYearElement.removeAttribute(b),r.currentYearElement.disabled=!!D&&w!==void 0&&D.getFullYear()===w.getFullYear())}}function Wv(){var b=["wrap","weekNumbers","allowInput","clickOpens","time_24hr","enableTime","noCalendar","altInput","shorthandCurrentMonth","inline","static","enableSeconds","disableMobile"],E=t({},T,JSON.parse(JSON.stringify(S.dataset||{}))),w={};r.config.parseDate=E.parseDate,r.config.formatDate=E.formatDate,Object.defineProperty(r.config,"enable",{get:function(){return r.config._enable},set:function(J){r.config._enable=zl(J)}}),Object.defineProperty(r.config,"disable",{get:function(){return r.config._disable},set:function(J){r.config._disable=zl(J)}});var D=E.mode==="time";if(!E.dateFormat&&(E.enableTime||D)){var R=z.defaultConfig.dateFormat||n.dateFormat;w.dateFormat=E.noCalendar||D?"H:i"+(E.enableSeconds?":S":""):R+" H:i"+(E.enableSeconds?":S":"")}if(E.altInput&&(E.enableTime||D)&&!E.altFormat){var P=z.defaultConfig.altFormat||n.altFormat;w.altFormat=E.noCalendar||D?"h:i"+(E.enableSeconds?":S K":" K"):P+(" h:i"+(E.enableSeconds?":S":"")+" K")}E.altInputClass||(r.config.altInputClass=r.input.className+" "+r.config.altInputClass),Object.defineProperty(r.config,"minDate",{get:function(){return r.config._minDate},set:Hl("min")}),Object.defineProperty(r.config,"maxDate",{get:function(){return r.config._maxDate},set:Hl("max")});var B=function(J){return function(xe){r.config[J==="min"?"_minTime":"_maxTime"]=r.parseDate(xe,"H:i:S")}};Object.defineProperty(r.config,"minTime",{get:function(){return r.config._minTime},set:B("min")}),Object.defineProperty(r.config,"maxTime",{get:function(){return r.config._maxTime},set:B("max")}),E.mode==="time"&&(r.config.noCalendar=!0,r.config.enableTime=!0),Object.assign(r.config,w,E);for(var V=0;V-1?r.config[X]=c(U[X]).map(L).concat(r.config[X]):typeof E[X]=="undefined"&&(r.config[X]=U[X])}ie("onParseConfig")}function ql(){typeof r.config.locale!="object"&&typeof z.l10ns[r.config.locale]=="undefined"&&r.config.errorHandler(new Error("flatpickr: invalid locale "+r.config.locale)),r.l10n=t({},z.l10ns.default,typeof r.config.locale=="object"?r.config.locale:r.config.locale!=="default"?z.l10ns[r.config.locale]:void 0),y.K="("+r.l10n.amPM[0]+"|"+r.l10n.amPM[1]+"|"+r.l10n.amPM[0].toLowerCase()+"|"+r.l10n.amPM[1].toLowerCase()+")";var b=t({},T,JSON.parse(JSON.stringify(S.dataset||{})));b.time_24hr===void 0&&z.defaultConfig.time_24hr===void 0&&(r.config.time_24hr=r.l10n.time_24hr),r.formatDate=A(r),r.parseDate=O({config:r.config,l10n:r.l10n})}function Qn(b){if(r.calendarContainer!==void 0){ie("onPreCalendarPosition");var E=b||r._positionElement,w=Array.prototype.reduce.call(r.calendarContainer.children,function(tb,nb){return tb+nb.offsetHeight},0),D=r.calendarContainer.offsetWidth,R=r.config.position.split(" "),P=R[0],B=R.length>1?R[1]:null,V=E.getBoundingClientRect(),U=window.innerHeight-V.bottom,X=P==="above"||P!=="below"&&Uw,J=window.pageYOffset+V.top+(X?-w-2:E.offsetHeight+2);if(d(r.calendarContainer,"arrowTop",!X),d(r.calendarContainer,"arrowBottom",X),!r.config.inline){var xe=window.pageXOffset+V.left-(B!=null&&B==="center"?(D-V.width)/2:0),dt=window.document.body.offsetWidth-(window.pageXOffset+V.right),Jn=xe+D>window.document.body.offsetWidth,Fo=dt+D>window.document.body.offsetWidth;if(d(r.calendarContainer,"rightMost",Jn),!r.config.static)if(r.calendarContainer.style.top=J+"px",!Jn)r.calendarContainer.style.left=xe+"px",r.calendarContainer.style.right="auto";else if(!Fo)r.calendarContainer.style.left="auto",r.calendarContainer.style.right=dt+"px";else{var Zi=document.styleSheets[0];if(Zi===void 0)return;var ft=window.document.body.offsetWidth,zo=Math.max(0,ft/2-D/2),ht=".flatpickr-calendar.centerMost:before",er=".flatpickr-calendar.centerMost:after",Zn=Zi.cssRules.length,eb="{left:"+V.left+"px;right:auto;}";d(r.calendarContainer,"rightMost",!1),d(r.calendarContainer,"centerMost",!0),Zi.insertRule(ht+","+er+eb,Zn),r.calendarContainer.style.left=zo+"px",r.calendarContainer.style.right="auto"}}}}function $l(){r.config.noCalendar||r.isMobile||(Ji(),Ki())}function qo(){r._input.focus(),window.navigator.userAgent.indexOf("MSIE")!==-1||navigator.msMaxTouchPoints!==void 0?setTimeout(r.close,0):r.close()}function Bl(b){b.preventDefault(),b.stopPropagation();var E=function(J){return J.classList&&J.classList.contains("flatpickr-day")&&!J.classList.contains("flatpickr-disabled")&&!J.classList.contains("notAllowed")},w=m(b.target,E);if(w!==void 0){var D=w,R=r.latestSelectedDateObj=new Date(D.dateObj.getTime()),P=(R.getMonth()r.currentMonth+r.config.showMonths-1)&&r.config.mode!=="range";if(r.selectedDateElem=D,r.config.mode==="single")r.selectedDates=[R];else if(r.config.mode==="multiple"){var B=Bo(R);B?r.selectedDates.splice(parseInt(B),1):r.selectedDates.push(R)}else r.config.mode==="range"&&(r.selectedDates.length===2&&r.clear(!1,!1),r.latestSelectedDateObj=R,r.selectedDates.push(R),k(R,r.selectedDates[0],!0)!==0&&r.selectedDates.sort(function(J,xe){return J.getTime()-xe.getTime()}));if(ee(),P){var V=r.currentYear!==R.getFullYear();r.currentYear=R.getFullYear(),r.currentMonth=R.getMonth(),V&&(ie("onYearChange"),Gn()),ie("onMonthChange")}if(Ji(),Ki(),ut(),r.config.enableTime&&setTimeout(function(){return r.showTimeInput=!0},50),!P&&r.config.mode!=="range"&&r.config.showMonths===1?Ge(D):r.selectedDateElem!==void 0&&r.hourElement===void 0&&r.selectedDateElem&&r.selectedDateElem.focus(),r.hourElement!==void 0&&r.hourElement!==void 0&&r.hourElement.focus(),r.config.closeOnSelect){var U=r.config.mode==="single"&&!r.config.enableTime,X=r.config.mode==="range"&&r.selectedDates.length===2&&!r.config.enableTime;(U||X)&&qo()}lt()}}var Qi={locale:[ql,Rl],showMonths:[Pl,I,Nl],minDate:[ke],maxDate:[ke]};function Vv(b,E){if(b!==null&&typeof b=="object"){Object.assign(r.config,b);for(var w in b)Qi[w]!==void 0&&Qi[w].forEach(function(D){return D()})}else r.config[b]=E,Qi[b]!==void 0?Qi[b].forEach(function(D){return D()}):e.indexOf(b)>-1&&(r.config[b]=c(E));r.redraw(),ut(!1)}function Fl(b,E){var w=[];if(b instanceof Array)w=b.map(function(D){return r.parseDate(D,E)});else if(b instanceof Date||typeof b=="number")w=[r.parseDate(b,E)];else if(typeof b=="string")switch(r.config.mode){case"single":case"time":w=[r.parseDate(b,E)];break;case"multiple":w=b.split(r.config.conjunction).map(function(D){return r.parseDate(D,E)});break;case"range":w=b.split(r.l10n.rangeSeparator).map(function(D){return r.parseDate(D,E)});break;default:break}else r.config.errorHandler(new Error("Invalid date supplied: "+JSON.stringify(b)));r.selectedDates=w.filter(function(D){return D instanceof Date&&zt(D,!1)}),r.config.mode==="range"&&r.selectedDates.sort(function(D,R){return D.getTime()-R.getTime()})}function Yv(b,E,w){if(E===void 0&&(E=!1),w===void 0&&(w=r.config.dateFormat),b!==0&&!b||b instanceof Array&&b.length===0)return r.clear(E);Fl(b,w),r.showTimeInput=r.selectedDates.length>0,r.latestSelectedDateObj=r.selectedDates[r.selectedDates.length-1],r.redraw(),ke(),we(),r.selectedDates.length===0&&r.clear(!1),ut(E),E&&ie("onChange")}function zl(b){return b.slice().map(function(E){return typeof E=="string"||typeof E=="number"||E instanceof Date?r.parseDate(E,void 0,!0):E&&typeof E=="object"&&E.from&&E.to?{from:r.parseDate(E.from,void 0),to:r.parseDate(E.to,void 0)}:E}).filter(function(E){return E})}function Uv(){r.selectedDates=[],r.now=r.parseDate(r.config.now)||new Date;var b=r.config.defaultDate||((r.input.nodeName==="INPUT"||r.input.nodeName==="TEXTAREA")&&r.input.placeholder&&r.input.value===r.input.placeholder?null:r.input.value);b&&Fl(b,r.config.dateFormat),r._initialDate=r.selectedDates.length>0?r.selectedDates[0]:r.config.minDate&&r.config.minDate.getTime()>r.now.getTime()?r.config.minDate:r.config.maxDate&&r.config.maxDate.getTime()0&&(r.latestSelectedDateObj=r.selectedDates[0]),r.config.minTime!==void 0&&(r.config.minTime=r.parseDate(r.config.minTime,"H:i")),r.config.maxTime!==void 0&&(r.config.maxTime=r.parseDate(r.config.maxTime,"H:i")),r.minDateHasTime=!!r.config.minDate&&(r.config.minDate.getHours()>0||r.config.minDate.getMinutes()>0||r.config.minDate.getSeconds()>0),r.maxDateHasTime=!!r.config.maxDate&&(r.config.maxDate.getHours()>0||r.config.maxDate.getMinutes()>0||r.config.maxDate.getSeconds()>0),Object.defineProperty(r,"showTimeInput",{get:function(){return r._showTimeInput},set:function(E){r._showTimeInput=E,r.calendarContainer&&d(r.calendarContainer,"showTimeInput",E),r.isOpen&&Qn()}})}function Kv(){if(r.input=r.config.wrap?S.querySelector("[data-input]"):S,!r.input){r.config.errorHandler(new Error("Invalid input element specified"));return}r.input._type=r.input.type,r.input.type="text",r.input.classList.add("flatpickr-input"),r._input=r.input,r.config.altInput&&(r.altInput=u(r.input.nodeName,r.config.altInputClass),r._input=r.altInput,r.altInput.placeholder=r.input.placeholder,r.altInput.disabled=r.input.disabled,r.altInput.required=r.input.required,r.altInput.tabIndex=r.input.tabIndex,r.altInput.type="text",r.input.setAttribute("type","hidden"),!r.config.static&&r.input.parentNode&&r.input.parentNode.insertBefore(r.altInput,r.input.nextSibling)),r.config.allowInput||r._input.setAttribute("readonly","readonly"),r._positionElement=r.config.positionElement||r._input}function Gv(){var b=r.config.enableTime?r.config.noCalendar?"time":"datetime-local":"date";r.mobileInput=u("input",r.input.className+" flatpickr-mobile"),r.mobileInput.step=r.input.getAttribute("step")||"any",r.mobileInput.tabIndex=1,r.mobileInput.type=b,r.mobileInput.disabled=r.input.disabled,r.mobileInput.required=r.input.required,r.mobileInput.placeholder=r.input.placeholder,r.mobileFormatStr=b==="datetime-local"?"Y-m-d\\TH:i:S":b==="date"?"Y-m-d":"H:i:S",r.selectedDates.length>0&&(r.mobileInput.defaultValue=r.mobileInput.value=r.formatDate(r.selectedDates[0],r.mobileFormatStr)),r.config.minDate&&(r.mobileInput.min=r.formatDate(r.config.minDate,"Y-m-d")),r.config.maxDate&&(r.mobileInput.max=r.formatDate(r.config.maxDate,"Y-m-d")),r.input.type="hidden",r.altInput!==void 0&&(r.altInput.type="hidden");try{r.input.parentNode&&r.input.parentNode.insertBefore(r.mobileInput,r.input.nextSibling)}catch(E){}ne(r.mobileInput,"change",function(E){r.setDate(E.target.value,!1,r.mobileFormatStr),ie("onChange"),ie("onClose")})}function Xv(b){if(r.isOpen===!0)return r.close();r.open(b)}function ie(b,E){if(r.config!==void 0){var w=r.config[b];if(w!==void 0&&w.length>0)for(var D=0;w[D]&&D=0&&k(b,r.selectedDates[1])<=0}function Ji(){r.config.noCalendar||r.isMobile||!r.monthNav||(r.yearElements.forEach(function(b,E){var w=new Date(r.currentYear,r.currentMonth,1);w.setMonth(r.currentMonth+E),r.config.showMonths>1||r.config.monthSelectorType==="static"?r.monthElements[E].textContent=v(w.getMonth(),r.config.shorthandCurrentMonth,r.l10n)+" ":r.monthsDropdownContainer.value=w.getMonth().toString(),b.value=w.getFullYear().toString()}),r._hidePrevMonthArrow=r.config.minDate!==void 0&&(r.currentYear===r.config.minDate.getFullYear()?r.currentMonth<=r.config.minDate.getMonth():r.currentYearr.config.maxDate.getMonth():r.currentYear>r.config.maxDate.getFullYear()))}function Wl(b){return r.selectedDates.map(function(E){return r.formatDate(E,b)}).filter(function(E,w,D){return r.config.mode!=="range"||r.config.enableTime||D.indexOf(E)===w}).join(r.config.mode!=="range"?r.config.conjunction:r.l10n.rangeSeparator)}function ut(b){b===void 0&&(b=!0),r.mobileInput!==void 0&&r.mobileFormatStr&&(r.mobileInput.value=r.latestSelectedDateObj!==void 0?r.formatDate(r.latestSelectedDateObj,r.mobileFormatStr):""),r.input.value=Wl(r.config.dateFormat),r.altInput!==void 0&&(r.altInput.value=Wl(r.config.altFormat)),b!==!1&&ie("onValueUpdate")}function Jv(b){var E=r.prevMonthNav.contains(b.target),w=r.nextMonthNav.contains(b.target);E||w?Ro(E?-1:1):r.yearElements.indexOf(b.target)>=0?b.target.select():b.target.classList.contains("arrowUp")?r.changeYear(r.currentYear+1):b.target.classList.contains("arrowDown")&&r.changeYear(r.currentYear-1)}function Zv(b){b.preventDefault();var E=b.type==="keydown",w=b.target;r.amPM!==void 0&&b.target===r.amPM&&(r.amPM.textContent=r.l10n.amPM[s(r.amPM.textContent===r.l10n.amPM[0])]);var D=parseFloat(w.getAttribute("min")),R=parseFloat(w.getAttribute("max")),P=parseFloat(w.getAttribute("step")),B=parseInt(w.value,10),V=b.delta||(E?b.which===38?1:-1:0),U=B+P*V;if(typeof w.value!="undefined"&&w.value.length===2){var X=w===r.hourElement,J=w===r.minuteElement;UR&&(U=w===r.hourElement?U-R-s(!r.amPM):D,J&&xt(void 0,1,r.hourElement)),r.amPM&&X&&(P===1?U+B===23:Math.abs(U-B)>P)&&(r.amPM.textContent=r.l10n.amPM[s(r.amPM.textContent===r.l10n.amPM[0])]),w.value=o(U)}}return N(),r}function Z(S,T){for(var r=Array.prototype.slice.call(S).filter(function(I){return I instanceof HTMLElement}),Y=[],N=0;NZl,afterRead:()=>Xl,afterWrite:()=>nc,applyStyles:()=>xn,arrow:()=>rr,auto:()=>ti,basePlacements:()=>pt,beforeMain:()=>Ql,beforeRead:()=>Kl,beforeWrite:()=>ec,bottom:()=>fe,clippingParents:()=>Vo,computeStyles:()=>On,createPopper:()=>fr,createPopperBase:()=>uc,createPopperLite:()=>dc,detectOverflow:()=>Ae,end:()=>ni,eventListeners:()=>An,flip:()=>lr,hide:()=>cr,left:()=>ce,main:()=>Jl,modifierPhases:()=>Uo,offset:()=>ur,placements:()=>ri,popper:()=>Wt,popperGenerator:()=>Qt,popperOffsets:()=>Dn,preventOverflow:()=>dr,read:()=>Gl,reference:()=>Yo,right:()=>le,start:()=>Xe,top:()=>oe,variationPlacements:()=>nr,viewport:()=>ii,write:()=>tc});var oe="top",fe="bottom",le="right",ce="left",ti="auto",pt=[oe,fe,le,ce],Xe="start",ni="end",Vo="clippingParents",ii="viewport",Wt="popper",Yo="reference",nr=pt.reduce(function(t,e){return t.concat([e+"-"+Xe,e+"-"+ni])},[]),ri=[].concat(pt,[ti]).reduce(function(t,e){return t.concat([e,e+"-"+Xe,e+"-"+ni])},[]),Kl="beforeRead",Gl="read",Xl="afterRead",Ql="beforeMain",Jl="main",Zl="afterMain",ec="beforeWrite",tc="write",nc="afterWrite",Uo=[Kl,Gl,Xl,Ql,Jl,Zl,ec,tc,nc];function ge(t){return t?(t.nodeName||"").toLowerCase():null}function se(t){if(t==null)return window;if(t.toString()!=="[object Window]"){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function mt(t){var e=se(t).Element;return t instanceof e||t instanceof Element}function ue(t){var e=se(t).HTMLElement;return t instanceof e||t instanceof HTMLElement}function ir(t){if(typeof ShadowRoot=="undefined")return!1;var e=se(t).ShadowRoot;return t instanceof e||t instanceof ShadowRoot}function fb(t){var e=t.state;Object.keys(e.elements).forEach(function(n){var i=e.styles[n]||{},o=e.attributes[n]||{},s=e.elements[n];!ue(s)||!ge(s)||(Object.assign(s.style,i),Object.keys(o).forEach(function(a){var c=o[a];c===!1?s.removeAttribute(a):s.setAttribute(a,c===!0?"":c)}))})}function hb(t){var e=t.state,n={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,n.popper),e.styles=n,e.elements.arrow&&Object.assign(e.elements.arrow.style,n.arrow),function(){Object.keys(e.elements).forEach(function(i){var o=e.elements[i],s=e.attributes[i]||{},a=Object.keys(e.styles.hasOwnProperty(i)?e.styles[i]:n[i]),c=a.reduce(function(d,u){return d[u]="",d},{});!ue(o)||!ge(o)||(Object.assign(o.style,c),Object.keys(s).forEach(function(d){o.removeAttribute(d)}))})}}var xn={name:"applyStyles",enabled:!0,phase:"write",fn:fb,effect:hb,requires:["computeStyles"]};function ve(t){return t.split("-")[0]}var Ct=Math.round;function qe(t,e){e===void 0&&(e=!1);var n=t.getBoundingClientRect(),i=1,o=1;return ue(t)&&e&&(i=n.width/t.offsetWidth||1,o=n.height/t.offsetHeight||1),{width:Ct(n.width/i),height:Ct(n.height/o),top:Ct(n.top/o),right:Ct(n.right/i),bottom:Ct(n.bottom/o),left:Ct(n.left/i),x:Ct(n.left/i),y:Ct(n.top/o)}}function Vt(t){var e=qe(t),n=t.offsetWidth,i=t.offsetHeight;return Math.abs(e.width-n)<=1&&(n=e.width),Math.abs(e.height-i)<=1&&(i=e.height),{x:t.offsetLeft,y:t.offsetTop,width:n,height:i}}function oi(t,e){var n=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(n&&ir(n)){var i=e;do{if(i&&t.isSameNode(i))return!0;i=i.parentNode||i.host}while(i)}return!1}function Oe(t){return se(t).getComputedStyle(t)}function Ko(t){return["table","td","th"].indexOf(ge(t))>=0}function Ee(t){return((mt(t)?t.ownerDocument:t.document)||window.document).documentElement}function gt(t){return ge(t)==="html"?t:t.assignedSlot||t.parentNode||(ir(t)?t.host:null)||Ee(t)}function ic(t){return!ue(t)||Oe(t).position==="fixed"?null:t.offsetParent}function pb(t){var e=navigator.userAgent.toLowerCase().indexOf("firefox")!==-1,n=navigator.userAgent.indexOf("Trident")!==-1;if(n&&ue(t)){var i=Oe(t);if(i.position==="fixed")return null}for(var o=gt(t);ue(o)&&["html","body"].indexOf(ge(o))<0;){var s=Oe(o);if(s.transform!=="none"||s.perspective!=="none"||s.contain==="paint"||["transform","perspective"].indexOf(s.willChange)!==-1||e&&s.willChange==="filter"||e&&s.filter&&s.filter!=="none")return o;o=o.parentNode}return null}function Ye(t){for(var e=se(t),n=ic(t);n&&Ko(n)&&Oe(n).position==="static";)n=ic(n);return n&&(ge(n)==="html"||ge(n)==="body"&&Oe(n).position==="static")?e:n||pb(t)||e}function Yt(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}var $e=Math.max,Lt=Math.min,si=Math.round;function Ut(t,e,n){return $e(t,Lt(e,n))}function ai(){return{top:0,right:0,bottom:0,left:0}}function li(t){return Object.assign({},ai(),t)}function ci(t,e){return e.reduce(function(n,i){return n[i]=t,n},{})}var mb=function(e,n){return e=typeof e=="function"?e(Object.assign({},n.rects,{placement:n.placement})):e,li(typeof e!="number"?e:ci(e,pt))};function gb(t){var e,n=t.state,i=t.name,o=t.options,s=n.elements.arrow,a=n.modifiersData.popperOffsets,c=ve(n.placement),d=Yt(c),u=[ce,le].indexOf(c)>=0,l=u?"height":"width";if(!(!s||!a)){var m=mb(o.padding,n),f=Vt(s),p=d==="y"?oe:ce,g=d==="y"?fe:le,v=n.rects.reference[l]+n.rects.reference[d]-a[d]-n.rects.popper[l],h=a[d]-n.rects.reference[d],y=Ye(s),_=y?d==="y"?y.clientHeight||0:y.clientWidth||0:0,A=v/2-h/2,O=m[p],k=_-f[l]-m[g],M=_/2-f[l]/2+A,H=Ut(O,M,k),$=d;n.modifiersData[i]=(e={},e[$]=H,e.centerOffset=H-M,e)}}function vb(t){var e=t.state,n=t.options,i=n.element,o=i===void 0?"[data-popper-arrow]":i;o!=null&&(typeof o=="string"&&(o=e.elements.popper.querySelector(o),!o)||!oi(e.elements.popper,o)||(e.elements.arrow=o))}var rr={name:"arrow",enabled:!0,phase:"main",fn:gb,effect:vb,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};var bb={top:"auto",right:"auto",bottom:"auto",left:"auto"};function yb(t){var e=t.x,n=t.y,i=window,o=i.devicePixelRatio||1;return{x:si(si(e*o)/o)||0,y:si(si(n*o)/o)||0}}function rc(t){var e,n=t.popper,i=t.popperRect,o=t.placement,s=t.offsets,a=t.position,c=t.gpuAcceleration,d=t.adaptive,u=t.roundOffsets,l=u===!0?yb(s):typeof u=="function"?u(s):s,m=l.x,f=m===void 0?0:m,p=l.y,g=p===void 0?0:p,v=s.hasOwnProperty("x"),h=s.hasOwnProperty("y"),y=ce,_=oe,A=window;if(d){var O=Ye(n),k="clientHeight",M="clientWidth";O===se(n)&&(O=Ee(n),Oe(O).position!=="static"&&(k="scrollHeight",M="scrollWidth")),O=O,o===oe&&(_=fe,g-=O[k]-i.height,g*=c?1:-1),o===ce&&(y=le,f-=O[M]-i.width,f*=c?1:-1)}var H=Object.assign({position:a},d&&bb);if(c){var $;return Object.assign({},H,($={},$[_]=h?"0":"",$[y]=v?"0":"",$.transform=(A.devicePixelRatio||1)<2?"translate("+f+"px, "+g+"px)":"translate3d("+f+"px, "+g+"px, 0)",$))}return Object.assign({},H,(e={},e[_]=h?g+"px":"",e[y]=v?f+"px":"",e.transform="",e))}function Eb(t){var e=t.state,n=t.options,i=n.gpuAcceleration,o=i===void 0?!0:i,s=n.adaptive,a=s===void 0?!0:s,c=n.roundOffsets,d=c===void 0?!0:c;if(!1)var u;var l={placement:ve(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:o};e.modifiersData.popperOffsets!=null&&(e.styles.popper=Object.assign({},e.styles.popper,rc(Object.assign({},l,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:a,roundOffsets:d})))),e.modifiersData.arrow!=null&&(e.styles.arrow=Object.assign({},e.styles.arrow,rc(Object.assign({},l,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:d})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})}var On={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:Eb,data:{}};var or={passive:!0};function _b(t){var e=t.state,n=t.instance,i=t.options,o=i.scroll,s=o===void 0?!0:o,a=i.resize,c=a===void 0?!0:a,d=se(e.elements.popper),u=[].concat(e.scrollParents.reference,e.scrollParents.popper);return s&&u.forEach(function(l){l.addEventListener("scroll",n.update,or)}),c&&d.addEventListener("resize",n.update,or),function(){s&&u.forEach(function(l){l.removeEventListener("scroll",n.update,or)}),c&&d.removeEventListener("resize",n.update,or)}}var An={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:_b,data:{}};var Sb={left:"right",right:"left",bottom:"top",top:"bottom"};function Cn(t){return t.replace(/left|right|bottom|top/g,function(e){return Sb[e]})}var wb={start:"end",end:"start"};function sr(t){return t.replace(/start|end/g,function(e){return wb[e]})}function Kt(t){var e=se(t),n=e.pageXOffset,i=e.pageYOffset;return{scrollLeft:n,scrollTop:i}}function Gt(t){return qe(Ee(t)).left+Kt(t).scrollLeft}function Go(t){var e=se(t),n=Ee(t),i=e.visualViewport,o=n.clientWidth,s=n.clientHeight,a=0,c=0;return i&&(o=i.width,s=i.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(a=i.offsetLeft,c=i.offsetTop)),{width:o,height:s,x:a+Gt(t),y:c}}function Xo(t){var e,n=Ee(t),i=Kt(t),o=(e=t.ownerDocument)==null?void 0:e.body,s=$e(n.scrollWidth,n.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),a=$e(n.scrollHeight,n.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),c=-i.scrollLeft+Gt(t),d=-i.scrollTop;return Oe(o||n).direction==="rtl"&&(c+=$e(n.clientWidth,o?o.clientWidth:0)-s),{width:s,height:a,x:c,y:d}}function Xt(t){var e=Oe(t),n=e.overflow,i=e.overflowX,o=e.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+i)}function ar(t){return["html","body","#document"].indexOf(ge(t))>=0?t.ownerDocument.body:ue(t)&&Xt(t)?t:ar(gt(t))}function Dt(t,e){var n;e===void 0&&(e=[]);var i=ar(t),o=i===((n=t.ownerDocument)==null?void 0:n.body),s=se(i),a=o?[s].concat(s.visualViewport||[],Xt(i)?i:[]):i,c=e.concat(a);return o?c:c.concat(Dt(gt(a)))}function Ln(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function Tb(t){var e=qe(t);return e.top=e.top+t.clientTop,e.left=e.left+t.clientLeft,e.bottom=e.top+t.clientHeight,e.right=e.left+t.clientWidth,e.width=t.clientWidth,e.height=t.clientHeight,e.x=e.left,e.y=e.top,e}function oc(t,e){return e===ii?Ln(Go(t)):ue(e)?Tb(e):Ln(Xo(Ee(t)))}function xb(t){var e=Dt(gt(t)),n=["absolute","fixed"].indexOf(Oe(t).position)>=0,i=n&&ue(t)?Ye(t):t;return mt(i)?e.filter(function(o){return mt(o)&&oi(o,i)&&ge(o)!=="body"}):[]}function Qo(t,e,n){var i=e==="clippingParents"?xb(t):[].concat(e),o=[].concat(i,[n]),s=o[0],a=o.reduce(function(c,d){var u=oc(t,d);return c.top=$e(u.top,c.top),c.right=Lt(u.right,c.right),c.bottom=Lt(u.bottom,c.bottom),c.left=$e(u.left,c.left),c},oc(t,s));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}function Qe(t){return t.split("-")[1]}function ui(t){var e=t.reference,n=t.element,i=t.placement,o=i?ve(i):null,s=i?Qe(i):null,a=e.x+e.width/2-n.width/2,c=e.y+e.height/2-n.height/2,d;switch(o){case oe:d={x:a,y:e.y-n.height};break;case fe:d={x:a,y:e.y+e.height};break;case le:d={x:e.x+e.width,y:c};break;case ce:d={x:e.x-n.width,y:c};break;default:d={x:e.x,y:e.y}}var u=o?Yt(o):null;if(u!=null){var l=u==="y"?"height":"width";switch(s){case Xe:d[u]=d[u]-(e[l]/2-n[l]/2);break;case ni:d[u]=d[u]+(e[l]/2-n[l]/2);break;default:}}return d}function Ae(t,e){e===void 0&&(e={});var n=e,i=n.placement,o=i===void 0?t.placement:i,s=n.boundary,a=s===void 0?Vo:s,c=n.rootBoundary,d=c===void 0?ii:c,u=n.elementContext,l=u===void 0?Wt:u,m=n.altBoundary,f=m===void 0?!1:m,p=n.padding,g=p===void 0?0:p,v=li(typeof g!="number"?g:ci(g,pt)),h=l===Wt?Yo:Wt,y=t.elements.reference,_=t.rects.popper,A=t.elements[f?h:l],O=Qo(mt(A)?A:A.contextElement||Ee(t.elements.popper),a,d),k=qe(y),M=ui({reference:k,element:_,strategy:"absolute",placement:o}),H=Ln(Object.assign({},_,M)),$=l===Wt?H:k,G={top:O.top-$.top+v.top,bottom:$.bottom-O.bottom+v.bottom,left:O.left-$.left+v.left,right:$.right-O.right+v.right},Z=t.modifiersData.offset;if(l===Wt&&Z){var z=Z[o];Object.keys(G).forEach(function(S){var T=[le,fe].indexOf(S)>=0?1:-1,r=[oe,fe].indexOf(S)>=0?"y":"x";G[S]+=z[r]*T})}return G}function Jo(t,e){e===void 0&&(e={});var n=e,i=n.placement,o=n.boundary,s=n.rootBoundary,a=n.padding,c=n.flipVariations,d=n.allowedAutoPlacements,u=d===void 0?ri:d,l=Qe(i),m=l?c?nr:nr.filter(function(g){return Qe(g)===l}):pt,f=m.filter(function(g){return u.indexOf(g)>=0});f.length===0&&(f=m);var p=f.reduce(function(g,v){return g[v]=Ae(t,{placement:v,boundary:o,rootBoundary:s,padding:a})[ve(v)],g},{});return Object.keys(p).sort(function(g,v){return p[g]-p[v]})}function Ob(t){if(ve(t)===ti)return[];var e=Cn(t);return[sr(t),e,sr(e)]}function Ab(t){var e=t.state,n=t.options,i=t.name;if(!e.modifiersData[i]._skip){for(var o=n.mainAxis,s=o===void 0?!0:o,a=n.altAxis,c=a===void 0?!0:a,d=n.fallbackPlacements,u=n.padding,l=n.boundary,m=n.rootBoundary,f=n.altBoundary,p=n.flipVariations,g=p===void 0?!0:p,v=n.allowedAutoPlacements,h=e.options.placement,y=ve(h),_=y===h,A=d||(_||!g?[Cn(h)]:Ob(h)),O=[h].concat(A).reduce(function(Te,pe){return Te.concat(ve(pe)===ti?Jo(e,{placement:pe,boundary:l,rootBoundary:m,padding:u,flipVariations:g,allowedAutoPlacements:v}):pe)},[]),k=e.rects.reference,M=e.rects.popper,H=new Map,$=!0,G=O[0],Z=0;Z=0,Y=r?"width":"height",N=Ae(e,{placement:z,boundary:l,rootBoundary:m,altBoundary:f,padding:u}),L=r?T?le:ce:T?fe:oe;k[Y]>M[Y]&&(L=Cn(L));var I=Cn(L),q=[];if(s&&q.push(N[S]<=0),c&&q.push(N[L]<=0,N[I]<=0),q.every(function(Te){return Te})){G=z,$=!1;break}H.set(z,q)}if($)for(var W=g?3:1,te=function(pe){var at=O.find(function(ne){var me=H.get(ne);if(me)return me.slice(0,pe).every(function(lt){return lt})});if(at)return G=at,"break"},ee=W;ee>0;ee--){var we=te(ee);if(we==="break")break}e.placement!==G&&(e.modifiersData[i]._skip=!0,e.placement=G,e.reset=!0)}}var lr={name:"flip",enabled:!0,phase:"main",fn:Ab,requiresIfExists:["offset"],data:{_skip:!1}};function sc(t,e,n){return n===void 0&&(n={x:0,y:0}),{top:t.top-e.height-n.y,right:t.right-e.width+n.x,bottom:t.bottom-e.height+n.y,left:t.left-e.width-n.x}}function ac(t){return[oe,le,fe,ce].some(function(e){return t[e]>=0})}function Cb(t){var e=t.state,n=t.name,i=e.rects.reference,o=e.rects.popper,s=e.modifiersData.preventOverflow,a=Ae(e,{elementContext:"reference"}),c=Ae(e,{altBoundary:!0}),d=sc(a,i),u=sc(c,o,s),l=ac(d),m=ac(u);e.modifiersData[n]={referenceClippingOffsets:d,popperEscapeOffsets:u,isReferenceHidden:l,hasPopperEscaped:m},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":l,"data-popper-escaped":m})}var cr={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:Cb};function Lb(t,e,n){var i=ve(t),o=[ce,oe].indexOf(i)>=0?-1:1,s=typeof n=="function"?n(Object.assign({},e,{placement:t})):n,a=s[0],c=s[1];return a=a||0,c=(c||0)*o,[ce,le].indexOf(i)>=0?{x:c,y:a}:{x:a,y:c}}function Db(t){var e=t.state,n=t.options,i=t.name,o=n.offset,s=o===void 0?[0,0]:o,a=ri.reduce(function(l,m){return l[m]=Lb(m,e.rects,s),l},{}),c=a[e.placement],d=c.x,u=c.y;e.modifiersData.popperOffsets!=null&&(e.modifiersData.popperOffsets.x+=d,e.modifiersData.popperOffsets.y+=u),e.modifiersData[i]=a}var ur={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:Db};function Mb(t){var e=t.state,n=t.name;e.modifiersData[n]=ui({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})}var Dn={name:"popperOffsets",enabled:!0,phase:"read",fn:Mb,data:{}};function Zo(t){return t==="x"?"y":"x"}function Ib(t){var e=t.state,n=t.options,i=t.name,o=n.mainAxis,s=o===void 0?!0:o,a=n.altAxis,c=a===void 0?!1:a,d=n.boundary,u=n.rootBoundary,l=n.altBoundary,m=n.padding,f=n.tether,p=f===void 0?!0:f,g=n.tetherOffset,v=g===void 0?0:g,h=Ae(e,{boundary:d,rootBoundary:u,padding:m,altBoundary:l}),y=ve(e.placement),_=Qe(e.placement),A=!_,O=Yt(y),k=Zo(O),M=e.modifiersData.popperOffsets,H=e.rects.reference,$=e.rects.popper,G=typeof v=="function"?v(Object.assign({},e.rects,{placement:e.placement})):v,Z={x:0,y:0};if(!!M){if(s||c){var z=O==="y"?oe:ce,S=O==="y"?fe:le,T=O==="y"?"height":"width",r=M[O],Y=M[O]+h[z],N=M[O]-h[S],L=p?-$[T]/2:0,I=_===Xe?H[T]:$[T],q=_===Xe?-$[T]:-H[T],W=e.elements.arrow,te=p&&W?Vt(W):{width:0,height:0},ee=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:ai(),we=ee[z],Te=ee[S],pe=Ut(0,H[T],te[T]),at=A?H[T]/2-L-pe-we-G:I-pe-we-G,ne=A?-H[T]/2+L+pe+Te+G:q+pe+Te+G,me=e.elements.arrow&&Ye(e.elements.arrow),lt=me?O==="y"?me.clientTop||0:me.clientLeft||0:0,Tt=e.modifiersData.offset?e.modifiersData.offset[e.placement][O]:0,ke=M[O]+at-Tt-lt,Ft=M[O]+ne-Tt;if(s){var xt=Ut(p?Lt(Y,ke):Y,r,p?$e(N,Ft):N);M[O]=xt,Z[O]=xt-r}if(c){var Tn=O==="x"?oe:ce,Ot=O==="x"?fe:le,Ge=M[k],ct=Ge+h[Tn],Ui=Ge-h[Ot],At=Ut(p?Lt(ct,ke):ct,Ge,p?$e(Ui,Ft):Ui);M[k]=At,Z[k]=At-Ge}}e.modifiersData[i]=Z}}var dr={name:"preventOverflow",enabled:!0,phase:"main",fn:Ib,requiresIfExists:["offset"]};function es(t){return{scrollLeft:t.scrollLeft,scrollTop:t.scrollTop}}function ts(t){return t===se(t)||!ue(t)?Kt(t):es(t)}function kb(t){var e=t.getBoundingClientRect(),n=e.width/t.offsetWidth||1,i=e.height/t.offsetHeight||1;return n!==1||i!==1}function ns(t,e,n){n===void 0&&(n=!1);var i=ue(e),o=ue(e)&&kb(e),s=Ee(e),a=qe(t,o),c={scrollLeft:0,scrollTop:0},d={x:0,y:0};return(i||!i&&!n)&&((ge(e)!=="body"||Xt(s))&&(c=ts(e)),ue(e)?(d=qe(e,!0),d.x+=e.clientLeft,d.y+=e.clientTop):s&&(d.x=Gt(s))),{x:a.left+c.scrollLeft-d.x,y:a.top+c.scrollTop-d.y,width:a.width,height:a.height}}function Pb(t){var e=new Map,n=new Set,i=[];t.forEach(function(s){e.set(s.name,s)});function o(s){n.add(s.name);var a=[].concat(s.requires||[],s.requiresIfExists||[]);a.forEach(function(c){if(!n.has(c)){var d=e.get(c);d&&o(d)}}),i.push(s)}return t.forEach(function(s){n.has(s.name)||o(s)}),i}function is(t){var e=Pb(t);return Uo.reduce(function(n,i){return n.concat(e.filter(function(o){return o.phase===i}))},[])}function rs(t){var e;return function(){return e||(e=new Promise(function(n){Promise.resolve().then(function(){e=void 0,n(t())})})),e}}function os(t){var e=t.reduce(function(n,i){var o=n[i.name];return n[i.name]=o?Object.assign({},o,i,{options:Object.assign({},o.options,i.options),data:Object.assign({},o.data,i.data)}):i,n},{});return Object.keys(e).map(function(n){return e[n]})}var lc={placement:"bottom",modifiers:[],strategy:"absolute"};function cc(){for(var t=arguments.length,e=new Array(t),n=0;nn.matches(e))},parents(t,e){let n=[],i=t.parentNode;for(;i&&i.nodeType===Node.ELEMENT_NODE&&i.nodeType!==jb;)i.matches(e)&&n.push(i),i=i.parentNode;return n},prev(t,e){let n=t.previousElementSibling;for(;n;){if(n.matches(e))return[n];n=n.previousElementSibling}return[]},next(t,e){let n=t.nextElementSibling;for(;n;){if(n.matches(e))return[n];n=n.nextElementSibling}return[]}},Hb=1e6,qb=1e3,ss="transitionend",$b=t=>t==null?`${t}`:{}.toString.call(t).match(/\s([a-z]+)/i)[1].toLowerCase(),fc=t=>{do t+=Math.floor(Math.random()*Hb);while(document.getElementById(t));return t},hc=t=>{let e=t.getAttribute("data-bs-target");if(!e||e==="#"){let n=t.getAttribute("href");if(!n||!n.includes("#")&&!n.startsWith("."))return null;n.includes("#")&&!n.startsWith("#")&&(n=`#${n.split("#")[1]}`),e=n&&n!=="#"?n.trim():null}return e},as=t=>{let e=hc(t);return e&&document.querySelector(e)?e:null},Mt=t=>{let e=hc(t);return e?document.querySelector(e):null},Bb=t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:n}=window.getComputedStyle(t),i=Number.parseFloat(e),o=Number.parseFloat(n);return!i&&!o?0:(e=e.split(",")[0],n=n.split(",")[0],(Number.parseFloat(e)+Number.parseFloat(n))*qb)},pc=t=>{t.dispatchEvent(new Event(ss))},It=t=>!t||typeof t!="object"?!1:(typeof t.jquery!="undefined"&&(t=t[0]),typeof t.nodeType!="undefined"),Mn=t=>It(t)?t.jquery?t[0]:t:typeof t=="string"&&t.length>0?F.findOne(t):null,vt=(t,e,n)=>{Object.keys(n).forEach(i=>{let o=n[i],s=e[i],a=s&&It(s)?"element":$b(s);if(!new RegExp(o).test(a))throw new TypeError(`${t.toUpperCase()}: Option "${i}" provided type "${a}" but expected type "${o}".`)})},pr=t=>!It(t)||t.getClientRects().length===0?!1:getComputedStyle(t).getPropertyValue("visibility")==="visible",In=t=>!t||t.nodeType!==Node.ELEMENT_NODE||t.classList.contains("disabled")?!0:typeof t.disabled!="undefined"?t.disabled:t.hasAttribute("disabled")&&t.getAttribute("disabled")!=="false",mc=t=>{if(!document.documentElement.attachShadow)return null;if(typeof t.getRootNode=="function"){let e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?mc(t.parentNode):null},mr=()=>{},kn=t=>t.offsetHeight,gc=()=>{let{jQuery:t}=window;return t&&!document.body.hasAttribute("data-bs-no-jquery")?t:null},ls=[],Fb=t=>{document.readyState==="loading"?(ls.length||document.addEventListener("DOMContentLoaded",()=>{ls.forEach(e=>e())}),ls.push(t)):t()},De=()=>document.documentElement.dir==="rtl",Be=t=>{Fb(()=>{let e=gc();if(e){let n=t.NAME,i=e.fn[n];e.fn[n]=t.jQueryInterface,e.fn[n].Constructor=t,e.fn[n].noConflict=()=>(e.fn[n]=i,t.jQueryInterface)}})},Jt=t=>{typeof t=="function"&&t()},vc=(t,e,n=!0)=>{if(!n){Jt(t);return}let i=5,o=Bb(e)+i,s=!1,a=({target:c})=>{c===e&&(s=!0,e.removeEventListener(ss,a),Jt(t))};e.addEventListener(ss,a),setTimeout(()=>{s||pc(e)},o)},bc=(t,e,n,i)=>{let o=t.indexOf(e);if(o===-1)return t[!n&&i?t.length-1:0];let s=t.length;return o+=n?1:-1,i&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))]},zb=/[^.]*(?=\..*)\.|.*/,Wb=/\..*/,Vb=/::\d+$/,cs={},yc=1,Yb={mouseenter:"mouseover",mouseleave:"mouseout"},Ub=/^(mouseenter|mouseleave)/i,Ec=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function _c(t,e){return e&&`${e}::${yc++}`||t.uidEvent||yc++}function Sc(t){let e=_c(t);return t.uidEvent=e,cs[e]=cs[e]||{},cs[e]}function Kb(t,e){return function n(i){return i.delegateTarget=t,n.oneOff&&C.off(t,i.type,e),e.apply(t,[i])}}function Gb(t,e,n){return function i(o){let s=t.querySelectorAll(e);for(let{target:a}=o;a&&a!==this;a=a.parentNode)for(let c=s.length;c--;)if(s[c]===a)return o.delegateTarget=a,i.oneOff&&C.off(t,o.type,e,n),n.apply(a,[o]);return null}}function wc(t,e,n=null){let i=Object.keys(t);for(let o=0,s=i.length;ofunction(v){if(!v.relatedTarget||v.relatedTarget!==v.delegateTarget&&!v.delegateTarget.contains(v.relatedTarget))return g.call(this,v)};i?i=p(i):n=p(n)}let[s,a,c]=Tc(e,n,i),d=Sc(t),u=d[c]||(d[c]={}),l=wc(u,a,s?n:null);if(l){l.oneOff=l.oneOff&&o;return}let m=_c(a,e.replace(zb,"")),f=s?Gb(t,n,i):Kb(t,n);f.delegationSelector=s?n:null,f.originalHandler=a,f.oneOff=o,f.uidEvent=m,u[m]=f,t.addEventListener(c,f,s)}function us(t,e,n,i,o){let s=wc(e[n],i,o);!s||(t.removeEventListener(n,s,Boolean(o)),delete e[n][s.uidEvent])}function Xb(t,e,n,i){let o=e[n]||{};Object.keys(o).forEach(s=>{if(s.includes(i)){let a=o[s];us(t,e,n,a.originalHandler,a.delegationSelector)}})}function Oc(t){return t=t.replace(Wb,""),Yb[t]||t}var C={on(t,e,n,i){xc(t,e,n,i,!1)},one(t,e,n,i){xc(t,e,n,i,!0)},off(t,e,n,i){if(typeof e!="string"||!t)return;let[o,s,a]=Tc(e,n,i),c=a!==e,d=Sc(t),u=e.startsWith(".");if(typeof s!="undefined"){if(!d||!d[a])return;us(t,d,a,s,o?n:null);return}u&&Object.keys(d).forEach(m=>{Xb(t,d,m,e.slice(1))});let l=d[a]||{};Object.keys(l).forEach(m=>{let f=m.replace(Vb,"");if(!c||e.includes(f)){let p=l[m];us(t,d,a,p.originalHandler,p.delegationSelector)}})},trigger(t,e,n){if(typeof e!="string"||!t)return null;let i=gc(),o=Oc(e),s=e!==o,a=Ec.has(o),c,d=!0,u=!0,l=!1,m=null;return s&&i&&(c=i.Event(e,n),i(t).trigger(c),d=!c.isPropagationStopped(),u=!c.isImmediatePropagationStopped(),l=c.isDefaultPrevented()),a?(m=document.createEvent("HTMLEvents"),m.initEvent(o,d,!0)):m=new CustomEvent(e,{bubbles:d,cancelable:!0}),typeof n!="undefined"&&Object.keys(n).forEach(f=>{Object.defineProperty(m,f,{get(){return n[f]}})}),l&&m.preventDefault(),u&&t.dispatchEvent(m),m.defaultPrevented&&typeof c!="undefined"&&c.preventDefault(),m}},kt=new Map,Zt={set(t,e,n){kt.has(t)||kt.set(t,new Map);let i=kt.get(t);if(!i.has(e)&&i.size!==0){console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(i.keys())[0]}.`);return}i.set(e,n)},get(t,e){return kt.has(t)&&kt.get(t).get(e)||null},remove(t,e){if(!kt.has(t))return;let n=kt.get(t);n.delete(e),n.size===0&&kt.delete(t)}},Qb="5.0.2",Fe=class{constructor(e){e=Mn(e),!!e&&(this._element=e,Zt.set(this._element,this.constructor.DATA_KEY,this))}dispose(){Zt.remove(this._element,this.constructor.DATA_KEY),C.off(this._element,this.constructor.EVENT_KEY),Object.getOwnPropertyNames(this).forEach(e=>{this[e]=null})}_queueCallback(e,n,i=!0){vc(e,n,i)}static getInstance(e){return Zt.get(e,this.DATA_KEY)}static getOrCreateInstance(e,n={}){return this.getInstance(e)||new this(e,typeof n=="object"?n:null)}static get VERSION(){return Qb}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}},Jb="alert",Zb="bs.alert",ds=`.${Zb}`,ey=".data-api",ty='[data-bs-dismiss="alert"]',ny=`close${ds}`,iy=`closed${ds}`,ry=`click${ds}${ey}`,oy="alert",sy="fade",ay="show",Pn=class extends Fe{static get NAME(){return Jb}close(e){let n=e?this._getRootElement(e):this._element,i=this._triggerCloseEvent(n);i===null||i.defaultPrevented||this._removeElement(n)}_getRootElement(e){return Mt(e)||e.closest(`.${oy}`)}_triggerCloseEvent(e){return C.trigger(e,ny)}_removeElement(e){e.classList.remove(ay);let n=e.classList.contains(sy);this._queueCallback(()=>this._destroyElement(e),e,n)}_destroyElement(e){e.remove(),C.trigger(e,iy)}static jQueryInterface(e){return this.each(function(){let n=Pn.getOrCreateInstance(this);e==="close"&&n[e](this)})}static handleDismiss(e){return function(n){n&&n.preventDefault(),e.close(this)}}};C.on(document,ry,ty,Pn.handleDismiss(new Pn));Be(Pn);var ly="button",cy="bs.button",uy=`.${cy}`,dy=".data-api",fy="active",Ac='[data-bs-toggle="button"]',hy=`click${uy}${dy}`,di=class extends Fe{static get NAME(){return ly}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle(fy))}static jQueryInterface(e){return this.each(function(){let n=di.getOrCreateInstance(this);e==="toggle"&&n[e]()})}};C.on(document,hy,Ac,t=>{t.preventDefault();let e=t.target.closest(Ac);di.getOrCreateInstance(e).toggle()});Be(di);function Cc(t){return t==="true"?!0:t==="false"?!1:t===Number(t).toString()?Number(t):t===""||t==="null"?null:t}function fs(t){return t.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)}var be={setDataAttribute(t,e,n){t.setAttribute(`data-bs-${fs(e)}`,n)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${fs(e)}`)},getDataAttributes(t){if(!t)return{};let e={};return Object.keys(t.dataset).filter(n=>n.startsWith("bs")).forEach(n=>{let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=Cc(t.dataset[n])}),e},getDataAttribute(t,e){return Cc(t.getAttribute(`data-bs-${fs(e)}`))},offset(t){let e=t.getBoundingClientRect();return{top:e.top+document.body.scrollTop,left:e.left+document.body.scrollLeft}},position(t){return{top:t.offsetTop,left:t.offsetLeft}}},Lc="carousel",py="bs.carousel",Ne=`.${py}`,Dc=".data-api",my="ArrowLeft",gy="ArrowRight",vy=500,by=40,Mc={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},yy={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},en="next",tn="prev",nn="left",fi="right",Ey={[my]:fi,[gy]:nn},_y=`slide${Ne}`,Ic=`slid${Ne}`,Sy=`keydown${Ne}`,wy=`mouseenter${Ne}`,Ty=`mouseleave${Ne}`,xy=`touchstart${Ne}`,Oy=`touchmove${Ne}`,Ay=`touchend${Ne}`,Cy=`pointerdown${Ne}`,Ly=`pointerup${Ne}`,Dy=`dragstart${Ne}`,My=`load${Ne}${Dc}`,Iy=`click${Ne}${Dc}`,ky="carousel",rn="active",Py="slide",Ny="carousel-item-end",Ry="carousel-item-start",jy="carousel-item-next",Hy="carousel-item-prev",qy="pointer-event",$y=".active",gr=".active.carousel-item",By=".carousel-item",Fy=".carousel-item img",zy=".carousel-item-next, .carousel-item-prev",Wy=".carousel-indicators",Vy="[data-bs-target]",Yy="[data-bs-slide], [data-bs-slide-to]",Uy='[data-bs-ride="carousel"]',kc="touch",Pc="pen",Je=class extends Fe{constructor(e,n){super(e);this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(n),this._indicatorsElement=F.findOne(Wy,this._element),this._touchSupported="ontouchstart"in document.documentElement||navigator.maxTouchPoints>0,this._pointerEvent=Boolean(window.PointerEvent),this._addEventListeners()}static get Default(){return Mc}static get NAME(){return Lc}next(){this._slide(en)}nextWhenVisible(){!document.hidden&&pr(this._element)&&this.next()}prev(){this._slide(tn)}pause(e){e||(this._isPaused=!0),F.findOne(zy,this._element)&&(pc(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null}cycle(e){e||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config&&this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))}to(e){this._activeElement=F.findOne(gr,this._element);let n=this._getItemIndex(this._activeElement);if(e>this._items.length-1||e<0)return;if(this._isSliding){C.one(this._element,Ic,()=>this.to(e));return}if(n===e){this.pause(),this.cycle();return}let i=e>n?en:tn;this._slide(i,this._items[e])}_getConfig(e){return e=K(K(K({},Mc),be.getDataAttributes(this._element)),typeof e=="object"?e:{}),vt(Lc,e,yy),e}_handleSwipe(){let e=Math.abs(this.touchDeltaX);if(e<=by)return;let n=e/this.touchDeltaX;this.touchDeltaX=0,!!n&&this._slide(n>0?fi:nn)}_addEventListeners(){this._config.keyboard&&C.on(this._element,Sy,e=>this._keydown(e)),this._config.pause==="hover"&&(C.on(this._element,wy,e=>this.pause(e)),C.on(this._element,Ty,e=>this.cycle(e))),this._config.touch&&this._touchSupported&&this._addTouchEventListeners()}_addTouchEventListeners(){let e=o=>{this._pointerEvent&&(o.pointerType===Pc||o.pointerType===kc)?this.touchStartX=o.clientX:this._pointerEvent||(this.touchStartX=o.touches[0].clientX)},n=o=>{this.touchDeltaX=o.touches&&o.touches.length>1?0:o.touches[0].clientX-this.touchStartX},i=o=>{this._pointerEvent&&(o.pointerType===Pc||o.pointerType===kc)&&(this.touchDeltaX=o.clientX-this.touchStartX),this._handleSwipe(),this._config.pause==="hover"&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(s=>this.cycle(s),vy+this._config.interval))};F.find(Fy,this._element).forEach(o=>{C.on(o,Dy,s=>s.preventDefault())}),this._pointerEvent?(C.on(this._element,Cy,o=>e(o)),C.on(this._element,Ly,o=>i(o)),this._element.classList.add(qy)):(C.on(this._element,xy,o=>e(o)),C.on(this._element,Oy,o=>n(o)),C.on(this._element,Ay,o=>i(o)))}_keydown(e){if(/input|textarea/i.test(e.target.tagName))return;let n=Ey[e.key];n&&(e.preventDefault(),this._slide(n))}_getItemIndex(e){return this._items=e&&e.parentNode?F.find(By,e.parentNode):[],this._items.indexOf(e)}_getItemByOrder(e,n){let i=e===en;return bc(this._items,n,i,this._config.wrap)}_triggerSlideEvent(e,n){let i=this._getItemIndex(e),o=this._getItemIndex(F.findOne(gr,this._element));return C.trigger(this._element,_y,{relatedTarget:e,direction:n,from:o,to:i})}_setActiveIndicatorElement(e){if(this._indicatorsElement){let n=F.findOne($y,this._indicatorsElement);n.classList.remove(rn),n.removeAttribute("aria-current");let i=F.find(Vy,this._indicatorsElement);for(let o=0;o{C.trigger(this._element,Ic,{relatedTarget:a,direction:f,from:s,to:c})};if(this._element.classList.contains(Py)){a.classList.add(m),kn(a),o.classList.add(l),a.classList.add(l);let v=()=>{a.classList.remove(l,m),a.classList.add(rn),o.classList.remove(rn,m,l),this._isSliding=!1,setTimeout(g,0)};this._queueCallback(v,o,!0)}else o.classList.remove(rn),a.classList.add(rn),this._isSliding=!1,g();d&&this.cycle()}_directionToOrder(e){return[fi,nn].includes(e)?De()?e===nn?tn:en:e===nn?en:tn:e}_orderToDirection(e){return[en,tn].includes(e)?De()?e===tn?nn:fi:e===tn?fi:nn:e}static carouselInterface(e,n){let i=Je.getOrCreateInstance(e,n),{_config:o}=i;typeof n=="object"&&(o=K(K({},o),n));let s=typeof n=="string"?n:o.slide;if(typeof n=="number")i.to(n);else if(typeof s=="string"){if(typeof i[s]=="undefined")throw new TypeError(`No method named "${s}"`);i[s]()}else o.interval&&o.ride&&(i.pause(),i.cycle())}static jQueryInterface(e){return this.each(function(){Je.carouselInterface(this,e)})}static dataApiClickHandler(e){let n=Mt(this);if(!n||!n.classList.contains(ky))return;let i=K(K({},be.getDataAttributes(n)),be.getDataAttributes(this)),o=this.getAttribute("data-bs-slide-to");o&&(i.interval=!1),Je.carouselInterface(n,i),o&&Je.getInstance(n).to(o),e.preventDefault()}};C.on(document,Iy,Yy,Je.dataApiClickHandler);C.on(window,My,()=>{let t=F.find(Uy);for(let e=0,n=t.length;eu===this._element);c!==null&&d.length&&(this._selector=c,this._triggerArray.push(a))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}static get Default(){return hs}static get NAME(){return Nc}toggle(){this._element.classList.contains(on)?this.hide():this.show()}show(){if(this._isTransitioning||this._element.classList.contains(on))return;let e,n;this._parent&&(e=F.find(nE,this._parent).filter(u=>typeof this._config.parent=="string"?u.getAttribute("data-bs-parent")===this._config.parent:u.classList.contains(pi)),e.length===0&&(e=null));let i=F.findOne(this._selector);if(e){let u=e.find(l=>i!==l);if(n=u?Me.getInstance(u):null,n&&n._isTransitioning)return}if(C.trigger(this._element,Xy).defaultPrevented)return;e&&e.forEach(u=>{i!==u&&Me.collapseInterface(u,"hide"),n||Zt.set(u,Rc,null)});let s=this._getDimension();this._element.classList.remove(pi),this._element.classList.add(vr),this._element.style[s]=0,this._triggerArray.length&&this._triggerArray.forEach(u=>{u.classList.remove(br),u.setAttribute("aria-expanded",!0)}),this.setTransitioning(!0);let a=()=>{this._element.classList.remove(vr),this._element.classList.add(pi,on),this._element.style[s]="",this.setTransitioning(!1),C.trigger(this._element,Qy)},d=`scroll${s[0].toUpperCase()+s.slice(1)}`;this._queueCallback(a,this._element,!0),this._element.style[s]=`${this._element[d]}px`}hide(){if(this._isTransitioning||!this._element.classList.contains(on)||C.trigger(this._element,Jy).defaultPrevented)return;let n=this._getDimension();this._element.style[n]=`${this._element.getBoundingClientRect()[n]}px`,kn(this._element),this._element.classList.add(vr),this._element.classList.remove(pi,on);let i=this._triggerArray.length;if(i>0)for(let s=0;s{this.setTransitioning(!1),this._element.classList.remove(vr),this._element.classList.add(pi),C.trigger(this._element,Zy)};this._element.style[n]="",this._queueCallback(o,this._element,!0)}setTransitioning(e){this._isTransitioning=e}_getConfig(e){return e=K(K({},hs),e),e.toggle=Boolean(e.toggle),vt(Nc,e,Gy),e}_getDimension(){return this._element.classList.contains(jc)?jc:tE}_getParent(){let{parent:e}=this._config;e=Mn(e);let n=`${mi}[data-bs-parent="${e}"]`;return F.find(n,e).forEach(i=>{let o=Mt(i);this._addAriaAndCollapsedClass(o,[i])}),e}_addAriaAndCollapsedClass(e,n){if(!e||!n.length)return;let i=e.classList.contains(on);n.forEach(o=>{i?o.classList.remove(br):o.classList.add(br),o.setAttribute("aria-expanded",i)})}static collapseInterface(e,n){let i=Me.getInstance(e),o=K(K(K({},hs),be.getDataAttributes(e)),typeof n=="object"&&n?n:{});if(!i&&o.toggle&&typeof n=="string"&&/show|hide/.test(n)&&(o.toggle=!1),i||(i=new Me(e,o)),typeof n=="string"){if(typeof i[n]=="undefined")throw new TypeError(`No method named "${n}"`);i[n]()}}static jQueryInterface(e){return this.each(function(){Me.collapseInterface(this,e)})}};C.on(document,eE,mi,function(t){(t.target.tagName==="A"||t.delegateTarget&&t.delegateTarget.tagName==="A")&&t.preventDefault();let e=be.getDataAttributes(this),n=as(this);F.find(n).forEach(o=>{let s=Me.getInstance(o),a;s?(s._parent===null&&typeof e.parent=="string"&&(s._config.parent=e.parent,s._parent=s._getParent()),a="toggle"):a=e,Me.collapseInterface(o,a)})});Be(Me);var ps="dropdown",iE="bs.dropdown",Pt=`.${iE}`,ms=".data-api",yr="Escape",Hc="Space",qc="Tab",gs="ArrowUp",Er="ArrowDown",rE=2,oE=new RegExp(`${gs}|${Er}|${yr}`),sE=`hide${Pt}`,aE=`hidden${Pt}`,lE=`show${Pt}`,cE=`shown${Pt}`,uE=`click${Pt}`,$c=`click${Pt}${ms}`,Bc=`keydown${Pt}${ms}`,dE=`keyup${Pt}${ms}`,bt="show",fE="dropup",hE="dropend",pE="dropstart",mE="navbar",gi='[data-bs-toggle="dropdown"]',vs=".dropdown-menu",gE=".navbar-nav",vE=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",bE=De()?"top-end":"top-start",yE=De()?"top-start":"top-end",EE=De()?"bottom-end":"bottom-start",_E=De()?"bottom-start":"bottom-end",SE=De()?"left-start":"right-start",wE=De()?"right-start":"left-start",TE={offset:[0,2],boundary:"clippingParents",reference:"toggle",display:"dynamic",popperConfig:null,autoClose:!0},xE={offset:"(array|string|function)",boundary:"(string|element)",reference:"(string|element|object)",display:"string",popperConfig:"(null|object|function)",autoClose:"(boolean|string)"},Ce=class extends Fe{constructor(e,n){super(e);this._popper=null,this._config=this._getConfig(n),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}static get Default(){return TE}static get DefaultType(){return xE}static get NAME(){return ps}toggle(){if(In(this._element))return;if(this._element.classList.contains(bt)){this.hide();return}this.show()}show(){if(In(this._element)||this._menu.classList.contains(bt))return;let e=Ce.getParentFromElement(this._element),n={relatedTarget:this._element};if(!C.trigger(this._element,lE,n).defaultPrevented){if(this._inNavbar)be.setDataAttribute(this._menu,"popper","none");else{if(typeof hr=="undefined")throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let o=this._element;this._config.reference==="parent"?o=e:It(this._config.reference)?o=Mn(this._config.reference):typeof this._config.reference=="object"&&(o=this._config.reference);let s=this._getPopperConfig(),a=s.modifiers.find(c=>c.name==="applyStyles"&&c.enabled===!1);this._popper=fr(o,this._menu,s),a&&be.setDataAttribute(this._menu,"popper","static")}"ontouchstart"in document.documentElement&&!e.closest(gE)&&[].concat(...document.body.children).forEach(o=>C.on(o,"mouseover",mr)),this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.toggle(bt),this._element.classList.toggle(bt),C.trigger(this._element,cE,n)}}hide(){if(In(this._element)||!this._menu.classList.contains(bt))return;let e={relatedTarget:this._element};this._completeHide(e)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_addEventListeners(){C.on(this._element,uE,e=>{e.preventDefault(),this.toggle()})}_completeHide(e){C.trigger(this._element,sE,e).defaultPrevented||("ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(i=>C.off(i,"mouseover",mr)),this._popper&&this._popper.destroy(),this._menu.classList.remove(bt),this._element.classList.remove(bt),this._element.setAttribute("aria-expanded","false"),be.removeDataAttribute(this._menu,"popper"),C.trigger(this._element,aE,e))}_getConfig(e){if(e=K(K(K({},this.constructor.Default),be.getDataAttributes(this._element)),e),vt(ps,e,this.constructor.DefaultType),typeof e.reference=="object"&&!It(e.reference)&&typeof e.reference.getBoundingClientRect!="function")throw new TypeError(`${ps.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return e}_getMenuElement(){return F.next(this._element,vs)[0]}_getPlacement(){let e=this._element.parentNode;if(e.classList.contains(hE))return SE;if(e.classList.contains(pE))return wE;let n=getComputedStyle(this._menu).getPropertyValue("--bs-position").trim()==="end";return e.classList.contains(fE)?n?yE:bE:n?_E:EE}_detectNavbar(){return this._element.closest(`.${mE}`)!==null}_getOffset(){let{offset:e}=this._config;return typeof e=="string"?e.split(",").map(n=>Number.parseInt(n,10)):typeof e=="function"?n=>e(n,this._element):e}_getPopperConfig(){let e={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return this._config.display==="static"&&(e.modifiers=[{name:"applyStyles",enabled:!1}]),K(K({},e),typeof this._config.popperConfig=="function"?this._config.popperConfig(e):this._config.popperConfig)}_selectMenuItem({key:e,target:n}){let i=F.find(vE,this._menu).filter(pr);!i.length||bc(i,n,e===Er,!i.includes(n)).focus()}static dropdownInterface(e,n){let i=Ce.getOrCreateInstance(e,n);if(typeof n=="string"){if(typeof i[n]=="undefined")throw new TypeError(`No method named "${n}"`);i[n]()}}static jQueryInterface(e){return this.each(function(){Ce.dropdownInterface(this,e)})}static clearMenus(e){if(e&&(e.button===rE||e.type==="keyup"&&e.key!==qc))return;let n=F.find(gi);for(let i=0,o=n.length;ithis.matches(gi)?this:F.prev(this,gi)[0];if(e.key===yr){i().focus(),Ce.clearMenus();return}if(e.key===gs||e.key===Er){n||i().click(),Ce.getInstance(i())._selectMenuItem(e);return}(!n||e.key===Hc)&&Ce.clearMenus()}};C.on(document,Bc,gi,Ce.dataApiKeydownHandler);C.on(document,Bc,vs,Ce.dataApiKeydownHandler);C.on(document,$c,Ce.clearMenus);C.on(document,dE,Ce.clearMenus);C.on(document,$c,gi,function(t){t.preventDefault(),Ce.dropdownInterface(this)});Be(Ce);var Fc=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",zc=".sticky-top",_r=class{constructor(){this._element=document.body}getWidth(){let e=document.documentElement.clientWidth;return Math.abs(window.innerWidth-e)}hide(){let e=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,"paddingRight",n=>n+e),this._setElementAttributes(Fc,"paddingRight",n=>n+e),this._setElementAttributes(zc,"marginRight",n=>n-e)}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(e,n,i){let o=this.getWidth(),s=a=>{if(a!==this._element&&window.innerWidth>a.clientWidth+o)return;this._saveInitialAttribute(a,n);let c=window.getComputedStyle(a)[n];a.style[n]=`${i(Number.parseFloat(c))}px`};this._applyManipulationCallback(e,s)}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,"paddingRight"),this._resetElementAttributes(Fc,"paddingRight"),this._resetElementAttributes(zc,"marginRight")}_saveInitialAttribute(e,n){let i=e.style[n];i&&be.setDataAttribute(e,n,i)}_resetElementAttributes(e,n){let i=o=>{let s=be.getDataAttribute(o,n);typeof s=="undefined"?o.style.removeProperty(n):(be.removeDataAttribute(o,n),o.style[n]=s)};this._applyManipulationCallback(e,i)}_applyManipulationCallback(e,n){It(e)?n(e):F.find(e,this._element).forEach(n)}isOverflowing(){return this.getWidth()>0}},OE={isVisible:!0,isAnimated:!1,rootElement:"body",clickCallback:null},AE={isVisible:"boolean",isAnimated:"boolean",rootElement:"(element|string)",clickCallback:"(function|null)"},Wc="backdrop",CE="modal-backdrop",LE="fade",Vc="show",Yc=`mousedown.bs.${Wc}`,bs=class{constructor(e){this._config=this._getConfig(e),this._isAppended=!1,this._element=null}show(e){if(!this._config.isVisible){Jt(e);return}this._append(),this._config.isAnimated&&kn(this._getElement()),this._getElement().classList.add(Vc),this._emulateAnimation(()=>{Jt(e)})}hide(e){if(!this._config.isVisible){Jt(e);return}this._getElement().classList.remove(Vc),this._emulateAnimation(()=>{this.dispose(),Jt(e)})}_getElement(){if(!this._element){let e=document.createElement("div");e.className=CE,this._config.isAnimated&&e.classList.add(LE),this._element=e}return this._element}_getConfig(e){return e=K(K({},OE),typeof e=="object"?e:{}),e.rootElement=Mn(e.rootElement),vt(Wc,e,AE),e}_append(){this._isAppended||(this._config.rootElement.appendChild(this._getElement()),C.on(this._getElement(),Yc,()=>{Jt(this._config.clickCallback)}),this._isAppended=!0)}dispose(){!this._isAppended||(C.off(this._element,Yc),this._element.remove(),this._isAppended=!1)}_emulateAnimation(e){vc(e,this._getElement(),this._config.isAnimated)}},Uc="modal",DE="bs.modal",Re=`.${DE}`,ME=".data-api",Kc="Escape",Gc={backdrop:!0,keyboard:!0,focus:!0},IE={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean"},kE=`hide${Re}`,PE=`hidePrevented${Re}`,Xc=`hidden${Re}`,Qc=`show${Re}`,NE=`shown${Re}`,Sr=`focusin${Re}`,Jc=`resize${Re}`,ys=`click.dismiss${Re}`,Zc=`keydown.dismiss${Re}`,RE=`mouseup.dismiss${Re}`,eu=`mousedown.dismiss${Re}`,jE=`click${Re}${ME}`,tu="modal-open",HE="fade",nu="show",Es="modal-static",qE=".modal-dialog",$E=".modal-body",BE='[data-bs-toggle="modal"]',FE='[data-bs-dismiss="modal"]',Nt=class extends Fe{constructor(e,n){super(e);this._config=this._getConfig(n),this._dialog=F.findOne(qE,this._element),this._backdrop=this._initializeBackDrop(),this._isShown=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollBar=new _r}static get Default(){return Gc}static get NAME(){return Uc}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){this._isShown||this._isTransitioning||C.trigger(this._element,Qc,{relatedTarget:e}).defaultPrevented||(this._isShown=!0,this._isAnimated()&&(this._isTransitioning=!0),this._scrollBar.hide(),document.body.classList.add(tu),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),C.on(this._element,ys,FE,i=>this.hide(i)),C.on(this._dialog,eu,()=>{C.one(this._element,RE,i=>{i.target===this._element&&(this._ignoreBackdropClick=!0)})}),this._showBackdrop(()=>this._showElement(e)))}hide(e){if(e&&["A","AREA"].includes(e.target.tagName)&&e.preventDefault(),!this._isShown||this._isTransitioning||C.trigger(this._element,kE).defaultPrevented)return;this._isShown=!1;let i=this._isAnimated();i&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),C.off(document,Sr),this._element.classList.remove(nu),C.off(this._element,ys),C.off(this._dialog,eu),this._queueCallback(()=>this._hideModal(),this._element,i)}dispose(){[window,this._dialog].forEach(e=>C.off(e,Re)),this._backdrop.dispose(),super.dispose(),C.off(document,Sr)}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new bs({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_getConfig(e){return e=K(K(K({},Gc),be.getDataAttributes(this._element)),typeof e=="object"?e:{}),vt(Uc,e,IE),e}_showElement(e){let n=this._isAnimated(),i=F.findOne($E,this._dialog);(!this._element.parentNode||this._element.parentNode.nodeType!==Node.ELEMENT_NODE)&&document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0,i&&(i.scrollTop=0),n&&kn(this._element),this._element.classList.add(nu),this._config.focus&&this._enforceFocus();let o=()=>{this._config.focus&&this._element.focus(),this._isTransitioning=!1,C.trigger(this._element,NE,{relatedTarget:e})};this._queueCallback(o,this._dialog,n)}_enforceFocus(){C.off(document,Sr),C.on(document,Sr,e=>{document!==e.target&&this._element!==e.target&&!this._element.contains(e.target)&&this._element.focus()})}_setEscapeEvent(){this._isShown?C.on(this._element,Zc,e=>{this._config.keyboard&&e.key===Kc?(e.preventDefault(),this.hide()):!this._config.keyboard&&e.key===Kc&&this._triggerBackdropTransition()}):C.off(this._element,Zc)}_setResizeEvent(){this._isShown?C.on(window,Jc,()=>this._adjustDialog()):C.off(window,Jc)}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove(tu),this._resetAdjustments(),this._scrollBar.reset(),C.trigger(this._element,Xc)})}_showBackdrop(e){C.on(this._element,ys,n=>{if(this._ignoreBackdropClick){this._ignoreBackdropClick=!1;return}n.target===n.currentTarget&&(this._config.backdrop===!0?this.hide():this._config.backdrop==="static"&&this._triggerBackdropTransition())}),this._backdrop.show(e)}_isAnimated(){return this._element.classList.contains(HE)}_triggerBackdropTransition(){if(C.trigger(this._element,PE).defaultPrevented)return;let{classList:n,scrollHeight:i,style:o}=this._element,s=i>document.documentElement.clientHeight;!s&&o.overflowY==="hidden"||n.contains(Es)||(s||(o.overflowY="hidden"),n.add(Es),this._queueCallback(()=>{n.remove(Es),s||this._queueCallback(()=>{o.overflowY=""},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){let e=this._element.scrollHeight>document.documentElement.clientHeight,n=this._scrollBar.getWidth(),i=n>0;(!i&&e&&!De()||i&&!e&&De())&&(this._element.style.paddingLeft=`${n}px`),(i&&!e&&!De()||!i&&e&&De())&&(this._element.style.paddingRight=`${n}px`)}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(e,n){return this.each(function(){let i=Nt.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof i[e]=="undefined")throw new TypeError(`No method named "${e}"`);i[e](n)}})}};C.on(document,jE,BE,function(t){let e=Mt(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),C.one(e,Qc,i=>{i.defaultPrevented||C.one(e,Xc,()=>{pr(this)&&this.focus()})}),Nt.getOrCreateInstance(e).toggle(this)});Be(Nt);var iu="offcanvas",zE="bs.offcanvas",yt=`.${zE}`,ru=".data-api",WE=`load${yt}${ru}`,VE="Escape",ou={backdrop:!0,keyboard:!0,scroll:!1},YE={backdrop:"boolean",keyboard:"boolean",scroll:"boolean"},su="show",au=".offcanvas.show",UE=`show${yt}`,KE=`shown${yt}`,GE=`hide${yt}`,lu=`hidden${yt}`,wr=`focusin${yt}`,XE=`click${yt}${ru}`,QE=`click.dismiss${yt}`,JE=`keydown.dismiss${yt}`,ZE='[data-bs-dismiss="offcanvas"]',e_='[data-bs-toggle="offcanvas"]',sn=class extends Fe{constructor(e,n){super(e);this._config=this._getConfig(n),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._addEventListeners()}static get NAME(){return iu}static get Default(){return ou}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){if(this._isShown||C.trigger(this._element,UE,{relatedTarget:e}).defaultPrevented)return;this._isShown=!0,this._element.style.visibility="visible",this._backdrop.show(),this._config.scroll||(new _r().hide(),this._enforceFocusOnElement(this._element)),this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(su);let i=()=>{C.trigger(this._element,KE,{relatedTarget:e})};this._queueCallback(i,this._element,!0)}hide(){if(!this._isShown||C.trigger(this._element,GE).defaultPrevented)return;C.off(document,wr),this._element.blur(),this._isShown=!1,this._element.classList.remove(su),this._backdrop.hide();let n=()=>{this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._element.style.visibility="hidden",this._config.scroll||new _r().reset(),C.trigger(this._element,lu)};this._queueCallback(n,this._element,!0)}dispose(){this._backdrop.dispose(),super.dispose(),C.off(document,wr)}_getConfig(e){return e=K(K(K({},ou),be.getDataAttributes(this._element)),typeof e=="object"?e:{}),vt(iu,e,YE),e}_initializeBackDrop(){return new bs({isVisible:this._config.backdrop,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:()=>this.hide()})}_enforceFocusOnElement(e){C.off(document,wr),C.on(document,wr,n=>{document!==n.target&&e!==n.target&&!e.contains(n.target)&&e.focus()}),e.focus()}_addEventListeners(){C.on(this._element,QE,ZE,()=>this.hide()),C.on(this._element,JE,e=>{this._config.keyboard&&e.key===VE&&this.hide()})}static jQueryInterface(e){return this.each(function(){let n=sn.getOrCreateInstance(this,e);if(typeof e=="string"){if(n[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);n[e](this)}})}};C.on(document,XE,e_,function(t){let e=Mt(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),In(this))return;C.one(e,lu,()=>{pr(this)&&this.focus()});let n=F.findOne(au);n&&n!==e&&sn.getInstance(n).hide(),sn.getOrCreateInstance(e).toggle(this)});C.on(window,WE,()=>F.find(au).forEach(t=>sn.getOrCreateInstance(t).show()));Be(sn);var t_=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),n_=/^aria-[\w-]*$/i,i_=/^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/i,r_=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,o_=(t,e)=>{let n=t.nodeName.toLowerCase();if(e.includes(n))return t_.has(n)?Boolean(i_.test(t.nodeValue)||r_.test(t.nodeValue)):!0;let i=e.filter(o=>o instanceof RegExp);for(let o=0,s=i.length;o{o_(p,f)||u.removeAttribute(p.nodeName)})}return o.body.innerHTML}var uu="tooltip",a_="bs.tooltip",Ze=`.${a_}`,du="bs-tooltip",l_=new RegExp(`(^|\\s)${du}\\S+`,"g"),c_=new Set(["sanitize","allowList","sanitizeFn"]),u_={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(array|string|function)",container:"(string|element|boolean)",fallbackPlacements:"array",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",allowList:"object",popperConfig:"(null|object|function)"},d_={AUTO:"auto",TOP:"top",RIGHT:De()?"left":"right",BOTTOM:"bottom",LEFT:De()?"right":"left"},f_={animation:!0,template:'',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:[0,0],container:!1,fallbackPlacements:["top","right","bottom","left"],boundary:"clippingParents",customClass:"",sanitize:!0,sanitizeFn:null,allowList:s_,popperConfig:null},h_={HIDE:`hide${Ze}`,HIDDEN:`hidden${Ze}`,SHOW:`show${Ze}`,SHOWN:`shown${Ze}`,INSERTED:`inserted${Ze}`,CLICK:`click${Ze}`,FOCUSIN:`focusin${Ze}`,FOCUSOUT:`focusout${Ze}`,MOUSEENTER:`mouseenter${Ze}`,MOUSELEAVE:`mouseleave${Ze}`},Tr="fade",fu="modal",vi="show",bi="show",_s="out",p_=".tooltip-inner",yi="hover",Ss="focus",m_="click",g_="manual",et=class extends Fe{constructor(e,n){if(typeof hr=="undefined")throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(e);this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this._config=this._getConfig(n),this.tip=null,this._setListeners()}static get Default(){return f_}static get NAME(){return uu}static get Event(){return h_}static get DefaultType(){return u_}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(e){if(!!this._isEnabled)if(e){let n=this._initializeOnDelegatedTarget(e);n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(this.getTipElement().classList.contains(vi)){this._leave(null,this);return}this._enter(null,this)}}dispose(){clearTimeout(this._timeout),C.off(this._element.closest(`.${fu}`),"hide.bs.modal",this._hideModalHandler),this.tip&&this.tip.remove(),this._popper&&this._popper.destroy(),super.dispose()}show(){if(this._element.style.display==="none")throw new Error("Please use show on visible elements");if(!(this.isWithContent()&&this._isEnabled))return;let e=C.trigger(this._element,this.constructor.Event.SHOW),n=mc(this._element),i=n===null?this._element.ownerDocument.documentElement.contains(this._element):n.contains(this._element);if(e.defaultPrevented||!i)return;let o=this.getTipElement(),s=fc(this.constructor.NAME);o.setAttribute("id",s),this._element.setAttribute("aria-describedby",s),this.setContent(),this._config.animation&&o.classList.add(Tr);let a=typeof this._config.placement=="function"?this._config.placement.call(this,o,this._element):this._config.placement,c=this._getAttachment(a);this._addAttachmentClass(c);let{container:d}=this._config;Zt.set(o,this.constructor.DATA_KEY,this),this._element.ownerDocument.documentElement.contains(this.tip)||(d.appendChild(o),C.trigger(this._element,this.constructor.Event.INSERTED)),this._popper?this._popper.update():this._popper=fr(this._element,o,this._getPopperConfig(c)),o.classList.add(vi);let u=typeof this._config.customClass=="function"?this._config.customClass():this._config.customClass;u&&o.classList.add(...u.split(" ")),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(f=>{C.on(f,"mouseover",mr)});let l=()=>{let f=this._hoverState;this._hoverState=null,C.trigger(this._element,this.constructor.Event.SHOWN),f===_s&&this._leave(null,this)},m=this.tip.classList.contains(Tr);this._queueCallback(l,this.tip,m)}hide(){if(!this._popper)return;let e=this.getTipElement(),n=()=>{this._isWithActiveTrigger()||(this._hoverState!==bi&&e.remove(),this._cleanTipClass(),this._element.removeAttribute("aria-describedby"),C.trigger(this._element,this.constructor.Event.HIDDEN),this._popper&&(this._popper.destroy(),this._popper=null))};if(C.trigger(this._element,this.constructor.Event.HIDE).defaultPrevented)return;e.classList.remove(vi),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(s=>C.off(s,"mouseover",mr)),this._activeTrigger[m_]=!1,this._activeTrigger[Ss]=!1,this._activeTrigger[yi]=!1;let o=this.tip.classList.contains(Tr);this._queueCallback(n,this.tip,o),this._hoverState=""}update(){this._popper!==null&&this._popper.update()}isWithContent(){return Boolean(this.getTitle())}getTipElement(){if(this.tip)return this.tip;let e=document.createElement("div");return e.innerHTML=this._config.template,this.tip=e.children[0],this.tip}setContent(){let e=this.getTipElement();this.setElementContent(F.findOne(p_,e),this.getTitle()),e.classList.remove(Tr,vi)}setElementContent(e,n){if(e!==null){if(It(n)){n=Mn(n),this._config.html?n.parentNode!==e&&(e.innerHTML="",e.appendChild(n)):e.textContent=n.textContent;return}this._config.html?(this._config.sanitize&&(n=cu(n,this._config.allowList,this._config.sanitizeFn)),e.innerHTML=n):e.textContent=n}}getTitle(){let e=this._element.getAttribute("data-bs-original-title");return e||(e=typeof this._config.title=="function"?this._config.title.call(this._element):this._config.title),e}updateAttachment(e){return e==="right"?"end":e==="left"?"start":e}_initializeOnDelegatedTarget(e,n){let i=this.constructor.DATA_KEY;return n=n||Zt.get(e.delegateTarget,i),n||(n=new this.constructor(e.delegateTarget,this._getDelegateConfig()),Zt.set(e.delegateTarget,i,n)),n}_getOffset(){let{offset:e}=this._config;return typeof e=="string"?e.split(",").map(n=>Number.parseInt(n,10)):typeof e=="function"?n=>e(n,this._element):e}_getPopperConfig(e){let n={placement:e,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"onChange",enabled:!0,phase:"afterWrite",fn:i=>this._handlePopperPlacementChange(i)}],onFirstUpdate:i=>{i.options.placement!==i.placement&&this._handlePopperPlacementChange(i)}};return K(K({},n),typeof this._config.popperConfig=="function"?this._config.popperConfig(n):this._config.popperConfig)}_addAttachmentClass(e){this.getTipElement().classList.add(`${du}-${this.updateAttachment(e)}`)}_getAttachment(e){return d_[e.toUpperCase()]}_setListeners(){this._config.trigger.split(" ").forEach(n=>{if(n==="click")C.on(this._element,this.constructor.Event.CLICK,this._config.selector,i=>this.toggle(i));else if(n!==g_){let i=n===yi?this.constructor.Event.MOUSEENTER:this.constructor.Event.FOCUSIN,o=n===yi?this.constructor.Event.MOUSELEAVE:this.constructor.Event.FOCUSOUT;C.on(this._element,i,this._config.selector,s=>this._enter(s)),C.on(this._element,o,this._config.selector,s=>this._leave(s))}}),this._hideModalHandler=()=>{this._element&&this.hide()},C.on(this._element.closest(`.${fu}`),"hide.bs.modal",this._hideModalHandler),this._config.selector?this._config=tr(K({},this._config),{trigger:"manual",selector:""}):this._fixTitle()}_fixTitle(){let e=this._element.getAttribute("title"),n=typeof this._element.getAttribute("data-bs-original-title");(e||n!=="string")&&(this._element.setAttribute("data-bs-original-title",e||""),e&&!this._element.getAttribute("aria-label")&&!this._element.textContent&&this._element.setAttribute("aria-label",e),this._element.setAttribute("title",""))}_enter(e,n){if(n=this._initializeOnDelegatedTarget(e,n),e&&(n._activeTrigger[e.type==="focusin"?Ss:yi]=!0),n.getTipElement().classList.contains(vi)||n._hoverState===bi){n._hoverState=bi;return}if(clearTimeout(n._timeout),n._hoverState=bi,!n._config.delay||!n._config.delay.show){n.show();return}n._timeout=setTimeout(()=>{n._hoverState===bi&&n.show()},n._config.delay.show)}_leave(e,n){if(n=this._initializeOnDelegatedTarget(e,n),e&&(n._activeTrigger[e.type==="focusout"?Ss:yi]=n._element.contains(e.relatedTarget)),!n._isWithActiveTrigger()){if(clearTimeout(n._timeout),n._hoverState=_s,!n._config.delay||!n._config.delay.hide){n.hide();return}n._timeout=setTimeout(()=>{n._hoverState===_s&&n.hide()},n._config.delay.hide)}}_isWithActiveTrigger(){for(let e in this._activeTrigger)if(this._activeTrigger[e])return!0;return!1}_getConfig(e){let n=be.getDataAttributes(this._element);return Object.keys(n).forEach(i=>{c_.has(i)&&delete n[i]}),e=K(K(K({},this.constructor.Default),n),typeof e=="object"&&e?e:{}),e.container=e.container===!1?document.body:Mn(e.container),typeof e.delay=="number"&&(e.delay={show:e.delay,hide:e.delay}),typeof e.title=="number"&&(e.title=e.title.toString()),typeof e.content=="number"&&(e.content=e.content.toString()),vt(uu,e,this.constructor.DefaultType),e.sanitize&&(e.template=cu(e.template,e.allowList,e.sanitizeFn)),e}_getDelegateConfig(){let e={};if(this._config)for(let n in this._config)this.constructor.Default[n]!==this._config[n]&&(e[n]=this._config[n]);return e}_cleanTipClass(){let e=this.getTipElement(),n=e.getAttribute("class").match(l_);n!==null&&n.length>0&&n.map(i=>i.trim()).forEach(i=>e.classList.remove(i))}_handlePopperPlacementChange(e){let{state:n}=e;!n||(this.tip=n.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(n.placement)))}static jQueryInterface(e){return this.each(function(){let n=et.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof n[e]=="undefined")throw new TypeError(`No method named "${e}"`);n[e]()}})}};Be(et);var v_="popover",b_="bs.popover",tt=`.${b_}`,hu="bs-popover",y_=new RegExp(`(^|\\s)${hu}\\S+`,"g"),E_=tr(K({},et.Default),{placement:"right",offset:[0,8],trigger:"click",content:"",template:''}),__=tr(K({},et.DefaultType),{content:"(string|element|function)"}),S_={HIDE:`hide${tt}`,HIDDEN:`hidden${tt}`,SHOW:`show${tt}`,SHOWN:`shown${tt}`,INSERTED:`inserted${tt}`,CLICK:`click${tt}`,FOCUSIN:`focusin${tt}`,FOCUSOUT:`focusout${tt}`,MOUSEENTER:`mouseenter${tt}`,MOUSELEAVE:`mouseleave${tt}`},w_="fade",T_="show",pu=".popover-header",mu=".popover-body",an=class extends et{static get Default(){return E_}static get NAME(){return v_}static get Event(){return S_}static get DefaultType(){return __}isWithContent(){return this.getTitle()||this._getContent()}getTipElement(){return this.tip?this.tip:(this.tip=super.getTipElement(),this.getTitle()||F.findOne(pu,this.tip).remove(),this._getContent()||F.findOne(mu,this.tip).remove(),this.tip)}setContent(){let e=this.getTipElement();this.setElementContent(F.findOne(pu,e),this.getTitle());let n=this._getContent();typeof n=="function"&&(n=n.call(this._element)),this.setElementContent(F.findOne(mu,e),n),e.classList.remove(w_,T_)}_addAttachmentClass(e){this.getTipElement().classList.add(`${hu}-${this.updateAttachment(e)}`)}_getContent(){return this._element.getAttribute("data-bs-content")||this._config.content}_cleanTipClass(){let e=this.getTipElement(),n=e.getAttribute("class").match(y_);n!==null&&n.length>0&&n.map(i=>i.trim()).forEach(i=>e.classList.remove(i))}static jQueryInterface(e){return this.each(function(){let n=an.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof n[e]=="undefined")throw new TypeError(`No method named "${e}"`);n[e]()}})}};Be(an);var ws="scrollspy",x_="bs.scrollspy",xr=`.${x_}`,O_=".data-api",gu={offset:10,method:"auto",target:""},A_={offset:"number",method:"string",target:"(string|element)"},C_=`activate${xr}`,L_=`scroll${xr}`,D_=`load${xr}${O_}`,vu="dropdown-item",ln="active",M_='[data-bs-spy="scroll"]',I_=".nav, .list-group",Ts=".nav-link",k_=".nav-item",bu=".list-group-item",P_=".dropdown",N_=".dropdown-toggle",R_="offset",yu="position",Ei=class extends Fe{constructor(e,n){super(e);this._scrollElement=this._element.tagName==="BODY"?window:this._element,this._config=this._getConfig(n),this._selector=`${this._config.target} ${Ts}, ${this._config.target} ${bu}, ${this._config.target} .${vu}`,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,C.on(this._scrollElement,L_,()=>this._process()),this.refresh(),this._process()}static get Default(){return gu}static get NAME(){return ws}refresh(){let e=this._scrollElement===this._scrollElement.window?R_:yu,n=this._config.method==="auto"?e:this._config.method,i=n===yu?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),F.find(this._selector).map(s=>{let a=as(s),c=a?F.findOne(a):null;if(c){let d=c.getBoundingClientRect();if(d.width||d.height)return[be[n](c).top+i,a]}return null}).filter(s=>s).sort((s,a)=>s[0]-a[0]).forEach(s=>{this._offsets.push(s[0]),this._targets.push(s[1])})}dispose(){C.off(this._scrollElement,xr),super.dispose()}_getConfig(e){if(e=K(K(K({},gu),be.getDataAttributes(this._element)),typeof e=="object"&&e?e:{}),typeof e.target!="string"&&It(e.target)){let{id:n}=e.target;n||(n=fc(ws),e.target.id=n),e.target=`#${n}`}return vt(ws,e,A_),e}_getScrollTop(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop}_getScrollHeight(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)}_getOffsetHeight(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height}_process(){let e=this._getScrollTop()+this._config.offset,n=this._getScrollHeight(),i=this._config.offset+n-this._getOffsetHeight();if(this._scrollHeight!==n&&this.refresh(),e>=i){let o=this._targets[this._targets.length-1];this._activeTarget!==o&&this._activate(o);return}if(this._activeTarget&&e0){this._activeTarget=null,this._clear();return}for(let o=this._offsets.length;o--;)this._activeTarget!==this._targets[o]&&e>=this._offsets[o]&&(typeof this._offsets[o+1]=="undefined"||e`${o}[data-bs-target="${e}"],${o}[href="${e}"]`),i=F.findOne(n.join(","));i.classList.contains(vu)?(F.findOne(N_,i.closest(P_)).classList.add(ln),i.classList.add(ln)):(i.classList.add(ln),F.parents(i,I_).forEach(o=>{F.prev(o,`${Ts}, ${bu}`).forEach(s=>s.classList.add(ln)),F.prev(o,k_).forEach(s=>{F.children(s,Ts).forEach(a=>a.classList.add(ln))})})),C.trigger(this._scrollElement,C_,{relatedTarget:e})}_clear(){F.find(this._selector).filter(e=>e.classList.contains(ln)).forEach(e=>e.classList.remove(ln))}static jQueryInterface(e){return this.each(function(){let n=Ei.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof n[e]=="undefined")throw new TypeError(`No method named "${e}"`);n[e]()}})}};C.on(window,D_,()=>{F.find(M_).forEach(t=>new Ei(t))});Be(Ei);var j_="tab",H_="bs.tab",_i=`.${H_}`,q_=".data-api",$_=`hide${_i}`,B_=`hidden${_i}`,F_=`show${_i}`,z_=`shown${_i}`,W_=`click${_i}${q_}`,V_="dropdown-menu",Si="active",Eu="fade",_u="show",Y_=".dropdown",U_=".nav, .list-group",Su=".active",wu=":scope > li > .active",K_='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',G_=".dropdown-toggle",X_=":scope > .dropdown-menu .active",cn=class extends Fe{static get NAME(){return j_}show(){if(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&this._element.classList.contains(Si))return;let e,n=Mt(this._element),i=this._element.closest(U_);if(i){let c=i.nodeName==="UL"||i.nodeName==="OL"?wu:Su;e=F.find(c,i),e=e[e.length-1]}let o=e?C.trigger(e,$_,{relatedTarget:this._element}):null;if(C.trigger(this._element,F_,{relatedTarget:e}).defaultPrevented||o!==null&&o.defaultPrevented)return;this._activate(this._element,i);let a=()=>{C.trigger(e,B_,{relatedTarget:this._element}),C.trigger(this._element,z_,{relatedTarget:e})};n?this._activate(n,n.parentNode,a):a()}_activate(e,n,i){let s=(n&&(n.nodeName==="UL"||n.nodeName==="OL")?F.find(wu,n):F.children(n,Su))[0],a=i&&s&&s.classList.contains(Eu),c=()=>this._transitionComplete(e,s,i);s&&a?(s.classList.remove(_u),this._queueCallback(c,e,!0)):c()}_transitionComplete(e,n,i){if(n){n.classList.remove(Si);let s=F.findOne(X_,n.parentNode);s&&s.classList.remove(Si),n.getAttribute("role")==="tab"&&n.setAttribute("aria-selected",!1)}e.classList.add(Si),e.getAttribute("role")==="tab"&&e.setAttribute("aria-selected",!0),kn(e),e.classList.contains(Eu)&&e.classList.add(_u);let o=e.parentNode;if(o&&o.nodeName==="LI"&&(o=o.parentNode),o&&o.classList.contains(V_)){let s=e.closest(Y_);s&&F.find(G_,s).forEach(a=>a.classList.add(Si)),e.setAttribute("aria-expanded",!0)}i&&i()}static jQueryInterface(e){return this.each(function(){let n=cn.getOrCreateInstance(this);if(typeof e=="string"){if(typeof n[e]=="undefined")throw new TypeError(`No method named "${e}"`);n[e]()}})}};C.on(document,W_,K_,function(t){if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),In(this))return;cn.getOrCreateInstance(this).show()});Be(cn);var Tu="toast",Q_="bs.toast",Et=`.${Q_}`,J_=`click.dismiss${Et}`,Z_=`mouseover${Et}`,eS=`mouseout${Et}`,tS=`focusin${Et}`,nS=`focusout${Et}`,iS=`hide${Et}`,rS=`hidden${Et}`,oS=`show${Et}`,sS=`shown${Et}`,aS="fade",xu="hide",wi="show",Ou="showing",lS={animation:"boolean",autohide:"boolean",delay:"number"},Au={animation:!0,autohide:!0,delay:5e3},cS='[data-bs-dismiss="toast"]',_t=class extends Fe{constructor(e,n){super(e);this._config=this._getConfig(n),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get DefaultType(){return lS}static get Default(){return Au}static get NAME(){return Tu}show(){if(C.trigger(this._element,oS).defaultPrevented)return;this._clearTimeout(),this._config.animation&&this._element.classList.add(aS);let n=()=>{this._element.classList.remove(Ou),this._element.classList.add(wi),C.trigger(this._element,sS),this._maybeScheduleHide()};this._element.classList.remove(xu),kn(this._element),this._element.classList.add(Ou),this._queueCallback(n,this._element,this._config.animation)}hide(){if(!this._element.classList.contains(wi)||C.trigger(this._element,iS).defaultPrevented)return;let n=()=>{this._element.classList.add(xu),C.trigger(this._element,rS)};this._element.classList.remove(wi),this._queueCallback(n,this._element,this._config.animation)}dispose(){this._clearTimeout(),this._element.classList.contains(wi)&&this._element.classList.remove(wi),super.dispose()}_getConfig(e){return e=K(K(K({},Au),be.getDataAttributes(this._element)),typeof e=="object"&&e?e:{}),vt(Tu,e,this.constructor.DefaultType),e}_maybeScheduleHide(){!this._config.autohide||this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay))}_onInteraction(e,n){switch(e.type){case"mouseover":case"mouseout":this._hasMouseInteraction=n;break;case"focusin":case"focusout":this._hasKeyboardInteraction=n;break}if(n){this._clearTimeout();return}let i=e.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){C.on(this._element,J_,cS,()=>this.hide()),C.on(this._element,Z_,e=>this._onInteraction(e,!0)),C.on(this._element,eS,e=>this._onInteraction(e,!1)),C.on(this._element,tS,e=>this._onInteraction(e,!0)),C.on(this._element,nS,e=>this._onInteraction(e,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(e){return this.each(function(){let n=_t.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof n[e]=="undefined")throw new TypeError(`No method named "${e}"`);n[e](this)}})}};Be(_t);"use strict";var OT=it(),yf=Xs();OT({target:"Array",proto:!0,forced:[].forEach!=yf},{forEach:yf});var AT=de(),CT=Qs(),Js=Xs(),LT=St();for(_f in CT)if(Zs=AT[_f],Ii=Zs&&Zs.prototype,Ii&&Ii.forEach!==Js)try{LT(Ii,"forEach",Js)}catch(t){Ii.forEach=Js}var Zs,Ii,_f;var bo=Le(wf());"use strict";var NT=it(),RT=Br().filter,jT=xf(),HT=jT("filter");NT({target:"Array",proto:!0,forced:!HT},{filter:function(e){return RT(this,e,arguments.length>1?arguments[1]:void 0)}});var o1=Le(ga());var $x=it(),yh=bh();$x({target:"Object",stat:!0,forced:Object.assign!==yh},{assign:yh});var Xx=Kr(),Qx=pn(),Jx=Th();Xx||Qx(Object.prototype,"toString",Jx,{unsafe:!0});var uO=it(),Ih=Mh();uO({global:!0,forced:parseInt!=Ih},{parseInt:Ih});"use strict";var pO=_a().charAt,mO=$t(),Nh=hn(),gO=pa(),Rh="String Iterator",vO=Nh.set,bO=Nh.getterFor(Rh);gO(String,"String",function(t){vO(this,{type:Rh,string:mO(t),index:0})},function(){var e=bO(this),n=e.string,i=e.index,o;return i>=n.length?{value:void 0,done:!0}:(o=pO(n,i),e.index+=o.length,{value:o,done:!1})});var u1=Le(Op());var T0=de(),Ap=Qs(),ji=ga(),ja=St(),Cp=Se(),Ha=Cp("iterator"),Lp=Cp("toStringTag"),qa=ji.values;for(ro in Ap)if($a=T0[ro],rt=$a&&$a.prototype,rt){if(rt[Ha]!==qa)try{ja(rt,Ha,qa)}catch(t){rt[Ha]=qa}if(rt[Lp]||ja(rt,Lp,ro),Ap[ro]){for(vn in ji)if(rt[vn]!==ji[vn])try{ja(rt,vn,ji[vn])}catch(t){rt[vn]=ji[vn]}}}var $a,rt,vn,ro;var ml=Le(Pp()),gl=Le(Hp()),Bm=Le(Up());var We=[];var Kp=function(){return We.some(function(t){return t.activeTargets.length>0})};var Gp=function(){return We.some(function(t){return t.skippedTargets.length>0})};var Xp="ResizeObserver loop completed with undelivered notifications.",Qp=function(){var t;typeof ErrorEvent=="function"?t=new ErrorEvent("error",{message:Xp}):(t=document.createEvent("Event"),t.initEvent("error",!1,!1),t.message=Xp),window.dispatchEvent(t)};var En;(function(t){t.BORDER_BOX="border-box",t.CONTENT_BOX="content-box",t.DEVICE_PIXEL_CONTENT_BOX="device-pixel-content-box"})(En||(En={}));var Ue=function(t){return Object.freeze(t)};var Ua=function(){function t(e,n){this.inlineSize=e,this.blockSize=n,Ue(this)}return t}();var Ka=function(){function t(e,n,i,o){return this.x=e,this.y=n,this.width=i,this.height=o,this.top=this.y,this.left=this.x,this.bottom=this.top+this.height,this.right=this.left+this.width,Ue(this)}return t.prototype.toJSON=function(){var e=this,n=e.x,i=e.y,o=e.top,s=e.right,a=e.bottom,c=e.left,d=e.width,u=e.height;return{x:n,y:i,top:o,right:s,bottom:a,left:c,width:d,height:u}},t.fromRect=function(e){return new t(e.x,e.y,e.width,e.height)},t}();var qi=function(t){return t instanceof SVGElement&&"getBBox"in t},lo=function(t){if(qi(t)){var e=t.getBBox(),n=e.width,i=e.height;return!n&&!i}var o=t,s=o.offsetWidth,a=o.offsetHeight;return!(s||a||t.getClientRects().length)},Ga=function(t){var e,n;if(t instanceof Element)return!0;var i=(n=(e=t)===null||e===void 0?void 0:e.ownerDocument)===null||n===void 0?void 0:n.defaultView;return!!(i&&t instanceof i.Element)},Jp=function(t){switch(t.tagName){case"INPUT":if(t.type!=="image")break;case"VIDEO":case"AUDIO":case"EMBED":case"OBJECT":case"CANVAS":case"IFRAME":case"IMG":return!0}return!1};var _n=typeof window!="undefined"?window:{};var co=new WeakMap,Zp=/auto|scroll/,BA=/^tb|vertical/,FA=/msie|trident/i.test(_n.navigator&&_n.navigator.userAgent),ot=function(t){return parseFloat(t||"0")},Bn=function(t,e,n){return t===void 0&&(t=0),e===void 0&&(e=0),n===void 0&&(n=!1),new Ua((n?e:t)||0,(n?t:e)||0)},em=Ue({devicePixelContentBoxSize:Bn(),borderBoxSize:Bn(),contentBoxSize:Bn(),contentRect:new Ka(0,0,0,0)}),Xa=function(t,e){if(e===void 0&&(e=!1),co.has(t)&&!e)return co.get(t);if(lo(t))return co.set(t,em),em;var n=getComputedStyle(t),i=qi(t)&&t.ownerSVGElement&&t.getBBox(),o=!FA&&n.boxSizing==="border-box",s=BA.test(n.writingMode||""),a=!i&&Zp.test(n.overflowY||""),c=!i&&Zp.test(n.overflowX||""),d=i?0:ot(n.paddingTop),u=i?0:ot(n.paddingRight),l=i?0:ot(n.paddingBottom),m=i?0:ot(n.paddingLeft),f=i?0:ot(n.borderTopWidth),p=i?0:ot(n.borderRightWidth),g=i?0:ot(n.borderBottomWidth),v=i?0:ot(n.borderLeftWidth),h=m+u,y=d+l,_=v+p,A=f+g,O=c?t.offsetHeight-A-t.clientHeight:0,k=a?t.offsetWidth-_-t.clientWidth:0,M=o?h+_:0,H=o?y+A:0,$=i?i.width:ot(n.width)-M-k,G=i?i.height:ot(n.height)-H-O,Z=$+h+k+_,z=G+y+O+A,S=Ue({devicePixelContentBoxSize:Bn(Math.round($*devicePixelRatio),Math.round(G*devicePixelRatio),s),borderBoxSize:Bn(Z,z,s),contentBoxSize:Bn($,G,s),contentRect:new Ka(m,d,$,G)});return co.set(t,S),S},uo=function(t,e,n){var i=Xa(t,n),o=i.borderBoxSize,s=i.contentBoxSize,a=i.devicePixelContentBoxSize;switch(e){case En.DEVICE_PIXEL_CONTENT_BOX:return a;case En.BORDER_BOX:return o;default:return s}};var Qa=function(){function t(e){var n=Xa(e);this.target=e,this.contentRect=n.contentRect,this.borderBoxSize=Ue([n.borderBoxSize]),this.contentBoxSize=Ue([n.contentBoxSize]),this.devicePixelContentBoxSize=Ue([n.devicePixelContentBoxSize])}return t}();var fo=function(t){if(lo(t))return 1/0;for(var e=0,n=t.parentNode;n;)e+=1,n=n.parentNode;return e};var tm=function(){var t=1/0,e=[];We.forEach(function(a){if(a.activeTargets.length!==0){var c=[];a.activeTargets.forEach(function(u){var l=new Qa(u.target),m=fo(u.target);c.push(l),u.lastReportedSize=uo(u.target,u.observedBox),mt?n.activeTargets.push(o):n.skippedTargets.push(o))})})};var nm=function(){var t=0;for(Ja(t);Kp();)t=tm(),Ja(t);return Gp()&&Qp(),t>0};var Za,im=[],zA=function(){return im.splice(0).forEach(function(t){return t()})},rm=function(t){if(!Za){var e=0,n=document.createTextNode(""),i={characterData:!0};new MutationObserver(function(){return zA()}).observe(n,i),Za=function(){n.textContent=""+(e?e--:e++)}}im.push(t),Za()};var om=function(t){rm(function(){requestAnimationFrame(t)})};var ho=0,WA=function(){return!!ho},VA=250,YA={attributes:!0,characterData:!0,childList:!0,subtree:!0},sm=["resize","load","transitionend","animationend","animationstart","animationiteration","keyup","keydown","mouseup","mousedown","mouseover","mouseout","blur","focus"],am=function(t){return t===void 0&&(t=0),Date.now()+t},el=!1,UA=function(){function t(){var e=this;this.stopped=!0,this.listener=function(){return e.schedule()}}return t.prototype.run=function(e){var n=this;if(e===void 0&&(e=VA),!el){el=!0;var i=am(e);om(function(){var o=!1;try{o=nm()}finally{if(el=!1,e=i-am(),!WA())return;o?n.run(1e3):e>0?n.run(e):n.start()}})}},t.prototype.schedule=function(){this.stop(),this.run()},t.prototype.observe=function(){var e=this,n=function(){return e.observer&&e.observer.observe(document.body,YA)};document.body?n():_n.addEventListener("DOMContentLoaded",n)},t.prototype.start=function(){var e=this;this.stopped&&(this.stopped=!1,this.observer=new MutationObserver(this.listener),this.observe(),sm.forEach(function(n){return _n.addEventListener(n,e.listener,!0)}))},t.prototype.stop=function(){var e=this;this.stopped||(this.observer&&this.observer.disconnect(),sm.forEach(function(n){return _n.removeEventListener(n,e.listener,!0)}),this.stopped=!0)},t}(),po=new UA,tl=function(t){!ho&&t>0&&po.start(),ho+=t,!ho&&po.stop()};var KA=function(t){return!qi(t)&&!Jp(t)&&getComputedStyle(t).display==="inline"},lm=function(){function t(e,n){this.target=e,this.observedBox=n||En.CONTENT_BOX,this.lastReportedSize={inlineSize:0,blockSize:0}}return t.prototype.isActive=function(){var e=uo(this.target,this.observedBox,!0);return KA(this.target)&&(this.lastReportedSize=e),this.lastReportedSize.inlineSize!==e.inlineSize||this.lastReportedSize.blockSize!==e.blockSize},t}();var cm=function(){function t(e,n){this.activeTargets=[],this.skippedTargets=[],this.observationTargets=[],this.observer=e,this.callback=n}return t}();var mo=new WeakMap,um=function(t,e){for(var n=0;n=0&&(s&&We.splice(We.indexOf(i),1),i.observationTargets.splice(o,1),tl(-1))},t.disconnect=function(e){var n=this,i=mo.get(e);i.observationTargets.slice().forEach(function(o){return n.unobserve(e,o.target)}),i.activeTargets.splice(0,i.activeTargets.length)},t}();var nl=function(){function t(e){if(arguments.length===0)throw new TypeError("Failed to construct 'ResizeObserver': 1 argument required, but only 0 present.");if(typeof e!="function")throw new TypeError("Failed to construct 'ResizeObserver': The callback provided as parameter 1 is not a function.");$i.connect(this,e)}return t.prototype.observe=function(e,n){if(arguments.length===0)throw new TypeError("Failed to execute 'observe' on 'ResizeObserver': 1 argument required, but only 0 present.");if(!Ga(e))throw new TypeError("Failed to execute 'observe' on 'ResizeObserver': parameter 1 is not of type 'Element");$i.observe(this,e,n)},t.prototype.unobserve=function(e){if(arguments.length===0)throw new TypeError("Failed to execute 'unobserve' on 'ResizeObserver': 1 argument required, but only 0 present.");if(!Ga(e))throw new TypeError("Failed to execute 'unobserve' on 'ResizeObserver': parameter 1 is not of type 'Element");$i.unobserve(this,e)},t.prototype.disconnect=function(){$i.disconnect(this)},t.toString=function(){return"function ResizeObserver () { [polyfill code] }"},t}();"use strict";var tC=it(),nC=hm().left,iC=Gs(),gm=Lr(),rC=mm(),oC=iC("reduce"),sC=!rC&&gm>79&&gm<83;tC({target:"Array",proto:!0,forced:!oC||sC},{reduce:function(e){return nC(this,e,arguments.length,arguments.length>1?arguments[1]:void 0)}});var aC=Rt(),lC=jt().f,il=Function.prototype,cC=il.toString,uC=/^\s*function ([^ (]*)/,vm="name";aC&&!(vm in il)&&lC(il,vm,{configurable:!0,get:function(){try{return cC.call(this).match(uC)[1]}catch(t){return""}}});var m1=Le(ll());"use strict";var NC=ul(),RC=He(),jC=mn(),hl=$t(),HC=un(),qC=dl(),jm=fl();NC("match",function(t,e,n){return[function(o){var s=HC(this),a=o==null?void 0:o[t];return a!==void 0?a.call(o,s):new RegExp(o)[t](hl(s))},function(i){var o=RC(this),s=hl(i),a=n(e,o,s);if(a.done)return a.value;if(!o.global)return jm(o,s);var c=o.unicode;o.lastIndex=0;for(var d=[],u=0,l;(l=jm(o,s))!==null;){var m=hl(l[0]);d[u]=m,m===""&&(o.lastIndex=qC(s,jC(o.lastIndex),c)),u++}return u===0?null:d}]});"use strict";var VC=ul(),YC=ye(),UC=He(),KC=Di(),GC=mn(),Fn=$t(),XC=un(),QC=dl(),JC=qm(),ZC=fl(),eL=Se(),pl=eL("replace"),tL=Math.max,nL=Math.min,iL=function(t){return t===void 0?t:String(t)},rL=function(){return"a".replace(/./,"$0")==="$0"}(),$m=function(){return/./[pl]?/./[pl]("a","$0")==="":!1}(),oL=!YC(function(){var t=/./;return t.exec=function(){var e=[];return e.groups={a:"7"},e},"".replace(t,"$
")!=="7"});VC("replace",function(t,e,n){var i=$m?"$":"$0";return[function(s,a){var c=XC(this),d=s==null?void 0:s[pl];return d!==void 0?d.call(s,c,a):e.call(Fn(c),s,a)},function(o,s){var a=UC(this),c=Fn(o);if(typeof s=="string"&&s.indexOf(i)===-1&&s.indexOf("$<")===-1){var d=n(e,a,c,s);if(d.done)return d.value}var u=typeof s=="function";u||(s=Fn(s));var l=a.global;if(l){var m=a.unicode;a.lastIndex=0}for(var f=[];;){var p=ZC(a,c);if(p===null||(f.push(p),!l))break;var g=Fn(p[0]);g===""&&(a.lastIndex=QC(c,GC(a.lastIndex),m))}for(var v="",h=0,y=0;y=h&&(v+=c.slice(h,A)+$,h=A+_.length)}return v+c.slice(h)}]},!oL||!rL||$m);var yo=function(e){var n=Array.prototype.reduce.call(e,function(i,o){var s=o.name.match(/data-simplebar-(.+)/);if(s){var a=s[1].replace(/\W+(.)/g,function(c,d){return d.toUpperCase()});switch(o.value){case"true":i[a]=!0;break;case"false":i[a]=!1;break;case void 0:i[a]=!0;break;default:i[a]=o.value}}return i},{});return n};function Bt(t){return!t||!t.ownerDocument||!t.ownerDocument.defaultView?window:t.ownerDocument.defaultView}function Eo(t){return!t||!t.ownerDocument?document:t.ownerDocument}var zn=null,Fm=null;bo.default&&window.addEventListener("resize",function(){Fm!==window.devicePixelRatio&&(Fm=window.devicePixelRatio,zn=null)});function zm(t){if(zn===null){var e=Eo(t);if(typeof e=="undefined")return zn=0,zn;var n=e.body,i=e.createElement("div");i.classList.add("simplebar-hide-scrollbar"),n.appendChild(i);var o=i.getBoundingClientRect().right;n.removeChild(i),zn=o}return zn}var he=function(){function t(n,i){var o=this;this.onScroll=function(){var s=Bt(o.el);o.scrollXTicking||(s.requestAnimationFrame(o.scrollX),o.scrollXTicking=!0),o.scrollYTicking||(s.requestAnimationFrame(o.scrollY),o.scrollYTicking=!0)},this.scrollX=function(){o.axis.x.isOverflowing&&(o.showScrollbar("x"),o.positionScrollbar("x")),o.scrollXTicking=!1},this.scrollY=function(){o.axis.y.isOverflowing&&(o.showScrollbar("y"),o.positionScrollbar("y")),o.scrollYTicking=!1},this.onMouseEnter=function(){o.showScrollbar("x"),o.showScrollbar("y")},this.onMouseMove=function(s){o.mouseX=s.clientX,o.mouseY=s.clientY,(o.axis.x.isOverflowing||o.axis.x.forceVisible)&&o.onMouseMoveForAxis("x"),(o.axis.y.isOverflowing||o.axis.y.forceVisible)&&o.onMouseMoveForAxis("y")},this.onMouseLeave=function(){o.onMouseMove.cancel(),(o.axis.x.isOverflowing||o.axis.x.forceVisible)&&o.onMouseLeaveForAxis("x"),(o.axis.y.isOverflowing||o.axis.y.forceVisible)&&o.onMouseLeaveForAxis("y"),o.mouseX=-1,o.mouseY=-1},this.onWindowResize=function(){o.scrollbarWidth=o.getScrollbarWidth(),o.hideNativeScrollbar()},this.hideScrollbars=function(){o.axis.x.track.rect=o.axis.x.track.el.getBoundingClientRect(),o.axis.y.track.rect=o.axis.y.track.el.getBoundingClientRect(),o.isWithinBounds(o.axis.y.track.rect)||(o.axis.y.scrollbar.el.classList.remove(o.classNames.visible),o.axis.y.isVisible=!1),o.isWithinBounds(o.axis.x.track.rect)||(o.axis.x.scrollbar.el.classList.remove(o.classNames.visible),o.axis.x.isVisible=!1)},this.onPointerEvent=function(s){var a,c;o.axis.x.track.rect=o.axis.x.track.el.getBoundingClientRect(),o.axis.y.track.rect=o.axis.y.track.el.getBoundingClientRect(),(o.axis.x.isOverflowing||o.axis.x.forceVisible)&&(a=o.isWithinBounds(o.axis.x.track.rect)),(o.axis.y.isOverflowing||o.axis.y.forceVisible)&&(c=o.isWithinBounds(o.axis.y.track.rect)),(a||c)&&(s.preventDefault(),s.stopPropagation(),s.type==="mousedown"&&(a&&(o.axis.x.scrollbar.rect=o.axis.x.scrollbar.el.getBoundingClientRect(),o.isWithinBounds(o.axis.x.scrollbar.rect)?o.onDragStart(s,"x"):o.onTrackClick(s,"x")),c&&(o.axis.y.scrollbar.rect=o.axis.y.scrollbar.el.getBoundingClientRect(),o.isWithinBounds(o.axis.y.scrollbar.rect)?o.onDragStart(s,"y"):o.onTrackClick(s,"y"))))},this.drag=function(s){var a,c=o.axis[o.draggedAxis].track,d=c.rect[o.axis[o.draggedAxis].sizeAttr],u=o.axis[o.draggedAxis].scrollbar,l=o.contentWrapperEl[o.axis[o.draggedAxis].scrollSizeAttr],m=parseInt(o.elStyles[o.axis[o.draggedAxis].sizeAttr],10);s.preventDefault(),s.stopPropagation(),o.draggedAxis==="y"?a=s.pageY:a=s.pageX;var f=a-c.rect[o.axis[o.draggedAxis].offsetAttr]-o.axis[o.draggedAxis].dragOffset,p=f/(d-u.size),g=p*(l-m);o.draggedAxis==="x"&&(g=o.isRtl&&t.getRtlHelpers().isRtlScrollbarInverted?g-(d+u.size):g,g=o.isRtl&&t.getRtlHelpers().isRtlScrollingInverted?-g:g),o.contentWrapperEl[o.axis[o.draggedAxis].scrollOffsetAttr]=g},this.onEndDrag=function(s){var a=Eo(o.el),c=Bt(o.el);s.preventDefault(),s.stopPropagation(),o.el.classList.remove(o.classNames.dragging),a.removeEventListener("mousemove",o.drag,!0),a.removeEventListener("mouseup",o.onEndDrag,!0),o.removePreventClickId=c.setTimeout(function(){a.removeEventListener("click",o.preventClick,!0),a.removeEventListener("dblclick",o.preventClick,!0),o.removePreventClickId=null})},this.preventClick=function(s){s.preventDefault(),s.stopPropagation()},this.el=n,this.minScrollbarWidth=20,this.options=Object.assign({},t.defaultOptions,{},i),this.classNames=Object.assign({},t.defaultOptions.classNames,{},this.options.classNames),this.axis={x:{scrollOffsetAttr:"scrollLeft",sizeAttr:"width",scrollSizeAttr:"scrollWidth",offsetSizeAttr:"offsetWidth",offsetAttr:"left",overflowAttr:"overflowX",dragOffset:0,isOverflowing:!0,isVisible:!1,forceVisible:!1,track:{},scrollbar:{}},y:{scrollOffsetAttr:"scrollTop",sizeAttr:"height",scrollSizeAttr:"scrollHeight",offsetSizeAttr:"offsetHeight",offsetAttr:"top",overflowAttr:"overflowY",dragOffset:0,isOverflowing:!0,isVisible:!1,forceVisible:!1,track:{},scrollbar:{}}},this.removePreventClickId=null,!t.instances.has(this.el)&&(this.recalculate=(0,ml.default)(this.recalculate.bind(this),64),this.onMouseMove=(0,ml.default)(this.onMouseMove.bind(this),64),this.hideScrollbars=(0,gl.default)(this.hideScrollbars.bind(this),this.options.timeout),this.onWindowResize=(0,gl.default)(this.onWindowResize.bind(this),64,{leading:!0}),t.getRtlHelpers=(0,Bm.default)(t.getRtlHelpers),this.init())}t.getRtlHelpers=function(){var i=document.createElement("div");i.innerHTML='
';var o=i.firstElementChild;document.body.appendChild(o);var s=o.firstElementChild;o.scrollLeft=0;var a=t.getOffset(o),c=t.getOffset(s);o.scrollLeft=999;var d=t.getOffset(s);return{isRtlScrollingInverted:a.left!==c.left&&c.left-d.left!=0,isRtlScrollbarInverted:a.left!==c.left}},t.getOffset=function(i){var o=i.getBoundingClientRect(),s=Eo(i),a=Bt(i);return{top:o.top+(a.pageYOffset||s.documentElement.scrollTop),left:o.left+(a.pageXOffset||s.documentElement.scrollLeft)}};var e=t.prototype;return e.init=function(){t.instances.set(this.el,this),bo.default&&(this.initDOM(),this.scrollbarWidth=this.getScrollbarWidth(),this.recalculate(),this.initListeners())},e.initDOM=function(){var i=this;if(Array.prototype.filter.call(this.el.children,function(a){return a.classList.contains(i.classNames.wrapper)}).length)this.wrapperEl=this.el.querySelector("."+this.classNames.wrapper),this.contentWrapperEl=this.options.scrollableNode||this.el.querySelector("."+this.classNames.contentWrapper),this.contentEl=this.options.contentNode||this.el.querySelector("."+this.classNames.contentEl),this.offsetEl=this.el.querySelector("."+this.classNames.offset),this.maskEl=this.el.querySelector("."+this.classNames.mask),this.placeholderEl=this.findChild(this.wrapperEl,"."+this.classNames.placeholder),this.heightAutoObserverWrapperEl=this.el.querySelector("."+this.classNames.heightAutoObserverWrapperEl),this.heightAutoObserverEl=this.el.querySelector("."+this.classNames.heightAutoObserverEl),this.axis.x.track.el=this.findChild(this.el,"."+this.classNames.track+"."+this.classNames.horizontal),this.axis.y.track.el=this.findChild(this.el,"."+this.classNames.track+"."+this.classNames.vertical);else{for(this.wrapperEl=document.createElement("div"),this.contentWrapperEl=document.createElement("div"),this.offsetEl=document.createElement("div"),this.maskEl=document.createElement("div"),this.contentEl=document.createElement("div"),this.placeholderEl=document.createElement("div"),this.heightAutoObserverWrapperEl=document.createElement("div"),this.heightAutoObserverEl=document.createElement("div"),this.wrapperEl.classList.add(this.classNames.wrapper),this.contentWrapperEl.classList.add(this.classNames.contentWrapper),this.offsetEl.classList.add(this.classNames.offset),this.maskEl.classList.add(this.classNames.mask),this.contentEl.classList.add(this.classNames.contentEl),this.placeholderEl.classList.add(this.classNames.placeholder),this.heightAutoObserverWrapperEl.classList.add(this.classNames.heightAutoObserverWrapperEl),this.heightAutoObserverEl.classList.add(this.classNames.heightAutoObserverEl);this.el.firstChild;)this.contentEl.appendChild(this.el.firstChild);this.contentWrapperEl.appendChild(this.contentEl),this.offsetEl.appendChild(this.contentWrapperEl),this.maskEl.appendChild(this.offsetEl),this.heightAutoObserverWrapperEl.appendChild(this.heightAutoObserverEl),this.wrapperEl.appendChild(this.heightAutoObserverWrapperEl),this.wrapperEl.appendChild(this.maskEl),this.wrapperEl.appendChild(this.placeholderEl),this.el.appendChild(this.wrapperEl)}if(!this.axis.x.track.el||!this.axis.y.track.el){var o=document.createElement("div"),s=document.createElement("div");o.classList.add(this.classNames.track),s.classList.add(this.classNames.scrollbar),o.appendChild(s),this.axis.x.track.el=o.cloneNode(!0),this.axis.x.track.el.classList.add(this.classNames.horizontal),this.axis.y.track.el=o.cloneNode(!0),this.axis.y.track.el.classList.add(this.classNames.vertical),this.el.appendChild(this.axis.x.track.el),this.el.appendChild(this.axis.y.track.el)}this.axis.x.scrollbar.el=this.axis.x.track.el.querySelector("."+this.classNames.scrollbar),this.axis.y.scrollbar.el=this.axis.y.track.el.querySelector("."+this.classNames.scrollbar),this.options.autoHide||(this.axis.x.scrollbar.el.classList.add(this.classNames.visible),this.axis.y.scrollbar.el.classList.add(this.classNames.visible)),this.el.setAttribute("data-simplebar","init")},e.initListeners=function(){var i=this,o=Bt(this.el);this.options.autoHide&&this.el.addEventListener("mouseenter",this.onMouseEnter),["mousedown","click","dblclick"].forEach(function(c){i.el.addEventListener(c,i.onPointerEvent,!0)}),["touchstart","touchend","touchmove"].forEach(function(c){i.el.addEventListener(c,i.onPointerEvent,{capture:!0,passive:!0})}),this.el.addEventListener("mousemove",this.onMouseMove),this.el.addEventListener("mouseleave",this.onMouseLeave),this.contentWrapperEl.addEventListener("scroll",this.onScroll),o.addEventListener("resize",this.onWindowResize);var s=!1,a=o.ResizeObserver||nl;this.resizeObserver=new a(function(){!s||i.recalculate()}),this.resizeObserver.observe(this.el),this.resizeObserver.observe(this.contentEl),o.requestAnimationFrame(function(){s=!0}),this.mutationObserver=new o.MutationObserver(this.recalculate),this.mutationObserver.observe(this.contentEl,{childList:!0,subtree:!0,characterData:!0})},e.recalculate=function(){var i=Bt(this.el);this.elStyles=i.getComputedStyle(this.el),this.isRtl=this.elStyles.direction==="rtl";var o=this.heightAutoObserverEl.offsetHeight<=1,s=this.heightAutoObserverEl.offsetWidth<=1,a=this.contentEl.offsetWidth,c=this.contentWrapperEl.offsetWidth,d=this.elStyles.overflowX,u=this.elStyles.overflowY;this.contentEl.style.padding=this.elStyles.paddingTop+" "+this.elStyles.paddingRight+" "+this.elStyles.paddingBottom+" "+this.elStyles.paddingLeft,this.wrapperEl.style.margin="-"+this.elStyles.paddingTop+" -"+this.elStyles.paddingRight+" -"+this.elStyles.paddingBottom+" -"+this.elStyles.paddingLeft;var l=this.contentEl.scrollHeight,m=this.contentEl.scrollWidth;this.contentWrapperEl.style.height=o?"auto":"100%",this.placeholderEl.style.width=s?a+"px":"auto",this.placeholderEl.style.height=l+"px";var f=this.contentWrapperEl.offsetHeight;this.axis.x.isOverflowing=m>a,this.axis.y.isOverflowing=l>f,this.axis.x.isOverflowing=d==="hidden"?!1:this.axis.x.isOverflowing,this.axis.y.isOverflowing=u==="hidden"?!1:this.axis.y.isOverflowing,this.axis.x.forceVisible=this.options.forceVisible==="x"||this.options.forceVisible===!0,this.axis.y.forceVisible=this.options.forceVisible==="y"||this.options.forceVisible===!0,this.hideNativeScrollbar();var p=this.axis.x.isOverflowing?this.scrollbarWidth:0,g=this.axis.y.isOverflowing?this.scrollbarWidth:0;this.axis.x.isOverflowing=this.axis.x.isOverflowing&&m>c-g,this.axis.y.isOverflowing=this.axis.y.isOverflowing&&l>f-p,this.axis.x.scrollbar.size=this.getScrollbarSize("x"),this.axis.y.scrollbar.size=this.getScrollbarSize("y"),this.axis.x.scrollbar.el.style.width=this.axis.x.scrollbar.size+"px",this.axis.y.scrollbar.el.style.height=this.axis.y.scrollbar.size+"px",this.positionScrollbar("x"),this.positionScrollbar("y"),this.toggleTrackVisibility("x"),this.toggleTrackVisibility("y")},e.getScrollbarSize=function(i){if(i===void 0&&(i="y"),!this.axis[i].isOverflowing)return 0;var o=this.contentEl[this.axis[i].scrollSizeAttr],s=this.axis[i].track.el[this.axis[i].offsetSizeAttr],a,c=s/o;return a=Math.max(~~(c*s),this.options.scrollbarMinSize),this.options.scrollbarMaxSize&&(a=Math.min(a,this.options.scrollbarMaxSize)),a},e.positionScrollbar=function(i){if(i===void 0&&(i="y"),!!this.axis[i].isOverflowing){var o=this.contentWrapperEl[this.axis[i].scrollSizeAttr],s=this.axis[i].track.el[this.axis[i].offsetSizeAttr],a=parseInt(this.elStyles[this.axis[i].sizeAttr],10),c=this.axis[i].scrollbar,d=this.contentWrapperEl[this.axis[i].scrollOffsetAttr];d=i==="x"&&this.isRtl&&t.getRtlHelpers().isRtlScrollingInverted?-d:d;var u=d/(o-a),l=~~((s-c.size)*u);l=i==="x"&&this.isRtl&&t.getRtlHelpers().isRtlScrollbarInverted?l+(s-c.size):l,c.el.style.transform=i==="x"?"translate3d("+l+"px, 0, 0)":"translate3d(0, "+l+"px, 0)"}},e.toggleTrackVisibility=function(i){i===void 0&&(i="y");var o=this.axis[i].track.el,s=this.axis[i].scrollbar.el;this.axis[i].isOverflowing||this.axis[i].forceVisible?(o.style.visibility="visible",this.contentWrapperEl.style[this.axis[i].overflowAttr]="scroll"):(o.style.visibility="hidden",this.contentWrapperEl.style[this.axis[i].overflowAttr]="hidden"),this.axis[i].isOverflowing?s.style.display="block":s.style.display="none"},e.hideNativeScrollbar=function(){this.offsetEl.style[this.isRtl?"left":"right"]=this.axis.y.isOverflowing||this.axis.y.forceVisible?"-"+this.scrollbarWidth+"px":0,this.offsetEl.style.bottom=this.axis.x.isOverflowing||this.axis.x.forceVisible?"-"+this.scrollbarWidth+"px":0},e.onMouseMoveForAxis=function(i){i===void 0&&(i="y"),this.axis[i].track.rect=this.axis[i].track.el.getBoundingClientRect(),this.axis[i].scrollbar.rect=this.axis[i].scrollbar.el.getBoundingClientRect();var o=this.isWithinBounds(this.axis[i].scrollbar.rect);o?this.axis[i].scrollbar.el.classList.add(this.classNames.hover):this.axis[i].scrollbar.el.classList.remove(this.classNames.hover),this.isWithinBounds(this.axis[i].track.rect)?(this.showScrollbar(i),this.axis[i].track.el.classList.add(this.classNames.hover)):this.axis[i].track.el.classList.remove(this.classNames.hover)},e.onMouseLeaveForAxis=function(i){i===void 0&&(i="y"),this.axis[i].track.el.classList.remove(this.classNames.hover),this.axis[i].scrollbar.el.classList.remove(this.classNames.hover)},e.showScrollbar=function(i){i===void 0&&(i="y");var o=this.axis[i].scrollbar.el;this.axis[i].isVisible||(o.classList.add(this.classNames.visible),this.axis[i].isVisible=!0),this.options.autoHide&&this.hideScrollbars()},e.onDragStart=function(i,o){o===void 0&&(o="y");var s=Eo(this.el),a=Bt(this.el),c=this.axis[o].scrollbar,d=o==="y"?i.pageY:i.pageX;this.axis[o].dragOffset=d-c.rect[this.axis[o].offsetAttr],this.draggedAxis=o,this.el.classList.add(this.classNames.dragging),s.addEventListener("mousemove",this.drag,!0),s.addEventListener("mouseup",this.onEndDrag,!0),this.removePreventClickId===null?(s.addEventListener("click",this.preventClick,!0),s.addEventListener("dblclick",this.preventClick,!0)):(a.clearTimeout(this.removePreventClickId),this.removePreventClickId=null)},e.onTrackClick=function(i,o){var s=this;if(o===void 0&&(o="y"),!!this.options.clickOnTrack){var a=Bt(this.el);this.axis[o].scrollbar.rect=this.axis[o].scrollbar.el.getBoundingClientRect();var c=this.axis[o].scrollbar,d=c.rect[this.axis[o].offsetAttr],u=parseInt(this.elStyles[this.axis[o].sizeAttr],10),l=this.contentWrapperEl[this.axis[o].scrollOffsetAttr],m=o==="y"?this.mouseY-d:this.mouseX-d,f=m<0?-1:1,p=f===-1?l-u:l+u,g=function v(){if(f===-1){if(l>p){var h;l-=s.options.clickOnTrackSpeed,s.contentWrapperEl.scrollTo((h={},h[s.axis[o].offsetAttr]=l,h)),a.requestAnimationFrame(v)}}else if(l=i.left&&this.mouseX<=i.left+i.width&&this.mouseY>=i.top&&this.mouseY<=i.top+i.height},e.findChild=function(i,o){var s=i.matches||i.webkitMatchesSelector||i.mozMatchesSelector||i.msMatchesSelector;return Array.prototype.filter.call(i.children,function(a){return s.call(a,o)})[0]},t}();he.defaultOptions={autoHide:!0,forceVisible:!1,clickOnTrack:!0,clickOnTrackSpeed:40,classNames:{contentEl:"simplebar-content",contentWrapper:"simplebar-content-wrapper",offset:"simplebar-offset",mask:"simplebar-mask",wrapper:"simplebar-wrapper",placeholder:"simplebar-placeholder",scrollbar:"simplebar-scrollbar",track:"simplebar-track",heightAutoObserverWrapperEl:"simplebar-height-auto-observer-wrapper",heightAutoObserverEl:"simplebar-height-auto-observer",visible:"simplebar-visible",horizontal:"simplebar-horizontal",vertical:"simplebar-vertical",hover:"simplebar-hover",dragging:"simplebar-dragging"},scrollbarMinSize:25,scrollbarMaxSize:0,timeout:1e3};he.instances=new WeakMap;he.initDOMLoadedElements=function(){document.removeEventListener("DOMContentLoaded",this.initDOMLoadedElements),window.removeEventListener("load",this.initDOMLoadedElements),Array.prototype.forEach.call(document.querySelectorAll("[data-simplebar]"),function(t){t.getAttribute("data-simplebar")!=="init"&&!he.instances.has(t)&&new he(t,yo(t.attributes))})};he.removeObserver=function(){this.globalObserver.disconnect()};he.initHtmlApi=function(){this.initDOMLoadedElements=this.initDOMLoadedElements.bind(this),typeof MutationObserver!="undefined"&&(this.globalObserver=new MutationObserver(he.handleMutations),this.globalObserver.observe(document,{childList:!0,subtree:!0})),document.readyState==="complete"||document.readyState!=="loading"&&!document.documentElement.doScroll?window.setTimeout(this.initDOMLoadedElements):(document.addEventListener("DOMContentLoaded",this.initDOMLoadedElements),window.addEventListener("load",this.initDOMLoadedElements))};he.handleMutations=function(t){t.forEach(function(e){Array.prototype.forEach.call(e.addedNodes,function(n){n.nodeType===1&&(n.hasAttribute("data-simplebar")?!he.instances.has(n)&&document.documentElement.contains(n)&&new he(n,yo(n.attributes)):Array.prototype.forEach.call(n.querySelectorAll("[data-simplebar]"),function(i){i.getAttribute("data-simplebar")!=="init"&&!he.instances.has(i)&&document.documentElement.contains(i)&&new he(i,yo(i.attributes))}))}),Array.prototype.forEach.call(e.removedNodes,function(n){n.nodeType===1&&(n.getAttribute("data-simplebar")==="init"?he.instances.has(n)&&!document.documentElement.contains(n)&&he.instances.get(n).unMount():Array.prototype.forEach.call(n.querySelectorAll('[data-simplebar="init"]'),function(i){he.instances.has(i)&&!document.documentElement.contains(i)&&he.instances.get(i).unMount()}))})})};he.getOptions=yo;bo.default&&he.initHtmlApi();var Vm=Le(Wm());function Ym(t){return"error"in t&&"exception"in t}function Wn(t){return"error"in t}function Um(t){return typeof t.next=="string"}function re(t){let e=["","null","undefined"];return Array.isArray(t)?t.length>0:typeof t=="string"&&!e.includes(t)||typeof t=="number"||typeof t=="boolean"?!0:typeof t=="object"&&t!==null}function Bi(t){return t.every(e=>typeof e!="undefined"&&e!==null)}function Fi(t){for(let e of t.options)e.selected&&(e.selected=!1);t.value=""}function bl(t){return typeof t!==null&&typeof t!="undefined"}function fL(){let{csrftoken:t}=Vm.default.parse(document.cookie);if(typeof t=="undefined")throw new Error("Invalid or missing CSRF token");return t}function Km(t,e,n){return Pe(this,null,function*(){let i=fL(),o=new Headers({"X-CSRFToken":i}),s;typeof n!="undefined"&&(s=JSON.stringify(n),o.set("content-type","application/json"));let a=yield fetch(t,{method:e,body:s,headers:o,credentials:"same-origin"}),c=a.headers.get("Content-Type");if(typeof c=="string"&&c.includes("text"))return{error:yield a.text()};let d=yield a.json();return!a.ok&&Array.isArray(d)?{error:d.join(` +`)}:!a.ok&&"detail"in d?{error:d.detail}:d})}function So(t,e){return Pe(this,null,function*(){return yield Km(t,"PATCH",e)})}function hL(t){return Pe(this,null,function*(){return yield Km(t,"GET")})}function Gm(t){return Pe(this,null,function*(){return yield hL(t)})}function*j(...t){for(let e of t)for(let n of document.querySelectorAll(e))n!==null&&(yield n)}function ae(t){return document.getElementById(t)}function Xm(t,e=0){let n=e,i=document.getElementById("content-title");i!==null&&(n+=i.getBoundingClientRect().bottom);let o=t.getBoundingClientRect().top+window.pageYOffset+n;window.scrollTo({top:o,behavior:"smooth"})}function Qm(t){let e=[];for(let n of t.querySelectorAll("select"))if(n!==null){let i={name:n.name,options:[]};for(let o of n.options)o.selected&&i.options.push(o.value);e=[...e,i]}return e}function zi(t,e){t!==null&&(typeof e=="undefined"?window.getComputedStyle(t).display==="none"?t.style.display="":t.style.display="none":e==="show"?t.style.display="":t.style.display="none")}function*Jm(t){for(let e of t.querySelectorAll("td"))e!==null&&re(e.innerText)&&e.innerText!=="\u2014"&&(yield e.innerText.replaceAll(/[\n\r]/g,"").trim())}function Ve(t,e,n){function i(s){return!!(typeof n=="string"&&s!==null&&s.matches(n))}function o(s){if(s!==null&&s.parentElement!==null&&!i(s)){for(let a of s.parentElement.querySelectorAll(e))if(a!==null)return a;return o(s.parentElement.parentElement)}return null}return o(t)}function Vn(t,e,n=null,i=[]){let o=document.createElement(t);if(e!==null)for(let s of Object.keys(e)){let a=s,c=e[a];a in o&&(o[a]=c)}n!==null&&n.length>0&&o.classList.add(...n);for(let s of i)o.appendChild(s);return o}function Zm(t,e){let n=new Map;for(let i of t){let o=i[e];n.has(o)||n.set(o,i)}return Array.from(n.values())}function pL(t,e){let n=new Set;for(let i of e.querySelectorAll("*[name]"))i.validity.valid?(i.classList.contains("is-invalid")&&i.classList.remove("is-invalid"),i.classList.contains("is-valid")||i.classList.add("is-valid")):(n.add(i.name),i.classList.contains("is-valid")&&i.classList.remove("is-valid"),i.classList.contains("is-invalid")||i.classList.add("is-invalid"));if(n.size!==0){let i=e.elements.namedItem(Array.from(n)[0]);Xm(i),t.preventDefault()}}function eg(){for(let t of j("form")){let e=t.querySelectorAll("button[type=submit]");for(let n of e)n.addEventListener("click",i=>pL(i,t))}}function tg(){for(let t of j("a.set_speed"))if(t!==null){let e=function(n){n.preventDefault();let i=t.getAttribute("data"),o=document.getElementById(t.target);o!==null&&i!==null&&(o.value=i)};t.addEventListener("click",e)}}var yl={vlangroup_edit:{region:{hide:["id_sitegroup","id_site","id_location","id_rack","id_clustergroup","id_cluster"],show:["id_region"]},"site group":{hide:["id_region","id_site","id_location","id_rack","id_clustergroup","id_cluster"],show:["id_sitegroup"]},site:{hide:["id_location","id_rack","id_clustergroup","id_cluster"],show:["id_region","id_sitegroup","id_site"]},location:{hide:["id_rack","id_clustergroup","id_cluster"],show:["id_region","id_sitegroup","id_site","id_location"]},rack:{hide:["id_clustergroup","id_cluster"],show:["id_region","id_sitegroup","id_site","id_location","id_rack"]},"cluster group":{hide:["id_region","id_sitegroup","id_site","id_location","id_rack","id_cluster"],show:["id_clustergroup"]},cluster:{hide:["id_region","id_sitegroup","id_site","id_location","id_rack"],show:["id_clustergroup","id_cluster"]},default:{hide:["id_region","id_sitegroup","id_site","id_location","id_rack","id_clustergroup","id_cluster"],show:[]}}};function El(t,e){var n;for(let i of j(t)){let o=(n=i.parentElement)==null?void 0:n.parentElement;o!==null&&(e==="show"?zi(o,"show"):zi(o,"hide"))}}function ng(t,e){let n=e.options[e.selectedIndex].innerText.toLowerCase();for(let[i,o]of Object.entries(yl[t]))if(n.endsWith(i)){for(let s of o.hide)El(`#${s}`,"hide");for(let s of o.show)El(`#${s}`,"show");break}else for(let s of yl[t].default.hide)El(`#${s}`,"hide")}function ig(){for(let t of Object.keys(yl))for(let e of j(`html[data-netbox-url-name="${t}"] #id_scope_type`))ng(t,e),e.addEventListener("change",()=>ng(t,e))}function mL(t){var n,i;let e=(i=(n=t==null?void 0:t.parentElement)==null?void 0:n.parentElement)!=null?i:null;return e!==null&&e.classList.contains("row")?e:null}function st(t,e){let n=mL(t);if(t!==null&&n!==null){zi(n,e);let i=new Event(`netbox.select.disabled.${t.name}`);switch(e){case"hide":t.disabled=!0,t.dispatchEvent(i);break;case"show":t.disabled=!1,t.dispatchEvent(i)}}}function gL(){let t=[ae("id_tagged_vlans"),ae("id_untagged_vlan"),ae("id_vlan_group")];if(Bi(t)){let[e,n]=t;Fi(n),Fi(e);for(let i of t)st(i,"hide")}}function vL(){let t=[ae("id_tagged_vlans"),ae("id_untagged_vlan"),ae("id_vlan_group")];if(Bi(t)){let[e,n,i]=t;Fi(e),st(i,"show"),st(n,"show"),st(e,"hide")}}function bL(){let t=[ae("id_tagged_vlans"),ae("id_untagged_vlan"),ae("id_vlan_group")];if(Bi(t)){let[e,n,i]=t;st(e,"show"),st(i,"show"),st(n,"show")}}function yL(){let t=[ae("id_tagged_vlans"),ae("id_untagged_vlan"),ae("id_vlan_group")];if(Bi(t)){let[e,n,i]=t;Fi(e),st(i,"show"),st(n,"show"),st(e,"hide")}}function rg(t){switch(t.value){case"access":vL();break;case"tagged":bL();break;case"tagged-all":yL();break;case"":gL();break}}function og(){let t=ae("id_mode");t!==null&&(t.addEventListener("change",()=>rg(t)),rg(t))}function sg(){for(let t of[eg,tg,ig,og])t()}var hg=Le(fg());window.Collapse=Me;window.Modal=Nt;window.Popover=an;window.Toast=_t;window.Tooltip=et;function EL(){for(let t of j(".masonry"))new hg.default(t,{itemSelector:".masonry-item",percentPosition:!0})}function _L(){for(let t of j('[data-bs-toggle="tooltip"]'))new et(t,{container:"body"})}function SL(){for(let t of j('[data-bs-toggle="modal"]'))new Nt(t)}function Sn(t,e,n,i){let o="mdi-alert";switch(t){case"warning":o="mdi-alert";break;case"success":o="mdi-check-circle";break;case"info":o="mdi-information";break;case"danger":o="mdi-alert";break}let s=document.createElement("div");s.setAttribute("class","toast-container position-fixed bottom-0 end-0 m-3");let a=document.createElement("div");a.setAttribute("class",`toast bg-${t}`),a.setAttribute("role","alert"),a.setAttribute("aria-live","assertive"),a.setAttribute("aria-atomic","true");let c=document.createElement("div");c.setAttribute("class",`toast-header bg-${t} text-body`);let d=document.createElement("i");d.setAttribute("class",`mdi ${o}`);let u=document.createElement("strong");u.setAttribute("class","me-auto ms-1"),u.innerText=e;let l=document.createElement("button");l.setAttribute("type","button"),l.setAttribute("class","btn-close"),l.setAttribute("data-bs-dismiss","toast"),l.setAttribute("aria-label","Close");let m=document.createElement("div");if(m.setAttribute("class","toast-body"),c.appendChild(d),c.appendChild(u),typeof i!="undefined"){let p=document.createElement("small");p.setAttribute("class","text-muted"),c.appendChild(p)}return c.appendChild(l),m.innerText=n.trim(),a.appendChild(c),a.appendChild(m),s.appendChild(a),document.body.appendChild(s),new _t(a)}function wL(){let{hash:t}=location;if(t&&t.match(/^#tab_.+$/)){let e=t.replace("tab_","");for(let n of j(`ul.nav.nav-tabs .nav-link[data-bs-target="${e}"]`))new cn(n).show()}}function TL(){let t=document.querySelectorAll(".sidebar .accordion-item");function e(n){for(let i of t)i!==n?i.classList.remove("is-open"):i.classList.toggle("is-open")}for(let n of t)for(let i of n.querySelectorAll(".accordion-button"))i.addEventListener("click",()=>{e(n)})}function xL(){for(let t of j("a.image-preview")){let e=`${Math.round(window.innerWidth/4)}px`,n=Vn("img",{src:t.href});n.style.maxWidth=e;let i=Vn("div",null,null,[n]);new an(t,{customClass:"image-preview-popover",trigger:"hover",html:!0,content:i})}}function pg(){for(let t of[_L,SL,EL,wL,xL,TL])t()}var wl=Le(Sl());function AL(t,e){var c;let n=t.currentTarget,i=Ve(n,"span.search-obj-selected"),o=Ve(n,"input.search-obj-type"),s=n.getAttribute("data-search-value"),a="";i!==null&&o!==null&&(re(s)&&a!==s?(a=s,i.innerHTML=(c=e.textContent)!=null?c:"Error",o.value=s):(a="",i.innerHTML="All Objects",o.value=""))}function CL(){for(let t of j(".search-obj-selector"))for(let e of t.querySelectorAll("li > button.dropdown-item"))e.addEventListener("click",n=>AL(n,e))}function LL(){var t;for(let e of j("input.interface-filter")){let o=function(s){let a=s.target,c=new RegExp(a.value.toLowerCase().trim());for(let d of i){let u=d.querySelector('input[type="checkbox"][name="pk"]');u!==null&&(u.checked=!1);let l=d.getAttribute("data-name");typeof l=="string"&&(c.test(l.toLowerCase().trim())?d.classList.contains("d-none")&&d.classList.remove("d-none"):d.classList.add("d-none"))}},n=Ve(e,"table"),i=Array.from((t=n==null?void 0:n.querySelectorAll("tbody > tr"))!=null?t:[]).filter(s=>s!==null);e.addEventListener("keyup",(0,wl.default)(o,300))}}function DL(){var t;for(let e of j("input.object-filter")){let o=function(s){let a=s.target,c=new RegExp(a.value.toLowerCase().trim());for(let d of i){let u=d.querySelector('input[type="checkbox"][name="pk"]');u!==null&&(u.checked=!1);for(let l of Jm(d))if(c.test(l.toLowerCase())){d.classList.remove("d-none");break}else d.classList.add("d-none")}},n=Ve(e,"table"),i=Array.from((t=n==null?void 0:n.querySelectorAll("tbody > tr"))!=null?t:[]).filter(s=>s!==null);e.addEventListener("keyup",(0,wl.default)(o,300))}}function gg(){for(let t of[CL,DL,LL])t()}function vg(t,e,n){return Math.min(Math.max(t,n),e)}var Yn=class extends Error{constructor(e){super(`Failed to parse color: "${e}"`)}};function ML(t){if(typeof t!="string")throw new Yn(t);if(t.trim().toLowerCase()==="transparent")return[0,0,0,0];let e=t.trim();e=jL.test(t)?function(a){let c=a.toLowerCase().trim(),d=IL[function(u){let l=5381,m=u.length;for(;m;)l=33*l^u.charCodeAt(--m);return(l>>>0)%2341}(c)];if(!d)throw new Yn(a);return`#${d}`}(t):t;let n=kL.exec(e);if(n){let a=Array.from(n).slice(1);return[...a.slice(0,3).map(c=>parseInt(Wi(c,2),16)),parseInt(Wi(a[3]||"f",2),16)/255]}let i=PL.exec(e);if(i){let a=Array.from(i).slice(1);return[...a.slice(0,3).map(c=>parseInt(c,16)),parseInt(a[3]||"ff",16)/255]}let o=NL.exec(e);if(o){let a=Array.from(o).slice(1);return[...a.slice(0,3).map(c=>parseInt(c,10)),parseFloat(a[3]||"1")]}let s=RL.exec(e);if(s){let[a,c,d,u]=Array.from(s).slice(1).map(parseFloat);if(vg(0,100,c)!==c)throw new Yn(t);if(vg(0,100,d)!==d)throw new Yn(t);return[...HL(a,c,d),u||1]}throw new Yn(t)}var bg=t=>parseInt(t.replace(/_/g,""),36),IL="1q29ehhb 1n09sgk7 1kl1ekf_ _yl4zsno 16z9eiv3 1p29lhp8 _bd9zg04 17u0____ _iw9zhe5 _to73___ _r45e31e _7l6g016 _jh8ouiv _zn3qba8 1jy4zshs 11u87k0u 1ro9yvyo 1aj3xael 1gz9zjz0 _3w8l4xo 1bf1ekf_ _ke3v___ _4rrkb__ 13j776yz _646mbhl _nrjr4__ _le6mbhl 1n37ehkb _m75f91n _qj3bzfz 1939yygw 11i5z6x8 _1k5f8xs 1509441m 15t5lwgf _ae2th1n _tg1ugcv 1lp1ugcv 16e14up_ _h55rw7n _ny9yavn _7a11xb_ 1ih442g9 _pv442g9 1mv16xof 14e6y7tu 1oo9zkds 17d1cisi _4v9y70f _y98m8kc 1019pq0v 12o9zda8 _348j4f4 1et50i2o _8epa8__ _ts6senj 1o350i2o 1mi9eiuo 1259yrp0 1ln80gnw _632xcoy 1cn9zldc _f29edu4 1n490c8q _9f9ziet 1b94vk74 _m49zkct 1kz6s73a 1eu9dtog _q58s1rz 1dy9sjiq __u89jo3 _aj5nkwg _ld89jo3 13h9z6wx _qa9z2ii _l119xgq _bs5arju 1hj4nwk9 1qt4nwk9 1ge6wau6 14j9zlcw 11p1edc_ _ms1zcxe _439shk6 _jt9y70f _754zsow 1la40eju _oq5p___ _x279qkz 1fa5r3rv _yd2d9ip _424tcku _8y1di2_ _zi2uabw _yy7rn9h 12yz980_ __39ljp6 1b59zg0x _n39zfzp 1fy9zest _b33k___ _hp9wq92 1il50hz4 _io472ub _lj9z3eo 19z9ykg0 _8t8iu3a 12b9bl4a 1ak5yw0o _896v4ku _tb8k8lv _s59zi6t _c09ze0p 1lg80oqn 1id9z8wb _238nba5 1kq6wgdi _154zssg _tn3zk49 _da9y6tc 1sg7cv4f _r12jvtt 1gq5fmkz 1cs9rvci _lp9jn1c _xw1tdnb 13f9zje6 16f6973h _vo7ir40 _bt5arjf _rc45e4t _hr4e100 10v4e100 _hc9zke2 _w91egv_ _sj2r1kk 13c87yx8 _vqpds__ _ni8ggk8 _tj9yqfb 1ia2j4r4 _7x9b10u 1fc9ld4j 1eq9zldr _5j9lhpx _ez9zl6o _md61fzm".split(" ").reduce((t,e)=>{let n=bg(e.substring(0,3)),i=bg(e.substring(3)).toString(16),o="";for(let s=0;s<6-i.length;s++)o+="0";return t[n]=`${o}${i}`,t},{}),Wi=(t,e)=>Array.from(Array(e)).map(()=>t).join(""),kL=new RegExp(`^#${Wi("([a-f0-9])",3)}([a-f0-9])?$`,"i"),PL=new RegExp(`^#${Wi("([a-f0-9]{2})",3)}([a-f0-9]{2})?$`,"i"),NL=new RegExp(`^rgba?\\(\\s*(\\d+)\\s*${Wi(",\\s*(\\d+)\\s*",2)}(?:,\\s*([\\d.]+))?\\s*\\)$`,"i"),RL=/^hsla?\(\s*([\d.]+)\s*,\s*([\d.]+)%\s*,\s*([\d.]+)%(?:\s*,\s*([\d.]+))?\s*\)$/i,jL=/^[a-z]+$/i,yg=t=>Math.round(255*t),HL=(t,e,n)=>{let i=n/100;if(e===0)return[i,i,i].map(yg);let o=(t%360+360)%360/60,s=(1-Math.abs(2*i-1))*(e/100),a=s*(1-Math.abs(o%2-1)),c=0,d=0,u=0;o>=0&&o<1?(c=s,d=a):o>=1&&o<2?(c=a,d=s):o>=2&&o<3?(d=s,u=a):o>=3&&o<4?(d=a,u=s):o>=4&&o<5?(c=a,u=s):o>=5&&o<6&&(c=s,u=a);let l=i-s/2;return[c+l,d+l,u+l].map(yg)};function qL(t){if(t==="transparent")return 0;function e(s){let a=s/255;return a<=.03928?a/12.92:Math.pow((a+.055)/1.055,2.4)}let[n,i,o]=ML(t);return .2126*e(n)+.7152*e(i)+.0722*e(o)}function $L(t){return qL(t)>.179}function Vi(t){return $L(t)?"#000":"#fff"}var Vg=Le(Sl()),Ol=Le(Hg());var Mo={};(function(t,e){typeof Mo=="object"&&typeof module=="object"?module.exports=e():typeof define=="function"&&define.amd?define([],e):typeof Mo=="object"?Mo.SlimSelect=e():t.SlimSelect=e()})(window,function(){return n={},t.m=e=[function(i,o,s){"use strict";function a(d,u){u=u||{bubbles:!1,cancelable:!1,detail:void 0};var l=document.createEvent("CustomEvent");return l.initCustomEvent(d,u.bubbles,u.cancelable,u.detail),l}var c;o.__esModule=!0,o.hasClassInTree=function(d,u){function l(m,f){return f&&m&&m.classList&&m.classList.contains(f)?m:null}return l(d,u)||function m(f,p){return f&&f!==document?l(f,p)?f:m(f.parentNode,p):null}(d,u)},o.ensureElementInView=function(d,u){var l=d.scrollTop+d.offsetTop,m=l+d.clientHeight,f=u.offsetTop,p=f+u.clientHeight;f=window.innerHeight?"above":l?u:"below"},o.debounce=function(d,u,l){var m;return u===void 0&&(u=100),l===void 0&&(l=!1),function(){for(var f=[],p=0;p[^<>]*'+v+"")},o.kebabCase=function(d){var u=d.replace(/[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g,function(l){return"-"+l.toLowerCase()});return d[0]===d[0].toUpperCase()?u.substring(1):u},typeof(c=window).CustomEvent!="function"&&(a.prototype=c.Event.prototype,c.CustomEvent=a)},function(i,o,s){"use strict";o.__esModule=!0;var a=(c.prototype.newOption=function(u){return{id:u.id?u.id:String(Math.floor(1e8*Math.random())),value:u.value?u.value:"",text:u.text?u.text:"",innerHTML:u.innerHTML?u.innerHTML:"",selected:!!u.selected&&u.selected,display:u.display===void 0||u.display,disabled:!!u.disabled&&u.disabled,placeholder:!!u.placeholder&&u.placeholder,class:u.class?u.class:void 0,data:u.data?u.data:{},mandatory:!!u.mandatory&&u.mandatory}},c.prototype.add=function(u){this.data.push({id:String(Math.floor(1e8*Math.random())),value:u.value,text:u.text,innerHTML:"",selected:!1,display:!0,disabled:!1,placeholder:!1,class:void 0,mandatory:u.mandatory,data:{}})},c.prototype.parseSelectData=function(){this.data=[];for(var u=0,l=this.main.select.element.childNodes;u',placeholder:this.placeholder,searchPlaceholder:"Filter",onChange:()=>this.handleSlimChange()}),this.getStaticParams(),this.getDynamicParams(),this.getPathKeys();for(let[a,c]of this.staticParams.entries())this.queryParams.set(a,c);for(let a of this.dynamicParams.keys())this.updateQueryParams(a);for(let a of this.pathValues.keys())this.updatePathValues(a);this.queryParams.set("brief",[!0]),this.updateQueryUrl(),this.resetClasses(),this.setSlimStyles(),this.initResetButton(),this.initRefreshButton(),this.addEventListeners();let o=this.base.getAttribute("data-fetch-trigger"),s=this.base.closest(".content-container .collapse");switch(Bg(o)?this.trigger=o:s!==null?this.trigger="collapse":this.trigger="load",this.trigger){case"collapse":s!==null&&(s.addEventListener("show.bs.collapse",()=>this.loadData()),s.addEventListener("hide.bs.collapse",()=>this.resetOptions()));break;case"open":this.slim.beforeOpen=()=>this.loadData();break;case"load":Promise.all([this.loadData()]);break}}get options(){return this.slim.data.data.filter(Wg)}set options(e){let n=e;this.nullOption!==null&&(n=[this.nullOption,...n]);let i=Zm(n,"value"),o=typeof i.find(a=>a.value==="")!="undefined",s=i.findIndex(a=>a.value==="");o&&s>=0?i[s]=this.emptyOption:i.unshift(this.emptyOption),this.slim.setData(i)}resetOptions(){this.options=[this.emptyOption]}disable(){this.slim.slim.singleSelected!==null?this.slim.slim.singleSelected.container.hasAttribute("disabled")||this.slim.slim.singleSelected.container.setAttribute("disabled",""):this.slim.slim.multiSelected!==null&&(this.slim.slim.multiSelected.container.hasAttribute("disabled")||this.slim.slim.multiSelected.container.setAttribute("disabled","")),this.slim.disable()}enable(){this.slim.slim.singleSelected!==null?this.slim.slim.singleSelected.container.hasAttribute("disabled")&&this.slim.slim.singleSelected.container.removeAttribute("disabled"):this.slim.slim.multiSelected!==null&&this.slim.slim.multiSelected.container.hasAttribute("disabled")&&this.slim.slim.multiSelected.container.removeAttribute("disabled"),this.slim.enable()}addEventListeners(){let e=(0,Vg.default)(i=>this.handleSearch(i),300,!1);this.slim.slim.search.input.addEventListener("keyup",i=>{if(!i.key.match(/^(Arrow|Enter|Tab).*/))return e(i)}),this.slim.slim.search.input.addEventListener("paste",i=>e(i)),this.slim.slim.list.addEventListener("scroll",()=>this.handleScroll()),this.base.addEventListener(`netbox.select.atbottom.${this.name}`,()=>this.fetchOptions(this.more,"merge")),this.base.addEventListener(`netbox.select.disabled.${this.name}`,i=>this.handleDisableEnable(i));let n=new Set([...this.dynamicParams.keys(),...this.pathValues.keys()]);for(let i of n){let o=document.querySelector(`[name="${i}"]`);o!==null&&o.addEventListener("change",s=>this.handleEvent(s)),this.base.addEventListener(`netbox.select.onload.${i}`,s=>this.handleEvent(s))}}loadData(){return Pe(this,null,function*(){try{this.disable(),yield this.getOptions("replace")}catch(e){console.error(e)}finally{this.setOptionStyles(),this.enable(),this.base.dispatchEvent(this.loadEvent)}})}getPreselectedOptions(){return Array.from(this.base.options).filter(e=>e.selected).filter(e=>!(e.value==="---------"||e.innerText==="---------"))}processOptions(e,n="merge"){return Pe(this,null,function*(){let i=this.getPreselectedOptions(),o=i.map(c=>c.getAttribute("value")).filter(re),s=i.map(c=>({value:c.value,text:c.innerText,selected:!0,disabled:!1})),a=[];for(let c of e.results){let d=c.display;typeof c._depth=="number"&&c._depth>0&&(d=`${"\u2500".repeat(c._depth)} ${d}`);let u={},l=c.id.toString(),m,f,p;for(let[v,h]of Object.entries(c)){if(!["id","slug"].includes(v)&&["string","number","boolean"].includes(typeof h)){let y=v.replaceAll("_","-");u[y]=String(h)}this.disabledAttributes.some(y=>y.toLowerCase()===v.toLowerCase())&&(typeof h=="string"&&h.toLowerCase()!=="false"||typeof h=="boolean"&&h===!0||typeof h=="number"&&h>0)&&(p=!0)}o.some(v=>this.disabledOptions.includes(v))&&(p=!0),o.includes(l)&&(f=!0,p=!1);let g={value:l,text:d,data:u,style:m,selected:f,disabled:p};a=[...a,g]}switch(n){case"merge":this.options=[...this.options,...a];break;case"replace":this.options=[...s,...a];break}Um(e)?this.more=e.next:this.more=null})}fetchOptions(e,n="merge"){return Pe(this,null,function*(){if(typeof e=="string"){let i=yield Gm(e);if(Wn(i))return Ym(i)?this.handleError(i.exception,i.error):this.handleError(`Error Fetching Options for field '${this.name}'`,i.error);yield this.processOptions(i,n)}})}getOptions(e="merge"){return Pe(this,null,function*(){if(this.queryUrl.includes("{{")){this.resetOptions();return}yield this.fetchOptions(this.queryUrl,e)})}handleSearch(e){return Pe(this,null,function*(){let{value:n}=e.target,i=Ol.default.stringifyUrl({url:this.queryUrl,query:{q:n}});yield this.fetchOptions(i,"merge"),this.slim.data.search(n),this.slim.render()})}handleScroll(){let e=this.slim.slim.list.scrollTop+this.slim.slim.list.offsetHeight===this.slim.slim.list.scrollHeight;this.atBottom&&!e?(this.atBottom=!1,this.base.dispatchEvent(this.bottomEvent)):!this.atBottom&&e&&(this.atBottom=!0,this.base.dispatchEvent(this.bottomEvent))}handleEvent(e){let n=e.target;this.updateQueryParams(n.name),this.updatePathValues(n.name),this.updateQueryUrl(),Promise.all([this.loadData()])}handleDisableEnable(e){let n=e.target;n.disabled===!0?this.disable():n.disabled===!1&&this.enable()}handleError(e,n){Sn("danger",e,n).show(),this.resetOptions()}handleSlimChange(){let e=this.slim.slim;e&&(e.container.classList.contains("is-invalid")||this.base.classList.contains("is-invalid"))&&(e.container.classList.remove("is-invalid"),this.base.classList.remove("is-invalid")),this.base.dispatchEvent(this.loadEvent)}updateQueryUrl(){let e={};for(let[o,s]of this.queryParams.entries())e[o]=s;let n=this.url;for(let[o,s]of this.pathValues.entries())for(let a of this.url.matchAll(new RegExp(`({{${o}}})`,"g")))re(s)&&(n=n.replaceAll(a[1],s.toString()));let i=Ol.default.stringifyUrl({url:n,query:e});this.queryUrl!==i&&(this.queryUrl=i,this.base.setAttribute("data-url",i))}updateQueryParams(e){let n=document.querySelector(`[name="${e}"]`);if(n!==null){let i=[];if(n.multiple?i=Array.from(n.options).filter(o=>o.selected).map(o=>o.value):n.value!==""&&(i=[n.value]),i.length>0){this.dynamicParams.updateValue(e,i);let o=this.dynamicParams.get(e);if(typeof o!="undefined"){let{queryParam:s,queryValue:a}=o,c=[];if(this.staticParams.has(s)){let d=this.staticParams.get(s);typeof d!="undefined"&&(c=[...d,...a])}else c=a;c.length>0?this.queryParams.set(s,c):this.queryParams.delete(s)}}else{let o=this.dynamicParams.queryParam(e);o!==null&&this.queryParams.delete(o)}}}updatePathValues(e){let n=e.replaceAll(/^id_/gi,""),i=ae(`id_${n}`);i!==null&&this.url.includes("{{")&&Boolean(this.url.match(new RegExp(`({{(${e})}})`,"g")))&&(re(i.value)?this.pathValues.set(e,i.value):this.pathValues.set(e,""))}getPlaceholder(){let e=this.name;if(this.base.id){let n=document.querySelector(`label[for="${this.base.id}"]`);n!==null&&(e=`Select ${n.innerText.trim()}`)}return e}getDisabledOptions(){var n;let e=[];if($g(this.base))try{let i=JSON.parse((n=this.base.getAttribute("data-query-param-exclude"))!=null?n:"[]");e=[...e,...i]}catch(i){console.group(`Unable to parse data-query-param-exclude value on select element '${this.name}'`),console.warn(i),console.groupEnd()}return e}getDisabledAttributes(){let e=[...Yg],n=this.base.getAttribute("disabled-indicator");return re(n)&&(e=[...e,n]),e}getPathKeys(){for(let e of this.url.matchAll(new RegExp("{{(.+)}}","g")))this.pathValues.set(e[1],"")}getDynamicParams(){let e=this.base.getAttribute("data-dynamic-params");try{this.dynamicParams.addFromJson(e)}catch(n){console.group(`Unable to determine dynamic query parameters for select field '${this.name}'`),console.warn(n),console.groupEnd()}}getStaticParams(){let e=this.base.getAttribute("data-static-params");try{if(re(e)){let n=JSON.parse(e);if(zg(n))for(let{queryParam:i,queryValue:o}of n)Array.isArray(o)?this.staticParams.set(i,o):this.staticParams.set(i,[o])}}catch(n){console.group(`Unable to determine static query parameters for select field '${this.name}'`),console.warn(n),console.groupEnd()}}setSlimStyles(){let{width:e,height:n}=this.slim.slim.container.getBoundingClientRect();this.base.style.opacity="0",this.base.style.width=`${e}px`,this.base.style.height=`${n}px`,this.base.style.display="block",this.base.style.position="absolute",this.base.style.pointerEvents="none"}setOptionStyles(){for(let e of this.options)if("data"in e&&"id"in e&&typeof e.data!="undefined"&&typeof e.id!="undefined"&&"color"in e.data){let n=e.id,i=e.data,o=document.createElement("style"),s=`#${i.color}`,a=Vi(s);o.setAttribute("data-netbox",n),o.innerHTML=` div.ss-values div.ss-value[data-id="${n}"], div.ss-list div.ss-option:not(.ss-disabled)[data-id="${n}"] { @@ -14,7 +14,7 @@ color: ${a} !important; } `.replaceAll(` -`,"").trim(),document.head.appendChild(o)}}resetClasses(){let e=this.slim.slim;if(e)for(let n of this.base.classList)e.container.classList.remove(n)}initResetButton(){let e=Ie(this.base,"button[data-reset-select]");e!==null&&e.addEventListener("click",()=>{window.location.assign(window.location.origin+window.location.pathname)})}initRefreshButton(){if(this.allowRefresh){let e=Vn("button",{type:"button"},["btn","btn-sm","btn-ghost-dark"],[Vn("i",null,["mdi","mdi-reload"])]);e.addEventListener("click",()=>this.loadData()),e.type="button",this.slim.slim.search.container.appendChild(e)}}};function Kg(){for(let t of R(".netbox-api-select"))new Al(t)}function Gg(t){return typeof t.value=="string"&&t.value!==""}function Xg(t,e){if(t.slim.singleSelected!==null)if(Gg(e)){let n=`#${e.value}`,i=Vi(n);t.slim.singleSelected.container.style.backgroundColor=n,t.slim.singleSelected.container.style.color=i}else t.slim.singleSelected.container.removeAttribute("style")}function Qg(){for(let t of R("select.netbox-color-select")){for(let n of t.options)if(Gg(n)){let i=`#${n.value}`,o=Vi(i);n.style.backgroundColor=i,n.style.color=o}let e=new Un({select:t,allowDeselect:!0,deselectLabel:''});for(let n of e.data.data)if("selected"in n&&n.selected){Xg(e,n);break}for(let n of t.classList)e.slim.container.classList.remove(n);e.onChange=n=>Xg(e,n)}}function Jg(){for(let t of R(".netbox-static-select"))if(t!==null){let e=document.querySelector(`label[for="${t.id}"]`),n;e!==null&&(n=`Select ${e.innerText.trim()}`);let i=new Un({select:t,allowDeselect:!0,deselectLabel:'',placeholder:n});for(let o of t.classList)i.slim.container.classList.remove(o)}}function Zg(){for(let t of[Kg,Qg,Jg])t()}function ZL(t){let e=t.getAttribute("data-url"),n=t.classList.contains("connected"),i=n?"planned":"connected";ie(e)&&So(e,{status:i}).then(o=>{var s;if(Wn(o)){Sn("danger","Error",o.error).show();return}else{let a=(s=t.parentElement)==null?void 0:s.parentElement,c=t.querySelector("i.mdi, span.mdi");n?(a.classList.remove("success"),a.classList.add("info"),t.classList.remove("connected","btn-warning"),t.classList.add("btn-info"),t.title="Mark Installed",c.classList.remove("mdi-lan-disconnect"),c.classList.add("mdi-lan-connect")):(a.classList.remove("info"),a.classList.add("success"),t.classList.remove("btn-success"),t.classList.add("connected","btn-warning"),t.title="Mark Installed",c.classList.remove("mdi-lan-connect"),c.classList.add("mdi-lan-disconnect"))}})}function ev(){for(let t of R("button.cable-toggle"))t.addEventListener("click",()=>ZL(t))}var tv=class{set(e,n,i){return e[n]=i,!0}get(e,n){return e[n]}has(e,n){return n in e}},Io=class{constructor(e,n){Q(this,"handlers");Q(this,"proxy");Q(this,"options");Q(this,"key","");if(this.options=n,typeof this.options.key=="string"?this.key=this.options.key:this.key=this.generateStateKey(e),this.options.persist){let i=this.retrieve();i!==null&&(e=K(K({},e),i))}this.handlers=new tv,this.proxy=new Proxy(e,this.handlers),this.options.persist&&this.save()}generateStateKey(e){return`netbox-${window.btoa(Object.keys(e).join("---"))}`}get(e){return this.handlers.get(this.proxy,e)}set(e,n){this.handlers.set(this.proxy,e,n),this.options.persist&&this.save()}all(){return this.proxy}keys(){return Object.keys(this.proxy)}values(){return Object.values(this.proxy)}save(){let e=JSON.stringify(this.proxy);localStorage.setItem(this.key,e)}retrieve(){let e=localStorage.getItem(this.key);return e!==null?JSON.parse(e):null}};function ko(t,e={}){return new Io(t,e)}var Cl=ko({hidden:!1},{persist:!0,key:"netbox-object-depth"});var Ll=ko({hidden:!1},{persist:!0});function nv(t,e){e.setAttribute("data-depth-indicators",t?"hidden":"shown"),e.innerText=t?"Show Depth Indicators":"Hide Depth Indicators"}function iv(){for(let t of R(".record-depth"))t.style.display=""}function rv(){for(let t of R(".record-depth"))t.style.display="none"}function eD(t,e){let n=t.get("hidden");t.set("hidden",!n);let i=t.get("hidden");i?rv():iv(),nv(i,e)}function ov(){let t=Cl.get("hidden");for(let e of R("button.toggle-depth"))nv(t,e),e.addEventListener("click",n=>{eD(Cl,n.currentTarget)},!1);t?rv():t||iv()}function tD(t){let e=Array.from(t.options);for(let n=1;n=0;n--){let i=e[n];if(i.selected){let o=t.options[n+1];i=t.removeChild(i),o=t.replaceChild(i,o),t.insertBefore(o,i)}}}function sv(){for(let t of R("#move-option-up")){let e=t.getAttribute("data-target");if(e!==null)for(let n of R(`#${e}`))t.addEventListener("click",()=>tD(n))}for(let t of R("#move-option-down")){let e=t.getAttribute("data-target");if(e!==null)for(let n of R(`#${e}`))t.addEventListener("click",()=>nD(n))}}function iD(t){let e=t.currentTarget;e.form!==null&&e.form.submit()}function av(){for(let t of R("select.per-page"))t.addEventListener("change",iD)}var Kn="netbox-color-mode",rD="Light Mode",oD="Dark Mode",lv="mdi-lightbulb-on",cv="mdi-lightbulb";function sD(t){return t==="dark"||t==="light"}function aD(t){return localStorage.setItem(Kn,t)}function lD(t){var e,n;document.documentElement.setAttribute(`data-${Kn}`,t);for(let i of R("span.color-mode-text"))t==="light"?i.innerText=oD:t==="dark"&&(i.innerText=rD);for(let i of R("i.color-mode-icon","span.color-mode-icon"))t==="light"?(i.classList.remove(lv),i.classList.add(cv)):t==="dark"&&(i.classList.remove(cv),i.classList.add(lv));for(let i of R(".rack_elevation")){let o=(n=(e=i.contentDocument)==null?void 0:e.querySelector("svg"))!=null?n:null;o!==null&&o.setAttribute(`data-${Kn}`,t)}}function Ke(t){for(let e of[aD,lD])e(t)}function cD(){let t=localStorage.getItem(Kn);t==="light"?Ke("dark"):t==="dark"?Ke("light"):console.warn("Unable to determine the current color mode")}function uD(){let t=localStorage.getItem(Kn),e=document.documentElement.getAttribute(`data-${Kn}`);if(ie(e)&&ie(t))return Ke(t);let n="none";for(let i of["dark","light"])if(window.matchMedia(`(prefers-color-scheme: ${i})`).matches){n=i;break}if(ie(t)&&!ie(e)&&sD(t))return Ke(t);switch(n){case"dark":return Ke("dark");case"light":return Ke("light");case"none":return Ke("light");default:return Ke("light")}}function dD(){for(let t of R("button.color-mode-toggle"))t.addEventListener("click",cD)}function uv(){window.addEventListener("load",uD);for(let t of[dD])t()}function fD(t){let e=t.currentTarget,n=new FormData(e);n.get("ui.colormode")==="dark"?Ke("dark"):n.get("ui.colormode")==="light"&&Ke("light")}function dv(){let t=ae("preferences-update");t!==null&&t.addEventListener("submit",fD)}function fv(t,e){return t.replace(/[^\-.\w\s]/g,"").replace(/^[\s.]+|[\s.]+$/g,"").replace(/[-.\s]+/g,"-").toLowerCase().substring(0,e)}function hv(){let t=document.getElementById("id_slug"),e=document.getElementById("reslug");if(t===null||e===null)return;let n=t.getAttribute("slug-source"),i=document.getElementById(`id_${n}`);if(i===null){console.error("Unable to find field for slug field.");return}let o=t.getAttribute("maxlength"),s=50;o&&(s=Number(o)),i.addEventListener("blur",()=>{t.value=fv(i.value,s)}),e.addEventListener("click",()=>{t.value=fv(i.value,s)})}function hD(t){if(!t.currentTarget.checked)for(let n of R('input[type="checkbox"].toggle',"input#select-all"))n.checked=!1}function pD(t){let e=t.currentTarget,n=Ie(e,"table"),i=document.getElementById("select-all-box"),o=document.getElementById("select-all");if(n!==null){for(let s of n.querySelectorAll('input[type="checkbox"][name="pk"]'))e.checked?s.checked=!0:s.checked=!1;i!==null&&(e.checked?i.classList.remove("d-none"):(i.classList.add("d-none"),o!==null&&(o.checked=!1)))}}function mD(t){let e=t.currentTarget,n=ae("select-all-box");if(n!==null)for(let i of n.querySelectorAll('button[type="submit"]'))e.checked?i.disabled=!1:i.disabled=!0}function pv(){for(let e of R('table tr th > input[type="checkbox"].toggle'))e.addEventListener("change",pD);for(let e of R('input[type="checkbox"][name="pk"]'))e.addEventListener("change",hD);let t=ae("select-all");t!==null&&t.addEventListener("change",mD)}function mv(){for(let t of[ov,ev,hv,pv,dv,av,sv])t()}function gv(){let t=document.querySelectorAll("body > div#django-messages > div.django-message.toast");for(let e of t)e!==null&&new _t(e).show()}var bv=Le(vv());function yv(){for(let t of R("a.copy-token","button.copy-secret"))new bv.default(t)}var Po=Le(Ev());function _v(){(0,Po.default)(".date-picker",{allowInput:!0}),(0,Po.default)(".datetime-picker",{allowInput:!0,enableSeconds:!0,enableTime:!0,time_24hr:!0}),(0,Po.default)(".time-picker",{allowInput:!0,enableSeconds:!0,enableTime:!0,noCalendar:!0,time_24hr:!0})}function gD(){for(let t of R('select[name="columns"] option'))t.selected=!0}function vD(){for(let t of R('select[name="columns"]'))t.value=""}function bD(t){for(let e of R("#id_available_columns > option"))if(e.selected){for(let n of R("#id_columns"))n.appendChild(e.cloneNode(!0));e.remove()}t.preventDefault()}function yD(t){for(let e of R("#id_columns > option"))if(e.selected){for(let n of R("#id_available_columns"))n.appendChild(e.cloneNode(!0));e.remove()}t.preventDefault()}function ED(t,e){return Ne(this,null,function*(){return yield So(t,e)})}function _D(t){var c,d;t.preventDefault();let e=t.currentTarget,n=e.getAttribute("data-url");if(n==null){Sn("danger","Error Updating Table Configuration","No API path defined for configuration form.").show();return}let i=Qm(e),o=Object.assign({},...i.map(u=>({[u.name]:u.options}))),a=((d=(c=e.getAttribute("data-config-root"))==null?void 0:c.split("."))!=null?d:[]).reduceRight((u,l)=>({[l]:u}),o);ED(n,a).then(u=>{Wn(u)?Sn("danger","Error Updating Table Configuration",u.error).show():location.reload()})}function Sv(){for(let t of R("#save_tableconfig"))t.addEventListener("click",gD);for(let t of R("#reset_tableconfig"))t.addEventListener("click",vD);for(let t of R("#add_columns"))t.addEventListener("click",bD);for(let t of R("#remove_columns"))t.addEventListener("click",yD);for(let t of R("form.userconfigform"))t.addEventListener("submit",_D)}function wv(t){return typeof t=="string"&&["show","hide"].includes(t)}var No=class extends Error{constructor(e,n){super(e);Q(this,"table");this.table=n}},kl=class{constructor(e,n){Q(this,"button");Q(this,"enabledRows");Q(this,"disabledRows");this.button=e,this.enabledRows=n.querySelectorAll('tr[data-enabled="enabled"]'),this.disabledRows=n.querySelectorAll('tr[data-enabled="disabled"]')}get directive(){if(this.button.classList.contains("toggle-disabled"))return"disabled";if(this.button.classList.contains("toggle-enabled"))return"enabled";throw console.warn(this.button),new Error("Toggle button does not contain expected class")}toggleEnabledRows(){for(let e of this.enabledRows)e.classList.toggle("d-none")}toggleDisabledRows(){for(let e of this.disabledRows)e.classList.toggle("d-none")}set buttonState(e){wv(e)&&this.button.setAttribute("data-state",e)}get buttonState(){let e=this.button.getAttribute("data-state");return wv(e)?e:null}toggleButton(){this.buttonState==="show"?this.button.innerText=this.button.innerText.replaceAll("Show","Hide"):this.buttonState==="hide"&&(this.button.innerText=this.button.innerText.replaceAll("Hide","Show"))}toggleRows(){this.directive==="enabled"?this.toggleEnabledRows():this.directive==="disabled"&&this.toggleDisabledRows()}toggleState(){this.buttonState==="show"?this.buttonState="hide":this.buttonState==="hide"&&(this.buttonState="show")}toggle(){this.toggleState(),this.toggleButton(),this.toggleRows()}handleClick(e){e.currentTarget.isEqualNode(this.button)&&this.toggle()}},Tv=class{constructor(e){Q(this,"table");Q(this,"enabledButton");Q(this,"disabledButton");Q(this,"caption",null);this.table=e;try{let n=Ie(this.table,"button.toggle-enabled"),i=Ie(this.table,"button.toggle-disabled"),o=this.table.querySelector("caption");if(this.caption=o,n===null)throw new No("Table is missing a 'toggle-enabled' button.",e);if(i===null)throw new No("Table is missing a 'toggle-disabled' button.",e);n.addEventListener("click",s=>this.handleClick(s,this)),i.addEventListener("click",s=>this.handleClick(s,this)),this.enabledButton=new kl(n,this.table),this.disabledButton=new kl(i,this.table)}catch(n){if(n instanceof No){console.debug("Table does not contain enable/disable toggle buttons");return}else throw n}}get captionText(){return this.caption!==null?this.caption.innerText:""}set captionText(e){this.caption!==null&&(this.caption.innerText=e)}toggleCaption(){let e=this.enabledButton.buttonState==="show",n=this.disabledButton.buttonState==="show";e&&!n?this.captionText="Showing Enabled Interfaces":e&&n?this.captionText="Showing Enabled & Disabled Interfaces":!e&&n?this.captionText="Showing Disabled Interfaces":!e&&!n?this.captionText="Hiding Enabled & Disabled Interfaces":this.captionText=""}handleClick(e,n){let i=e.currentTarget,o=i.isEqualNode(n.enabledButton.button),s=i.isEqualNode(n.disabledButton.button);o?n.enabledButton.handleClick(e):s&&n.disabledButton.handleClick(e),n.toggleCaption()}};function xv(){for(let t of R("table"))new Tv(t)}var Ov=class{constructor(e){Q(this,"base");Q(this,"state");Q(this,"activeLink",null);Q(this,"sections",[]);this.base=e,this.state=new Io({pinned:!0},{persist:!0,key:"netbox-sidenav"}),this.init(),this.initSectionLinks(),this.initLinks()}bodyHas(e){return document.body.hasAttribute(`data-sidenav-${e}`)}bodyRemove(...e){for(let n of e)document.body.removeAttribute(`data-sidenav-${n}`)}bodyAdd(...e){for(let n of e)document.body.setAttribute(`data-sidenav-${n}`,"")}init(){for(let e of this.base.querySelectorAll(".sidenav-toggle"))e.addEventListener("click",n=>this.onToggle(n));for(let e of R(".sidenav-toggle-mobile"))e.addEventListener("click",n=>this.onMobileToggle(n));window.innerWidth>1200&&(this.state.get("pinned")&&this.pin(),this.state.get("pinned")||this.unpin(),window.addEventListener("resize",()=>this.onResize())),window.innerWidth<1200&&(this.bodyRemove("hide"),this.bodyAdd("hidden"),window.addEventListener("resize",()=>this.onResize())),this.base.addEventListener("mouseenter",()=>this.onEnter()),this.base.addEventListener("mouseleave",()=>this.onLeave())}initLinks(){for(let e of this.getActiveLinks())this.bodyHas("show")?this.activateLink(e,"expand"):this.bodyHas("hidden")&&this.activateLink(e,"collapse")}show(){this.bodyAdd("show"),this.bodyRemove("hidden","hide")}hide(){this.bodyAdd("hidden"),this.bodyRemove("pinned","show");for(let e of this.base.querySelectorAll(".collapse"))e.classList.remove("show")}pin(){this.bodyAdd("show","pinned"),this.bodyRemove("hidden"),this.state.set("pinned",!0)}unpin(){this.bodyRemove("pinned","show"),this.bodyAdd("hidden");for(let e of this.base.querySelectorAll(".collapse"))e.classList.remove("show");this.state.set("pinned",!1)}handleSectionClick(e){e.preventDefault();let n=e.target;this.activeLink=n,this.closeInactiveSections()}closeInactiveSections(){for(let[e,n]of this.sections)e!==this.activeLink&&(e.classList.add("collapsed"),e.setAttribute("aria-expanded","false"),n.hide())}initSectionLinks(){for(let e of R(".navbar-nav .nav-item .nav-link[data-bs-toggle]"))if(e.parentElement!==null){let n=e.parentElement.querySelector(".collapse");if(n!==null){let i=new Me(n,{toggle:!1});this.sections.push([e,i]),e.addEventListener("click",o=>this.handleSectionClick(o))}}}activateLink(e,n){var o;let i=e.closest(".collapse");if(bl(i)){let s=(o=i.parentElement)==null?void 0:o.querySelector(".nav-link");if(bl(s))switch(s.classList.add("active"),n){case"expand":s.setAttribute("aria-expanded","true"),i.classList.add("show"),e.classList.add("active");break;case"collapse":s.setAttribute("aria-expanded","false"),i.classList.remove("show"),e.classList.remove("active");break}}}*getActiveLinks(){for(let e of this.base.querySelectorAll(".navbar-nav .nav .nav-item a.nav-link")){let n=new RegExp(e.href,"gi");window.location.href.match(n)&&(yield e)}}onEnter(){if(!this.bodyHas("pinned")){this.bodyRemove("hide","hidden"),this.bodyAdd("show");for(let e of this.getActiveLinks())this.activateLink(e,"expand")}}onLeave(){if(!this.bodyHas("pinned")){this.bodyRemove("show"),this.bodyAdd("hide");for(let e of this.getActiveLinks())this.activateLink(e,"collapse");setTimeout(()=>{this.bodyRemove("hide"),this.bodyAdd("hidden")},300)}}onResize(){this.bodyHas("show")&&!this.bodyHas("pinned")&&(this.bodyRemove("show"),this.bodyAdd("hidden"))}onToggle(e){e.preventDefault(),this.state.get("pinned")?this.unpin():this.pin()}onMobileToggle(e){e.preventDefault(),this.bodyHas("hidden")?this.show():this.hide()}};function Av(){for(let t of R(".sidenav"))new Ov(t)}function Cv(t,e){let n=t?"Show Images":"Hide Images",i=t?"":"selected";e.setAttribute("selected",i),e.innerHTML=` ${n}`}function Lv(){var t,e;for(let n of R(".rack_elevation")){let i=(e=(t=n.contentDocument)==null?void 0:t.querySelectorAll("image.device-image"))!=null?e:[];for(let o of i)o.classList.remove("hidden")}}function Dv(){var t,e;for(let n of R(".rack_elevation")){let i=(e=(t=n.contentDocument)==null?void 0:t.querySelectorAll("image.device-image"))!=null?e:[];for(let o of i)o.classList.add("hidden")}}function SD(t,e){let n=e.get("hidden");e.set("hidden",!n);let i=e.get("hidden");i?Dv():Lv(),Cv(i,t)}function Mv(){let t=Ll.get("hidden");for(let e of R("button.toggle-images"))Cv(t,e),e.addEventListener("click",n=>{SD(n.currentTarget,Ll)},!1);for(let e of R(".rack_elevation"))e.addEventListener("load",()=>{t?Dv():t||Lv()})}function Iv(){for(let t of R("*[data-href]")){let e=t.getAttribute("data-href");ie(e)&&t.addEventListener("click",()=>{window.location.assign(e)})}}function kv(){for(let t of[mg,uv,gv,ag,vg,Zg,_v,mv,yv,Sv,xv,Av,Mv,Iv])t()}function wD(){let t=document.querySelector(".content-container");t!==null&&t.focus()}window.addEventListener("load",wD);document.readyState!=="loading"?kv():document.addEventListener("DOMContentLoaded",kv);})(); +`,"").trim(),document.head.appendChild(o)}}resetClasses(){let e=this.slim.slim;if(e)for(let n of this.base.classList)e.container.classList.remove(n)}initResetButton(){let e=Ve(this.base,"button[data-reset-select]");e!==null&&e.addEventListener("click",()=>{window.location.assign(window.location.origin+window.location.pathname)})}initRefreshButton(){if(this.allowRefresh){let e=Vn("button",{type:"button"},["btn","btn-sm","btn-ghost-dark"],[Vn("i",null,["mdi","mdi-reload"])]);e.addEventListener("click",()=>this.loadData()),e.type="button",this.slim.slim.search.container.appendChild(e)}}};function Ug(){for(let t of j(".netbox-api-select"))new Al(t)}function Kg(t){return typeof t.value=="string"&&t.value!==""}function Gg(t,e){if(t.slim.singleSelected!==null)if(Kg(e)){let n=`#${e.value}`,i=Vi(n);t.slim.singleSelected.container.style.backgroundColor=n,t.slim.singleSelected.container.style.color=i}else t.slim.singleSelected.container.removeAttribute("style")}function Xg(){for(let t of j("select.netbox-color-select")){for(let n of t.options)if(Kg(n)){let i=`#${n.value}`,o=Vi(i);n.style.backgroundColor=i,n.style.color=o}let e=new Un({select:t,allowDeselect:!0,deselectLabel:''});for(let n of e.data.data)if("selected"in n&&n.selected){Gg(e,n);break}for(let n of t.classList)e.slim.container.classList.remove(n);e.onChange=n=>Gg(e,n)}}function Qg(){for(let t of j(".netbox-static-select"))if(t!==null){let e=document.querySelector(`label[for="${t.id}"]`),n;e!==null&&(n=`Select ${e.innerText.trim()}`);let i=new Un({select:t,allowDeselect:!0,deselectLabel:'',placeholder:n});for(let o of t.classList)i.slim.container.classList.remove(o)}}function Jg(){for(let t of[Ug,Xg,Qg])t()}function QL(t){let e=t.getAttribute("data-url"),n=t.classList.contains("connected"),i=n?"planned":"connected";re(e)&&So(e,{status:i}).then(o=>{var s;if(Wn(o)){Sn("danger","Error",o.error).show();return}else{let a=(s=t.parentElement)==null?void 0:s.parentElement,c=t.querySelector("i.mdi, span.mdi");n?(a.classList.remove("success"),a.classList.add("info"),t.classList.remove("connected","btn-warning"),t.classList.add("btn-info"),t.title="Mark Installed",c.classList.remove("mdi-lan-disconnect"),c.classList.add("mdi-lan-connect")):(a.classList.remove("info"),a.classList.add("success"),t.classList.remove("btn-success"),t.classList.add("connected","btn-warning"),t.title="Mark Installed",c.classList.remove("mdi-lan-connect"),c.classList.add("mdi-lan-disconnect"))}})}function Zg(){for(let t of j("button.cable-toggle"))t.addEventListener("click",()=>QL(t))}var ev=class{set(e,n,i){return e[n]=i,!0}get(e,n){return e[n]}has(e,n){return n in e}},Io=class{constructor(e,n){Q(this,"handlers");Q(this,"proxy");Q(this,"options");Q(this,"key","");if(this.options=n,typeof this.options.key=="string"?this.key=this.options.key:this.key=this.generateStateKey(e),this.options.persist){let i=this.retrieve();i!==null&&(e=K(K({},e),i))}this.handlers=new ev,this.proxy=new Proxy(e,this.handlers),this.options.persist&&this.save()}generateStateKey(e){return`netbox-${window.btoa(Object.keys(e).join("---"))}`}get(e){return this.handlers.get(this.proxy,e)}set(e,n){this.handlers.set(this.proxy,e,n),this.options.persist&&this.save()}all(){return this.proxy}keys(){return Object.keys(this.proxy)}values(){return Object.values(this.proxy)}save(){let e=JSON.stringify(this.proxy);localStorage.setItem(this.key,e)}retrieve(){let e=localStorage.getItem(this.key);return e!==null?JSON.parse(e):null}};function ko(t,e={}){return new Io(t,e)}var Cl=ko({hidden:!1},{persist:!0,key:"netbox-object-depth"});var Ll=ko({hidden:!1},{persist:!0});function tv(t,e){e.setAttribute("data-depth-indicators",t?"hidden":"shown"),e.innerText=t?"Show Depth Indicators":"Hide Depth Indicators"}function nv(){for(let t of j(".record-depth"))t.style.display=""}function iv(){for(let t of j(".record-depth"))t.style.display="none"}function JL(t,e){let n=t.get("hidden");t.set("hidden",!n);let i=t.get("hidden");i?iv():nv(),tv(i,e)}function rv(){let t=Cl.get("hidden");for(let e of j("button.toggle-depth"))tv(t,e),e.addEventListener("click",n=>{JL(Cl,n.currentTarget)},!1);t?iv():t||nv()}function ZL(t){let e=Array.from(t.options);for(let n=1;n=0;n--){let i=e[n];if(i.selected){let o=t.options[n+1];i=t.removeChild(i),o=t.replaceChild(i,o),t.insertBefore(o,i)}}}function ov(){for(let t of j("#move-option-up")){let e=t.getAttribute("data-target");if(e!==null)for(let n of j(`#${e}`))t.addEventListener("click",()=>ZL(n))}for(let t of j("#move-option-down")){let e=t.getAttribute("data-target");if(e!==null)for(let n of j(`#${e}`))t.addEventListener("click",()=>eD(n))}}function tD(t){let e=t.currentTarget;e.form!==null&&e.form.submit()}function sv(){for(let t of j("select.per-page"))t.addEventListener("change",tD)}var Kn="netbox-color-mode",nD="Light Mode",iD="Dark Mode",av="mdi-lightbulb-on",lv="mdi-lightbulb";function rD(t){return t==="dark"||t==="light"}function oD(t){return localStorage.setItem(Kn,t)}function sD(t){var e,n;document.documentElement.setAttribute(`data-${Kn}`,t);for(let i of j("span.color-mode-text"))t==="light"?i.innerText=iD:t==="dark"&&(i.innerText=nD);for(let i of j("i.color-mode-icon","span.color-mode-icon"))t==="light"?(i.classList.remove(av),i.classList.add(lv)):t==="dark"&&(i.classList.remove(lv),i.classList.add(av));for(let i of j(".rack_elevation")){let o=(n=(e=i.contentDocument)==null?void 0:e.querySelector("svg"))!=null?n:null;o!==null&&o.setAttribute(`data-${Kn}`,t)}}function Ke(t){for(let e of[oD,sD])e(t)}function aD(){let t=localStorage.getItem(Kn);t==="light"?Ke("dark"):t==="dark"?Ke("light"):console.warn("Unable to determine the current color mode")}function lD(){let t=localStorage.getItem(Kn),e=document.documentElement.getAttribute(`data-${Kn}`);if(re(e)&&re(t))return Ke(t);let n="none";for(let i of["dark","light"])if(window.matchMedia(`(prefers-color-scheme: ${i})`).matches){n=i;break}if(re(t)&&!re(e)&&rD(t))return Ke(t);switch(n){case"dark":return Ke("dark");case"light":return Ke("light");case"none":return Ke("light");default:return Ke("light")}}function cD(){for(let t of j("button.color-mode-toggle"))t.addEventListener("click",aD)}function cv(){window.addEventListener("load",lD);for(let t of[cD])t()}function uD(t){let e=t.currentTarget,n=new FormData(e);n.get("ui.colormode")==="dark"?Ke("dark"):n.get("ui.colormode")==="light"&&Ke("light")}function uv(){let t=ae("preferences-update");t!==null&&t.addEventListener("submit",uD)}function dv(t,e){return t.replace(/[^\-.\w\s]/g,"").replace(/^[\s.]+|[\s.]+$/g,"").replace(/[-.\s]+/g,"-").toLowerCase().substring(0,e)}function fv(){let t=document.getElementById("id_slug"),e=document.getElementById("reslug");if(t===null||e===null)return;let n=t.getAttribute("slug-source"),i=document.getElementById(`id_${n}`);if(i===null){console.error("Unable to find field for slug field.");return}let o=t.getAttribute("maxlength"),s=50;o&&(s=Number(o)),i.addEventListener("blur",()=>{t.value=dv(i.value,s)}),e.addEventListener("click",()=>{t.value=dv(i.value,s)})}function dD(t){if(!t.currentTarget.checked)for(let n of j('input[type="checkbox"].toggle',"input#select-all"))n.checked=!1}function fD(t){let e=t.currentTarget,n=Ve(e,"table"),i=document.getElementById("select-all-box"),o=document.getElementById("select-all");if(n!==null){for(let s of n.querySelectorAll('input[type="checkbox"][name="pk"]'))e.checked?s.checked=!0:s.checked=!1;i!==null&&(e.checked?i.classList.remove("d-none"):(i.classList.add("d-none"),o!==null&&(o.checked=!1)))}}function hD(t){let e=t.currentTarget,n=ae("select-all-box");if(n!==null)for(let i of n.querySelectorAll('button[type="submit"]'))e.checked?i.disabled=!1:i.disabled=!0}function hv(){for(let e of j('table tr th > input[type="checkbox"].toggle'))e.addEventListener("change",fD);for(let e of j('input[type="checkbox"][name="pk"]'))e.addEventListener("change",dD);let t=ae("select-all");t!==null&&t.addEventListener("change",hD)}function pv(){for(let t of[rv,Zg,fv,hv,uv,sv,ov])t()}function mv(){let t=document.querySelectorAll("body > div#django-messages > div.django-message.toast");for(let e of t)e!==null&&new _t(e).show()}var vv=Le(gv());function bv(){for(let t of j("a.copy-token","button.copy-secret"))new vv.default(t)}var Po=Le(yv());function Ev(){(0,Po.default)(".date-picker",{allowInput:!0}),(0,Po.default)(".datetime-picker",{allowInput:!0,enableSeconds:!0,enableTime:!0,time_24hr:!0}),(0,Po.default)(".time-picker",{allowInput:!0,enableSeconds:!0,enableTime:!0,noCalendar:!0,time_24hr:!0})}function pD(){for(let t of j('select[name="columns"] option'))t.selected=!0}function mD(){for(let t of j('select[name="columns"]'))t.value=""}function gD(t){for(let e of j("#id_available_columns > option"))if(e.selected){for(let n of j("#id_columns"))n.appendChild(e.cloneNode(!0));e.remove()}t.preventDefault()}function vD(t){for(let e of j("#id_columns > option"))if(e.selected){for(let n of j("#id_available_columns"))n.appendChild(e.cloneNode(!0));e.remove()}t.preventDefault()}function bD(t,e){return Pe(this,null,function*(){return yield So(t,e)})}function yD(t){var c,d;t.preventDefault();let e=t.currentTarget,n=e.getAttribute("data-url");if(n==null){Sn("danger","Error Updating Table Configuration","No API path defined for configuration form.").show();return}let i=Qm(e),o=Object.assign({},...i.map(u=>({[u.name]:u.options}))),a=((d=(c=e.getAttribute("data-config-root"))==null?void 0:c.split("."))!=null?d:[]).reduceRight((u,l)=>({[l]:u}),o);bD(n,a).then(u=>{Wn(u)?Sn("danger","Error Updating Table Configuration",u.error).show():location.reload()})}function _v(){for(let t of j("#save_tableconfig"))t.addEventListener("click",pD);for(let t of j("#reset_tableconfig"))t.addEventListener("click",mD);for(let t of j("#add_columns"))t.addEventListener("click",gD);for(let t of j("#remove_columns"))t.addEventListener("click",vD);for(let t of j("form.userconfigform"))t.addEventListener("submit",yD)}function Sv(t){return typeof t=="string"&&["show","hide"].includes(t)}var No=class extends Error{constructor(e,n){super(e);Q(this,"table");this.table=n}},kl=class{constructor(e,n){Q(this,"button");Q(this,"enabledRows");Q(this,"disabledRows");this.button=e,this.enabledRows=n.querySelectorAll('tr[data-enabled="enabled"]'),this.disabledRows=n.querySelectorAll('tr[data-enabled="disabled"]')}get directive(){if(this.button.classList.contains("toggle-disabled"))return"disabled";if(this.button.classList.contains("toggle-enabled"))return"enabled";throw console.warn(this.button),new Error("Toggle button does not contain expected class")}toggleEnabledRows(){for(let e of this.enabledRows)e.classList.toggle("d-none")}toggleDisabledRows(){for(let e of this.disabledRows)e.classList.toggle("d-none")}set buttonState(e){Sv(e)&&this.button.setAttribute("data-state",e)}get buttonState(){let e=this.button.getAttribute("data-state");return Sv(e)?e:null}toggleButton(){this.buttonState==="show"?this.button.innerText=this.button.innerText.replaceAll("Show","Hide"):this.buttonState==="hide"&&(this.button.innerText=this.button.innerText.replaceAll("Hide","Show"))}toggleRows(){this.directive==="enabled"?this.toggleEnabledRows():this.directive==="disabled"&&this.toggleDisabledRows()}toggleState(){this.buttonState==="show"?this.buttonState="hide":this.buttonState==="hide"&&(this.buttonState="show")}toggle(){this.toggleState(),this.toggleButton(),this.toggleRows()}handleClick(e){e.currentTarget.isEqualNode(this.button)&&this.toggle()}},wv=class{constructor(e){Q(this,"table");Q(this,"enabledButton");Q(this,"disabledButton");Q(this,"caption",null);this.table=e;try{let n=Ve(this.table,"button.toggle-enabled"),i=Ve(this.table,"button.toggle-disabled"),o=this.table.querySelector("caption");if(this.caption=o,n===null)throw new No("Table is missing a 'toggle-enabled' button.",e);if(i===null)throw new No("Table is missing a 'toggle-disabled' button.",e);n.addEventListener("click",s=>this.handleClick(s,this)),i.addEventListener("click",s=>this.handleClick(s,this)),this.enabledButton=new kl(n,this.table),this.disabledButton=new kl(i,this.table)}catch(n){if(n instanceof No){console.debug("Table does not contain enable/disable toggle buttons");return}else throw n}}get captionText(){return this.caption!==null?this.caption.innerText:""}set captionText(e){this.caption!==null&&(this.caption.innerText=e)}toggleCaption(){let e=this.enabledButton.buttonState==="show",n=this.disabledButton.buttonState==="show";e&&!n?this.captionText="Showing Enabled Interfaces":e&&n?this.captionText="Showing Enabled & Disabled Interfaces":!e&&n?this.captionText="Showing Disabled Interfaces":!e&&!n?this.captionText="Hiding Enabled & Disabled Interfaces":this.captionText=""}handleClick(e,n){let i=e.currentTarget,o=i.isEqualNode(n.enabledButton.button),s=i.isEqualNode(n.disabledButton.button);o?n.enabledButton.handleClick(e):s&&n.disabledButton.handleClick(e),n.toggleCaption()}};function Tv(){for(let t of j("table"))new wv(t)}var xv=class{constructor(e){Q(this,"base");Q(this,"state");Q(this,"activeLink",null);Q(this,"sections",[]);this.base=e,this.state=new Io({pinned:!0},{persist:!0,key:"netbox-sidenav"}),this.init(),this.initSectionLinks(),this.initLinks()}bodyHas(e){return document.body.hasAttribute(`data-sidenav-${e}`)}bodyRemove(...e){for(let n of e)document.body.removeAttribute(`data-sidenav-${n}`)}bodyAdd(...e){for(let n of e)document.body.setAttribute(`data-sidenav-${n}`,"")}init(){for(let e of this.base.querySelectorAll(".sidenav-toggle"))e.addEventListener("click",n=>this.onToggle(n));for(let e of j(".sidenav-toggle-mobile"))e.addEventListener("click",n=>this.onMobileToggle(n));window.innerWidth>1200&&(this.state.get("pinned")&&this.pin(),this.state.get("pinned")||this.unpin(),window.addEventListener("resize",()=>this.onResize())),window.innerWidth<1200&&(this.bodyRemove("hide"),this.bodyAdd("hidden"),window.addEventListener("resize",()=>this.onResize())),this.base.addEventListener("mouseenter",()=>this.onEnter()),this.base.addEventListener("mouseleave",()=>this.onLeave())}initLinks(){for(let e of this.getActiveLinks())this.bodyHas("show")?this.activateLink(e,"expand"):this.bodyHas("hidden")&&this.activateLink(e,"collapse")}show(){this.bodyAdd("show"),this.bodyRemove("hidden","hide")}hide(){this.bodyAdd("hidden"),this.bodyRemove("pinned","show");for(let e of this.base.querySelectorAll(".collapse"))e.classList.remove("show")}pin(){this.bodyAdd("show","pinned"),this.bodyRemove("hidden"),this.state.set("pinned",!0)}unpin(){this.bodyRemove("pinned","show"),this.bodyAdd("hidden");for(let e of this.base.querySelectorAll(".collapse"))e.classList.remove("show");this.state.set("pinned",!1)}handleSectionClick(e){e.preventDefault();let n=e.target;this.activeLink=n,this.closeInactiveSections()}closeInactiveSections(){for(let[e,n]of this.sections)e!==this.activeLink&&(e.classList.add("collapsed"),e.setAttribute("aria-expanded","false"),n.hide())}initSectionLinks(){for(let e of j(".navbar-nav .nav-item .nav-link[data-bs-toggle]"))if(e.parentElement!==null){let n=e.parentElement.querySelector(".collapse");if(n!==null){let i=new Me(n,{toggle:!1});this.sections.push([e,i]),e.addEventListener("click",o=>this.handleSectionClick(o))}}}activateLink(e,n){var o;let i=e.closest(".collapse");if(bl(i)){let s=(o=i.parentElement)==null?void 0:o.querySelector(".nav-link");if(bl(s))switch(s.classList.add("active"),n){case"expand":s.setAttribute("aria-expanded","true"),i.classList.add("show"),e.classList.add("active");break;case"collapse":s.setAttribute("aria-expanded","false"),i.classList.remove("show"),e.classList.remove("active");break}}}*getActiveLinks(){for(let e of this.base.querySelectorAll(".navbar-nav .nav .nav-item a.nav-link")){let n=new RegExp(e.href,"gi");window.location.href.match(n)&&(yield e)}}onEnter(){if(!this.bodyHas("pinned")){this.bodyRemove("hide","hidden"),this.bodyAdd("show");for(let e of this.getActiveLinks())this.activateLink(e,"expand")}}onLeave(){if(!this.bodyHas("pinned")){this.bodyRemove("show"),this.bodyAdd("hide");for(let e of this.getActiveLinks())this.activateLink(e,"collapse");setTimeout(()=>{this.bodyRemove("hide"),this.bodyAdd("hidden")},300)}}onResize(){this.bodyHas("show")&&!this.bodyHas("pinned")&&(this.bodyRemove("show"),this.bodyAdd("hidden"))}onToggle(e){e.preventDefault(),this.state.get("pinned")?this.unpin():this.pin()}onMobileToggle(e){e.preventDefault(),this.bodyHas("hidden")?this.show():this.hide()}};function Ov(){for(let t of j(".sidenav"))new xv(t)}function Av(t,e){let n=t?"Show Images":"Hide Images",i=t?"":"selected";e.setAttribute("selected",i),e.innerHTML=` ${n}`}function Cv(){var t,e;for(let n of j(".rack_elevation")){let i=(e=(t=n.contentDocument)==null?void 0:t.querySelectorAll("image.device-image"))!=null?e:[];for(let o of i)o.classList.remove("hidden")}}function Lv(){var t,e;for(let n of j(".rack_elevation")){let i=(e=(t=n.contentDocument)==null?void 0:t.querySelectorAll("image.device-image"))!=null?e:[];for(let o of i)o.classList.add("hidden")}}function ED(t,e){let n=e.get("hidden");e.set("hidden",!n);let i=e.get("hidden");i?Lv():Cv(),Av(i,t)}function Dv(){let t=Ll.get("hidden");for(let e of j("button.toggle-images"))Av(t,e),e.addEventListener("click",n=>{ED(n.currentTarget,Ll)},!1);for(let e of j(".rack_elevation"))e.addEventListener("load",()=>{t?Lv():t||Cv()})}function Mv(){for(let t of j("*[data-href]")){let e=t.getAttribute("data-href");re(e)&&t.addEventListener("click",()=>{window.location.assign(e)})}}function Iv(){for(let t of[pg,cv,mv,sg,gg,Jg,Ev,pv,bv,_v,Tv,Ov,Dv,Mv])t()}function _D(){let t=document.querySelector(".content-container");t!==null&&t.focus()}window.addEventListener("load",_D);document.readyState!=="loading"?Iv():document.addEventListener("DOMContentLoaded",Iv);})(); /* flatpickr v4.6.3, @license MIT */ /*! * Bootstrap v5.0.2 (https://getbootstrap.com/) diff --git a/netbox/project-static/dist/netbox.js.map b/netbox/project-static/dist/netbox.js.map index 0faacc7df1d..aadc192730c 100644 --- a/netbox/project-static/dist/netbox.js.map +++ b/netbox/project-static/dist/netbox.js.map @@ -1,6 +1,6 @@ { "version": 3, - "sources": ["../node_modules/core-js/internals/global.js", "../node_modules/core-js/internals/fails.js", "../node_modules/core-js/internals/descriptors.js", "../node_modules/core-js/internals/object-property-is-enumerable.js", "../node_modules/core-js/internals/create-property-descriptor.js", "../node_modules/core-js/internals/classof-raw.js", "../node_modules/core-js/internals/indexed-object.js", "../node_modules/core-js/internals/require-object-coercible.js", "../node_modules/core-js/internals/to-indexed-object.js", "../node_modules/core-js/internals/is-object.js", "../node_modules/core-js/internals/get-built-in.js", "../node_modules/core-js/internals/engine-user-agent.js", "../node_modules/core-js/internals/engine-v8-version.js", "../node_modules/core-js/internals/native-symbol.js", "../node_modules/core-js/internals/use-symbol-as-uid.js", "../node_modules/core-js/internals/is-symbol.js", "../node_modules/core-js/internals/ordinary-to-primitive.js", "../node_modules/core-js/internals/is-pure.js", "../node_modules/core-js/internals/set-global.js", "../node_modules/core-js/internals/shared-store.js", "../node_modules/core-js/internals/shared.js", "../node_modules/core-js/internals/to-object.js", "../node_modules/core-js/internals/has.js", "../node_modules/core-js/internals/uid.js", "../node_modules/core-js/internals/well-known-symbol.js", "../node_modules/core-js/internals/to-primitive.js", "../node_modules/core-js/internals/to-property-key.js", "../node_modules/core-js/internals/document-create-element.js", "../node_modules/core-js/internals/ie8-dom-define.js", "../node_modules/core-js/internals/object-get-own-property-descriptor.js", "../node_modules/core-js/internals/an-object.js", "../node_modules/core-js/internals/object-define-property.js", "../node_modules/core-js/internals/create-non-enumerable-property.js", "../node_modules/core-js/internals/inspect-source.js", "../node_modules/core-js/internals/native-weak-map.js", "../node_modules/core-js/internals/shared-key.js", "../node_modules/core-js/internals/hidden-keys.js", "../node_modules/core-js/internals/internal-state.js", "../node_modules/core-js/internals/redefine.js", "../node_modules/core-js/internals/to-integer.js", "../node_modules/core-js/internals/to-length.js", "../node_modules/core-js/internals/to-absolute-index.js", "../node_modules/core-js/internals/array-includes.js", "../node_modules/core-js/internals/object-keys-internal.js", "../node_modules/core-js/internals/enum-bug-keys.js", "../node_modules/core-js/internals/object-get-own-property-names.js", "../node_modules/core-js/internals/object-get-own-property-symbols.js", "../node_modules/core-js/internals/own-keys.js", "../node_modules/core-js/internals/copy-constructor-properties.js", "../node_modules/core-js/internals/is-forced.js", "../node_modules/core-js/internals/export.js", "../node_modules/core-js/internals/a-function.js", "../node_modules/core-js/internals/function-bind-context.js", "../node_modules/core-js/internals/is-array.js", "../node_modules/core-js/internals/array-species-constructor.js", "../node_modules/core-js/internals/array-species-create.js", "../node_modules/core-js/internals/array-iteration.js", "../node_modules/core-js/internals/array-method-is-strict.js", "../node_modules/core-js/internals/array-for-each.js", "../node_modules/core-js/internals/dom-iterables.js", "../node_modules/can-use-dom/index.js", "../node_modules/core-js/internals/array-method-has-species-support.js", "../node_modules/core-js/internals/object-keys.js", "../node_modules/core-js/internals/object-define-properties.js", "../node_modules/core-js/internals/html.js", "../node_modules/core-js/internals/object-create.js", "../node_modules/core-js/internals/add-to-unscopables.js", "../node_modules/core-js/internals/iterators.js", "../node_modules/core-js/internals/correct-prototype-getter.js", "../node_modules/core-js/internals/object-get-prototype-of.js", "../node_modules/core-js/internals/iterators-core.js", "../node_modules/core-js/internals/set-to-string-tag.js", "../node_modules/core-js/internals/create-iterator-constructor.js", "../node_modules/core-js/internals/a-possible-prototype.js", "../node_modules/core-js/internals/object-set-prototype-of.js", "../node_modules/core-js/internals/define-iterator.js", "../node_modules/core-js/modules/es.array.iterator.js", "../node_modules/core-js/internals/object-assign.js", "../node_modules/core-js/internals/to-string-tag-support.js", "../node_modules/core-js/internals/classof.js", "../node_modules/core-js/internals/object-to-string.js", "../node_modules/core-js/internals/to-string.js", "../node_modules/core-js/internals/whitespaces.js", "../node_modules/core-js/internals/string-trim.js", "../node_modules/core-js/internals/number-parse-int.js", "../node_modules/core-js/internals/string-multibyte.js", "../node_modules/core-js/internals/redefine-all.js", "../node_modules/core-js/internals/object-get-own-property-names-external.js", "../node_modules/core-js/internals/freezing.js", "../node_modules/core-js/internals/internal-metadata.js", "../node_modules/core-js/internals/is-array-iterator-method.js", "../node_modules/core-js/internals/get-iterator-method.js", "../node_modules/core-js/internals/get-iterator.js", "../node_modules/core-js/internals/iterator-close.js", "../node_modules/core-js/internals/iterate.js", "../node_modules/core-js/internals/an-instance.js", "../node_modules/core-js/internals/check-correctness-of-iteration.js", "../node_modules/core-js/internals/inherit-if-required.js", "../node_modules/core-js/internals/collection.js", "../node_modules/core-js/internals/collection-weak.js", "../node_modules/core-js/modules/es.weak-map.js", "../node_modules/lodash.throttle/index.js", "../node_modules/lodash.debounce/index.js", "../node_modules/lodash.memoize/index.js", "../node_modules/core-js/internals/array-reduce.js", "../node_modules/core-js/internals/engine-is-node.js", "../node_modules/core-js/internals/regexp-flags.js", "../node_modules/core-js/internals/regexp-sticky-helpers.js", "../node_modules/core-js/internals/regexp-unsupported-dot-all.js", "../node_modules/core-js/internals/regexp-unsupported-ncg.js", "../node_modules/core-js/internals/regexp-exec.js", "../node_modules/core-js/modules/es.regexp.exec.js", "../node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js", "../node_modules/core-js/internals/advance-string-index.js", "../node_modules/core-js/internals/regexp-exec-abstract.js", "../node_modules/core-js/internals/get-substitution.js", "../node_modules/cookie/index.js", "../node_modules/ev-emitter/ev-emitter.js", "../node_modules/get-size/get-size.js", "../node_modules/desandro-matches-selector/matches-selector.js", "../node_modules/fizzy-ui-utils/utils.js", "../node_modules/outlayer/item.js", "../node_modules/outlayer/outlayer.js", "../node_modules/masonry-layout/masonry.js", "../node_modules/just-debounce-it/index.js", "../node_modules/strict-uri-encode/index.js", "../node_modules/decode-uri-component/index.js", "../node_modules/split-on-first/index.js", "../node_modules/filter-obj/index.js", "../node_modules/query-string/index.js", "../node_modules/clipboard/dist/clipboard.js", "../node_modules/flatpickr/dist/flatpickr.js", "../node_modules/@popperjs/core/lib/index.js", "../node_modules/@popperjs/core/lib/enums.js", "../node_modules/@popperjs/core/lib/dom-utils/getNodeName.js", "../node_modules/@popperjs/core/lib/dom-utils/getWindow.js", "../node_modules/@popperjs/core/lib/dom-utils/instanceOf.js", "../node_modules/@popperjs/core/lib/modifiers/applyStyles.js", "../node_modules/@popperjs/core/lib/utils/getBasePlacement.js", "../node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js", "../node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js", "../node_modules/@popperjs/core/lib/dom-utils/contains.js", "../node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js", "../node_modules/@popperjs/core/lib/dom-utils/isTableElement.js", "../node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js", "../node_modules/@popperjs/core/lib/dom-utils/getParentNode.js", "../node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js", "../node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js", "../node_modules/@popperjs/core/lib/utils/math.js", "../node_modules/@popperjs/core/lib/utils/within.js", "../node_modules/@popperjs/core/lib/utils/getFreshSideObject.js", "../node_modules/@popperjs/core/lib/utils/mergePaddingObject.js", "../node_modules/@popperjs/core/lib/utils/expandToHashMap.js", "../node_modules/@popperjs/core/lib/modifiers/arrow.js", "../node_modules/@popperjs/core/lib/modifiers/computeStyles.js", "../node_modules/@popperjs/core/lib/modifiers/eventListeners.js", "../node_modules/@popperjs/core/lib/utils/getOppositePlacement.js", "../node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js", "../node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js", "../node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js", "../node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js", "../node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js", "../node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js", "../node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js", "../node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js", "../node_modules/@popperjs/core/lib/utils/rectToClientRect.js", "../node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js", "../node_modules/@popperjs/core/lib/utils/getVariation.js", "../node_modules/@popperjs/core/lib/utils/computeOffsets.js", "../node_modules/@popperjs/core/lib/utils/detectOverflow.js", "../node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js", "../node_modules/@popperjs/core/lib/modifiers/flip.js", "../node_modules/@popperjs/core/lib/modifiers/hide.js", "../node_modules/@popperjs/core/lib/modifiers/offset.js", "../node_modules/@popperjs/core/lib/modifiers/popperOffsets.js", "../node_modules/@popperjs/core/lib/utils/getAltAxis.js", "../node_modules/@popperjs/core/lib/modifiers/preventOverflow.js", "../node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js", "../node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js", "../node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js", "../node_modules/@popperjs/core/lib/utils/orderModifiers.js", "../node_modules/@popperjs/core/lib/utils/debounce.js", "../node_modules/@popperjs/core/lib/utils/mergeByName.js", "../node_modules/@popperjs/core/lib/createPopper.js", "../node_modules/@popperjs/core/lib/popper-lite.js", "../node_modules/@popperjs/core/lib/popper.js", "../node_modules/bootstrap/js/src/dom/selector-engine.js", "../node_modules/bootstrap/js/src/util/index.js", "../node_modules/bootstrap/js/src/dom/event-handler.js", "../node_modules/bootstrap/js/src/dom/data.js", "../node_modules/bootstrap/js/src/base-component.js", "../node_modules/bootstrap/js/src/alert.js", "../node_modules/bootstrap/js/src/button.js", "../node_modules/bootstrap/js/src/dom/manipulator.js", "../node_modules/bootstrap/js/src/carousel.js", "../node_modules/bootstrap/js/src/collapse.js", "../node_modules/bootstrap/js/src/dropdown.js", "../node_modules/bootstrap/js/src/util/scrollbar.js", "../node_modules/bootstrap/js/src/util/backdrop.js", "../node_modules/bootstrap/js/src/modal.js", "../node_modules/bootstrap/js/src/offcanvas.js", "../node_modules/bootstrap/js/src/util/sanitizer.js", "../node_modules/bootstrap/js/src/tooltip.js", "../node_modules/bootstrap/js/src/popover.js", "../node_modules/bootstrap/js/src/scrollspy.js", "../node_modules/bootstrap/js/src/tab.js", "../node_modules/bootstrap/js/src/toast.js", "../node_modules/core-js/modules/es.array.for-each.js", "../node_modules/core-js/modules/web.dom-collections.for-each.js", "../node_modules/core-js/modules/es.array.filter.js", "../node_modules/core-js/modules/es.object.assign.js", "../node_modules/core-js/modules/es.object.to-string.js", "../node_modules/core-js/modules/es.parse-int.js", "../node_modules/core-js/modules/es.string.iterator.js", "../node_modules/core-js/modules/web.dom-collections.iterator.js", "../node_modules/@juggle/resize-observer/lib/utils/resizeObservers.js", "../node_modules/@juggle/resize-observer/lib/algorithms/hasActiveObservations.js", "../node_modules/@juggle/resize-observer/lib/algorithms/hasSkippedObservations.js", "../node_modules/@juggle/resize-observer/lib/algorithms/deliverResizeLoopError.js", "../node_modules/@juggle/resize-observer/lib/ResizeObserverBoxOptions.js", "../node_modules/@juggle/resize-observer/lib/utils/freeze.js", "../node_modules/@juggle/resize-observer/lib/ResizeObserverSize.js", "../node_modules/@juggle/resize-observer/lib/DOMRectReadOnly.js", "../node_modules/@juggle/resize-observer/lib/utils/element.js", "../node_modules/@juggle/resize-observer/lib/utils/global.js", "../node_modules/@juggle/resize-observer/lib/algorithms/calculateBoxSize.js", "../node_modules/@juggle/resize-observer/lib/ResizeObserverEntry.js", "../node_modules/@juggle/resize-observer/lib/algorithms/calculateDepthForNode.js", "../node_modules/@juggle/resize-observer/lib/algorithms/broadcastActiveObservations.js", "../node_modules/@juggle/resize-observer/lib/algorithms/gatherActiveObservationsAtDepth.js", "../node_modules/@juggle/resize-observer/lib/utils/process.js", "../node_modules/@juggle/resize-observer/lib/utils/queueMicroTask.js", "../node_modules/@juggle/resize-observer/lib/utils/queueResizeObserver.js", "../node_modules/@juggle/resize-observer/lib/utils/scheduler.js", "../node_modules/@juggle/resize-observer/lib/ResizeObservation.js", "../node_modules/@juggle/resize-observer/lib/ResizeObserverDetail.js", "../node_modules/@juggle/resize-observer/lib/ResizeObserverController.js", "../node_modules/@juggle/resize-observer/lib/ResizeObserver.js", "../node_modules/core-js/modules/es.array.reduce.js", "../node_modules/core-js/modules/es.function.name.js", "../node_modules/core-js/modules/es.string.match.js", "../node_modules/core-js/modules/es.string.replace.js", "../node_modules/simplebar/src/helpers.js", "../node_modules/simplebar/src/scrollbar-width.js", "../node_modules/simplebar/src/simplebar.js", "../node_modules/simplebar/src/index.js", "../src/util.ts", "../src/forms/actions.ts", "../src/forms/elements.ts", "../src/forms/speedSelector.ts", "../src/forms/scopeSelector.ts", "../src/forms/vlanTags.ts", "../src/forms/index.ts", "../src/bs.ts", "../src/search.ts", "../node_modules/color2k/src/guard.ts", "../node_modules/color2k/src/ColorError.ts", "../node_modules/color2k/src/parseToRgba.ts", "../node_modules/color2k/src/parseToHsla.ts", "../node_modules/color2k/src/hsla.ts", "../node_modules/color2k/src/adjustHue.ts", "../node_modules/color2k/src/darken.ts", "../node_modules/color2k/src/desaturate.ts", "../node_modules/color2k/src/getLuminance.ts", "../node_modules/color2k/src/getContrast.ts", "../node_modules/color2k/src/rgba.ts", "../node_modules/color2k/src/mix.ts", "../node_modules/color2k/src/getScale.ts", "../node_modules/color2k/src/hasBadContrast.ts", "../node_modules/color2k/src/lighten.ts", "../node_modules/color2k/src/transparentize.ts", "../node_modules/color2k/src/opacify.ts", "../node_modules/color2k/src/readableColorIsBlack.ts", "../node_modules/color2k/src/readableColor.ts", "../node_modules/color2k/src/saturate.ts", "../node_modules/color2k/src/toHex.ts", "../node_modules/color2k/src/toRgba.ts", "../node_modules/color2k/src/toHsla.ts", "../src/select/api/apiSelect.ts", "../node_modules/slim-select/dist/slimselect.min.mjs", "../src/select/util.ts", "../src/select/api/types.ts", "../src/select/api/dynamicParams.ts", "../src/select/api/index.ts", "../src/select/color.ts", "../src/select/static.ts", "../src/select/index.ts", "../src/buttons/connectionToggle.ts", "../src/state/index.ts", "../src/stores/objectDepth.ts", "../src/stores/rackImages.ts", "../src/buttons/depthToggle.ts", "../src/buttons/moveOptions.ts", "../src/buttons/pagination.ts", "../src/colorMode.ts", "../src/buttons/preferences.ts", "../src/buttons/reslug.ts", "../src/buttons/selectAll.ts", "../src/buttons/index.ts", "../src/messages.ts", "../src/clipboard.ts", "../src/dateSelector.ts", "../src/tableConfig.ts", "../src/tables/interfaceTable.ts", "../src/sidenav.ts", "../src/racks.ts", "../src/links.ts", "../src/netbox.ts"], - "mappings": "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", + "sources": ["../node_modules/core-js/internals/global.js", "../node_modules/core-js/internals/fails.js", "../node_modules/core-js/internals/descriptors.js", "../node_modules/core-js/internals/object-property-is-enumerable.js", "../node_modules/core-js/internals/create-property-descriptor.js", "../node_modules/core-js/internals/classof-raw.js", "../node_modules/core-js/internals/indexed-object.js", "../node_modules/core-js/internals/require-object-coercible.js", "../node_modules/core-js/internals/to-indexed-object.js", "../node_modules/core-js/internals/is-object.js", "../node_modules/core-js/internals/get-built-in.js", "../node_modules/core-js/internals/engine-user-agent.js", "../node_modules/core-js/internals/engine-v8-version.js", "../node_modules/core-js/internals/native-symbol.js", "../node_modules/core-js/internals/use-symbol-as-uid.js", "../node_modules/core-js/internals/is-symbol.js", "../node_modules/core-js/internals/ordinary-to-primitive.js", "../node_modules/core-js/internals/is-pure.js", "../node_modules/core-js/internals/set-global.js", "../node_modules/core-js/internals/shared-store.js", "../node_modules/core-js/internals/shared.js", "../node_modules/core-js/internals/to-object.js", "../node_modules/core-js/internals/has.js", "../node_modules/core-js/internals/uid.js", "../node_modules/core-js/internals/well-known-symbol.js", "../node_modules/core-js/internals/to-primitive.js", "../node_modules/core-js/internals/to-property-key.js", "../node_modules/core-js/internals/document-create-element.js", "../node_modules/core-js/internals/ie8-dom-define.js", "../node_modules/core-js/internals/object-get-own-property-descriptor.js", "../node_modules/core-js/internals/an-object.js", "../node_modules/core-js/internals/object-define-property.js", "../node_modules/core-js/internals/create-non-enumerable-property.js", "../node_modules/core-js/internals/inspect-source.js", "../node_modules/core-js/internals/native-weak-map.js", "../node_modules/core-js/internals/shared-key.js", "../node_modules/core-js/internals/hidden-keys.js", "../node_modules/core-js/internals/internal-state.js", "../node_modules/core-js/internals/redefine.js", "../node_modules/core-js/internals/to-integer.js", "../node_modules/core-js/internals/to-length.js", "../node_modules/core-js/internals/to-absolute-index.js", "../node_modules/core-js/internals/array-includes.js", "../node_modules/core-js/internals/object-keys-internal.js", "../node_modules/core-js/internals/enum-bug-keys.js", "../node_modules/core-js/internals/object-get-own-property-names.js", "../node_modules/core-js/internals/object-get-own-property-symbols.js", "../node_modules/core-js/internals/own-keys.js", "../node_modules/core-js/internals/copy-constructor-properties.js", "../node_modules/core-js/internals/is-forced.js", "../node_modules/core-js/internals/export.js", "../node_modules/core-js/internals/a-function.js", "../node_modules/core-js/internals/function-bind-context.js", "../node_modules/core-js/internals/is-array.js", "../node_modules/core-js/internals/array-species-constructor.js", "../node_modules/core-js/internals/array-species-create.js", "../node_modules/core-js/internals/array-iteration.js", "../node_modules/core-js/internals/array-method-is-strict.js", "../node_modules/core-js/internals/array-for-each.js", "../node_modules/core-js/internals/dom-iterables.js", "../node_modules/can-use-dom/index.js", "../node_modules/core-js/internals/array-method-has-species-support.js", "../node_modules/core-js/internals/object-keys.js", "../node_modules/core-js/internals/object-define-properties.js", "../node_modules/core-js/internals/html.js", "../node_modules/core-js/internals/object-create.js", "../node_modules/core-js/internals/add-to-unscopables.js", "../node_modules/core-js/internals/iterators.js", "../node_modules/core-js/internals/correct-prototype-getter.js", "../node_modules/core-js/internals/object-get-prototype-of.js", "../node_modules/core-js/internals/iterators-core.js", "../node_modules/core-js/internals/set-to-string-tag.js", "../node_modules/core-js/internals/create-iterator-constructor.js", "../node_modules/core-js/internals/a-possible-prototype.js", "../node_modules/core-js/internals/object-set-prototype-of.js", "../node_modules/core-js/internals/define-iterator.js", "../node_modules/core-js/modules/es.array.iterator.js", "../node_modules/core-js/internals/object-assign.js", "../node_modules/core-js/internals/to-string-tag-support.js", "../node_modules/core-js/internals/classof.js", "../node_modules/core-js/internals/object-to-string.js", "../node_modules/core-js/internals/to-string.js", "../node_modules/core-js/internals/whitespaces.js", "../node_modules/core-js/internals/string-trim.js", "../node_modules/core-js/internals/number-parse-int.js", "../node_modules/core-js/internals/string-multibyte.js", "../node_modules/core-js/internals/redefine-all.js", "../node_modules/core-js/internals/object-get-own-property-names-external.js", "../node_modules/core-js/internals/freezing.js", "../node_modules/core-js/internals/internal-metadata.js", "../node_modules/core-js/internals/is-array-iterator-method.js", "../node_modules/core-js/internals/get-iterator-method.js", "../node_modules/core-js/internals/get-iterator.js", "../node_modules/core-js/internals/iterator-close.js", "../node_modules/core-js/internals/iterate.js", "../node_modules/core-js/internals/an-instance.js", "../node_modules/core-js/internals/check-correctness-of-iteration.js", "../node_modules/core-js/internals/inherit-if-required.js", "../node_modules/core-js/internals/collection.js", "../node_modules/core-js/internals/collection-weak.js", "../node_modules/core-js/modules/es.weak-map.js", "../node_modules/lodash.throttle/index.js", "../node_modules/lodash.debounce/index.js", "../node_modules/lodash.memoize/index.js", "../node_modules/core-js/internals/array-reduce.js", "../node_modules/core-js/internals/engine-is-node.js", "../node_modules/core-js/internals/regexp-flags.js", "../node_modules/core-js/internals/regexp-sticky-helpers.js", "../node_modules/core-js/internals/regexp-unsupported-dot-all.js", "../node_modules/core-js/internals/regexp-unsupported-ncg.js", "../node_modules/core-js/internals/regexp-exec.js", "../node_modules/core-js/modules/es.regexp.exec.js", "../node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js", "../node_modules/core-js/internals/advance-string-index.js", "../node_modules/core-js/internals/regexp-exec-abstract.js", "../node_modules/core-js/internals/get-substitution.js", "../node_modules/cookie/index.js", "../node_modules/ev-emitter/ev-emitter.js", "../node_modules/get-size/get-size.js", "../node_modules/desandro-matches-selector/matches-selector.js", "../node_modules/fizzy-ui-utils/utils.js", "../node_modules/outlayer/item.js", "../node_modules/outlayer/outlayer.js", "../node_modules/masonry-layout/masonry.js", "../node_modules/just-debounce-it/index.js", "../node_modules/strict-uri-encode/index.js", "../node_modules/decode-uri-component/index.js", "../node_modules/split-on-first/index.js", "../node_modules/filter-obj/index.js", "../node_modules/query-string/index.js", "../node_modules/clipboard/dist/clipboard.js", "../node_modules/flatpickr/dist/flatpickr.js", "../node_modules/@popperjs/core/lib/index.js", "../node_modules/@popperjs/core/lib/enums.js", "../node_modules/@popperjs/core/lib/dom-utils/getNodeName.js", "../node_modules/@popperjs/core/lib/dom-utils/getWindow.js", "../node_modules/@popperjs/core/lib/dom-utils/instanceOf.js", "../node_modules/@popperjs/core/lib/modifiers/applyStyles.js", "../node_modules/@popperjs/core/lib/utils/getBasePlacement.js", "../node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js", "../node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js", "../node_modules/@popperjs/core/lib/dom-utils/contains.js", "../node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js", "../node_modules/@popperjs/core/lib/dom-utils/isTableElement.js", "../node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js", "../node_modules/@popperjs/core/lib/dom-utils/getParentNode.js", "../node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js", "../node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js", "../node_modules/@popperjs/core/lib/utils/math.js", "../node_modules/@popperjs/core/lib/utils/within.js", "../node_modules/@popperjs/core/lib/utils/getFreshSideObject.js", "../node_modules/@popperjs/core/lib/utils/mergePaddingObject.js", "../node_modules/@popperjs/core/lib/utils/expandToHashMap.js", "../node_modules/@popperjs/core/lib/modifiers/arrow.js", "../node_modules/@popperjs/core/lib/modifiers/computeStyles.js", "../node_modules/@popperjs/core/lib/modifiers/eventListeners.js", "../node_modules/@popperjs/core/lib/utils/getOppositePlacement.js", "../node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js", "../node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js", "../node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js", "../node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js", "../node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js", "../node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js", "../node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js", "../node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js", "../node_modules/@popperjs/core/lib/utils/rectToClientRect.js", "../node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js", "../node_modules/@popperjs/core/lib/utils/getVariation.js", "../node_modules/@popperjs/core/lib/utils/computeOffsets.js", "../node_modules/@popperjs/core/lib/utils/detectOverflow.js", "../node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js", "../node_modules/@popperjs/core/lib/modifiers/flip.js", "../node_modules/@popperjs/core/lib/modifiers/hide.js", "../node_modules/@popperjs/core/lib/modifiers/offset.js", "../node_modules/@popperjs/core/lib/modifiers/popperOffsets.js", "../node_modules/@popperjs/core/lib/utils/getAltAxis.js", "../node_modules/@popperjs/core/lib/modifiers/preventOverflow.js", "../node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js", "../node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js", "../node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js", "../node_modules/@popperjs/core/lib/utils/orderModifiers.js", "../node_modules/@popperjs/core/lib/utils/debounce.js", "../node_modules/@popperjs/core/lib/utils/mergeByName.js", "../node_modules/@popperjs/core/lib/createPopper.js", "../node_modules/@popperjs/core/lib/popper-lite.js", "../node_modules/@popperjs/core/lib/popper.js", "../node_modules/bootstrap/js/src/dom/selector-engine.js", "../node_modules/bootstrap/js/src/util/index.js", "../node_modules/bootstrap/js/src/dom/event-handler.js", "../node_modules/bootstrap/js/src/dom/data.js", "../node_modules/bootstrap/js/src/base-component.js", "../node_modules/bootstrap/js/src/alert.js", "../node_modules/bootstrap/js/src/button.js", "../node_modules/bootstrap/js/src/dom/manipulator.js", "../node_modules/bootstrap/js/src/carousel.js", "../node_modules/bootstrap/js/src/collapse.js", "../node_modules/bootstrap/js/src/dropdown.js", "../node_modules/bootstrap/js/src/util/scrollbar.js", "../node_modules/bootstrap/js/src/util/backdrop.js", "../node_modules/bootstrap/js/src/modal.js", "../node_modules/bootstrap/js/src/offcanvas.js", "../node_modules/bootstrap/js/src/util/sanitizer.js", "../node_modules/bootstrap/js/src/tooltip.js", "../node_modules/bootstrap/js/src/popover.js", "../node_modules/bootstrap/js/src/scrollspy.js", "../node_modules/bootstrap/js/src/tab.js", "../node_modules/bootstrap/js/src/toast.js", "../node_modules/core-js/modules/es.array.for-each.js", "../node_modules/core-js/modules/web.dom-collections.for-each.js", "../node_modules/core-js/modules/es.array.filter.js", "../node_modules/core-js/modules/es.object.assign.js", "../node_modules/core-js/modules/es.object.to-string.js", "../node_modules/core-js/modules/es.parse-int.js", "../node_modules/core-js/modules/es.string.iterator.js", "../node_modules/core-js/modules/web.dom-collections.iterator.js", "../node_modules/@juggle/resize-observer/lib/utils/resizeObservers.js", "../node_modules/@juggle/resize-observer/lib/algorithms/hasActiveObservations.js", "../node_modules/@juggle/resize-observer/lib/algorithms/hasSkippedObservations.js", "../node_modules/@juggle/resize-observer/lib/algorithms/deliverResizeLoopError.js", "../node_modules/@juggle/resize-observer/lib/ResizeObserverBoxOptions.js", "../node_modules/@juggle/resize-observer/lib/utils/freeze.js", "../node_modules/@juggle/resize-observer/lib/ResizeObserverSize.js", "../node_modules/@juggle/resize-observer/lib/DOMRectReadOnly.js", "../node_modules/@juggle/resize-observer/lib/utils/element.js", "../node_modules/@juggle/resize-observer/lib/utils/global.js", "../node_modules/@juggle/resize-observer/lib/algorithms/calculateBoxSize.js", "../node_modules/@juggle/resize-observer/lib/ResizeObserverEntry.js", "../node_modules/@juggle/resize-observer/lib/algorithms/calculateDepthForNode.js", "../node_modules/@juggle/resize-observer/lib/algorithms/broadcastActiveObservations.js", "../node_modules/@juggle/resize-observer/lib/algorithms/gatherActiveObservationsAtDepth.js", "../node_modules/@juggle/resize-observer/lib/utils/process.js", "../node_modules/@juggle/resize-observer/lib/utils/queueMicroTask.js", "../node_modules/@juggle/resize-observer/lib/utils/queueResizeObserver.js", "../node_modules/@juggle/resize-observer/lib/utils/scheduler.js", "../node_modules/@juggle/resize-observer/lib/ResizeObservation.js", "../node_modules/@juggle/resize-observer/lib/ResizeObserverDetail.js", "../node_modules/@juggle/resize-observer/lib/ResizeObserverController.js", "../node_modules/@juggle/resize-observer/lib/ResizeObserver.js", "../node_modules/core-js/modules/es.array.reduce.js", "../node_modules/core-js/modules/es.function.name.js", "../node_modules/core-js/modules/es.string.match.js", "../node_modules/core-js/modules/es.string.replace.js", "../node_modules/simplebar/src/helpers.js", "../node_modules/simplebar/src/scrollbar-width.js", "../node_modules/simplebar/src/simplebar.js", "../node_modules/simplebar/src/index.js", "../src/util.ts", "../src/forms/elements.ts", "../src/forms/speedSelector.ts", "../src/forms/scopeSelector.ts", "../src/forms/vlanTags.ts", "../src/forms/index.ts", "../src/bs.ts", "../src/search.ts", "../node_modules/color2k/src/guard.ts", "../node_modules/color2k/src/ColorError.ts", "../node_modules/color2k/src/parseToRgba.ts", "../node_modules/color2k/src/parseToHsla.ts", "../node_modules/color2k/src/hsla.ts", "../node_modules/color2k/src/adjustHue.ts", "../node_modules/color2k/src/darken.ts", "../node_modules/color2k/src/desaturate.ts", "../node_modules/color2k/src/getLuminance.ts", "../node_modules/color2k/src/getContrast.ts", "../node_modules/color2k/src/rgba.ts", "../node_modules/color2k/src/mix.ts", "../node_modules/color2k/src/getScale.ts", "../node_modules/color2k/src/hasBadContrast.ts", "../node_modules/color2k/src/lighten.ts", "../node_modules/color2k/src/transparentize.ts", "../node_modules/color2k/src/opacify.ts", "../node_modules/color2k/src/readableColorIsBlack.ts", "../node_modules/color2k/src/readableColor.ts", "../node_modules/color2k/src/saturate.ts", "../node_modules/color2k/src/toHex.ts", "../node_modules/color2k/src/toRgba.ts", "../node_modules/color2k/src/toHsla.ts", "../src/select/api/apiSelect.ts", "../node_modules/slim-select/dist/slimselect.min.mjs", "../src/select/util.ts", "../src/select/api/types.ts", "../src/select/api/dynamicParams.ts", "../src/select/api/index.ts", "../src/select/color.ts", "../src/select/static.ts", "../src/select/index.ts", "../src/buttons/connectionToggle.ts", "../src/state/index.ts", "../src/stores/objectDepth.ts", "../src/stores/rackImages.ts", "../src/buttons/depthToggle.ts", "../src/buttons/moveOptions.ts", "../src/buttons/pagination.ts", "../src/colorMode.ts", "../src/buttons/preferences.ts", "../src/buttons/reslug.ts", "../src/buttons/selectAll.ts", "../src/buttons/index.ts", "../src/messages.ts", "../src/clipboard.ts", "../src/dateSelector.ts", "../src/tableConfig.ts", "../src/tables/interfaceTable.ts", "../src/sidenav.ts", "../src/racks.ts", "../src/links.ts", "../src/netbox.ts"], + "mappings": "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", "names": [] } diff --git a/netbox/project-static/src/forms/actions.ts b/netbox/project-static/src/forms/actions.ts deleted file mode 100644 index a83521d0d85..00000000000 --- a/netbox/project-static/src/forms/actions.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { getElements, findFirstAdjacent, isTruthy } from '../util'; - -/** - * Handle bulk add/edit/rename form actions. - * - * @param event Click Event - */ -function handleFormActionClick(event: Event): void { - event.preventDefault(); - const element = event.currentTarget as HTMLElement; - if (element !== null) { - const form = findFirstAdjacent(element, 'form'); - const href = element.getAttribute('href'); - if (form !== null && isTruthy(href)) { - form.setAttribute('action', href); - form.submit(); - } - } -} - -/** - * Initialize bulk form action links. - */ -export function initFormActions(): void { - for (const element of getElements('a.formaction')) { - element.addEventListener('click', handleFormActionClick); - } -} diff --git a/netbox/project-static/src/forms/index.ts b/netbox/project-static/src/forms/index.ts index 2c409dd7613..1ef8540fd4f 100644 --- a/netbox/project-static/src/forms/index.ts +++ b/netbox/project-static/src/forms/index.ts @@ -1,17 +1,10 @@ -import { initFormActions } from './actions'; import { initFormElements } from './elements'; import { initSpeedSelector } from './speedSelector'; import { initScopeSelector } from './scopeSelector'; import { initVlanTags } from './vlanTags'; export function initForms(): void { - for (const func of [ - initFormActions, - initFormElements, - initSpeedSelector, - initScopeSelector, - initVlanTags, - ]) { + for (const func of [initFormElements, initSpeedSelector, initScopeSelector, initVlanTags]) { func(); } } diff --git a/netbox/templates/circuits/circuit.html b/netbox/templates/circuits/circuit.html index bf26d7fe32d..e68465c8279 100644 --- a/netbox/templates/circuits/circuit.html +++ b/netbox/templates/circuits/circuit.html @@ -4,7 +4,7 @@ {% block breadcrumbs %} {{ block.super }} -
+ {% endblock %} {% block content %} diff --git a/netbox/templates/dcim/device_list.html b/netbox/templates/dcim/device_list.html index 0a6f1f05136..177a0fb3672 100644 --- a/netbox/templates/dcim/device_list.html +++ b/netbox/templates/dcim/device_list.html @@ -1,70 +1,69 @@ {% extends 'generic/object_list.html' %} {% block bulk_buttons %} - {% if perms.dcim.change_device %} - - {% endif %} + + {% endif %} + {% if perms.dcim.add_consoleserverport %} +
  • + +
  • + {% endif %} + {% if perms.dcim.add_powerport %} +
  • + +
  • + {% endif %} + {% if perms.dcim.add_poweroutlet %} +
  • + +
  • + {% endif %} + {% if perms.dcim.add_interface %} +
  • + +
  • + {% endif %} + {% if perms.dcim.add_rearport %} +
  • + +
  • + {% endif %} + {% if perms.dcim.add_devicebay %} +
  • + +
  • + {% endif %} + {% if perms.dcim.add_inventoryitem %} +
  • + +
  • + {% endif %} + + + {% endif %} {% endblock %} diff --git a/netbox/templates/dcim/devicebay_populate.html b/netbox/templates/dcim/devicebay_populate.html index 3e3d898f2be..d0f47921a4a 100644 --- a/netbox/templates/dcim/devicebay_populate.html +++ b/netbox/templates/dcim/devicebay_populate.html @@ -12,13 +12,13 @@
    {% block title %}Populate {{ device_bay }}{% endblock %}
    - +
    - +
    diff --git a/netbox/templates/extras/customfield.html b/netbox/templates/extras/customfield.html index fd5576c2ade..bf79059b804 100644 --- a/netbox/templates/extras/customfield.html +++ b/netbox/templates/extras/customfield.html @@ -56,7 +56,13 @@ Choices - {{ object.choices|placeholder }} + + {% if object.choices %} + {{ object.choices|join:", " }} + {% else %} + + {% endif %} + Filter Logic diff --git a/netbox/templates/generic/object_edit.html b/netbox/templates/generic/object_edit.html index 7ee4c4f94ca..bd3f6059b68 100644 --- a/netbox/templates/generic/object_edit.html +++ b/netbox/templates/generic/object_edit.html @@ -7,12 +7,12 @@ {% endblock title %} {% block controls %} - {% if settings.DOCS_ROOT %} + {% if obj and settings.DOCS_ROOT %} {% endif %} @@ -84,7 +84,6 @@
    {% block buttons %} Cancel - {% if obj.pk %} {% endif %} - {% endblock buttons %}
    - {% if obj and settings.DOCS_ROOT %} - {% include 'inc/modal.html' with name='docs' content=obj|get_docs %} - {% endif %} - {% endblock content-wrapper %} diff --git a/netbox/templates/inc/modal.html b/netbox/templates/inc/modal.html deleted file mode 100644 index 054e945417b..00000000000 --- a/netbox/templates/inc/modal.html +++ /dev/null @@ -1,15 +0,0 @@ - diff --git a/netbox/templates/virtualization/virtualmachine_list.html b/netbox/templates/virtualization/virtualmachine_list.html index 245e5509231..90c784f3108 100644 --- a/netbox/templates/virtualization/virtualmachine_list.html +++ b/netbox/templates/virtualization/virtualmachine_list.html @@ -1,14 +1,20 @@ {% extends 'generic/object_list.html' %} {% block bulk_buttons %} - {% if perms.virtualization.change_virtualmachine %} -
    - +
    - {% endif %} + + {% endif %} + + + {% endif %} {% endblock %} diff --git a/netbox/tenancy/forms.py b/netbox/tenancy/forms.py deleted file mode 100644 index 63dcdd4684c..00000000000 --- a/netbox/tenancy/forms.py +++ /dev/null @@ -1,196 +0,0 @@ -from django import forms -from django.utils.translation import gettext as _ - -from extras.forms import ( - AddRemoveTagsForm, CustomFieldModelForm, CustomFieldModelBulkEditForm, CustomFieldModelFilterForm, CustomFieldModelCSVForm, -) -from extras.models import Tag -from utilities.forms import ( - BootstrapMixin, CommentField, CSVModelChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, - SlugField, TagFilterField, -) -from .models import Tenant, TenantGroup - - -# -# Tenant groups -# - -class TenantGroupForm(BootstrapMixin, CustomFieldModelForm): - parent = DynamicModelChoiceField( - queryset=TenantGroup.objects.all(), - required=False - ) - slug = SlugField() - - class Meta: - model = TenantGroup - fields = [ - 'parent', 'name', 'slug', 'description', - ] - - -class TenantGroupCSVForm(CustomFieldModelCSVForm): - parent = CSVModelChoiceField( - queryset=TenantGroup.objects.all(), - required=False, - to_field_name='name', - help_text='Parent group' - ) - slug = SlugField() - - class Meta: - model = TenantGroup - fields = ('name', 'slug', 'parent', 'description') - - -class TenantGroupBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=TenantGroup.objects.all(), - widget=forms.MultipleHiddenInput - ) - parent = DynamicModelChoiceField( - queryset=TenantGroup.objects.all(), - required=False - ) - description = forms.CharField( - max_length=200, - required=False - ) - - class Meta: - nullable_fields = ['parent', 'description'] - - -class TenantGroupFilterForm(BootstrapMixin, CustomFieldModelFilterForm): - model = TenantGroup - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - parent_id = DynamicModelMultipleChoiceField( - queryset=TenantGroup.objects.all(), - required=False, - label=_('Parent group'), - fetch_trigger='open' - ) - - -# -# Tenants -# - -class TenantForm(BootstrapMixin, CustomFieldModelForm): - slug = SlugField() - group = DynamicModelChoiceField( - queryset=TenantGroup.objects.all(), - required=False - ) - comments = CommentField() - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = Tenant - fields = ( - 'name', 'slug', 'group', 'description', 'comments', 'tags', - ) - fieldsets = ( - ('Tenant', ('name', 'slug', 'group', 'description', 'tags')), - ) - - -class TenantCSVForm(CustomFieldModelCSVForm): - slug = SlugField() - group = CSVModelChoiceField( - queryset=TenantGroup.objects.all(), - required=False, - to_field_name='name', - help_text='Assigned group' - ) - - class Meta: - model = Tenant - fields = ('name', 'slug', 'group', 'description', 'comments') - - -class TenantBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Tenant.objects.all(), - widget=forms.MultipleHiddenInput() - ) - group = DynamicModelChoiceField( - queryset=TenantGroup.objects.all(), - required=False - ) - - class Meta: - nullable_fields = [ - 'group', - ] - - -class TenantFilterForm(BootstrapMixin, CustomFieldModelFilterForm): - model = Tenant - field_groups = ( - ('q', 'tag'), - ('group_id',), - ) - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - group_id = DynamicModelMultipleChoiceField( - queryset=TenantGroup.objects.all(), - required=False, - null_option='None', - label=_('Group'), - fetch_trigger='open' - ) - tag = TagFilterField(model) - - -# -# Form extensions -# - -class TenancyForm(forms.Form): - tenant_group = DynamicModelChoiceField( - queryset=TenantGroup.objects.all(), - required=False, - null_option='None', - initial_params={ - 'tenants': '$tenant' - } - ) - tenant = DynamicModelChoiceField( - queryset=Tenant.objects.all(), - required=False, - query_params={ - 'group_id': '$tenant_group' - } - ) - - -class TenancyFilterForm(forms.Form): - tenant_group_id = DynamicModelMultipleChoiceField( - queryset=TenantGroup.objects.all(), - required=False, - null_option='None', - label=_('Tenant group'), - fetch_trigger='open' - ) - tenant_id = DynamicModelMultipleChoiceField( - queryset=Tenant.objects.all(), - required=False, - null_option='None', - query_params={ - 'group_id': '$tenant_group_id' - }, - label=_('Tenant'), - fetch_trigger='open' - ) diff --git a/netbox/tenancy/forms/__init__.py b/netbox/tenancy/forms/__init__.py new file mode 100644 index 00000000000..61f0bc96173 --- /dev/null +++ b/netbox/tenancy/forms/__init__.py @@ -0,0 +1,5 @@ +from .forms import * +from .models import * +from .filtersets import * +from .bulk_edit import * +from .bulk_import import * diff --git a/netbox/tenancy/forms/bulk_edit.py b/netbox/tenancy/forms/bulk_edit.py new file mode 100644 index 00000000000..b2fc7dafd7c --- /dev/null +++ b/netbox/tenancy/forms/bulk_edit.py @@ -0,0 +1,44 @@ +from django import forms + +from extras.forms import AddRemoveTagsForm, CustomFieldModelBulkEditForm +from tenancy.models import Tenant, TenantGroup +from utilities.forms import BootstrapMixin, DynamicModelChoiceField + +__all__ = ( + 'TenantBulkEditForm', + 'TenantGroupBulkEditForm', +) + + +class TenantGroupBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=TenantGroup.objects.all(), + widget=forms.MultipleHiddenInput + ) + parent = DynamicModelChoiceField( + queryset=TenantGroup.objects.all(), + required=False + ) + description = forms.CharField( + max_length=200, + required=False + ) + + class Meta: + nullable_fields = ['parent', 'description'] + + +class TenantBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=Tenant.objects.all(), + widget=forms.MultipleHiddenInput() + ) + group = DynamicModelChoiceField( + queryset=TenantGroup.objects.all(), + required=False + ) + + class Meta: + nullable_fields = [ + 'group', + ] diff --git a/netbox/tenancy/forms/bulk_import.py b/netbox/tenancy/forms/bulk_import.py new file mode 100644 index 00000000000..335d71ef6d0 --- /dev/null +++ b/netbox/tenancy/forms/bulk_import.py @@ -0,0 +1,36 @@ +from extras.forms import CustomFieldModelCSVForm +from tenancy.models import Tenant, TenantGroup +from utilities.forms import CSVModelChoiceField, SlugField + +__all__ = ( + 'TenantCSVForm', + 'TenantGroupCSVForm', +) + + +class TenantGroupCSVForm(CustomFieldModelCSVForm): + parent = CSVModelChoiceField( + queryset=TenantGroup.objects.all(), + required=False, + to_field_name='name', + help_text='Parent group' + ) + slug = SlugField() + + class Meta: + model = TenantGroup + fields = ('name', 'slug', 'parent', 'description') + + +class TenantCSVForm(CustomFieldModelCSVForm): + slug = SlugField() + group = CSVModelChoiceField( + queryset=TenantGroup.objects.all(), + required=False, + to_field_name='name', + help_text='Assigned group' + ) + + class Meta: + model = Tenant + fields = ('name', 'slug', 'group', 'description', 'comments') diff --git a/netbox/tenancy/forms/filtersets.py b/netbox/tenancy/forms/filtersets.py new file mode 100644 index 00000000000..6e2eb7fd176 --- /dev/null +++ b/netbox/tenancy/forms/filtersets.py @@ -0,0 +1,42 @@ +from django import forms +from django.utils.translation import gettext as _ + +from extras.forms import CustomFieldModelFilterForm +from tenancy.models import Tenant, TenantGroup +from utilities.forms import BootstrapMixin, DynamicModelMultipleChoiceField, TagFilterField + + +class TenantGroupFilterForm(BootstrapMixin, CustomFieldModelFilterForm): + model = TenantGroup + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + parent_id = DynamicModelMultipleChoiceField( + queryset=TenantGroup.objects.all(), + required=False, + label=_('Parent group'), + fetch_trigger='open' + ) + + +class TenantFilterForm(BootstrapMixin, CustomFieldModelFilterForm): + model = Tenant + field_groups = ( + ('q', 'tag'), + ('group_id',), + ) + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + group_id = DynamicModelMultipleChoiceField( + queryset=TenantGroup.objects.all(), + required=False, + null_option='None', + label=_('Group'), + fetch_trigger='open' + ) + tag = TagFilterField(model) diff --git a/netbox/tenancy/forms/forms.py b/netbox/tenancy/forms/forms.py new file mode 100644 index 00000000000..cad63c1a6ba --- /dev/null +++ b/netbox/tenancy/forms/forms.py @@ -0,0 +1,48 @@ +from django import forms +from django.utils.translation import gettext as _ + +from tenancy.models import Tenant, TenantGroup +from utilities.forms import DynamicModelChoiceField, DynamicModelMultipleChoiceField + +__all__ = ( + 'TenancyForm', + 'TenancyFilterForm', +) + + +class TenancyForm(forms.Form): + tenant_group = DynamicModelChoiceField( + queryset=TenantGroup.objects.all(), + required=False, + null_option='None', + initial_params={ + 'tenants': '$tenant' + } + ) + tenant = DynamicModelChoiceField( + queryset=Tenant.objects.all(), + required=False, + query_params={ + 'group_id': '$tenant_group' + } + ) + + +class TenancyFilterForm(forms.Form): + tenant_group_id = DynamicModelMultipleChoiceField( + queryset=TenantGroup.objects.all(), + required=False, + null_option='None', + label=_('Tenant group'), + fetch_trigger='open' + ) + tenant_id = DynamicModelMultipleChoiceField( + queryset=Tenant.objects.all(), + required=False, + null_option='None', + query_params={ + 'group_id': '$tenant_group_id' + }, + label=_('Tenant'), + fetch_trigger='open' + ) diff --git a/netbox/tenancy/forms/models.py b/netbox/tenancy/forms/models.py new file mode 100644 index 00000000000..de3a9e515c8 --- /dev/null +++ b/netbox/tenancy/forms/models.py @@ -0,0 +1,47 @@ +from extras.forms import CustomFieldModelForm +from extras.models import Tag +from tenancy.models import Tenant, TenantGroup +from utilities.forms import ( + BootstrapMixin, CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, SlugField, +) + +__all__ = ( + 'TenantForm', + 'TenantGroupForm', +) + + +class TenantGroupForm(BootstrapMixin, CustomFieldModelForm): + parent = DynamicModelChoiceField( + queryset=TenantGroup.objects.all(), + required=False + ) + slug = SlugField() + + class Meta: + model = TenantGroup + fields = [ + 'parent', 'name', 'slug', 'description', + ] + + +class TenantForm(BootstrapMixin, CustomFieldModelForm): + slug = SlugField() + group = DynamicModelChoiceField( + queryset=TenantGroup.objects.all(), + required=False + ) + comments = CommentField() + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = Tenant + fields = ( + 'name', 'slug', 'group', 'description', 'comments', 'tags', + ) + fieldsets = ( + ('Tenant', ('name', 'slug', 'group', 'description', 'tags')), + ) diff --git a/netbox/tenancy/tables.py b/netbox/tenancy/tables.py index c62c641d16b..f39ca1b18ad 100644 --- a/netbox/tenancy/tables.py +++ b/netbox/tenancy/tables.py @@ -68,6 +68,9 @@ class TenantTable(BaseTable): name = tables.Column( linkify=True ) + group = tables.Column( + linkify=True + ) comments = MarkdownColumn() tags = TagColumn( url_name='tenancy:tenant_list' diff --git a/netbox/utilities/forms/utils.py b/netbox/utilities/forms/utils.py index 7d2b79f02a7..343fdb8a369 100644 --- a/netbox/utilities/forms/utils.py +++ b/netbox/utilities/forms/utils.py @@ -137,6 +137,8 @@ def get_selected_values(form, field_name): else: # Static selection field choices = unpack_grouped_choices(field.choices) + if type(filter_data) not in (list, tuple): + filter_data = [filter_data] # Ensure filter data is iterable values = [ label for value, label in choices if str(value) in filter_data or None in filter_data ] diff --git a/netbox/utilities/tables.py b/netbox/utilities/tables.py index 4d8a60114f7..0a8e8c3ba78 100644 --- a/netbox/utilities/tables.py +++ b/netbox/utilities/tables.py @@ -11,6 +11,7 @@ from django_tables2 import RequestConfig from django_tables2.data import TableQuerysetData from django_tables2.utils import Accessor +from extras.choices import CustomFieldTypeChoices from extras.models import CustomField from .utils import content_type_name from .paginator import EnhancedPaginator, get_paginate_count @@ -355,6 +356,9 @@ class CustomFieldColumn(tables.Column): def render(self, value): if isinstance(value, list): return ', '.join(v for v in value) + elif self.customfield.type == CustomFieldTypeChoices.TYPE_URL: + # Linkify custom URLs + return mark_safe(f'{value}') return value or self.default diff --git a/netbox/utilities/templatetags/helpers.py b/netbox/utilities/templatetags/helpers.py index 615595f0f0a..532eea19b60 100644 --- a/netbox/utilities/templatetags/helpers.py +++ b/netbox/utilities/templatetags/helpers.py @@ -216,27 +216,11 @@ def percentage(x, y): @register.filter() -def get_docs(model): +def get_docs_url(model): """ - Render and return documentation for the specified model. + Return the documentation URL for the specified model. """ - path = '{}/models/{}/{}.md'.format( - settings.DOCS_ROOT, - model._meta.app_label, - model._meta.model_name - ) - try: - with open(path, encoding='utf-8') as docfile: - content = docfile.read() - except FileNotFoundError: - return "Unable to load documentation, file not found: {}".format(path) - except IOError: - return "Unable to load documentation, error reading file: {}".format(path) - - # Render Markdown with the admonition extension - content = markdown(content, extensions=['admonition', 'fenced_code', 'tables']) - - return mark_safe(content) + return f'{settings.STATIC_URL}docs/models/{model._meta.app_label}/{model._meta.model_name}/' @register.filter() diff --git a/netbox/virtualization/forms.py b/netbox/virtualization/forms.py deleted file mode 100644 index bf5dec00cb0..00000000000 --- a/netbox/virtualization/forms.py +++ /dev/null @@ -1,965 +0,0 @@ -from django import forms -from django.contrib.contenttypes.models import ContentType -from django.core.exceptions import ValidationError -from django.utils.translation import gettext as _ - -from dcim.choices import InterfaceModeChoices -from dcim.constants import INTERFACE_MTU_MAX, INTERFACE_MTU_MIN -from dcim.forms import InterfaceCommonForm, INTERFACE_MODE_HELP_TEXT -from dcim.models import Device, DeviceRole, Platform, Rack, Region, Site, SiteGroup -from extras.forms import ( - AddRemoveTagsForm, CustomFieldModelBulkEditForm, CustomFieldModelCSVForm, CustomFieldModelForm, - CustomFieldModelFilterForm, CustomFieldsMixin, LocalConfigContextFilterForm, -) -from extras.models import Tag -from ipam.models import IPAddress, VLAN, VLANGroup -from tenancy.forms import TenancyFilterForm, TenancyForm -from tenancy.models import Tenant -from utilities.forms import ( - add_blank_choice, BootstrapMixin, BulkEditNullBooleanSelect, BulkRenameForm, CommentField, ConfirmationForm, - CSVChoiceField, CSVModelChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, ExpandableNameField, - form_from_model, JSONField, SlugField, SmallTextarea, StaticSelect, StaticSelectMultiple, TagFilterField, - BOOLEAN_WITH_BLANK_CHOICES, -) -from .choices import * -from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface - - -# -# Cluster types -# - -class ClusterTypeForm(BootstrapMixin, CustomFieldModelForm): - slug = SlugField() - - class Meta: - model = ClusterType - fields = [ - 'name', 'slug', 'description', - ] - - -class ClusterTypeCSVForm(CustomFieldModelCSVForm): - slug = SlugField() - - class Meta: - model = ClusterType - fields = ('name', 'slug', 'description') - - -class ClusterTypeBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=ClusterType.objects.all(), - widget=forms.MultipleHiddenInput - ) - description = forms.CharField( - max_length=200, - required=False - ) - - class Meta: - nullable_fields = ['description'] - - -class ClusterTypeFilterForm(BootstrapMixin, CustomFieldModelFilterForm): - model = ClusterType - field_groups = [ - ['q'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - - -# -# Cluster groups -# - -class ClusterGroupForm(BootstrapMixin, CustomFieldModelForm): - slug = SlugField() - - class Meta: - model = ClusterGroup - fields = [ - 'name', 'slug', 'description', - ] - - -class ClusterGroupCSVForm(CustomFieldModelCSVForm): - slug = SlugField() - - class Meta: - model = ClusterGroup - fields = ('name', 'slug', 'description') - - -class ClusterGroupBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=ClusterGroup.objects.all(), - widget=forms.MultipleHiddenInput - ) - description = forms.CharField( - max_length=200, - required=False - ) - - class Meta: - nullable_fields = ['description'] - - -class ClusterGroupFilterForm(BootstrapMixin, CustomFieldModelFilterForm): - model = ClusterGroup - field_groups = [ - ['q'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - - -# -# Clusters -# - -class ClusterForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): - type = DynamicModelChoiceField( - queryset=ClusterType.objects.all() - ) - group = DynamicModelChoiceField( - queryset=ClusterGroup.objects.all(), - required=False - ) - region = DynamicModelChoiceField( - queryset=Region.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - } - ) - site_group = DynamicModelChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - initial_params={ - 'sites': '$site' - } - ) - site = DynamicModelChoiceField( - queryset=Site.objects.all(), - required=False, - query_params={ - 'region_id': '$region', - 'group_id': '$site_group', - } - ) - comments = CommentField() - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = Cluster - fields = ( - 'name', 'type', 'group', 'tenant', 'region', 'site_group', 'site', 'comments', 'tags', - ) - fieldsets = ( - ('Cluster', ('name', 'type', 'group', 'region', 'site_group', 'site', 'tags')), - ('Tenancy', ('tenant_group', 'tenant')), - ) - - -class ClusterCSVForm(CustomFieldModelCSVForm): - type = CSVModelChoiceField( - queryset=ClusterType.objects.all(), - to_field_name='name', - help_text='Type of cluster' - ) - group = CSVModelChoiceField( - queryset=ClusterGroup.objects.all(), - to_field_name='name', - required=False, - help_text='Assigned cluster group' - ) - site = CSVModelChoiceField( - queryset=Site.objects.all(), - to_field_name='name', - required=False, - help_text='Assigned site' - ) - tenant = CSVModelChoiceField( - queryset=Tenant.objects.all(), - to_field_name='name', - required=False, - help_text='Assigned tenant' - ) - - class Meta: - model = Cluster - fields = ('name', 'type', 'group', 'site', 'comments') - - -class ClusterBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=Cluster.objects.all(), - widget=forms.MultipleHiddenInput() - ) - type = DynamicModelChoiceField( - queryset=ClusterType.objects.all(), - required=False - ) - group = DynamicModelChoiceField( - queryset=ClusterGroup.objects.all(), - required=False - ) - tenant = DynamicModelChoiceField( - queryset=Tenant.objects.all(), - required=False - ) - region = DynamicModelChoiceField( - queryset=Region.objects.all(), - required=False, - ) - site_group = DynamicModelChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - ) - site = DynamicModelChoiceField( - queryset=Site.objects.all(), - required=False, - query_params={ - 'region_id': '$region', - 'group_id': '$site_group', - } - ) - comments = CommentField( - widget=SmallTextarea, - label='Comments' - ) - - class Meta: - nullable_fields = [ - 'group', 'site', 'comments', 'tenant', - ] - - -class ClusterFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm): - model = Cluster - field_order = [ - 'q', 'type_id', 'region_id', 'site_id', 'group_id', 'tenant_group_id', 'tenant_id', - ] - field_groups = [ - ['q', 'tag'], - ['group_id', 'type_id'], - ['region_id', 'site_group_id', 'site_id'], - ['tenant_group_id', 'tenant_id'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - type_id = DynamicModelMultipleChoiceField( - queryset=ClusterType.objects.all(), - required=False, - label=_('Type'), - fetch_trigger='open' - ) - region_id = DynamicModelMultipleChoiceField( - queryset=Region.objects.all(), - required=False, - label=_('Region'), - fetch_trigger='open' - ) - site_group_id = DynamicModelMultipleChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - label=_('Site group'), - fetch_trigger='open' - ) - site_id = DynamicModelMultipleChoiceField( - queryset=Site.objects.all(), - required=False, - null_option='None', - query_params={ - 'region_id': '$region_id', - 'site_group_id': '$site_group_id', - }, - label=_('Site'), - fetch_trigger='open' - ) - group_id = DynamicModelMultipleChoiceField( - queryset=ClusterGroup.objects.all(), - required=False, - null_option='None', - label=_('Group'), - fetch_trigger='open' - ) - tag = TagFilterField(model) - - -class ClusterAddDevicesForm(BootstrapMixin, forms.Form): - region = DynamicModelChoiceField( - queryset=Region.objects.all(), - required=False, - null_option='None' - ) - site_group = DynamicModelChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - null_option='None' - ) - site = DynamicModelChoiceField( - queryset=Site.objects.all(), - required=False, - query_params={ - 'region_id': '$region', - 'group_id': '$site_group', - } - ) - rack = DynamicModelChoiceField( - queryset=Rack.objects.all(), - required=False, - null_option='None', - query_params={ - 'site_id': '$site' - } - ) - devices = DynamicModelMultipleChoiceField( - queryset=Device.objects.all(), - query_params={ - 'site_id': '$site', - 'rack_id': '$rack', - 'cluster_id': 'null', - } - ) - - class Meta: - fields = [ - 'region', 'site', 'rack', 'devices', - ] - - def __init__(self, cluster, *args, **kwargs): - - self.cluster = cluster - - super().__init__(*args, **kwargs) - - self.fields['devices'].choices = [] - - def clean(self): - super().clean() - - # If the Cluster is assigned to a Site, all Devices must be assigned to that Site. - if self.cluster.site is not None: - for device in self.cleaned_data.get('devices', []): - if device.site != self.cluster.site: - raise ValidationError({ - 'devices': "{} belongs to a different site ({}) than the cluster ({})".format( - device, device.site, self.cluster.site - ) - }) - - -class ClusterRemoveDevicesForm(ConfirmationForm): - pk = forms.ModelMultipleChoiceField( - queryset=Device.objects.all(), - widget=forms.MultipleHiddenInput() - ) - - -# -# Virtual Machines -# - -class VirtualMachineForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): - cluster_group = DynamicModelChoiceField( - queryset=ClusterGroup.objects.all(), - required=False, - null_option='None', - initial_params={ - 'clusters': '$cluster' - } - ) - cluster = DynamicModelChoiceField( - queryset=Cluster.objects.all(), - query_params={ - 'group_id': '$cluster_group' - } - ) - role = DynamicModelChoiceField( - queryset=DeviceRole.objects.all(), - required=False, - query_params={ - "vm_role": "True" - } - ) - platform = DynamicModelChoiceField( - queryset=Platform.objects.all(), - required=False - ) - local_context_data = JSONField( - required=False, - label='' - ) - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = VirtualMachine - fields = [ - 'name', 'status', 'cluster_group', 'cluster', 'role', 'tenant_group', 'tenant', 'platform', 'primary_ip4', - 'primary_ip6', 'vcpus', 'memory', 'disk', 'comments', 'tags', 'local_context_data', - ] - fieldsets = ( - ('Virtual Machine', ('name', 'role', 'status', 'tags')), - ('Cluster', ('cluster_group', 'cluster')), - ('Tenancy', ('tenant_group', 'tenant')), - ('Management', ('platform', 'primary_ip4', 'primary_ip6')), - ('Resources', ('vcpus', 'memory', 'disk')), - ('Config Context', ('local_context_data',)), - ) - help_texts = { - 'local_context_data': "Local config context data overwrites all sources contexts in the final rendered " - "config context", - } - widgets = { - "status": StaticSelect(), - 'primary_ip4': StaticSelect(), - 'primary_ip6': StaticSelect(), - } - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - if self.instance.pk: - - # Compile list of choices for primary IPv4 and IPv6 addresses - for family in [4, 6]: - ip_choices = [(None, '---------')] - - # Gather PKs of all interfaces belonging to this VM - interface_ids = self.instance.interfaces.values_list('pk', flat=True) - - # Collect interface IPs - interface_ips = IPAddress.objects.filter( - address__family=family, - assigned_object_type=ContentType.objects.get_for_model(VMInterface), - assigned_object_id__in=interface_ids - ) - if interface_ips: - ip_list = [(ip.id, f'{ip.address} ({ip.assigned_object})') for ip in interface_ips] - ip_choices.append(('Interface IPs', ip_list)) - # Collect NAT IPs - nat_ips = IPAddress.objects.prefetch_related('nat_inside').filter( - address__family=family, - nat_inside__assigned_object_type=ContentType.objects.get_for_model(VMInterface), - nat_inside__assigned_object_id__in=interface_ids - ) - if nat_ips: - ip_list = [(ip.id, f'{ip.address} (NAT)') for ip in nat_ips] - ip_choices.append(('NAT IPs', ip_list)) - self.fields['primary_ip{}'.format(family)].choices = ip_choices - - else: - - # An object that doesn't exist yet can't have any IPs assigned to it - self.fields['primary_ip4'].choices = [] - self.fields['primary_ip4'].widget.attrs['readonly'] = True - self.fields['primary_ip6'].choices = [] - self.fields['primary_ip6'].widget.attrs['readonly'] = True - - -class VirtualMachineCSVForm(CustomFieldModelCSVForm): - status = CSVChoiceField( - choices=VirtualMachineStatusChoices, - required=False, - help_text='Operational status of device' - ) - cluster = CSVModelChoiceField( - queryset=Cluster.objects.all(), - to_field_name='name', - help_text='Assigned cluster' - ) - role = CSVModelChoiceField( - queryset=DeviceRole.objects.filter( - vm_role=True - ), - required=False, - to_field_name='name', - help_text='Functional role' - ) - tenant = CSVModelChoiceField( - queryset=Tenant.objects.all(), - required=False, - to_field_name='name', - help_text='Assigned tenant' - ) - platform = CSVModelChoiceField( - queryset=Platform.objects.all(), - required=False, - to_field_name='name', - help_text='Assigned platform' - ) - - class Meta: - model = VirtualMachine - fields = ( - 'name', 'status', 'role', 'cluster', 'tenant', 'platform', 'vcpus', 'memory', 'disk', 'comments', - ) - - -class VirtualMachineBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=VirtualMachine.objects.all(), - widget=forms.MultipleHiddenInput() - ) - status = forms.ChoiceField( - choices=add_blank_choice(VirtualMachineStatusChoices), - required=False, - initial='', - widget=StaticSelect(), - ) - cluster = DynamicModelChoiceField( - queryset=Cluster.objects.all(), - required=False - ) - role = DynamicModelChoiceField( - queryset=DeviceRole.objects.filter( - vm_role=True - ), - required=False, - query_params={ - "vm_role": "True" - } - ) - tenant = DynamicModelChoiceField( - queryset=Tenant.objects.all(), - required=False - ) - platform = DynamicModelChoiceField( - queryset=Platform.objects.all(), - required=False - ) - vcpus = forms.IntegerField( - required=False, - label='vCPUs' - ) - memory = forms.IntegerField( - required=False, - label='Memory (MB)' - ) - disk = forms.IntegerField( - required=False, - label='Disk (GB)' - ) - comments = CommentField( - widget=SmallTextarea, - label='Comments' - ) - - class Meta: - nullable_fields = [ - 'role', 'tenant', 'platform', 'vcpus', 'memory', 'disk', 'comments', - ] - - -class VirtualMachineFilterForm(BootstrapMixin, LocalConfigContextFilterForm, TenancyFilterForm, CustomFieldModelFilterForm): - model = VirtualMachine - field_groups = [ - ['q', 'tag'], - ['cluster_group_id', 'cluster_type_id', 'cluster_id'], - ['region_id', 'site_group_id', 'site_id'], - ['status', 'role_id', 'platform_id', 'mac_address', 'has_primary_ip', 'local_context_data'], - ['tenant_group_id', 'tenant_id'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - cluster_group_id = DynamicModelMultipleChoiceField( - queryset=ClusterGroup.objects.all(), - required=False, - null_option='None', - label=_('Cluster group'), - fetch_trigger='open' - ) - cluster_type_id = DynamicModelMultipleChoiceField( - queryset=ClusterType.objects.all(), - required=False, - null_option='None', - label=_('Cluster type'), - fetch_trigger='open' - ) - cluster_id = DynamicModelMultipleChoiceField( - queryset=Cluster.objects.all(), - required=False, - label=_('Cluster'), - fetch_trigger='open' - ) - region_id = DynamicModelMultipleChoiceField( - queryset=Region.objects.all(), - required=False, - label=_('Region'), - fetch_trigger='open' - ) - site_group_id = DynamicModelMultipleChoiceField( - queryset=SiteGroup.objects.all(), - required=False, - label=_('Site group'), - fetch_trigger='open' - ) - site_id = DynamicModelMultipleChoiceField( - queryset=Site.objects.all(), - required=False, - null_option='None', - query_params={ - 'region_id': '$region_id', - 'group_id': '$site_group_id', - }, - label=_('Site'), - fetch_trigger='open' - ) - role_id = DynamicModelMultipleChoiceField( - queryset=DeviceRole.objects.all(), - required=False, - null_option='None', - query_params={ - 'vm_role': "True" - }, - label=_('Role'), - fetch_trigger='open' - ) - status = forms.MultipleChoiceField( - choices=VirtualMachineStatusChoices, - required=False, - widget=StaticSelectMultiple() - ) - platform_id = DynamicModelMultipleChoiceField( - queryset=Platform.objects.all(), - required=False, - null_option='None', - label=_('Platform'), - fetch_trigger='open' - ) - mac_address = forms.CharField( - required=False, - label='MAC address' - ) - has_primary_ip = forms.NullBooleanField( - required=False, - label='Has a primary IP', - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - tag = TagFilterField(model) - - -# -# VM interfaces -# - -class VMInterfaceForm(BootstrapMixin, InterfaceCommonForm, CustomFieldModelForm): - parent = DynamicModelChoiceField( - queryset=VMInterface.objects.all(), - required=False, - label='Parent interface' - ) - vlan_group = DynamicModelChoiceField( - queryset=VLANGroup.objects.all(), - required=False, - label='VLAN group' - ) - untagged_vlan = DynamicModelChoiceField( - queryset=VLAN.objects.all(), - required=False, - label='Untagged VLAN', - query_params={ - 'group_id': '$vlan_group', - } - ) - tagged_vlans = DynamicModelMultipleChoiceField( - queryset=VLAN.objects.all(), - required=False, - label='Tagged VLANs', - query_params={ - 'group_id': '$vlan_group', - } - ) - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - - class Meta: - model = VMInterface - fields = [ - 'virtual_machine', 'name', 'enabled', 'parent', 'mac_address', 'mtu', 'description', 'mode', 'tags', - 'untagged_vlan', 'tagged_vlans', - ] - widgets = { - 'virtual_machine': forms.HiddenInput(), - 'mode': StaticSelect() - } - labels = { - 'mode': '802.1Q Mode', - } - help_texts = { - 'mode': INTERFACE_MODE_HELP_TEXT, - } - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - vm_id = self.initial.get('virtual_machine') or self.data.get('virtual_machine') - - # Restrict parent interface assignment by VM - self.fields['parent'].widget.add_query_param('virtual_machine_id', vm_id) - - # Limit VLAN choices by virtual machine - self.fields['untagged_vlan'].widget.add_query_param('available_on_virtualmachine', vm_id) - self.fields['tagged_vlans'].widget.add_query_param('available_on_virtualmachine', vm_id) - - -class VMInterfaceCreateForm(BootstrapMixin, CustomFieldsMixin, InterfaceCommonForm): - model = VMInterface - virtual_machine = DynamicModelChoiceField( - queryset=VirtualMachine.objects.all() - ) - name_pattern = ExpandableNameField( - label='Name' - ) - enabled = forms.BooleanField( - required=False, - initial=True - ) - parent = DynamicModelChoiceField( - queryset=VMInterface.objects.all(), - required=False, - query_params={ - 'virtual_machine_id': '$virtual_machine', - } - ) - mac_address = forms.CharField( - required=False, - label='MAC Address' - ) - description = forms.CharField( - max_length=200, - required=False - ) - mode = forms.ChoiceField( - choices=add_blank_choice(InterfaceModeChoices), - required=False, - widget=StaticSelect(), - ) - untagged_vlan = DynamicModelChoiceField( - queryset=VLAN.objects.all(), - required=False - ) - tagged_vlans = DynamicModelMultipleChoiceField( - queryset=VLAN.objects.all(), - required=False - ) - tags = DynamicModelMultipleChoiceField( - queryset=Tag.objects.all(), - required=False - ) - field_order = ( - 'virtual_machine', 'name_pattern', 'enabled', 'parent', 'mtu', 'mac_address', 'description', 'mode', - 'untagged_vlan', 'tagged_vlans', 'tags' - ) - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - vm_id = self.initial.get('virtual_machine') or self.data.get('virtual_machine') - - # Limit VLAN choices by virtual machine - self.fields['untagged_vlan'].widget.add_query_param('available_on_virtualmachine', vm_id) - self.fields['tagged_vlans'].widget.add_query_param('available_on_virtualmachine', vm_id) - - -class VMInterfaceCSVForm(CustomFieldModelCSVForm): - virtual_machine = CSVModelChoiceField( - queryset=VirtualMachine.objects.all(), - to_field_name='name' - ) - mode = CSVChoiceField( - choices=InterfaceModeChoices, - required=False, - help_text='IEEE 802.1Q operational mode (for L2 interfaces)' - ) - - class Meta: - model = VMInterface - fields = ( - 'virtual_machine', 'name', 'enabled', 'mac_address', 'mtu', 'description', 'mode', - ) - - def clean_enabled(self): - # Make sure enabled is True when it's not included in the uploaded data - if 'enabled' not in self.data: - return True - else: - return self.cleaned_data['enabled'] - - -class VMInterfaceBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=VMInterface.objects.all(), - widget=forms.MultipleHiddenInput() - ) - virtual_machine = forms.ModelChoiceField( - queryset=VirtualMachine.objects.all(), - required=False, - disabled=True, - widget=forms.HiddenInput() - ) - parent = DynamicModelChoiceField( - queryset=VMInterface.objects.all(), - required=False - ) - enabled = forms.NullBooleanField( - required=False, - widget=BulkEditNullBooleanSelect() - ) - mtu = forms.IntegerField( - required=False, - min_value=INTERFACE_MTU_MIN, - max_value=INTERFACE_MTU_MAX, - label='MTU' - ) - description = forms.CharField( - max_length=100, - required=False - ) - mode = forms.ChoiceField( - choices=add_blank_choice(InterfaceModeChoices), - required=False, - widget=StaticSelect() - ) - untagged_vlan = DynamicModelChoiceField( - queryset=VLAN.objects.all(), - required=False - ) - tagged_vlans = DynamicModelMultipleChoiceField( - queryset=VLAN.objects.all(), - required=False - ) - - class Meta: - nullable_fields = [ - 'parent', 'mtu', 'description', - ] - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - if 'virtual_machine' in self.initial: - vm_id = self.initial.get('virtual_machine') - - # Restrict parent interface assignment by VM - self.fields['parent'].widget.add_query_param('virtual_machine_id', vm_id) - - # Limit VLAN choices by virtual machine - self.fields['untagged_vlan'].widget.add_query_param('available_on_virtualmachine', vm_id) - self.fields['tagged_vlans'].widget.add_query_param('available_on_virtualmachine', vm_id) - - else: - # See 5643 - if 'pk' in self.initial: - site = None - interfaces = VMInterface.objects.filter(pk__in=self.initial['pk']).prefetch_related( - 'virtual_machine__cluster__site' - ) - - # Check interface sites. First interface should set site, further interfaces will either continue the - # loop or reset back to no site and break the loop. - for interface in interfaces: - if site is None: - site = interface.virtual_machine.cluster.site - elif interface.virtual_machine.cluster.site is not site: - site = None - break - - if site is not None: - self.fields['untagged_vlan'].widget.add_query_param('site_id', site.pk) - self.fields['tagged_vlans'].widget.add_query_param('site_id', site.pk) - - -class VMInterfaceBulkRenameForm(BulkRenameForm): - pk = forms.ModelMultipleChoiceField( - queryset=VMInterface.objects.all(), - widget=forms.MultipleHiddenInput() - ) - - -class VMInterfaceFilterForm(BootstrapMixin, forms.Form): - model = VMInterface - field_groups = [ - ['q', 'tag'], - ['cluster_id', 'virtual_machine_id'], - ['enabled', 'mac_address'], - ] - q = forms.CharField( - required=False, - widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), - label=_('Search') - ) - cluster_id = DynamicModelMultipleChoiceField( - queryset=Cluster.objects.all(), - required=False, - label=_('Cluster'), - fetch_trigger='open' - ) - virtual_machine_id = DynamicModelMultipleChoiceField( - queryset=VirtualMachine.objects.all(), - required=False, - query_params={ - 'cluster_id': '$cluster_id' - }, - label=_('Virtual machine'), - fetch_trigger='open' - ) - enabled = forms.NullBooleanField( - required=False, - widget=StaticSelect( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) - mac_address = forms.CharField( - required=False, - label='MAC address' - ) - tag = TagFilterField(model) - - -# -# Bulk VirtualMachine component creation -# - -class VirtualMachineBulkAddComponentForm(BootstrapMixin, forms.Form): - pk = forms.ModelMultipleChoiceField( - queryset=VirtualMachine.objects.all(), - widget=forms.MultipleHiddenInput() - ) - name_pattern = ExpandableNameField( - label='Name' - ) - - def clean_tags(self): - # Because we're feeding TagField data (on the bulk edit form) to another TagField (on the model form), we - # must first convert the list of tags to a string. - return ','.join(self.cleaned_data.get('tags')) - - -class VMInterfaceBulkCreateForm( - form_from_model(VMInterface, ['enabled', 'mtu', 'description', 'tags']), - VirtualMachineBulkAddComponentForm -): - pass diff --git a/netbox/virtualization/forms/__init__.py b/netbox/virtualization/forms/__init__.py new file mode 100644 index 00000000000..00f28b852ce --- /dev/null +++ b/netbox/virtualization/forms/__init__.py @@ -0,0 +1,6 @@ +from .models import * +from .filtersets import * +from .object_create import * +from .bulk_create import * +from .bulk_edit import * +from .bulk_import import * diff --git a/netbox/virtualization/forms/bulk_create.py b/netbox/virtualization/forms/bulk_create.py new file mode 100644 index 00000000000..6cf7c0d7c5e --- /dev/null +++ b/netbox/virtualization/forms/bulk_create.py @@ -0,0 +1,30 @@ +from django import forms + +from utilities.forms import BootstrapMixin, ExpandableNameField, form_from_model +from virtualization.models import VMInterface, VirtualMachine + +__all__ = ( + 'VMInterfaceBulkCreateForm', +) + + +class VirtualMachineBulkAddComponentForm(BootstrapMixin, forms.Form): + pk = forms.ModelMultipleChoiceField( + queryset=VirtualMachine.objects.all(), + widget=forms.MultipleHiddenInput() + ) + name_pattern = ExpandableNameField( + label='Name' + ) + + def clean_tags(self): + # Because we're feeding TagField data (on the bulk edit form) to another TagField (on the model form), we + # must first convert the list of tags to a string. + return ','.join(self.cleaned_data.get('tags')) + + +class VMInterfaceBulkCreateForm( + form_from_model(VMInterface, ['enabled', 'mtu', 'description', 'tags']), + VirtualMachineBulkAddComponentForm +): + pass diff --git a/netbox/virtualization/forms/bulk_edit.py b/netbox/virtualization/forms/bulk_edit.py new file mode 100644 index 00000000000..c140fbc73e0 --- /dev/null +++ b/netbox/virtualization/forms/bulk_edit.py @@ -0,0 +1,239 @@ +from django import forms + +from dcim.choices import InterfaceModeChoices +from dcim.constants import INTERFACE_MTU_MAX, INTERFACE_MTU_MIN +from dcim.models import DeviceRole, Platform, Region, Site, SiteGroup +from extras.forms import AddRemoveTagsForm, CustomFieldModelBulkEditForm +from ipam.models import VLAN +from tenancy.models import Tenant +from utilities.forms import ( + add_blank_choice, BootstrapMixin, BulkEditNullBooleanSelect, BulkRenameForm, CommentField, DynamicModelChoiceField, + DynamicModelMultipleChoiceField, SmallTextarea, StaticSelect +) +from virtualization.choices import * +from virtualization.models import * + +__all__ = ( + 'ClusterBulkEditForm', + 'ClusterGroupBulkEditForm', + 'ClusterTypeBulkEditForm', + 'VirtualMachineBulkEditForm', + 'VMInterfaceBulkEditForm', + 'VMInterfaceBulkRenameForm', +) + + +class ClusterTypeBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=ClusterType.objects.all(), + widget=forms.MultipleHiddenInput + ) + description = forms.CharField( + max_length=200, + required=False + ) + + class Meta: + nullable_fields = ['description'] + + +class ClusterGroupBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=ClusterGroup.objects.all(), + widget=forms.MultipleHiddenInput + ) + description = forms.CharField( + max_length=200, + required=False + ) + + class Meta: + nullable_fields = ['description'] + + +class ClusterBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=Cluster.objects.all(), + widget=forms.MultipleHiddenInput() + ) + type = DynamicModelChoiceField( + queryset=ClusterType.objects.all(), + required=False + ) + group = DynamicModelChoiceField( + queryset=ClusterGroup.objects.all(), + required=False + ) + tenant = DynamicModelChoiceField( + queryset=Tenant.objects.all(), + required=False + ) + region = DynamicModelChoiceField( + queryset=Region.objects.all(), + required=False, + ) + site_group = DynamicModelChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + ) + site = DynamicModelChoiceField( + queryset=Site.objects.all(), + required=False, + query_params={ + 'region_id': '$region', + 'group_id': '$site_group', + } + ) + comments = CommentField( + widget=SmallTextarea, + label='Comments' + ) + + class Meta: + nullable_fields = [ + 'group', 'site', 'comments', 'tenant', + ] + + +class VirtualMachineBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=VirtualMachine.objects.all(), + widget=forms.MultipleHiddenInput() + ) + status = forms.ChoiceField( + choices=add_blank_choice(VirtualMachineStatusChoices), + required=False, + initial='', + widget=StaticSelect(), + ) + cluster = DynamicModelChoiceField( + queryset=Cluster.objects.all(), + required=False + ) + role = DynamicModelChoiceField( + queryset=DeviceRole.objects.filter( + vm_role=True + ), + required=False, + query_params={ + "vm_role": "True" + } + ) + tenant = DynamicModelChoiceField( + queryset=Tenant.objects.all(), + required=False + ) + platform = DynamicModelChoiceField( + queryset=Platform.objects.all(), + required=False + ) + vcpus = forms.IntegerField( + required=False, + label='vCPUs' + ) + memory = forms.IntegerField( + required=False, + label='Memory (MB)' + ) + disk = forms.IntegerField( + required=False, + label='Disk (GB)' + ) + comments = CommentField( + widget=SmallTextarea, + label='Comments' + ) + + class Meta: + nullable_fields = [ + 'role', 'tenant', 'platform', 'vcpus', 'memory', 'disk', 'comments', + ] + + +class VMInterfaceBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=VMInterface.objects.all(), + widget=forms.MultipleHiddenInput() + ) + virtual_machine = forms.ModelChoiceField( + queryset=VirtualMachine.objects.all(), + required=False, + disabled=True, + widget=forms.HiddenInput() + ) + parent = DynamicModelChoiceField( + queryset=VMInterface.objects.all(), + required=False + ) + enabled = forms.NullBooleanField( + required=False, + widget=BulkEditNullBooleanSelect() + ) + mtu = forms.IntegerField( + required=False, + min_value=INTERFACE_MTU_MIN, + max_value=INTERFACE_MTU_MAX, + label='MTU' + ) + description = forms.CharField( + max_length=100, + required=False + ) + mode = forms.ChoiceField( + choices=add_blank_choice(InterfaceModeChoices), + required=False, + widget=StaticSelect() + ) + untagged_vlan = DynamicModelChoiceField( + queryset=VLAN.objects.all(), + required=False + ) + tagged_vlans = DynamicModelMultipleChoiceField( + queryset=VLAN.objects.all(), + required=False + ) + + class Meta: + nullable_fields = [ + 'parent', 'mtu', 'description', + ] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + if 'virtual_machine' in self.initial: + vm_id = self.initial.get('virtual_machine') + + # Restrict parent interface assignment by VM + self.fields['parent'].widget.add_query_param('virtual_machine_id', vm_id) + + # Limit VLAN choices by virtual machine + self.fields['untagged_vlan'].widget.add_query_param('available_on_virtualmachine', vm_id) + self.fields['tagged_vlans'].widget.add_query_param('available_on_virtualmachine', vm_id) + + else: + # See 5643 + if 'pk' in self.initial: + site = None + interfaces = VMInterface.objects.filter(pk__in=self.initial['pk']).prefetch_related( + 'virtual_machine__cluster__site' + ) + + # Check interface sites. First interface should set site, further interfaces will either continue the + # loop or reset back to no site and break the loop. + for interface in interfaces: + if site is None: + site = interface.virtual_machine.cluster.site + elif interface.virtual_machine.cluster.site is not site: + site = None + break + + if site is not None: + self.fields['untagged_vlan'].widget.add_query_param('site_id', site.pk) + self.fields['tagged_vlans'].widget.add_query_param('site_id', site.pk) + + +class VMInterfaceBulkRenameForm(BulkRenameForm): + pk = forms.ModelMultipleChoiceField( + queryset=VMInterface.objects.all(), + widget=forms.MultipleHiddenInput() + ) diff --git a/netbox/virtualization/forms/bulk_import.py b/netbox/virtualization/forms/bulk_import.py new file mode 100644 index 00000000000..d01418aa081 --- /dev/null +++ b/netbox/virtualization/forms/bulk_import.py @@ -0,0 +1,124 @@ +from dcim.choices import InterfaceModeChoices +from dcim.models import DeviceRole, Platform, Site +from extras.forms import CustomFieldModelCSVForm +from tenancy.models import Tenant +from utilities.forms import CSVChoiceField, CSVModelChoiceField, SlugField +from virtualization.choices import * +from virtualization.models import * + +__all__ = ( + 'ClusterCSVForm', + 'ClusterGroupCSVForm', + 'ClusterTypeCSVForm', + 'VirtualMachineCSVForm', + 'VMInterfaceCSVForm', +) + + +class ClusterTypeCSVForm(CustomFieldModelCSVForm): + slug = SlugField() + + class Meta: + model = ClusterType + fields = ('name', 'slug', 'description') + + +class ClusterGroupCSVForm(CustomFieldModelCSVForm): + slug = SlugField() + + class Meta: + model = ClusterGroup + fields = ('name', 'slug', 'description') + + +class ClusterCSVForm(CustomFieldModelCSVForm): + type = CSVModelChoiceField( + queryset=ClusterType.objects.all(), + to_field_name='name', + help_text='Type of cluster' + ) + group = CSVModelChoiceField( + queryset=ClusterGroup.objects.all(), + to_field_name='name', + required=False, + help_text='Assigned cluster group' + ) + site = CSVModelChoiceField( + queryset=Site.objects.all(), + to_field_name='name', + required=False, + help_text='Assigned site' + ) + tenant = CSVModelChoiceField( + queryset=Tenant.objects.all(), + to_field_name='name', + required=False, + help_text='Assigned tenant' + ) + + class Meta: + model = Cluster + fields = ('name', 'type', 'group', 'site', 'comments') + + +class VirtualMachineCSVForm(CustomFieldModelCSVForm): + status = CSVChoiceField( + choices=VirtualMachineStatusChoices, + help_text='Operational status of device' + ) + cluster = CSVModelChoiceField( + queryset=Cluster.objects.all(), + to_field_name='name', + help_text='Assigned cluster' + ) + role = CSVModelChoiceField( + queryset=DeviceRole.objects.filter( + vm_role=True + ), + required=False, + to_field_name='name', + help_text='Functional role' + ) + tenant = CSVModelChoiceField( + queryset=Tenant.objects.all(), + required=False, + to_field_name='name', + help_text='Assigned tenant' + ) + platform = CSVModelChoiceField( + queryset=Platform.objects.all(), + required=False, + to_field_name='name', + help_text='Assigned platform' + ) + + class Meta: + model = VirtualMachine + fields = ( + 'name', 'status', 'role', 'cluster', 'tenant', 'platform', 'vcpus', 'memory', 'disk', 'comments', + ) + + +class VMInterfaceCSVForm(CustomFieldModelCSVForm): + virtual_machine = CSVModelChoiceField( + queryset=VirtualMachine.objects.all(), + to_field_name='name' + ) + mode = CSVChoiceField( + choices=InterfaceModeChoices, + required=False, + help_text='IEEE 802.1Q operational mode (for L2 interfaces)' + ) + + class Meta: + model = VMInterface + fields = ( + 'virtual_machine', 'name', 'enabled', 'mac_address', 'mtu', 'description', 'mode', + ) + + def clean_enabled(self): + # Make sure enabled is True when it's not included in the uploaded data + if 'enabled' not in self.data: + return True + else: + return self.cleaned_data['enabled'] diff --git a/netbox/virtualization/forms/filtersets.py b/netbox/virtualization/forms/filtersets.py new file mode 100644 index 00000000000..0bb5c2bd71b --- /dev/null +++ b/netbox/virtualization/forms/filtersets.py @@ -0,0 +1,237 @@ +from django import forms +from django.utils.translation import gettext as _ + +from dcim.models import DeviceRole, Platform, Region, Site, SiteGroup +from extras.forms import CustomFieldModelFilterForm, LocalConfigContextFilterForm +from tenancy.forms import TenancyFilterForm +from utilities.forms import ( + BootstrapMixin, DynamicModelMultipleChoiceField, StaticSelect, StaticSelectMultiple, TagFilterField, + BOOLEAN_WITH_BLANK_CHOICES, +) +from virtualization.choices import * +from virtualization.models import * + +__all__ = ( + 'ClusterFilterForm', + 'ClusterGroupFilterForm', + 'ClusterTypeFilterForm', + 'VirtualMachineFilterForm', + 'VMInterfaceFilterForm', +) + + +class ClusterTypeFilterForm(BootstrapMixin, CustomFieldModelFilterForm): + model = ClusterType + field_groups = [ + ['q'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + + +class ClusterGroupFilterForm(BootstrapMixin, CustomFieldModelFilterForm): + model = ClusterGroup + field_groups = [ + ['q'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + + +class ClusterFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm): + model = Cluster + field_order = [ + 'q', 'type_id', 'region_id', 'site_id', 'group_id', 'tenant_group_id', 'tenant_id', + ] + field_groups = [ + ['q', 'tag'], + ['group_id', 'type_id'], + ['region_id', 'site_group_id', 'site_id'], + ['tenant_group_id', 'tenant_id'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + type_id = DynamicModelMultipleChoiceField( + queryset=ClusterType.objects.all(), + required=False, + label=_('Type'), + fetch_trigger='open' + ) + region_id = DynamicModelMultipleChoiceField( + queryset=Region.objects.all(), + required=False, + label=_('Region'), + fetch_trigger='open' + ) + site_group_id = DynamicModelMultipleChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + label=_('Site group'), + fetch_trigger='open' + ) + site_id = DynamicModelMultipleChoiceField( + queryset=Site.objects.all(), + required=False, + null_option='None', + query_params={ + 'region_id': '$region_id', + 'site_group_id': '$site_group_id', + }, + label=_('Site'), + fetch_trigger='open' + ) + group_id = DynamicModelMultipleChoiceField( + queryset=ClusterGroup.objects.all(), + required=False, + null_option='None', + label=_('Group'), + fetch_trigger='open' + ) + tag = TagFilterField(model) + + +class VirtualMachineFilterForm( + BootstrapMixin, + LocalConfigContextFilterForm, + TenancyFilterForm, + CustomFieldModelFilterForm +): + model = VirtualMachine + field_groups = [ + ['q', 'tag'], + ['cluster_group_id', 'cluster_type_id', 'cluster_id'], + ['region_id', 'site_group_id', 'site_id'], + ['status', 'role_id', 'platform_id', 'mac_address', 'has_primary_ip', 'local_context_data'], + ['tenant_group_id', 'tenant_id'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + cluster_group_id = DynamicModelMultipleChoiceField( + queryset=ClusterGroup.objects.all(), + required=False, + null_option='None', + label=_('Cluster group'), + fetch_trigger='open' + ) + cluster_type_id = DynamicModelMultipleChoiceField( + queryset=ClusterType.objects.all(), + required=False, + null_option='None', + label=_('Cluster type'), + fetch_trigger='open' + ) + cluster_id = DynamicModelMultipleChoiceField( + queryset=Cluster.objects.all(), + required=False, + label=_('Cluster'), + fetch_trigger='open' + ) + region_id = DynamicModelMultipleChoiceField( + queryset=Region.objects.all(), + required=False, + label=_('Region'), + fetch_trigger='open' + ) + site_group_id = DynamicModelMultipleChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + label=_('Site group'), + fetch_trigger='open' + ) + site_id = DynamicModelMultipleChoiceField( + queryset=Site.objects.all(), + required=False, + null_option='None', + query_params={ + 'region_id': '$region_id', + 'group_id': '$site_group_id', + }, + label=_('Site'), + fetch_trigger='open' + ) + role_id = DynamicModelMultipleChoiceField( + queryset=DeviceRole.objects.all(), + required=False, + null_option='None', + query_params={ + 'vm_role': "True" + }, + label=_('Role'), + fetch_trigger='open' + ) + status = forms.MultipleChoiceField( + choices=VirtualMachineStatusChoices, + required=False, + widget=StaticSelectMultiple() + ) + platform_id = DynamicModelMultipleChoiceField( + queryset=Platform.objects.all(), + required=False, + null_option='None', + label=_('Platform'), + fetch_trigger='open' + ) + mac_address = forms.CharField( + required=False, + label='MAC address' + ) + has_primary_ip = forms.NullBooleanField( + required=False, + label='Has a primary IP', + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + tag = TagFilterField(model) + + +class VMInterfaceFilterForm(BootstrapMixin, forms.Form): + model = VMInterface + field_groups = [ + ['q', 'tag'], + ['cluster_id', 'virtual_machine_id'], + ['enabled', 'mac_address'], + ] + q = forms.CharField( + required=False, + widget=forms.TextInput(attrs={'placeholder': _('All Fields')}), + label=_('Search') + ) + cluster_id = DynamicModelMultipleChoiceField( + queryset=Cluster.objects.all(), + required=False, + label=_('Cluster'), + fetch_trigger='open' + ) + virtual_machine_id = DynamicModelMultipleChoiceField( + queryset=VirtualMachine.objects.all(), + required=False, + query_params={ + 'cluster_id': '$cluster_id' + }, + label=_('Virtual machine'), + fetch_trigger='open' + ) + enabled = forms.NullBooleanField( + required=False, + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + mac_address = forms.CharField( + required=False, + label='MAC address' + ) + tag = TagFilterField(model) diff --git a/netbox/virtualization/forms/models.py b/netbox/virtualization/forms/models.py new file mode 100644 index 00000000000..d66bc9f1fd3 --- /dev/null +++ b/netbox/virtualization/forms/models.py @@ -0,0 +1,324 @@ +from django import forms +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import ValidationError + +from dcim.forms.common import InterfaceCommonForm +from dcim.forms.models import INTERFACE_MODE_HELP_TEXT +from dcim.models import Device, DeviceRole, Platform, Rack, Region, Site, SiteGroup +from extras.forms import CustomFieldModelForm +from extras.models import Tag +from ipam.models import IPAddress, VLAN, VLANGroup +from tenancy.forms import TenancyForm +from utilities.forms import ( + BootstrapMixin, CommentField, ConfirmationForm, DynamicModelChoiceField, DynamicModelMultipleChoiceField, + JSONField, SlugField, StaticSelect, +) +from virtualization.models import * + +__all__ = ( + 'ClusterAddDevicesForm', + 'ClusterForm', + 'ClusterGroupForm', + 'ClusterRemoveDevicesForm', + 'ClusterTypeForm', + 'VirtualMachineForm', + 'VMInterfaceForm', +) + + +class ClusterTypeForm(BootstrapMixin, CustomFieldModelForm): + slug = SlugField() + + class Meta: + model = ClusterType + fields = [ + 'name', 'slug', 'description', + ] + + +class ClusterGroupForm(BootstrapMixin, CustomFieldModelForm): + slug = SlugField() + + class Meta: + model = ClusterGroup + fields = [ + 'name', 'slug', 'description', + ] + + +class ClusterForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): + type = DynamicModelChoiceField( + queryset=ClusterType.objects.all() + ) + group = DynamicModelChoiceField( + queryset=ClusterGroup.objects.all(), + required=False + ) + region = DynamicModelChoiceField( + queryset=Region.objects.all(), + required=False, + initial_params={ + 'sites': '$site' + } + ) + site_group = DynamicModelChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + initial_params={ + 'sites': '$site' + } + ) + site = DynamicModelChoiceField( + queryset=Site.objects.all(), + required=False, + query_params={ + 'region_id': '$region', + 'group_id': '$site_group', + } + ) + comments = CommentField() + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = Cluster + fields = ( + 'name', 'type', 'group', 'tenant', 'region', 'site_group', 'site', 'comments', 'tags', + ) + fieldsets = ( + ('Cluster', ('name', 'type', 'group', 'region', 'site_group', 'site', 'tags')), + ('Tenancy', ('tenant_group', 'tenant')), + ) + + +class ClusterAddDevicesForm(BootstrapMixin, forms.Form): + region = DynamicModelChoiceField( + queryset=Region.objects.all(), + required=False, + null_option='None' + ) + site_group = DynamicModelChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + null_option='None' + ) + site = DynamicModelChoiceField( + queryset=Site.objects.all(), + required=False, + query_params={ + 'region_id': '$region', + 'group_id': '$site_group', + } + ) + rack = DynamicModelChoiceField( + queryset=Rack.objects.all(), + required=False, + null_option='None', + query_params={ + 'site_id': '$site' + } + ) + devices = DynamicModelMultipleChoiceField( + queryset=Device.objects.all(), + query_params={ + 'site_id': '$site', + 'rack_id': '$rack', + 'cluster_id': 'null', + } + ) + + class Meta: + fields = [ + 'region', 'site', 'rack', 'devices', + ] + + def __init__(self, cluster, *args, **kwargs): + + self.cluster = cluster + + super().__init__(*args, **kwargs) + + self.fields['devices'].choices = [] + + def clean(self): + super().clean() + + # If the Cluster is assigned to a Site, all Devices must be assigned to that Site. + if self.cluster.site is not None: + for device in self.cleaned_data.get('devices', []): + if device.site != self.cluster.site: + raise ValidationError({ + 'devices': "{} belongs to a different site ({}) than the cluster ({})".format( + device, device.site, self.cluster.site + ) + }) + + +class ClusterRemoveDevicesForm(ConfirmationForm): + pk = forms.ModelMultipleChoiceField( + queryset=Device.objects.all(), + widget=forms.MultipleHiddenInput() + ) + + +class VirtualMachineForm(BootstrapMixin, TenancyForm, CustomFieldModelForm): + cluster_group = DynamicModelChoiceField( + queryset=ClusterGroup.objects.all(), + required=False, + null_option='None', + initial_params={ + 'clusters': '$cluster' + } + ) + cluster = DynamicModelChoiceField( + queryset=Cluster.objects.all(), + query_params={ + 'group_id': '$cluster_group' + } + ) + role = DynamicModelChoiceField( + queryset=DeviceRole.objects.all(), + required=False, + query_params={ + "vm_role": "True" + } + ) + platform = DynamicModelChoiceField( + queryset=Platform.objects.all(), + required=False + ) + local_context_data = JSONField( + required=False, + label='' + ) + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = VirtualMachine + fields = [ + 'name', 'status', 'cluster_group', 'cluster', 'role', 'tenant_group', 'tenant', 'platform', 'primary_ip4', + 'primary_ip6', 'vcpus', 'memory', 'disk', 'comments', 'tags', 'local_context_data', + ] + fieldsets = ( + ('Virtual Machine', ('name', 'role', 'status', 'tags')), + ('Cluster', ('cluster_group', 'cluster')), + ('Tenancy', ('tenant_group', 'tenant')), + ('Management', ('platform', 'primary_ip4', 'primary_ip6')), + ('Resources', ('vcpus', 'memory', 'disk')), + ('Config Context', ('local_context_data',)), + ) + help_texts = { + 'local_context_data': "Local config context data overwrites all sources contexts in the final rendered " + "config context", + } + widgets = { + "status": StaticSelect(), + 'primary_ip4': StaticSelect(), + 'primary_ip6': StaticSelect(), + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + if self.instance.pk: + + # Compile list of choices for primary IPv4 and IPv6 addresses + for family in [4, 6]: + ip_choices = [(None, '---------')] + + # Gather PKs of all interfaces belonging to this VM + interface_ids = self.instance.interfaces.values_list('pk', flat=True) + + # Collect interface IPs + interface_ips = IPAddress.objects.filter( + address__family=family, + assigned_object_type=ContentType.objects.get_for_model(VMInterface), + assigned_object_id__in=interface_ids + ) + if interface_ips: + ip_list = [(ip.id, f'{ip.address} ({ip.assigned_object})') for ip in interface_ips] + ip_choices.append(('Interface IPs', ip_list)) + # Collect NAT IPs + nat_ips = IPAddress.objects.prefetch_related('nat_inside').filter( + address__family=family, + nat_inside__assigned_object_type=ContentType.objects.get_for_model(VMInterface), + nat_inside__assigned_object_id__in=interface_ids + ) + if nat_ips: + ip_list = [(ip.id, f'{ip.address} (NAT)') for ip in nat_ips] + ip_choices.append(('NAT IPs', ip_list)) + self.fields['primary_ip{}'.format(family)].choices = ip_choices + + else: + + # An object that doesn't exist yet can't have any IPs assigned to it + self.fields['primary_ip4'].choices = [] + self.fields['primary_ip4'].widget.attrs['readonly'] = True + self.fields['primary_ip6'].choices = [] + self.fields['primary_ip6'].widget.attrs['readonly'] = True + + +class VMInterfaceForm(BootstrapMixin, InterfaceCommonForm, CustomFieldModelForm): + parent = DynamicModelChoiceField( + queryset=VMInterface.objects.all(), + required=False, + label='Parent interface' + ) + vlan_group = DynamicModelChoiceField( + queryset=VLANGroup.objects.all(), + required=False, + label='VLAN group' + ) + untagged_vlan = DynamicModelChoiceField( + queryset=VLAN.objects.all(), + required=False, + label='Untagged VLAN', + query_params={ + 'group_id': '$vlan_group', + } + ) + tagged_vlans = DynamicModelMultipleChoiceField( + queryset=VLAN.objects.all(), + required=False, + label='Tagged VLANs', + query_params={ + 'group_id': '$vlan_group', + } + ) + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + + class Meta: + model = VMInterface + fields = [ + 'virtual_machine', 'name', 'enabled', 'parent', 'mac_address', 'mtu', 'description', 'mode', 'tags', + 'untagged_vlan', 'tagged_vlans', + ] + widgets = { + 'virtual_machine': forms.HiddenInput(), + 'mode': StaticSelect() + } + labels = { + 'mode': '802.1Q Mode', + } + help_texts = { + 'mode': INTERFACE_MODE_HELP_TEXT, + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + vm_id = self.initial.get('virtual_machine') or self.data.get('virtual_machine') + + # Restrict parent interface assignment by VM + self.fields['parent'].widget.add_query_param('virtual_machine_id', vm_id) + + # Limit VLAN choices by virtual machine + self.fields['untagged_vlan'].widget.add_query_param('available_on_virtualmachine', vm_id) + self.fields['tagged_vlans'].widget.add_query_param('available_on_virtualmachine', vm_id) diff --git a/netbox/virtualization/forms/object_create.py b/netbox/virtualization/forms/object_create.py new file mode 100644 index 00000000000..b58fb51f840 --- /dev/null +++ b/netbox/virtualization/forms/object_create.py @@ -0,0 +1,74 @@ +from django import forms + +from dcim.choices import InterfaceModeChoices +from dcim.forms.common import InterfaceCommonForm +from extras.forms import CustomFieldsMixin +from extras.models import Tag +from ipam.models import VLAN +from utilities.forms import ( + add_blank_choice, BootstrapMixin, DynamicModelChoiceField, DynamicModelMultipleChoiceField, ExpandableNameField, + StaticSelect, +) +from virtualization.models import VMInterface, VirtualMachine + +__all__ = ( + 'VMInterfaceCreateForm', +) + + +class VMInterfaceCreateForm(BootstrapMixin, CustomFieldsMixin, InterfaceCommonForm): + model = VMInterface + virtual_machine = DynamicModelChoiceField( + queryset=VirtualMachine.objects.all() + ) + name_pattern = ExpandableNameField( + label='Name' + ) + enabled = forms.BooleanField( + required=False, + initial=True + ) + parent = DynamicModelChoiceField( + queryset=VMInterface.objects.all(), + required=False, + query_params={ + 'virtual_machine_id': '$virtual_machine', + } + ) + mac_address = forms.CharField( + required=False, + label='MAC Address' + ) + description = forms.CharField( + max_length=200, + required=False + ) + mode = forms.ChoiceField( + choices=add_blank_choice(InterfaceModeChoices), + required=False, + widget=StaticSelect(), + ) + untagged_vlan = DynamicModelChoiceField( + queryset=VLAN.objects.all(), + required=False + ) + tagged_vlans = DynamicModelMultipleChoiceField( + queryset=VLAN.objects.all(), + required=False + ) + tags = DynamicModelMultipleChoiceField( + queryset=Tag.objects.all(), + required=False + ) + field_order = ( + 'virtual_machine', 'name_pattern', 'enabled', 'parent', 'mtu', 'mac_address', 'description', 'mode', + 'untagged_vlan', 'tagged_vlans', 'tags' + ) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + vm_id = self.initial.get('virtual_machine') or self.data.get('virtual_machine') + + # Limit VLAN choices by virtual machine + self.fields['untagged_vlan'].widget.add_query_param('available_on_virtualmachine', vm_id) + self.fields['tagged_vlans'].widget.add_query_param('available_on_virtualmachine', vm_id) diff --git a/netbox/virtualization/tests/test_views.py b/netbox/virtualization/tests/test_views.py index 86be5159ff5..020c9ebc5fd 100644 --- a/netbox/virtualization/tests/test_views.py +++ b/netbox/virtualization/tests/test_views.py @@ -194,10 +194,10 @@ class VirtualMachineTestCase(ViewTestCases.PrimaryObjectViewTestCase): } cls.csv_data = ( - "name,cluster", - "Virtual Machine 4,Cluster 1", - "Virtual Machine 5,Cluster 1", - "Virtual Machine 6,Cluster 1", + "name,status,cluster", + "Virtual Machine 4,active,Cluster 1", + "Virtual Machine 5,active,Cluster 1", + "Virtual Machine 6,active,Cluster 1", ) cls.bulk_edit_data = { diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py index a8b2b8f1f9b..2294d2c38fa 100644 --- a/netbox/virtualization/views.py +++ b/netbox/virtualization/views.py @@ -506,6 +506,7 @@ class VirtualMachineBulkAddInterfaceView(generic.BulkComponentCreateView): model_form = forms.VMInterfaceForm filterset = filtersets.VirtualMachineFilterSet table = tables.VirtualMachineTable + default_return_url = 'virtualization:virtualmachine_list' def get_required_permission(self): return f'virtualization.add_vminterface' diff --git a/requirements.txt b/requirements.txt index 83873a55a82..5b9c10e8747 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,9 +1,9 @@ Django==3.2.7 -django-cors-headers==3.8.0 +django-cors-headers==3.9.0 django-debug-toolbar==3.2.2 -django-filter==2.4.0 +django-filter==21.1 django-graphiql-debug-toolbar==0.2.0 -django-mptt==0.13.3 +django-mptt==0.13.4 django-pglocks==1.0.4 django-prometheus==2.1.0 django-redis==5.0.0 @@ -18,11 +18,10 @@ gunicorn==20.1.0 Jinja2==3.0.1 Markdown==3.3.4 markdown-include==0.6.0 -mkdocs-material==7.2.6 +mkdocs-material==7.3.0 netaddr==0.8.0 Pillow==8.3.2 psycopg2-binary==2.9.1 -pycryptodome==3.10.1 PyYAML==5.4.1 svgwrite==1.4.1 tablib==3.0.0