From ce8c12800c153d6156614f79cf0b34d6e1c69972 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Tue, 25 Feb 2025 17:02:01 +0100 Subject: [PATCH] homepage listing --- .../migrations/0005_service_is_featured.py | 18 + ...0006_cloudprovider_is_featured_and_more.py | 23 ++ hub/services/models.py | 3 + hub/services/static/css/servala-main.css | 6 + hub/services/static/img/header-logo.png | Bin 6260 -> 22073 bytes hub/services/static/img/header-logo1.png | Bin 0 -> 6260 bytes hub/services/templates/services/base.html | 10 +- hub/services/templates/services/homepage.html | 382 ++---------------- hub/services/views/pages.py | 19 +- 9 files changed, 115 insertions(+), 346 deletions(-) create mode 100644 hub/services/migrations/0005_service_is_featured.py create mode 100644 hub/services/migrations/0006_cloudprovider_is_featured_and_more.py create mode 100644 hub/services/static/img/header-logo1.png diff --git a/hub/services/migrations/0005_service_is_featured.py b/hub/services/migrations/0005_service_is_featured.py new file mode 100644 index 0000000..e21e2b0 --- /dev/null +++ b/hub/services/migrations/0005_service_is_featured.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.5 on 2025-02-25 15:38 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("services", "0004_lead_message"), + ] + + operations = [ + migrations.AddField( + model_name="service", + name="is_featured", + field=models.BooleanField(default=False), + ), + ] diff --git a/hub/services/migrations/0006_cloudprovider_is_featured_and_more.py b/hub/services/migrations/0006_cloudprovider_is_featured_and_more.py new file mode 100644 index 0000000..f623bbf --- /dev/null +++ b/hub/services/migrations/0006_cloudprovider_is_featured_and_more.py @@ -0,0 +1,23 @@ +# Generated by Django 5.1.5 on 2025-02-25 15:54 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("services", "0005_service_is_featured"), + ] + + operations = [ + migrations.AddField( + model_name="cloudprovider", + name="is_featured", + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name="consultingpartner", + name="is_featured", + field=models.BooleanField(default=False), + ), + ] diff --git a/hub/services/models.py b/hub/services/models.py index 23bb904..5ac188c 100644 --- a/hub/services/models.py +++ b/hub/services/models.py @@ -55,6 +55,7 @@ class CloudProvider(models.Model): null=True, blank=True, ) + is_featured = models.BooleanField(default=False) def __str__(self): return self.name @@ -105,6 +106,7 @@ class Service(models.Model): ) categories = models.ManyToManyField(Category, related_name="services") features = ProseEditorField() + is_featured = models.BooleanField(default=False) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) @@ -139,6 +141,7 @@ class ConsultingPartner(models.Model): cloud_providers = models.ManyToManyField( CloudProvider, related_name="consulting_partners", blank=True ) + is_featured = models.BooleanField(default=False) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) diff --git a/hub/services/static/css/servala-main.css b/hub/services/static/css/servala-main.css index e838744..60b13e8 100644 --- a/hub/services/static/css/servala-main.css +++ b/hub/services/static/css/servala-main.css @@ -12076,6 +12076,12 @@ a.btn:focus { margin-bottom: 16px } +.card__image__wide { + width: 150px; + height: 80px; + margin-bottom: 16px +} + .card__title { font-size: 1.5rem; font-weight: 600; diff --git a/hub/services/static/img/header-logo.png b/hub/services/static/img/header-logo.png index f42ff7aca3a22d23feaeb3e08854de05284f4511..671861248cd0594cd264913394b4645baf2aa5c6 100644 GIT binary patch literal 22073 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 Wt|=47R5SLJNNjV`9#d}VneczYAB3*} literal 6260 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
+ {% for service in featured_services %}
- + {{ service.name }} logo
-

PostgreSQL

-

Database

+

{{ service.name }}

+ {% for category in service.categories.all|slice:":1" %} +

{{ category.name }}

+ {% endfor %}
-

PostgreSQL is a powerful, open source object-relational database system that uses and extends the - SQL language.

+

{{ service.description|safe|truncatewords:15 }}

-
-
-
- -
-
-

Aws

-

Database

-
-
-

PostgreSQL is a powerful, open source object-relational database system that uses and extends the - SQL language.

-
-
-
-
-
-
- -
-
-

Microsoft Azure

-

Database

-
-
-

PostgreSQL is a powerful, open source object-relational database system that uses and extends the - SQL language.

-
-
-
-
-
-
- -
-
-

Google Cloud

-

Database

-
-
-

PostgreSQL is a powerful, open source object-relational database system that uses and extends the - SQL language.

-
-
+ {% empty %} +
+

No featured services available at the moment.

+ {% endfor %}
@@ -117,69 +79,32 @@
-
-
-
- +
+
+ {% for provider in featured_providers %} +
+
+
+ {{ provider.name }} logo +
+ +
+

{{ provider.description|safe|truncatewords:15 }}

+
+
-
-

PostgreSQL

-

Database

-
-
-

PostgreSQL is a powerful, open source object-relational database system that uses and extends the - SQL language.

-
-
-
-
-
-
- -
-
-

Aws

-

Database

-
-
-

PostgreSQL is a powerful, open source object-relational database system that uses and extends the - SQL language.

-
-
-
-
-
-
- -
-
-

Microsoft Azure

-

Database

-
-
-

PostgreSQL is a powerful, open source object-relational database system that uses and extends the - SQL language.

-
-
-
-
-
-
- -
-
-

Google Cloud

-

Database

-
-
-

PostgreSQL is a powerful, open source object-relational database system that uses and extends the - SQL language.

+ {% empty %} +
+

No featured provider available at the moment.

+ {% endfor %}
@@ -202,71 +127,30 @@
+ {% for partner in featured_partners %}
-
- +
+ {{ partner.name }} logo
-

PostgreSQL

-

Database

+

{{ partner.name }}

-

PostgreSQL is a powerful, open source object-relational database system that uses and extends the - SQL language.

+

{{ partner.description|safe|truncatewords:15 }}

-
-
-
- -
-
-

Aws

-

Database

-
-
-

PostgreSQL is a powerful, open source object-relational database system that uses and extends the - SQL language.

-
-
-
-
-
-
- -
-
-

Microsoft Azure

-

Database

-
-
-

PostgreSQL is a powerful, open source object-relational database system that uses and extends the - SQL language.

-
-
-
-
-
-
- -
-
-

Google Cloud

-

Database

-
-
-

PostgreSQL is a powerful, open source object-relational database system that uses and extends the - SQL language.

-
-
+ {% empty %} +
+

No featured partner available at the moment.

+ {% endfor %}
@@ -298,186 +182,4 @@
-
-
-
-

Frequenty Asked Questions

-
-

Still need more information? Read our FAQ or contact us to learn more about the Servala.

-
-
-
-
-
- -
-
-

The Upbound - Marketplace is a central hub for finding Crossplane packages with verified content and auto-generated - documentation. Upbound curates a set of Official Providers which are actively maintained and thoroughly - tested to help you discover the best building blocks for your internal cloud platform.

-
-
- -
-
- -
-
-

The Upbound - Marketplace is a central hub for finding Crossplane packages with verified content and auto-generated - documentation. Upbound curates a set of Official Providers which are actively maintained and thoroughly - tested to help you discover the best building blocks for your internal cloud platform.

-
-
- -
-
- -
-
-

The Upbound - Marketplace is a central hub for finding Crossplane packages with verified content and auto-generated - documentation. Upbound curates a set of Official Providers which are actively maintained and thoroughly - tested to help you discover the best building blocks for your internal cloud platform.

-
-
- -
-
- -
-
-

The Upbound - Marketplace is a central hub for finding Crossplane packages with verified content and auto-generated - documentation. Upbound curates a set of Official Providers which are actively maintained and thoroughly - tested to help you discover the best building blocks for your internal cloud platform.

-
-
- -
-
- -
-
-

The Upbound - Marketplace is a central hub for finding Crossplane packages with verified content and auto-generated - documentation. Upbound curates a set of Official Providers which are actively maintained and thoroughly - tested to help you discover the best building blocks for your internal cloud platform.

-
-
- -
-
- -
-
-

The Upbound - Marketplace is a central hub for finding Crossplane packages with verified content and auto-generated - documentation. Upbound curates a set of Official Providers which are actively maintained and thoroughly - tested to help you discover the best building blocks for your internal cloud platform.

-
-
- -
-
- -
-
-

The Upbound - Marketplace is a central hub for finding Crossplane packages with verified content and auto-generated - documentation. Upbound curates a set of Official Providers which are actively maintained and thoroughly - tested to help you discover the best building blocks for your internal cloud platform.

-
-
-
-
-
{% endblock %} \ No newline at end of file diff --git a/hub/services/views/pages.py b/hub/services/views/pages.py index abed6e9..f1cc360 100644 --- a/hub/services/views/pages.py +++ b/hub/services/views/pages.py @@ -1,5 +1,22 @@ from django.shortcuts import render +from hub.services.models import Service, CloudProvider, ConsultingPartner def homepage(request): - return render(request, "services/homepage.html") + featured_services = Service.objects.filter(is_featured=True).prefetch_related( + "categories" + )[:4] + + featured_providers = CloudProvider.objects.filter(is_featured=True)[:4] + + featured_partners = ConsultingPartner.objects.filter( + is_featured=True + ).prefetch_related("services", "cloud_providers")[:4] + + context = { + "featured_services": featured_services, + "featured_providers": featured_providers, + "featured_partners": featured_partners, + } + + return render(request, "services/homepage.html", context)