add external links

This commit is contained in:
Tobias Brunner 2025-01-28 11:00:15 +01:00
parent 7b21d9d612
commit 8ed39690f1
No known key found for this signature in database
5 changed files with 98 additions and 1 deletions

View file

@ -8,6 +8,7 @@ from .models import (
Currency,
Plan,
PlanPrice,
ExternalLink,
)
@ -33,6 +34,13 @@ class PlanInline(admin.StackedInline):
return formset
class ExternalLinkInline(admin.TabularInline):
model = ExternalLink
extra = 1
fields = ("description", "url", "order")
ordering = ("order", "description")
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
list_display = ("name", "slug", "parent", "order")
@ -73,7 +81,7 @@ class ServiceAdmin(admin.ModelAdmin):
filter_horizontal = ("categories", "consulting_partners")
search_fields = ("name", "description", "slug")
prepopulated_fields = {"slug": ("name",)}
inlines = [PlanInline]
inlines = [PlanInline, ExternalLinkInline]
def logo_preview(self, obj):
if obj.logo:

View file

@ -0,0 +1,46 @@
# Generated by Django 5.1.5 on 2025-01-28 09:58
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("services", "0011_lead_plan"),
]
operations = [
migrations.CreateModel(
name="ExternalLink",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("url", models.URLField()),
("description", models.CharField(max_length=200)),
("order", models.IntegerField(default=0)),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
(
"service",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="external_links",
to="services.service",
),
),
],
options={
"verbose_name": "External Link",
"verbose_name_plural": "External Links",
"ordering": ["order", "description"],
},
),
]

View file

@ -205,3 +205,33 @@ class Lead(models.Model):
def __str__(self):
return f"{self.name} - {self.company} ({self.service})"
class ExternalLink(models.Model):
service = models.ForeignKey(
Service, on_delete=models.CASCADE, related_name="external_links"
)
url = models.URLField()
description = models.CharField(max_length=200)
order = models.IntegerField(default=0)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
ordering = ["order", "description"]
verbose_name = "External Link"
verbose_name_plural = "External Links"
def __str__(self):
return f"{self.description} ({self.url})"
def clean(self):
from django.core.validators import URLValidator
from django.core.exceptions import ValidationError
# Validate URL
validate = URLValidator()
try:
validate(self.url)
except ValidationError:
raise ValidationError({"url": "Enter a valid URL."})

View file

@ -5,6 +5,7 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Servala - The Cloud Native Services Hub</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.2/font/bootstrap-icons.css">
<link rel="stylesheet" type="text/css" href='{% static "css/bootstrap.min.css" %}'>
<style>
.rich-text-content {

View file

@ -32,6 +32,18 @@
<h5>Features</h5>
<p>{{ service.features|safe }}</p>
{% if service.external_links.exists %}
<h5>External Resources</h5>
{% for link in service.external_links.all %}
<a href="{{ link.url }}" target="_blank" rel="noopener noreferrer"
class="list-group-item list-group-item-action d-flex justify-content-between align-items-center">
{{ link.description }}
<i class="bi bi-box-arrow-up-right"></i>
</a>
{% endfor %}
{% endif %}
</div>
</div>