This commit is contained in:
Ondrej Vlach 2023-11-26 21:16:35 +01:00
parent 933239a52d
commit 496c8dd6fd
4 changed files with 133 additions and 152 deletions

2
Cargo.lock generated
View File

@ -1133,7 +1133,7 @@ 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?branch=add_missing_fields#16c3522851e763b883c1bdc2a235bad039f943d9" source = "git+https://glpat-Ju_qUN9Yh8qa5rEnd6T7:glpat-Ju_qUN9Yh8qa5rEnd6T7@gitlab.nanobyte.cz/ondrej/ov-site-api-data.git?branch=add_missing_fields#c37450f5ea327f95325d4f2cc587a392e6e3bc9f"
dependencies = [ dependencies = [
"chrono", "chrono",
"rocket", "rocket",

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, calculate_age, insert_space_every}; use tools::tera::{static_filter, translate_filter, calculate_age, insert_space_every, lang_entity};
pub mod routes; pub mod routes;
pub mod services; pub mod services;
@ -34,6 +34,8 @@ pub fn rocket_builder() -> Rocket<Build> {
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("calculate_age", calculate_age);
engines.tera.register_filter("insert_space_every", insert_space_every); engines.tera.register_filter("insert_space_every", insert_space_every);
// filters specific to API
engines.tera.register_filter("lang_entity", lang_entity);
Ok(()) Ok(())
}) })
).attach( ).attach(

View File

@ -22,6 +22,13 @@ pub fn translate_filter(
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 lang_entity(
value: &Value,
args: &HashMap<String, rocket_dyn_templates::tera::Value>
) -> Result<Value, Error> {
return Ok(rocket_dyn_templates::tera::Value::String(format!("{}", value.as_str().unwrap()))); // TODO: fix-me here!
}
pub fn insert_space_every( pub fn insert_space_every(
value: &Value, value: &Value,
args: &HashMap<String, rocket_dyn_templates::tera::Value> args: &HashMap<String, rocket_dyn_templates::tera::Value>

View File

@ -4,183 +4,155 @@
<div class="page-content"> <div class="page-content">
<div class="container"> <div class="container">
<div class="resume-container"> <div class="resume-container">
<div class="shadow-1-strong bg-white my-5" id="intro"> <div class="shadow-1-strong bg-white my-5" id="intro">
<div class="bg-info text-white"> <div class="bg-info text-white">
<div class="cover bg-image"><img src="{{ "images/header-background.jpg" | static(static_host = static_host) }}" /> <div class="cover bg-image"><img src="{{ "images/header-background.jpg" | static(static_host = static_host) }}" />
<div class="mask" style="background-color: rgba(0, 0, 0, 0.7);backdrop-filter: blur(2px);"> <div class="mask" style="background-color: rgba(0, 0, 0, 0.7);backdrop-filter: blur(2px);">
<div class="text-center p-5"> <div class="text-center p-5">
<div class="avatar p-1"><img class="img-thumbnail shadow-2-strong" src="images/avatar.jpg" width="160" height="160"/></div> <div class="avatar p-1"><img class="img-thumbnail shadow-2-strong" src="images/avatar.jpg" width="160" height="160"/></div>
<div class="header-bio mt-3"> <div class="header-bio mt-3">
<div data-aos="zoom-in" data-aos-delay="0"> <div data-aos="zoom-in" data-aos-delay="0">
<h2 class="h1"> {{ cv.person.name }} {{ cv.person.surname }} </h2> <h2 class="h1"> {{ cv.person.name }} {{ cv.person.surname }} </h2>
<p>{{ "DevOPS engineer/backend web developer" | translate }}</p> <p>{{ "DevOPS engineer/backend web developer" | translate }}</p>
</div>
<div class="header-social mb-3 d-print-none" data-aos="zoom-in" data-aos-delay="200">
<nav role="navigation">
<ul class="nav justify-content-center">
{% if cv.social.facebook %}
<li class="nav-item">
<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>
{% endif %}
{% if cv.social.github %}
<li class="nav-item">
<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>
</nav>
</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 class="header-social mb-3 d-print-none" data-aos="zoom-in" data-aos-delay="200">
<nav role="navigation">
<ul class="nav justify-content-center">
{% if cv.social.facebook %}
<li class="nav-item">
<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>
{% endif %}
{% if cv.social.github %}
<li class="nav-item">
<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>
</nav>
</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>
</div> </div>
</div> </div>
</div>
<div class="shadow-1-strong bg-white my-5 p-5" id="about"> <div class="shadow-1-strong bg-white my-5 p-5" id="about">
<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" | translate }} </h2> <h2 class="h2 fw-light mb-4">{{ "About Me" | translate }} </h2>
<p>LoremIPSUM chat gpt pomuze!</p> <p>LoremIPSUM chat gpt pomuze!</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">
<h2 class="h2 fw-light mb-4">Bio</h2> <h2 class="h2 fw-light mb-4">Bio</h2>
<div class="col-sm-5">
<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 class="col-sm-7">
<div class="pb-2">{{ cv.person.birthday | calculate_age }}</div>
</div>
<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>
<div class="col-sm-7">
<div class="pb-2"> {{ cv.person.email }} </div>
</div>
<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>
<div class="col-sm-7">
<div class="pb-2">+ {{cv.person.phone | insert_space_every(times=3) }}</div>
</div>
{% if cv.person.address %}
<div class="col-sm-5"> <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 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">{{ cv.person.address }} </div> <div class="pb-2">{{ cv.person.birthday | calculate_age }}</div>
</div> </div>
{% endif %} <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>
<div class="col-sm-7">
<div class="pb-2"> {{ cv.person.email }} </div>
</div>
<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>
<div class="col-sm-7">
<div class="pb-2">+ {{cv.person.phone | insert_space_every(times=3) }}</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> </div>
</div> </div>
</div>
<div class="shadow-1-strong bg-white my-5 p-5" id="skills"> <div class="shadow-1-strong bg-white my-5 p-5" id="skills">
<div class="skills-section"> <div class="skills-section">
<h2 class="h2 fw-light mb-4">Professional Skills</h2> <h2 class="h2 fw-light mb-4">{{ "Professional Skills" | translate }}</h2>
<div class="row"> <div class="row">
<div class="col-md-6"> <div class="col-md-6">
<div class="mb-3"><span class="fw-bolder">HTML</span> {% set arr_cnt = cv.skills | length %}
<div class="progress my-2 rounded" style="height: 20px"> {% set split_index = arr_cnt / 2 | round(method="ceil") %}
<div class="progress-bar bg-info" role="progressbar" data-aos="zoom-in-right" data-aos-delay="100" data-aos-anchor=".skills-section" style="width: 95%;" aria-valuenow="95" aria-valuemin="0" aria-valuemax="100">Master</div> {% for skill in cv.skills | slice(start = 0, end = split_index) %}
</div> {{ split_index}}
<div class="mb-3"><span class="fw-bolder">{{ skill.name }}</span>
<div class="progress my-2 rounded" style="height: 20px">
<div class="progress-bar bg-info" role="progressbar" data-aos="zoom-in-right" data-aos-delay="100"
data-aos-anchor=".skills-section" style="width: {% if skill.skill == "MASTER" %}100%{% endif %}{% if skill.skill == "EXPERT" %}75%{% endif %}{% if skill.skill == "INTERMEDIATE" %}50%{% endif %}{% if skill.skill == "BEGINER" %}25%{% endif %};"
aria-valuenow="95" aria-valuemin="0" aria-valuemax="100">
{{ skill.skill}}
</div>
</div>
</div>
{% endfor %}
</div> </div>
<div class="mb-3"><span class="fw-bolder">CSS</span> <div class="col-md-6">
<div class="progress my-2 rounded" style="height: 20px"> {% for skill in cv.skills | slice(start = split_index) %}
<div class="progress-bar bg-info" role="progressbar" data-aos="zoom-in-right" data-aos-delay="200" data-aos-anchor=".skills-section" style="width: 85%" aria-valuenow="85" aria-valuemin="0" aria-valuemax="100">Expert</div> {{ split_index}}
</div> <div class="mb-3"><span class="fw-bolder">{{ skill.name }}</span>
</div> <div class="progress my-2 rounded" style="height: 20px">
<div class="mb-3"><span class="fw-bolder">JavaScript</span> <div class="progress-bar bg-info" role="progressbar" data-aos="zoom-in-right" data-aos-delay="100"
<div class="progress my-2 rounded" style="height: 20px"> data-aos-anchor=".skills-section" style="width: {% if skill.skill == "MASTER" %}100%{% endif %}{% if skill.skill == "EXPERT" %}75%{% endif %}{% if skill.skill == "INTERMEDIATE" %}50%{% endif %}{% if skill.skill == "BEGINER" %}25%{% endif %};"
<div class="progress-bar bg-info" role="progressbar" data-aos="zoom-in-right" data-aos-delay="300" data-aos-anchor=".skills-section" style="width: 75%" aria-valuenow="75" aria-valuemin="0" aria-valuemax="100">Advance</div> aria-valuenow="95" aria-valuemin="0" aria-valuemax="100">
</div> {{ skill.skill}}
</div> </div>
<div class="mb-3"><span class="fw-bolder">WordPress</span> </div>
<div class="progress my-2 rounded" style="height: 20px">
<div class="progress-bar bg-info" role="progressbar" data-aos="zoom-in-right" data-aos-delay="300" data-aos-anchor=".skills-section" style="width: 75%" aria-valuenow="75" aria-valuemin="0" aria-valuemax="100">Advance</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="mb-3"><span class="fw-bolder">Adobe Photoshop</span>
<div class="progress my-2 rounded" style="height: 20px">
<div class="progress-bar bg-secondary" role="progressbar" data-aos="zoom-in-right" data-aos-delay="400" data-aos-anchor=".skills-section" style="width: 95%" aria-valuenow="95" aria-valuemin="0" aria-valuemax="100">Master</div>
</div>
</div>
<div class="mb-3"><span class="fw-bolder">Adobe Illustrator</span>
<div class="progress my-2 rounded" style="height: 20px">
<div class="progress-bar bg-secondary" role="progressbar" data-aos="zoom-in-right" data-aos-delay="400" data-aos-anchor=".skills-section" style="width: 90%" aria-valuenow="90" aria-valuemin="0" aria-valuemax="100">Expert</div>
</div>
</div>
<div class="mb-3"><span class="fw-bolder">Sketch</span>
<div class="progress my-2 rounded" style="height: 20px">
<div class="progress-bar bg-secondary" role="progressbar" data-aos="zoom-in-right" data-aos-delay="500" data-aos-anchor=".skills-section" style="width: 85%" aria-valuenow="85" aria-valuemin="0" aria-valuemax="100">Expert</div>
</div>
</div>
<div class="mb-3"><span class="fw-bolder">Adobe XD</span>
<div class="progress my-2 rounded" style="height: 20px">
<div class="progress-bar bg-secondary" role="progressbar" data-aos="zoom-in-right" data-aos-delay="600" data-aos-anchor=".skills-section" style="width: 75%" aria-valuenow="75" aria-valuemin="0" aria-valuemax="100">Beginner</div>
</div> </div>
{% endfor %}
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
<div class="shadow-1-strong bg-white my-5 p-5" id="experience"> <div class="shadow-1-strong bg-white my-5 p-5" id="experience">
<div class="work-experience-section"> <div class="work-experience-section">
<h2 class="h2 fw-light mb-4">Work Experience</h2> <h2 class="h2 fw-light mb-4">{{ "Professional Skills" | translate }}</h2>
<div class="timeline"> <div class="timeline">
<div class="timeline-card timeline-card-info" data-aos="fade-in" data-aos-delay="0"> {% for job in cv.jobs %}
<div class="timeline-head px-4 pt-3"> <div class="timeline-card timeline-card-info" data-aos="fade-in" data-aos-delay="{{ loop.index * 100 }}">
<div class="h5">Frontend Developer <span class="text-muted h6">at Creative Agency</span></div> <div class="timeline-head px-4 pt-3">
</div> <div class="h5">{{ job.title | lang_entity }} <span class="text-muted h6">at {{ job.company }}</span></div>
<div class="timeline-body px-4 pb-4"> </div>
<div class="text-muted text-small mb-3">May, 2015 - Present</div> <div class="timeline-body px-4 pb-4">
<div>Leverage agile frameworks to provide a robust synopsis for high level overviews. Iterative approaches to corporate strategy foster collaborative thinking to further the overall value proposition.</div> <div class="text-muted text-small mb-3">May, 2015 - Present</div>
</div> <div>{{ job.description | lang_entity }} </div>
</div> </div>
<div class="timeline-card timeline-card-info" data-aos="fade-in" data-aos-delay="200"> </div>
<div class="timeline-head px-4 pt-3"> {% endfor %}
<div class="h5">Graphic Designer <span class="text-muted h6">at Design Studio</span></div>
</div>
<div class="timeline-body px-4 pb-4">
<div class="text-muted text-small mb-3">June, 2013 - May, 2015</div>
<div>Override the digital divide with additional clickthroughs from DevOps. Nanotechnology immersion along the information highway will close the loop on focusing solely on the bottom line.</div>
</div>
</div>
<div class="timeline-card timeline-card-info" data-aos="fade-in" data-aos-delay="400">
<div class="timeline-head px-4 pt-3">
<div class="h5">Junior Web Developer <span class="text-muted h6">at Indie Studio</span></div>
</div>
<div class="timeline-body px-4 pb-4">
<div class="text-muted text-small mb-3">Jan, 2011 - May, 2013</div>
<div>User generated content in real-time will have multiple touchpoints for offshoring. Organically grow the holistic world view of disruptive innovation via workplace diversity and empowerment.</div>
</div>
</div> </div>
</div> </div>
</div> </div>
</div>
<div class="shadow-1-strong bg-white my-5 p-5" id="education"> <div class="shadow-1-strong bg-white my-5 p-5" id="education">
<div class="education-section"> <div class="education-section">
<h2 class="h2 fw-light mb-4">Education</h2> <h2 class="h2 fw-light mb-4">Education</h2>