Commit fb3dd19efbc19665e57c832c8bf7e5b07464b398

Authored by Nick Recobra
1 parent ba17fba9
Exists in master and in 1 other branch production

Redmine issue tracker setup.

app/helpers/application_helper.rb
1 module ApplicationHelper 1 module ApplicationHelper
  2 + def lighthouse_tracker? object
  3 + object.issue_tracker_type == "lighthouseapp"
  4 + end
2 end 5 end
app/models/app.rb
@@ -30,7 +30,7 @@ class App @@ -30,7 +30,7 @@ class App
30 accepts_nested_attributes_for :watchers, :allow_destroy => true, 30 accepts_nested_attributes_for :watchers, :allow_destroy => true,
31 :reject_if => proc { |attrs| attrs[:user_id].blank? && attrs[:email].blank? } 31 :reject_if => proc { |attrs| attrs[:user_id].blank? && attrs[:email].blank? }
32 accepts_nested_attributes_for :issue_tracker, :allow_destroy => true, 32 accepts_nested_attributes_for :issue_tracker, :allow_destroy => true,
33 - :reject_if => proc { |attrs| !%w( lighthouseapp ).include?(attrs[:issue_tracker_type]) } 33 + :reject_if => proc { |attrs| !%w( lighthouseapp redmine ).include?(attrs[:issue_tracker_type]) }
34 34
35 # Mongoid Bug: find(id) on association proxies returns an Enumerator 35 # Mongoid Bug: find(id) on association proxies returns an Enumerator
36 def self.find_by_id!(app_id) 36 def self.find_by_id!(app_id)
app/models/issue_tracker.rb
@@ -5,7 +5,7 @@ class IssueTracker @@ -5,7 +5,7 @@ class IssueTracker
5 include Rails.application.routes.url_helpers 5 include Rails.application.routes.url_helpers
6 default_url_options[:host] = Errbit::Application.config.action_mailer.default_url_options[:host] 6 default_url_options[:host] = Errbit::Application.config.action_mailer.default_url_options[:host]
7 7
8 - validate :check_lighthouseapp_params 8 + validate :check_params
9 9
10 embedded_in :app, :inverse_of => :issue_tracker 10 embedded_in :app, :inverse_of => :issue_tracker
11 11
@@ -87,10 +87,15 @@ class IssueTracker @@ -87,10 +87,15 @@ class IssueTracker
87 end 87 end
88 88
89 protected 89 protected
90 - def check_lighthouseapp_params 90 + def check_params
91 blank_flags = %w( api_token project_id account ).map {|m| self[m].blank? } 91 blank_flags = %w( api_token project_id account ).map {|m| self[m].blank? }
92 if blank_flags.any? && !blank_flags.all? 92 if blank_flags.any? && !blank_flags.all?
93 - errors.add(:base, "You must specify your Lighthouseapp account, token and project id") 93 + message = if issue_tracker_type == 'lighthouseapp'
  94 + "You must specify your Lighthouseapp account, api token and project id"
  95 + else
  96 + "You must specify your Redmine url, api token and project id"
  97 + end
  98 + errors.add(:base, message)
94 end 99 end
95 end 100 end
96 end 101 end
app/views/apps/_fields.html.haml
@@ -25,15 +25,24 @@ @@ -25,15 +25,24 @@
25 %fieldset 25 %fieldset
26 %legend Issue tracker 26 %legend Issue tracker
27 = f.fields_for :issue_tracker do |w| 27 = f.fields_for :issue_tracker do |w|
28 - %div.watcher.nested 28 + %div.issue_tracker.nested
29 %div.choose 29 %div.choose
30 = w.radio_button :issue_tracker_type, :lighthouseapp 30 = w.radio_button :issue_tracker_type, :lighthouseapp
31 = label_tag :issue_tracker_type_lighthouseapp, 'Lighthouse', :for => label_for_attr(w, 'issue_tracker_type_lighthouseapp') 31 = label_tag :issue_tracker_type_lighthouseapp, 'Lighthouse', :for => label_for_attr(w, 'issue_tracker_type_lighthouseapp')
32 - %div.lighthouseapp{:class => 'choosen'} 32 + = w.radio_button :issue_tracker_type, :redmine
  33 + = label_tag :issue_tracker_type_redmine, 'Redmine', :for => label_for_attr(w, 'issue_tracker_type_redmine')
  34 + %div.tracker_params{:class => lighthouse_tracker?(w.object) ? 'choosen' : nil}
33 = w.label :account, "Account" 35 = w.label :account, "Account"
34 - = w.text_field :account 36 + = w.text_field :account, :placeholder => "abc from abc.lighthouseapp.com"
  37 + = w.label :api_token, "API token"
  38 + = w.text_field :api_token, :placeholder => "API Token for your account"
  39 + = w.label :project_id, "Project ID"
  40 + = w.text_field :project_id, :placeholder => "123 from abc from abc.lighthouseapp.com/projects/123"
  41 + %div.tracker_params{:class => lighthouse_tracker?(w.object) ? nil : 'choosen'}
  42 + = w.label :account, "Redmine URL"
  43 + = w.text_field :account, :placeholder => "like http://www.redmine.org/"
35 = w.label :api_token, "API token" 44 = w.label :api_token, "API token"
36 - = w.text_field :api_token 45 + = w.text_field :api_token, :placeholder => "API Token for your account"
37 = w.label :project_id, "Project ID" 46 = w.label :project_id, "Project ID"
38 = w.text_field :project_id 47 = w.text_field :project_id
39 48
public/javascripts/form.js
@@ -3,6 +3,9 @@ $(function(){ @@ -3,6 +3,9 @@ $(function(){
3 3
4 if($('div.watcher.nested').length) 4 if($('div.watcher.nested').length)
5 activateWatcherTypeSelector(); 5 activateWatcherTypeSelector();
  6 +
  7 + if($('div.issue_tracker.nested').length)
  8 + activateIssueTrackerTypeSelector();
6 }); 9 });
7 10
8 function activateNestedForms() { 11 function activateNestedForms() {
@@ -67,4 +70,20 @@ function activateWatcherTypeSelector() { @@ -67,4 +70,20 @@ function activateWatcherTypeSelector() {
67 wrapper.find('div.choosen').removeClass('choosen'); 70 wrapper.find('div.choosen').removeClass('choosen');
68 wrapper.find('div.'+choosen).addClass('choosen'); 71 wrapper.find('div.'+choosen).addClass('choosen');
69 }); 72 });
  73 +}
  74 +
  75 +function activateIssueTrackerTypeSelector() {
  76 + var not_choosen = $("div.tracker_params").filter(function () {
  77 + return !$(this).hasClass("choosen");
  78 + });
  79 + window.hiddenTracker = not_choosen.html();
  80 + not_choosen.remove();
  81 + $('div.issue_tracker input[name*=issue_tracker_type]').live('click', function(){
  82 + var choosen = $(this).val();
  83 + var wrapper = $(this).closest('.nested');
  84 + var tmp;
  85 + tmp = wrapper.find('div.choosen').html();
  86 + wrapper.find('div.choosen').html(window.hiddenTracker);
  87 + window.hiddenTracker = tmp;
  88 + });
70 } 89 }
71 \ No newline at end of file 90 \ No newline at end of file
public/stylesheets/application.css
@@ -501,14 +501,15 @@ a.button.active { @@ -501,14 +501,15 @@ a.button.active {
501 margin-right: 14px; 501 margin-right: 14px;
502 } 502 }
503 503
504 -/* Watchers Form */  
505 -div.nested.watcher .user, div.nested.watcher .email { 504 +/* Watchers and Issue Tracker Forms */
  505 +div.nested.watcher .user, div.nested.watcher .email, div.issue_tracker.nested .lighthouseapp, div.issue_tracker.nested .redmine {
506 display: none; 506 display: none;
507 } 507 }
508 -div.nested.watcher .choosen { 508 +div.nested.watcher .choosen, div.nested.issue_tracker .choosen {
509 display: block; 509 display: block;
510 } 510 }
511 -div.nested.watcher .choose { 511 +
  512 +div.nested.watcher .choose, div.nested.issue_tracker .choose {
512 margin-bottom: 0.5em; 513 margin-bottom: 0.5em;
513 } 514 }
514 515
spec/controllers/apps_controller_spec.rb
@@ -211,17 +211,32 @@ describe AppsController do @@ -211,17 +211,32 @@ describe AppsController do
211 @app.reload 211 @app.reload
212 212
213 @app.issue_tracker.should be_nil 213 @app.issue_tracker.should be_nil
214 - response.body.should match(/You must specify your Lighthouseapp account, token and project id/) 214 + response.body.should match(/You must specify your Lighthouseapp account, api token and project id/)
  215 + end
  216 + end
  217 +
  218 + context "redmine" do
  219 + it "should save tracker params" do
  220 + put :update, :id => @app.id, :app => { :issue_tracker_attributes => {
  221 + :issue_tracker_type => 'redmine', :project_id => '1234', :api_token => '123123', :account => 'http://myapp.com'
  222 + } }
  223 + @app.reload
  224 +
  225 + tracker = @app.issue_tracker
  226 + tracker.issue_tracker_type.should == 'redmine'
  227 + tracker.project_id.should == '1234'
  228 + tracker.api_token.should == '123123'
  229 + tracker.account.should == 'http://myapp.com'
215 end 230 end
216 231
217 it "should show validation notice when sufficient params are not present" do 232 it "should show validation notice when sufficient params are not present" do
218 put :update, :id => @app.id, :app => { :issue_tracker_attributes => { 233 put :update, :id => @app.id, :app => { :issue_tracker_attributes => {
219 - :issue_tracker_type => 'lighthouseapp', :project_id => '1234', :api_token => '123123' 234 + :issue_tracker_type => 'redmine', :project_id => '1234', :api_token => '123123'
220 } } 235 } }
221 @app.reload 236 @app.reload
222 237
223 @app.issue_tracker.should be_nil 238 @app.issue_tracker.should be_nil
224 - response.body.should match(/You must specify your Lighthouseapp account, token and project id/) 239 + response.body.should match(/You must specify your Redmine url, api token and project id/)
225 end 240 end
226 end 241 end
227 end 242 end