servala-portal/src/servala/frontend/forms/service.py
Tobias Kunze fa6ac5334e
All checks were successful
Tests / test (push) Successful in 24s
Fix search field functionality
2025-06-02 10:35:27 +02:00

125 lines
4.1 KiB
Python

from django import forms
from django.db.models import Q
from django.utils.translation import gettext_lazy as _
from servala.core.models import (
CloudProvider,
ControlPlane,
Service,
ServiceCategory,
ServiceInstance,
ServiceOffering,
)
class ServiceFilterForm(forms.Form):
category = forms.ModelChoiceField(
queryset=ServiceCategory.objects.all(), required=False
)
cloud_provider = forms.ModelChoiceField(
queryset=CloudProvider.objects.all(), required=False
)
q = forms.CharField(label=_("Search"), required=False)
def filter_queryset(self, queryset):
if category := self.cleaned_data.get("category"):
queryset = queryset.filter(category=category)
if cloud_provider := self.cleaned_data.get("cloud_provider"):
queryset = queryset.filter(offerings__provider=cloud_provider)
if search := self.cleaned_data.get("q"):
queryset = queryset.filter(
Q(name__icontains=search) | Q(category__name__icontains=search)
)
return queryset
class ControlPlaneSelectForm(forms.Form):
control_plane = forms.ModelChoiceField(
queryset=ControlPlane.objects.none(),
label=_("Service Provider Zone"),
empty_label=None,
)
def __init__(self, *args, planes=None, **kwargs):
super().__init__(*args, **kwargs)
self.fields["control_plane"].queryset = planes
if planes and planes.count() == 1:
self.fields["control_plane"].initial = planes.first()
class ServiceInstanceFilterForm(forms.Form):
name = forms.CharField(required=False, label=_("Name"))
service = forms.ModelChoiceField(
queryset=Service.objects.all(), required=False, label=_("Service")
)
provider = forms.ModelChoiceField(
queryset=ServiceOffering.objects.all()
.values_list("provider", flat=True)
.distinct(),
required=False,
label=_("Provider"),
)
control_plane = forms.ModelChoiceField(
queryset=ControlPlane.objects.all(),
required=False,
label=_("Service Provider Zone"),
)
status = forms.ChoiceField(
choices=(
("active", _("Active")),
("deleted", _("Deleted")),
),
required=False,
label=_("Status"),
)
def filter_queryset(self, queryset):
if self.is_valid():
data = self.cleaned_data
if data.get("name"):
queryset = queryset.filter(name__icontains=data["name"])
if data.get("service"):
queryset = queryset.filter(
context__service_definition__service=data["service"]
)
if data.get("provider"):
queryset = queryset.filter(
context__service_offering__provider=data["provider"]
)
if data.get("control_plane"):
queryset = queryset.filter(context__control_plane=data["control_plane"])
status = data.get("status")
if status == "active":
queryset = queryset.filter(is_deleted=False)
elif status == "deleted":
queryset = queryset.filter(is_deleted=True)
return queryset
class ServiceInstanceDeleteForm(forms.ModelForm):
name = forms.CharField(
label=_("Instance Name"),
max_length=63,
widget=forms.TextInput(attrs={"class": "form-control"}),
)
def __init__(self, *args, **kwargs):
kwargs["initial"] = {"name": ""}
super().__init__(*args, **kwargs)
self.fields["name"].help_text = _(
"To confirm deletion, please type the instance name: <strong>{instance_name}</strong>"
).format(instance_name=self.instance.name)
def clean_name(self):
entered_name = self.cleaned_data.get("name")
if entered_name != self.instance.name:
raise forms.ValidationError(
_(
"The entered name does not match the instance name. Deletion not confirmed."
)
)
return entered_name
class Meta:
model = ServiceInstance
fields = ("name",)