Add individual group pages.

This commit is contained in:
Bauke 2023-06-08 13:12:44 +02:00
parent 0410fd3603
commit e4847a6c57
Signed by: Bauke
GPG Key ID: C1C0F29952BCF558
4 changed files with 77 additions and 2 deletions

View File

@ -19,7 +19,7 @@ use crate::{
migrations::Migrator, migrations::Migrator,
scss::generate_css, scss::generate_css,
snapshots::SnapshotModel, snapshots::SnapshotModel,
templates::HomeTemplate, templates::{GroupTemplate, HomeTemplate},
utilities::{create_db, today}, utilities::{create_db, today},
}; };
@ -117,6 +117,11 @@ pub async fn run() -> Result<()> {
} }
.render(&output, &group.name, true) .render(&output, &group.name, true)
.await?; .await?;
GroupTemplate::new(&group.name)
.await
.render_to_file(&output)
.await?;
} }
HomeTemplate::new( HomeTemplate::new(

View File

@ -0,0 +1,19 @@
{% extends "base.html" %}
{% block head %}
<link rel="stylesheet" href="/css/index.css">
{% endblock %}
{% block body %}
<header class="page-header">
<img src="/tildes-statistics.png" alt="Tildes Statistics Logo">
<h1>{{ group_name }} Statistics</h1>
</header>
<main class="page-main">
<h2>General</h2>
<img class="chart" src="/charts/user-count/{{ group_name }}.svg"
alt="{{ group_name }} User Count Chart">
</main>
{% endblock %}

View File

@ -37,7 +37,7 @@
{% for group in groups %} {% for group in groups %}
<tr> <tr>
<td> <td>
<a href="{{ base_url }}/{{ group.name }}">{{ group.name }}</a> <a href="/{{ group.name }}">{{ group.name }}</a>
</td> </td>
<td>{{ group.subscribers }}</td> <td>{{ group.subscribers }}</td>
<td> <td>

View File

@ -10,6 +10,8 @@ use {
color_eyre::Result, color_eyre::Result,
}; };
use async_std::fs::create_dir_all;
use crate::{ use crate::{
group_data::GroupDataModel, group_data::GroupDataModel,
utilities::{get_base_url, today}, utilities::{get_base_url, today},
@ -70,3 +72,52 @@ impl HomeTemplate {
Ok(()) Ok(())
} }
} }
/// The template for group-specific pages.
#[derive(Template)]
#[template(path = "group.html")]
pub struct GroupTemplate {
/// The base URL for links to the Tildes instance.
pub base_url: String,
/// Extra HTML to insert in the body.
pub extra_body_html: String,
/// Extra HTML to insert in the head.
pub extra_head_html: String,
/// The group name for this group.
pub group_name: String,
/// The string for the `<title>` element.
pub page_title: String,
/// The date of today's snapshot.
pub today: NaiveDate,
}
impl GroupTemplate {
/// Create a new [`GroupTemplate`].
pub async fn new(group_name: &str) -> Self {
let extra_body_html = read_to_string("extra-body.html").await;
let extra_head_html = read_to_string("extra-head.html").await;
Self {
base_url: get_base_url(),
extra_body_html: extra_body_html.unwrap_or_default(),
extra_head_html: extra_head_html.unwrap_or_default(),
group_name: group_name.to_string(),
page_title: "Tildes Statistics".to_string(),
today: today(),
}
}
/// Render the template and write it to file.
pub async fn render_to_file(&self, parent: &PathBuf) -> Result<()> {
let output_dir = parent.join(&self.group_name);
create_dir_all(&output_dir).await?;
write(output_dir.join("index.html"), self.render()?).await?;
Ok(())
}
}