Add filter form to service list
This commit is contained in:
parent
8484fef8f2
commit
aadeb58ec5
5 changed files with 65 additions and 1 deletions
|
@ -38,6 +38,7 @@ class Organization(ServalaModelMixin, models.Model):
|
||||||
class urls(urlman.Urls):
|
class urls(urlman.Urls):
|
||||||
base = "/org/{self.slug}/"
|
base = "/org/{self.slug}/"
|
||||||
details = "{base}details/"
|
details = "{base}details/"
|
||||||
|
services = "{base}services/"
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def slug(self):
|
def slug(self):
|
||||||
|
|
22
src/servala/frontend/forms/service.py
Normal file
22
src/servala/frontend/forms/service.py
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
from django import forms
|
||||||
|
|
||||||
|
from servala.core.models import CloudProvider, ServiceCategory
|
||||||
|
|
||||||
|
|
||||||
|
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(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(
|
||||||
|
service_offerings__control_planes__cloud_provider=cloud_provider
|
||||||
|
)
|
||||||
|
return queryset
|
|
@ -1,6 +1,8 @@
|
||||||
from django.utils.functional import cached_property
|
from django.utils.functional import cached_property
|
||||||
from django.views.generic import UpdateView
|
from django.views.generic import UpdateView
|
||||||
from rules.contrib.views import AutoPermissionRequiredMixin
|
from rules.contrib.views import AutoPermissionRequiredMixin, PermissionRequiredMixin
|
||||||
|
|
||||||
|
from servala.core.models import Organization
|
||||||
|
|
||||||
|
|
||||||
class HtmxUpdateView(AutoPermissionRequiredMixin, UpdateView):
|
class HtmxUpdateView(AutoPermissionRequiredMixin, UpdateView):
|
||||||
|
|
31
src/servala/frontend/views/service.py
Normal file
31
src/servala/frontend/views/service.py
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
from django.utils.functional import cached_property
|
||||||
|
from django.views.generic import ListView
|
||||||
|
|
||||||
|
from servala.core.models import Service
|
||||||
|
from servala.frontend.forms.service import ServiceFilterForm
|
||||||
|
from servala.frontend.views.mixins import OrganizationViewMixin
|
||||||
|
|
||||||
|
|
||||||
|
class OrganizationServicesView(OrganizationViewMixin, ListView):
|
||||||
|
"""View to display all available services for an organization."""
|
||||||
|
|
||||||
|
template_name = "frontend/organizations/services.html"
|
||||||
|
context_object_name = "services"
|
||||||
|
model = Service
|
||||||
|
permission_type = "view"
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
"""Return all services."""
|
||||||
|
services = Service.objects.all().select_related("category")
|
||||||
|
if self.filter_form.is_valid():
|
||||||
|
services = self.filter_form.filter_queryset(services)
|
||||||
|
return services
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def filter_form(self):
|
||||||
|
return ServiceFilterForm(data=self.request.GET or None)
|
||||||
|
|
||||||
|
def get_context_data(self, **kwargs):
|
||||||
|
context = super().get_context_data(**kwargs)
|
||||||
|
context["filter_form"] = self.filter_form
|
||||||
|
return context
|
|
@ -1,3 +1,11 @@
|
||||||
.form-group.d-inline {
|
.form-group.d-inline {
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.search-form .form-body>.row {
|
||||||
|
display: flex;
|
||||||
|
&>.col-12 {
|
||||||
|
width: auto;
|
||||||
|
flex-grow: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue