diff options
author | Joachim Filip Ignacy Bartosik <jbartosik@gmail.com> | 2010-08-23 17:11:49 +0200 |
---|---|---|
committer | Petteri Räty <petsku@petteriraty.eu> | 2010-10-05 22:15:29 +0300 |
commit | 3556deb1eacc5ef81633d9068c043fc680ff5fed (patch) | |
tree | b50d2a384f0365759794f6d1523b721bfd065215 | |
parent | gRaphael files (diff) | |
download | recruiting-webapp-3556deb1eacc5ef81633d9068c043fc680ff5fed.tar.gz recruiting-webapp-3556deb1eacc5ef81633d9068c043fc680ff5fed.tar.bz2 recruiting-webapp-3556deb1eacc5ef81633d9068c043fc680ff5fed.zip |
Pie chart on how recruits evaluated documentation on questions how pages
Charts are shown only to recruiters on questions show pages, but other
users may view charts directly (by entering URL manually).
-rw-r--r-- | app/controllers/questions_controller.rb | 3 | ||||
-rw-r--r-- | app/models/answer.rb | 5 | ||||
-rw-r--r-- | app/models/question.rb | 20 | ||||
-rw-r--r-- | app/views/questions/doc_feedback_chart.dryml | 16 | ||||
-rw-r--r-- | app/views/questions/show.dryml | 3 | ||||
-rw-r--r-- | features/documentation_feedback.feature | 25 | ||||
-rw-r--r-- | features/step_definitions/documentation_feedback_steps.rb | 16 | ||||
-rw-r--r-- | spec/models/answer_spec.rb | 16 | ||||
-rw-r--r-- | spec/models/question_spec.rb | 12 |
9 files changed, 116 insertions, 0 deletions
diff --git a/app/controllers/questions_controller.rb b/app/controllers/questions_controller.rb index ae35065..0e1ba3c 100644 --- a/app/controllers/questions_controller.rb +++ b/app/controllers/questions_controller.rb @@ -30,4 +30,7 @@ class QuestionsController < ApplicationController def approve_questions hobo_index Question.questions_to_approve end + + show_action :doc_feedback_chart + end diff --git a/app/models/answer.rb b/app/models/answer.rb index f013547..47544b3 100644 --- a/app/models/answer.rb +++ b/app/models/answer.rb @@ -47,6 +47,11 @@ class Answer < ActiveRecord::Base named_scope :in_category, lambda { |category| { :joins => :question, :conditions => { 'questions.question_category_id', category} } } + named_scope :with_feedback, lambda { |opt| { + :conditions => { :feedback => opt } } } + + named_scope :with_some_feedback, :conditions => "answers.feedback IS NOT NULL AND answers.feedback <> ''" + validates_uniqueness_of :question_id, :scope => :reference, :if => :reference validates_uniqueness_of :question_id, :scope => :owner_id, :unless => :reference diff --git a/app/models/question.rb b/app/models/question.rb index 084f826..294e03e 100644 --- a/app/models/question.rb +++ b/app/models/question.rb @@ -160,6 +160,26 @@ class Question < ActiveRecord::Base after_create :notify_new_question after_update :notify_approved_question + # Returns hash with: + # :values - string with coma-separated values + # :labels - string with coma-separated, quoted labels for values + def feedback_chart_data + classes = Answer.new.feedback.class.values - [''] + delta = 0.00001 + result = {} + counts = classes.collect{ |opt| answers.with_feedback(opt).count } + + result[:values] = counts.inject(nil) do |res, cur| + res.nil? ? (cur + delta).to_s : "#{res}, #{cur + delta}" + end + + result[:labels] = classes.inject(nil) do |res, cur| + res.nil? ? "\"%%.%% - #{cur} (##)\"" : "#{res}, \"%%.%% - #{cur} (##)\"" + end + + result + end + protected # Sends notification about new question (TODO: check for group). def notify_new_question diff --git a/app/views/questions/doc_feedback_chart.dryml b/app/views/questions/doc_feedback_chart.dryml new file mode 100644 index 0000000..1a02c45 --- /dev/null +++ b/app/views/questions/doc_feedback_chart.dryml @@ -0,0 +1,16 @@ +<page> + <head:> + <javascript name='raphael'/> + <javascript name='g.raphael-min'/> + <javascript name='g.pie-min'/> + </head:> + <body:> + <script type="text/javascript" charset="utf-8"> + var r = Raphael(0, 0, 600, 600); + <%= + dat = this.feedback_chart_data + "r.g.piechart(300, 300, 200, [#{dat[:values]}], {legend: [#{dat[:labels]}], legendpos: \"north\"});" + %> + </script> + </body:> +</page> diff --git a/app/views/questions/show.dryml b/app/views/questions/show.dryml index 2e30578..8cb6629 100644 --- a/app/views/questions/show.dryml +++ b/app/views/questions/show.dryml @@ -26,5 +26,8 @@ <br/> <a href="&answer_path(this.reference_answer)">View reference answer</a>. </if> + <if test="¤t_user.try.role.try.is_recruiter? && this.answers.with_some_feedback.count > 0"> + <iframe src="<%= question_doc_feedback_chart_path(this.id) %>" width="600" height="600"/> + </if> </content-body:> </show-page> diff --git a/features/documentation_feedback.feature b/features/documentation_feedback.feature new file mode 100644 index 0000000..c792823 --- /dev/null +++ b/features/documentation_feedback.feature @@ -0,0 +1,25 @@ +Feature: Documentation feedback + As recruiter I want to see recruits feedback on questions documentation + But I don't want non-recruiters to see it + + Scenario: When there is feedback see it as recruiter but not as recruit + Given I am logged in as "recruit" + And a question "question" + When I am on show "question" question page + And I follow "Answer it!" + And I select "Documentation Ok" from "answer[feedback]" + And press "Create Answer" + + When I am on show "question" question page + Then I should see no pie chart with feedback + + When I follow "Log out" + And I am logged in as "recruiter" who is "recruiter" + When I am on show "question" question page + Then I should see pie chart with feedback for "question" + + Scenario: Don't see recruits feedback as recruiter when there is none + Given I am logged in as "recruiter" who is "recruiter" + And a question "question" + When I am on show "question" question page + Then I should see no pie chart with feedback diff --git a/features/step_definitions/documentation_feedback_steps.rb b/features/step_definitions/documentation_feedback_steps.rb new file mode 100644 index 0000000..58dcb98 --- /dev/null +++ b/features/step_definitions/documentation_feedback_steps.rb @@ -0,0 +1,16 @@ +Then /^I should see tag <([^<>]*)>$/ do |tag| + /#{tag}/.match(response.body).should_not be_nil +end + +Then /^I should not see tag <([^<>]*)>$/ do |tag| + /#{tag}/.match(response.body).should be_nil +end + +Then /^I should see pie chart with feedback for "([^"]*)"$/ do |question| + Given "a question \"#{question}\"" + Then "I should see tag <iframe src=\"/questions/#{@question.id}/doc_feedback_chart\">" +end + +Then /^I should see no pie chart with feedback$/ do + Then 'I should not see tag <iframe src="/questions/\d+/doc_feedback_chart">' +end diff --git a/spec/models/answer_spec.rb b/spec/models/answer_spec.rb index 9a60bb8..b9cdb05 100644 --- a/spec/models/answer_spec.rb +++ b/spec/models/answer_spec.rb @@ -332,4 +332,20 @@ describe Answer do Answer.new(:owner => user).should be_editable_by(user, :reference) end end + + it "should properly return answers with feedback" do + + with_feedback = (Answer.new.feedback.class.values - ['']).collect do |fb| + Factory(:answer, :feedback => fb) + end + + without_feedback = ['', nil].collect do |fb| + Factory(:answer, :feedback => fb) + end + + with_feedback.each{ |ans| Answer.with_some_feedback.include?(ans).should be_true } + without_feedback.each{ |ans| Answer.with_some_feedback.include?(ans).should be_false } + + Answer.with_some_feedback.count.should == Answer.with_some_feedback.uniq.count + end end diff --git a/spec/models/question_spec.rb b/spec/models/question_spec.rb index 05e81ef..710342f 100644 --- a/spec/models/question_spec.rb +++ b/spec/models/question_spec.rb @@ -192,4 +192,16 @@ describe Question do Factory(:answer, :question => q, :owner=> u) q.answered?(u).should be_true end + + it "should count feedback properly" do + q = Factory(:question) + Factory(:answer, :question => q, :feedback =>'Documentation ok') + Factory(:answer, :question => q, :feedback =>'Could not find documentation') + Factory(:answer, :question => q, :feedback =>'Could not find documentation') + Factory(:answer, :question => q, :feedback =>'Documentation insufficient') + Factory(:answer, :question => q, :feedback =>'Documentation insufficient') + Factory(:answer, :question => q, :feedback =>'Documentation insufficient') + + q.feedback_chart_data[:values].should == '1.00001, 2.00001, 3.00001' + end end |