diff --git a/.gitignore b/.gitignore index b91127c..4258c63 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,7 @@ # Ignore bundler config. /.bundle - +/borrar # Ignore the default SQLite database. /db/*.sqlite3 /db/*.sqlite3-* diff --git a/Dockerfile b/Dockerfile index bb7a6c9..5cd5753 100644 --- a/Dockerfile +++ b/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 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} WORKDIR ${REGULAR_USER_APP_HOME} diff --git a/app/admin/users_admin.rb b/app/admin/users_admin.rb index ee82032..5350adc 100644 --- a/app/admin/users_admin.rb +++ b/app/admin/users_admin.rb @@ -5,31 +5,32 @@ Trestle.resource(:users) do # Customize the table columns shown on the index view. # - # table do - # column :name - # column :created_at, align: :center - # actions - # end + table do + column :name + column :created_at, align: :center + actions do |toolbar, instance, admin| + 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. - # - # form do |user| - # text_field :name - # - # row do - # col { datetime_field :updated_at } - # col { datetime_field :created_at } - # end - # end + controller do + def generate + user = admin.find_instance(params) + ac = ActionController::Base.new() + tex_content = ac.render_to_string(layout: false, template: 'templates/awesome/resume', locals: { "@user": user } ) + destination_dir = "#{Rails.root}/app/views/templates/awesome" + `cd #{destination_dir} && make clean` + File.open("#{destination_dir}/resume.tex", "w") do |f| + f << tex_content + 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 - # permitted. If you do not have full trust in your users, you should explicitly - # define the list of permitted parameters. - # - # 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 + routes do + post :generate, on: :member + end end diff --git a/app/controllers/work_experiences_controller.rb b/app/controllers/work_experiences_controller.rb deleted file mode 100644 index 3aba3f2..0000000 --- a/app/controllers/work_experiences_controller.rb +++ /dev/null @@ -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 diff --git a/app/views/templates/awesome/Makefile b/app/views/templates/awesome/Makefile new file mode 100644 index 0000000..2232637 --- /dev/null +++ b/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 diff --git a/app/views/templates/awesome/awesome-cv.cls b/app/views/templates/awesome/awesome-cv.cls new file mode 100644 index 0000000..f2e717a --- /dev/null +++ b/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 +% 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]{} +\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{}{} +% Usage: \firstname{} +% Usage: \lastname{} +% Usage: \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{
} +\newcommand*{\address}[1]{\def\@address{#1}} + +% Define writer's position +% Usage: \position{} +\newcommand*{\position}[1]{\def\@position{#1}} + +% Defines writer's mobile (optional) +% Usage: \mobile{} +\newcommand*{\mobile}[1]{\def\@mobile{#1}} + +% Defines writer's email (optional) +% Usage: \email{} +\newcommand*{\email}[1]{\def\@email{#1}} + +% Defines writer's date of birth (optional) +% Usage: \dateofbirth{} +\newcommand*{\dateofbirth}[1]{\def\@dateofbirth{#1}} + +% Defines writer's homepage (optional) +% Usage: \homepage{} +\newcommand*{\homepage}[1]{\def\@homepage{#1}} + +% Defines writer's github (optional) +% Usage: \github{} +\newcommand*{\github}[1]{\def\@github{#1}} + +% Defines writer's gitlab (optional) +% Usage: \gitlab{} +\newcommand*{\gitlab}[1]{\def\@gitlab{#1}} + +% Defines writer's bitbucket (optional) +% Usage: \bitbucket{} +\newcommand*{\bitbucket}[1]{\def\@bitbucket{#1}} + +% Defines writer's stackoverflow profile (optional) +% Usage: \stackoverflow{}{} +% 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{} +\newcommand*{\linkedin}[1]{\def\@linkedin{#1}} + +% Defines writer's orcid (optional) +% Usage: \orcid{} +\newcommand*{\orcid}[1]{\def\@orcid{#1}} + +% Defines writer's twitter (optional) +% Usage: \twitter{} +\newcommand*{\twitter}[1]{\def\@twitter{#1}} + +% Defines writer's Mastodon (optional) +% Usage: \mastodon{}{} +\newcommand*{\mastodon}[2]{\def\@mastodoninstance{#1}\def\@mastodonname{#2}} + +% Defines writer's resarchgate (optional) +% Usage: \researchgate{} +\newcommand*{\researchgate}[1]{\def\@researchgate{#1}} + +% Defines writer's skype (optional) +% Usage: \skype{} +\newcommand*{\skype}[1]{\def\@skype{#1}} + +% Defines writer's reddit (optional) +% Usage: \reddit{} +\newcommand*{\reddit}[1]{\def\@reddit{#1}} + +% Defines writer's xing (optional) +% Usage: \xing{} +\newcommand*{\xing}[1]{\def\@xing{#1}} + +% Defines writer's medium profile (optional) +% Usage: \medium{} +\newcommand*{\medium}[1]{\def\@medium{#1}} + +% Defines writer's kaggle (optional) +% Usage: \kaggle{} +\newcommand*{\kaggle}[1]{\def\@kaggle{#1}} + +% Defines writer's google scholar profile (optional) +% Usage: \googlescholar{}{} +% 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{} +\newcommand*{\extrainfo}[1]{\def\@extrainfo{#1}} + +% Defines writer's quote (optional) +% Usage: \quote{} +\renewcommand*{\quote}[1]{\def\@quote{#1}} + +% Defines recipient's information (cover letter only) +% Usage: \recipient{}{} +% Usage: \recipientname{} +% Usage: \recipientaddress{} +\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{} +\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} \\ + } +} diff --git a/app/views/templates/awesome/resume.html.erb b/app/views/templates/awesome/resume.html.erb new file mode 100644 index 0000000..b0ace74 --- /dev/null +++ b/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} diff --git a/app/views/work_experiences/_form.html.erb b/app/views/work_experiences/_form.html.erb deleted file mode 100644 index 7bc0948..0000000 --- a/app/views/work_experiences/_form.html.erb +++ /dev/null @@ -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 %> diff --git a/app/views/work_experiences/_work_experience.html.erb b/app/views/work_experiences/_work_experience.html.erb deleted file mode 100644 index 731ad88..0000000 --- a/app/views/work_experiences/_work_experience.html.erb +++ /dev/null @@ -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> diff --git a/app/views/work_experiences/_work_experience.json.jbuilder b/app/views/work_experiences/_work_experience.json.jbuilder deleted file mode 100644 index 2ae0997..0000000 --- a/app/views/work_experiences/_work_experience.json.jbuilder +++ /dev/null @@ -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) diff --git a/app/views/work_experiences/cv.html.erb b/app/views/work_experiences/cv.html.erb deleted file mode 100644 index 77f0d02..0000000 --- a/app/views/work_experiences/cv.html.erb +++ /dev/null @@ -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} \ No newline at end of file diff --git a/app/views/work_experiences/edit.html.erb b/app/views/work_experiences/edit.html.erb deleted file mode 100644 index 33295e4..0000000 --- a/app/views/work_experiences/edit.html.erb +++ /dev/null @@ -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> diff --git a/app/views/work_experiences/index.html.erb b/app/views/work_experiences/index.html.erb deleted file mode 100644 index dfdcd70..0000000 --- a/app/views/work_experiences/index.html.erb +++ /dev/null @@ -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 %> diff --git a/app/views/work_experiences/index.json.jbuilder b/app/views/work_experiences/index.json.jbuilder deleted file mode 100644 index 34d7b73..0000000 --- a/app/views/work_experiences/index.json.jbuilder +++ /dev/null @@ -1 +0,0 @@ -json.array! @work_experiences, partial: "work_experiences/work_experience", as: :work_experience diff --git a/app/views/work_experiences/new.html.erb b/app/views/work_experiences/new.html.erb deleted file mode 100644 index 263ce47..0000000 --- a/app/views/work_experiences/new.html.erb +++ /dev/null @@ -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> diff --git a/app/views/work_experiences/show.html.erb b/app/views/work_experiences/show.html.erb deleted file mode 100644 index 7fd7f02..0000000 --- a/app/views/work_experiences/show.html.erb +++ /dev/null @@ -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> diff --git a/app/views/work_experiences/show.json.jbuilder b/app/views/work_experiences/show.json.jbuilder deleted file mode 100644 index 74ff57f..0000000 --- a/app/views/work_experiences/show.json.jbuilder +++ /dev/null @@ -1 +0,0 @@ -json.partial! "work_experiences/work_experience", work_experience: @work_experience diff --git a/config/routes.rb b/config/routes.rb index a118f34..85aba85 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,9 +1,3 @@ Rails.application.routes.draw do - resources :work_experiences - # 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" + root to: "trestle/dashboard#index" end diff --git a/docker-compose.yml b/docker-compose.yml index 2c32255..1380240 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,7 +5,7 @@ services: image: latext-resumes build: . ports: - - 3000:3000 + - 3003:3000 command: tail -F /home/cvrails/app/log/development.log volumes: - ./:/home/cvrails/app