From 09ee4816d82e31407ac5ea87027f1723d2494019 Mon Sep 17 00:00:00 2001 From: mrferris Date: Fri, 17 Mar 2023 17:19:31 -0400 Subject: [PATCH 1/2] d --- entity/src/lib.rs | 1 + glados-web/src/lib.rs | 6 + glados-web/src/routes.rs | 8 ++ glados-web/templates/content_dashboard.html | 152 ++++++++++---------- 4 files changed, 94 insertions(+), 73 deletions(-) diff --git a/entity/src/lib.rs b/entity/src/lib.rs index ad71567f..f0c8cd5d 100644 --- a/entity/src/lib.rs +++ b/entity/src/lib.rs @@ -4,6 +4,7 @@ pub mod prelude; pub mod content; pub mod content_audit; +pub mod content_gossip; pub mod execution_metadata; pub mod key_value; pub mod node; diff --git a/glados-web/src/lib.rs b/glados-web/src/lib.rs index 8bc72ba8..79b070d5 100644 --- a/glados-web/src/lib.rs +++ b/glados-web/src/lib.rs @@ -2,6 +2,7 @@ use std::sync::Arc; use std::{net::SocketAddr, path::Path}; use anyhow::{bail, Result}; +use axum::routing::post; use axum::{ extract::Extension, routing::{get, get_service}, @@ -38,6 +39,11 @@ pub async fn run_glados_web(config: Arc) -> Result<()> { "/content/key/:content_key_hex", get(routes::contentkey_detail), ) + .route("/gossip", post(routes::create_gossip_record)) + .route( + "/gossip/:content_id_hex", + get(routes::get_gossip_records_for_content), + ) .nest_service("/static/", serve_dir.clone()) .fallback_service(serve_dir) .layer(Extension(config)); diff --git a/glados-web/src/routes.rs b/glados-web/src/routes.rs index fa3361d8..1086f1f1 100644 --- a/glados-web/src/routes.rs +++ b/glados-web/src/routes.rs @@ -233,3 +233,11 @@ pub async fn contentkey_detail( }; HtmlTemplate(template) } + +pub async fn create_gossip_record(Extension(state): Extension>) -> impl IntoResponse {} + +pub async fn get_gossip_records_for_content( + Path(content_key_hex): Path, + Extension(state): Extension>, +) -> impl IntoResponse { +} diff --git a/glados-web/templates/content_dashboard.html b/glados-web/templates/content_dashboard.html index 2d1f9743..62b0a20c 100644 --- a/glados-web/templates/content_dashboard.html +++ b/glados-web/templates/content_dashboard.html @@ -16,25 +16,28 @@

Content Dashboard

    Recent content with audits

    - +
    - - - - - - - + + {% for (content, audit) in recent_content %} - - - - - - - + + + + + + + {% endfor %}
    | Result | Sub-protocol | Strategy| Content Key| Content ID| Content first available| Audited at
    Result + Sub-protocol + Strategy + Content Key + Content ID + Content first available + Audited at +
    | {% if audit.is_success() %}Success{% else %}Fail{% endif %}| {{ content.protocol_id.as_text() }} | {{ audit.strategy_as_text() }}| {{ content.key_as_hex_short() }}| {{ content.id_as_hex_short() }}| {{ content.available_at_local_time() }}| {{ audit.created_at_local_time() }}{% + if audit.is_success() %}Success{% else %}Fail{% endif %}{{ content.protocol_id.as_text() }} {{ audit.strategy_as_text() }}{{ content.key_as_hex_short() }}{{ content.id_as_hex_short() }}{{ content.available_at_local_time() }}{{ audit.created_at_local_time() }}
    @@ -44,22 +47,22 @@

    Recent content with audits

    @@ -70,23 +73,24 @@

    Recent Content

    Recent audits

    - - - - - - - + + + + + + + {% for (content, audit) in recent_audits %} - - - - - - - + + + + + + + {% endfor %}
    | Result | Sub-protocol | Strategy| Content Key| Content ID| Content first available| Audited at| Result | Sub-protocol | Strategy| Content Key| Content ID| Content first available| Audited at
    | {% if audit.is_success() %}Success{% else %}Fail{% endif %}| {{ content.protocol_id.as_text() }} | {{ audit.strategy_as_text() }}| {{ content.key_as_hex_short() }}| {{ content.id_as_hex_short() }}| {{ content.available_at_local_time() }}| {{ audit.created_at_local_time() }}| {% + if audit.is_success() %}Success{% else %}Fail{% endif %}| {{ content.protocol_id.as_text() }} | {{ audit.strategy_as_text() }}| {{ content.key_as_hex_short() }}| {{ content.id_as_hex_short() }}| {{ content.available_at_local_time() }}| {{ audit.created_at_local_time() }}
    @@ -99,23 +103,24 @@

    Recent audits

    Recent audit successes

    - - - - - - - + + + + + + + {% for (content, audit) in recent_audit_successes %} - - - - - - - + + + + + + + {% endfor %}
    | Result | Sub-protocol | Strategy| Content Key| Content ID| Content first available| Audited at| Result | Sub-protocol | Strategy| Content Key| Content ID| Content first available| Audited at
    | {% if audit.is_success() %}Success{% else %}Fail{% endif %}| {{ content.protocol_id.as_text() }} | {{ audit.strategy_as_text() }}| {{ content.key_as_hex_short() }}| {{ content.id_as_hex_short() }}| {{ content.available_at_local_time() }}| {{ audit.created_at_local_time() }}| {% + if audit.is_success() %}Success{% else %}Fail{% endif %}| {{ content.protocol_id.as_text() }} | {{ audit.strategy_as_text() }}| {{ content.key_as_hex_short() }}| {{ content.id_as_hex_short() }}| {{ content.available_at_local_time() }}| {{ audit.created_at_local_time() }}
    @@ -128,23 +133,24 @@

    Recent audit successes

    Recent audit failures

    - - - - - - - + + + + + + + {% for (content, audit) in recent_audit_failures %} - - - - - - - + + + + + + + {% endfor %}
    | Result | Sub-protocol | Strategy| Content Key| Content ID| Content first available| Audited at| Result | Sub-protocol | Strategy| Content Key| Content ID| Content first available| Audited at
    | {% if audit.is_success() %}Success{% else %}Fail{% endif %}| {{ content.protocol_id.as_text() }} | {{ audit.strategy_as_text() }}| {{ content.key_as_hex_short() }}| {{ content.id_as_hex_short() }}| {{ content.available_at_local_time() }}| {{ audit.created_at_local_time() }}| {% + if audit.is_success() %}Success{% else %}Fail{% endif %}| {{ content.protocol_id.as_text() }} | {{ audit.strategy_as_text() }}| {{ content.key_as_hex_short() }}| {{ content.id_as_hex_short() }}| {{ content.available_at_local_time() }}| {{ audit.created_at_local_time() }}
    From 614b13c8ad98ff980723f8847a204672c713247a Mon Sep 17 00:00:00 2001 From: mrferris Date: Thu, 23 Mar 2023 11:20:04 -0400 Subject: [PATCH 2/2] d --- Cargo.lock | 116 +++++++++++--------- entity/src/content.rs | 8 ++ glados-web/Cargo.toml | 1 + glados-web/src/routes.rs | 33 +++++- glados-web/src/templates.rs | 3 +- glados-web/templates/contentkey_detail.html | 47 ++++---- 6 files changed, 130 insertions(+), 78 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9c881437..35bbcc5e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -119,7 +119,7 @@ checksum = "87bf87e6e8b47264efa9bde63d6225c6276a52e05e91bf37eaa8afd0032d6b71" dependencies = [ "askama_shared", "proc-macro2", - "syn", + "syn 1.0.107", ] [[package]] @@ -144,7 +144,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn", + "syn 1.0.107", "toml", ] @@ -155,7 +155,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" dependencies = [ "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -274,7 +274,7 @@ checksum = "10f203db73a71dfa2fb6dd22763990fa26f3d2625a6da2da900d23b87d26be27" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -291,7 +291,7 @@ checksum = "76464446b8bc32758d7e88ee1a804d9914cd9b1cb264c029899680b0be29826f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -395,7 +395,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -502,9 +502,9 @@ checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" [[package]] name = "bstr" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffdb39cb703212f3c11973452c2861b972f757b021158f3516ba10f2fa8b2c1" +checksum = "c3d4260bcc2e8fc9df1eac4919a720effeb63a3f0952f5bf4944adfa18897f09" dependencies = [ "memchr", "serde", @@ -560,9 +560,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.23" +version = "0.4.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f" +checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" dependencies = [ "iana-time-zone", "js-sys", @@ -625,7 +625,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -638,7 +638,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -808,7 +808,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" dependencies = [ "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -857,7 +857,7 @@ dependencies = [ "proc-macro2", "quote", "scratch", - "syn", + "syn 1.0.107", ] [[package]] @@ -874,7 +874,7 @@ checksum = "309e4fb93eed90e1e14bea0da16b209f81813ba9fc7830c20ed151dd7bc0a4d7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -898,7 +898,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn", + "syn 1.0.107", ] [[package]] @@ -909,7 +909,7 @@ checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" dependencies = [ "darling_core", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -942,7 +942,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.0", - "syn", + "syn 1.0.107", ] [[package]] @@ -1205,7 +1205,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -1575,7 +1575,7 @@ checksum = "42cd15d1c7456c04dbdf7e88bcd69760d74f3a798d6444e16974b505b0e62f17" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -1748,6 +1748,7 @@ dependencies = [ "hex", "migration", "sea-orm", + "serde", "tokio", "tower-http", "tracing", @@ -2183,7 +2184,7 @@ checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -2361,7 +2362,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -2758,7 +2759,7 @@ checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -2806,7 +2807,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -2852,7 +2853,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -2864,7 +2865,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -2977,7 +2978,7 @@ checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -3086,7 +3087,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.107", "version_check", ] @@ -3103,18 +3104,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.47" +version = "1.0.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" +checksum = "ba466839c78239c09faf015484e5cc04860f88242cff4d03eb038f04b4699b73" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.21" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" +checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" dependencies = [ "proc-macro2", ] @@ -3483,7 +3484,7 @@ checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -3658,7 +3659,7 @@ dependencies = [ "heck 0.3.3", "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -3715,7 +3716,7 @@ dependencies = [ "heck 0.3.3", "proc-macro2", "quote", - "syn", + "syn 1.0.107", "thiserror", ] @@ -3739,7 +3740,7 @@ dependencies = [ "heck 0.3.3", "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -3761,7 +3762,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn", + "syn 1.0.107", ] [[package]] @@ -3848,9 +3849,9 @@ checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" [[package]] name = "serde" -version = "1.0.152" +version = "1.0.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" +checksum = "771d4d9c4163ee138805e12c710dd365e4f44be8be0503cb1bb9eb989425d9c9" dependencies = [ "serde_derive", ] @@ -3868,20 +3869,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.152" +version = "1.0.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" +checksum = "e801c1712f48475582b7696ac71e0ca34ebb30e09338425384269d9717c62cad" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.8", ] [[package]] name = "serde_json" -version = "1.0.93" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cad406b69c91885b5107daf2c29572f6c8cdb3c66826821e286c533490c0bc76" +checksum = "1c533a59c9d8a93a09c6ab31f0fd5e5f4dd1b8fc9434804029839884765d04ea" dependencies = [ "itoa", "ryu", @@ -4177,7 +4178,7 @@ dependencies = [ "sha2 0.10.6", "sqlx-core", "sqlx-rt", - "syn", + "syn 1.0.107", "url", ] @@ -4232,6 +4233,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "2.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcc02725fd69ab9f26eab07fad303e2497fad6fb9eba4f96c4d1687bdf704ad9" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "sync_wrapper" version = "0.1.1" @@ -4246,7 +4258,7 @@ checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", "unicode-xid", ] @@ -4302,7 +4314,7 @@ checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -4415,7 +4427,7 @@ checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -4564,7 +4576,7 @@ checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", ] [[package]] @@ -4827,7 +4839,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 1.0.107", "wasm-bindgen-shared", ] @@ -4861,7 +4873,7 @@ checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5141,6 +5153,6 @@ checksum = "3f8f187641dad4f680d25c4bfc4225b418165984179f26ca76ec4fb6441d3a17" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.107", "synstructure", ] diff --git a/entity/src/content.rs b/entity/src/content.rs index 0f16019b..18003789 100644 --- a/entity/src/content.rs +++ b/entity/src/content.rs @@ -42,6 +42,8 @@ pub enum Relation { ContentAudit, #[sea_orm(has_many = "super::execution_metadata::Entity")] ExecutionMetadata, + #[sea_orm(has_many = "super::content_gossip::Entity")] + ContentGossip, } impl Related for Entity { @@ -56,6 +58,12 @@ impl Related for Entity { } } +impl Related for Entity { + fn to() -> RelationDef { + Relation::ContentGossip.def() + } +} + impl ActiveModelBehavior for ActiveModel {} pub async fn get_or_create( diff --git a/glados-web/Cargo.toml b/glados-web/Cargo.toml index 56cdd0c6..7daf2dd7 100644 --- a/glados-web/Cargo.toml +++ b/glados-web/Cargo.toml @@ -22,6 +22,7 @@ glados-core = { path = "../glados-core" } hex = "0.4.3" migration = { path = "../migration" } sea-orm = "0.10.2" +serde = "1.0.158" tokio = "1.22.0" tower-http = { version = "0.3.5", features = ["fs"] } tracing = "0.1.37" diff --git a/glados-web/src/routes.rs b/glados-web/src/routes.rs index 1086f1f1..60d26559 100644 --- a/glados-web/src/routes.rs +++ b/glados-web/src/routes.rs @@ -2,17 +2,18 @@ use std::io; use std::sync::Arc; use axum::{ - extract::{Extension, Path}, + extract::{Extension, Json, Path}, http::StatusCode, response::IntoResponse, }; use ethportal_api::{types::content_key::OverlayContentKey, HistoryContentKey}; use sea_orm::{ColumnTrait, EntityTrait, ModelTrait, QueryFilter, QueryOrder, QuerySelect}; +use serde::Deserialize; use entity::{ content, content_audit::{self, AuditResult}, - execution_metadata, node, + content_gossip, execution_metadata, node, }; use crate::state::State; @@ -221,6 +222,12 @@ pub async fn contentkey_detail( .expect("No content found"); let block_number = metadata_model.map(|m| m.block_number); + let gossip_records = content_key_model + .find_related(content_gossip::Entity) + .all(&state.database_connection) + .await + .expect("Failed to look up gossip records"); + let content_id = format!("0x{}", hex::encode(content_key.content_id())); let content_kind = content_key.to_string(); let template = ContentKeyDetailTemplate { @@ -230,14 +237,28 @@ pub async fn contentkey_detail( content_id, content_kind, block_number, + gossip_records, }; HtmlTemplate(template) } -pub async fn create_gossip_record(Extension(state): Extension>) -> impl IntoResponse {} - -pub async fn get_gossip_records_for_content( - Path(content_key_hex): Path, +pub async fn create_gossip_record( + Json(gossip_data): Json, Extension(state): Extension>, ) -> impl IntoResponse { + let gossip = content_gossip::create( + gossip_data.sending_node, + gossip_data.receiving_node, + gossip_data.content_key, + &state.database_connection, + ) + .await + .expect("Failed to create gossip record"); +} + +#[derive(Deserialize)] +pub struct NewGossipData { + receiving_node: String, + sending_node: String, + content_key: String, } diff --git a/glados-web/src/templates.rs b/glados-web/src/templates.rs index b98da592..4f7880dc 100644 --- a/glados-web/src/templates.rs +++ b/glados-web/src/templates.rs @@ -4,7 +4,7 @@ use axum::{ response::{Html, IntoResponse, Response}, }; -use entity::{content, content_audit, node}; +use entity::{content, content_audit, content_gossip, node}; #[derive(Template)] #[template(path = "index.html")] @@ -54,6 +54,7 @@ pub struct ContentKeyDetailTemplate { pub content_kind: String, pub block_number: Option, pub contentaudit_list: Vec, + pub gossip_records: Vec, } pub struct HtmlTemplate(pub T); diff --git a/glados-web/templates/contentkey_detail.html b/glados-web/templates/contentkey_detail.html index 561fbd2c..2281e114 100644 --- a/glados-web/templates/contentkey_detail.html +++ b/glados-web/templates/contentkey_detail.html @@ -3,31 +3,40 @@ {% block title %}Content Key: {{ content_key_model.key_as_hex() }}{% endblock %} {% block content %} -
    +

    Content Key: {{ content_key_model.key_as_hex() }}

    -
    -
    +
    +
    -
      -
    • Database ID: {{ content_key_model.id }}
    • -
    • Content Key: {{ content_key }}
    • -
    • Content Id: {{ content_id }}
    • -
    • Kind: {{ content_kind }}
    • - {% if block_number.is_some() %} +
        +
      • Database ID: {{ content_key_model.id }}
      • +
      • Content Key: {{ content_key }}
      • +
      • Content Id: {{ content_id }}
      • +
      • Kind: {{ content_kind }}
      • + {% if block_number.is_some() %}
      • Block number: {{ block_number.unwrap() }}
      • - {% else %}{% endif %} -
      + {% else %}{% endif %} +
    +
    +
    +

    Content Audits

    +
      + {% for content_audit in contentaudit_list %} +
    • Audit#: {{ content_audit.id }} {% if + content_audit.is_success() %}Success{% else %}Fail{% endif %}
    • + {% else %} +
    • No audits
    • + {% endfor %} +
    +
    +
    +

    Nodes received via gossip

    -

    Content Audits

    -
      - {% for content_audit in contentaudit_list %} -
    • Audit#: {{ content_audit.id }} {% if content_audit.is_success() %}Success{% else %}Fail{% endif %}
    • - {% else %} -
    • No audits
    • + {% for gossip_record in gossip_records %} +

      {{ gossip_record.receiving_node }}

      {% endfor %} -
    -
    {% endblock %}