diff --git a/docs/model/netbox_sys_virtual_machine_maintenance.md b/docs/model/netbox_sys_virtual_machine_maintenance.md index af8e42d7c98bcb19c53cff4f432310e67e5b5cdb..c8b181d006279dd1e04ae5fb3f972f76a340fdb0 100644 --- a/docs/model/netbox_sys_virtual_machine_maintenance.md +++ b/docs/model/netbox_sys_virtual_machine_maintenance.md @@ -7,7 +7,5 @@ | id | Big (8 byte) integer | Unique ID | | assigned_object_type_id | Big (8 byte) integer | virtual machine type ID | | assigned_object_id | Big (8 byte) integer | virtual machine unique ID | -| virtual_machine_maintenance_window_name | String | Virtual Machine maintenance window name | | virtual_machine_maintenance_window | String | A string representing a day of the week and a time of the day, 0 = Sunday , 1 = monday | -| virtual_machine_maintenance_window_description | String | Virtual Machine maintenance window description | diff --git a/netbox_sys_plugin/forms.py b/netbox_sys_plugin/forms.py index 9cfec6bf9f766bbd16eaec910277555dee994318..d8dd18941c58355ad705765cd8a48bb9ade67502 100644 --- a/netbox_sys_plugin/forms.py +++ b/netbox_sys_plugin/forms.py @@ -1,6 +1,7 @@ """Forms definitions""" from virtualization.models import VirtualMachine +from django.contrib.contenttypes.models import ContentType from django.utils.translation import gettext_lazy as _ from django.core.exceptions import ValidationError from django import forms @@ -10,23 +11,19 @@ from netbox.forms import ( NetBoxModelFilterSetForm, ) from utilities.forms.fields import DynamicModelChoiceField -from utilities.forms import widgets from .models import VirtualMachineMaintenance -DatePicker = widgets.DatePicker - class VmMaitenanceForm(NetBoxModelForm): """ GUI form to add or edit a VM Maitenance. """ - virtual_machine = DynamicModelChoiceField( queryset=VirtualMachine.objects.none(), required=True, label="Virtual Machine" ) maintenance_window = forms.CharField( - max_length=500, min_length=1, required=True, label="Maintenance Window", + max_length=7, min_length=1, required=True, label="Maintenance Window", help_text=mark_safe( - "<b>*Note:</b> Day of the week and a time of the day, 0 = Sunday , 1 = monday.", + "<b>*Note:</b> Day of the week and a time of the day, 0 = Sunday , 1 = monday. Format 0-00:00", ), ) @@ -37,11 +34,20 @@ class VmMaitenanceForm(NetBoxModelForm): if instance: if isinstance(instance.assigned_object, VirtualMachine): initial["virtual_machine"] = instance.assigned_object - kwargs["initial"] = initial super().__init__(*args, **kwargs) - assigned_vms = VirtualMachineMaintenance.objects.values_list('assigned_object_id',flat=True) + if instance: + current_vm_id = instance.assigned_object.id if instance.assigned_object else None + else: + current_vm_id = None + + + assigned_vms = VirtualMachineMaintenance.objects.filter( + assigned_object_type=ContentType.objects.get_for_model(VirtualMachine) + #).values_list('assigned_object_id', flat=True) + ).exclude(assigned_object_id=current_vm_id).values_list('assigned_object_id', flat=True) + self.fields['virtual_machine'].queryset = VirtualMachine.objects.exclude(id__in=assigned_vms) class Meta: @@ -49,6 +55,23 @@ class VmMaitenanceForm(NetBoxModelForm): model = VirtualMachineMaintenance fields = ( 'virtual_machine','maintenance_window') + def clean_virtual_machine(self): + + virtual_machine = self.cleaned_data.get("virtual_machine") + + virtual_machine_ct = ContentType.objects.get_for_model(VirtualMachine) + + if VirtualMachineMaintenance.objects.filter( + assigned_object_type=virtual_machine_ct, + assigned_object_id=virtual_machine.id + ).exclude(pk=self.instance.pk).exists(): + raise ValidationError( + "The virtual Machine already has a maintenance windows associates" + ) + return virtual_machine + + + def clean(self): """ Validates form inputs before submitting: @@ -60,17 +83,19 @@ class VmMaitenanceForm(NetBoxModelForm): virtual_machine = self.cleaned_data.get("virtual_machine") - #Check if at least one VM is assigned + #Check if VM is assigned corretly if (not virtual_machine): raise ValidationError( - {"__all__": "Maintenance windows needs to be assigned to a VM. Check if VM already has a maintenance window"}, + {"__all__": "Virtual Machine already with maintenance window"}, ) + + + def save(self, *args, **kwargs): # Set assigned object self.instance.assigned_object = ( self.cleaned_data.get("virtual_machine") ) - return super().save(*args, **kwargs) class VmMaintenanceFilterForm(NetBoxModelFilterSetForm): diff --git a/netbox_sys_plugin/models.py b/netbox_sys_plugin/models.py index 1f06ae2ecd8df14f09dba87a2dd2401a48aa44c1..e3c1bf8b5ec802ed18169f5a5086c536bddcc425 100644 --- a/netbox_sys_plugin/models.py +++ b/netbox_sys_plugin/models.py @@ -23,7 +23,7 @@ class VirtualMachineMaintenance(NetBoxModel): max_length=200, validators=[ RegexValidator( - regex='(^([0-1])-[0-1]?[0-9]|2[0-3]):[0-5][0-9]$', + regex='(^([0-6])-[0-1]?[0-9]|2[0-3]):[0-5][0-9]$', message='Incorrect maintenance window format', ), ], diff --git a/netbox_sys_plugin/tables.py b/netbox_sys_plugin/tables.py index 1f7c9961e7ad4dcae9bb00b6c7c7403757d2632c..f3cb63b24888010a9f48ba51b6968d6a1fd325a2 100644 --- a/netbox_sys_plugin/tables.py +++ b/netbox_sys_plugin/tables.py @@ -10,7 +10,7 @@ class VmMaintenanceTable(NetBoxTable): pk = columns.ToggleColumn() id = tables.Column( - linkify=True, + linkify=False, ) assigned_object = tables.Column( diff --git a/netbox_sys_plugin/templates/netbox_sys_plugin/virtualmachinemaintenance.html b/netbox_sys_plugin/templates/netbox_sys_plugin/virtualmachinemaintenance.html index fa90c2a60c07b5b48dd5ea53945581416d120e39..4642c0b74b4a438cdf912a37927834ef9b8afa00 100644 --- a/netbox_sys_plugin/templates/netbox_sys_plugin/virtualmachinemaintenance.html +++ b/netbox_sys_plugin/templates/netbox_sys_plugin/virtualmachinemaintenance.html @@ -1,5 +1,9 @@ {% extends 'generic/object.html' %} +{% block title%} +{{ object.assigned_object }} Maintenance Information +{% endblock title%} + {% block content %} <div class="row mb-3"> <div class="col col-md-6"> diff --git a/netbox_sys_plugin/templates/netbox_sys_plugin/vm_vmmaintenance_table.html b/netbox_sys_plugin/templates/netbox_sys_plugin/vm_vmmaintenance_table.html index 99c7a2e83691cdc966a12c22d6474f776442f0f9..3e20ac47e651495d4b9e057d3dbb61b5c610d8f4 100644 --- a/netbox_sys_plugin/templates/netbox_sys_plugin/vm_vmmaintenance_table.html +++ b/netbox_sys_plugin/templates/netbox_sys_plugin/vm_vmmaintenance_table.html @@ -2,7 +2,7 @@ <div class="row mb-3"> <div class="col col-md-12"> <div class="card"> - + <h5 class="card-header">Maintenance Information</h5> <div class="card-body"> <table class="table table-responsive"> <th scope="row">ID</th>