content: from django import forms
  from django.utils.translation import gettext_lazy as _
  
  from extras.choices import *
  from extras.models import *
  from netbox.events import get_event_type_choices
  from netbox.forms import NetBoxModelBulkEditForm
  from netbox.forms.mixins import ChangelogMessageMixin
  from utilities.forms import BulkEditForm, add_blank_choice
  from utilities.forms.fields import ColorField, CommentField, DynamicModelChoiceField
  from utilities.forms.rendering import FieldSet
  from utilities.forms.widgets import BulkEditNullBooleanSelect
  
  __all__ = (
      'ConfigContextBulkEditForm',
      'ConfigContextProfileBulkEditForm',
      'ConfigTemplateBulkEditForm',
      'CustomFieldBulkEditForm',
      'CustomFieldChoiceSetBulkEditForm',
      'CustomLinkBulkEditForm',
      'EventRuleBulkEditForm',
      'ExportTemplateBulkEditForm',
      'ImageAttachmentBulkEditForm',
      'JournalEntryBulkEditForm',
      'NotificationGroupBulkEditForm',
      'SavedFilterBulkEditForm',
      'TableConfigBulkEditForm',
      'TagBulkEditForm',
      'WebhookBulkEditForm',
  )
  
  
  class CustomFieldBulkEditForm(ChangelogMessageMixin, BulkEditForm):
      pk = forms.ModelMultipleChoiceField(
          queryset=CustomField.objects.all(),
          widget=forms.MultipleHiddenInput
      )
      group_name = forms.CharField(
          label=_('Group name'),
          required=False
      )
      description = forms.CharField(
          label=_('Description'),
          required=False
      )
      required = forms.NullBooleanField(
          label=_('Required'),
          required=False,
          widget=BulkEditNullBooleanSelect()
      )
      unique = forms.NullBooleanField(
          label=_('Must be unique'),
          required=False,
          widget=BulkEditNullBooleanSelect()
      )
      weight = forms.IntegerField(
          label=_('Weight'),
          required=False
      )
      choice_set = DynamicModelChoiceField(
          queryset=CustomFieldChoiceSet.objects.all(),
          required=False
      )
      ui_visible = forms.ChoiceField(
          label=_("UI visible"),
          choices=add_blank_choice(CustomFieldUIVisibleChoices),
          required=False
      )
      ui_editable = forms.ChoiceField(
          label=_("UI editable"),
          choices=add_blank_choice(CustomFieldUIEditableChoices),
          required=False
      )
      is_cloneable = forms.NullBooleanField(
          label=_('Is cloneable'),
          required=False,
          widget=BulkEditNullBooleanSelect()
      )
      validation_minimum = forms.DecimalField(
          label=_('Minimum value'),
          required=False,
      )
      validation_maximum = forms.DecimalField(
          label=_('Maximum value'),
          required=False,
      )
      validation_regex = forms.CharField(
          label=_('Validation regex'),
          required=False
      )
      comments = CommentField()
  
      fieldsets = (
          FieldSet('group_name', 'description', 'weight', 'required', 'unique', 'choice_set', name=_('Attributes')),
          FieldSet('ui_visible', 'ui_editable', 'is_cloneable', name=_('Behavior')),
          FieldSet('validation_minimum', 'validation_maximum', 'validation_regex', name=_('Validation')),
      )
      nullable_fields = ('group_name', 'description', 'choice_set')
  
  
  class CustomFieldChoiceSetBulkEditForm(ChangelogMessageMixin, BulkEditForm):
      pk = forms.ModelMultipleChoiceField(
          queryset=CustomFieldChoiceSet.objects.all(),
          widget=forms.MultipleHiddenInput
      )
      base_choices = forms.ChoiceField(
          choices=add_blank_choice(CustomFieldChoiceSetBaseChoices),
          required=False
      )
      description = forms.CharField(
          required=False
      )
      order_alphabetically = forms.NullBooleanField(
          required=False,
          widget=BulkEditNullBooleanSelect()
      )
  
      nullable_fields = ('base_choices', 'description')
  
  
  class CustomLinkBulkEditForm(ChangelogMessageMixin, BulkEditForm):
      pk = forms.ModelMultipleChoiceField(
          queryset=CustomLink.objects.all(),
          widget=forms.MultipleHiddenInput
      )
      enabled = forms.NullBooleanField(
          label=_('Enabled'),
          required=False,
          widget=BulkEditNullBooleanSelect()
      )
      new_window = forms.NullBooleanField(
          label=_('New window'),
          required=False,
          widget=BulkEditNullBooleanSelect()
      )
      weight = forms.IntegerField(
          label=_('Weight'),
          required=False
      )
      button_class = forms.ChoiceField(
          label=_('Button class'),
          choices=add_blank_choice(CustomLinkButtonClassChoices),
          required=False
      )
  
  
  class ExportTemplateBulkEditForm(ChangelogMessageMixin, BulkEditForm):
      pk = forms.ModelMultipleChoiceField(
          queryset=ExportTemplate.objects.all(),
          widget=forms.MultipleHiddenInput
      )
      description = forms.CharField(
          label=_('Description'),
          max_length=200,
          required=False
      )
      mime_type = forms.CharField(
          label=_('MIME type'),
          max_length=50,
          required=False
      )
      file_name = forms.CharField(
          label=_('File name'),
          required=False
      )
      file_extension = forms.CharField(
          label=_('File extension'),
          max_length=15,
          required=False
      )
      as_attachment = forms.NullBooleanField(
          label=_('As attachment'),
          required=False,
          widget=BulkEditNullBooleanSelect()
      )
  
      nullable_fields = ('description', 'mime_type', 'file_name', 'file_extension')
  
  
  class SavedFilterBulkEditForm(ChangelogMessageMixin, BulkEditForm):
      pk = forms.ModelMultipleChoiceField(
          queryset=SavedFilter.objects.all(),
          widget=forms.MultipleHiddenInput
      )
      description = forms.CharField(
          label=_('Description'),
          max_length=200,
          required=False
      )
      weight = forms.IntegerField(
          label=_('Weight'),
          required=False
      )
      enabled = forms.NullBooleanField(
          label=_('Enabled'),
          required=False,
          widget=BulkEditNullBooleanSelect()
      )
      shared = forms.NullBooleanField(
          label=_('Shared'),
          required=False,
          widget=BulkEditNullBooleanSelect()
      )
  
      nullable_fields = ('description',)
  
  
  class TableConfigBulkEditForm(BulkEditForm):
      pk = forms.ModelMultipleChoiceField(
          queryset=TableConfig.objects.all(),
          widget=forms.MultipleHiddenInput
      )
      description = forms.CharField(
          label=_('Description'),
          max_length=200,
          required=False
      )
      weight = forms.IntegerField(
          label=_('Weight'),
          required=False
      )
      enabled = forms.NullBooleanField(
          label=_('Enabled'),
          required=False,
          widget=BulkEditNullBooleanSelect()
      )
      shared = forms.NullBooleanField(
          label=_('Shared'),
          required=False,
          widget=BulkEditNullBooleanSelect()
      )
  
      nullable_fields = ('description',)
  
  
  class WebhookBulkEditForm(NetBoxModelBulkEditForm):
      model = Webhook
  
      pk = forms.ModelMultipleChoiceField(
          queryset=Webhook.objects.all(),
          widget=forms.MultipleHiddenInput
      )
      description = forms.CharField(
          label=_('Description'),
          max_length=200,
          required=False
      )
      http_method = forms.ChoiceField(
          choices=add_blank_choice(WebhookHttpMethodChoices),
          required=False,
          label=_('HTTP method')
      )
      payload_url = forms.CharField(
          required=False,
          label=_('Payload URL')
      )
      ssl_verification = forms.NullBooleanField(
          required=False,
          widget=BulkEditNullBooleanSelect(),
          label=_('SSL verification')
      )
      secret = forms.CharField(
          label=_('Secret'),
          required=False
      )
      ca_file_path = forms.CharField(
          required=False,
          label=_('CA file path')
      )
  
      nullable_fields = ('secret', 'ca_file_path')
  
  
  class EventRuleBulkEditForm(NetBoxModelBulkEditForm):
      model = EventRule
  
      pk = forms.ModelMultipleChoiceField(
          queryset=EventRule.objects.all(),
          widget=forms.MultipleHiddenInput
      )
      enabled = forms.NullBooleanField(
          label=_('Enabled'),
          required=False,
          widget=BulkEditNullBooleanSelect()
      )
      event_types = forms.MultipleChoiceField(
          choices=get_event_type_choices(),
          required=False,
          label=_('Event types')
      )
      description = forms.CharField(
          label=_('Description'),
          max_length=200,
          required=False
      )
  
      nullable_fields = ('description', 'conditions')
  
  
  class TagBulkEditForm(ChangelogMessageMixin, BulkEditForm):
      pk = forms.ModelMultipleChoiceField(
          queryset=Tag.objects.all(),
          widget=forms.MultipleHiddenInput
      )
      color = ColorField(
          label=_('Color'),
          required=False
      )
      description = forms.CharField(
          label=_('Description'),
          max_length=200,
          required=False
      )
      weight = forms.IntegerField(
          label=_('Weight'),
          required=False
      )
  
      nullable_fields = ('description',)
  
  
  class ConfigContextProfileBulkEditForm(NetBoxModelBulkEditForm):
      pk = forms.ModelMultipleChoiceField(
          queryset=ConfigContextProfile.objects.all(),
          widget=forms.MultipleHiddenInput
      )
      description = forms.CharField(
          label=_('Description'),
          required=False,
          max_length=100
      )
      comments = CommentField()
  
      model = ConfigContextProfile
      fieldsets = (
          FieldSet('description',),
      )
      nullable_fields = ('description',)
  
  
  class ConfigContextBulkEditForm(ChangelogMessageMixin, BulkEditForm):
      pk = forms.ModelMultipleChoiceField(
          queryset=ConfigContext.objects.all(),
          widget=forms.MultipleHiddenInput
      )
      weight = forms.IntegerField(
          label=_('Weight'),
          required=False,
          min_value=0
      )
      profile = DynamicModelChoiceField(
          queryset=ConfigContextProfile.objects.all(),
          required=False
      )
      is_active = forms.NullBooleanField(
          label=_('Is active'),
          required=False,
          widget=BulkEditNullBooleanSelect()
      )
      description = forms.CharField(
          label=_('Description'),
          required=False,
          max_length=100
      )
  
      fieldsets = (
          FieldSet('weight', 'profile', 'is_active', 'description'),
      )
      nullable_fields = ('profile', 'description')
  
  
  class ConfigTemplateBulkEditForm(ChangelogMessageMixin, BulkEditForm):
      pk = forms.ModelMultipleChoiceField(
          queryset=ConfigTemplate.objects.all(),
          widget=forms.MultipleHiddenInput
      )
      description = forms.CharField(
          label=_('Description'),
          max_length=200,
          required=False
      )
      mime_type = forms.CharField(
          label=_('MIME type'),
          max_length=50,
          required=False
      )
      file_name = forms.CharField(
          label=_('File name'),
          required=False
      )
      file_extension = forms.CharField(
          label=_('File extension'),
          max_length=15,
          required=False
      )
      as_attachment = forms.NullBooleanField(
          label=_('As attachment'),
          required=False,
          widget=BulkEditNullBooleanSelect()
      )
      auto_sync_enabled = forms.NullBooleanField(
          label=_('Auto sync enabled'),
          required=False,
          widget=BulkEditNullBooleanSelect()
      )
      nullable_fields = ('description', 'mime_type', 'file_name', 'file_extension', 'auto_sync_enabled',)
  
  
  class ImageAttachmentBulkEditForm(ChangelogMessageMixin, BulkEditForm):
      pk = forms.ModelMultipleChoiceField(
          queryset=ImageAttachment.objects.all(),
          widget=forms.MultipleHiddenInput
      )
      description = forms.CharField(
          label=_('Description'),
          max_length=200,
          required=False
      )
  
  
  class JournalEntryBulkEditForm(ChangelogMessageMixin, BulkEditForm):
      pk = forms.ModelMultipleChoiceField(
          queryset=JournalEntry.objects.all(),
          widget=forms.MultipleHiddenInput
      )
      kind = forms.ChoiceField(
          label=_('Kind'),
          choices=add_blank_choice(JournalEntryKindChoices),
          required=False
      )
      comments = CommentField()
  
  
  class NotificationGroupBulkEditForm(ChangelogMessageMixin, BulkEditForm):
      pk = forms.ModelMultipleChoiceField(
          queryset=NotificationGroup.objects.all(),
          widget=forms.MultipleHiddenInput
      )
      description = forms.CharField(
          label=_('Description'),
          max_length=200,
          required=False
      )
  
      nullable_fields = ('description',)
  