Display/CSS fixes #88
3 changed files with 71 additions and 58 deletions
|
@ -1,4 +1,5 @@
|
||||||
from django import forms
|
from django import forms
|
||||||
|
from django.db.models import Q
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
from servala.core.models import (
|
from servala.core.models import (
|
||||||
|
@ -18,13 +19,17 @@ class ServiceFilterForm(forms.Form):
|
||||||
cloud_provider = forms.ModelChoiceField(
|
cloud_provider = forms.ModelChoiceField(
|
||||||
queryset=CloudProvider.objects.all(), required=False
|
queryset=CloudProvider.objects.all(), required=False
|
||||||
)
|
)
|
||||||
q = forms.CharField(required=False)
|
q = forms.CharField(label=_("Search"), required=False)
|
||||||
|
|
||||||
def filter_queryset(self, queryset):
|
def filter_queryset(self, queryset):
|
||||||
if category := self.cleaned_data.get("category"):
|
if category := self.cleaned_data.get("category"):
|
||||||
queryset = queryset.filter(category=category)
|
queryset = queryset.filter(category=category)
|
||||||
if cloud_provider := self.cleaned_data.get("cloud_provider"):
|
if cloud_provider := self.cleaned_data.get("cloud_provider"):
|
||||||
queryset = queryset.filter(offerings__provider=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
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -28,38 +28,42 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% for offering in service.offerings.all %}
|
<div class="row">
|
||||||
<div class="card col-6 col-lg-3 col-md-4">
|
{% for offering in service.offerings.all %}
|
||||||
<div class="card-header d-flex align-items-center">
|
<div class="col-6 col-lg-3 col-md-4">
|
||||||
{% if offering.provider.logo %}
|
<div class="card">
|
||||||
<img src="{{ offering.provider.logo.url }}"
|
<div class="card-header d-flex align-items-center">
|
||||||
alt="{{ offering.provider.name }}"
|
{% if offering.provider.logo %}
|
||||||
class="me-3"
|
<img src="{{ offering.provider.logo.url }}"
|
||||||
style="max-width: 48px;
|
alt="{{ offering.provider.name }}"
|
||||||
max-height: 48px">
|
class="me-3"
|
||||||
{% endif %}
|
style="max-width: 48px;
|
||||||
<div class="d-flex flex-column">
|
max-height: 48px">
|
||||||
<h4 class="mb-0">{{ offering.provider.name }}</h4>
|
{% endif %}
|
||||||
|
<div class="d-flex flex-column">
|
||||||
|
<h4 class="mb-0">{{ offering.provider.name }}</h4>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
{% if offering.description %}
|
||||||
|
<p class="card-text">{{ offering.description }}</p>
|
||||||
|
{% elif offering.provider.description %}
|
||||||
|
<p class="card-text">{{ offering.provider.description }}</p>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
<div class="card-footer d-flex justify-content-between">
|
||||||
|
<span></span>
|
||||||
|
<a href="offering/{{ offering.pk }}/" class="btn btn-light-primary">{% translate "Read More" %}</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body">
|
{% empty %}
|
||||||
{% if offering.description %}
|
<div class="card">
|
||||||
<p class="card-text">{{ offering.description }}</p>
|
<div class="card-body">
|
||||||
{% elif offering.provider.description %}
|
<p>{% translate "No offerings found." %}</p>
|
||||||
<p class="card-text">{{ offering.provider.description }}</p>
|
</div>
|
||||||
{% endif %}
|
|
||||||
</div>
|
</div>
|
||||||
<div class="card-footer d-flex justify-content-between">
|
{% endfor %}
|
||||||
<span></span>
|
</div>
|
||||||
<a href="offering/{{ offering.pk }}/" class="btn btn-light-primary">{% translate "Read More" %}</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% empty %}
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-body">
|
|
||||||
<p>{% translate "No offerings found." %}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endfor %}
|
|
||||||
</section>
|
</section>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|
|
@ -16,36 +16,40 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% for service in services %}
|
<div class="row">
|
||||||
<div class="card col-6 col-lg-3 col-md-4">
|
{% for service in services %}
|
||||||
<div class="card-header d-flex align-items-center">
|
<div class="col-6 col-lg-3 col-md-4">
|
||||||
{% if service.logo %}
|
<div class="card">
|
||||||
<img src="{{ service.logo.url }}"
|
<div class="card-header d-flex align-items-center">
|
||||||
alt="{{ service.name }}"
|
{% if service.logo %}
|
||||||
class="me-3"
|
<img src="{{ service.logo.url }}"
|
||||||
style="max-width: 48px;
|
alt="{{ service.name }}"
|
||||||
max-height: 48px">
|
class="me-3"
|
||||||
{% endif %}
|
style="max-width: 48px;
|
||||||
<div class="d-flex flex-column">
|
max-height: 48px">
|
||||||
<h4 class="mb-0">{{ service.name }}</h4>
|
{% endif %}
|
||||||
<small class="text-muted">{{ service.category }}</small>
|
<div class="d-flex flex-column">
|
||||||
|
<h4 class="mb-0">{{ service.name }}</h4>
|
||||||
|
<small class="text-muted">{{ service.category }}</small>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
{% if service.description %}<p class="card-text">{{ service.description }}</p>{% endif %}
|
||||||
|
</div>
|
||||||
|
<div class="card-footer d-flex justify-content-between">
|
||||||
|
<span></span>
|
||||||
|
<a href="{{ service.slug }}/" class="btn btn-light-primary">{% translate "Read More" %}</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body">
|
{% empty %}
|
||||||
{% if service.description %}<p class="card-text">{{ service.description }}</p>{% endif %}
|
<div class="card">
|
||||||
|
<div class="card-body">
|
||||||
|
<p>{% translate "No services found." %}</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-footer d-flex justify-content-between">
|
{% endfor %}
|
||||||
<span></span>
|
</div>
|
||||||
<a href="{{ service.slug }}/" class="btn btn-light-primary">{% translate "Read More" %}</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% empty %}
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-body">
|
|
||||||
<p>{% translate "No services found." %}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endfor %}
|
|
||||||
</section>
|
</section>
|
||||||
<script src="{% static "js/autosubmit.js" %}" defer></script>
|
<script src="{% static "js/autosubmit.js" %}" defer></script>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue