Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/assets/stylesheets/style.css.sass
Original file line number Diff line number Diff line change
Expand Up @@ -526,7 +526,7 @@ footer
border-left: 5px solid
transition-duration: 0.2s

.message_container
.feedback
padding: 90px
text-align: center
line-height: 2em
Expand Down
10 changes: 4 additions & 6 deletions app/controllers/feedback_controller.rb
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
class FeedbackController < ApplicationController

def show
redirect_to action: 'not_found' unless Feedback.find_by_token(params[:id])
redirect_to action: 'not_found' unless FeedbackRequest.find_by(token: params[:id], submited: false)

@feedback = Feedback.new(token: params[:id])
@feedback = Feedback.new
end

def submit
redirect_to action: 'not_found' unless Feedback.find_by_token(params[:id])

if Feedback.submit_feedback(feedback_params)
if Feedback.submit_feedback(feedback_params, params[:id])
redirect_to success_feedback_path
else
@feedback = Feedback.new(feedback_params)
Expand All @@ -26,6 +24,6 @@ def success; end
private

def feedback_params
params.require(:feedback).permit(:coach_id, :tutorial_id, :request, :rating, :suggestions, :token)
params.require(:feedback).permit(:coach_id, :tutorial_id, :request, :rating, :suggestions)
end
end
15 changes: 15 additions & 0 deletions app/helpers/email_header_helper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
module EmailHeaderHelper
private

def load_attachments
%w{logo.png}.each do |image|
attachments.inline[image] = File.read("#{Rails.root.to_s}/app/assets/images/#{image}")
end
end

def mail_args(member, subject)
{ :from => "Codebar.io <meetings@codebar.io>",
:to => member.email,
:subject => subject }
end
end
8 changes: 2 additions & 6 deletions app/mailers/course_invitation_mailer.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
class CourseInvitationMailer < ActionMailer::Base
include EmailHeaderHelper

layout 'email'

def invite_student course, member, invitation
Expand All @@ -23,12 +25,6 @@ def load_attachments
end
end

def mail_args(member, subject)
{ :from => "Codebar.io <meetings@codebar.io>",
:to => member.email,
:subject => subject }
end

helper do
def full_url_for path
"#{@host}#{path}"
Expand Down
26 changes: 26 additions & 0 deletions app/mailers/feedback_request_mailer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
class FeedbackRequestMailer < ActionMailer::Base
include EmailHeaderHelper

layout 'email'

def request_feedback sessions, member, feedback_request
@session = sessions
@host_address = AddressDecorator.decorate(@session.host.address)
@member = member
@feedback_request = feedback_request

load_attachments

subject = "Feedback for #{@session.title} by Codebar - #{l(@session.date_and_time, format: :email_title)}"

mail(mail_args(member, subject)) do |format|
format.html
end
end

helper do
def full_url_for path
"#{@host}#{path}"
end
end
end
14 changes: 2 additions & 12 deletions app/mailers/session_invitation_mailer.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
class SessionInvitationMailer < ActionMailer::Base
include EmailHeaderHelper

layout 'email'

def invite_student sessions, member, invitation
Expand Down Expand Up @@ -95,18 +97,6 @@ def spots_available session, member, invitation

private

def load_attachments
%w{logo.png}.each do |image|
attachments.inline[image] = File.read("#{Rails.root.to_s}/app/assets/images/#{image}")
end
end

def mail_args(member, subject)
{ :from => "Codebar.io <meetings@codebar.io>",
:to => member.email,
:subject => subject }
end

helper do
def full_url_for path
"#{@host}#{path}"
Expand Down
3 changes: 3 additions & 0 deletions app/models/concerns/listable.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,8 @@ module ClassMethods
def next
upcoming.load.first
end
def most_recent
past.load.first
end
end
end
21 changes: 8 additions & 13 deletions app/models/feedback.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ class Feedback < ActiveRecord::Base
belongs_to :tutorial
belongs_to :coach, class_name: "Member"

validates :rating, presence: true, numericality: true, :inclusion => 1..5
validates :rating, inclusion: { in: 1..5, message: "can't be blank" }
validates :coach, presence: true
validates :tutorial, presence: true
validate :coach_field_has_a_coach_role?
Expand All @@ -16,20 +16,15 @@ def coach_field_has_a_coach_role?
end
end

def self.submit_feedback params
return false unless Feedback.new(params).valid?

feedback = Feedback.find_by_token(params[:token])

if feedback
feedback.update_attributes(params)
def self.submit_feedback params, token
return false unless feedback_request = FeedbackRequest.find_by_token(token)
feedback = Feedback.new(params)

if feedback.valid? && !feedback_request.submited
feedback_request.update_attributes(submited: true)
feedback.save
else
false
end
end

def self.create_token token
Feedback.new(token: token).save(validate: false) unless token.blank?
end

end
25 changes: 25 additions & 0 deletions app/models/feedback_request.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
class FeedbackRequest < ActiveRecord::Base
belongs_to :member
belongs_to :sessions

validates :member, presence: true
validates :sessions, presence: true
validates :token, uniqueness: true, presence: true
validates_inclusion_of :submited, :in => [true, false]

before_create :set_token
after_create :email

private

def set_token
self.token = loop do
random_token = SecureRandom.urlsafe_base64(nil, false)
break random_token unless self.class.where(token: random_token).exists?
end
end

def email
FeedbackRequestMailer.request_feedback(self.sessions, self.member, self).deliver
end
end
2 changes: 1 addition & 1 deletion app/views/feedback/not_found.html.haml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
.message_container
.feedback
.error
=I18n.t("messages.feedback_not_found")
=link_to "Return to homepage >>", root_path
4 changes: 2 additions & 2 deletions app/views/feedback/show.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
- @feedback.errors.full_messages.each do |error_message|
%li=error_message

= simple_form_for @feedback, url: submit_feedback_path(@feedback.token), html: {method: "patch"} do |f|
= f.hidden_field :token
= simple_form_for @feedback, url: submit_feedback_path(params[:id]), html: {method: "patch"} do |f|
= f.hidden_field :token, :value => params[:id]
= f.hidden_field :rating
.row
%label.required
Expand Down
2 changes: 1 addition & 1 deletion app/views/feedback/success.html.haml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
.success_container
.feedback
.success
=I18n.t("messages.feedback_saved")

Expand Down
11 changes: 11 additions & 0 deletions app/views/feedback_request_mailer/request_feedback.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<h2 style="font-weight: 400; font-size: 24px; border-bottom:1px solid #ececec; padding-bottom: 15px; margin-bottom:35px">Hi <%= @member.name %></h2>

<h3 style="font-weight: 400; font-size: 17px; letter-spacing: 0.01em; color: #111111">Thanks for attending our codebar sessions!</h3>

<p style="font-weight: 300; font-size: 16px; color: #2e2e2e">We would like to ask you to give us feedback, so we could improve and make the Codebar better for you and others. It's completely anonymous and it will take just a couple of minutes.</p>

<div style="background-color: #F7F7F7; width: 90%; border-radius: 6px; box-shadow: 1px 1px 0 rgba(250, 250, 250, 0.5) inset, -1px -1px 2px rgba(250, 250, 250, 0.1) inset; font-size: 18px; padding: 5px 14px; text-align: center; margin: 31px 0 25px; border: 1px solid #dddddd;">
<p> <%= link_to "Submit feedback", full_url_for(feedback_url(@feedback_request.token)), style: "text-decoration:none; color: #663095; font-size: 25px; font-weight: 600; letter-spacing: 0.02em; margin: 10px; text-decoration: none; text-shadow: 0 1px 0 rgba(255, 255, 255, 0.7);"%></p>
</div>

<p style="font-weight: 300; font-size: 16px; color: #2e2e2e;">Thank you.</p>
2 changes: 2 additions & 0 deletions config/environments/development.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
# Do not eager load code on boot.
config.eager_load = false

config.action_mailer.default_url_options = { :host => 'localhost:3000' }

# Show full error reports and disable caching.
config.consider_all_requests_local = true
config.action_controller.perform_caching = false
Expand Down
2 changes: 1 addition & 1 deletion config/locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ en:
member_notifications: "You will be receiving notifications for: %{roles}"
no_roles: "You have not selected any roles so you won't be receiving any notifications. If you change your mind, send us an email at hello@codebar.io so we can change your settings."
feedback_saved: "Feedback was successfully submited. Thank you!"
feedback_not_found: "Sorry, feedback link seems to be invalid."
feedback_not_found: "Sorry, feedback is already submited or link does not exists."

notifications:
provider_already_connected: 'You are already signed in!'
12 changes: 12 additions & 0 deletions db/migrate/20140119093708_create_feedback_requests.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
class CreateFeedbackRequests < ActiveRecord::Migration
def change
create_table :feedback_requests do |t|
t.references :member, index: true
t.references :sessions, index: true
t.string :token
t.boolean :submited

t.timestamps
end
end
end
5 changes: 5 additions & 0 deletions db/migrate/20140202112853_remove_token_from_feedbacks.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class RemoveTokenFromFeedbacks < ActiveRecord::Migration
def change
remove_column :feedbacks, :token, :string
end
end
16 changes: 13 additions & 3 deletions db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema.define(version: 20131222160002) do
ActiveRecord::Schema.define(version: 20140202112853) do

create_table "addresses", force: true do |t|
t.string "flat"
Expand Down Expand Up @@ -59,19 +59,29 @@
t.datetime "updated_at"
end

create_table "feedback_requests", force: true do |t|
t.integer "member_id"
t.integer "sessions_id"
t.string "token"
t.boolean "submited"
t.datetime "created_at"
t.datetime "updated_at"
end

add_index "feedback_requests", ["member_id"], name: "index_feedback_requests_on_member_id"
add_index "feedback_requests", ["sessions_id"], name: "index_feedback_requests_on_sessions_id"

create_table "feedbacks", force: true do |t|
t.integer "tutorial_id"
t.text "request"
t.integer "coach_id"
t.text "suggestions"
t.datetime "created_at"
t.datetime "updated_at"
t.string "token"
t.integer "rating"
end

add_index "feedbacks", ["coach_id"], name: "index_feedbacks_on_coach_id"
add_index "feedbacks", ["token"], name: "index_feedbacks_on_token", unique: true
add_index "feedbacks", ["tutorial_id"], name: "index_feedbacks_on_tutorial_id"

create_table "meeting_talks", force: true do |t|
Expand Down
4 changes: 2 additions & 2 deletions db/seeds.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@

tutorials = 10.times.map { |n| Fabricate(:tutorial, sessions: sessions.sample) }

feedbacks_not_submited = Feedback.new(token: 'feedback_valid_token').save(validate: false)
feedback_requests = 5.times.map { Fabricate(:feedback_request) }

feedbacks = 5.times { Fabricate(:feedback, tutorial: tutorials.sample, coach: coaches.sample) }
feedbacks = 5.times.map { Fabricate(:feedback, tutorial: tutorials.sample, coach: coaches.sample) }

40.times do |n|
coach = coaches.sample
Expand Down
19 changes: 19 additions & 0 deletions lib/tasks/feedback.rake
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
namespace :feedback do
desc "Request feedback from students that attendanted last session"

task request: :environment do
raise 'Sorry. No recent sessions found.' if Sessions.most_recent.nil?

STDOUT.print "Do you want to send feedback requests for session: #{Sessions.most_recent.title}? (y/N) "

if STDIN.gets.chomp == 'y'
STDOUT.puts "Sending feedback requests to:"
Sessions.most_recent.invitations.attended.each do |invitation|
STDOUT.puts "#{invitation.member.full_name} <#{invitation.member.email}>"
FeedbackRequest.create(member: invitation.member, sessions: invitation.sessions, submited: false)
end

STDOUT.puts "\nTotal requests sent: #{Sessions.most_recent.invitations.attended.count}"
end
end
end
6 changes: 6 additions & 0 deletions spec/fabricators/feedback_request_fabricator.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
Fabricator(:feedback_request) do
member
sessions
token { 'valid_token' }
submited { false }
end
Loading