From 9d12b694ce2966eee34e74d8660b2186eae2d45c Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Wed, 16 Nov 2016 18:44:18 -0600 Subject: [PATCH 01/17] fixed attachment saving bug --- app/controllers/admin/question_controller.rb | 2 +- test/controllers/admin/question_controller_test.rb | 12 ++++++++++++ test/fixtures/candidates.yml | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/app/controllers/admin/question_controller.rb b/app/controllers/admin/question_controller.rb index 1dfbb84..d68160b 100644 --- a/app/controllers/admin/question_controller.rb +++ b/app/controllers/admin/question_controller.rb @@ -62,7 +62,7 @@ module Admin def question_params params.require(:question).permit( - :quiz_id, :question, :category, :input_type, :sort, :active, :input_options, + :quiz_id, :question, :category, :attachment, :input_type, :sort, :active, :input_options, multi_choice: [], live_code: [:later, :html, :css, :js, :text] ) end diff --git a/test/controllers/admin/question_controller_test.rb b/test/controllers/admin/question_controller_test.rb index 767eada..71212b0 100644 --- a/test/controllers/admin/question_controller_test.rb +++ b/test/controllers/admin/question_controller_test.rb @@ -67,6 +67,18 @@ module Admin assert_select 'p', 'foo bar baz' end + test "should post attachment" do + question = questions(:fed1) + post admin_update_question_url(question.to_i), params: { question: + { quiz_id: quizzes(:fed).to_i, attachment: 'https://dev.perficientdigital.com/logo.png' } } + assert_redirected_to admin_question_path(question.to_i) + + get admin_question_path question.to_i + assert_select 'img' do + assert_select "[src=?]", "https://dev.perficientdigital.com/logo.png" + end + end + test "should fail to update question" do question = questions(:fed9) post admin_update_question_url(question.to_i), params: { question: { question: nil } } diff --git a/test/fixtures/candidates.yml b/test/fixtures/candidates.yml index c55d18f..a3c07f7 100644 --- a/test/fixtures/candidates.yml +++ b/test/fixtures/candidates.yml @@ -68,4 +68,4 @@ juan: # Juan has chosen "finish later" for live coders quiz: fed completed: false reminded: true - test_hash: <%= CryptSerializer.dump 'qKQo0l4dyol + test_hash: qKQo0l4dyol From 6ef65a282519210e1c5ebb761ba8e5814634a64b Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Wed, 16 Nov 2016 18:47:15 -0600 Subject: [PATCH 02/17] added test hash to reviewer email subject line --- app/mailers/reviewer_mailer.rb | 2 +- test/mailers/reviewer_mailer_test.rb | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/mailers/reviewer_mailer.rb b/app/mailers/reviewer_mailer.rb index 0f06024..9d57d89 100644 --- a/app/mailers/reviewer_mailer.rb +++ b/app/mailers/reviewer_mailer.rb @@ -4,6 +4,6 @@ class ReviewerMailer < ApplicationMailer @candidate = candidate recipients = candidate.quiz.reviewers.map(&:email) - mail to: recipients, subject: "Skills Assessment Results" + mail to: recipients, subject: "Skills Assessment Results - #{@candidate.test_hash}" end end diff --git a/test/mailers/reviewer_mailer_test.rb b/test/mailers/reviewer_mailer_test.rb index 6241752..35673eb 100644 --- a/test/mailers/reviewer_mailer_test.rb +++ b/test/mailers/reviewer_mailer_test.rb @@ -6,6 +6,7 @@ class ReviewerMailerTest < ActionMailer::TestCase candidate = candidates :dawn mail = ReviewerMailer.candidate_submission candidate assert_match "Results", mail.subject + assert_match candidate.test_hash, mail.subject assert_equal candidate.quiz.reviewers.map(&:email), mail.to assert_equal [ENV["default_mail_from"]], mail.from assert_match candidate.test_hash, mail.body.encoded From cb3042d258f519a15752bcf269345c289b58dbe5 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Wed, 16 Nov 2016 23:31:35 -0600 Subject: [PATCH 03/17] live coder labels & accordion helper --- .../stylesheets/molecules/_accordions.scss | 54 +++++++++++++++++++ .../stylesheets/molecules/_livecoder.scss | 11 +++- app/views/quiz/_live_code.html.erb | 13 +++++ 3 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 app/assets/stylesheets/molecules/_accordions.scss diff --git a/app/assets/stylesheets/molecules/_accordions.scss b/app/assets/stylesheets/molecules/_accordions.scss new file mode 100644 index 0000000..b96290b --- /dev/null +++ b/app/assets/stylesheets/molecules/_accordions.scss @@ -0,0 +1,54 @@ +.accordion { + margin-bottom: 0.75em; + + [type="checkbox"]:checked + label, + [type="checkbox"]:checked ~ label:after, + [type="checkbox"]:not(:checked) + label, + [type="checkbox"]:not(:checked) ~ label:after, + [type="radio"]:checked + label, + [type="radio"]:checked ~ label:after, + [type="radio"]:not(:checked) + label, + [type="radio"]:not(:checked) ~ label:after { + content: ""; + border: 0; + background-color: transparent; + } + + [type="checkbox"]:hover:not(:disabled) + label:before, + [type="radio"]:hover:not(:disabled) + label:before, + [type="radio"]:not(:checked) ~ label:before, + [type="checkbox"]:not(:checked) ~ label:before, + [type="radio"]:checked ~ label:before, + [type="checkbox"]:checked ~ label:before { + background-color: transparent; + border: 0; + content: "+"; + font-size: 1.3em; + line-height: 1; + } + + [type="checkbox"]:hover:checked + label:before, + [type="radio"]:hover:checked + label:before, + [type="radio"]:checked ~ label:before, + [type="checkbox"]:checked ~ label:before { + background-color: transparent; + content: "-"; + } + + [type="radio"]:not(:checked) + label, + [type="checkbox"]:not(:checked) + label, + [type="radio"]:checked + label, + [type="checkbox"]:checked + label { + padding-left: 20px; + } + + .accordion__copy { + display: none; + margin-top: 0.75em; + } + + .accordion__toggle:checked ~ .accordion__copy { + display: block; + } + +} diff --git a/app/assets/stylesheets/molecules/_livecoder.scss b/app/assets/stylesheets/molecules/_livecoder.scss index 5ca90d2..4d7c3d1 100644 --- a/app/assets/stylesheets/molecules/_livecoder.scss +++ b/app/assets/stylesheets/molecules/_livecoder.scss @@ -31,8 +31,15 @@ background-color: #fff; } -fieldset:disabled .results { - border-color: #bbb; +fieldset:disabled { + .results { + border-color: #bbb; + } + + .code-results, + .code-input label { + display: block; + } } iframe { diff --git a/app/views/quiz/_live_code.html.erb b/app/views/quiz/_live_code.html.erb index 91814dd..cce5495 100644 --- a/app/views/quiz/_live_code.html.erb +++ b/app/views/quiz/_live_code.html.erb @@ -45,6 +45,17 @@ + + +
@@ -71,6 +83,7 @@ <% # removes the no-js message %> document.getElementById("nojs<%= question.question_id %>").style.display = "none"; document.getElementById("answer<%= question.question_id %>").style.display = ""; + document.getElementById("accordion<%= question.question_id %>").style.display = ""; <% # we want the coders disabled until JS is confirmed, so form post is easier to validate %> var coders = document.querySelectorAll("[data-id=live-coder-answer] textarea"); From 85674b40a6eafe708e13bbc4b84e493a06abe310 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Thu, 17 Nov 2016 07:41:01 -0600 Subject: [PATCH 04/17] password reset link on admin login --- app/views/admin/auth/login.html.erb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/views/admin/auth/login.html.erb b/app/views/admin/auth/login.html.erb index 725a817..e7746c7 100644 --- a/app/views/admin/auth/login.html.erb +++ b/app/views/admin/auth/login.html.erb @@ -5,6 +5,12 @@

Admin Login

<%= form_for :auth, url: admin_login_path do |form| %> + <% if flash[:error].present? %> +
+ Need a <%= link_to "password reset", admin_reset_request_path %>? +
+ <% end %> +
<%= form.label :email %> <%= form.email_field :email %> From 37aa17ec1fc4e4b68ecb8d6b1d3aa03548115cf4 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Thu, 17 Nov 2016 22:43:19 -0600 Subject: [PATCH 05/17] db work --- app/models/reviewer_vote.rb | 18 ++ app/models/user.rb | 1 + .../20161118023249_candidate_review_system.rb | 18 ++ db/schema.rb | 19 +- erd.pdf | Bin 38263 -> 40602 bytes test/fixtures/answers.yml | 292 ++++++++++++++++++ test/fixtures/candidates.yml | 31 ++ test/fixtures/reviewer_votes.yml | 67 ++++ test/models/reviewer_vote_test.rb | 8 + 9 files changed, 451 insertions(+), 3 deletions(-) create mode 100644 app/models/reviewer_vote.rb create mode 100644 db/migrate/20161118023249_candidate_review_system.rb create mode 100644 test/fixtures/reviewer_votes.yml create mode 100644 test/models/reviewer_vote_test.rb diff --git a/app/models/reviewer_vote.rb b/app/models/reviewer_vote.rb new file mode 100644 index 0000000..8f52019 --- /dev/null +++ b/app/models/reviewer_vote.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true +class ReviewerVote < ApplicationRecord + # validates :user_id, uniqueness: {scope: :friend_id} + + belongs_to :candidate + belongs_to :user + + enum vote: { + undecided: 0, + yea: 1, + nay: 2 + } + + enum veto: { + approved: 1, + rejected: 2 + } +end diff --git a/app/models/user.rb b/app/models/user.rb index 35ed228..9d601e3 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -4,6 +4,7 @@ class User < ApplicationRecord has_many :candidates, foreign_key: :recruiter_id has_many :reviewer_to_quizzes has_many :quizzes, through: :reviewer_to_quizzes + has_many :votes, class_name: 'ReviewerVote' validates :email, presence: true, uniqueness: true validates :name, presence: true diff --git a/db/migrate/20161118023249_candidate_review_system.rb b/db/migrate/20161118023249_candidate_review_system.rb new file mode 100644 index 0000000..0c4c8b0 --- /dev/null +++ b/db/migrate/20161118023249_candidate_review_system.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true +class CandidateReviewSystem < ActiveRecord::Migration[5.0] + def change + create_table :reviewer_votes do |t| + t.integer :candidate_id + t.integer :user_id + t.integer :vote, default: 0, null: false + t.integer :veto, default: 0, null: false + t.datetime :last_reminded + t.boolean :locked, default: false, null: false + + t.timestamps + end + add_index :reviewer_votes, [:candidate_id, :user_id], unique: true + + add_column :candidates, :review_status, :integer, default: 0, null: false + end +end diff --git a/db/schema.rb b/db/schema.rb index 41a294d..caafb90 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20160915164450) do +ActiveRecord::Schema.define(version: 20161118023249) do create_table "answers", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| t.integer "candidate_id" @@ -33,9 +33,10 @@ ActiveRecord::Schema.define(version: 20160915164450) do t.integer "recruiter_id" t.boolean "completed" t.boolean "reminded" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.integer "quiz_id" + t.integer "review_status", default: 0, null: false t.index ["quiz_id"], name: "index_candidates_on_quiz_id", using: :btree t.index ["recruiter_id"], name: "index_candidates_on_recruiter_id", using: :btree t.index ["test_hash"], name: "index_candidates_on_test_hash", unique: true, using: :btree @@ -73,6 +74,18 @@ ActiveRecord::Schema.define(version: 20160915164450) do t.index ["quiz_id"], name: "index_reviewer_to_quizzes_on_quiz_id", using: :btree end + create_table "reviewer_votes", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| + t.integer "candidate_id" + t.integer "user_id" + t.integer "vote", default: 0, null: false + t.integer "veto", default: 0, null: false + t.datetime "last_reminded" + t.boolean "locked", default: false, null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["candidate_id", "user_id"], name: "index_reviewer_votes_on_candidate_id_and_user_id", unique: true, using: :btree + end + create_table "users", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| t.string "name" t.string "email" diff --git a/erd.pdf b/erd.pdf index 1d050f239fb87815b077a00b0d064741fcded738..d662d8da1d17a9b13d3099b6b072843ab6167ae3 100644 GIT binary patch delta 34388 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 lcwo5xzb1HEcpp!XgQK3k<3FAq#*bye1Vc+b*n delta 32122 zcmaI7Q}DIo8ATTQV#N036L(6fY$;)a`Q#S-J+y6Z^xg$<gvH)m z>n{y=bm$c991q()>}l2H_!g1CzpIT*DM|)lh8f21&`mz61zzK5kAcd z&8>(R4r+6u2E_50%;p{QS4+3bj^5X;7|qK1J9v{6v}xd zBAcSSs%?C$G^Hg#D04GrvB6VC*S*-?LO$O)&bjuqeJH49SnYpRlgD70gffMg(Scw} zV}2hKZ`b>G)FIlOi=5lr@kA|W%%uZonIY&{yD=j`1K1x8+-G--NTM zl-cBnAjPeeU_iyu0!64oa+bdD;BEfmwfW&?*lNF*@xatjr}8PDA82@-Oz=I!C=nS; zAQ;AoC~Lo8+|gloyAG#O?`wHqoTDyMFt1j41DIbLg)8u2(O+7OBu!nkGL7fIM9+Dz zq3zfH=`@9U@mV{5)37(__I+D|R8@q(4-!=g)5;efW!`Z?}}WOqt3m1uC&p@Y|oVJ-`z}Bp)5|Y|0u#MY4*yL^{X~ z2b@(~pLD(9ZglLRWtBsYzy@N18T|f!%&me}w^?p@H@br+@w8FJE`e<3eoA4bmbP+>jA!hO=fB2M{bH_EZS=EW8Mo^XnpnfoIjBwSxNk!{qjn zoSJMjOvRJ&LQQ2(`H&cm6v8H+_46p+svl8JE;wbnlflN0XXIw(F{WRi?2A~#=Hdw= zgpYGh(khi-$FwA>n=AT5NjdjBMkHL1wbIR-z4O|ZD%{G1@{eVF#rLeK3Bi31I-u8E z2byKBW4=)K8fbe2%7I|j^pf?U3VK%4N`EBrUC!uyjAskc7rtT=@Ta7Q=ZqzW+s2VF z!GO^lH&M(LMaC`bDO{Ie7O96JZUAT2FdoPy_LZy5kC5yD*5H|2ZR z=(7QE;^j+{9eDGN%WPKim2Vq^ax#aQU-_&bjTrL@Hl$w-y-ZAGzqLG@N_2y*T~LSn z6DO)4GL7~nJ`l+sZ?9wT6Dyf(Lb<zj9z-j+8IhK-Jd=*e-owjtmv#4+Zgnat7mcbuK6-W|asYLj>+LMKim;7bUCr{#TXPTIKg+VEkWn_f=x88y&-jvUn z(KE$7RV0brvFT4Q^KKPhUf^oP5LFgJM3rLqC3?A8@}c_KhUN`2c#pL*N`uK|m_to+ z|EQ#voqm^>``T;&eZY!7&gfbH-+f^?wvY^K+roAl`K-1}c&hR|_12s9j;Soqh?k|s znnbthTDQ3oINIo3(Tr;758wujkt~*{881ZJ4-~MM`^9^5>wZUFAd6g~6G8VyV?7)U zM@59BP%7XKOr$-K@|Oe7Nmv3ta`4S1Y~@WXuJ&)<&)UF6 z)a-E-qiI@Lo5EtMe+`|4cDocV!8oR}bhtjW2edpGr0-Sm0tR+~0uFecdWACzDNuPp zOZl0H*MpH4bO2*P@npYVL$m970*E%C4(Xr`TrmV#h8d$R1?v%Vokx^Z4TTlx$=b#^ zi?FW)6*zl{eq9l_2fJL$I+1J^98N#f7gI=*EX0|#exQNd*>*JsZ1H6(eq+GQNhgDB znQ7~=!CNIh7g%vAEym4qB~BLpvoUBi)?v)Pl*49jxB=34o@7NX&9dT=nGC+(Upwk?-tJf?LvxVR z%@rVt%Vq+96Y==kVSG*BUZjOHQfho({VvMv?u|GAitEsvV1#DT?5{)FCqMqUpk|k~ z%GgHVB!Io+CaqOc>%Y|HZOdFZ$!}~nf1Qkktp9EwcS%PmR0)NoQAaEirS;_g@KI%h zaSjp0EW7tddF2e*Z~XHN_Ik>KB{{EC?y;td{s=!j9%-q`v7TK_Voe%e`5_2blyt;8 zQipiRVLv7P7FHFCwn@$R5O%x^#}Y{zM^2J}9tQNGnsG5jwH9#6=aF^`BR!K7LQ-h{ z4i7||r7sV^LpR&v%vb%ic2Oa_mX$@(@Pq130L6)BN*HO!uy&nK#*6v%ZxvB;AcB&B z=kN2!2}>uzobd><>J9b-Z)4fV#GuhaK}HW?DbgY*`HS>*==U;cRqUa0LvmROLJC&w zunmyO2r_PaCCL+B7MgW`73*iIkxDI2_XzQMS{K9_p(A@#D#db^@sVyd(cT8eii6EX z^+ZWOqe7dRuKV@GF*83P`A)ZUVafZ8lbJtpy5#}PRw*)ZfDs72j7?D{hgrMmacuHQ z>(8!KPtt~}89Mc(^I5J~H1TUUV)#kyOLME}NL8#aVea z!v9D<30}nZH+YRQE`D0lLf@+57Lt0qb7g2^V$y17F1>#!0L1GezPCb5NR*Jz^^M1{@%) z&)l$A9Mo6Frr8G&s zjSW>*biW{1(d3Qzz6$}B3Nz~0diklsE#IyyNhGD}*^KUlr01{SQzwH8J~cLfZ6kIa zkw1|o#jQ>o(pg$M{61c~V^U&NN|^yY;Qbn9yg&5UZs1~F+ zx4XMUyI*T?|4=v{|JVctCpflimg(2+w)Ecz=ygA~u>N94P#k zgwiPXd>*?+GYB>E$_8_A0tEKY#w8_)alYwxQY-^eLR@CINLyj%rr*9l5zqlbODH-o z-Ap=ajcCmsauo*x<)1=%;<0XK@{Uy?Ie;88QF}Zp?`GGVvtwkbFzLB?|Ky<6XlfpU zR+|(x9lf!b>ngwBbQmNTV%g1rN@bTW{^uIiNur7&P(FgV8Sk~FkLjgLdGvy3>)+w2 zby3<5rLAdRUf>Rmk%&`uEAxO1sZ#b-zjUAVZ}u|hrmDoR9C{jPFZinz_%IEoq_xT< zu?LT(8@xU2?s4K?O|36yt9l4}J@(W=J*T&h+W2Y+nDVxssfto6=WB;FEiR-c?8}$u z>b7w5m64=(R0?gtX&h^o?@vEPHWMy^(720 zVYG(?Rl6#f!%2IO6b^v&PNOjaafxcYq~uPPsPv62NtK7NQK8g?75pLkASJtt@fjcq zzv)R`PqB4*eIBDpyZ!U=dSwPobx<|n;Y{9d5X)*SRxX|tGs>C|DOA&XlD4k^PBKIk zQU0m{Ui!R(K^DbC3Z*2bBi(3YKIqtk-zb&gC>&M@JF!3|&XO`+k;)87i4#Wsncx@r zxbk5AP<|=0R)^l=E+pY_ZJ4NIO=My1>zF^F?ffy;FlKh9&Mr=7M!)~H?2WBq*oYX3 z{ynm=a&RPsBI!YMvN95}GBfJIBzz(n<1iC({ga?f#GtCmM8x?&CJPZ0V}b`VeS} z;NQM^d5IWg&Fm~(EQy%@yTAW(nTVKJnK{@K>~TpFFd0w*H?YvAP+I;(U_oHus6@5_ zAR$nctkh7VqGp(t5!$9y%t5LUl*z_OwdzB9y5;DVO>)0K2GEbEKQeiUg}0jte@;u> z?=zq1PrPTGv#+)r8MHS;;uR_K=T^t6V9iO+C|`Mm7j+g+TIeMgUDf{faCa4KWtBDv z1)X}bU{0n3a!O${km7mFr*zf^bw!p9&}P31qgkhTwi`yJ#3(yV0MCdo(F8)Sl-mM2=d$aV9i5 zSp}&8yihf}P!O*; zXZm}?h1h(Kj_sc40mi3X^d_T~TQ^*pk<5rbs!*->Ojn>s4yt!J&D->W)>BT`aRXSg z-LD)coqxNC-#y!{KuDksu*H(q4O5r1F zr>(o=2%_L{PqHJH8rs)4dSwp8na3d+@BKI_TXl16VC|VP=e8?Dht5dcTv- z&I)i+2+lPb-OXJyTH1$nwjdT!JabK&x#qd1uJ}3KfzKQyECCaZXAM%@>lj+Qzbhgp zpVZqB-6U7w&$Ff4c{B8+LaTapK{}|b9bi8tZFw(rAGVhYy8$sRMD^8-EBmxddpAN`5 z#5Sv@)Ra15aVjuKpTU$HMwI?uiK>(1wjo9IAi889?nmFvtSv~=O~?KO(g%w135TK3 zjL$(o60Q3q5FuQJI3dZ2ZOj6+crl-!r%EBa0<$P#O&J37Em{A7j~txL%09wn?!?IF zPn{Ae_p?330smPsG4RG-98k;-Q6J6$8B-6qmKaf@+H~bRkGu&d4A>TTAzhDr?tAJP z&_5?Ch!nu=@dIN;xNbxFGd(0Rf=EO+E|_FV+gL5iU`Xi0&ySm?gdGLAW_ko$5BH7y zj<^}(yIZ@9dA+z(@K>7}jTs)W=eq98nTJgMIEWqUiHh_SMJno3(U}#0WZnD$`jq#x ztQv0Fck4v9FYaILQblZtU<+sJB@VLQ(+IVbumSQXEyeso^@;7tpKMIGD^VDNJ@^Sl zvqYPWpDcuT?X_q7Tpj>q#uy=->>_*6>c?>GO})xdN4LjW=U*2lE9NYioMxOAJ!VYe z%W`zYYzfEH!mSmyB+3JaJd1EAh z_;%ne*%!y%``-x0j;sKl9t8Ch+S^Ne{}cc(Rwhirj7Uq~Su2c!h>jtf+rIiD_$C`@ z4R9w$uAw(fS3q@ThF|BA z2j|mR)9xy6df8fhPMtBb0QY-#aTRQ4bTSpy-!UIDk)@M`AS`6A5kuL!tBp#ygyKuacDcU0oJG+6Qe(60l4w62B2a7Ly0CTCMJ~H_C$61Lm9<^O zuG&{15x^u9mh{(v+$osBgs!{janZC}Ju-%eR1LCwfvprvzya9U6wMz2e{a>AlZ37$jcf#IA?eOR{&N+1xlbzn$8kkgXXVas%vm3EiPrD zz0!Se)-@d$HnYog+uc3-JM-&1{cno~r1Mf3fBZB^TA!@j0x4w(C;v3B@nlrmhc*@~ zzNA;wSov}LheUDZLxS@+kD)qph=6J)U>D>|vNxX*4PRswaCTEil;cVCiWk|Z!E9j% zEdh>I`yTS*(}3Zv2q?|WT5Wd6*n%`R^{%VmvGuNTUTh7?hbfL`=a!c;;h|#eK{98- zJd9h{*cEMU>ij%Wp*E{&07aHzj*}d*~~_E3p3#qiyHy93$4YH7D;p{)z%?u zK+k+k%~VbxoGoqG)8qJ9R8bypc+Nkm4*n^5aBAk<;Y6>8{`$$S2tHW7s8FiDL{cejYiCb_{RSa>;v|_U|Qw|)FQAdh$EuOgp5-z2-f_PW;_aSCaR))U=MKh7r+$~TpyTg7v;>b zC^0Y*(tghXpV>0;ry}N?9sD&=N-{Y9XNt?Z(4T;AUPzk68iI(_L&V%vNZm9r9pBcT z;?=?KR$V#w8k|G|`BS}D_B&js_ro)uK3{=3x-x#NU+#e5c>5qHz;FyjtLRduO{-hH zTVqdSv*J~VOJOam5kPzvTkf=kJC-$u4CUHO;*S`Vy3*%fY?Muk;>bkI6M;n}gfDjL zN~9dh{6(Bdd_r78oZ=G})2{|4Co2HsZcIEgHnrlx3Y;r#?(;ZKxON~A6~+voLOcx; zR)blhTy?p@xM5_Jrcb(nEk|B)iRBB2w0tnqU(QIoW7#xh2>4uPshPt&dQdMaiEUe) zwfGuce^K8_J#Q|bQ4$lgLn!u;FJQ-Z-KNF6h5QUY-zULmdpcQbI=E-2-%>=SW}+@m z#5dW&Fz|W>y;He6=&?uX>8v&0F5XJ8>+KWxJ;-mxtHwxx8YK}L(Jw6&=mLR-$il59 z5duamh7~Vc3pj<}`9pmj;0K32rsG4X$AXa6+$vds@OtJ=!Om4DH0A7ag{sA7inbB@ z;Vi5&5fh=}IQQ;e2kG_Q4UOB=R`C0+D0tt?z!pOwdAL@?8{a+up_d}fi1fbvkOiy_ zC!`N^)Pkrlp0{f%lV9AYERWaism&CrjjK3+KffOY0O-|8wV!qV+_v^&EwZ(oA#s^ckME1C?(q2sT=<##n(0={H^0AEmI8Io+801!GYqvNdPp zTfwj#O8ri~3rw0E0{fS4EY?T8XL95{n%WsjT^@Ik9a!2LL7KdXILsA|45N)Nj1`WI z%sfzv1c3h{D7j*~Sn4@`fbhx&KBOJnEU6;ssX`gOZ8}*p;NBvuP5iBdrZHJ|+8eCb zk$ed-HgVf>zHE+!9MTv>1dx7TC785c&I9W{3=G{k9Q@KH@22y8>?_}iYcooOb#AEN zP@+GF?>J97VA&8}V8INl7%-AS1=^Kso3AqPtrLTCuTcEyXye;$zVV=QkBZ zydw4Zblq!Q)Dw?4l`q1a(BQ0a3~$(#z6O$(&oPlXBcW)$tz;$vuHR9pDG;SAm(Y2( z7XXNwH#iUGA=*!dKugyiW(1Sl(KowsaT_iBpbLCRESvYXIS&r5L_*)T^VPhnNMn$dalmV6FH07YS4{B2MWcv z6tD7lf?D~Ic9wjFw4049?|j-}v9KpvNl=xPfJzzOI`J5s$|?Vq#44l3rGE5Y5+PB=pj zi9HwPBGQlFU43j|CqgdY-aJp$DuC=Y$ggP3NkBV#W%N~B=o;DsMva=!C!L|O&R=+U z1j#kFLDacJNbeTdp4xTrM1BAVBqD!PE9A1 zMg6PA-MCy@-wZ=1Wp}tUF>5hrgvICWoc(pz)#Ee1jpSq!gkH#MUak%0YzB-AKW{Sv z$KG11zKFe9^VrL1L49c^EMS~zp9?`HKo%k#?~YbK)M~gYWx_|>a-pG80hWRijg~Hf z1uqgEtr+>}FqqN~VS?y!aO{v3wrR`gw=xQp%CqBV>t?>}`k597I#`?8)(d0lf!mHI-2X?n?4NsQ`Jj#2jK6%q2eaHA)J;+NP&}5Tv-_0Dby+_ z)|GZz)kFJEH;h2&{8Gr~uFY93UbWUcS;bqR$+Uc4X*zF3t z*4Wqh2WnSq2YpwahN%;w%yG>cG;8~;8?>vSbQtS7n-uFc>C`jU1RcwuY%(E4>!b?( z{ja#l!V%#5Dgl$w9wExkX32)9T|yrD5#D~v1#C(2Y$<~PDpjyuWMEMY{VI6|1%}W@ z4*XTYcpZ9y67|;vpH2p`wDizTY72sAXT|$*K2NM?YXS(RxX|~bWU$gkJ|Azv;4V?4 zc=$62aOp!n6;(V+c62M)B}rl2%OgY!@8#Ew;Qj4{4*+`?5b&4U2)hTYMp(izxcfAx zb|J^%o=Q5baiu*5jC`Zs@{x|2d&Pnt=geCk9U0gw>gxii=d@PtV6Lw zQ^6*S9?-QV=#?qXcd%0Yo+(M*a3>Fb)UpBAGP8S+eYSbX#cm_{&yP)~-Z%W2W3Zig zcuCF|lvNIU|9(1#lt)n8apmYT!khVdDnDQDHS^R`NhBiz_^UC}JBxfIJuI;9F`&=X z=y2}`%TAZ8_7Y6^EGlgUl@9kA!0+$I@C40lb%139{a8{|e2!APEG>`R2Bz(+XPHW( z3XgNiu=@4%3;j7S8?kD^%jr0U@0UY0-7#m5TP zz)DZ1=sTWscF=2Az@o@KJ{ixAa8`R0NRk(h7HUn_STK6OJGR- z9tg_7C_%C2*wWdMSR0yGoeQ2e>}8y6(^XkbM6hK}fgmJxPgO+a-8D zjQ`{{Fc;sO3N=9axpkEo!p|t4ns7cbElHd@?|K|=hx{I<41+%fCOoFSrH+N^2dGbS zAuBKiz#a0p%g*s9w@qq+k-UcE`#`^*&8sN{)Z*R71Fwo6P?=6gq^F3%dwupI{+Oyk zqI?+IfBLZFUjGK#spP$6s{?Kpm75UqfK!@?YMd)gc}rAhc|M~fe@Mulf~`*K)A;4^ zhUO7rdV``OpO8}CcLICXb!0;*3$tU6Sx z25gBxMh^wU%}#3#4yu4|kvqZlM&dDzyEH5yjgeL1jKu1>8s6*Q!(f8>Xqe1uOIQDb zD6fV_#`BF{HhTV@tAcc=1V>jPFm+Aktp)lksm$1C`Zer8y=pfkCQ=7OVKPevk$LNh z5^~E}8)>v*(fW%!@6%~gH&)_eJ)Y-r|0Ks z;~m3QX~hP{hP6W8nVNLW$Owk{aLH92^w`2FN0_bvRP_~xM z;i0(v&4@M^8N~MC2zS~7qM^SyIeRs|fk^JG_2aH8FbIUbb&!VIQr$<(%Q!1KmGQAA`yk!-=Sg*BXySf*K z+IK5_;TU{&%93r$81k?=c&ogdmEs0#MV`s2wu#%BK z`%eZuPs+_^lkF72CL6!S>30dWujdExU1$yeaEtfd_1aF?>-&VNqrWrS(W}ww@tGXw zLny-?*{Xo+-9r@mb1eS$>_;tgr%T0c>5~@bRC%eXy1k-R0{nX|b0wy*IXeiq5s6_m6Ty3od?H5#9_g9|8}9I~F>>Z^f6^hmj^= z*h2PsO)FA&%tqDURKl+bLb>79Z)hK}^Jpze(?iqUYHcS%3Zul-!(0Iy>6WO1%s|CB z80XMT6Gz|5BzaHQ5XW+fyGeh_LE0dKZV53veIPaq0gx8{LK-Y|G$KV^vji$fOBSGY zEg@wsNmfVy20E`VBcsp($&eX<5wIogQZlzI<&in`MhzzpnZn3+|H~ETo3i-NHWk%; zd5!lFf9F#lG}n9JCwyD9OejY-u*|@x#HBKr#C4AsM`V}mRTW1}2FHC_iGmzeIh_}o zO{HFR7vNSur#~ql;5gM4+Rpgq0Jm&fswoZtw%Hd>yB!+Za}bH^)-O$AgPy8q8|Q1@ zisAFuJCm@Ds1?Lj5iZyFgbAYyf#srgsuIc09I`O0bK{;!O~N*=;*wS)vPu;&Y%x92 z9SBQ#mxi9NgEa`WJ#UFLDv`P+Z`Kasuymzn1(fkO?OZ&5D9yrzi|5_vnkF%iok-pt z_|Y9oj7if`;wgrGEi)#Pd5Up1GUjMnXQKg#_J%MqrBJBU3dG-_HtCRzMfLqrdKb4; z9$?**7?5VJe=5!$lnqaPYJ$I9=9-UY!c&+4Xc~ME4Vc#6xHtTsA|W0zWq8NXe#zA^I`_t&87lhNn2#8yB!Ez6_H;9|@0S88_lpUj3Q~+jy zyk_mq?l#P$t%o>Ea46KOFmOR?tJEbez>TUU$Y6>fZ)X0)ifh8@wl6uVSY0`z)Pgdd z8vG^NXzu{Xt~>c850M|$kSnbhB?Z)lb85^}ep)NRG?6z5ZMW9ds~Ep;IOv#oynT~d z{EO?=#t=7I11UPtU!6me{M8b|pEsb=U?-vbA-^ijK2?WqIL+7<51y9;fQA63 z#eQH;T$X7tnWRY?+vEBem`@Y-fZFJ2ZI`6&DehAljl9Ikh=eqJGZi`K|ULn#sK< z9=Qa{hzRY#b%E>Idp8>P2_wwVlh4ZfH0$$UtQM6@nZF6+0i& zXxoMG(gdX^8)uqtGV7Q!WWgEO2XbY);m@xkjtU`MlIhC7I-U+=iNtA3F%6T%u=T6G zWP8;aX=FI49q7kPki`u0vQPxPQJ1gM8wa{iG_hU0NEw!7=%jXQ3N_L zDQ9bYp2zI6e|D^Aaq=~Yr*oBV))jcO%F1kjwxGCVi2hzOX}sxqfqb>6&0 z(@2gd18ti4w*0tP033;{TLFBXy1;=1dn%Sq5SWgtuV_XgmlO*LJ8YdIiVgW1WowSW z9wu+Nb37g2 zI^)k2#45E!gqz|cEUT-bk}d8UX40Me*-4sG?nb?%`fDD_8oOKMv(gv)Kr<_S>NzZ$ zr!{X=S(AS_pezA|MaAMRg*t_tPR-S0LuJF~>RWGm3!589l{;h1^z84FAN5x-O>j zh+Z&c+_j(9#A^gGQk?i~j%q?rT-*@;Hzw%?P-cQjCI|b6eGl*XgXvqi*7?C*pvOLE z=WoX0Vuv`Gx~%UZvRnP@^RT9CI06Xwg;_seL#Ya`(2im$%QyBH)1}4zwS%>Xq$)sM zVaz39JHO#Ha5L+%Bi9zWBA%39YC7PO`N6!QABqK<3SFHBA+E36QLTs-X-~}7P4hbl zkfjO?oLb@Z!p*R(L%SAw`z?1c@M}5q!&mR!ZXbZJ{l~mz|SzBv%zDS*^N~0XH4l3Yo(W3IS zxXZ6e?Ppf!5cKmvcQC0$OwlXadWF3Oz=@@|5F*x~9eKnJkL8YJVGU$ z2g(E!>oBdDGwa|KcAFr^1&}KmDvi|> zB8}NjfG#-J9c_z9Zkj&VuM0JzP7y09lGH$8@qm;0LX@-K z#okw-MIsnMB;|TPctis)?Zm$OM{qMD#h2cfGy?NhnOsLVI;FmD zq7LyE;*K3gpIPPb1GF6y@LUYH?Kugnf#K|GiDKQKz`5(j8`+VN1RUx_++XIzb==!G zph~6Le~VCvMilpO$+%r!C_xe_yvAo}D5-w{J}XbgP5o2(17`HMqQpVOXM{W6xw3eqQ4u`u5j*v?WOzrL}m%o(=444*@3>g-O|9 z-_LulBYc9me5qWGO~%UHGQY*23YU;YcxX!b*JXk@PFC;e=vf^>Oh5X*-&jO^iqwk0 zis-Xox!8hNf;9f@0AN1QMbJgqM~qqUT$x%*xW5FH=%qlVFqR;*aJg=|NrD-E*}&(( z=g}{Ox8AIZ!=rqq2tV$wdH_pBJ`+Vg3q?MFVwZzrm!+c5YcBU4e>MJ2tI*T1(9>Pu zxnG~_$_{6#y!z?-hXSrD)Y2 zIV{8yCVcr0Qz?QCVCxG5vD_W5e21&F+f>m9yX;56nqig{;O(2j7Bp#^Z$a@nEws@FKCUKCBa%#8jzBMDV48GghoH6 zCn@PC2y}yVNIy12MjqeifKK~39FPQB7NH0(Q6y0Lmm~vLghSEF)Me31ZFa8QOuVdz z8z1{4GA6?OW3B6uEQ)ZRrXZxhftHZ17f+NTZL@c~ySS>G`ow+7lL9kV) zU4##s=K}FB7hRk_7r-bIT+~}bXQpZkdgB>Msr+EMI-2yVVLPy=f)CGHZtzTIH0{cP z%+?L`@bUS2n+MfxSxHi7r9C;$V_Bz`ZYz&RVz{KC_Gm+7YftohkWfVaM$28|CTt5x zYrTP=H-6@`_l26tgX_;<0;R!)45z{ZP@<1@rXwK?(Pk=>9RhRiS_;_R5^SYP- z$5Gl5!_JS^>%?axq;1YX9CNz8q|BZJu@bk)r}sMOSlAi@hkQY?arC+3Nx^oQwyv&K z38h#3wS*5yQVBwHAbY-@gb$dSq&1`wd_BHn-!a!TyE1~#sT6AAQ9}JMFYENj^kG^F z!i4SS9zcMZ3E*kE?(!8(x=hwgp?0J!iR>BIsZLH+2HbW>&?p5>^pxl+S6s>SVS2Ui zwbAK}%sD~E&@w?{0nAPIy|q&Gy;k->Q>zQ*sExn8Njk#t8wtYKW{sz@n^m;ts!$h zItH;2`z<}XkKU10Qp}7&W?>G=ikaKhlewrYW@{cVsF=(9%~?^QR>W2Sz3$6#Mfi+U zRn|SX+F@BgdW%g_NAY-mm3(G$J)kSN>8-jSVoXglAqUatC~~=KIio6R*~zA^sW;ui zRol5L0br}u47c%Od)BO)F=f8Adb9uVYXW*%;z3Ae$8X9QmF<}|vme@R)rH`@>z^+b z?DcZ+F1d^=?USxfEmk~wt}s|h3tsl^doCyQuB+_tD*&N*z)hQqE)s^UTm0qT6_;Cnimm0X zt-fo+{*nq784Q)L0TB#QII8ZV>sQu|TFD+^i{As!FGQyk+hQ4f=BWU@s+(xbjbpUcL2-66U(A_kGL;GRzBaN!kOiQTmtgeknTJA zD#7VgquS3exe_fGL_U#*xeI#k8p1_LBt3DOQ>3T7ubkBWCs@>{k|)GbahbUjbwm|U+!f)db2TA%)FbBQN6zWki!8Ka7ID{8hpTY$O5 z8rOH2L+p3yH=+-gESe&+IQ+cbJNmmo0CP~m(ukc&mo3M}fM;t*TR}g&mC9z{WTh4b0NIJtimb7sr@XP)9h4ZcC(>d z$tmksO1B~Jd-}L;Wq?|pj$*#80LLgotx$CweBHt(@iVxo3`C(ZeIQCQoIj&-fdQ4t$MSpe@y4{`5>`l0#>looI6H;R}chzsru`O0aT)rJ{k27nK= zE%$87!qsAbXJy*6F&jcH(ok)O_FC6&MJUW8+b4!Eutvm|L;Q8W-Ihd#6;Dq(!m0gT z=qbZ0mEI|{bPsy@DDgK)g)>KzF=jNHf{~JukZ-n4`@K&|6e+;k4j|v`Gv1UyAvZZb znff<7Io-HHTh#vqtIbDRPEq|Kp!{#i;&L)pGfDudOE_s*PJQKa)RdB0fgV&IQyPJ3 zvtII9l&*-%IyITE*_#JyU@boT^GMk*UzHr7tus;3H4FQf zacbCc{wDHyf(P)fUjRGyQ(*kEUv>w(w~Fa=b<#_DQ=Eon>!Y`2ToEfJ<}|a&2YTI# z73-~wHxI|$S-`Km+Q%bUzpfF`IjtoARLr-FJSaNP&I(t2Q4_+H>dv0hG-zh!dn{39 z@HYZ}$5?k~rGTkTtD(Y-SgR^HK#sCa<{AaN^_Sbn&(XEe?E*B`nvszphUJOacFD7$ zs|`ykiz(Hly((FtoUGCWvJb|X5Dk)WzV2)lnynIBA+L0(GgH3|rOc#?h-osP>7d{4 z6i~lcLg1`+?l-;uK25}fF$Mw`A#kd-4dICbuWAj`@kSccHT0rZ0}Zh9_?2iM)mnI@ zP`958TQ^#vi32(~fazDyqDxFqQW5jYf$jtAqPR4v4lO91Et{;|mTC)>BG8*wjinO4x6jbHTk{eCN&7^+k30dJqWmpcI=bjr0~ zut{4zzOXdY(nsJ)^&ieA&*Y)cCf6)PXnLOXq43j7}gxMyX{;!1t%{pOGhzdUe%3N67K3?lamI?(b(W;-!j#jx&hVKLsI?#vB^-t_ zvDcKH4F+j@X;Pb(Z=ktZR?NH?)J(iyyl^wvm;>lig(g_pu#@Nz0|KAdSlJvQdv6-% zs|kbff0G0+n6RtcrQtMULyc})v7Ud$#Td0hqyl^(24K5+LTpADb=}QEFv%T3P5EZ& zS+VU}rQsNG5CfSr2{UysQKvUQW_`9cd)@H4Djj2IoM0cKyei`0Ml!#JjG2|W-X>=TCe^< zV!N5C{NK|yGt2)Bz#Pm>3EC!n5E4q-;>tn^Sti&Z%&h;&Id~EtOuiE)>ERQ?DTxsN z>nx3sla-OJoN59hJ!XQ4Sspj@zw#4hqW@Rd@t?r|9+BDqll0#*kAHL>od3v7{?&B= zhB`eBRhQm4e5c#oud}=?I#|*svnR?>q)7tOG(0T zo2qPd9Ll^V$VA~v4eqOCbdrR1nv&FqA|jfRyM5x?e?9n4r-9|!18#0++{tISX0)!m zPBJaHW*#zm)@tnzP>d0v(&3TbDCjCU>aPyEjqo`=H3|%}Hy>6qSb20u4 z-Bl5tIuou15*~G|PNTu~&+9MtvAT^0^9eHVk&mvm9OaAl*wlk@oYk7mCb@#Plzn&l zX-(HkuzVtKKuN1%`EV(0773iRZ(%P{ncqH^dfg(eH;|A71gyHs@8CYR&ocTw^yZ_+ zbX;xqT>5r4UrGgPoKsun3)=s5Jz0ADVGeyZ^Kh8aJsOX;-@!Lc0%$Cu4si#L2xh{nKO$Q0e3n@*Qbzo|>^c6_?JNs8s#X{5Xmfs)0 zw|{B}i#QszR)esE#0SrWrtV98$#PdWID4B|6=|}69C1?AiKCgY#_0Fmv>x75HZ!?; ziey_CGY7UsmyW3*;pGfRO0l(4DQ?7MT+R~g^Y8j3Ac1ZSx2)ro?pPfarSeT;6J?b? zQ5u%!4lT+w~cbUjTE1Km?2VBnJdTcf;Sj|Kl6mDXw#-s{~yNG4}Zk z`lAitrDwW@(9d*-Nbyb`h(DL~<8jZJQWx~&+Ll-h2A67Gke-drU1cA^{K-e5<1CCm z{R#by99!Ly@tSvCPO?=htbmJu+mR?gkN`{5&Bj8y!T`l%og&)49QtfDe3b3jyPQD| zWdOt;&hWU(Acsyxw1B7pqyD)8eFw1odjiOXZ}%tWMIaP0~rxXX~^1i8X2*^KZPrIG~*% zJaJYS&bse0Jo1kn?c8AKutl{#8Y=VARNxwv!V*dHW-HgpFWGFWYN3#V3Xl)&)!@_T;>_KsrFTM;xP>>PEvM!4wF`Q3 zepb3J7P|G=CtF~2(|bTub;)^f1HaHJoP~FkTE;qk^|g@%K^=7bIo@D!%>H@%2bUu@ za^Fz&j`G^hi8hv2V;e~ zL0vkcSlgpmn+R?|WG0$|;DVBXK);z7E#a2W3I!cA==Sn zsbMX2{chROr`N+tw8@ujet?ZaW+{_=5uu>Yn3bF{VLIP;7-)CbQh5QiJ6U>X8ccb2 zLblBuxG-^#$453={OYHEsLnlY=cRAHeLd~Ce502@7kFxcKvVc-uVBbav5FLhuDY5W z<&OR8YGMdq=ir2%KANyl&TszhNIf2HTApkj{%CmUdRnl*&2$CF7mh>zGPVn+mE&o( z&W_GXkNT{52ysAU5h5O_IIZ77*=8r&3z0RA=g}nS7)ij@+^zW2z%pMS#?Ba3G%*q3uIxLomPjFxUCb9<=y>-qS88J1 zoSvOlCI={4b7|xvIkFHNwmfvqE9N|uwu(XtUbx^a>y9Rrb z_iD>~`}9hb-N;T9H!uSPjP2ddEIlPB57_aD-;l992_Aip5eo5Bvl;6k3fFXIdnFvY zk>2vUq1(cFvc#1P^ZO!;_G&Wn>{`KOQF=-JH9+7ETayX+RB=Bzae1u;?u#lhHMl6J zhvuty-FPkVqjm=n57V|sDujhgiZV?h{4GBc+cWe?2{5(4;H+zhA)mlnfa2>Bu*wyK zbmxdKo^y?P^&Z2BlOr?ZYpjJiZmof8ZxP8!57tm*x7xrSXQhuF=}K?4jZmAYvee`- zt(48AkzfT3XZj(}5V1JOGZ1$AR_RG-Pl#51NqmiK#_2xBmNMra!!pR;hc(xHmciax z_Y`2h?scJ=H2dCLUwoaRdSxz)y7;sD{#If2uS4>H{0}{;hmV(YXi}7Y+NY;K zK1B7$TZ>H&dZQjWwPqCt8!Vpwcs-vDEBSWaU)a zq0_-RqlV##3gzM1aZ23=2SIxw(WjgVUwiAG#x}it6dDc5s6;7cuiD-pgi=BhTXVBl z7ovY8Xh#2N!*R~wRl#Vqy=5rHEOaLD)McoiZSaqIr(z0Y z0p{VBJAVopxPC58lje-OWl*ARb_4{{rt)KrGTYl-3oR-6fHXD(zEqV+w)y?G^C1MM zO2ZAXtR@OV!24X|-?+pa7g==*B5(C`kc75R*^8t=tyRNIP_Ru7B!_{~B%~5*jr;j7 z2?XaFzJ4=326bc|p0QE4U4RkqeYt{b14g|B;FEUempIPrIem9Qu>+q6<-~pL8ZhB) zYHTfSO&aT440s}%HfV#(9{#q(Ohg(weeb;o?G*Q5LHtV78gB!73oCCz`8-UuJLFQA zz9z&ZYfpYX^n4{-n64vLMQUx~-Nx-}{&aCuuy?rk{U*bOsP@;rX3*vK&0(@&3GiJi zWG8|M^gR50V|T7;v_o@#^r&1H!$;gW!tQJOWF18us}s#KWCF`A;49CT1Nvh>odrr@I`~tVp*4tVe?L_^0QlyG6rwdZ0!TNg*^t`7khEA5_3D_nuMNw8XHFIqPKmB)daF zCV?jQ%vJT0`WCtV{W5x{{HpK9W2dj}<$E>2GuY?rw}vRW0_P>f?S)iZ^+LF&5 z@pHxv*`wqm(h2z3lT%&9nou_7dp;pg#6)h&bdd|(x*YK9Wl89?ym;9R; z!<<;w!+-^$ZT{l6H$-Qk08l0;SAK?(Z=d=V?-gBp2I~edBrBPQ9)348tNmLRnWfWXf=Ha zM*EZR*&lnKX9<1DP4Cx2p!hrgYu2moF_HwpB5WOkQG-FO`_txrF7TdztEF=Ip4c732|UutMAEg)OA_ui=~s4|$v zjq}vVzP_45wN8?eMw>RCQnGRe)iTf}+9ftIVIyuM>5VcgsjHup;nYcGA_Z>0kWVt3 z$vzQC2_yv?rI~xK1Fz!q>BCFN{$YPXE8-A~1h2y2h1p2>Wl5&7=( z28$|{0&nPBL8?PSEzI2zf|FE{MKti4BiXsUOScV?7#aXN<0WjKq|9Wv+J)-6^)q@r zGTFRn7fj6wF%!E|kNuMG^CL|0dXG?J=k6`nX8m&Z1|{gcz~i836$rdz49k|xL_Mm( z!uubzf+BCEr*rb&%eyl!4!n*uo zm85#%vtb#_k_E^)<1x-A3$dI!0@tLmM%5E|C85@Z1xR9rXhSrrl%x`Ep0t}}Hiqjg zunez2sk#UZz}$p>X}jXe8Hf>@JH%y)m?0idc`xV!!5%*v*?4(vvzel}@2A5ICbnL5 ztphXk@BVs{q}NiZOVoS6WPey|02jC zCW>z#LUYl6cQrxK8FnXLP0^yPBTEiH&aiRdWvtX4a55NY2^)0xBX@nifoQEu@mNX5PFXj=I@Brk)?3xshUx z?)d6g1=Jb>=lFtKazwr zEvBljs+Jgwtp~8Nu>Ya8xwRC(h2niaaB%$rc{zG#=D8L!dR(*WGG0cDscH0) z7^;t|sb4ABmZp_i!1GE$FNW!Bf50{EiV};8EU=?So_3&G`+G5*SNf4>fA=jr8~?a7 z{|}UMipFo!#t45jP8@vs7Gw`6ETH|weLE_0|rA!Y}7C@o9^Dt|7t){x^=OR$=Fv>-dw>^TE3ea3^F0dUehR z9M1t}^d5$zQ!|LYS(;0TCDxy6c_+k^4W`*_!O_;a7r3t1MwA2w9{Ot_m1{*=q6&fB zG2GER!wHHehxv-cp9C1t)r&9#Nk^4df|{}hEc9Y&W)dk3`;2+JiMPIcTnaK)Xfi7l zkVi4W*zfr`#mpSminDK!#fkGlUlyt_i)G-uNdu`&aTA<;IM_lGDXi6Bk!&(X}J9bMVW7R?B-#s&^g!vET#>z6NL<3dK=%zUfy*X=duLG zt5KKTQxIgxIC!|3r^afOjTx!+nfadOemDYD5CcuSolE?L@H80MMj}DF?&M%Dpa6F= zG^6g7)?%;~#$K-VVYma7OWa(*XpFu#DoU2SfFqu2IKVTpG&d;fj3V z!*@xEc8es@U}`2|mv3{XJb5t*qU-d^=J0pMr64xf;?mvgT^_TZvjea?n2@df&xAc+ z5bSzw;XQqyAUye7AsyiO29JlRz;VHL!B&r}hY{y4zxsi|GXfUDPCj1^pV8DI0MA`p z)WJ^dzzOSK(tqd1!o`Wh5cUNJZjnp+W5`Ru3&<6Vsk{qHczluya5elDrn04$xp_2X zi(LTW7YJ7(WVb`2S;Jqq-TGjd1=-J4ugF+%Uwb|S?ioc<=#hwavcFK$V6@)Qe_r=$ zEFM}vQ-h1tlHv*Q2FCji-Mj0A0xQ#a*)ZQ!_?RZM4&{i2RHA(FKwe!O410K}AnzKr zW27fT@7s3*{%^%u3n-X%KSwi}8RIgoGMNP^O_jaG;Zw@4>I$wvucKY>zH3=J2?8|Y zd$l!+Wy=cnD$W)ZLgJ++VFiVS11zlVJbZ0?I|*vy*27MNbqP(|yadhgK+m7|21k=E49_Ht;IBa$fbcMxrgCW@=jtmfHFH^4QJ9$ zVCnt@Ny!w)W`v<|tv)+Iq)tp2bk(f;G61!H#yYEMk|12btj5*h0JP65g7zvIJvNaI zUO#TWhckh!W+Q0*GqTOW&tW5vQ2FP&HhS0nh6?=A6e={43^tP16;?UZrx><4nEmHq z!P29FM;SYfoPcis7LvMH6zc>cB)Qh&UG}joZlyJ-)bgC44ZEcDT-xsj<;Q6yZ+yk+ zIq&w}Tw*xojeaEf8_=qBb+;OaC9~lQx(yRYGeaTK!_QE4e<*%_M_W}>1$$C`F2A-S zf9)_ZFYWyHaW^<2p9g0u!pSADz2)KORVR~-mSC$@e=VJ*Xm1Q&^{^yV6_3|xOi3|b zy5M_o7;t;E{4l9ntLbLDCo?0RQlQiJWZ{Qi37JaVR5h-bB5-u&=gKPXI8+M!s?Sq~ zEmm~?C8l`P4vi^jl`+F@dVcFj`{%S`pCWuhV13l*AN?1!H7c68^vP`&v?KY`FA}0A zJ|?m*>MA%{s;A`$x+m@Ib5^#l?Cn~Q>O9G9Rad$gC*fVjf(L?_FWL)&FYhpZ zsm^@qG0?`ztU&cN_m-jwQ!PeU*=8L>?&Ry>mqtU*x~#e$39kH7mB|<`TmOIpfYp+W zc1GnorMRpdL&lb(_SdcT8tV1Q@L8$BBxb;!9vrYbObYTVpq}Q;S zLloGjc`jJ%-;{6IlL{IT9bv=WN}i!+!5x9g8QtU^1Wj`e2^(Nce0^|s_S?=Bo{p~=k8Gz~ zBcmH})@%~mc@#}poW#j1OQ?q>c=A|miwX8#On-g%`4fy$QFr_~Bm41jKz33C@y^$A zv7ud0dlLvOdq2;a@kZoWcYC-ks3r`#$jKIS{SmpY7QJgHMeW2xZK z;q)d2a3IH{oDQi~`rMVJcEa{UtZmh+LxmFgU8@S5=IcYnIK6aaS?J5A}m+NnE)W^&2H;ttc^UOZ;O?=L9V)R?Occk8@Nc_D=)ad=%GoT-I_l5EB6B=>ry z@!q}Q>vhWXhP#f};dl{KLfGl~nB|i3-b%(EdNQf-k$CLeHU^#k)9z|Fs`r@4)S0hD zAs*_oi9i|Ka=e2I&j~>?t-b1=w@s74ERdJZi9*{(GoRtANz^OfUTb5-i}OKoL3~5` zt^2beYQkZp7>I3`{e)R<3;O_XybM3O;up)bx8t7o6aHXQOl+dOkNzy1T%eh> zT*h{Q$chT5zl2oNS15`v&2)y?;_Gt`85aQecD(#yPg1g6JETqCHJ!6Ho#8f&380W2 zNloc1Rhv=&x?I-|HIT6oeJJI?Lyq7cTK*TwZP-&+x|*q6zGYeA0c*gNCg9!Jz{j+Dr)?Z*{i=So+tY+I$!!9AFjHUNB%4$3 z`BFW$^ABq?9B!VdGl}_f?lS!>5kKpy)$3Na=u>RRSYbmZ9YF}R5+`rj3>3}H5E0P`GEa|r03X&__hrr`SG zfp#Dk8)=p90AV0b2!6~FEjJ7v3O;Y?xEC>khC9T}pIv&1mQ5Ff#eNtKw7AKBh3`I; zVc>;>a}iRs${$H#L={(3s4Mnbxnu0>6>)D>v7yQ|6_mIoek^$=_K1A_5%pcP<>iNf z5R<}*Pu5a;=8U^hSuG%q4-P0nS>hnO6iRRVs%g{8Lj$4IkS-vEEyy6;2 zY8Dsav~ySHDNu!Fsh77TQZ$N`?B};N`=&hiyx5Ff`+8Tn(P}$=?mM^y|6I!5Z0DIU z@kek*v_Rp`O>6C4?_FKY=JHq3&0w>P#uIiaXBRN!2B$PdTI$HEejI34?;&mb<+7*= zx;lR!(pkzjcw@#R+P3f>byegNzj3)~?ym7ow8>ecqrt+)$7Z@nv|Z{xv5f3m4DknD zmPJPDBD0Cx#u>@zoTz7HNJCOn3Lza&+P&wCO8n}ja$UQoxVj^`G=|n>Sp2r|VIzpp z30=&ZvwefUS%j3alLRPewCKBx5f00b0)v06+-v`|`f~2qI@ch?of5%6!z7}hAt(&_ z`f+IZE(EPivXTyY|6;{O7b4zFPjLW$jEza4*tzno~VYhc2QoJq_rn zrBoN_&YzJm>nqe8N;x{q#z}r1QL# z(0%q;J$V5S-rG=cY90`2M97Gy>uN;;W2eS zq24Dn_403-1I6{)wm$vwpRIpQLglOtrb&$}M+OQU#fi>a0BdIKU02ujhK0lFj1)To z>)BId5%Ecu(RUVep%`Ye0x)>iGZCUE`&tUSVl^2|nUrV941LdecQzs9=_w${eWunQ z@G^(cQ1+XXi)tAsyFG{1_?l@~S$DM@UHn~%Oy?k9;8;d(O&`eycCY2dcK=WA!R=j_ zl5WhNNtD^i&nyPunvVtHW5-l0LFdBQKtx2a-wv!C-l#(!6Hmd2vI}?fPS^K*)*)zY zU&8l!FlZY?oM^HfqK{QFt$Kbe_0Ac(2GdB+m^jf%Hj!2jX|N0EH}PIzxVTXB%`^ z2pNiQEiSD~IFc+BZKD^e&IwC-s){)H%YG3mm{M9sxIj=uh{n5$%4&plXm5~}>=8b; zRNM@en2PPC`k+&2PAs`rd>Q)LHXLA5H<3f@4Sa0Ni}scRKgMc9&NlXn zVWDUm!>SI_iFr5WE|*Bps!!=T*JDh6A_gxWp8IYppAOw!BiW{9PDqiQq;47ft7B4G z1sJYZ(jMncpHC{UlFC^i7H=9^p<)d(kru`&<2+TD#=AA135|G472cJ~ORrg=E@C8NPccqPZAumr=v=gp9j+DYu59(*~OEm(L|J4s-d%&bL7$Lsj8A| z%4xV%_vfDyN7)o<_(kSx{Yn!_`Lh%A1E~3t+`;3zvLg`-4Ku@GbZ&~#Myd(Y@XOLA zWY-hB1I(G5bI_Kf4E7qsm@6r@m_b8eNpN`R635|X?)o30jY7JKS(P=JRB+xrtkvmd z6S}!%1KWayQmAFC^|$o%WJAeEuU*qU|3b7dD-G+)#smpobVGSwTn^lMyW~_%2Ve`` zuWM`VujWDEvbuERKc*|Vxf_X>ytBADhBnTk!YjzC#i)lcHOMMm804nj>pQu zP`r73`Mj%Vx7Ix=rQG6Omsqi=w294LglDg-WGeNDvJY+-A|TbX&f$MYzE7h}xRg{f z;KZ_j8K>JzP*cdfF541$nk#u7JqG68KM}P}JN;h8vM2*8ZyI5CHodb>q;Qh_z^r@N z_KQRoaZs4-I#Em_t*#i^>lHV-dI=gDhny=LMeWZ!c*gX^O_;@`vC=fQY%XN*2#q|F z8KGwNql&8^9IGlVTa&dwk^#DPsqN}vQI8cVb6G%WF?_Qo$?6*s1ziUr%L0il4HrJ) z#3{0>b}5JnmAOh*?GYCnaSDe6TL#*Gd{Dzq!+kE6=n{pOpdFu1A^N~rcGn=oM~IPs z2xchT#Eb;_e7s`z-Fl}s^Bi>o47@C8=)eUTr<3L9e@m|JnGd{RPT7g}93N?yyygy?N| ztt{q`Tf!(dbZr0Kx*FVnuJE?za{X~)hm1LaZ1v2Rp@2=;JQL(ZiHmk{-`n1e@duJ$ zirCv5CK8nqh^l`IW|heVB&`$n5q^8ng&uMmxVgeZ%VP{*GMB6&22RUzUXJdXaGMK$ z|I}lC!Rwff=d1SsHSVj7mpliA2ewuJ^?q^&?Z~R`F%wECD;dC31ZA-_}Z*y(XdD#7NjRhcD zYwxZOdv)1=nHKbG0AA`Xw0d6OeD<5VpZL@*K@_O(bK}J}N=l=7_N8F;LE(w~w7~@+ z{VUsXr2?u~$9U>Fs=$BO-{otJW~W^BB*ba}tw897!%7wun4vsmkgXw_TCl7J28<)T z1_q#3boq*#MRe=igBE~E-!ZX!1bL3K0ygm@10cal(6&*5B@nMs7QrD8&Jm8xf#>G} zaLP3u-lFyKcw&Bky}mZIO%=~2aG_( za|kWLhc^p$`~j{vg%;y^sSigCpAx0OU9PXzm`Od}`kpQ`s8`~;-{bi*IRL8&-*iw) zkBEiZjDUa_%_5peaR=_59n#ipW1;CS#oJup1lDC9am!l0AN2KFbkWn<(_Lj>1E-HH zZ#W~=cSE7@O4rh{09~~BXZ~C8oAa$Ld5;a)IbXR5Abajri22Rbgz}wQq{6LA zSz4CKHbP^zZn2y};^B0#;xl?&o|Wd>-Q^&ka57-mAN}{E%IcTkr>f^?+spfV!lN}m z>BBDDRo*`*BGXwJAIp)vFZY+TIwu~xx14_OBd67dUsqAqCn2Et$x|5FFB|Z_MMp-7 zeXEKrGNQ-DGm1S-G*3BKqf86lCgHYwPJ6)7aNXxd?xq zezpT{txpj-%X`T05ylo7ceP})CoHR8Ss3U0gtII@4Bg#l`t=^T^^hEH%k+mjP&z`x z#hlDd$#%-xFYc!j8_L9?xvdTsM_YUABBPpC4F(I{x8@eroN;~e&t%{Asl7#DFAq@l zKn;31q&_hCtz@z5zf}aYnFXhpjj{63u~h`*()k_%NjGbN{!7|R=*EfJc zY_TygezZcUC<2QTJGKhFwdh)>`8+nJ%lkN{;A5f=TwiMsX(d{1csw5DthhYVH}iBn zjKXOyx%4i4&sb$7Sig_HIoeLq2cF(8zV#J3IK8tTb6Hr#!4Oz(SQ<;JpuaXaq_m!W`!Hi)>o2lxpHIiP90Mh~~491sB@2C$`_m;nRe>a0nBPD=1*R)$k z1IF4C!PS+pV9KKK$_NL0dPk=3p&sg+ICg_Cc!on-Cxl_LR|K)`^H?HnQqmW;UbXLY zCxRQlM^-|gud#btwn-7Q+l2(Ewkag)cOp6v?G%&}F z9xvYQk?t}p?~9HFCIeN2NZWpb45Dy=72l{8e$!{F8B)z5?>4VyEq0G_dl1+XG<-qs z*bilOP;BPsbJJWmO^GEC^c&mX&}sdh*9a09)MNiqWvjcH;e&C4Ty*}E7Czl7l0=AN!UXV9e7O=J zn0jya7RDMeDbCvPBQVTHn+&;02vaAKlCSz>p-%&51Fi$T1H}U(=&%v05W9#H3x2f+ z&_9p@!fk#BhY6jNx~putg{!u;-{*> z6(fWa2)`pytIR_&2 zMO8; z%;fhskU?TEEG(by6L(>v5{nIl0s8HQxP5G#=wLc}^c4iF|}XHjUH${yux#Nh|J+imrAomJ{yH=ljvtFApF|tT%BPLLq;cM*Mo7 za`*#0!|_b5t27`bUjFJwFQ{g=!OC_DcV&*ls=ZA*=?i@czm?RvVr&^~RM}*(B79KJ zH(}S^zHj&{5ZiC5rH@JuxK%> z_VZfMbb5E`3y^>%IJuUh!GE+bnkYeE1UDVv%GVr^?yYS49Gg>^_}PS078rFjy{^Zf zvwZ<{nwig2cE)E3q09NJKicZvV^*L2xQf{O7LO>8>ULjVy?D+)eKE9U_qd=>-Yw=|5`uOeH7I~~V-nxprnQn5D&kcbtt*@|AbVwQ3yK8H2CGxJXTn|f0kLPX zvkFk}90vSuE&<3yObI0UUi6X2h>Nt2Uj|>zJ@xmNx#X}Kwpd)KKd6`#`7?@bH*#1! ze#%KxhwCHREWCEgxbJ)vj(g1UljP!_>TKCUef#s>I*ZXvl&1T+0S6465;&?Pl@LLe zAHX5xv{@tEPPH^2O=O8aQ4^NyS#u=ek`S=L4-Z_}YA4{F?3q;6q#kx(JksgrUE{!A z8?sV9ipL6OXxZse(1-=hNGg9L4}FNsbs6i(^U$COCvjX3jWeoLs3uW; zGGUd>2~2s_t{7jzxPfgNYm-@(sVY{lx30)&EWbT>;cXXfQ(ZS)|M8l*R`U847{XW4 zEdk6{=DpcWP`@$WV|XRn`}T_GB*xV5a`WlWaetvg^+E|s&=h^~pt_|$oi;bJ{VX$) zfNKCt7K^Tq>ZwSO)T7pK9>a+%Rg}gtquSNnPoo>MMz)_qL7||+iYi3c7sz%kad_6e zV?Ei~KTiPCC@#!g>@Y-7zm;heZCRCMkQQ*{Y%bfLLlzCiyx4X2cRi)B<{0?coY7d} zW7Fi@Pt#^j^fT*oYXm4S`Gy@D9#J_Xy)weCKI+sCV1I$)&ik0CX$Egw=oAP_C%SJ$?$-Jn{x1_Cn$er4Be z??ct;b057R?5tl}Q0;@N6H+D9T7uMV0_4f9L zkPq66>@W`DO^4YYcBNz8mw>;a-c8?nC=qMu6*S63XI<%h(AOQ>^EUDBHN!pwM*9yi z+D37_hby&=%T{+KcM3<16ti-jd$wto~6 zfL`HMkxY#M2mUvD{tQ>l4APDAFLKK0N9|ZLl0P4)V@v6fXp>=qN_worltdd4JO;I9Cb1=5C-ZQFn}ZfK=K5~f*}AFxO$rS8cMLt@i9HJGV6L)pDR#?#^5WS!}t>X&>{L0e%%P*?ay$C9#v#K_W_l>uz!yF*~6%}>rXZaR=WA)qh z`zJ%Ue$K(AWbkICH&K(zc2NwsBOd;dxz2CC-Jr*(F*kX~d$sa4v zNUr;z`)NYB`8C)UU1NP>Z~YD-stBcHX9~J5W^{_HDalPOmt*1-Ma5T}W_WEESSRoI zFdO?9&N@;yN;ZM!-Z8GLKx6Om#}G#uFX`vb-49}Lo4G=ZjoVAr8ivEqnxFoIlK8ve z&NN)hqVX!_#fqZ8et;lBlfkcRLb{BhhJlK|@BzbiM-h>& zF1xB%Wdl)=(;W|&WT?&^5%r}(x>qab2~{Lrljt7cZoI(h63@~@qd|l_pY_JC({{|R zXYiA0BQ8a{@ribTUoHcMcp7i)75n`c3_Xgr{Ges}8g*)zYrnR{6 zb`s?``f|jXXiWTFd<^a3tDSaj372(Ub^mO_d_w0~J-xN&9mfdeAjgGu=c1Xt^O?)$ zMJxZQ+NJLkS`${(;ri#!oZ}piZigEjeb3qWHKCX*(`8b_W!1|z942ANNd)~UB=(^r zEo>wpW6JvXs-S)38#7Z1zBVkV6oL_E!`W@!?>-CHk z!N=!j^|IPogEuvg+205cj*EBi+bskvVZO0UOjIP})FU;^*GtcyTk_Ty40f@0d=B+? z2{zWw#jf@6wVwP+2K`e;%>E~rGpR-9&r_Q`;P+`dX4I`1h{c%9f{H^TOQ+<3k@Ct$ z;ZyEBTkt8sBpR=uiM4dj-pFZY)t}mnDpi21;4KW*{+BcpWoo>SIPuQ6IMU| zg)sebxqiucmlr7~NXrW)0rYIgQt!jGMV)U zf*Fx=X@sx^#mG5q$4qo`UmQlA5vH`iL&KoNo^DP z@wD#oBSJ|As-mh|uCuE3Hk_&{m0FGdH#vV?f_?;b)L=XN5Zlb@F0K3ZR(r$(Ad=Txsy}Z9s@97Y|^z=M6VoQc?nO!IhI-Qm&J-nMG%UHT4gNkNIpSWzx}fx=(gxuU!7J$a{~CyA3t zkW!MGVjG{lhJIgXd!@iBOr=>0jWD}mdy*@EEMQ74mL*jLS~x9A6 zU-*m6TP9zL$bmDY>ji^1Sh8_9dtu&8rP=nmUgPZHB0%Kbj4|bXnG@*&!lLW5+dw|i z%*o%xA8W80q?g`p0zSW+}bl z$INH_NW{bEP`f5e`gFL?6?z|CypT^V3SF6@&X?KMTB<5OF{Qk;Tg*IB2IF65OJ>RL z1IS`@xPS?6Vfo18=VOIVyeOfmas|>Qw82KlpQ$YtzSUQu?P3J0qG~`$7uIW9j*E;? z9JtkKieujA?RkoQhBGYsjyH(D=D|J*FlWY^px`MCkah`=ONuclm)bNT#Rz6rL{)R; zG7K!k>zr4xj{AZ)D)OK~6J#w#YNM2diBc781_FvaJWQih(UIB+WY&nzBgCtfHVy@y zj*2X)!ET2nz^tkki3Sl&*`&a55)v4iqih%Ve&H-{BT@RkVwP5;LD|DlgzT0i(xR%W zCDMYBu1(Q%Q9!n)C$i+swT-CCDdHw<8!EG;P1)0>1mpf;r~P5Kgfza6x}E)Dr!4~H za^Tv|EyE*y&IM4T2`Ezbf5-m zbCr*ll;l1}iFjyH;JfWvysxet_ybeeXrE74wV&g5lhU3uNz)0{f@>VINy-K^OSHT) z)aXR)7N|LPT{BytY*9;y_*;7@D`Sjt`Q^0`22XFIUcNDfk}C%qRBEguMmjLW^UJ(E zONv~t3kq3so_XfTU(50IM$Ob3M(${2-^cLO05dC?GkvKcBY!de#58C&Bm({v2;mR$ zg?ffI>)G>Uj=|v)3LmvK-F!8BaA(1?TTpZb8a_pK^ z>(m&$$bMcO%=`VWXzlE6#@GVKxiel(bDo9GBbFnC;=ORaUpp}+xW!bsvmnBZayA1( zPPG-fkOCfUisyO3{ap?5Z$nD!c%^)l?5q5{nCgqq0{|LrYa!G8F|p z`EXdM;o*huF225=0*>zc>y7&vN*OMR^g5I+1B)XRNpq=L8S1OA)VNiAz=Of0WVtns1r#mK_K2q0E;HFR?EB32L)`}QH; zW$NKV^FIZ$gA~(AKzQk2kVSY{nOOkL+$8vZgJmXW1Aq`R@aQ>N zxjq8mUms#SV%UG3Ftc%Re-!4fDg}q!#LU4 z|Aw(LbFzH|>;JH0;bi#`9NWqu1AeHfas2%%GaDD{KQI6X``=4u1^~GJfpM~M{G+Cv z?96}1K5D@6QG4Luss-Tqn0@>WWBbr~`#T0;`==fEKb(9t{jX#@|4|+*3(Nm?FYw=g z2rCO4_umaadWP-qwPxdBW&a1p&i&VX>OY)(*!@2+cJ9CTDw_%?^FKxc8z&3P-@Ek# z3PTpR#nW+M(RQ+5t!QzLE`Lr#E+F`EGF|KEgI_b*Dcv&+X5_pedU#>vLT0ZTz4 K3L!5B`+oor$-LeG diff --git a/test/fixtures/answers.yml b/test/fixtures/answers.yml index 9c3455a..feda3fa 100644 --- a/test/fixtures/answers.yml +++ b/test/fixtures/answers.yml @@ -404,3 +404,295 @@ juan10: created_at: <%= DateTime.now() - 38.hours - 40.minutes %> updated_at: <%= DateTime.now() - 38.hours - 20.minutes %> +stacy1: + candidate: stacy + question: Cras justo odio, dapibus ac facilisis in, egestas eget quam. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. + answer: option 3 + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 36.hours - 22.minutes %> + updated_at: <%= DateTime.now() - 36.hours - 22.minutes %> + +stacy2: + candidate: stacy + question: fed2 + answer: 'indexOf()' + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 36.hours - 24.minutes %> + updated_at: <%= DateTime.now() - 36.hours - 4.minutes %> + +stacy3: + candidate: stacy + question: fed3 + answer: {html: '

Salmon

', css: 'h1 {color: salmon;}', js: '', text: 'Gotta lotta GOOD things on sale, strangah.'} + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 36.hours - 26.minutes %> + updated_at: <%= DateTime.now() - 36.hours - 6.minutes %> + +stacy4: + candidate: stacy + question: fed4 + answer: Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 36.hours - 28.minutes %> + updated_at: <%= DateTime.now() - 36.hours - 28.minutes %> + +stacy5: + candidate: stacy + question: fed5 + answer: 'Dynamic listeners' + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 36.hours - 30.minutes %> + updated_at: <%= DateTime.now() - 36.hours - 30.minutes %> + +stacy6: + candidate: stacy + question: fed6 + answer: Integer posuere erat a ante venenatis dapibus posuere velit aliquet. + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 36.hours - 32.minutes %> + updated_at: <%= DateTime.now() - 36.hours - 12.minutes %> + +stacy7: + candidate: stacy + question: fed7 + answer: {html: '

This means jQuery needs to be available in live-coder!

', css: "strong {font-size: 1.6em;}\n.green {color: green;}", js: '$("strong").addClass("green");'} + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 36.hours - 34.minutes %> + updated_at: <%= DateTime.now() - 36.hours - 14.minutes %> + +stacy8: + candidate: stacy + question: fed8 + answer: + other: Some generic user input + options: + - other + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 36.hours - 36.minutes %> + updated_at: <%= DateTime.now() - 36.hours - 16.minutes %> + +stacy9: + candidate: stacy + question: fed9 + answer: + other: Brunch + options: + - Neither + - other + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 36.hours - 38.minutes %> + updated_at: <%= DateTime.now() - 36.hours - 18.minutes %> + +stacy10: + candidate: stacy + question: fed10 + answer: ["Live long and prosper", "Who you calling Scruffy?"] + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 36.hours - 40.minutes %> + updated_at: <%= DateTime.now() - 36.hours - 20.minutes %> + + +henry1: + candidate: henry + question: Cras justo odio, dapibus ac facilisis in, egestas eget quam. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. + answer: option 3 + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 36.hours - 22.minutes %> + updated_at: <%= DateTime.now() - 36.hours - 22.minutes %> + +henry2: + candidate: henry + question: fed2 + answer: 'indexOf()' + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 36.hours - 24.minutes %> + updated_at: <%= DateTime.now() - 36.hours - 4.minutes %> + +henry3: + candidate: henry + question: fed3 + answer: {html: '

Salmon

', css: 'h1 {color: salmon;}', js: '', text: 'Gotta lotta GOOD things on sale, strangah.'} + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 36.hours - 26.minutes %> + updated_at: <%= DateTime.now() - 36.hours - 6.minutes %> + +henry4: + candidate: henry + question: fed4 + answer: Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 36.hours - 28.minutes %> + updated_at: <%= DateTime.now() - 36.hours - 28.minutes %> + +henry5: + candidate: henry + question: fed5 + answer: 'Dynamic listeners' + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 36.hours - 30.minutes %> + updated_at: <%= DateTime.now() - 36.hours - 30.minutes %> + +henry6: + candidate: henry + question: fed6 + answer: Integer posuere erat a ante venenatis dapibus posuere velit aliquet. + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 36.hours - 32.minutes %> + updated_at: <%= DateTime.now() - 36.hours - 12.minutes %> + +henry7: + candidate: henry + question: fed7 + answer: {html: '

This means jQuery needs to be available in live-coder!

', css: "strong {font-size: 1.6em;}\n.green {color: green;}", js: '$("strong").addClass("green");'} + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 36.hours - 34.minutes %> + updated_at: <%= DateTime.now() - 36.hours - 14.minutes %> + +henry8: + candidate: henry + question: fed8 + answer: + other: Some generic user input + options: + - other + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 36.hours - 36.minutes %> + updated_at: <%= DateTime.now() - 36.hours - 16.minutes %> + +henry9: + candidate: henry + question: fed9 + answer: + other: Brunch + options: + - Neither + - other + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 36.hours - 38.minutes %> + updated_at: <%= DateTime.now() - 36.hours - 18.minutes %> + +henry10: + candidate: henry + question: fed10 + answer: ["Live long and prosper", "Who you calling Scruffy?"] + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 36.hours - 40.minutes %> + updated_at: <%= DateTime.now() - 36.hours - 20.minutes %> + +martin1: + candidate: martin + question: Cras justo odio, dapibus ac facilisis in, egestas eget quam. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. + answer: option 3 + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 36.hours - 22.minutes %> + updated_at: <%= DateTime.now() - 36.hours - 22.minutes %> + +martin2: + candidate: martin + question: fed2 + answer: 'indexOf()' + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 36.hours - 24.minutes %> + updated_at: <%= DateTime.now() - 36.hours - 4.minutes %> + +martin3: + candidate: martin + question: fed3 + answer: {html: '

Salmon

', css: 'h1 {color: salmon;}', js: '', text: 'Gotta lotta GOOD things on sale, strangah.'} + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 36.hours - 26.minutes %> + updated_at: <%= DateTime.now() - 36.hours - 6.minutes %> + +martin4: + candidate: martin + question: fed4 + answer: Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 36.hours - 28.minutes %> + updated_at: <%= DateTime.now() - 36.hours - 28.minutes %> + +martin5: + candidate: martin + question: fed5 + answer: 'Dynamic listeners' + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 36.hours - 30.minutes %> + updated_at: <%= DateTime.now() - 36.hours - 30.minutes %> + +martin6: + candidate: martin + question: fed6 + answer: Integer posuere erat a ante venenatis dapibus posuere velit aliquet. + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 36.hours - 32.minutes %> + updated_at: <%= DateTime.now() - 36.hours - 12.minutes %> + +martin7: + candidate: martin + question: fed7 + answer: {html: '

This means jQuery needs to be available in live-coder!

', css: "strong {font-size: 1.6em;}\n.green {color: green;}", js: '$("strong").addClass("green");'} + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 36.hours - 34.minutes %> + updated_at: <%= DateTime.now() - 36.hours - 14.minutes %> + +martin8: + candidate: martin + question: fed8 + answer: + other: Some generic user input + options: + - other + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 36.hours - 36.minutes %> + updated_at: <%= DateTime.now() - 36.hours - 16.minutes %> + +martin9: + candidate: martin + question: fed9 + answer: + other: Brunch + options: + - Neither + - other + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 36.hours - 38.minutes %> + updated_at: <%= DateTime.now() - 36.hours - 18.minutes %> + +martin10: + candidate: martin + question: fed10 + answer: ["Live long and prosper", "Who you calling Scruffy?"] + saved: 0 + submitted: true + created_at: <%= DateTime.now() - 36.hours - 40.minutes %> + updated_at: <%= DateTime.now() - 36.hours - 20.minutes %> + diff --git a/test/fixtures/candidates.yml b/test/fixtures/candidates.yml index a3c07f7..237c23a 100644 --- a/test/fixtures/candidates.yml +++ b/test/fixtures/candidates.yml @@ -69,3 +69,34 @@ juan: # Juan has chosen "finish later" for live coders completed: false reminded: true test_hash: qKQo0l4dyol + +stacy: # Stacy has completed AND submitted the test + name: Stacy Scott + email: <%= CryptSerializer.dump 'stacy.scott@mailinator.com' %> + experience: 7-9 + recruiter: recruiter + quiz: fed + completed: true + reminded: false + test_hash: s6oFExZliYYFx + +henry: # Henry has completed AND submitted the test + name: Henry Butler + email: <%= CryptSerializer.dump 'henry.butler@mailinator.com' %> + experience: 4-6 + recruiter: recruiter + quiz: fed + completed: true + reminded: false + test_hash: egPomAuVDeCEp + +wade: # Wade has completed AND submitted the test + name: Wade Armstrong + email: <%= CryptSerializer.dump 'wade.armstrong@mailinator.com' %> + experience: 0-3 + recruiter: recruiter + quiz: fed + completed: true + reminded: false + test_hash: BkSkpa/pJnkz2N + diff --git a/test/fixtures/reviewer_votes.yml b/test/fixtures/reviewer_votes.yml new file mode 100644 index 0000000..06a1b3c --- /dev/null +++ b/test/fixtures/reviewer_votes.yml @@ -0,0 +1,67 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +manager_richard: + candidate: richard + user: manager + vote: 1 + +reviewer_richard: + candidate: richard + user: reviewer + vote: 1 + +reviewer2_richard: + candidate: richard + user: reviewer2 + vote: 1 + + + +manager_wade: + candidate: wade + user: manager + vote: 2 + veto: 2 + +reviewer_wade: + candidate: wade + user: reviewer + vote: 2 + +# reviewer2_wade: +# candidate: wade +# user: reviewer2 + + + +manager_stacy: + candidate: stacy + user: manager + vote: 2 + +reviewer_stacy: + candidate: stacy + user: reviewer + vote: 2 + +reviewer2_stacy: + candidate: stacy + user: reviewer2 + vote: 2 + + + +manager_henry: + candidate: henry + user: manager + vote: 0 + veto: 2 + +# reviewer_henry: +# candidate: henry +# user: reviewer +# +# reviewer2_henry: +# candidate: henry +# user: reviewer2 + diff --git a/test/models/reviewer_vote_test.rb b/test/models/reviewer_vote_test.rb new file mode 100644 index 0000000..1ce2161 --- /dev/null +++ b/test/models/reviewer_vote_test.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true +require 'test_helper' + +class ReviewerVoteTest < ActiveSupport::TestCase + test "the truth" do + assert ReviewerVoteTest + end +end From 5845f76e1da9d36c37308fec654ecacd403aacf8 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Fri, 18 Nov 2016 17:43:24 -0600 Subject: [PATCH 06/17] linked into views --- README.md | 6 ++- app/assets/images/thumb-down-red.png | Bin 0 -> 311 bytes app/assets/images/thumb-down.png | Bin 0 -> 282 bytes app/assets/images/thumb-up-green.png | Bin 0 -> 316 bytes app/assets/images/thumb-up.png | Bin 0 -> 274 bytes .../stylesheets/molecules/_review_meta.scss | 12 ++++++ app/models/candidate.rb | 7 +++ app/models/reviewer_vote.rb | 4 +- app/views/admin/candidate/index.html.erb | 4 +- app/views/admin/result/view.html.erb | 33 ++++++++++++--- test/fixtures/answers.yml | 40 +++++++++--------- test/fixtures/candidates.yml | 4 +- test/fixtures/questions.yml | 2 +- test/models/reviewer_vote_test.rb | 26 ++++++++++++ 14 files changed, 107 insertions(+), 31 deletions(-) create mode 100644 app/assets/images/thumb-down-red.png create mode 100644 app/assets/images/thumb-down.png create mode 100644 app/assets/images/thumb-up-green.png create mode 100644 app/assets/images/thumb-up.png create mode 100644 app/assets/stylesheets/molecules/_review_meta.scss diff --git a/README.md b/README.md index 76b03dc..8d2f5e1 100644 --- a/README.md +++ b/README.md @@ -77,10 +77,14 @@ There are some convenience scripts included to make starting the container and r * `./start-server.sh` - starts up just rails server for viewing application +## Deploying a new version +* ssh into server +* cd into app root +* run deploy.sh ## TODOs and notes -* Question attachment path: http://dev.perficientxd.com/skill_assets/ +* Question attachment path: https://dev.perficientdigital.com/skills-app-images/ * clean code * [Confident Ruby](http://www.confidentruby.com/) * [POODR](http://www.poodr.com/) diff --git a/app/assets/images/thumb-down-red.png b/app/assets/images/thumb-down-red.png new file mode 100644 index 0000000000000000000000000000000000000000..13c46e74fdffb5e48be13fd0791da20fffb45db0 GIT binary patch literal 311 zcmV-70m%M|P)k-0Y|_m-%M}?M$i#-1Xqv|WCWSOgc0ltK2S_kuYp$hlRh+e`M>6R zy(X{2o(N^u8l`{^Xzj!_z_b8PKsAxq0b3XF@FX_C&6tNA0`KWK{ zHcp^-_Bz5GhC?d}P)8a{DkXq)7mEUxRJArhyo1FdYXh>i0o4>h{Rt>ihT+r*#yxOl zXx)rBwaLtBdS`mbxza#BcbXo7C;qwQRzZ*Zka4{O-kw-t;y()MA`Rr8n8MQ#p>5jZ zABbZ4V%~wWt literal 0 HcmV?d00001 diff --git a/app/assets/images/thumb-down.png b/app/assets/images/thumb-down.png new file mode 100644 index 0000000000000000000000000000000000000000..9cd2fb3145d972a5be4fddba136862f3a40ffcfc GIT binary patch literal 282 zcmV+#0p|3LO0h>tD~KpqR=8dc~?lj;RPjwtjd+vmF?{Be>p gjBjElQxLN5z+1DD9<>cXxRt z+w+DF$B4=A1qT0!BN<+ry#f@ zm&b-Svk{k9$mKEq*==+KdIc+nlhZ$c;6}EM3f>Ar4YEGUHhCmUpw4izFG7;>Ul)ra zJgo(8ZE$V+0M4O!k4bc3Pz`#(!X=;`}!LL)(#UVt{w}aqML;-_0 zzZAh{acYckrbgYP)94&8845x&LQ3k;!m@uvKWL$ z5cjbKD2%{bg9gLvv^fH27^gzIdg#e*-b>`}Cr`$&cc2pWyO@U-f_`sLr);7Gdd~?IrjGwWO;~Kq2~fC78_gQ?b)#fp47j div { flex: 1 1 auto; } + } + + .review_meta__votes, + .review_meta__vetos { + a { padding: 5px; } + } +} diff --git a/app/models/candidate.rb b/app/models/candidate.rb index a216c37..dac22db 100644 --- a/app/models/candidate.rb +++ b/app/models/candidate.rb @@ -4,6 +4,7 @@ class Candidate < ApplicationRecord has_many :questions, -> { order("sort") }, through: :quiz has_many :answers belongs_to :recruiter, class_name: "User" + has_many :votes, class_name: "ReviewerVote" serialize :email, CryptSerializer @@ -15,6 +16,12 @@ class Candidate < ApplicationRecord validates :email, uniqueness: true, presence: true, email_format: true validates :test_hash, uniqueness: true, presence: true + enum review_status: { + # pending: 0, + approved: 1, + declined: 2 + } + def submitted_answers answers.where(submitted: true) end diff --git a/app/models/reviewer_vote.rb b/app/models/reviewer_vote.rb index 8f52019..6ed8fce 100644 --- a/app/models/reviewer_vote.rb +++ b/app/models/reviewer_vote.rb @@ -1,10 +1,10 @@ # frozen_string_literal: true class ReviewerVote < ApplicationRecord - # validates :user_id, uniqueness: {scope: :friend_id} - belongs_to :candidate belongs_to :user + validates :user_id, uniqueness: { scope: :candidate_id } + enum vote: { undecided: 0, yea: 1, diff --git a/app/views/admin/candidate/index.html.erb b/app/views/admin/candidate/index.html.erb index 130c99e..d4ababd 100644 --- a/app/views/admin/candidate/index.html.erb +++ b/app/views/admin/candidate/index.html.erb @@ -15,6 +15,7 @@ Progress Completed Reminded + Review Status <% @candidates.each do |candidate| %> @@ -28,8 +29,9 @@ <%= candidate.experience %> years <%= candidate.status %> - <%= candidate.completed ? "Submitted" : "" %> + <%= candidate.completed ? link_to("Submitted", admin_result_path(candidate.test_hash)) : "" %> <%= candidate.reminded ? "Yes" : "" %> + <%= candidate.review_status %> <% end %> diff --git a/app/views/admin/result/view.html.erb b/app/views/admin/result/view.html.erb index 73a0f72..10f1458 100644 --- a/app/views/admin/result/view.html.erb +++ b/app/views/admin/result/view.html.erb @@ -1,10 +1,33 @@

Quiz Review

-

- Test ID: <%= @candidate.test_hash %>
- Years of Experience: <%= @candidate.experience %>
- Recruiter Email: <%= mail_to @candidate.recruiter.name, @candidate.recruiter.email %>
-

+ +
+
+ Test ID: <%= @candidate.test_hash %>
+ Years of Experience: <%= @candidate.experience %>
+ Recruiter Email: <%= mail_to @candidate.recruiter.name, @candidate.recruiter.email %>
+
+
+
+ Votes: + <%= link_to '#cast-vote-up', remote: true do %> + Yea (<%= @candidate.votes.yea.count %>) + <% end %> + <%= link_to '#cast-vote-down', remote: true do %> + Nay (<%= @candidate.votes.nay.count %>) + <% end %> +
+
+ Manager Vetos: + <%= link_to '#request', remote: true do %> + Request Interview + <% end %> + <%= link_to '#decline', remote: true do %> + Decline Interview + <% end %> +
+
+
<% @quiz.each do |question| %> <%= form_for(:answer, url: '#never-post', html:{id: 'summary-form'}) do |form| %> diff --git a/test/fixtures/answers.yml b/test/fixtures/answers.yml index feda3fa..de70e0c 100644 --- a/test/fixtures/answers.yml +++ b/test/fixtures/answers.yml @@ -599,8 +599,8 @@ henry10: created_at: <%= DateTime.now() - 36.hours - 40.minutes %> updated_at: <%= DateTime.now() - 36.hours - 20.minutes %> -martin1: - candidate: martin +wade1: + candidate: wade question: Cras justo odio, dapibus ac facilisis in, egestas eget quam. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. answer: option 3 saved: 0 @@ -608,8 +608,8 @@ martin1: created_at: <%= DateTime.now() - 36.hours - 22.minutes %> updated_at: <%= DateTime.now() - 36.hours - 22.minutes %> -martin2: - candidate: martin +wade2: + candidate: wade question: fed2 answer: 'indexOf()' saved: 0 @@ -617,8 +617,8 @@ martin2: created_at: <%= DateTime.now() - 36.hours - 24.minutes %> updated_at: <%= DateTime.now() - 36.hours - 4.minutes %> -martin3: - candidate: martin +wade3: + candidate: wade question: fed3 answer: {html: '

Salmon

', css: 'h1 {color: salmon;}', js: '', text: 'Gotta lotta GOOD things on sale, strangah.'} saved: 0 @@ -626,8 +626,8 @@ martin3: created_at: <%= DateTime.now() - 36.hours - 26.minutes %> updated_at: <%= DateTime.now() - 36.hours - 6.minutes %> -martin4: - candidate: martin +wade4: + candidate: wade question: fed4 answer: Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. saved: 0 @@ -635,8 +635,8 @@ martin4: created_at: <%= DateTime.now() - 36.hours - 28.minutes %> updated_at: <%= DateTime.now() - 36.hours - 28.minutes %> -martin5: - candidate: martin +wade5: + candidate: wade question: fed5 answer: 'Dynamic listeners' saved: 0 @@ -644,8 +644,8 @@ martin5: created_at: <%= DateTime.now() - 36.hours - 30.minutes %> updated_at: <%= DateTime.now() - 36.hours - 30.minutes %> -martin6: - candidate: martin +wade6: + candidate: wade question: fed6 answer: Integer posuere erat a ante venenatis dapibus posuere velit aliquet. saved: 0 @@ -653,8 +653,8 @@ martin6: created_at: <%= DateTime.now() - 36.hours - 32.minutes %> updated_at: <%= DateTime.now() - 36.hours - 12.minutes %> -martin7: - candidate: martin +wade7: + candidate: wade question: fed7 answer: {html: '

This means jQuery needs to be available in live-coder!

', css: "strong {font-size: 1.6em;}\n.green {color: green;}", js: '$("strong").addClass("green");'} saved: 0 @@ -662,8 +662,8 @@ martin7: created_at: <%= DateTime.now() - 36.hours - 34.minutes %> updated_at: <%= DateTime.now() - 36.hours - 14.minutes %> -martin8: - candidate: martin +wade8: + candidate: wade question: fed8 answer: other: Some generic user input @@ -674,8 +674,8 @@ martin8: created_at: <%= DateTime.now() - 36.hours - 36.minutes %> updated_at: <%= DateTime.now() - 36.hours - 16.minutes %> -martin9: - candidate: martin +wade9: + candidate: wade question: fed9 answer: other: Brunch @@ -687,8 +687,8 @@ martin9: created_at: <%= DateTime.now() - 36.hours - 38.minutes %> updated_at: <%= DateTime.now() - 36.hours - 18.minutes %> -martin10: - candidate: martin +wade10: + candidate: wade question: fed10 answer: ["Live long and prosper", "Who you calling Scruffy?"] saved: 0 diff --git a/test/fixtures/candidates.yml b/test/fixtures/candidates.yml index 237c23a..7a22bfd 100644 --- a/test/fixtures/candidates.yml +++ b/test/fixtures/candidates.yml @@ -59,6 +59,7 @@ richard: # Richard has completed AND submitted the test completed: true reminded: false test_hash: 6NjnourLE6Y + review_status: 1 juan: # Juan has chosen "finish later" for live coders name: Juan Campbell @@ -79,6 +80,7 @@ stacy: # Stacy has completed AND submitted the test completed: true reminded: false test_hash: s6oFExZliYYFx + review_status: 2 henry: # Henry has completed AND submitted the test name: Henry Butler @@ -98,5 +100,5 @@ wade: # Wade has completed AND submitted the test quiz: fed completed: true reminded: false - test_hash: BkSkpa/pJnkz2N + test_hash: BkSkpapJnkz2N diff --git a/test/fixtures/questions.yml b/test/fixtures/questions.yml index 97c7d00..4380750 100644 --- a/test/fixtures/questions.yml +++ b/test/fixtures/questions.yml @@ -55,7 +55,7 @@ fed5: fed6: quiz: fed question: Comment on how realistic the following image is. - attachment: "http://dev.perficientxd.com/skill_assets/commets_css.jpg" + attachment: "https://dev.perficientdigital.com/skills-app-images/commets_css.jpg" category: CSS input_type: text input_options: diff --git a/test/models/reviewer_vote_test.rb b/test/models/reviewer_vote_test.rb index 1ce2161..48db0fe 100644 --- a/test/models/reviewer_vote_test.rb +++ b/test/models/reviewer_vote_test.rb @@ -5,4 +5,30 @@ class ReviewerVoteTest < ActiveSupport::TestCase test "the truth" do assert ReviewerVoteTest end + + test "richard has 3 votes" do + richard = candidates(:richard) + + assert_equal 3, richard.votes.size + end + + test "manager has 4 votes" do + manager = users(:manager) + + assert_equal 4, manager.votes.size + end + + test "richard has been approved" do + richard = candidates(:richard) + + assert richard.approved? + refute richard.declined? + end + + test "stacy has been declined" do + stacy = candidates(:stacy) + + assert stacy.declined? + refute stacy.approved? + end end From e0f5e482bea6145601d76e07b109152c377b1259 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Sat, 19 Nov 2016 16:34:48 -0600 Subject: [PATCH 07/17] vote/veto processing --- app/controllers/admin/vote_controller.rb | 48 +++++++++++++++ app/models/user.rb | 29 +++++++++ app/policies/reviewer_vote_policy.rb | 41 +++++++++++++ config/routes.rb | 5 ++ erd.pdf | Bin 40602 -> 40760 bytes .../controllers/admin/user_controller_test.rb | 2 +- .../controllers/admin/vote_controller_test.rb | 57 ++++++++++++++++++ test/fixtures/candidates.yml | 10 +++ test/policies/reviewer_vote_policy_test.rb | 49 +++++++++++++++ test/test_helpers/{README.txt => README.md} | 0 10 files changed, 240 insertions(+), 1 deletion(-) create mode 100644 app/controllers/admin/vote_controller.rb create mode 100644 app/policies/reviewer_vote_policy.rb create mode 100644 test/controllers/admin/vote_controller_test.rb create mode 100644 test/policies/reviewer_vote_policy_test.rb rename test/test_helpers/{README.txt => README.md} (100%) diff --git a/app/controllers/admin/vote_controller.rb b/app/controllers/admin/vote_controller.rb new file mode 100644 index 0000000..63a2fdc --- /dev/null +++ b/app/controllers/admin/vote_controller.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true +module Admin + class VoteController < AdminController + def up + authorize ReviewerVote + @candidate = Candidate.find_by(test_hash: params[:test_hash]) + current_user.cast_yea_on(@candidate) + + results = { + message: "Vote tallied!", + upCount: @candidate.votes.yea.count, + downCount: @candidate.votes.nay.count + } + render json: results.to_json + end + + def down + authorize ReviewerVote + @candidate = Candidate.find_by(test_hash: params[:test_hash]) + current_user.cast_nay_on(@candidate) + + results = { + message: "Vote tallied!", + upCount: @candidate.votes.yea.count, + downCount: @candidate.votes.nay.count + } + render json: results.to_json + end + + def approve + authorize ReviewerVote + @candidate = Candidate.find_by(test_hash: params[:test_hash]) + current_user.approve_candidate(@candidate) + + results = { message: "Interview requested!" } + render json: results.to_json + end + + def decline + authorize ReviewerVote + @candidate = Candidate.find_by(test_hash: params[:test_hash]) + current_user.decline_candidate(@candidate) + + results = { message: "Interview declined." } + render json: results.to_json + end + end +end diff --git a/app/models/user.rb b/app/models/user.rb index 9d601e3..7db5e31 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -16,6 +16,35 @@ class User < ApplicationRecord save end + # Voting + def cast_yea_on candidate + vote = votes.find_or_create_by(candidate_id: candidate.to_i) + vote.vote = :yea + vote.save + end + + def cast_nay_on candidate + vote = votes.find_or_create_by(candidate_id: candidate.to_i) + vote.vote = :nay + vote.save + end + + def approve_candidate candidate + candidate = Candidate.find(candidate.to_i) + + vote = votes.find_or_create_by(candidate_id: candidate.to_i) + vote.veto = :approved + candidate.update_attribute(:review_status, :approved) if vote.save + end + + def decline_candidate candidate + candidate = Candidate.find(candidate.to_i) + + vote = votes.find_or_create_by(candidate_id: candidate.to_i) + vote.veto = :rejected + candidate.update_attribute(:review_status, :declined) if vote.save + end + # Roles def admin? 'admin' == role diff --git a/app/policies/reviewer_vote_policy.rb b/app/policies/reviewer_vote_policy.rb new file mode 100644 index 0000000..78de734 --- /dev/null +++ b/app/policies/reviewer_vote_policy.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true +class ReviewerVotePolicy < ApplicationPolicy + # Voting Policy + # + # Only Reviewers, Managers, and Admins, can cast a vote on a quiz result + # + # Reviewers can vote any quiz they are linked to + # Only Managers, and Admins, can veto a quiz result + + def up? + # return true if user.acts_as_admin? + # user.quizzes.include? record.candidate.quiz + true + end + + def down? + # return true if user.acts_as_manager? + # user.quizzes.include? record + true + end + + def approve? + user.acts_as_manager? + end + + def decline? + user.acts_as_manager? + end + + class Scope < Scope + def resolve + return ReviewerVote.none if user.recruiter? + + if user.reviewer? + scope.where(user_id: user.id) + else + scope + end + end + end +end diff --git a/config/routes.rb b/config/routes.rb index c5356dd..691f4c5 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -50,6 +50,11 @@ Rails.application.routes.draw do get "/admin/results", to: "admin/result#index", as: :admin_results get "/admin/result/:test_hash", to: "admin/result#view", as: :admin_result + get "admin/vote/:test_hash/up", to: "admin/vote#up", as: :admin_up_vote + get "admin/vote/:test_hash/down", to: "admin/vote#down", as: :admin_down_vote + get "admin/vote/:test_hash/approve", to: "admin/vote#approve", as: :admin_approve_vote + get "admin/vote/:test_hash/decline", to: "admin/vote#decline", as: :admin_decline_vote + get "/admin", to: "admin/dashboard#show", as: :admin ######################################################################################### diff --git a/erd.pdf b/erd.pdf index d662d8da1d17a9b13d3099b6b072843ab6167ae3..2a669781946763f830f13918b19bb1002e71f052 100644 GIT binary patch delta 22224 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 Bt=a$p diff --git a/test/controllers/admin/user_controller_test.rb b/test/controllers/admin/user_controller_test.rb index 8498ffc..be8c9a9 100644 --- a/test/controllers/admin/user_controller_test.rb +++ b/test/controllers/admin/user_controller_test.rb @@ -1,4 +1,4 @@ -# frozen_string_literal: true +# frozen_string_literal: true() require 'test_helper' module Admin diff --git a/test/controllers/admin/vote_controller_test.rb b/test/controllers/admin/vote_controller_test.rb new file mode 100644 index 0000000..093a9f2 --- /dev/null +++ b/test/controllers/admin/vote_controller_test.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true +require 'test_helper' + +module Admin + class VoteControllerTest < ActionDispatch::IntegrationTest + test "reviewer can up vote henry" do + auth_user users(:reviewer) + henry = candidates(:henry) + + assert_difference("Candidate.find(#{henry.id}).votes.yea.count", 1) do + get admin_up_vote_url(henry.test_hash) + end + assert_response :success + end + + test "reviewer can down vote henry" do + auth_user users(:reviewer) + henry = candidates(:henry) + + assert_difference("Candidate.find(#{henry.id}).votes.nay.count", 1) do + get admin_down_vote_url(henry.test_hash) + end + assert_response :success + end + + test "reviewer can change vote on henry" do + auth_user users(:reviewer) + henry = candidates(:henry) + get admin_up_vote_url(henry.test_hash) + + assert_difference("Candidate.find(#{henry.id}).votes.nay.count", 1) do + get admin_down_vote_url(henry.test_hash) + end + assert_response :success + end + + test "manager can approve henry" do + auth_user users(:manager) + henry = candidates(:henry) + get admin_approve_vote_url(henry.test_hash) + + assert_equal 1, henry.votes.approved.count + assert_equal 'approved', Candidate.find(henry.to_i).review_status + assert_response :success + end + + test "manager can decline henry" do + auth_user users(:manager) + henry = candidates(:henry) + get admin_decline_vote_url(henry.test_hash) + + assert_equal 1, henry.votes.rejected.count + assert_equal 'declined', Candidate.find(henry.to_i).review_status + assert_response :success + end + end +end diff --git a/test/fixtures/candidates.yml b/test/fixtures/candidates.yml index 7a22bfd..4def21b 100644 --- a/test/fixtures/candidates.yml +++ b/test/fixtures/candidates.yml @@ -102,3 +102,13 @@ wade: # Wade has completed AND submitted the test reminded: false test_hash: BkSkpapJnkz2N +gustov: # Gustov is NOT for FED + name: Gustov + email: <%= CryptSerializer.dump 'gustov@mailinator.com' %> + experience: 0-3 + recruiter: recruiter + quiz: admin + completed: false + reminded: false + test_hash: kp6tfghjyapJnkz2N + diff --git a/test/policies/reviewer_vote_policy_test.rb b/test/policies/reviewer_vote_policy_test.rb new file mode 100644 index 0000000..8dc05a8 --- /dev/null +++ b/test/policies/reviewer_vote_policy_test.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true +require 'test_helper' + +class ReviewerVotePolicyTest < PolicyAssertions::Test + test 'should require current_user' do + assert_raise Pundit::NotAuthorizedError do + ReviewerVotePolicy.new(nil, ReviewerVote.first).view? + end + end + + test 'should allow admin to scope' do + scope = ReviewerVotePolicy::Scope.new(users(:admin), ReviewerVote).resolve + assert_equal ReviewerVote.count, scope.count + end + + test 'should allow manager to scope' do + scope = ReviewerVotePolicy::Scope.new(users(:manager), ReviewerVote).resolve + assert_equal ReviewerVote.count, scope.count + end + + test 'should allow reviewer to scope' do + scope = ReviewerVotePolicy::Scope.new(users(:reviewer), ReviewerVote).resolve + assert_equal users(:reviewer).votes.count, scope.count + end + + test 'should NOT allow recruiter to scope' do + scope = ReviewerVotePolicy::Scope.new(users(:recruiter), ReviewerVote).resolve + assert_equal 0, scope.count + end + + def test_up + skip + # assert_permit users(:admin), candidates(:richard) + # assert_permit users(:admin), candidates(:gustov) + # assert_permit users(:manager), candidates(:richard) + # assert_permit users(:reviewer), candidates(:richard) + # + # refute_permit users(:reviewer), candidates(:gustov) + # refute_permit users(:recruiter), candidates(:richard) + end + + # def test_create_and_update + # assert_permit users(:admin), Vote + # assert_permit users(:manager), Vote + # + # refute_permit users(:recruiter), Vote + # refute_permit users(:reviewer), Vote + # end +end diff --git a/test/test_helpers/README.txt b/test/test_helpers/README.md similarity index 100% rename from test/test_helpers/README.txt rename to test/test_helpers/README.md From 5ef7f82dbf5eb27a26853b60fd1aa6855965ad9a Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Sun, 20 Nov 2016 09:51:46 -0600 Subject: [PATCH 08/17] fixed up a reviewer to reviewee association --- Guardfile | 2 +- app/assets/images/thumb-down-red.png | Bin 311 -> 0 bytes app/assets/images/thumb-down.png | Bin 282 -> 0 bytes app/assets/images/thumb-up-green.png | Bin 316 -> 0 bytes app/assets/images/thumb-up.png | Bin 274 -> 0 bytes app/models/user.rb | 2 ++ app/policies/reviewer_vote_policy.rb | 3 +-- app/views/admin/user/_form.html.erb | 20 ++++++++++++------ erd.pdf | Bin 40760 -> 40769 bytes .../controllers/admin/vote_controller_test.rb | 6 ++++-- test/fixtures/reviewer_to_quizzes.yml | 4 ++++ test/policies/reviewer_vote_policy_test.rb | 9 ++++---- 12 files changed, 30 insertions(+), 16 deletions(-) delete mode 100644 app/assets/images/thumb-down-red.png delete mode 100644 app/assets/images/thumb-down.png delete mode 100644 app/assets/images/thumb-up-green.png delete mode 100644 app/assets/images/thumb-up.png diff --git a/Guardfile b/Guardfile index 7a847c9..1027353 100644 --- a/Guardfile +++ b/Guardfile @@ -75,7 +75,7 @@ guard :shell, all_on_start: true do # TODO: Annoyingly, all files are linted twice on start/full runs. Why? watch %r{app/assets/javascripts/*/.*} do |file| system %(echo "ESLint:\033[32m #{file[0]}\033[0m") - system %(eslint #{file[0]}) + system %(./node_modules/eslint/bin/eslint.js #{file[0]}) end end diff --git a/app/assets/images/thumb-down-red.png b/app/assets/images/thumb-down-red.png deleted file mode 100644 index 13c46e74fdffb5e48be13fd0791da20fffb45db0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 311 zcmV-70m%M|P)k-0Y|_m-%M}?M$i#-1Xqv|WCWSOgc0ltK2S_kuYp$hlRh+e`M>6R zy(X{2o(N^u8l`{^Xzj!_z_b8PKsAxq0b3XF@FX_C&6tNA0`KWK{ zHcp^-_Bz5GhC?d}P)8a{DkXq)7mEUxRJArhyo1FdYXh>i0o4>h{Rt>ihT+r*#yxOl zXx)rBwaLtBdS`mbxza#BcbXo7C;qwQRzZ*Zka4{O-kw-t;y()MA`Rr8n8MQ#p>5jZ zABbZ4V%~wWt diff --git a/app/assets/images/thumb-down.png b/app/assets/images/thumb-down.png deleted file mode 100644 index 9cd2fb3145d972a5be4fddba136862f3a40ffcfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 282 zcmV+#0p|3LO0h>tD~KpqR=8dc~?lj;RPjwtjd+vmF?{Be>p gjBjElQxLN5z+1DD9<>cXxRt z+w+DF$B4=A1qT0!BN<+ry#f@ zm&b-Svk{k9$mKEq*==+KdIc+nlhZ$c;6}EM3f>Ar4YEGUHhCmUpw4izFG7;>Ul)ra zJgo(8ZE$V+0M4O!k4bc3Pz`#(!X=;`}!LL)(#UVt{w}aqML;-_0 zzZAh{acYckrbgYP)94&8845x&LQ3k;!m@uvKWL$ z5cjbKD2%{bg9gLvv^fH27^gzIdg#e*-b>`}Cr`$&cc2pWyO@U-f_`sLr);7Gdd~?IrjGwWO;~Kq2~fC78_gQ?b)#fp47j
- <%= form.collection_check_boxes(:quiz_ids, Quiz.all, :id, :name, {}, {class: 'checkbox'}) do | quiz | %> -
- <%= quiz.check_box( checked: user.quizzes.include?(quiz.object)) %> - <%= quiz.label %> -
- <% end %> +
+
Quiz Review List
+

+ Quizzes this user should be reviewing the results of.
+ Admins and Recruiters should not have any checked, unless they are expected + to participate in the technical review for that quiz. +

+ <%= form.collection_check_boxes(:quiz_ids, Quiz.all, :id, :name, {}, {class: 'checkbox'}) do | quiz | %> +
+ <%= quiz.check_box( checked: user.quizzes.include?(quiz.object)) %> + <%= quiz.label %> +
+ <% end %> +
<%= form.submit %> <% end %> diff --git a/erd.pdf b/erd.pdf index 2a669781946763f830f13918b19bb1002e71f052..35d725dc84e7b2b0780c0e2830824c41ce38fd23 100644 GIT binary patch delta 25681 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 b?BZ(V?CR-kW{$)G=HX;VqN0*el0^D1`3E^2 diff --git a/test/controllers/admin/vote_controller_test.rb b/test/controllers/admin/vote_controller_test.rb index 093a9f2..f05e4e2 100644 --- a/test/controllers/admin/vote_controller_test.rb +++ b/test/controllers/admin/vote_controller_test.rb @@ -28,8 +28,10 @@ module Admin henry = candidates(:henry) get admin_up_vote_url(henry.test_hash) - assert_difference("Candidate.find(#{henry.id}).votes.nay.count", 1) do - get admin_down_vote_url(henry.test_hash) + assert_difference("Candidate.find(#{henry.id}).votes.yea.count", -1) do + assert_difference("Candidate.find(#{henry.id}).votes.nay.count", 1) do + get admin_down_vote_url(henry.test_hash) + end end assert_response :success end diff --git a/test/fixtures/reviewer_to_quizzes.yml b/test/fixtures/reviewer_to_quizzes.yml index 4e8812f..cb91027 100644 --- a/test/fixtures/reviewer_to_quizzes.yml +++ b/test/fixtures/reviewer_to_quizzes.yml @@ -7,3 +7,7 @@ one: two: user: reviewer2 quiz: fed + +three: + user: manager + quiz: fed diff --git a/test/policies/reviewer_vote_policy_test.rb b/test/policies/reviewer_vote_policy_test.rb index 8dc05a8..5447738 100644 --- a/test/policies/reviewer_vote_policy_test.rb +++ b/test/policies/reviewer_vote_policy_test.rb @@ -29,14 +29,13 @@ class ReviewerVotePolicyTest < PolicyAssertions::Test end def test_up - skip - # assert_permit users(:admin), candidates(:richard) + # refute_permit users(:admin), reviewer_votes(:manager_henry) + # refute_permit users(:recruiter), candidates(:richard) + # refute_permit users(:reviewer), candidates(:gustov) + # assert_permit users(:admin), candidates(:gustov) # assert_permit users(:manager), candidates(:richard) # assert_permit users(:reviewer), candidates(:richard) - # - # refute_permit users(:reviewer), candidates(:gustov) - # refute_permit users(:recruiter), candidates(:richard) end # def test_create_and_update From 74b2415b91a5756048a397c43988240ce1a21305 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Sun, 20 Nov 2016 11:24:17 -0600 Subject: [PATCH 09/17] wired up vote ux --- app/assets/javascripts/ajax-links.js | 22 ++++++++++- app/controllers/admin/vote_controller.rb | 22 ++++++++--- app/models/candidate.rb | 2 +- app/models/user.rb | 7 ++++ app/views/admin/result/view.html.erb | 37 ++++++++++++------- .../admin/result_controller_test.rb | 7 ++++ 6 files changed, 75 insertions(+), 22 deletions(-) diff --git a/app/assets/javascripts/ajax-links.js b/app/assets/javascripts/ajax-links.js index 1dd5fac..55ee365 100644 --- a/app/assets/javascripts/ajax-links.js +++ b/app/assets/javascripts/ajax-links.js @@ -1,7 +1,8 @@ -function handleAjaxResponse($el) { +function handleAjaxResponse($el, callback) { var $header = $('header'); $el.on("ajax:success", function(e, data){ $header.after('
' + data.message + '
'); + callback(data); }).on("ajax:error", function(e, xhr) { if (xhr.status === 400){ $header.after('
' + xhr.responseJSON.join('
') + '
'); @@ -11,6 +12,25 @@ function handleAjaxResponse($el) { }); } +function updateVotes(data){ + $("[data-id=up-votes]").html(data.upCount); + $("[data-id=down-votes]").html(data.downCount); + $("[data-id=my-vote]").html(data.myVote); +} + +function updateVeto(data){ + $("[data-id=interview-request]").html(data.requestCopy); + $("[data-id=interview-decline]").html(data.declineCopy); +} + $(document).ready(function() { $('[data-id=ajax-action]').each(function(){ handleAjaxResponse($(this)); }); }); + +$(document).ready(function() { + $('[data-id=vote-count]').each(function(){ handleAjaxResponse($(this), updateVotes); }); +}); + +$(document).ready(function() { + $('[data-id=veto-status]').each(function(){ handleAjaxResponse($(this), updateVeto); }); +}); diff --git a/app/controllers/admin/vote_controller.rb b/app/controllers/admin/vote_controller.rb index 63a2fdc..5ef1ded 100644 --- a/app/controllers/admin/vote_controller.rb +++ b/app/controllers/admin/vote_controller.rb @@ -7,9 +7,10 @@ module Admin current_user.cast_yea_on(@candidate) results = { - message: "Vote tallied!", + message: "Vote Counted", upCount: @candidate.votes.yea.count, - downCount: @candidate.votes.nay.count + downCount: @candidate.votes.nay.count, + myVote: "yea" } render json: results.to_json end @@ -20,9 +21,10 @@ module Admin current_user.cast_nay_on(@candidate) results = { - message: "Vote tallied!", + message: "Vote Counted", upCount: @candidate.votes.yea.count, - downCount: @candidate.votes.nay.count + downCount: @candidate.votes.nay.count, + myVote: "nay" } render json: results.to_json end @@ -32,7 +34,11 @@ module Admin @candidate = Candidate.find_by(test_hash: params[:test_hash]) current_user.approve_candidate(@candidate) - results = { message: "Interview requested!" } + results = { + message: "Interview requested!", + requestCopy: "Requested", + declineCopy: "Decline Interview" + } render json: results.to_json end @@ -41,7 +47,11 @@ module Admin @candidate = Candidate.find_by(test_hash: params[:test_hash]) current_user.decline_candidate(@candidate) - results = { message: "Interview declined." } + results = { + message: "Interview declined.", + requestCopy: "Request Interview", + declineCopy: "Declined" + } render json: results.to_json end end diff --git a/app/models/candidate.rb b/app/models/candidate.rb index dac22db..74c2f47 100644 --- a/app/models/candidate.rb +++ b/app/models/candidate.rb @@ -17,7 +17,7 @@ class Candidate < ApplicationRecord validates :test_hash, uniqueness: true, presence: true enum review_status: { - # pending: 0, + pending: 0, approved: 1, declined: 2 } diff --git a/app/models/user.rb b/app/models/user.rb index a563182..ec0a298 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -47,6 +47,13 @@ class User < ApplicationRecord candidate.update_attribute(:review_status, :declined) if vote.save end + def my_vote candidate + candidate = Candidate.find(candidate.to_i) + + my_votes = votes.find_by(candidate_id: candidate.id) + my_votes.nil? ? "undecided" : my_votes.votes + end + # Roles def admin? 'admin' == role diff --git a/app/views/admin/result/view.html.erb b/app/views/admin/result/view.html.erb index 10f1458..8892276 100644 --- a/app/views/admin/result/view.html.erb +++ b/app/views/admin/result/view.html.erb @@ -8,24 +8,33 @@ Recruiter Email: <%= mail_to @candidate.recruiter.name, @candidate.recruiter.email %>
-
+
Votes: - <%= link_to '#cast-vote-up', remote: true do %> - Yea (<%= @candidate.votes.yea.count %>) + <%= link_to admin_up_vote_path(test_hash: @candidate.test_hash), remote: true do %> + Yea (<%= @candidate.votes.yea.count %>) <% end %> - <%= link_to '#cast-vote-down', remote: true do %> - Nay (<%= @candidate.votes.nay.count %>) - <% end %> -
-
- Manager Vetos: - <%= link_to '#request', remote: true do %> - Request Interview - <% end %> - <%= link_to '#decline', remote: true do %> - Decline Interview + <%= link_to admin_down_vote_path(test_hash: @candidate.test_hash), remote: true do %> + Nay (<%= @candidate.votes.nay.count %>) <% end %> + (Your vote: <%= current_user.my_vote(@candidate) %>)
+ <% if current_user.acts_as_manager? %> +
+ Manager Vetos: + <%= link_to admin_approve_vote_path(test_hash: @candidate.test_hash), remote: true do %> + + <%= @candidate.approved? ? "Requested" : "Request Interview" %> + + <% end %> + <%= link_to admin_decline_vote_path(test_hash: @candidate.test_hash), remote: true do %> + + <%= @candidate.declined? ? "Declined" : "Decline Interview" %> + + <% end %> +
+ <% else %> + Candidate Interview Status: <%= @candidate.review_status %> + <% end %>
diff --git a/test/controllers/admin/result_controller_test.rb b/test/controllers/admin/result_controller_test.rb index 699517d..b186b41 100644 --- a/test/controllers/admin/result_controller_test.rb +++ b/test/controllers/admin/result_controller_test.rb @@ -19,5 +19,12 @@ module Admin assert assigns(:quiz), "@quiz not present" assert assigns(:status), "@status not present" end + + test "reviewer can view result for henry" do + auth_reviewer + + get admin_result_url(candidates(:henry).test_hash) + assert_response :success + end end end From e8e745f356f10063893c623c5ceeed31ebc3eb4d Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Sun, 20 Nov 2016 11:35:08 -0600 Subject: [PATCH 10/17] wired up vote ux --- app/models/user.rb | 3 +- test/fixtures/reviewer_votes.yml | 49 +++++++++++++++----------------- 2 files changed, 24 insertions(+), 28 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index ec0a298..a94ee9b 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -50,8 +50,7 @@ class User < ApplicationRecord def my_vote candidate candidate = Candidate.find(candidate.to_i) - my_votes = votes.find_by(candidate_id: candidate.id) - my_votes.nil? ? "undecided" : my_votes.votes + votes.find_by(candidate_id: candidate.id).vote end # Roles diff --git a/test/fixtures/reviewer_votes.yml b/test/fixtures/reviewer_votes.yml index 06a1b3c..0b22140 100644 --- a/test/fixtures/reviewer_votes.yml +++ b/test/fixtures/reviewer_votes.yml @@ -1,4 +1,3 @@ -# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html manager_richard: candidate: richard @@ -17,23 +16,6 @@ reviewer2_richard: -manager_wade: - candidate: wade - user: manager - vote: 2 - veto: 2 - -reviewer_wade: - candidate: wade - user: reviewer - vote: 2 - -# reviewer2_wade: -# candidate: wade -# user: reviewer2 - - - manager_stacy: candidate: stacy user: manager @@ -50,18 +32,33 @@ reviewer2_stacy: vote: 2 - manager_henry: candidate: henry user: manager vote: 0 veto: 2 -# reviewer_henry: -# candidate: henry -# user: reviewer -# -# reviewer2_henry: -# candidate: henry -# user: reviewer2 +reviewer_henry: + candidate: henry + user: reviewer + +reviewer2_henry: + candidate: henry + user: reviewer2 + + +manager_wade: + candidate: wade + user: manager + vote: 2 + veto: 2 + +reviewer_wade: + candidate: wade + user: reviewer + vote: 2 + +reviewer2_wade: + candidate: wade + user: reviewer2 From df997aa2585ed0fb5b5b9c963d0c3e347527c60d Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Sun, 20 Nov 2016 13:07:53 -0600 Subject: [PATCH 11/17] policies and auto review builds --- app/controllers/admin/vote_controller.rb | 8 ++-- app/controllers/quiz_controller.rb | 1 + app/models/candidate.rb | 7 +++ app/models/user.rb | 13 +++--- app/policies/reviewer_vote_policy.rb | 15 ++++--- app/views/admin/result/_voting.html.erb | 34 ++++++++++++++ app/views/admin/result/view.html.erb | 33 ++------------ .../20161120175737_init_reviewer_votes.rb | 6 +++ db/schema.rb | 2 +- .../admin/result_controller_test.rb | 7 +++ test/fixtures/reviewer_votes.yml | 4 ++ test/models/candidate_test.rb | 7 +++ test/models/user_test.rb | 4 +- test/policies/reviewer_vote_policy_test.rb | 44 +++++++++++++------ 14 files changed, 124 insertions(+), 61 deletions(-) create mode 100644 app/views/admin/result/_voting.html.erb create mode 100644 db/migrate/20161120175737_init_reviewer_votes.rb diff --git a/app/controllers/admin/vote_controller.rb b/app/controllers/admin/vote_controller.rb index 5ef1ded..3a39bb2 100644 --- a/app/controllers/admin/vote_controller.rb +++ b/app/controllers/admin/vote_controller.rb @@ -2,8 +2,8 @@ module Admin class VoteController < AdminController def up - authorize ReviewerVote @candidate = Candidate.find_by(test_hash: params[:test_hash]) + authorize ReviewerVote.find_by(user_id: current_user.id, candidate_id: @candidate.id) current_user.cast_yea_on(@candidate) results = { @@ -16,8 +16,8 @@ module Admin end def down - authorize ReviewerVote @candidate = Candidate.find_by(test_hash: params[:test_hash]) + authorize ReviewerVote.find_by(user_id: current_user.id, candidate_id: @candidate.id) current_user.cast_nay_on(@candidate) results = { @@ -30,8 +30,8 @@ module Admin end def approve - authorize ReviewerVote @candidate = Candidate.find_by(test_hash: params[:test_hash]) + authorize ReviewerVote.find_by(user_id: current_user.id, candidate_id: @candidate.id) current_user.approve_candidate(@candidate) results = { @@ -43,8 +43,8 @@ module Admin end def decline - authorize ReviewerVote @candidate = Candidate.find_by(test_hash: params[:test_hash]) + authorize ReviewerVote.find_by(user_id: current_user.id, candidate_id: @candidate.id) current_user.decline_candidate(@candidate) results = { diff --git a/app/controllers/quiz_controller.rb b/app/controllers/quiz_controller.rb index 4523f10..4f4e35d 100644 --- a/app/controllers/quiz_controller.rb +++ b/app/controllers/quiz_controller.rb @@ -36,6 +36,7 @@ class QuizController < ApplicationController def complete_and_email if current_candidate.update_attributes(completed: true) + current_candidate.build_reviews CandidateMailer.submitted(current_candidate).deliver_later RecruiterMailer.candidate_submitted(current_candidate).deliver_later ReviewerMailer.candidate_submission(current_candidate).deliver_later diff --git a/app/models/candidate.rb b/app/models/candidate.rb index 74c2f47..f75a738 100644 --- a/app/models/candidate.rb +++ b/app/models/candidate.rb @@ -5,6 +5,7 @@ class Candidate < ApplicationRecord has_many :answers belongs_to :recruiter, class_name: "User" has_many :votes, class_name: "ReviewerVote" + has_many :reviewers, through: :quiz serialize :email, CryptSerializer @@ -22,6 +23,12 @@ class Candidate < ApplicationRecord declined: 2 } + def build_reviews + reviewers.each do |reviewer| + votes.find_or_create_by(user_id: reviewer.id) + end + end + def submitted_answers answers.where(submitted: true) end diff --git a/app/models/user.rb b/app/models/user.rb index a94ee9b..b7dfbdd 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -20,13 +20,13 @@ class User < ApplicationRecord # Voting def cast_yea_on candidate - vote = votes.find_or_create_by(candidate_id: candidate.to_i) + vote = votes.find_by(candidate_id: candidate.to_i) vote.vote = :yea vote.save end def cast_nay_on candidate - vote = votes.find_or_create_by(candidate_id: candidate.to_i) + vote = votes.find_by(candidate_id: candidate.to_i) vote.vote = :nay vote.save end @@ -34,7 +34,7 @@ class User < ApplicationRecord def approve_candidate candidate candidate = Candidate.find(candidate.to_i) - vote = votes.find_or_create_by(candidate_id: candidate.to_i) + vote = votes.find_by(candidate_id: candidate.to_i) vote.veto = :approved candidate.update_attribute(:review_status, :approved) if vote.save end @@ -42,7 +42,7 @@ class User < ApplicationRecord def decline_candidate candidate candidate = Candidate.find(candidate.to_i) - vote = votes.find_or_create_by(candidate_id: candidate.to_i) + vote = votes.find_by(candidate_id: candidate.to_i) vote.veto = :rejected candidate.update_attribute(:review_status, :declined) if vote.save end @@ -50,7 +50,8 @@ class User < ApplicationRecord def my_vote candidate candidate = Candidate.find(candidate.to_i) - votes.find_by(candidate_id: candidate.id).vote + my_vote = votes.find_by(candidate_id: candidate.id) + my_vote.vote unless my_vote.nil? end # Roles @@ -83,7 +84,7 @@ class User < ApplicationRecord end def acts_as_reviewer? - %w(admin reviewer).include? role + %w(admin manager reviewer).include? role end private diff --git a/app/policies/reviewer_vote_policy.rb b/app/policies/reviewer_vote_policy.rb index 3455425..7e9f1da 100644 --- a/app/policies/reviewer_vote_policy.rb +++ b/app/policies/reviewer_vote_policy.rb @@ -8,21 +8,26 @@ class ReviewerVotePolicy < ApplicationPolicy # Only Managers, and Admins, can veto a quiz result def up? - # return true if user.reviewees.include? record.candidate - true + return true if user.acts_as_admin? + return false unless record.candidate.reviewers.include? user + user.acts_as_reviewer? end def down? - # return true if user.acts_as_manager? - # user.quizzes.include? record - true + return true if user.acts_as_admin? + return false unless record.candidate.reviewers.include? user + user.acts_as_reviewer? end def approve? + return true if user.acts_as_admin? + return false unless record.candidate.reviewers.include? user user.acts_as_manager? end def decline? + return true if user.acts_as_admin? + return false unless record.candidate.reviewers.include? user user.acts_as_manager? end diff --git a/app/views/admin/result/_voting.html.erb b/app/views/admin/result/_voting.html.erb new file mode 100644 index 0000000..bc04725 --- /dev/null +++ b/app/views/admin/result/_voting.html.erb @@ -0,0 +1,34 @@ +<% # TODO: This needs to be extracted into a decorator, or something. It is only a quick hack solution. %> + +<% if current_user.acts_as_reviewer? %> +
+ Votes: + <%= link_to admin_up_vote_path(test_hash: @candidate.test_hash), remote: true do %> + Yea (<%= @candidate.votes.yea.count %>) + <% end %> + <%= link_to admin_down_vote_path(test_hash: @candidate.test_hash), remote: true do %> + Nay (<%= @candidate.votes.nay.count %>) + <% end %> + (Your vote: <%= current_user.my_vote(@candidate) %>) +
+<% end %> + +<% if current_user.acts_as_manager? %> +
+ Manager Vetos: + <%= link_to admin_approve_vote_path(test_hash: @candidate.test_hash), remote: true do %> + + <%= @candidate.approved? ? "Requested" : "Request Interview" %> + + <% end %> + <%= link_to admin_decline_vote_path(test_hash: @candidate.test_hash), remote: true do %> + + <%= @candidate.declined? ? "Declined" : "Decline Interview" %> + + <% end %> +
+ +<% else %> + + Candidate Interview Status: <%= @candidate.review_status %> +<% end %> diff --git a/app/views/admin/result/view.html.erb b/app/views/admin/result/view.html.erb index 8892276..23dfa7b 100644 --- a/app/views/admin/result/view.html.erb +++ b/app/views/admin/result/view.html.erb @@ -7,36 +7,9 @@ Years of Experience: <%= @candidate.experience %>
Recruiter Email: <%= mail_to @candidate.recruiter.name, @candidate.recruiter.email %>
-
-
- Votes: - <%= link_to admin_up_vote_path(test_hash: @candidate.test_hash), remote: true do %> - Yea (<%= @candidate.votes.yea.count %>) - <% end %> - <%= link_to admin_down_vote_path(test_hash: @candidate.test_hash), remote: true do %> - Nay (<%= @candidate.votes.nay.count %>) - <% end %> - (Your vote: <%= current_user.my_vote(@candidate) %>) -
- <% if current_user.acts_as_manager? %> -
- Manager Vetos: - <%= link_to admin_approve_vote_path(test_hash: @candidate.test_hash), remote: true do %> - - <%= @candidate.approved? ? "Requested" : "Request Interview" %> - - <% end %> - <%= link_to admin_decline_vote_path(test_hash: @candidate.test_hash), remote: true do %> - - <%= @candidate.declined? ? "Declined" : "Decline Interview" %> - - <% end %> -
- <% else %> - Candidate Interview Status: <%= @candidate.review_status %> - <% end %> -
- + +
<%= render partial: 'voting' %>
+ <% @quiz.each do |question| %> <%= form_for(:answer, url: '#never-post', html:{id: 'summary-form'}) do |form| %> diff --git a/db/migrate/20161120175737_init_reviewer_votes.rb b/db/migrate/20161120175737_init_reviewer_votes.rb new file mode 100644 index 0000000..706c8af --- /dev/null +++ b/db/migrate/20161120175737_init_reviewer_votes.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true +class InitReviewerVotes < ActiveRecord::Migration[5.0] + def up + Candidate.where(completed: true).each(&:build_reviews) + end +end diff --git a/db/schema.rb b/db/schema.rb index caafb90..2126b30 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20161118023249) do +ActiveRecord::Schema.define(version: 20161120175737) do create_table "answers", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| t.integer "candidate_id" diff --git a/test/controllers/admin/result_controller_test.rb b/test/controllers/admin/result_controller_test.rb index b186b41..eb9ac57 100644 --- a/test/controllers/admin/result_controller_test.rb +++ b/test/controllers/admin/result_controller_test.rb @@ -26,5 +26,12 @@ module Admin get admin_result_url(candidates(:henry).test_hash) assert_response :success end + + test "recruiter can view result for henry" do + auth_user users(:recruiter) + + get admin_result_url(candidates(:henry).test_hash) + assert_response :success + end end end diff --git a/test/fixtures/reviewer_votes.yml b/test/fixtures/reviewer_votes.yml index 0b22140..2669604 100644 --- a/test/fixtures/reviewer_votes.yml +++ b/test/fixtures/reviewer_votes.yml @@ -1,3 +1,7 @@ +gustov: + candidate: gustov + user_id: 12341234 + manager_richard: candidate: richard diff --git a/test/models/candidate_test.rb b/test/models/candidate_test.rb index 7cb0f5d..393c7e8 100644 --- a/test/models/candidate_test.rb +++ b/test/models/candidate_test.rb @@ -24,4 +24,11 @@ class CandidateTest < ActiveSupport::TestCase refute_equal email, enc_email end + + test "can build reviewer records" do + candidate = candidates(:dawn) + + candidate.build_reviews + assert_equal 3, candidate.votes.count + end end diff --git a/test/models/user_test.rb b/test/models/user_test.rb index bc372e4..d7d9327 100644 --- a/test/models/user_test.rb +++ b/test/models/user_test.rb @@ -20,14 +20,14 @@ class UserTest < ActiveSupport::TestCase refute user.reviewer? end - test 'manager should act as manager' do + test 'manager should act as manager and reviewer' do user = users(:manager) assert user.acts_as_manager? + assert user.acts_as_reviewer? refute user.acts_as_admin? refute user.acts_as_recruiter? - refute user.acts_as_reviewer? end test 'manager should only be manager' do diff --git a/test/policies/reviewer_vote_policy_test.rb b/test/policies/reviewer_vote_policy_test.rb index 5447738..1824293 100644 --- a/test/policies/reviewer_vote_policy_test.rb +++ b/test/policies/reviewer_vote_policy_test.rb @@ -29,20 +29,38 @@ class ReviewerVotePolicyTest < PolicyAssertions::Test end def test_up - # refute_permit users(:admin), reviewer_votes(:manager_henry) - # refute_permit users(:recruiter), candidates(:richard) - # refute_permit users(:reviewer), candidates(:gustov) + assert_permit users(:manager), reviewer_votes(:manager_richard) + assert_permit users(:reviewer), reviewer_votes(:reviewer_richard) + assert_permit users(:admin), reviewer_votes(:manager_henry) - # assert_permit users(:admin), candidates(:gustov) - # assert_permit users(:manager), candidates(:richard) - # assert_permit users(:reviewer), candidates(:richard) + refute_permit users(:recruiter), reviewer_votes(:manager_henry) + refute_permit users(:reviewer), reviewer_votes(:gustov) + refute_permit users(:manager), reviewer_votes(:gustov) end - # def test_create_and_update - # assert_permit users(:admin), Vote - # assert_permit users(:manager), Vote - # - # refute_permit users(:recruiter), Vote - # refute_permit users(:reviewer), Vote - # end + def test_down + assert_permit users(:manager), reviewer_votes(:manager_richard) + assert_permit users(:reviewer), reviewer_votes(:reviewer_richard) + assert_permit users(:admin), reviewer_votes(:manager_henry) + + refute_permit users(:recruiter), reviewer_votes(:manager_henry) + refute_permit users(:reviewer), reviewer_votes(:gustov) + refute_permit users(:manager), reviewer_votes(:gustov) + end + + def approve + assert_permit users(:manager), reviewer_votes(:manager_richard) + assert_permit users(:admin), reviewer_votes(:manager_henry) + + refute_permit users(:recruiter), reviewer_votes(:manager_henry) + refute_permit users(:reviewer), reviewer_votes(:reviewer_richard) + end + + def decline + assert_permit users(:manager), reviewer_votes(:manager_richard) + assert_permit users(:admin), reviewer_votes(:manager_henry) + + refute_permit users(:recruiter), reviewer_votes(:manager_henry) + refute_permit users(:reviewer), reviewer_votes(:reviewer_richard) + end end From 35339b1d30854662dee95f1c3e6fda5c1063ac96 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Sun, 20 Nov 2016 13:26:49 -0600 Subject: [PATCH 12/17] live-coder accordion and label tweaks --- app/assets/stylesheets/molecules/_accordions.scss | 3 +++ app/assets/stylesheets/molecules/_livecoder.scss | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/app/assets/stylesheets/molecules/_accordions.scss b/app/assets/stylesheets/molecules/_accordions.scss index b96290b..728203d 100644 --- a/app/assets/stylesheets/molecules/_accordions.scss +++ b/app/assets/stylesheets/molecules/_accordions.scss @@ -48,7 +48,10 @@ } .accordion__toggle:checked ~ .accordion__copy { + background-color: $gray-lighter; display: block; + padding: 2.5em 1.25em 1em 1.75em; + margin: -2.25em 0 2em -0.5em; } } diff --git a/app/assets/stylesheets/molecules/_livecoder.scss b/app/assets/stylesheets/molecules/_livecoder.scss index 4d7c3d1..0a110f1 100644 --- a/app/assets/stylesheets/molecules/_livecoder.scss +++ b/app/assets/stylesheets/molecules/_livecoder.scss @@ -22,6 +22,10 @@ display: block; } +.code-results { + margin-bottom: -0.65em; +} + .results { border: 1px solid $secondary-color; clear: both; From d913e816b556a10c77d3dd78592d327c08e03e40 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Tue, 22 Nov 2016 16:51:30 -0600 Subject: [PATCH 13/17] hiding pending from candidates list --- app/views/admin/candidate/index.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/admin/candidate/index.html.erb b/app/views/admin/candidate/index.html.erb index d4ababd..1912731 100644 --- a/app/views/admin/candidate/index.html.erb +++ b/app/views/admin/candidate/index.html.erb @@ -31,7 +31,7 @@ <%= candidate.status %> <%= candidate.completed ? link_to("Submitted", admin_result_path(candidate.test_hash)) : "" %> <%= candidate.reminded ? "Yes" : "" %> - <%= candidate.review_status %> + <%= candidate.review_status unless candidate.pending? %> <% end %> From 4d8cf26c5482928a619c331b07f40ed617ec2257 Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Tue, 22 Nov 2016 16:59:54 -0600 Subject: [PATCH 14/17] updated missing page titles --- app/views/admin/auth/login.html.erb | 1 + app/views/admin/auth/reset.html.erb | 1 + app/views/admin/auth/reset_request.html.erb | 1 + app/views/admin/candidate/edit.html.erb | 4 ++++ app/views/admin/candidate/index.html.erb | 1 + app/views/admin/candidate/new.html.erb | 4 ++++ app/views/admin/profile/edit.html.erb | 1 + app/views/admin/profile/view.html.erb | 1 + app/views/admin/question/edit.html.erb | 1 + app/views/admin/question/index.html.erb | 1 + app/views/admin/question/new.html.erb | 1 + app/views/admin/question/view.html.erb | 1 + app/views/admin/quiz/index.html.erb | 1 + app/views/admin/quiz/new.html.erb | 1 + app/views/admin/quiz/view.html.erb | 1 + app/views/admin/result/index.html.erb | 1 + app/views/admin/result/view.html.erb | 4 ++++ app/views/candidate/oops.html.erb | 2 ++ app/views/candidate/saved.html.erb | 1 + app/views/candidate/thankyou.html.erb | 1 + app/views/quiz/summary.html.erb | 2 +- 21 files changed, 31 insertions(+), 1 deletion(-) diff --git a/app/views/admin/auth/login.html.erb b/app/views/admin/auth/login.html.erb index e7746c7..169ee63 100644 --- a/app/views/admin/auth/login.html.erb +++ b/app/views/admin/auth/login.html.erb @@ -1,5 +1,6 @@ <% content_for :main_class, "intro_tpl" + content_for :title, "Skills Assessment Admin" %>

Admin Login

diff --git a/app/views/admin/auth/reset.html.erb b/app/views/admin/auth/reset.html.erb index 2b1aee8..ddc3e80 100644 --- a/app/views/admin/auth/reset.html.erb +++ b/app/views/admin/auth/reset.html.erb @@ -1,5 +1,6 @@ <% content_for :main_class, "intro_tpl" + content_for :title, "Skills Assessment Admin" %>

Password Reset

diff --git a/app/views/admin/auth/reset_request.html.erb b/app/views/admin/auth/reset_request.html.erb index bb23fb8..6618a19 100644 --- a/app/views/admin/auth/reset_request.html.erb +++ b/app/views/admin/auth/reset_request.html.erb @@ -1,5 +1,6 @@ <% content_for :main_class, "intro_tpl" + content_for :title, "Skills Assessment Admin" %>

Password Reset

diff --git a/app/views/admin/candidate/edit.html.erb b/app/views/admin/candidate/edit.html.erb index 5de8973..10899c3 100644 --- a/app/views/admin/candidate/edit.html.erb +++ b/app/views/admin/candidate/edit.html.erb @@ -1,3 +1,7 @@ +<% + content_for :title, "Edit Candidate - Skills Assessment Admin" +%> +

Edit: <%= @candidate.name %>

Test ID: <%= @candidate.test_hash %>

diff --git a/app/views/admin/candidate/index.html.erb b/app/views/admin/candidate/index.html.erb index 1912731..1e290bd 100644 --- a/app/views/admin/candidate/index.html.erb +++ b/app/views/admin/candidate/index.html.erb @@ -1,5 +1,6 @@ <% content_for :section_title, "Candidates" + content_for :title, "Candidates - Skills Assessment Admin" %>
<%= link_to(admin_new_candidate_path, { class: 'secondary-btn' }) do %> diff --git a/app/views/admin/candidate/new.html.erb b/app/views/admin/candidate/new.html.erb index c529467..db1ebc3 100644 --- a/app/views/admin/candidate/new.html.erb +++ b/app/views/admin/candidate/new.html.erb @@ -1,3 +1,7 @@ +<% + content_for :title, "New Candidate - Skills Assessment Admin" +%> +

New Candidate

diff --git a/app/views/admin/profile/edit.html.erb b/app/views/admin/profile/edit.html.erb index d1014d2..04eac6b 100644 --- a/app/views/admin/profile/edit.html.erb +++ b/app/views/admin/profile/edit.html.erb @@ -1,5 +1,6 @@ <% content_for :section_title, "Edit: #{@user.name}" + content_for :title, "Profile - Skills Assessment Admin" %> <%= render partial: 'shared/form_model_errors', locals: {obj: @user} %> diff --git a/app/views/admin/profile/view.html.erb b/app/views/admin/profile/view.html.erb index 1c1af5f..6cc0db1 100644 --- a/app/views/admin/profile/view.html.erb +++ b/app/views/admin/profile/view.html.erb @@ -1,5 +1,6 @@ <% content_for :section_title, "Profile" + content_for :title, "Profile - Skills Assessment Admin" %>

Name: <%= current_user.name %>

diff --git a/app/views/admin/question/edit.html.erb b/app/views/admin/question/edit.html.erb index 6428daa..67ca722 100644 --- a/app/views/admin/question/edit.html.erb +++ b/app/views/admin/question/edit.html.erb @@ -1,5 +1,6 @@ <% content_for :section_title, "Questions" + content_for :title, "Edit Question - Skills Assessment Admin" %>

<%= @question.quiz.name %>

diff --git a/app/views/admin/question/index.html.erb b/app/views/admin/question/index.html.erb index f6f17b0..4f78c39 100644 --- a/app/views/admin/question/index.html.erb +++ b/app/views/admin/question/index.html.erb @@ -1,5 +1,6 @@ <% content_for :section_title, "Questions" + content_for :title, "Questions - Skills Assessment Admin" %> <% quizzes = @questions.group_by{ |q| q.quiz.name } %> diff --git a/app/views/admin/question/new.html.erb b/app/views/admin/question/new.html.erb index 351b388..cfda31c 100644 --- a/app/views/admin/question/new.html.erb +++ b/app/views/admin/question/new.html.erb @@ -1,5 +1,6 @@ <% content_for :section_title, "New Question" + content_for :title, "New Question - Skills Assessment Admin" %> <%= render partial: 'form', locals: {question: @question, action: admin_create_question_path } %> diff --git a/app/views/admin/question/view.html.erb b/app/views/admin/question/view.html.erb index fc72e6c..913e737 100644 --- a/app/views/admin/question/view.html.erb +++ b/app/views/admin/question/view.html.erb @@ -1,5 +1,6 @@ <% content_for :section_title, "Question for #{@question.quiz.name}" + content_for :title, "Question - Skills Assessment Admin" %> diff --git a/app/views/admin/quiz/index.html.erb b/app/views/admin/quiz/index.html.erb index 1bce4e8..068759b 100644 --- a/app/views/admin/quiz/index.html.erb +++ b/app/views/admin/quiz/index.html.erb @@ -1,5 +1,6 @@ <% content_for :section_title, "Quizzes" + content_for :title, "Quizzes - Skills Assessment Admin" %> <%= render partial: 'admin/quiz/table_list', locals: { quizzes: @quizzes } %> diff --git a/app/views/admin/quiz/new.html.erb b/app/views/admin/quiz/new.html.erb index 2bb5726..15b084a 100644 --- a/app/views/admin/quiz/new.html.erb +++ b/app/views/admin/quiz/new.html.erb @@ -1,5 +1,6 @@ <% content_for :section_title, "New Quiz" + content_for :title, "New Quiz - Skills Assessment Admin" %> <%= render partial: 'form', locals: { quiz: @quiz, action: admin_create_quiz_path } %> diff --git a/app/views/admin/quiz/view.html.erb b/app/views/admin/quiz/view.html.erb index f37b865..ad00425 100644 --- a/app/views/admin/quiz/view.html.erb +++ b/app/views/admin/quiz/view.html.erb @@ -1,5 +1,6 @@ <% content_for :section_title, "#{@quiz.name}" + content_for :title, "Quiz - Skills Assessment Admin" %>

<%= @quiz.name %>

diff --git a/app/views/admin/result/index.html.erb b/app/views/admin/result/index.html.erb index 3c1373c..60b01b4 100644 --- a/app/views/admin/result/index.html.erb +++ b/app/views/admin/result/index.html.erb @@ -1,5 +1,6 @@ <% content_for :section_title, "Completed Tests" + content_for :title, "Quiz Results - Skills Assessment Admin" %>
diff --git a/app/views/admin/result/view.html.erb b/app/views/admin/result/view.html.erb index 23dfa7b..1ad7f5a 100644 --- a/app/views/admin/result/view.html.erb +++ b/app/views/admin/result/view.html.erb @@ -1,3 +1,7 @@ +<% + content_for :title, "Quiz Review - Skills Assessment Admin" +%> +

Quiz Review

diff --git a/app/views/candidate/oops.html.erb b/app/views/candidate/oops.html.erb index 81eda59..e17a4cc 100644 --- a/app/views/candidate/oops.html.erb +++ b/app/views/candidate/oops.html.erb @@ -1,3 +1,5 @@ +<% content_for :title, "Skills Assessment" %> +

Oops!

diff --git a/app/views/candidate/saved.html.erb b/app/views/candidate/saved.html.erb index bd7dda0..e7f09eb 100644 --- a/app/views/candidate/saved.html.erb +++ b/app/views/candidate/saved.html.erb @@ -1,3 +1,4 @@ +<% content_for :title, "Saved! - Skills Assessment" %>

Your test results have been saved. You can visit again later with your Test ID to complete diff --git a/app/views/candidate/thankyou.html.erb b/app/views/candidate/thankyou.html.erb index b796e52..e2df7e2 100644 --- a/app/views/candidate/thankyou.html.erb +++ b/app/views/candidate/thankyou.html.erb @@ -1,3 +1,4 @@ +<% content_for :title, "Thank You - Skills Assessment" %>

Thank you!

diff --git a/app/views/quiz/summary.html.erb b/app/views/quiz/summary.html.erb index cf0bab9..1491bd9 100644 --- a/app/views/quiz/summary.html.erb +++ b/app/views/quiz/summary.html.erb @@ -1,5 +1,5 @@ <% - content_for :title, "Skills Assessment" + content_for :title, "Summary - Skills Assessment" content_for :footer_title, "Skills Assessment" content_for :progress, @status.progress.to_s content_for_javascript_once 'summary-edit' do From 97d239283212ef824d9c63ab294dfee8c56407dc Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Tue, 22 Nov 2016 17:04:55 -0600 Subject: [PATCH 15/17] add status to results list --- app/views/admin/candidate/index.html.erb | 2 +- app/views/admin/result/index.html.erb | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/views/admin/candidate/index.html.erb b/app/views/admin/candidate/index.html.erb index 1e290bd..a004369 100644 --- a/app/views/admin/candidate/index.html.erb +++ b/app/views/admin/candidate/index.html.erb @@ -16,7 +16,7 @@

- + <% @candidates.each do |candidate| %> diff --git a/app/views/admin/result/index.html.erb b/app/views/admin/result/index.html.erb index 60b01b4..6a77620 100644 --- a/app/views/admin/result/index.html.erb +++ b/app/views/admin/result/index.html.erb @@ -8,6 +8,7 @@ + <% @candidates.each do |candidate| %> @@ -15,6 +16,7 @@ + <% end %>
Progress Completed RemindedReview StatusInterview Status
Test ID Experience RecruiterInterview Status
<%= link_to candidate.test_hash, admin_result_path(candidate.test_hash) %> <%= candidate.experience %> years <%= mail_to(candidate.recruiter.email) %><%= candidate.review_status unless candidate.pending? %>
From fc2babfeddbedf8f8f80fa501b61aaa94f546eed Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Tue, 22 Nov 2016 17:25:37 -0600 Subject: [PATCH 16/17] added counter to quiz review --- .../stylesheets/molecules/_admin_review.scss | 31 +++++++++++++++++++ .../stylesheets/molecules/_review_meta.scss | 12 ------- app/views/admin/result/view.html.erb | 6 ++-- 3 files changed, 34 insertions(+), 15 deletions(-) create mode 100644 app/assets/stylesheets/molecules/_admin_review.scss delete mode 100644 app/assets/stylesheets/molecules/_review_meta.scss diff --git a/app/assets/stylesheets/molecules/_admin_review.scss b/app/assets/stylesheets/molecules/_admin_review.scss new file mode 100644 index 0000000..586367d --- /dev/null +++ b/app/assets/stylesheets/molecules/_admin_review.scss @@ -0,0 +1,31 @@ +.admin-review { + counter-reset: question; + + form { + margin-left: 2.3em; + position: relative; + + &::before { + content: counter(question) ") "; + counter-increment: question; + font-size: 1.25em; + left: -1.8em; + position: absolute; + top: 0.4em; + } + } + +} + +.review_meta { + + @media screen and (min-width: 768px) { + display: flex; + & > div { flex: 1 1 auto; } + } + + .review_meta__votes, + .review_meta__vetos { + a { padding: 5px; } + } +} diff --git a/app/assets/stylesheets/molecules/_review_meta.scss b/app/assets/stylesheets/molecules/_review_meta.scss deleted file mode 100644 index 31b60ee..0000000 --- a/app/assets/stylesheets/molecules/_review_meta.scss +++ /dev/null @@ -1,12 +0,0 @@ -.review_meta { - - @media screen and (min-width: 768px) { - display: flex; - & > div { flex: 1 1 auto; } - } - - .review_meta__votes, - .review_meta__vetos { - a { padding: 5px; } - } -} diff --git a/app/views/admin/result/view.html.erb b/app/views/admin/result/view.html.erb index 1ad7f5a..61863fa 100644 --- a/app/views/admin/result/view.html.erb +++ b/app/views/admin/result/view.html.erb @@ -2,7 +2,7 @@ content_for :title, "Quiz Review - Skills Assessment Admin" %> -
+

Quiz Review

@@ -12,8 +12,8 @@ Recruiter Email: <%= mail_to @candidate.recruiter.name, @candidate.recruiter.email %>
-
<%= render partial: 'voting' %>
- +
<%= render partial: 'voting' %>
+ <% @quiz.each do |question| %> <%= form_for(:answer, url: '#never-post', html:{id: 'summary-form'}) do |form| %> From f94de75f019f7150e2bb314b2daa1889ae70d29c Mon Sep 17 00:00:00 2001 From: Mark Moser Date: Tue, 22 Nov 2016 17:29:54 -0600 Subject: [PATCH 17/17] another label change --- app/views/admin/candidate/index.html.erb | 2 +- app/views/admin/result/index.html.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/admin/candidate/index.html.erb b/app/views/admin/candidate/index.html.erb index a004369..67f464b 100644 --- a/app/views/admin/candidate/index.html.erb +++ b/app/views/admin/candidate/index.html.erb @@ -16,7 +16,7 @@ Progress Completed Reminded - Interview Status + Interview Request <% @candidates.each do |candidate| %> diff --git a/app/views/admin/result/index.html.erb b/app/views/admin/result/index.html.erb index 6a77620..79ed6de 100644 --- a/app/views/admin/result/index.html.erb +++ b/app/views/admin/result/index.html.erb @@ -8,7 +8,7 @@ Test ID Experience Recruiter - Interview Status + Interview Request <% @candidates.each do |candidate| %>