From 0cc105d6f8c124144afaa972b15dc547fc9182d7 Mon Sep 17 00:00:00 2001 From: Frederico Sequeira <frederico.sequeira@ext.ec.europa.eu> Date: Thu, 14 Nov 2024 17:05:22 +0000 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=A6=BA=20Add=20validations=20to=20mai?= =?UTF-8?q?ntenance=20validation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- netbox_sys_plugin/forms.py | 47 ++++++++++++++++++++++++++++--------- netbox_sys_plugin/models.py | 2 +- 2 files changed, 37 insertions(+), 12 deletions(-) diff --git a/netbox_sys_plugin/forms.py b/netbox_sys_plugin/forms.py index 9cfec6b..d8dd189 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 1f06ae2..e3c1bf8 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', ), ], -- GitLab From 659317ea239b8c89630760d2f6e11eec65675619 Mon Sep 17 00:00:00 2001 From: Frederico Sequeira <frederico.sequeira@ext.ec.europa.eu> Date: Fri, 15 Nov 2024 09:23:55 +0000 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=9A=B8=20Improve=20templates=20and=20?= =?UTF-8?q?links=20and=20update=20doc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/model/netbox_sys_virtual_machine_maintenance.md | 2 -- netbox_sys_plugin/tables.py | 2 +- .../netbox_sys_plugin/virtualmachinemaintenance.html | 4 ++++ .../templates/netbox_sys_plugin/vm_vmmaintenance_table.html | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/model/netbox_sys_virtual_machine_maintenance.md b/docs/model/netbox_sys_virtual_machine_maintenance.md index af8e42d..c8b181d 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/tables.py b/netbox_sys_plugin/tables.py index 1f7c996..f3cb63b 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 fa90c2a..4642c0b 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 99c7a2e..3e20ac4 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> -- GitLab