untested and unused json-ld code
This commit is contained in:
parent
cd65a149e5
commit
be473f903e
1 changed files with 228 additions and 0 deletions
228
hub/services/templatetags/json_ld_tags.py
Normal file
228
hub/services/templatetags/json_ld_tags.py
Normal file
|
@ -0,0 +1,228 @@
|
|||
# hub/services/templatetags/json_ld_tags.py
|
||||
from django import template
|
||||
from django.urls import resolve
|
||||
from django.utils.safestring import mark_safe
|
||||
import json
|
||||
|
||||
register = template.Library()
|
||||
|
||||
|
||||
@register.simple_tag(takes_context=True)
|
||||
def json_ld_structured_data(context):
|
||||
"""
|
||||
Generates appropriate JSON-LD structured data based on the current page.
|
||||
"""
|
||||
request = context["request"]
|
||||
current_url = request.path
|
||||
resolved_view = resolve(current_url)
|
||||
view_name = resolved_view.url_name
|
||||
|
||||
# Base URL for building absolute URLs
|
||||
base_url = request.build_absolute_uri("/").rstrip("/")
|
||||
|
||||
# Default organization data (for Servala)
|
||||
organization_data = {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Organization",
|
||||
"name": "Servala",
|
||||
"url": base_url,
|
||||
"logo": f"{base_url}/static/img/header-logo.png",
|
||||
"contactPoint": {
|
||||
"@type": "ContactPoint",
|
||||
"telephone": "+41 44 545 53 00",
|
||||
"email": "hi@serva.la",
|
||||
"contactType": "Customer Support",
|
||||
},
|
||||
"address": {
|
||||
"@type": "PostalAddress",
|
||||
"streetAddress": "Neugasse 10",
|
||||
"addressLocality": "Zurich",
|
||||
"postalCode": "8005",
|
||||
"addressCountry": "CH",
|
||||
},
|
||||
}
|
||||
|
||||
# Handle different page types
|
||||
if view_name == "homepage":
|
||||
data = {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "WebSite",
|
||||
"name": "Servala - The Cloud Native Service Hub",
|
||||
"url": base_url,
|
||||
"description": "Servala connects businesses, developers, and cloud service providers on one unique hub with secure, scalable, and easy-to-use cloud-native services.",
|
||||
"potentialAction": {
|
||||
"@type": "SearchAction",
|
||||
"target": f"{base_url}/services/?search={{search_term_string}}",
|
||||
"query-input": "required name=search_term_string",
|
||||
},
|
||||
}
|
||||
|
||||
elif view_name == "service_list":
|
||||
data = {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "CollectionPage",
|
||||
"name": "Cloud Services - Servala",
|
||||
"url": f"{base_url}/services/",
|
||||
"description": "Explore all available cloud services on Servala, with new services added regularly.",
|
||||
"isPartOf": {"@type": "WebSite", "name": "Servala", "url": base_url},
|
||||
}
|
||||
|
||||
elif view_name == "provider_list":
|
||||
data = {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "CollectionPage",
|
||||
"name": "Cloud Providers - Servala",
|
||||
"url": f"{base_url}/providers/",
|
||||
"description": "Discover cloud providers on Servala offering reliable infrastructure and innovative cloud computing solutions.",
|
||||
"isPartOf": {"@type": "WebSite", "name": "Servala", "url": base_url},
|
||||
}
|
||||
|
||||
elif view_name == "partner_list":
|
||||
data = {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "CollectionPage",
|
||||
"name": "Consulting Partners - Servala",
|
||||
"url": f"{base_url}/partners/",
|
||||
"description": "Browse our network of expert consulting partners on Servala who can help implement and optimize cloud services.",
|
||||
"isPartOf": {"@type": "WebSite", "name": "Servala", "url": base_url},
|
||||
}
|
||||
|
||||
elif view_name == "service_detail" and "service" in context:
|
||||
service = context["service"]
|
||||
service_url = request.build_absolute_uri()
|
||||
|
||||
data = {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Product",
|
||||
"name": service.name,
|
||||
"description": service.description,
|
||||
"url": service_url,
|
||||
"category": "Cloud Service",
|
||||
}
|
||||
|
||||
# Add image if available
|
||||
if hasattr(service, "logo") and service.logo:
|
||||
data["image"] = request.build_absolute_uri(service.logo.url)
|
||||
|
||||
# Add offerings if available
|
||||
if hasattr(service, "offerings") and service.offerings.exists():
|
||||
data["offers"] = {
|
||||
"@type": "AggregateOffer",
|
||||
"availability": "https://schema.org/InStock",
|
||||
"offerCount": service.offerings.count(),
|
||||
}
|
||||
|
||||
elif view_name == "provider_detail" and "provider" in context:
|
||||
provider = context["provider"]
|
||||
provider_url = request.build_absolute_uri()
|
||||
|
||||
data = {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Organization",
|
||||
"name": provider.name,
|
||||
"description": provider.description,
|
||||
"url": provider_url,
|
||||
}
|
||||
|
||||
# Add image if available
|
||||
if hasattr(provider, "logo") and provider.logo:
|
||||
data["logo"] = request.build_absolute_uri(provider.logo.url)
|
||||
|
||||
# Add contact information if available
|
||||
contact_point = {"@type": "ContactPoint", "contactType": "Customer Support"}
|
||||
|
||||
if hasattr(provider, "website") and provider.website:
|
||||
contact_point["url"] = provider.website
|
||||
if hasattr(provider, "email") and provider.email:
|
||||
contact_point["email"] = provider.email
|
||||
if hasattr(provider, "phone") and provider.phone:
|
||||
contact_point["telephone"] = provider.phone
|
||||
|
||||
if len(contact_point) > 2: # If we have more than the @type and contactType
|
||||
data["contactPoint"] = contact_point
|
||||
|
||||
# Add address if available
|
||||
if hasattr(provider, "address") and provider.address:
|
||||
data["address"] = {
|
||||
"@type": "PostalAddress",
|
||||
"addressCountry": "CH", # Default to Switzerland
|
||||
}
|
||||
|
||||
elif view_name == "partner_detail" and "partner" in context:
|
||||
partner = context["partner"]
|
||||
partner_url = request.build_absolute_uri()
|
||||
|
||||
data = {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Organization",
|
||||
"name": partner.name,
|
||||
"description": partner.description,
|
||||
"url": partner_url,
|
||||
}
|
||||
|
||||
# Add image if available
|
||||
if hasattr(partner, "logo") and partner.logo:
|
||||
data["logo"] = request.build_absolute_uri(partner.logo.url)
|
||||
|
||||
# Add contact information if available
|
||||
contact_point = {"@type": "ContactPoint", "contactType": "Customer Support"}
|
||||
|
||||
if hasattr(partner, "website") and partner.website:
|
||||
contact_point["url"] = partner.website
|
||||
if hasattr(partner, "email") and partner.email:
|
||||
contact_point["email"] = partner.email
|
||||
if hasattr(partner, "phone") and partner.phone:
|
||||
contact_point["telephone"] = partner.phone
|
||||
|
||||
if len(contact_point) > 2: # If we have more than the @type and contactType
|
||||
data["contactPoint"] = contact_point
|
||||
|
||||
# Add address if available
|
||||
if hasattr(partner, "address") and partner.address:
|
||||
data["address"] = {
|
||||
"@type": "PostalAddress",
|
||||
"addressCountry": "CH", # Default to Switzerland
|
||||
}
|
||||
|
||||
elif view_name == "offering_detail" and "offering" in context:
|
||||
offering = context["offering"]
|
||||
offering_url = request.build_absolute_uri()
|
||||
|
||||
data = {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Product",
|
||||
"name": f"{offering.service.name} on {offering.cloud_provider.name}",
|
||||
"description": offering.description or offering.service.description,
|
||||
"url": offering_url,
|
||||
"category": "Cloud Service",
|
||||
}
|
||||
|
||||
# Add brand (service)
|
||||
data["brand"] = {"@type": "Brand", "name": offering.service.name}
|
||||
|
||||
# Add image if available
|
||||
if hasattr(offering.service, "logo") and offering.service.logo:
|
||||
data["image"] = request.build_absolute_uri(offering.service.logo.url)
|
||||
|
||||
# Add offers if available
|
||||
if hasattr(offering, "plans") and offering.plans.exists():
|
||||
data["offers"] = {
|
||||
"@type": "AggregateOffer",
|
||||
"availability": "https://schema.org/InStock",
|
||||
"offerCount": offering.plans.count(),
|
||||
"seller": {
|
||||
"@type": "Organization",
|
||||
"name": offering.cloud_provider.name,
|
||||
"url": request.build_absolute_uri(
|
||||
offering.cloud_provider.get_absolute_url()
|
||||
),
|
||||
},
|
||||
}
|
||||
|
||||
else:
|
||||
# Default to organization data if no specific page type matches
|
||||
data = organization_data
|
||||
|
||||
# Return the JSON-LD as a script tag
|
||||
json_ld = json.dumps(data, indent=2)
|
||||
return mark_safe(f'<script type="application/ld+json">{json_ld}</script>')
|
Loading…
Add table
Add a link
Reference in a new issue