feat: rebuild site content management

Replace legacy FAQ, downloads, and release flows with project and blog publishing. Add configurable branding and theme fields plus clean-start Compose seeding support.
This commit is contained in:
mohamad
2026-09-24 02:32:27 +03:30
parent 4fc4282f0f
commit 588d95f889
43 changed files with 703 additions and 1193 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
{% extends "base.html" %}
{% block title %}About{% endblock %}
{% block meta_description %}Learn how Communication to Care helps multidisciplinary teams build clearer, reproducible medical-imaging research workflows.{% endblock %}
{% block meta_description %}Learn how {{ site_branding.site_name }} helps multidisciplinary teams build clearer, reproducible medical-imaging research workflows.{% endblock %}
{% block content %}
{% include "partials/_page_sections.html" with sections=about_sections %}
+32
View File
@@ -0,0 +1,32 @@
{% extends "base.html" %}
{% block title %}{{ post.title }}{% endblock %}
{% block meta_description %}{{ post.excerpt|default:post.title }}{% endblock %}
{% block content %}
<article class="blog-detail">
<header class="page-hero blog-detail-hero">
<div class="page-hero-blobs" aria-hidden="true"><div class="blob blob--1"></div><div class="blob blob--2"></div></div>
<div class="container blog-detail-header">
<nav class="breadcrumb" aria-label="Breadcrumb">
<ol class="breadcrumb-list" role="list">
<li><a href="{% url 'pages:home' %}">Home</a></li>
<li aria-hidden="true" class="breadcrumb-sep">›</li>
<li><a href="{% url 'pages:blog_list' %}">Blog</a></li>
<li aria-hidden="true" class="breadcrumb-sep">›</li>
<li aria-current="page">{{ post.title }}</li>
</ol>
</nav>
<p class="blog-meta">{{ post.published_at|date:"F j, Y" }}{% if post.author_name %} · {{ post.author_name }}{% endif %}</p>
<h1 class="page-hero-title">{{ post.title }}</h1>
{% if post.excerpt %}<p class="page-hero-subtitle">{{ post.excerpt }}</p>{% endif %}
</div>
</header>
<div class="section">
<div class="container blog-article-wrap">
{% if post.cover_image %}<img class="blog-cover" src="{{ post.cover_image.url }}" alt="{{ post.cover_image_alt|default:post.title }}" />{% endif %}
<div class="blog-article rich-content glass-card">{{ post.rendered_content }}</div>
</div>
</div>
</article>
{% endblock %}
+47
View File
@@ -0,0 +1,47 @@
{% extends "base.html" %}
{% block title %}Blog{% endblock %}
{% block meta_description %}News, research notes, and community updates from {{ site_branding.site_name }}.{% endblock %}
{% block content %}
<section class="page-hero" aria-labelledby="blog-heading">
<div class="page-hero-blobs" aria-hidden="true">
<div class="blob blob--1"></div>
<div class="blob blob--2"></div>
</div>
<div class="container">
<div class="page-hero-content">
<div class="section-badge">Insights and Updates</div>
<h1 class="page-hero-title" id="blog-heading">Blog</h1>
<p class="page-hero-subtitle">Research stories, project updates, and practical ideas from our community.</p>
</div>
</div>
</section>
<section class="section" aria-label="Blog posts">
<div class="container">
{% if posts %}
<div class="blog-grid">
{% for post in posts %}
<article class="blog-card glass-card fade-in">
{% if post.cover_image %}
<a href="{{ post.get_absolute_url }}" class="blog-card-image">
<img src="{{ post.cover_image.url }}" alt="{{ post.cover_image_alt|default:post.title }}" loading="lazy" />
</a>
{% endif %}
<div class="blog-card-body">
<p class="blog-meta">{{ post.published_at|date:"F j, Y" }}{% if post.author_name %} · {{ post.author_name }}{% endif %}</p>
<h2 class="blog-card-title"><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></h2>
{% if post.excerpt %}<p class="blog-card-excerpt">{{ post.excerpt }}</p>{% endif %}
<a href="{{ post.get_absolute_url }}" class="link-arrow">Read article</a>
</div>
</article>
{% endfor %}
</div>
{% include "partials/_pagination.html" with page_obj=page_obj %}
{% else %}
<div class="empty-state-block glass-card"><p>No blog posts have been published yet.</p></div>
{% endif %}
</div>
</section>
{% endblock %}
+6 -6
View File
@@ -1,8 +1,8 @@
{% extends "base.html" %}
{% load static %}
{% block title %}Contact{% endblock %}
{% block meta_description %}Contact Communication to Care for com2care product support, research evaluation, and general inquiries.{% endblock %}
{% block title %}Become a Member{% endblock %}
{% block meta_description %}Become a member of {{ site_branding.site_name }} and connect with the com2care research community.{% endblock %}
{% block content %}
@@ -13,9 +13,9 @@
</div>
<div class="container">
<div class="page-hero-content">
<div class="section-badge">Get in Touch</div>
<h1 class="page-hero-title" id="contact-heading">Contact Us</h1>
<p class="page-hero-subtitle">Have a product, evaluation, or research question? Send the com2care team a message below.</p>
<div class="section-badge">Join the Community</div>
<h1 class="page-hero-title" id="contact-heading">Become a Member</h1>
<p class="page-hero-subtitle">Tell us how you would like to contribute, collaborate, or take part in the com2care research community.</p>
</div>
</div>
</section>
@@ -27,7 +27,7 @@
<div class="contact-layout{% if not site_contact.has_contact_sidebar %} contact-layout--full{% endif %}">
<div class="contact-form-wrap glass-card fade-in">
<h2 class="contact-form-title" id="contact-form-heading">Send a Message</h2>
<h2 class="contact-form-title" id="contact-form-heading">Membership Request</h2>
<form id="contactForm" novalidate action="{% url 'pages:contact' %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
-67
View File
@@ -1,67 +0,0 @@
{% extends "base.html" %}
{% load static %}
{% block title %}FAQ{% endblock %}
{% block meta_description %}Frequently asked questions about Communication to Care licensing, research use, releases, support, and responsible deployment.{% endblock %}
{% block content %}
<section class="page-hero" aria-labelledby="faq-heading">
<div class="page-hero-blobs" aria-hidden="true">
<div class="blob blob--1"></div>
<div class="blob blob--2"></div>
</div>
<div class="container">
<div class="page-hero-content">
<div class="section-badge">Help</div>
<h1 class="page-hero-title" id="faq-heading">FAQ</h1>
<p class="page-hero-subtitle">Frequently Asked Questions</p>
</div>
</div>
</section>
{% include "partials/_page_videos.html" with videos=faq_videos %}
<section class="section" aria-labelledby="faq-list-heading">
<div class="container">
<h2 class="sr-only" id="faq-list-heading">FAQ List</h2>
{% if faq_entries %}
<div class="faq-list">
{% for entry in faq_entries %}
<div class="faq-item glass-card fade-in">
<button
class="faq-question"
aria-expanded="false"
aria-controls="faq-answer-{{ entry.pk }}"
id="faq-question-{{ entry.pk }}"
>
{{ entry.question }}
<svg class="faq-icon" width="20" height="20" viewBox="0 0 20 20" fill="none" aria-hidden="true">
<path d="M5 8L10 13L15 8" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
<div
class="faq-answer"
id="faq-answer-{{ entry.pk }}"
role="region"
aria-labelledby="faq-question-{{ entry.pk }}"
hidden
>
<div class="rich-content">{{ entry.rendered_answer }}</div>
</div>
</div>
{% endfor %}
</div>
{% else %}
<p class="empty-state">No FAQ entries available yet.</p>
{% endif %}
<div class="faq-contact glass-card fade-in">
<h2>Still Have Questions?</h2>
<p>Can't find the answer you're looking for? Get in touch with our support team.</p>
<a href="{% url 'pages:contact' %}" class="btn-primary">Contact Support</a>
</div>
</div>
</section>
{% endblock %}
+2 -2
View File
@@ -2,7 +2,7 @@
{% load static %}
{% block title %}Home{% endblock %}
{% block meta_description %}Communication to Care — A Powerful Workflow Generator for Standardized Radiomics Analysis and Medical Image Visualization.{% endblock %}
{% block meta_description %}{{ site_branding.meta_description }}{% endblock %}
{% block content %}
@@ -38,7 +38,7 @@
<div class="hero-app-preview fade-in">
<div class="hero-app-preview-glow" aria-hidden="true"></div>
{% if site_branding.hero_logo %}
<img src="{{ site_branding.hero_logo.url }}" alt="{{ site_branding.hero_logo_alt|default:'Communication to Care' }}" loading="eager" />
<img src="{{ site_branding.hero_logo.url }}" alt="{{ site_branding.hero_logo_alt|default:site_branding.site_name }}" loading="eager" />
{% elif hero and hero.image %}
<img src="{{ hero.image.url }}" alt="{{ hero.image_alt }}" loading="eager" />
{% else %}