Skip to content

Commit

Permalink
capturing collaborators for certain requests
Browse files Browse the repository at this point in the history
This captures request collaborators for requests not related to
user access. The collaborators are then set on the raised Zendesk ticket.
  • Loading branch information
benilovj committed Dec 11, 2012
1 parent b203f99 commit 4abc7dc
Show file tree
Hide file tree
Showing 14 changed files with 59 additions and 18 deletions.
22 changes: 21 additions & 1 deletion app/models/requester.rb
@@ -1,8 +1,28 @@
require 'tableless_model'

class Requester < TablelessModel
attr_accessor :email
attr_accessor :email, :collaborator_emails

This comment has been minimized.

Copy link
@jamiecobbett

jamiecobbett Dec 11, 2012

Contributor

No big deal (and I can imagine how it happened), but isn't having attr_accessor for collaborator_emails redundant with the methods below?


validates_presence_of :email
validates :email, :format => {:with => /@/}

validate :collaborator_emails_are_all_valid

def collaborator_emails
@collaborator_emails || []
end

def collaborator_emails=(emails_as_string)
@collaborator_emails = emails_as_string.split(",").collect(&:strip)
end

def collaborator_emails_are_all_valid
unless collaborator_emails.blank?
collaborator_emails.each do |collaborator_email|
unless collaborator_email =~ /@/
errors.add(:collaborator_emails, "#{collaborator_email} is not a valid email")
end
end
end
end
end
2 changes: 1 addition & 1 deletion app/views/campaign_requests/new.html.erb
Expand Up @@ -4,7 +4,7 @@
<div class="well">
<%= semantic_form_for @request, url: { action: "create" }, html: { novalidate: false } do |f| %>
<%= render partial: "support/requester", locals: { f: f } %>
<%= render partial: "support/requester", locals: { f: f, show_collaborators: true } %>
<%= render partial: "campaign_details", locals: { f: f } %>
Expand Down
2 changes: 1 addition & 1 deletion app/views/content_change_requests/new.html.erb
Expand Up @@ -21,7 +21,7 @@
<div class="well">
<%= semantic_form_for @request, url: { action: "create" }, html: { novalidate: false } do |f| %>
<%= render partial: "support/requester", locals: { f: f } %>
<%= render partial: "support/requester", locals: { f: f, show_collaborators: true } %>
<%= render partial: "request_details", locals: { f: f} %>
Expand Down
2 changes: 1 addition & 1 deletion app/views/create_new_user_requests/new.html.erb
Expand Up @@ -4,7 +4,7 @@
<div class="well">
<%= semantic_form_for @request, url: { action: "create" }, html: { novalidate: false } do |f| %>
<%= render partial: "support/requester", locals: { f: f } %>
<%= render partial: "support/requester", locals: { f: f, show_collaborators: false } %>
<%= render partial: "request_details", locals: { f: f } %>
Expand Down
2 changes: 1 addition & 1 deletion app/views/general_requests/new.html.erb
Expand Up @@ -8,7 +8,7 @@
<div class="well">
<%= semantic_form_for @request, url: { action: "create" }, html: { novalidate: false } do |f| %>
<%= render partial: "support/requester", locals: { f: f } %>
<%= render partial: "support/requester", locals: { f: f, show_collaborators: true } %>
<%= render partial: "request_details", locals: { f: f } %>
Expand Down
2 changes: 1 addition & 1 deletion app/views/new_feature_requests/new.html.erb
Expand Up @@ -4,7 +4,7 @@
<div class="well">
<%= semantic_form_for @request, :url => { :action => "create" }, :html => { :novalidate => false } do |f| %>
<%= render partial: "support/requester", locals: { f: f } %>
<%= render partial: "support/requester", locals: { f: f, show_collaborators: true } %>
<%= render partial: "request_details", locals: { f: f } %>
Expand Down
2 changes: 1 addition & 1 deletion app/views/remove_user_requests/new.html.erb
Expand Up @@ -4,7 +4,7 @@
<div class="well">
<%= semantic_form_for @request, url: { action: "create" }, html: { novalidate: false } do |f| %>
<%= render partial: "support/requester", locals: { f: f } %>
<%= render partial: "support/requester", locals: { f: f, show_collaborators: false } %>
<%= render partial: "request_details", locals: { f: f } %>
Expand Down
3 changes: 3 additions & 0 deletions app/views/support/_requester.html.erb
@@ -1,3 +1,6 @@
<%= f.semantic_fields_for :requester do |r| %>
<%= r.input :email, :label => "Your email", :as => :email, :required => true, :input_html => {:"aria-required" => true, :class => "span6"} %>
<% if show_collaborators %>
<%= r.input :collaborator_emails, :label => "Should anybody else be copied in on this request? (comma-separated list of emails)",:required => false, :input_html => {:class => "span6", :value => r.object.collaborator_emails.join(", ") } %>
<% end %>
<% end %>
10 changes: 1 addition & 9 deletions lib/zendesk_ticket.rb
Expand Up @@ -10,7 +10,7 @@ def initialize(request)
@requester = request.requester
end

def_delegators :@requester, :email
def_delegators :@requester, :email, :collaborator_emails

def comment
applicable_snippets = comment_snippets.select(&:applies?)
Expand Down Expand Up @@ -38,14 +38,6 @@ def inside_government_tag_if_needed
end

private

def inside_government_tag
if has_value?(:inside_government) and @request.inside_government == "yes"
["inside_government"]
else
[]
end
end

def has_value?(param, target = nil)
target ||= @request
Expand Down
1 change: 1 addition & 0 deletions lib/zendesk_tickets.rb
Expand Up @@ -16,6 +16,7 @@ def raise_ticket(ticket_to_raise)
:description => "Created via Govt API",
:priority => "normal",
:requester => {"locale_id" => 1, "email" => ticket_to_raise.email},
:collaborators => ticket_to_raise.collaborator_emails,
:fields => [{"id" => ZendeskTickets.field_ids[:needed_by_date], "value" => ticket_to_raise.needed_by_date},
{"id" => ZendeskTickets.field_ids[:not_before_date], "value" => ticket_to_raise.not_before_date}],
:tags => ticket_to_raise.tags,
Expand Down
9 changes: 9 additions & 0 deletions test/functional/requests_controller_test.rb
Expand Up @@ -95,5 +95,14 @@ def prevent_implicit_rendering
assert_equal ['tag_a', 'tag_b'], @zendesk_api.ticket.tags
assert_redirected_to "/acknowledge"
end

should "set collaborators if they're set on the request" do
params = valid_params_for_test_request.tap do |p|
p["test_request"]["requester_attributes"].merge!("collaborator_emails" => "ab@c.com, def@g.com")
end

post :create, params
assert_equal ["ab@c.com", "def@g.com"], @zendesk_api.ticket.collaborators
end
end
end
9 changes: 9 additions & 0 deletions test/unit/models/requester_test.rb
Expand Up @@ -5,4 +5,13 @@ class RequesterTest < Test::Unit::TestCase

should allow_value("ab@c.com").for(:email)
should_not allow_value("ab").for(:email)

should allow_value("").for(:collaborator_emails)
should allow_value("ab@c.com").for(:collaborator_emails)
should allow_value("ab@c.com, de@f.com").for(:collaborator_emails)
should_not allow_value("ab, de@f.com").for(:collaborator_emails)

should "have an empty list of collaborator emails if not set" do
assert_equal [], Requester.new.collaborator_emails
end
end
9 changes: 8 additions & 1 deletion test/unit/zendesk/zendesk_ticket_test.rb
Expand Up @@ -17,7 +17,7 @@ def with_time_constraint(attributes)
{time_constraint: OpenStruct.new(attributes)}
end

context "content change request" do
context "any request" do
should "set the requester details correctly" do
ticket = new_ticket(with_requester(email: "ab@c.com"))
assert_equal "ab@c.com", ticket.email
Expand All @@ -34,5 +34,12 @@ def with_time_constraint(attributes)
new_ticket(with_time_constraint(not_before_date: "03-02-2001")).not_before_date
end
end

context "with collaborators set" do
should "be passed through" do
ticket = new_ticket(with_requester(collaborator_emails: ["ab@c.com", "de@f.com"]))
assert_equal ["ab@c.com", "de@f.com"], ticket.collaborator_emails
end
end
end
end
2 changes: 1 addition & 1 deletion test/zendesk_api_stubs.rb
Expand Up @@ -14,7 +14,7 @@ def create(options)
@options = options
end

[:subject, :tags, :description].each do |property|
[:subject, :tags, :description, :collaborators].each do |property|
define_method(property) do
@options[property]
end
Expand Down

0 comments on commit 4abc7dc

Please sign in to comment.