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