Enable creating services from templates in the UI

This commit is contained in:
jeremystretch
2022-01-13 10:32:42 -05:00
parent 97e7ef9a3f
commit bb5ded2039
4 changed files with 115 additions and 1 deletions

View File

@@ -31,6 +31,7 @@ __all__ = (
'RoleForm',
'RouteTargetForm',
'ServiceForm',
'ServiceCreateForm',
'ServiceTemplateForm',
'VLANForm',
'VLANGroupForm',
@@ -880,3 +881,36 @@ class ServiceForm(CustomFieldModelForm):
'protocol': StaticSelect(),
'ipaddresses': StaticSelectMultiple(),
}
class ServiceCreateForm(ServiceForm):
service_template = DynamicModelChoiceField(
queryset=ServiceTemplate.objects.all(),
required=False
)
class Meta(ServiceForm.Meta):
fields = [
'device', 'virtual_machine', 'service_template', 'name', 'protocol', 'ports', 'ipaddresses', 'description',
'tags',
]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# Fields which may be populated from a ServiceTemplate are not required
for field in ('name', 'protocol', 'ports'):
self.fields[field].required = False
del(self.fields[field].widget.attrs['required'])
def clean(self):
if self.cleaned_data['service_template']:
# Create a new Service from the specified template
service_template = self.cleaned_data['service_template']
self.cleaned_data['name'] = service_template.name
self.cleaned_data['protocol'] = service_template.protocol
self.cleaned_data['ports'] = service_template.ports
if not self.cleaned_data['description']:
self.cleaned_data['description'] = service_template.description
elif not all(self.cleaned_data[f] for f in ('name', 'protocol', 'ports')):
raise forms.ValidationError("Must specify name, protocol, and port(s) if not using a service template.")

View File

@@ -176,7 +176,7 @@ urlpatterns = [
# Services
path('services/', views.ServiceListView.as_view(), name='service_list'),
path('services/add/', views.ServiceEditView.as_view(), name='service_add'),
path('services/add/', views.ServiceCreateView.as_view(), name='service_add'),
path('services/import/', views.ServiceBulkImportView.as_view(), name='service_import'),
path('services/edit/', views.ServiceBulkEditView.as_view(), name='service_bulk_edit'),
path('services/delete/', views.ServiceBulkDeleteView.as_view(), name='service_bulk_delete'),

View File

@@ -1087,6 +1087,12 @@ class ServiceView(generic.ObjectView):
queryset = Service.objects.prefetch_related('ipaddresses')
class ServiceCreateView(generic.ObjectEditView):
queryset = Service.objects.all()
model_form = forms.ServiceCreateForm
template_name = 'ipam/service_create.html'
class ServiceEditView(generic.ObjectEditView):
queryset = Service.objects.prefetch_related('ipaddresses')
model_form = forms.ServiceForm