mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-26 09:16:10 -06:00
12591 base views and forms
This commit is contained in:
parent
69b7fb723d
commit
718293d0b3
@ -16,6 +16,7 @@ from .models import *
|
|||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
'ConfigContextFilterSet',
|
'ConfigContextFilterSet',
|
||||||
|
'ConfigRevisionFilterSet',
|
||||||
'ConfigTemplateFilterSet',
|
'ConfigTemplateFilterSet',
|
||||||
'ContentTypeFilterSet',
|
'ContentTypeFilterSet',
|
||||||
'CustomFieldFilterSet',
|
'CustomFieldFilterSet',
|
||||||
@ -557,3 +558,27 @@ class ContentTypeFilterSet(django_filters.FilterSet):
|
|||||||
Q(app_label__icontains=value) |
|
Q(app_label__icontains=value) |
|
||||||
Q(model__icontains=value)
|
Q(model__icontains=value)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# ConfigRevisions
|
||||||
|
#
|
||||||
|
|
||||||
|
class ConfigRevisionFilterSet(BaseFilterSet):
|
||||||
|
q = django_filters.CharFilter(
|
||||||
|
method='search',
|
||||||
|
label=_('Search'),
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = ConfigRevision
|
||||||
|
fields = [
|
||||||
|
'id',
|
||||||
|
]
|
||||||
|
|
||||||
|
def search(self, queryset, name, value):
|
||||||
|
if not value.strip():
|
||||||
|
return queryset
|
||||||
|
return queryset.filter(
|
||||||
|
Q(comment__icontains=value)
|
||||||
|
)
|
||||||
|
@ -4,5 +4,4 @@ from .bulk_edit import *
|
|||||||
from .bulk_import import *
|
from .bulk_import import *
|
||||||
from .misc import *
|
from .misc import *
|
||||||
from .mixins import *
|
from .mixins import *
|
||||||
from .config import *
|
|
||||||
from .scripts import *
|
from .scripts import *
|
||||||
|
@ -9,6 +9,7 @@ from utilities.forms.widgets import BulkEditNullBooleanSelect
|
|||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
'ConfigContextBulkEditForm',
|
'ConfigContextBulkEditForm',
|
||||||
|
'ConfigRevisionBulkEditForm',
|
||||||
'ConfigTemplateBulkEditForm',
|
'ConfigTemplateBulkEditForm',
|
||||||
'CustomFieldBulkEditForm',
|
'CustomFieldBulkEditForm',
|
||||||
'CustomLinkBulkEditForm',
|
'CustomLinkBulkEditForm',
|
||||||
@ -20,6 +21,38 @@ __all__ = (
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class ConfigRevisionBulkEditForm(BulkEditForm):
|
||||||
|
pk = forms.ModelMultipleChoiceField(
|
||||||
|
queryset=CustomField.objects.all(),
|
||||||
|
widget=forms.MultipleHiddenInput
|
||||||
|
)
|
||||||
|
group_name = forms.CharField(
|
||||||
|
required=False
|
||||||
|
)
|
||||||
|
description = forms.CharField(
|
||||||
|
required=False
|
||||||
|
)
|
||||||
|
required = forms.NullBooleanField(
|
||||||
|
required=False,
|
||||||
|
widget=BulkEditNullBooleanSelect()
|
||||||
|
)
|
||||||
|
weight = forms.IntegerField(
|
||||||
|
required=False
|
||||||
|
)
|
||||||
|
ui_visibility = forms.ChoiceField(
|
||||||
|
label=_("UI visibility"),
|
||||||
|
choices=add_blank_choice(CustomFieldVisibilityChoices),
|
||||||
|
required=False,
|
||||||
|
initial=''
|
||||||
|
)
|
||||||
|
is_cloneable = forms.NullBooleanField(
|
||||||
|
required=False,
|
||||||
|
widget=BulkEditNullBooleanSelect()
|
||||||
|
)
|
||||||
|
|
||||||
|
nullable_fields = ('group_name', 'description',)
|
||||||
|
|
||||||
|
|
||||||
class CustomFieldBulkEditForm(BulkEditForm):
|
class CustomFieldBulkEditForm(BulkEditForm):
|
||||||
pk = forms.ModelMultipleChoiceField(
|
pk = forms.ModelMultipleChoiceField(
|
||||||
queryset=CustomField.objects.all(),
|
queryset=CustomField.objects.all(),
|
||||||
|
@ -12,6 +12,7 @@ from utilities.forms import CSVModelForm
|
|||||||
from utilities.forms.fields import CSVChoiceField, CSVContentTypeField, CSVMultipleContentTypeField, SlugField
|
from utilities.forms.fields import CSVChoiceField, CSVContentTypeField, CSVMultipleContentTypeField, SlugField
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
|
'ConfigRevisionImportForm',
|
||||||
'ConfigTemplateImportForm',
|
'ConfigTemplateImportForm',
|
||||||
'CustomFieldImportForm',
|
'CustomFieldImportForm',
|
||||||
'CustomLinkImportForm',
|
'CustomLinkImportForm',
|
||||||
@ -23,6 +24,41 @@ __all__ = (
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class ConfigRevisionImportForm(CSVModelForm):
|
||||||
|
content_types = CSVMultipleContentTypeField(
|
||||||
|
queryset=ContentType.objects.all(),
|
||||||
|
limit_choices_to=FeatureQuery('custom_fields'),
|
||||||
|
help_text=_("One or more assigned object types")
|
||||||
|
)
|
||||||
|
type = CSVChoiceField(
|
||||||
|
choices=CustomFieldTypeChoices,
|
||||||
|
help_text=_('Field data type (e.g. text, integer, etc.)')
|
||||||
|
)
|
||||||
|
object_type = CSVContentTypeField(
|
||||||
|
queryset=ContentType.objects.all(),
|
||||||
|
limit_choices_to=FeatureQuery('custom_fields'),
|
||||||
|
required=False,
|
||||||
|
help_text=_("Object type (for object or multi-object fields)")
|
||||||
|
)
|
||||||
|
choices = SimpleArrayField(
|
||||||
|
base_field=forms.CharField(),
|
||||||
|
required=False,
|
||||||
|
help_text=_('Comma-separated list of field choices')
|
||||||
|
)
|
||||||
|
ui_visibility = CSVChoiceField(
|
||||||
|
choices=CustomFieldVisibilityChoices,
|
||||||
|
help_text=_('How the custom field is displayed in the user interface')
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = CustomField
|
||||||
|
fields = (
|
||||||
|
'name', 'label', 'group_name', 'type', 'content_types', 'object_type', 'required', 'description',
|
||||||
|
'search_weight', 'filter_logic', 'default', 'choices', 'weight', 'validation_minimum', 'validation_maximum',
|
||||||
|
'validation_regex', 'ui_visibility', 'is_cloneable',
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class CustomFieldImportForm(CSVModelForm):
|
class CustomFieldImportForm(CSVModelForm):
|
||||||
content_types = CSVMultipleContentTypeField(
|
content_types = CSVMultipleContentTypeField(
|
||||||
queryset=ContentType.objects.all(),
|
queryset=ContentType.objects.all(),
|
||||||
|
@ -18,6 +18,7 @@ from .mixins import SavedFiltersMixin
|
|||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
'ConfigContextFilterForm',
|
'ConfigContextFilterForm',
|
||||||
|
'ConfigRevisionFilterForm',
|
||||||
'ConfigTemplateFilterForm',
|
'ConfigTemplateFilterForm',
|
||||||
'CustomFieldFilterForm',
|
'CustomFieldFilterForm',
|
||||||
'CustomLinkFilterForm',
|
'CustomLinkFilterForm',
|
||||||
@ -444,3 +445,9 @@ class ObjectChangeFilterForm(SavedFiltersMixin, FilterForm):
|
|||||||
api_url='/api/extras/content-types/',
|
api_url='/api/extras/content-types/',
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class ConfigRevisionFilterForm(SavedFiltersMixin, FilterForm):
|
||||||
|
fieldsets = (
|
||||||
|
(None, ('q', 'filter_id')),
|
||||||
|
)
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import json
|
import json
|
||||||
|
|
||||||
from django import forms
|
from django import forms
|
||||||
|
from django.conf import settings
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from django.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
from django.utils.translation import gettext as _
|
from django.utils.translation import gettext as _
|
||||||
@ -20,6 +21,7 @@ from utilities.forms.fields import (
|
|||||||
)
|
)
|
||||||
from virtualization.models import Cluster, ClusterGroup, ClusterType
|
from virtualization.models import Cluster, ClusterGroup, ClusterType
|
||||||
|
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
'ConfigContextForm',
|
'ConfigContextForm',
|
||||||
'ConfigRevisionForm',
|
'ConfigRevisionForm',
|
||||||
@ -400,11 +402,13 @@ class FormMetaclass(forms.models.ModelFormMetaclass):
|
|||||||
return super().__new__(mcs, name, bases, attrs)
|
return super().__new__(mcs, name, bases, attrs)
|
||||||
|
|
||||||
|
|
||||||
class ConfigRevisionForm(forms.BaseModelForm, metaclass=FormMetaclass):
|
class ConfigRevisionForm(BootstrapMixin, forms.ModelForm, metaclass=FormMetaclass):
|
||||||
"""
|
"""
|
||||||
Form for creating a new ConfigRevision.
|
Form for creating a new ConfigRevision.
|
||||||
"""
|
"""
|
||||||
class Meta:
|
class Meta:
|
||||||
|
model = ConfigRevision
|
||||||
|
fields = ['comment', ]
|
||||||
widgets = {
|
widgets = {
|
||||||
'comment': forms.Textarea(),
|
'comment': forms.Textarea(),
|
||||||
}
|
}
|
||||||
|
@ -619,6 +619,9 @@ class ConfigRevision(models.Model):
|
|||||||
return self.data[item]
|
return self.data[item]
|
||||||
return super().__getattribute__(item)
|
return super().__getattribute__(item)
|
||||||
|
|
||||||
|
def get_absolute_url(self):
|
||||||
|
return reverse('extras:configrevision', args=[self.pk])
|
||||||
|
|
||||||
def activate(self):
|
def activate(self):
|
||||||
"""
|
"""
|
||||||
Cache the configuration data.
|
Cache the configuration data.
|
||||||
|
@ -9,6 +9,7 @@ from .template_code import *
|
|||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
'ConfigContextTable',
|
'ConfigContextTable',
|
||||||
|
'ConfigRevisionTable',
|
||||||
'ConfigTemplateTable',
|
'ConfigTemplateTable',
|
||||||
'CustomFieldTable',
|
'CustomFieldTable',
|
||||||
'CustomLinkTable',
|
'CustomLinkTable',
|
||||||
@ -31,6 +32,20 @@ IMAGEATTACHMENT_IMAGE = '''
|
|||||||
'''
|
'''
|
||||||
|
|
||||||
|
|
||||||
|
class ConfigRevisionTable(NetBoxTable):
|
||||||
|
is_active = columns.BooleanColumn()
|
||||||
|
actions = columns.ActionsColumn(
|
||||||
|
actions=('edit', 'delete'),
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta(NetBoxTable.Meta):
|
||||||
|
model = ConfigRevision
|
||||||
|
fields = (
|
||||||
|
'pk', 'id', 'is_active', 'created', 'comment',
|
||||||
|
)
|
||||||
|
default_columns = ('pk', 'id', 'is_active', 'created', 'comment')
|
||||||
|
|
||||||
|
|
||||||
class CustomFieldTable(NetBoxTable):
|
class CustomFieldTable(NetBoxTable):
|
||||||
name = tables.Column(
|
name = tables.Column(
|
||||||
linkify=True
|
linkify=True
|
||||||
|
@ -117,7 +117,10 @@ urlpatterns = [
|
|||||||
path('render/markdown/', views.RenderMarkdownView.as_view(), name="render_markdown"),
|
path('render/markdown/', views.RenderMarkdownView.as_view(), name="render_markdown"),
|
||||||
|
|
||||||
# Config Revision
|
# Config Revision
|
||||||
path('config-revision/', views.ConfigRevisionView.as_view(), name='configrevision'),
|
path('config-revision/', views.ConfigRevisionListView.as_view(), name='configrevision'),
|
||||||
path('config-revision/add/', views.ConfigRevisionEditView.as_view(), name='configrevision_add'),
|
path('config-revision/add/', views.ConfigRevisionEditView.as_view(), name='configrevision_add'),
|
||||||
path('config-revision/<int:pk>/edit/', views.ConfigRevisionEditView.as_view(), name='configrevision_edit'),
|
# path('custom-revision/import/', views.ConfigRevisionBulkImportView.as_view(), name='configrevision_import'),
|
||||||
|
# path('config-revision/edit/', views.ConfigRevisionBulkEditView.as_view(), name='configrevision_bulk_edit'),
|
||||||
|
path('config-revision/delete/', views.ConfigRevisionBulkDeleteView.as_view(), name='configrevision_bulk_delete'),
|
||||||
|
path('config-revision/<int:pk>/', include(get_model_urls('extras', 'configrevision'))),
|
||||||
]
|
]
|
||||||
|
@ -1195,21 +1195,43 @@ class RenderMarkdownView(View):
|
|||||||
# Config Revision
|
# Config Revision
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
|
class ConfigRevisionListView(generic.ObjectListView):
|
||||||
|
queryset = ConfigRevision.objects.all()
|
||||||
|
filterset = filtersets.ConfigRevisionFilterSet
|
||||||
|
filterset_form = forms.ConfigRevisionFilterForm
|
||||||
|
table = tables.ConfigRevisionTable
|
||||||
|
|
||||||
|
|
||||||
@register_model_view(ConfigRevision)
|
@register_model_view(ConfigRevision)
|
||||||
class ConfigRevisionView(generic.ObjectView):
|
class ConfigRevisionView(generic.ObjectView):
|
||||||
queryset = ConfigRevision.objects.all()
|
queryset = ConfigRevision.objects.all()
|
||||||
|
|
||||||
def get(self, request, **kwargs):
|
|
||||||
instance = ConfigRevision.objects.last()
|
|
||||||
|
|
||||||
return render(request, self.get_template_name(), {
|
|
||||||
'object': instance,
|
|
||||||
'tab': self.tab,
|
|
||||||
**self.get_extra_context(request, instance),
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
@register_model_view(ConfigRevision, 'edit')
|
@register_model_view(ConfigRevision, 'edit')
|
||||||
class ConfigRevisionEditView(generic.ObjectEditView):
|
class ConfigRevisionEditView(generic.ObjectEditView):
|
||||||
queryset = ConfigRevision.objects.all()
|
queryset = ConfigRevision.objects.all()
|
||||||
form = forms.ConfigRevisionForm
|
form = forms.ConfigRevisionForm
|
||||||
|
|
||||||
|
|
||||||
|
@register_model_view(ConfigRevision, 'delete')
|
||||||
|
class ConfigRevisionDeleteView(generic.ObjectDeleteView):
|
||||||
|
queryset = ConfigRevision.objects.all()
|
||||||
|
|
||||||
|
|
||||||
|
class ConfigRevisionBulkImportView(generic.BulkImportView):
|
||||||
|
queryset = ConfigRevision.objects.all()
|
||||||
|
model_form = forms.ConfigRevisionImportForm
|
||||||
|
|
||||||
|
|
||||||
|
class ConfigRevisionBulkEditView(generic.BulkEditView):
|
||||||
|
queryset = ConfigRevision.objects.all()
|
||||||
|
filterset = filtersets.ConfigRevisionFilterSet
|
||||||
|
table = tables.ConfigRevisionTable
|
||||||
|
form = forms.ConfigRevisionBulkEditForm
|
||||||
|
|
||||||
|
|
||||||
|
class ConfigRevisionBulkDeleteView(generic.BulkDeleteView):
|
||||||
|
queryset = ConfigRevision.objects.all()
|
||||||
|
filterset = filtersets.ConfigRevisionFilterSet
|
||||||
|
table = tables.ConfigRevisionTable
|
||||||
|
Loading…
Reference in New Issue
Block a user