This commit is contained in:
Ondrej Vlach 2023-11-26 20:32:45 +01:00
parent 59ab0b7393
commit 933239a52d
7 changed files with 148 additions and 45 deletions

60
Cargo.lock generated
View File

@ -194,7 +194,9 @@ checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38"
dependencies = [ dependencies = [
"android-tzdata", "android-tzdata",
"iana-time-zone", "iana-time-zone",
"js-sys",
"num-traits", "num-traits",
"wasm-bindgen",
"windows-targets", "windows-targets",
] ]
@ -266,6 +268,30 @@ dependencies = [
"crossbeam-utils", "crossbeam-utils",
] ]
[[package]]
name = "crossbeam-deque"
version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef"
dependencies = [
"cfg-if",
"crossbeam-epoch",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-epoch"
version = "0.9.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7"
dependencies = [
"autocfg",
"cfg-if",
"crossbeam-utils",
"memoffset",
"scopeguard",
]
[[package]] [[package]]
name = "crossbeam-utils" name = "crossbeam-utils"
version = "0.8.16" version = "0.8.16"
@ -567,15 +593,15 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
[[package]] [[package]]
name = "globset" name = "globset"
version = "0.4.13" version = "0.4.14"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "759c97c1e17c55525b57192c06a267cda0ac5210b222d6b82189a2338fa1c13d" checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1"
dependencies = [ dependencies = [
"aho-corasick", "aho-corasick",
"bstr", "bstr",
"fnv",
"log", "log",
"regex", "regex-automata 0.4.3",
"regex-syntax 0.8.2",
] ]
[[package]] [[package]]
@ -735,17 +761,16 @@ dependencies = [
[[package]] [[package]]
name = "ignore" name = "ignore"
version = "0.4.20" version = "0.4.21"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dbe7873dab538a9a44ad79ede1faf5f30d49f9a5c883ddbab48bce81b64b7492" checksum = "747ad1b4ae841a78e8aba0d63adbfbeaea26b517b63705d47856b73015d27060"
dependencies = [ dependencies = [
"crossbeam-deque",
"globset", "globset",
"lazy_static",
"log", "log",
"memchr", "memchr",
"regex", "regex-automata 0.4.3",
"same-file", "same-file",
"thread_local",
"walkdir", "walkdir",
"winapi-util", "winapi-util",
] ]
@ -853,9 +878,9 @@ checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c"
[[package]] [[package]]
name = "libm" name = "libm"
version = "0.2.7" version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058"
[[package]] [[package]]
name = "linux-raw-sys" name = "linux-raw-sys"
@ -909,6 +934,15 @@ version = "2.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167"
[[package]]
name = "memoffset"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
dependencies = [
"autocfg",
]
[[package]] [[package]]
name = "mime" name = "mime"
version = "0.3.17" version = "0.3.17"
@ -1099,8 +1133,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
[[package]] [[package]]
name = "ovlach_data" name = "ovlach_data"
version = "0.1.0" version = "0.1.0"
source = "git+https://glpat-Ju_qUN9Yh8qa5rEnd6T7:glpat-Ju_qUN9Yh8qa5rEnd6T7@gitlab.nanobyte.cz/ondrej/ov-site-api-data.git?tag=v0.0.1#85e59a8c7b2ddf768751a82cde1b70d99ad6147e" source = "git+https://glpat-Ju_qUN9Yh8qa5rEnd6T7:glpat-Ju_qUN9Yh8qa5rEnd6T7@gitlab.nanobyte.cz/ondrej/ov-site-api-data.git?branch=add_missing_fields#16c3522851e763b883c1bdc2a235bad039f943d9"
dependencies = [ dependencies = [
"chrono",
"rocket", "rocket",
"serde", "serde",
] ]
@ -1109,6 +1144,7 @@ dependencies = [
name = "ovlach_frontend" name = "ovlach_frontend"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"chrono",
"fern", "fern",
"log", "log",
"ovlach_data", "ovlach_data",

View File

@ -14,4 +14,5 @@ rocket = { version = "0.5.0", features = ["json"] }
rocket_dyn_templates = { version = "0.1.0", features = ["tera"]} rocket_dyn_templates = { version = "0.1.0", features = ["tera"]}
reqwest = { version = "0.11", features = ["json"] } reqwest = { version = "0.11", features = ["json"] }
tokio = { version = "1", features = ["full"] } tokio = { version = "1", features = ["full"] }
ovlach_data = { git = "https://glpat-Ju_qUN9Yh8qa5rEnd6T7:glpat-Ju_qUN9Yh8qa5rEnd6T7@gitlab.nanobyte.cz/ondrej/ov-site-api-data.git", tag = "v0.0.1"} ovlach_data = { git = "https://glpat-Ju_qUN9Yh8qa5rEnd6T7:glpat-Ju_qUN9Yh8qa5rEnd6T7@gitlab.nanobyte.cz/ondrej/ov-site-api-data.git", branch = "add_missing_fields"}
chrono = "0.4.31"

View File

@ -4,7 +4,7 @@ use std::collections::HashMap;
use rocket::{*, fairing::AdHoc}; use rocket::{*, fairing::AdHoc};
use rocket_dyn_templates::{Template, tera::Value}; use rocket_dyn_templates::{Template, tera::Value};
use ::serde::Deserialize; use ::serde::Deserialize;
use tools::tera::{static_filter, translate_filter}; use tools::tera::{static_filter, translate_filter, calculate_age, insert_space_every};
pub mod routes; pub mod routes;
pub mod services; pub mod services;
@ -32,6 +32,8 @@ pub fn rocket_builder() -> Rocket<Build> {
Template::try_custom(|engines| { Template::try_custom(|engines| {
engines.tera.register_filter("static", static_filter); engines.tera.register_filter("static", static_filter);
engines.tera.register_filter("translate", translate_filter); engines.tera.register_filter("translate", translate_filter);
engines.tera.register_filter("calculate_age", calculate_age);
engines.tera.register_filter("insert_space_every", insert_space_every);
Ok(()) Ok(())
}) })
).attach( ).attach(

View File

@ -9,7 +9,8 @@ use crate::{PresentationConfig, services::cv::fetch_cv_data_from_backend, CVBack
#[derive(Serialize, Debug)] #[derive(Serialize, Debug)]
struct RootPage { struct RootPage {
static_host: String, static_host: String,
cv: CV cv: CV,
download_cv_url: String,
} }
#[get("/")] #[get("/")]
@ -17,7 +18,8 @@ pub async fn index(presentation_config: &State<PresentationConfig>, cv_config: &
let context = match fetch_cv_data_from_backend(cv_config.cv_backend_path.clone()).await { let context = match fetch_cv_data_from_backend(cv_config.cv_backend_path.clone()).await {
Ok(cv) => RootPage { Ok(cv) => RootPage {
static_host: presentation_config.static_route.clone(), static_host: presentation_config.static_route.clone(),
cv cv,
download_cv_url: "FIXME!".to_string(),
}, },
Err(e) => { Err(e) => {
error!("Can't fetch CV data from backend {:?}", e); error!("Can't fetch CV data from backend {:?}", e);

View File

@ -1,7 +1,11 @@
use std::collections::HashMap; use std::collections::HashMap;
use chrono::{Utc, Datelike};
use log::error;
use rocket_dyn_templates::tera::{Value, Error}; use rocket_dyn_templates::tera::{Value, Error};
use ovlach_data::cv::chrono::from_string;
// TODO: tenhle modul je trochu prasacky..
pub fn static_filter( pub fn static_filter(
value: &Value, value: &Value,
@ -17,3 +21,47 @@ pub fn translate_filter(
) -> Result<Value, Error> { ) -> Result<Value, Error> {
return Ok(rocket_dyn_templates::tera::Value::String(format!("{}", value.as_str().unwrap()))); // TODO: fix-me here! return Ok(rocket_dyn_templates::tera::Value::String(format!("{}", value.as_str().unwrap()))); // TODO: fix-me here!
} }
pub fn insert_space_every(
value: &Value,
args: &HashMap<String, rocket_dyn_templates::tera::Value>
) -> Result<Value, Error> {
let mut input = value.as_u64().unwrap().to_string();
let times = args.get("times").unwrap().as_u64().unwrap();
let mut result = String::new();
for (index, ch) in input.chars().enumerate() {
if index > 0 && index as u64 % times == 0 {
result.push(' ');
}
result.push(ch);
}
Ok(rocket_dyn_templates::tera::Value::String(result))
}
pub fn calculate_age(
value: &Value,
args: &HashMap<String, rocket_dyn_templates::tera::Value>
) -> Result<Value, Error> {
error!("{:?}", value.as_str());
//let s = value.to_string().trim_matches('"'); // TODO: unwrap here!
let value = from_string(value.as_str().unwrap().into());
match value {
Ok(value) => {
let current_date = Utc::now().naive_utc().date();
let mut age = current_date.year() - value.year();
// Adjust age if the birthday hasn't occurred yet this year
age = if current_date.month() < value.month() ||
(current_date.month() == value.month() && current_date.day() < value.day()) {
age - 1
} else {
age
};
Ok(rocket_dyn_templates::tera::Value::String(age.to_string()))
}
Err(e) => panic!("Can't parse date: {}", e)
}
}

View File

@ -28,7 +28,7 @@
<header class="d-print-none"> <header class="d-print-none">
<div class="container text-center text-lg-left"> <div class="container text-center text-lg-left">
<div class="pt-4 clearfix"> <div class="pt-4 clearfix">
<h1 class="site-title mb-0">Walter Patterson</h1> <h1 class="site-title mb-0">{{ cv.person.name }} {{ cv.person.surname }}</h1>
<div class="site-nav"> <div class="site-nav">
<nav role="navigation"> <nav role="navigation">
<ul class="nav justify-content-center"> <ul class="nav justify-content-center">

View File

@ -18,18 +18,37 @@
<div class="header-social mb-3 d-print-none" data-aos="zoom-in" data-aos-delay="200"> <div class="header-social mb-3 d-print-none" data-aos="zoom-in" data-aos-delay="200">
<nav role="navigation"> <nav role="navigation">
<ul class="nav justify-content-center"> <ul class="nav justify-content-center">
<li class="nav-item"><a class="nav-link" href="https://twitter.com/templateflip" title="Twitter"><i class="fab fa-twitter"></i><span class="menu-title sr-only">Twitter</span></a> {% if cv.social.facebook %}
</li> <li class="nav-item">
<li class="nav-item"><a class="nav-link" href="https://www.facebook.com/templateflip" title="Facebook"><i class="fab fa-facebook"></i><span class="menu-title sr-only">Facebook</span></a> <a class="nav-link" href="{{ cv.social.facebook }}" title="Facebook"><i class="fab fa-facebook"></i><span class="menu-title sr-only">Facebook</span></a>
</li> </li>
<li class="nav-item"><a class="nav-link" href="https://www.instagram.com/templateflip" title="Instagram"><i class="fab fa-instagram"></i><span class="menu-title sr-only">Instagram</span></a> {% endif %}
</li> {% if cv.social.github %}
<li class="nav-item"><a class="nav-link" href="https://github.com/templateflip" title="Github"><i class="fab fa-github"></i><span class="menu-title sr-only">Github</span></a> <li class="nav-item">
</li> <a class="nav-link" href="{{ cv.social.github }}" title="github"><i class="fab fa-github"></i><span class="menu-title sr-only">Github</span></a>
</li>
{% endif %}
{% if cv.social.linkedin %}
<li class="nav-item">
<a class="nav-link" href="{{ cv.social.linkedin }}" title="github"><i class="fab fa-linkedin"></i><span class="menu-title sr-only">Linkedin</span></a>
</li>
{% endif %}
{% if cv.social.instagram %}
<li class="nav-item">
<a class="nav-link" href="{{ cv.social.instagram }}" title="github"><i class="fab fa-instagram"></i><span class="menu-title sr-only">Instagram</span></a>
</li>
{% endif %}
{% if cv.social.mastodon %}
<li class="nav-item">
<a class="nav-link" href="{{ cv.social.mastodon }}" title="github"><i class="fab fa-mastodon"></i><span class="menu-title sr-only">Mastodon</span></a>
</li>
{% endif %}
</ul> </ul>
</nav> </nav>
</div> </div>
<div class="d-print-none"><a class="btn btn-outline-light btn-lg shadow-sm mt-1 me-3" href="material-resume.pdf" data-aos="fade-right" data-aos-delay="700">Download CV</a><a class="btn btn-info btn-lg shadow-sm mt-1" href="#contact" data-aos="fade-left" data-aos-delay="700">Hire Me</a></div> <div class="d-print-none">
<a class="btn btn-outline-light btn-lg shadow-sm mt-1 me-3" href="{{ download_cv_url }}" data-aos="fade-right" data-aos-delay="700">{{ "Download CV" | translate }}</a>
<a class="btn btn-info btn-lg shadow-sm mt-1" href="#contact" data-aos="fade-left" data-aos-delay="700"> {{ "Hire me" | translate }} </a></div>
</div> </div>
</div> </div>
</div> </div>
@ -40,9 +59,8 @@
<div class="about-section"> <div class="about-section">
<div class="row"> <div class="row">
<div class="col-md-6"> <div class="col-md-6">
<h2 class="h2 fw-light mb-4">About Me</h2> <h2 class="h2 fw-light mb-4">{{ "About Me" | translate }} </h2>
<p>Hello! Im Walter Patterson. I am passionate about UI/UX design and Web Design. I am a skilled <strong>front-end developer</strong> and master of graphic design tools such as Photoshop and Sketch. I am a quick learner and a team worker that gets the job done.</p> <p>LoremIPSUM chat gpt pomuze!</p>
<p>I can easily capitalize on low hanging fruits and quickly maximize timely deliverables for real-time schemas.</p>
</div> </div>
<div class="col-md-5 offset-lg-1"> <div class="col-md-5 offset-lg-1">
<div class="row mt-2"> <div class="row mt-2">
@ -51,32 +69,28 @@
<div class="pb-2 fw-bolder"><i class="far fa-calendar-alt pe-2 text-muted" style="width:24px;opacity:0.85;"></i> Age</div> <div class="pb-2 fw-bolder"><i class="far fa-calendar-alt pe-2 text-muted" style="width:24px;opacity:0.85;"></i> Age</div>
</div> </div>
<div class="col-sm-7"> <div class="col-sm-7">
<div class="pb-2">28</div> <div class="pb-2">{{ cv.person.birthday | calculate_age }}</div>
</div> </div>
<div class="col-sm-5"> <div class="col-sm-5">
<div class="pb-2 fw-bolder"><i class="far fa-envelope pe-2 text-muted" style="width:24px;opacity:0.85;"></i> Email</div> <div class="pb-2 fw-bolder"><i class="far fa-envelope pe-2 text-muted" style="width:24px;opacity:0.85;"></i> Email</div>
</div> </div>
<div class="col-sm-7"> <div class="col-sm-7">
<div class="pb-2">walter@company.com</div> <div class="pb-2"> {{ cv.person.email }} </div>
</div>
<div class="col-sm-5">
<div class="pb-2 fw-bolder"><i class="fab fa-skype pe-2 text-muted" style="width:24px;opacity:0.85;"></i> Skype</div>
</div>
<div class="col-sm-7">
<div class="pb-2">username@skype.com</div>
</div> </div>
<div class="col-sm-5"> <div class="col-sm-5">
<div class="pb-2 fw-bolder"><i class="fas fa-phone pe-2 text-muted" style="width:24px;opacity:0.85;"></i> Phone</div> <div class="pb-2 fw-bolder"><i class="fas fa-phone pe-2 text-muted" style="width:24px;opacity:0.85;"></i> Phone</div>
</div> </div>
<div class="col-sm-7"> <div class="col-sm-7">
<div class="pb-2">+0718-111-0011</div> <div class="pb-2">+ {{cv.person.phone | insert_space_every(times=3) }}</div>
</div>
<div class="col-sm-5">
<div class="pb-2 fw-bolder"><i class="fas fa-map-marker-alt pe-2 text-muted" style="width:24px;opacity:0.85;"></i> Address</div>
</div>
<div class="col-sm-7">
<div class="pb-2">131 W, City Center, New York, U.S.A</div>
</div> </div>
{% if cv.person.address %}
<div class="col-sm-5">
<div class="pb-2 fw-bolder"><i class="fas fa-map-marker-alt pe-2 text-muted" style="width:24px;opacity:0.85;"></i> Address</div>
</div>
<div class="col-sm-7">
<div class="pb-2">{{ cv.person.address }} </div>
</div>
{% endif %}
</div> </div>
</div> </div>
</div> </div>