Browse Source

Working version

main
rodley82 3 years ago
parent
commit
8609f09de5
  1. 2
      .gitignore
  2. 2
      Dockerfile
  3. 51
      app/admin/users_admin.rb
  4. 83
      app/controllers/work_experiences_controller.rb
  5. 11
      app/views/templates/awesome/Makefile
  6. 780
      app/views/templates/awesome/awesome-cv.cls
  7. 189
      app/views/templates/awesome/resume.html.erb
  8. 42
      app/views/work_experiences/_form.html.erb
  9. 27
      app/views/work_experiences/_work_experience.html.erb
  10. 2
      app/views/work_experiences/_work_experience.json.jbuilder
  11. 126
      app/views/work_experiences/cv.html.erb
  12. 10
      app/views/work_experiences/edit.html.erb
  13. 14
      app/views/work_experiences/index.html.erb
  14. 1
      app/views/work_experiences/index.json.jbuilder
  15. 9
      app/views/work_experiences/new.html.erb
  16. 10
      app/views/work_experiences/show.html.erb
  17. 1
      app/views/work_experiences/show.json.jbuilder
  18. 8
      config/routes.rb
  19. 2
      docker-compose.yml

2
.gitignore

@ -6,7 +6,7 @@
# Ignore bundler config. # Ignore bundler config.
/.bundle /.bundle
/borrar
# Ignore the default SQLite database. # Ignore the default SQLite database.
/db/*.sqlite3 /db/*.sqlite3
/db/*.sqlite3-* /db/*.sqlite3-*

2
Dockerfile

@ -13,7 +13,7 @@ RUN useradd --system --no-log-init --uid ${REGULAR_USER_UID} --gid ${REGULAR_USE
RUN mkdir -p ${REGULAR_USER_APP_HOME} && chown -R ${REGULAR_USER}:${REGULAR_USER} ${REGULAR_USER_APP_HOME} RUN mkdir -p ${REGULAR_USER_APP_HOME} && chown -R ${REGULAR_USER}:${REGULAR_USER} ${REGULAR_USER_APP_HOME}
RUN apt update && \ RUN apt update && \
apt install -y texlive texinfo texlive-fonts-recommended texlive-latex-extra apt install -y tmux locales-all texlive-full texlive texinfo texlive-fonts-recommended texlive-latex-extra
USER ${REGULAR_USER} USER ${REGULAR_USER}
WORKDIR ${REGULAR_USER_APP_HOME} WORKDIR ${REGULAR_USER_APP_HOME}

51
app/admin/users_admin.rb

@ -5,31 +5,32 @@ Trestle.resource(:users) do
# Customize the table columns shown on the index view. # Customize the table columns shown on the index view.
# #
# table do table do
# column :name column :name
# column :created_at, align: :center column :created_at, align: :center
# actions actions do |toolbar, instance, admin|
# end toolbar.edit if admin && admin.actions.include?(:edit)
toolbar.delete if admin && admin.actions.include?(:destroy)
toolbar.link 'Template 1', instance, action: :generate, method: :post, style: :primary, icon: "fa fa-file-pdf", target: "_blank"
end
end
# Customize the form fields shown on the new/edit views. controller do
# def generate
# form do |user| user = admin.find_instance(params)
# text_field :name ac = ActionController::Base.new()
# tex_content = ac.render_to_string(layout: false, template: 'templates/awesome/resume', locals: { "@user": user } )
# row do destination_dir = "#{Rails.root}/app/views/templates/awesome"
# col { datetime_field :updated_at } `cd #{destination_dir} && make clean`
# col { datetime_field :created_at } File.open("#{destination_dir}/resume.tex", "w") do |f|
# end f << tex_content
# end end
`cd #{destination_dir} && make`
render file: "#{destination_dir}/resume.pdf", layout: false
end
end
# By default, all parameters passed to the update and create actions will be routes do
# permitted. If you do not have full trust in your users, you should explicitly post :generate, on: :member
# define the list of permitted parameters. end
#
# For further information, see the Rails documentation on Strong Parameters:
# http://guides.rubyonrails.org/action_controller_overview.html#strong-parameters
#
# params do |params|
# params.require(:user).permit(:name, ...)
# end
end end

83
app/controllers/work_experiences_controller.rb

@ -1,83 +0,0 @@
class WorkExperiencesController < ApplicationController
before_action :set_work_experience, only: %i[ show edit update destroy ]
def cv
@user = User.last
# render layout: false, content_type: "application/octet-stream"
tex_content = render_to_string(layout: false)
`rm -Rf #{Rails.root}/temp.tex #{Rails.root}/temp.pdf`
File.open("#{Rails.root}/temp.tex", "w") do |f|
f << tex_content
end
`pdflatex -interaction=batchmode -output-directory=#{Rails.root} #{Rails.root}/temp.tex`
render file: "#{Rails.root}/temp.pdf", layout: false
end
# GET /work_experiences or /work_experiences.json
def index
@work_experiences = WorkExperience.all
end
# GET /work_experiences/1 or /work_experiences/1.json
def show
end
# GET /work_experiences/new
def new
@work_experience = WorkExperience.new
end
# GET /work_experiences/1/edit
def edit
end
# POST /work_experiences or /work_experiences.json
def create
@work_experience = WorkExperience.new(work_experience_params)
respond_to do |format|
if @work_experience.save
format.html { redirect_to work_experience_url(@work_experience), notice: "Work experience was successfully created." }
format.json { render :show, status: :created, location: @work_experience }
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @work_experience.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /work_experiences/1 or /work_experiences/1.json
def update
respond_to do |format|
if @work_experience.update(work_experience_params)
format.html { redirect_to work_experience_url(@work_experience), notice: "Work experience was successfully updated." }
format.json { render :show, status: :ok, location: @work_experience }
else
format.html { render :edit, status: :unprocessable_entity }
format.json { render json: @work_experience.errors, status: :unprocessable_entity }
end
end
end
# DELETE /work_experiences/1 or /work_experiences/1.json
def destroy
@work_experience.destroy
respond_to do |format|
format.html { redirect_to work_experiences_url, notice: "Work experience was successfully destroyed." }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_work_experience
@work_experience = WorkExperience.find(params[:id])
end
# Only allow a list of trusted parameters through.
def work_experience_params
params.require(:work_experience).permit(:period, :employer, :title, :technologies, :achivements)
end
end

11
app/views/templates/awesome/Makefile

@ -0,0 +1,11 @@
.PHONY: resume.pdf
CC = xelatex
RESUME_DIR = .
RESUME_SRCS = $(shell find $(RESUME_DIR) -name '*.tex')
resume.pdf: resume.tex $(RESUME_SRCS)
$(CC) -interaction=batchmode -output-directory=. $<
clean:
rm -rf *.aux *.log *.pdf *.tex

780
app/views/templates/awesome/awesome-cv.cls

@ -0,0 +1,780 @@
%% Start of file `awesome-cv.cls'.
% Awesome CV Class File
%
% This class has been downloaded from:
% https://github.com/posquit0/Awesome-CV
%
% Author:
% Claud D. Park <posquit0.bj@gmail.com>
% http://www.posquit0.com
%
% Notes:
% 1) This class file defines the structure and layout of the template file (cv.tex, resume.tex).
% 2) It has been written in such a way that under most circumstances you
% should not need to edit it.
%
% Class license:
% LPPL v1.3c (http://www.latex-project.org/lppl)
%
%-------------------------------------------------------------------------------
% Identification
%-------------------------------------------------------------------------------
\ProvidesClass{awesome-cv}[2017/02/05 v1.6.1 Awesome Curriculum Vitae Class]
\NeedsTeXFormat{LaTeX2e}
%-------------------------------------------------------------------------------
% Class options
%
% (need to be done before the external package loading, for example because
% we need \paperwidth, \paperheight and \@ptsize to be defined before loading
% geometry and fancyhdr)
%-------------------------------------------------------------------------------
% Options for draft or final
\DeclareOption{draft}{\setlength\overfullrule{5pt}}
\DeclareOption{final}{\setlength\overfullrule{0pt}}
% Inherit options of article
\DeclareOption*{%
\PassOptionsToClass{\CurrentOption}{article}
}
\ProcessOptions\relax
\LoadClass{article}
%-------------------------------------------------------------------------------
% 3rd party packages
%-------------------------------------------------------------------------------
% Needed to make fixed length table
\RequirePackage{array}
% Needed to handle list environment
\RequirePackage{enumitem}
% Needed to handle text alignment
\RequirePackage{ragged2e}
% Needed to configure page layout
\RequirePackage{geometry}
% Needed to make header & footer effeciently
\RequirePackage{fancyhdr}
% Needed to manage colors
\RequirePackage{xcolor}
% Needed to use \ifxetex-\else-\fi statement
\RequirePackage{ifxetex}
% Needed to use \if-\then-\else statement
\RequirePackage{xifthen}
% Needed to use a toolbox of programming tools
\RequirePackage{etoolbox}
% Needed to change line spacing in specific environment
\RequirePackage{setspace}
% Needed to manage fonts
\RequirePackage[quiet]{fontspec}
% To support LaTeX quoting style
\defaultfontfeatures{Ligatures=TeX}
% Needed to manage math fonts
\RequirePackage{unicode-math}
% Needed to use icons from font-awesome
\RequirePackage{fontawesome5}
\RequirePackage{roboto}
\RequirePackage[default,opentype]{sourcesanspro}
% Needed for the photo ID
\RequirePackage[skins]{tcolorbox}
% Needed to deal a paragraphs
\RequirePackage{parskip}
% Needed to deal hyperlink
\RequirePackage[hidelinks,unicode,pdfpagelabels=false]{hyperref}
\hypersetup{%
pdftitle={},
pdfauthor={},
pdfsubject={},
pdfkeywords={}
}
% Solves issues Warning: File `cv.out' has changed
\RequirePackage{bookmark}
%-------------------------------------------------------------------------------
% Configuration for directory locations
%-------------------------------------------------------------------------------
% Configure an optional directory location for fonts(default: 'fonts/')
% Not required anymore but left in place for backward compatability.
\newcommand*{\fontdir}[1][fonts/]{\def\@fontdir{#1}}
%-------------------------------------------------------------------------------
% Configuration for layout
%-------------------------------------------------------------------------------
%% Page Layout
% Configure page margins with geometry
\geometry{left=2.0cm, top=1.5cm, right=2.0cm, bottom=2.0cm, footskip=.5cm}
%% Header & Footer
% Set offset to each header and footer
\fancyhfoffset{0em}
% Remove head rule
\renewcommand{\headrulewidth}{0pt}
% Clear all header & footer fields
\fancyhf{}
% Enable if you want to make header or footer using fancyhdr
\pagestyle{fancy}
%-------------------------------------------------------------------------------
% Configuration for colors
%-------------------------------------------------------------------------------
% Gray-scale colors
\definecolor{white}{HTML}{FFFFFF}
\definecolor{black}{HTML}{000000}
\definecolor{darkgray}{HTML}{333333}
\definecolor{gray}{HTML}{5D5D5D}
\definecolor{lightgray}{HTML}{999999}
% Basic colors
\definecolor{green}{HTML}{C2E15F}
\definecolor{orange}{HTML}{FDA333}
\definecolor{purple}{HTML}{D3A4F9}
\definecolor{red}{HTML}{FB4485}
\definecolor{blue}{HTML}{6CE0F1}
% Text colors
\definecolor{darktext}{HTML}{414141}
\colorlet{text}{darkgray}
\colorlet{graytext}{gray}
\colorlet{lighttext}{lightgray}
\colorlet{sectiondivider}{gray}
% Awesome colors
\definecolor{awesome-emerald}{HTML}{00A388}
\definecolor{awesome-skyblue}{HTML}{0395DE}
\definecolor{awesome-red}{HTML}{DC3522}
\definecolor{awesome-pink}{HTML}{EF4089}
\definecolor{awesome-orange}{HTML}{FF6138}
\definecolor{awesome-nephritis}{HTML}{27AE60}
\definecolor{awesome-concrete}{HTML}{95A5A6}
\definecolor{awesome-darknight}{HTML}{131A28}
\colorlet{awesome}{awesome-red}
% Boolean value to switch section color highlighting
\newbool{acvSectionColorHighlight}
\setbool{acvSectionColorHighlight}{true}
% Awesome section color
\def\@sectioncolor#1#2#3{%
\ifbool{acvSectionColorHighlight}{{\color{awesome}#1#2#3}}{#1#2#3}%
}
%-------------------------------------------------------------------------------
% Configuration for fonts
%-------------------------------------------------------------------------------
\newcommand*{\headerfont}{\roboto}
\newcommand*{\headerfontlight}{\robotolight}
\newcommand*{\footerfont}{\sourcesanspro}
\newcommand*{\bodyfont}{\sourcesanspro}
\newcommand*{\bodyfontlight}{\sourcesansprolight}
%-------------------------------------------------------------------------------
% Configuration for styles
%-------------------------------------------------------------------------------
% Configure styles for each CV elements
% For fundamental structures
\newcommand*{\headerfirstnamestyle}[1]{{\fontsize{32pt}{1em}\headerfontlight\color{graytext} #1}}
\newcommand*{\headerlastnamestyle}[1]{{\fontsize{32pt}{1em}\headerfont\bfseries\color{text} #1}}
\newcommand*{\headerpositionstyle}[1]{{\fontsize{7.6pt}{1em}\bodyfont\scshape\color{awesome} #1}}
\newcommand*{\headeraddressstyle}[1]{{\fontsize{8pt}{1em}\headerfont\itshape\color{lighttext} #1}}
\newcommand*{\headersocialstyle}[1]{{\fontsize{6.8pt}{1em}\headerfont\color{text} #1}}
\newcommand*{\headerquotestyle}[1]{{\fontsize{9pt}{1em}\bodyfont\itshape\color{darktext} #1}}
\newcommand*{\footerstyle}[1]{{\fontsize{8pt}{1em}\footerfont\scshape\color{lighttext} #1}}
\newcommand*{\sectionstyle}[1]{{\fontsize{16pt}{1em}\bodyfont\bfseries\color{text}\@sectioncolor #1}}
\newcommand*{\subsectionstyle}[1]{{\fontsize{12pt}{1em}\bodyfont\scshape\textcolor{text}{#1}}}
\newcommand*{\paragraphstyle}{\fontsize{9pt}{1em}\bodyfontlight\upshape\color{text}}
% For elements of entry
\newcommand*{\entrytitlestyle}[1]{{\fontsize{10pt}{1em}\bodyfont\bfseries\color{darktext} #1}}
\newcommand*{\entrypositionstyle}[1]{{\fontsize{8pt}{1em}\bodyfont\scshape\color{graytext} #1}}
\newcommand*{\entrydatestyle}[1]{{\fontsize{8pt}{1em}\bodyfontlight\slshape\color{graytext} #1}}
\newcommand*{\entrylocationstyle}[1]{{\fontsize{9pt}{1em}\bodyfontlight\slshape\color{awesome} #1}}
\newcommand*{\descriptionstyle}[1]{{\fontsize{9pt}{1em}\bodyfontlight\upshape\color{text} #1}}
% For elements of subentry
\newcommand*{\subentrytitlestyle}[1]{{\fontsize{8pt}{1em}\bodyfont\mdseries\color{graytext} #1}}
\newcommand*{\subentrypositionstyle}[1]{{\fontsize{7pt}{1em}\bodyfont\scshape\color{graytext} #1}}
\newcommand*{\subentrydatestyle}[1]{{\fontsize{7pt}{1em}\bodyfontlight\slshape\color{graytext} #1}}
\newcommand*{\subentrylocationstyle}[1]{{\fontsize{7pt}{1em}\bodyfontlight\slshape\color{awesome} #1}}
\newcommand*{\subdescriptionstyle}[1]{{\fontsize{8pt}{1em}\bodyfontlight\upshape\color{text} #1}}
% For elements of honor
\newcommand*{\honortitlestyle}[1]{{\fontsize{9pt}{1em}\bodyfont\color{graytext} #1}}
\newcommand*{\honorpositionstyle}[1]{{\fontsize{9pt}{1em}\bodyfont\bfseries\color{darktext} #1}}
\newcommand*{\honordatestyle}[1]{{\fontsize{9pt}{1em}\bodyfont\color{graytext} #1}}
\newcommand*{\honorlocationstyle}[1]{{\fontsize{9pt}{1em}\bodyfontlight\slshape\color{awesome} #1}}
% For elements of skill
\newcommand*{\skilltypestyle}[1]{{\fontsize{10pt}{1em}\bodyfont\bfseries\color{darktext} #1}}
\newcommand*{\skillsetstyle}[1]{{\fontsize{9pt}{1em}\bodyfontlight\color{text} #1}}
% For elements of the cover letter
\newcommand*{\lettersectionstyle}[1]{{\fontsize{14pt}{1em}\bodyfont\bfseries\color{text}\@sectioncolor #1}}
\newcommand*{\recipientaddressstyle}[1]{{\fontsize{9pt}{1em}\bodyfont\scshape\color{graytext} #1}}
\newcommand*{\recipienttitlestyle}[1]{{\fontsize{11pt}{1em}\bodyfont\bfseries\color{darktext} #1}}
\newcommand*{\lettertitlestyle}[1]{{\fontsize{10pt}{1em}\bodyfontlight\bfseries\color{darktext} \underline{#1}}}
\newcommand*{\letterdatestyle}[1]{{\fontsize{9pt}{1em}\bodyfontlight\slshape\color{graytext} #1}}
\newcommand*{\lettertextstyle}{\fontsize{10pt}{1.4em}\bodyfontlight\upshape\color{graytext}}
\newcommand*{\letternamestyle}[1]{{\fontsize{10pt}{1em}\bodyfont\bfseries\color{darktext} #1}}
\newcommand*{\letterenclosurestyle}[1]{{\fontsize{10pt}{1em}\bodyfontlight\slshape\color{lighttext} #1}}
%-------------------------------------------------------------------------------
% Commands for personal information
%-------------------------------------------------------------------------------
% Define photo ID
% Usage: \photo[circle|rectangle,edge|noedge,left|right]{<path-to-image>}
\newcommand{\photo}[2][circle,edge,left]{%
\def\@photo{#2}
\@for\tmp:=#1\do{%
\ifthenelse{\equal{\tmp}{circle} \or \equal{\tmp}{rectangle}}%
{\let\@photoshape\tmp}{}%
\ifthenelse{\equal{\tmp}{edge} \or \equal{\tmp}{noedge}}%
{\let\@photoedge\tmp}{}%
\ifthenelse{\equal{\tmp}{left} \or \equal{\tmp}{right}}%
{\let\@photoalign\tmp}{}%
}%
}
\def\@photoshape{circle}
\def\@photoedge{edge}
\def\@photoalign{left}
% Define writer's name
% Usage: \name{<firstname>}{<lastname>}
% Usage: \firstname{<firstname>}
% Usage: \lastname{<lastname>}
% Usage: \familyname{<familyname>}
\newcommand*{\name}[2]{\def\@firstname{#1}\def\@lastname{#2}}
\newcommand*{\firstname}[1]{\def\@firstname{#1}}
\newcommand*{\lastname}[1]{\def\@lastname{#1}}
\newcommand*{\familyname}[1]{\def\@lastname{#1}}
\def\@familyname{\@lastname}
% Define writer's address
% Usage: \address{<address>}
\newcommand*{\address}[1]{\def\@address{#1}}
% Define writer's position
% Usage: \position{<position>}
\newcommand*{\position}[1]{\def\@position{#1}}
% Defines writer's mobile (optional)
% Usage: \mobile{<mobile number>}
\newcommand*{\mobile}[1]{\def\@mobile{#1}}
% Defines writer's email (optional)
% Usage: \email{<email address>}
\newcommand*{\email}[1]{\def\@email{#1}}
% Defines writer's date of birth (optional)
% Usage: \dateofbirth{<date>}
\newcommand*{\dateofbirth}[1]{\def\@dateofbirth{#1}}
% Defines writer's homepage (optional)
% Usage: \homepage{<url>}
\newcommand*{\homepage}[1]{\def\@homepage{#1}}
% Defines writer's github (optional)
% Usage: \github{<github-nick>}
\newcommand*{\github}[1]{\def\@github{#1}}
% Defines writer's gitlab (optional)
% Usage: \gitlab{<gitlab-nick>}
\newcommand*{\gitlab}[1]{\def\@gitlab{#1}}
% Defines writer's bitbucket (optional)
% Usage: \bitbucket{<bitbucket-nick>}
\newcommand*{\bitbucket}[1]{\def\@bitbucket{#1}}
% Defines writer's stackoverflow profile (optional)
% Usage: \stackoverflow{<so userid>}{<so username>}
% e.g.https://stackoverflow.com/users/123456/sam-smith
% would be \stackoverflow{123456}{sam-smith}
\newcommand*{\stackoverflow}[2]{\def\@stackoverflowid{#1}\def\@stackoverflowname{#2}}
% Defines writer's linked-in (optional)
% Usage: \linkedin{<linked-in-nick>}
\newcommand*{\linkedin}[1]{\def\@linkedin{#1}}
% Defines writer's orcid (optional)
% Usage: \orcid{<orcid-num>}
\newcommand*{\orcid}[1]{\def\@orcid{#1}}
% Defines writer's twitter (optional)
% Usage: \twitter{<twitter handle>}
\newcommand*{\twitter}[1]{\def\@twitter{#1}}
% Defines writer's Mastodon (optional)
% Usage: \mastodon{<instance>}{<mastodon-nick>}
\newcommand*{\mastodon}[2]{\def\@mastodoninstance{#1}\def\@mastodonname{#2}}
% Defines writer's resarchgate (optional)
% Usage: \researchgate{<researchgate-account>}
\newcommand*{\researchgate}[1]{\def\@researchgate{#1}}
% Defines writer's skype (optional)
% Usage: \skype{<skype account>}
\newcommand*{\skype}[1]{\def\@skype{#1}}
% Defines writer's reddit (optional)
% Usage: \reddit{<reddit account>}
\newcommand*{\reddit}[1]{\def\@reddit{#1}}
% Defines writer's xing (optional)
% Usage: \xing{<xing name>}
\newcommand*{\xing}[1]{\def\@xing{#1}}
% Defines writer's medium profile (optional)
% Usage: \medium{<medium account>}
\newcommand*{\medium}[1]{\def\@medium{#1}}
% Defines writer's kaggle (optional)
% Usage: \kaggle{<kaggle handle>}
\newcommand*{\kaggle}[1]{\def\@kaggle{#1}}
% Defines writer's google scholar profile (optional)
% Usage: \googlescholar{<googlescholar userid>}{<googlescholar username>}
% e.g.https://scholar.google.co.uk/citations?user=wpZDx1cAAAAJ
% would be \googlescholar{wpZDx1cAAAAJ}{Name-to-display-next-icon}
% If 'googlescholar-name' is not provided than it defaults to
% '\firstname \lastname'
\newcommand*{\googlescholar}[2]{%
\def\@googlescholarid{#1}%
\ifthenelse{\equal{#2}{}}{%
\def\@googlescholarname{\@firstname~\@lastname}%
}{%
\def\@googlescholarname{#2}%
}%
}
% Defines writer's extra information (optional)
% Usage: \extrainfo{<extra information>}
\newcommand*{\extrainfo}[1]{\def\@extrainfo{#1}}
% Defines writer's quote (optional)
% Usage: \quote{<quote>}
\renewcommand*{\quote}[1]{\def\@quote{#1}}
% Defines recipient's information (cover letter only)
% Usage: \recipient{<recipient name>}{<recipient address>}
% Usage: \recipientname{<recipient name>}
% Usage: \recipientaddress{<recipient address>}
\newcommand*{\recipient}[2]{\def\@recipientname{#1}\def\@recipientaddress{#2}}
\newcommand*{\recipientname}[1]{\def\@recipientname{#1}}
\newcommand*{\recipientaddress}[1]{\def\@recipientaddress{#1}}
% Defines the title for letter (cover letter only, optional)
% Usage: \lettertitle{<title>}
\newcommand*{\lettertitle}[1]{\def\@lettertitle{#1}}
% Defines the date for letter (cover letter only)
% Usage: \letterdate{<date>}
\newcommand*{\letterdate}[1]{\def\@letterdate{#1}}
% Defines a message of opening for letter (cover letter only)
% Usage: \letteropening{<message>}
\newcommand*{\letteropening}[1]{\def\@letteropening{#1}}
% Defines a message of closing for letter (cover letter only)
% Usage: \letterclosing{<message>}
\newcommand*{\letterclosing}[1]{\def\@letterclosing{#1}}
% Defines an enclosure for letter (cover letter only, optional)
% Usage: \letterenclosure[<enclosure name>]{<enclosure>}
\newcommand*{\letterenclname}[1][Enclosure]{\def\@letterenclname{#1}}
\newcommand*{\letterenclosure}[2][]{%
% if an optional argument is provided, use it to redefine \enclname
\ifthenelse{\equal{#1}{}}{}{\def\@letterenclname{#1}}
\def\@letterenclosure{#2}
}
%-------------------------------------------------------------------------------
% Commands for extra
%-------------------------------------------------------------------------------
%% Define helper macros a user can change easily
% Header
\newcommand{\acvHeaderNameDelim}{\space}
\newcommand{\acvHeaderAfterNameSkip}{.4mm}
\newcommand{\acvHeaderAfterPositionSkip}{.4mm}
\newcommand{\acvHeaderAfterAddressSkip}{-.5mm}
\newcommand{\acvHeaderIconSep}{\space}
\newcommand{\acvHeaderSocialSep}{\quad\textbar\quad}
\newcommand{\acvHeaderAfterSocialSkip}{6mm}
\newcommand{\acvHeaderAfterQuoteSkip}{5mm}
% Others
\newcommand{\acvSectionTopSkip}{3mm}
\newcommand{\acvSectionContentTopSkip}{2.5mm}
%-------------------------------------------------------------------------------
% Commands for utilities
%-------------------------------------------------------------------------------
% Use to align an element of tabular table
\newcolumntype{L}[1]{>{\raggedright\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}
\newcolumntype{C}[1]{>{\centering\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}
\newcolumntype{R}[1]{>{\raggedleft\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}
% Use to draw horizontal line with specific thickness
\def\vhrulefill#1{\leavevmode\leaders\hrule\@height#1\hfill \kern\z@}
% Use to execute conditional statements by checking empty string
\newcommand*{\ifempty}[3]{\ifthenelse{\isempty{#1}}{#2}{#3}}
%-------------------------------------------------------------------------------
% Commands for elements of CV structure
%-------------------------------------------------------------------------------
% Define a header for CV
% Usage: \makecvheader
\newcommand*{\makecvheader}[1][C]{%
\newcommand*{\drawphoto}{%
\ifthenelse{\isundefined{\@photo}}{}{%
\newlength{\photodim}
\ifthenelse{\equal{\@photoshape}{circle}}%
{\setlength{\photodim}{1.3cm}}%
{\setlength{\photodim}{1.8cm}}%
\ifthenelse{\equal{\@photoedge}{edge}}%
{\def\@photoborder{darkgray}}%
{\def\@photoborder{none}}%
\begin{tikzpicture}%
\node[\@photoshape, draw=\@photoborder, line width=0.3mm, inner sep=\photodim, fill overzoom image=\@photo] () {};
\end{tikzpicture}
}%
}
\newlength{\headertextwidth}
\newlength{\headerphotowidth}
\ifthenelse{\isundefined{\@photo}}{
\setlength{\headertextwidth}{\textwidth}
\setlength{\headerphotowidth}{0cm}
}{%
\setlength{\headertextwidth}{0.76\textwidth}
\setlength{\headerphotowidth}{0.24\textwidth}
}%
\begin{minipage}[c]{\headerphotowidth}%
\ifthenelse{\equal{\@photoalign}{left}}{\raggedright\drawphoto}{}
\end{minipage}
\begin{minipage}[c]{\headertextwidth}
\ifthenelse{\equal{#1}{L}}{\raggedright}{\ifthenelse{\equal{#1}{R}}{\raggedleft}{\centering}}
\headerfirstnamestyle{\@firstname}\headerlastnamestyle{{}\acvHeaderNameDelim\@lastname}%
\\[\acvHeaderAfterNameSkip]%
\ifthenelse{\isundefined{\@position}}{}{\headerpositionstyle{\@position\\[\acvHeaderAfterPositionSkip]}}%
\ifthenelse{\isundefined{\@address}}{}{\headeraddressstyle{\@address\\[\acvHeaderAfterAddressSkip]}}%
\headersocialstyle{%
\newbool{isstart}%
\setbool{isstart}{true}%
\ifthenelse{\isundefined{\@mobile}}%
{}%
{%
\href{tel:\@mobile}{\faMobile\acvHeaderIconSep\@mobile}%
\setbool{isstart}{false}%
}%
\ifthenelse{\isundefined{\@email}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{mailto:\@email}{\faEnvelope\acvHeaderIconSep\@email}%
}%
\ifthenelse{\isundefined{\@dateofbirth}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
% \mbox prevents wrapping of elements%
\mbox{\faBirthdayCake\acvHeaderIconSep\@dateofbirth}%
}%
\ifthenelse{\isundefined{\@homepage}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{http://\@homepage}{\faHome\acvHeaderIconSep\@homepage}%
}%
\ifthenelse{\isundefined{\@github}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://github.com/\@github}{\faGithubSquare\acvHeaderIconSep\@github}%
}%
\ifthenelse{\isundefined{\@gitlab}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://gitlab.com/\@gitlab}{\faGitlab\acvHeaderIconSep\@gitlab}%
}%
\ifthenelse{\isundefined{\@bitbucket}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://bitbucket.com/\@bitbucket}{\faBitbucket\acvHeaderIconSep\@bitbucket}%
}%
\ifthenelse{\isundefined{\@stackoverflowid}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://stackoverflow.com/users/\@stackoverflowid}{\faStackOverflow\acvHeaderIconSep\@stackoverflowname}%
}%
\ifthenelse{\isundefined{\@linkedin}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://www.linkedin.com/in/\@linkedin}{\faLinkedin\acvHeaderIconSep\@linkedin}%
}%
\ifthenelse{\isundefined{\@orcid}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://orcid.org/\@orcid}{\faOrcid\acvHeaderIconSep\@orcid}%
}%
\ifthenelse{\isundefined{\@twitter}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://twitter.com/\@twitter}{\faTwitter\acvHeaderIconSep\@twitter}%
}%
\ifthenelse{\isundefined{\@mastodonname}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://\@mastodoninstance/@\@mastodonname}{\faMastodon\acvHeaderIconSep\@mastodonname}%
}%
\ifthenelse{\isundefined{\@skype}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\faSkype\acvHeaderIconSep\@skype%
}%
\ifthenelse{\isundefined{\@reddit}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://www.reddit.com/user/\@reddit}{\faReddit\acvHeaderIconSep\@reddit}%
}%
\ifthenelse{\isundefined{\@researchgate}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://www.researchgate.net/profile/\@researchgate}{\faResearchgate\acvHeaderIconSep\@researchgate}%
}%
\ifthenelse{\isundefined{\@xing}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://www.xing.com/profile/\@xing}{\faXingSquare\acvHeaderIconSep\@xing}
}%
\ifthenelse{\isundefined{\@medium}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://medium.com/@\@medium}{\faMedium\acvHeaderIconSep\@medium}%
}%
\ifthenelse{\isundefined{\@kaggle}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://kaggle.com/\@kaggle}{\faKaggle\acvHeaderIconSep\@kaggle}%
}%
\ifthenelse{\isundefined{\@googlescholarid}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://scholar.google.com/citations?user=\@googlescholarid}{\faGraduationCap\acvHeaderIconSep\@googlescholarname}%
}%
\ifthenelse{\isundefined{\@extrainfo}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\@extrainfo%
}%
} \\[\acvHeaderAfterSocialSkip]%
\ifthenelse{\isundefined{\@quote}}%
{}%
{\headerquotestyle{\@quote\\}\vspace{\acvHeaderAfterQuoteSkip}}%
\end{minipage}%
\begin{minipage}[c]{\headerphotowidth}%
\ifthenelse{\equal{\@photoalign}{right}}{\raggedleft\drawphoto}{}
\end{minipage}
}
% Define a footer for CV
% Usage: \makecvfooter{<left>}{<center>}{<right>}
\newcommand*{\makecvfooter}[3]{%
\fancyfoot{}
\fancyfoot[L]{\footerstyle{#1}}
\fancyfoot[C]{\footerstyle{#2}}
\fancyfoot[R]{\footerstyle{#3}}
}
% Define a section for CV
% Usage: \cvsection{<section-title>}
\newcommand{\cvsection}[1]{%
\vspace{\acvSectionTopSkip}
\sectionstyle{#1}
\phantomsection
\color{sectiondivider}\vhrulefill{0.9pt}
}
% Define a subsection for CV
% Usage: \cvsubsection{<subsection-title>}
\newcommand{\cvsubsection}[1]{%
\vspace{\acvSectionContentTopSkip}
\vspace{-3mm}
\subsectionstyle{#1}
\phantomsection
}
% Define a paragraph for CV
\newenvironment{cvparagraph}{%
\vspace{\acvSectionContentTopSkip}
\vspace{-3mm}
\paragraphstyle
}{%
\par
\vspace{2mm}
}
% Define an environment for cventry
\newenvironment{cventries}{%
\vspace{\acvSectionContentTopSkip}
\begin{center}
}{%
\end{center}
}
% Define an entry of cv information
% Usage: \cventry{<position>}{<title>}{<location>}{<date>}{<description>}
\newcommand*{\cventry}[5]{%
\vspace{-2.0mm}
\setlength\tabcolsep{0pt}
\setlength{\extrarowheight}{0pt}
\begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} L{\textwidth - 4.5cm} R{4.5cm}}
\ifempty{#2#3}
{\entrypositionstyle{#1} & \entrydatestyle{#4} \\}
{\entrytitlestyle{#2} & \entrylocationstyle{#3} \\
\entrypositionstyle{#1} & \entrydatestyle{#4} \\}
\multicolumn{2}{L{\textwidth}}{\descriptionstyle{#5}}
\end{tabular*}%
}
% Define an environment for cvsubentry
\newenvironment{cvsubentries}{%
\begin{center}
}{%
\end{center}
}
% Define a subentry of cv information
% Usage: \cvsubentry{<position>}{<title>}{<date>}{<description>}
\newcommand*{\cvsubentry}[4]{%
\setlength\tabcolsep{0pt}
\setlength{\extrarowheight}{0pt}
\begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} L{\textwidth - 4.5cm} R{4.5cm}}
\setlength\leftskip{0.2cm}
\subentrytitlestyle{#2} & \ifthenelse{\equal{#1}{}}
{\subentrydatestyle{#3}}{}
\ifthenelse{\equal{#1}{}}
{}
{\subentrypositionstyle{#1} & \subentrydatestyle{#3} \\}
\ifthenelse{\equal{#4}{}}
{}
{\multicolumn{2}{L{17.0cm}}{\subdescriptionstyle{#4}} \\}
\end{tabular*}
}
% Define an environment for cvhonor
\newenvironment{cvhonors}{%
\vspace{\acvSectionContentTopSkip}
\vspace{-2mm}
\begin{center}
\setlength\tabcolsep{0pt}
\setlength{\extrarowheight}{0pt}
\begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} C{1.5cm} L{\textwidth - 4.0cm} R{2.5cm}}
}{%
\end{tabular*}
\end{center}
}
% Define a line of cv information(honor, award or something else)
% Usage: \cvhonor{<position>}{<title>}{<location>}{<date>}
\newcommand*{\cvhonor}[4]{%
\honordatestyle{#4} & \honorpositionstyle{#1}, \honortitlestyle{#2} & \honorlocationstyle{#3} \\
}
% Define an environment for cvskill
\newenvironment{cvskills}{%
\vspace{\acvSectionContentTopSkip}
\vspace{-2.0mm}
\begin{center}
\setlength\tabcolsep{1ex}
\setlength{\extrarowheight}{0pt}
\begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} r L{\textwidth * \real{0.9}}}
}{%
\end{tabular*}
\end{center}
}
% Define a line of cv information(skill)
% Usage: \cvskill{<type>}{<skillset>}
\newcommand*{\cvskill}[2]{%
\skilltypestyle{#1} & \skillsetstyle{#2} \\
}
% Define an environment for cvitems(for cventry)
\newenvironment{cvitems}{%
\vspace{-4.0mm}
\begin{justify}
\begin{itemize}[leftmargin=2ex, nosep, noitemsep]
\setlength{\parskip}{0pt}
\renewcommand{\labelitemi}{\bullet}
}{%
\end{itemize}
\end{justify}
\vspace{-4.0mm}
}
%-------------------------------------------------------------------------------
% Commands for elements of Cover Letter
%-------------------------------------------------------------------------------
% Define an environment for cvletter
\newenvironment{cvletter}{%
\lettertextstyle
}{%
}
% Define a section for the cover letter
% Usage: \lettersection{<section-title>}
\newcommand{\lettersection}[1]{%
\par\addvspace{2.5ex}
\phantomsection{}
\lettersectionstyle{#1}
\color{sectiondivider}\vhrulefill{0.9pt}
\par\nobreak\addvspace{0.4ex}
\lettertextstyle
}
% Define a title of the cover letter
% Usage: \makelettertitle
\newcommand*{\makelettertitle}{%
\vspace{8.4mm}
\setlength\tabcolsep{0pt}
\setlength{\extrarowheight}{0pt}
\begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} L{\textwidth - 4.5cm} R{4.5cm}}
\recipienttitlestyle{\@recipientname} & \letterdatestyle{\@letterdate}
\end{tabular*}
\begin{singlespace}
\recipientaddressstyle{\@recipientaddress} \\\\
\end{singlespace}
\ifthenelse{\isundefined{\@lettertitle}}
{}
{\lettertitlestyle{\@lettertitle} \\}
\lettertextstyle{\@letteropening}
}
% Define a closing of the cover letter
% Usage: \makeletterclosing
\newcommand*{\makeletterclosing}{%
\vspace{3.4mm}
\lettertextstyle{\@letterclosing} \\\\
\letternamestyle{\@firstname\ \@lastname}
\ifthenelse{\isundefined{\@letterenclosure}}
{\\}
{%
\\\\\\
\letterenclosurestyle{\@letterenclname: \@letterenclosure} \\
}
}

189
app/views/templates/awesome/resume.html.erb

@ -0,0 +1,189 @@
%!TEX TS-program = xelatex
%!TEX encoding = UTF-8 Unicode
% Awesome CV LaTeX Template for CV/Resume
%
% This template has been downloaded from:
% https://github.com/posquit0/Awesome-CV
%
% Author:
% Claud D. Park <posquit0.bj@gmail.com>
% http://www.posquit0.com
%
% Template license:
% CC BY-SA 4.0 (https://creativecommons.org/licenses/by-sa/4.0/)
%
%-------------------------------------------------------------------------------
% CONFIGURATIONS
%-------------------------------------------------------------------------------
% A4 paper size by default, use 'letterpaper' for US letter
\documentclass[11pt, a4paper]{awesome-cv}
% Configure page margins with geometry
\geometry{left=1.4cm, top=.8cm, right=1.4cm, bottom=1.8cm, footskip=.5cm}
% Color for highlights
% Awesome Colors: awesome-emerald, awesome-skyblue, awesome-red, awesome-pink, awesome-orange
% awesome-nephritis, awesome-concrete, awesome-darknight
\colorlet{awesome}{awesome-red}
% Uncomment if you would like to specify your own color
% \definecolor{awesome}{HTML}{CA63A8}
% Colors for text
% Uncomment if you would like to specify your own color
% \definecolor{darktext}{HTML}{414141}
% \definecolor{text}{HTML}{333333}
% \definecolor{graytext}{HTML}{5D5D5D}
% \definecolor{lighttext}{HTML}{999999}
% \definecolor{sectiondivider}{HTML}{5D5D5D}
% Set false if you don't want to highlight section with awesome color
\setbool{acvSectionColorHighlight}{true}
% If you would like to change the social information separator from a pipe (|) to something else
\renewcommand{\acvHeaderSocialSep}{\quad\textbar\quad}
%-------------------------------------------------------------------------------
% PERSONAL INFORMATION
% Comment any of the lines below if they are not required
%-------------------------------------------------------------------------------
% Available options: circle|rectangle,edge/noedge,left/right
% \photo[rectangle,edge,right]{./examples/profile}
\name{<%= @user.name %>}{}
\position{Software Engineer{\enskip\cdotp\enskip}Security Expert}
\address{<%= @user.address %>}
\mobile{<%= @user.phone %>}
\email{<%= @user.email %>}
%\dateofbirth{January 1st, 1970}
\homepage{<%= @user.other_page_url %>}
\github{<%= @user.github %>}
% \linkedin{posquit0}
% \gitlab{gitlab-id}
% \stackoverflow{SO-id}{SO-name}
% \twitter{@twit}
% \skype{skype-id}
% \reddit{reddit-id}
% \medium{madium-id}
% \kaggle{kaggle-id}
% \googlescholar{googlescholar-id}{name-to-display}
%% \firstname and \lastname will be used
% \googlescholar{googlescholar-id}{}
% \extrainfo{extra information}
% \quote{``Be the change that you want to see in the world."}
%-------------------------------------------------------------------------------
\begin{document}
% Print the header with above personal information
% Give optional argument to change alignment(C: center, L: left, R: right)
\makecvheader[C]
% Print the footer with 3 arguments(<left>, <center>, <right>)
% Leave any of these blank if they are not needed
\makecvfooter
{\today}
{<%= @user.name %>~~~·~~~Resume}
{\thepage}
%-------------------------------------------------------------------------------
% CV/RESUME CONTENT
% Each section is imported separately, open each file in turn to modify content
%-------------------------------------------------------------------------------
%\input{resume/summary.tex}
%-------------------------------------------------------------------------------
% SECTION TITLE
%-------------------------------------------------------------------------------
\cvsection{Summary}
%-------------------------------------------------------------------------------
% CONTENT
%-------------------------------------------------------------------------------
\begin{cvparagraph}
%---------------------------------------------------------
<%= @user.objective %>
\end{cvparagraph}
% \input{resume/experience.tex}
%-------------------------------------------------------------------------------
% SECTION TITLE
%-------------------------------------------------------------------------------
\cvsection{Work Experience}
%-------------------------------------------------------------------------------
% CONTENT
%-------------------------------------------------------------------------------
\begin{cventries}
%---------------------------------------------------------
<% @user.work_experiences.each do |w| %>
\cventry
{<%= w.title %>} % Job title
{<%= w.employer %>} % Organization
{} % Location
{<%= w.period %>} % Date(s)
{
\begin{cvitems} % Description(s) of tasks/responsibilities
\item {Provisioned an easily managable hybrid infrastructure(Amazon AWS + On-premise) utilizing IaC(Infrastructure as Code) tools like Ansible, Packer and Terraform.}
\item {Built fully automated CI/CD pipelines on CircleCI for containerized applications using Docker, AWS ECR and Rancher.}
\item {Designed an overall service architecture and pipelines of the Machine Learning based Fashion Tagging API SaaS product with the micro-services architecture.}
\item {Implemented several API microservices in Node.js Koa and in the serverless AWS Lambda functions.}
\item {Deployed a centralized logging environment(ELK, Filebeat, CloudWatch, S3) which gather log data from docker containers and AWS resources.}
\item {Deployed a centralized monitoring environment(Grafana, InfluxDB, CollectD) which gather system metrics as well as docker run-time metrics.}
\end{cvitems}
}
<% end %>
%---------------------------------------------------------
\end{cventries}
% \input{resume/education.tex}
%-------------------------------------------------------------------------------
% SECTION TITLE
%-------------------------------------------------------------------------------
\cvsection{Education}
%-------------------------------------------------------------------------------
% CONTENT
%-------------------------------------------------------------------------------
\begin{cventries}
%---------------------------------------------------------
<% @user.education_entries.each do |e| %>
\cventry
{<%= e.title %>} % Degree
{<%= e.institution %>} % Institution
{<%= e.location %>} % Location
{<%= e.period %>} % Date(s)
{
\begin{cvitems} % Description(s) bullet points
\item {<%= e.period %>}
\end{cvitems}
}
<% end %>
%---------------------------------------------------------
\end{cventries}
% \input{resume/extracurricular.tex}
%-------------------------------------------------------------------------------
\end{document}

42
app/views/work_experiences/_form.html.erb

@ -1,42 +0,0 @@
<%= form_with(model: work_experience) do |form| %>
<% if work_experience.errors.any? %>
<div style="color: red">
<h2><%= pluralize(work_experience.errors.count, "error") %> prohibited this work_experience from being saved:</h2>
<ul>
<% work_experience.errors.each do |error| %>
<li><%= error.full_message %></li>
<% end %>
</ul>
</div>
<% end %>
<div>
<%= form.label :period, style: "display: block" %>
<%= form.text_field :period %>
</div>
<div>
<%= form.label :employer, style: "display: block" %>
<%= form.text_field :employer %>
</div>
<div>
<%= form.label :title, style: "display: block" %>
<%= form.text_field :title %>
</div>
<div>
<%= form.label :technologies, style: "display: block" %>
<%= form.text_field :technologies %>
</div>
<div>
<%= form.label :achivements, style: "display: block" %>
<%= form.text_field :achivements %>
</div>
<div>
<%= form.submit %>
</div>
<% end %>

27
app/views/work_experiences/_work_experience.html.erb

@ -1,27 +0,0 @@
<div id="<%= dom_id work_experience %>">
<p>
<strong>Period:</strong>
<%= work_experience.period %>
</p>
<p>
<strong>Employer:</strong>
<%= work_experience.employer %>
</p>
<p>
<strong>Title:</strong>
<%= work_experience.title %>
</p>
<p>
<strong>Technologies:</strong>
<%= work_experience.technologies %>
</p>
<p>
<strong>Achivements:</strong>
<%= work_experience.achivements %>
</p>
</div>

2
app/views/work_experiences/_work_experience.json.jbuilder

@ -1,2 +0,0 @@
json.extract! work_experience, :id, :period, :employer, :title, :technologies, :achivements, :created_at, :updated_at
json.url work_experience_url(work_experience, format: :json)

126
app/views/work_experiences/cv.html.erb

@ -1,126 +0,0 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Stylish Curriculum Vitae
% LaTeX Template
% Version 1.1 (September 10, 2021)
%
% This template originates from:
% https://www.LaTeXTemplates.com
%
% Authors:
% Stefano (https://www.kindoblue.nl)
% Vel (vel@LaTeXTemplates.com)
%
% License:
% CC BY-NC-SA 4.0 (https://creativecommons.org/licenses/by-nc-sa/4.0/)
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\documentclass[a4paper, oneside, final]{scrartcl} % Paper options using the scrartcl class
\usepackage{scrlayer-scrpage} % Provides headers and footers configuration
\usepackage{titlesec} % Allows creating custom \section's
\usepackage{marvosym} % Allows the use of symbols
\usepackage{tabularx,colortbl} % Advanced table configurations
\usepackage{microtype} % To enable letterspacing
\usepackage[a4paper, total={7.2in, 8in}]{geometry}
\titleformat{\section}{\large\scshape\raggedright}{}{0em}{}[\titlerule] % Section formatting
\pagestyle{scrheadings} % Print the headers and footers on all pages
\addtolength{\voffset}{-0.5in} % Adjust the vertical offset - less whitespace at the top of the page
\addtolength{\textheight}{3cm} % Adjust the text height - less whitespace at the bottom of the page
% \addtolength{\hoffset}{-0.5in} % Adjust the horizontal offset - less whitespace at the top of the page
\newcommand{\gray}{\rowcolor[gray]{.95}} % Custom highlighting for the work experience and education sections
%----------------------------------------------------------------------------------------
% FOOTER SECTION
%----------------------------------------------------------------------------------------
\renewcommand{\headfont}{\normalfont\rmfamily\scshape} % Font settings for footer
\cofoot{
\fontsize{12.5}{17}\selectfont % Letter spacing and font size
\textls[150]{<%= @user.address %> {\large\textperiodcentered} Jujuy {\large\textperiodcentered} Argentina }\\ % Your mailing address
{\Large\Letter} \textls[150]{<%= @user.email %> \ {\Large\Telefon} <%= @user.phone %>} % Your email address and phone number
}
%----------------------------------------------------------------------------------------
\begin{document}
\begin{center} % Center everything in the document
%----------------------------------------------------------------------------------------
% HEADER SECTION
%----------------------------------------------------------------------------------------
{\fontsize{36}{36}\selectfont\scshape\textls[200]{<%= @user.name %>}} % Your name at the top
\vspace{1.0cm} % Extra whitespace after the large name at the top
%----------------------------------------------------------------------------------------
% OBJECTIVE
%----------------------------------------------------------------------------------------
\section{Objective}
% A position in the field of computers with special interests in business applications \\ programming, information processing, and management systems.
<%= @user.objective %>
%----------------------------------------------------------------------------------------
% WORK EXPERIENCE
%----------------------------------------------------------------------------------------
\section{Work Experience}
<% @user.work_experiences.each do |w| %>
\begin{tabularx}{0.97\linewidth}{>{\raggedleft\scshape}p{2.5cm}X}
\gray Period & \textbf{<%= w.period %>}\\
\gray Employer & \textbf{<%= w.employer %>} \hfill \\
\gray Job Title & \textbf{<%= w.title %>}\\
\gray Technologies & \textbf{<%= w.technologies %>}\\
       & <%= w.achivements %>
\end{tabularx}
\vspace{12pt}
<% end %>
%----------------------------------------------------------------------------------------
% EDUCATION
%----------------------------------------------------------------------------------------
\section{Education}
<% @user.education_entries.each do |e| %>
\begin{tabularx}{0.97\linewidth}{>{\raggedleft\scshape}p{2cm}X}
\gray Period & \textbf{<%= e.period %>}\\
\gray Title & \textbf{<%= e.title %>}\\
\gray Institution & \textbf{<%= e.institution %>} \hfill <%= e.location %>\\
%& Extra information about degree
\end{tabularx}
\vspace{12pt}
<% end %>
%----------------------------------------------------------------------------------------
% SKILLS
%----------------------------------------------------------------------------------------
\section{Skills}
\begin{tabular}{ @{} >{\bfseries}l @{\hspace{6ex}} l }
<% @user.skills.order(order: :asc).each do |s| %>
<%= s.title %> & <%= s.detail %>\\
<% end %>
\end{tabular}
%----------------------------------------------------------------------------------------
\end{center}
\end{document}

10
app/views/work_experiences/edit.html.erb

@ -1,10 +0,0 @@
<h1>Editing work experience</h1>
<%= render "form", work_experience: @work_experience %>
<br>
<div>
<%= link_to "Show this work experience", @work_experience %> |
<%= link_to "Back to work experiences", work_experiences_path %>
</div>

14
app/views/work_experiences/index.html.erb

@ -1,14 +0,0 @@
<p style="color: green"><%= notice %></p>
<h1>Work experiences</h1>
<div id="work_experiences">
<% @work_experiences.each do |work_experience| %>
<%= render work_experience %>
<p>
<%= link_to "Show this work experience", work_experience %>
</p>
<% end %>
</div>
<%= link_to "New work experience", new_work_experience_path %>

1
app/views/work_experiences/index.json.jbuilder

@ -1 +0,0 @@
json.array! @work_experiences, partial: "work_experiences/work_experience", as: :work_experience

9
app/views/work_experiences/new.html.erb

@ -1,9 +0,0 @@
<h1>New work experience</h1>
<%= render "form", work_experience: @work_experience %>
<br>
<div>
<%= link_to "Back to work experiences", work_experiences_path %>
</div>

10
app/views/work_experiences/show.html.erb

@ -1,10 +0,0 @@
<p style="color: green"><%= notice %></p>
<%= render @work_experience %>
<div>
<%= link_to "Edit this work experience", edit_work_experience_path(@work_experience) %> |
<%= link_to "Back to work experiences", work_experiences_path %>
<%= button_to "Destroy this work experience", @work_experience, method: :delete %>
</div>

1
app/views/work_experiences/show.json.jbuilder

@ -1 +0,0 @@
json.partial! "work_experiences/work_experience", work_experience: @work_experience

8
config/routes.rb

@ -1,9 +1,3 @@
Rails.application.routes.draw do Rails.application.routes.draw do
resources :work_experiences root to: "trestle/dashboard#index"
# Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html
# Defines the root path route ("/")
# root "articles#index"
get "cv", to: "work_experiences#cv"
end end

2
docker-compose.yml

@ -5,7 +5,7 @@ services:
image: latext-resumes image: latext-resumes
build: . build: .
ports: ports:
- 3000:3000 - 3003:3000
command: tail -F /home/cvrails/app/log/development.log command: tail -F /home/cvrails/app/log/development.log
volumes: volumes:
- ./:/home/cvrails/app - ./:/home/cvrails/app

Loading…
Cancel
Save