from constance import config from django.conf import settings def org_schema(): return { "@context": "https://schema.org", "@type": "Organization", "name": config.COMPANY_NAME, "url": f"https://{config.BASE_DOMAIN}/", "logo": f"https://{config.BASE_DOMAIN}/static/logo.png", } def website_schema(): return { "@context": "https://schema.org", "@type": "WebSite", "name": config.PROJECT_NAME, "url": f"https://{config.BASE_DOMAIN}/", "potentialAction": { "@type": "SearchAction", "target": f"https://{config.BASE_DOMAIN}/search?q={{query}}", "query-input": "required name=query", }, } def breadcrumb_schema(items): return { "@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [ {"@type": "ListItem", "position": i + 1, "name": name, "item": url} for i, (name, url) in enumerate(items) ], } def item_list_schema(urls): return { "@context": "https://schema.org", "@type": "ItemList", "itemListElement": [{"@type": "ListItem", "position": i + 1, "url": u} for i, u in enumerate(urls)], } def product_schema(product, images, rating=None): offers = [] for stock in product.stocks.all(): offers.append( { "@type": "Offer", "price": round(stock.price, 2), "priceCurrency": settings.CURRENCY_CODE, "availability": "https://schema.org/InStock" if stock.quantity > 0 else "https://schema.org/OutOfStock", "sku": stock.sku, "url": f"https://{config.BASE_DOMAIN}/product/{product.slug}", } ) data = { "@context": "https://schema.org", "@type": "Product", "name": product.name, "description": product.description or "", "sku": product.partnumber or "", "brand": {"@type": "Brand", "name": product.brand.name} if product.brand else None, "image": [img.image.url for img in images] or [], "offers": offers[:1] if offers else None, } if rating and rating["count"] > 0: data["aggregateRating"] = { "@type": "AggregateRating", "ratingValue": rating["value"], "reviewCount": rating["count"], } return {k: v for k, v in data.items() if v not in (None, [], {})} def category_schema(category, url): return { "@context": "https://schema.org", "@type": "CollectionPage", "name": category.name, "description": category.description or "", "url": url, } def brand_schema(brand, url, logo_url=None): data = { "@context": "https://schema.org", "@type": "Brand", "name": brand.name, "url": url, } if logo_url: data["logo"] = logo_url return data