redmine_crm 0.0.23 → 0.0.53

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -1
  3. data/README.md +166 -33
  4. data/Rakefile +3 -12
  5. data/app/controllers/redmine_crm_controller.rb +26 -0
  6. data/app/views/redmine_crm/_money.html.erb +44 -0
  7. data/app/views/redmine_crm/settings.html.erb +10 -0
  8. data/bitbucket-pipelines.yml +54 -0
  9. data/config/currency_iso.json +12 -0
  10. data/config/locales/en.yml +13 -0
  11. data/config/locales/ru.yml +13 -0
  12. data/config/routes.rb +5 -0
  13. data/doc/CHANGELOG +123 -2
  14. data/lib/redmine_crm/acts_as_draftable/draft.rb +40 -0
  15. data/lib/redmine_crm/acts_as_draftable/rcrm_acts_as_draftable.rb +172 -0
  16. data/lib/redmine_crm/acts_as_list/list.rb +282 -0
  17. data/lib/redmine_crm/{rcrm_acts_as_taggable.rb → acts_as_taggable/rcrm_acts_as_taggable.rb} +112 -93
  18. data/lib/redmine_crm/acts_as_taggable/tag.rb +81 -0
  19. data/lib/redmine_crm/acts_as_taggable/tag_list.rb +111 -0
  20. data/lib/redmine_crm/acts_as_taggable/tagging.rb +16 -0
  21. data/lib/redmine_crm/acts_as_viewed/rcrm_acts_as_viewed.rb +274 -0
  22. data/lib/redmine_crm/{rcrm_acts_as_votable.rb → acts_as_votable/rcrm_acts_as_votable.rb} +15 -14
  23. data/lib/redmine_crm/acts_as_votable/rcrm_acts_as_voter.rb +20 -0
  24. data/lib/redmine_crm/{votable.rb → acts_as_votable/votable.rb} +54 -65
  25. data/lib/redmine_crm/{vote.rb → acts_as_votable/vote.rb} +6 -8
  26. data/lib/redmine_crm/{voter.rb → acts_as_votable/voter.rb} +29 -34
  27. data/lib/redmine_crm/assets_manager.rb +43 -0
  28. data/lib/redmine_crm/colors_helper.rb +192 -0
  29. data/lib/redmine_crm/compatibility/application_controller_patch.rb +33 -0
  30. data/lib/redmine_crm/currency/formatting.rb +5 -8
  31. data/lib/redmine_crm/currency/heuristics.rb +1 -1
  32. data/lib/redmine_crm/currency/loader.rb +5 -6
  33. data/lib/redmine_crm/currency.rb +28 -17
  34. data/lib/redmine_crm/engine.rb +4 -0
  35. data/lib/redmine_crm/helpers/external_assets_helper.rb +19 -0
  36. data/lib/redmine_crm/helpers/form_tag_helper.rb +76 -0
  37. data/lib/redmine_crm/helpers/tags_helper.rb +1 -3
  38. data/lib/redmine_crm/helpers/vote_helper.rb +29 -32
  39. data/lib/redmine_crm/hooks/views_layouts_hook.rb +11 -0
  40. data/lib/redmine_crm/liquid/drops/issues_drop.rb +191 -0
  41. data/lib/redmine_crm/liquid/drops/news_drop.rb +54 -0
  42. data/lib/redmine_crm/liquid/drops/projects_drop.rb +86 -0
  43. data/lib/redmine_crm/liquid/drops/time_entries_drop.rb +65 -0
  44. data/lib/redmine_crm/liquid/drops/users_drop.rb +68 -0
  45. data/lib/redmine_crm/liquid/filters/arrays.rb +187 -0
  46. data/lib/redmine_crm/liquid/filters/base.rb +217 -0
  47. data/lib/redmine_crm/liquid/filters/colors.rb +31 -0
  48. data/lib/redmine_crm/money_helper.rb +17 -18
  49. data/lib/redmine_crm/settings/money.rb +46 -0
  50. data/lib/redmine_crm/settings.rb +53 -0
  51. data/lib/redmine_crm/version.rb +1 -1
  52. data/lib/redmine_crm.rb +60 -21
  53. data/redmine_crm.gemspec +12 -6
  54. data/test/acts_as_draftable/draft_test.rb +29 -0
  55. data/test/acts_as_draftable/rcrm_acts_as_draftable_test.rb +178 -0
  56. data/test/{acts_as_taggable_test.rb → acts_as_taggable/rcrm_acts_as_taggable_test.rb} +117 -156
  57. data/test/acts_as_taggable/tag_list_test.rb +34 -0
  58. data/test/acts_as_taggable/tag_test.rb +72 -0
  59. data/test/acts_as_taggable/tagging_test.rb +15 -0
  60. data/test/{viewed_test.rb → acts_as_viewed/rcrm_acts_as_viewed_test.rb} +17 -15
  61. data/test/acts_as_votable/rcrm_acts_as_votable_test.rb +19 -0
  62. data/test/acts_as_votable/rcrm_acts_as_voter_test.rb +14 -0
  63. data/test/{votable_model_test.rb → acts_as_votable/votable_test.rb} +34 -5
  64. data/test/{voter_model_test.rb → acts_as_votable/voter_test.rb} +8 -8
  65. data/test/currency_test.rb +10 -10
  66. data/test/database.yml +14 -14
  67. data/test/fixtures/issues.yml +13 -1
  68. data/test/fixtures/news.yml +8 -0
  69. data/test/fixtures/projects.yml +10 -0
  70. data/test/fixtures/users.yml +6 -2
  71. data/test/liquid/drops/issues_drop_test.rb +34 -0
  72. data/test/liquid/drops/news_drop_test.rb +38 -0
  73. data/test/liquid/drops/projects_drop_test.rb +44 -0
  74. data/test/liquid/drops/uses_drop_test.rb +36 -0
  75. data/test/liquid/filters/arrays_filter_test.rb +31 -0
  76. data/test/liquid/filters/base_filter_test.rb +63 -0
  77. data/test/liquid/filters/colors_filter_test.rb +33 -0
  78. data/test/liquid/liquid_helper.rb +34 -0
  79. data/test/models/issue.rb +14 -0
  80. data/test/models/news.rb +3 -0
  81. data/test/models/project.rb +8 -0
  82. data/test/{fixtures → models}/user.rb +5 -1
  83. data/test/{fixtures → models}/vote_classes.rb +0 -21
  84. data/test/money_helper_test.rb +5 -5
  85. data/test/schema.rb +33 -10
  86. data/test/test_helper.rb +20 -72
  87. data/vendor/assets/images/money.png +0 -0
  88. data/vendor/assets/images/vcard.png +0 -0
  89. data/vendor/assets/javascripts/Chart.bundle.min.js +16 -0
  90. data/vendor/assets/javascripts/select2.js +2 -0
  91. data/vendor/assets/javascripts/select2_helpers.js +192 -0
  92. data/vendor/assets/stylesheets/money.css +3 -0
  93. data/vendor/assets/stylesheets/select2.css +424 -0
  94. metadata +190 -40
  95. data/lib/redmine_crm/rcrm_acts_as_viewed.rb +0 -287
  96. data/lib/redmine_crm/rcrm_acts_as_voter.rb +0 -27
  97. data/lib/redmine_crm/tag.rb +0 -81
  98. data/lib/redmine_crm/tag_list.rb +0 -112
  99. data/lib/redmine_crm/tagging.rb +0 -20
  100. data/test/fixtures/issue.rb +0 -14
  101. data/test/tag_test.rb +0 -64
  102. data/test/tagging_test.rb +0 -14
  103. data/test/votable_test.rb +0 -17
@@ -0,0 +1,34 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class LiquidRender
4
+
5
+ def initialize(drops = {})
6
+ @objects_hash = [
7
+ {'name' => 'one', "value" => 10},
8
+ {'name' => 'two', "value" => 5},
9
+ {'name' => 'blank', "value" => nil},
10
+ {'name' => 'three', "value" => 6}
11
+ ]
12
+ @registers = {}
13
+ @assigns = {}
14
+ @assigns['objects_arr'] = @objects_hash
15
+ @assigns['issues'] = RedmineCrm::Liquid::IssuesDrop.new(Issue.all)
16
+ @assigns['now'] = Time.now
17
+ @assigns['today'] = Date.today.strftime(date_format)
18
+ drops.each do |key, drop|
19
+ @assigns[key] = drop
20
+ end
21
+ end
22
+
23
+ def render(content)
24
+ ::Liquid::Template.parse(content).render(::Liquid::Context.new({}, @assigns, @registers)).html_safe
25
+ rescue => e
26
+ e.message
27
+ end
28
+ end
29
+
30
+ module LiquidHelperMethods
31
+ def date_format
32
+ '%d.%m.%Y'
33
+ end
34
+ end
@@ -0,0 +1,14 @@
1
+ require_relative 'project'
2
+ require_relative 'user'
3
+
4
+ class Issue < ActiveRecord::Base
5
+ belongs_to :project
6
+ belongs_to :user
7
+ belongs_to :author, class_name: 'User'
8
+
9
+ rcrm_acts_as_draftable
10
+ rcrm_acts_as_taggable
11
+ rcrm_acts_as_viewed
12
+
13
+ scope :visible, lambda { where('1=1') }
14
+ end
@@ -0,0 +1,3 @@
1
+ class News < ActiveRecord::Base
2
+ belongs_to :author, :class_name => 'User'
3
+ end
@@ -0,0 +1,8 @@
1
+ class Project < ActiveRecord::Base
2
+ STATUS_ACTIVE = 1
3
+ has_many :issues, :dependent => :destroy
4
+
5
+ def active?
6
+ status == STATUS_ACTIVE
7
+ end
8
+ end
@@ -1,7 +1,11 @@
1
1
  class User < ActiveRecord::Base
2
2
  has_many :issues
3
3
 
4
+ def self.current
5
+ User.first
6
+ end
7
+
4
8
  def anonymous?
5
9
  false
6
10
  end
7
- end
11
+ end
@@ -2,10 +2,6 @@ class Voter < ActiveRecord::Base
2
2
  rcrm_acts_as_voter
3
3
  end
4
4
 
5
- class NotVoter < ActiveRecord::Base
6
-
7
- end
8
-
9
5
  class Votable < ActiveRecord::Base
10
6
  rcrm_acts_as_votable
11
7
  validates_presence_of :name
@@ -31,24 +27,7 @@ class VotableChildOfStiNotVotable < StiNotVotable
31
27
  rcrm_acts_as_votable
32
28
  end
33
29
 
34
- class NotVotable < ActiveRecord::Base
35
- end
36
-
37
30
  class VotableCache < ActiveRecord::Base
38
31
  rcrm_acts_as_votable
39
32
  validates_presence_of :name
40
33
  end
41
-
42
- class ABoringClass
43
- def self.hw
44
- 'hello world'
45
- end
46
- end
47
-
48
-
49
- # def clean_database
50
- # models = [ActsAsVotable::Vote, Voter, NotVoter, Votable, NotVotable, VotableCache]
51
- # models.each do |model|
52
- # ActiveRecord::Base.connection.execute "DELETE FROM #{model.table_name}"
53
- # end
54
- # end
@@ -4,9 +4,9 @@ class MoneyHelperTest < ActiveSupport::TestCase
4
4
  include RedmineCrm::MoneyHelper
5
5
 
6
6
  def test_price_to_currency
7
- assert_equal '$3,265.65', price_to_currency(3265.65, "USD")
8
- assert_equal "3.265,65 ₽", price_to_currency(3265.65, "RUB")
9
- assert_equal "3,200.0", price_to_currency(3200, "")
10
- assert_equal "3,200.0", price_to_currency(3200, "Foo")
7
+ assert_equal '$3,265.65', price_to_currency(3265.65, 'USD')
8
+ assert_equal '3.265,65 RUB', price_to_currency(3265.65, 'RUB')
9
+ assert_equal '3,200.0', price_to_currency(3200, '')
10
+ assert_equal '3,200.0', price_to_currency(3200, 'Foo')
11
11
  end
12
- end
12
+ end
data/test/schema.rb CHANGED
@@ -1,26 +1,40 @@
1
- ActiveRecord::Schema.define :version => 0 do
2
-
1
+ ActiveRecord::Schema.define version: 0 do
2
+
3
+ create_table :drafts, force: true do |t|
4
+ t.string :target_type
5
+ t.integer :target_id
6
+ t.references :project
7
+ t.references :user
8
+ t.references :parent, polymorphic: true
9
+ t.binary :data
10
+ t.datetime :updated_at
11
+ end
12
+
3
13
  create_table "tags", :force => true do |t|
4
14
  t.column "name", :string
5
15
  end
6
-
16
+
7
17
  create_table "taggings", :force => true do |t|
8
18
  t.column "tag_id", :integer
9
19
  t.column "taggable_id", :integer
10
20
  t.column "taggable_type", :string
11
21
  t.column "created_at", :datetime
12
22
  end
13
-
23
+
14
24
 
15
25
  create_table "users", :force => true do |t|
16
26
  t.column "name", :string
27
+ t.column "language", :string
17
28
  end
18
-
29
+
19
30
  create_table "issues", :force => true do |t|
31
+ t.integer "project_id"
32
+ t.column "subject", :string
20
33
  t.column "description", :string
21
34
  t.column "closed", :boolean
22
35
  t.column "cached_tag_list", :string
23
36
  t.column "user_id", :integer
37
+ t.column "author_id", :integer
24
38
  t.column "views", :integer, :default => 0
25
39
  t.column "total_views", :integer, :default => 0
26
40
  end
@@ -32,14 +46,23 @@ ActiveRecord::Schema.define :version => 0 do
32
46
  t.boolean "vote_flag"
33
47
  t.string "vote_scope"
34
48
  t.integer "vote_weight"
49
+ t.string "vote_ip"
35
50
 
36
51
  t.timestamps
37
52
  end
38
53
 
39
- # add_index :votes, [:votable_id, :votable_type]
40
- # add_index :votes, [:voter_id, :voter_type]
41
- # add_index :votes, [:voter_id, :voter_type, :vote_scope]
42
- # add_index :votes, [:votable_id, :votable_type, :vote_scope]
54
+ create_table "news", :force => true do |t|
55
+ t.string "title"
56
+ t.text "description"
57
+ t.integer "author_id"
58
+ end
59
+
60
+ create_table "projects", :force => true do |t|
61
+ t.string "name"
62
+ t.text "description"
63
+ t.string "identifier"
64
+ t.integer "status"
65
+ end
43
66
 
44
67
  create_table :voters, :force => true do |t|
45
68
  t.string :name
@@ -97,4 +120,4 @@ ActiveRecord::Schema.define :version => 0 do
97
120
  t.column :ip, :string, :limit => '24'
98
121
  t.column :created_at, :datetime
99
122
  end
100
- end
123
+ end
data/test/test_helper.rb CHANGED
@@ -1,50 +1,24 @@
1
+ require 'rails/all'
2
+ require 'redmine_crm'
1
3
  require 'minitest/autorun'
2
- # require 'test/unit'
3
-
4
- begin
5
- require File.dirname(__FILE__) + '/../../../../config/environment'
6
- rescue LoadError
7
- require 'rubygems'
8
- gem 'activerecord'
9
- gem 'actionpack'
10
- require 'active_record'
11
- # require 'action_controller'
12
- end
13
- require 'byebug'
14
- require "redmine_crm"
15
- require "active_record/fixtures"
16
-
17
- require File.dirname(__FILE__) + '/../lib/redmine_crm/rcrm_acts_as_taggable'
18
- require File.dirname(__FILE__) + '/../lib/redmine_crm/tag_list'
19
- require File.dirname(__FILE__) + '/../lib/redmine_crm/tag'
20
- require File.dirname(__FILE__) + '/../lib/redmine_crm/tagging'
21
- require File.dirname(__FILE__) + '/../lib/redmine_crm/helpers/tags_helper'
22
- require File.dirname(__FILE__) + '/../lib/redmine_crm/rcrm_acts_as_votable'
23
- require File.dirname(__FILE__) + '/../lib/redmine_crm/rcrm_acts_as_voter'
24
-
25
- # require_dependency File.dirname(__FILE__) + '/../lib/redmine_crm/tags_helper'
26
4
 
27
5
  ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + '/debug.log')
28
- ActiveRecord::Base.configurations = YAML::load(IO.read(File.dirname(__FILE__) + '/database.yml'))
29
- ActiveRecord::Base.establish_connection(ENV['DB'] || 'sqlite3')
6
+ ActiveRecord::Base.configurations = YAML.load_file(File.dirname(__FILE__) + '/database.yml')
7
+ ActiveRecord::Base.establish_connection(ENV['DB'].try(:to_sym) || :sqlite)
30
8
 
31
9
  load(File.dirname(__FILE__) + '/schema.rb')
32
- load(File.dirname(__FILE__) + '/fixtures/user.rb')
33
- load(File.dirname(__FILE__) + '/fixtures/issue.rb')
34
- load(File.dirname(__FILE__) + "/fixtures/vote_classes.rb")
35
-
36
- # Dir["/fixtures/*.rb"].each{|file| load file}
10
+ Dir.glob(File.expand_path('../models/*.rb', __FILE__)).each { |f| require f }
37
11
 
38
12
  class ActiveSupport::TestCase #:nodoc:
39
13
  include ActiveRecord::TestFixtures
40
-
41
- self.fixture_path = File.dirname(__FILE__) + "/fixtures/"
42
-
43
- self.use_transactional_fixtures = true
44
- self.use_instantiated_fixtures = false
45
- set_fixture_class :tags => RedmineCrm::Tag
46
- set_fixture_class :taggings => RedmineCrm::Tagging
47
-
14
+
15
+ self.fixture_path = File.dirname(__FILE__) + '/fixtures/'
16
+
17
+ self.use_transactional_tests = true if RUBY_VERSION > '1.9.3'
18
+ self.use_instantiated_fixtures = false
19
+ set_fixture_class :tags => RedmineCrm::ActsAsTaggable::Tag
20
+ set_fixture_class :taggings => RedmineCrm::ActsAsTaggable::Tagging
21
+
48
22
  set_fixture_class :votable_caches => VotableCache
49
23
  fixtures :all
50
24
 
@@ -62,57 +36,31 @@ class ActiveSupport::TestCase #:nodoc:
62
36
  hash[tags(tag).name] = count
63
37
  hash
64
38
  end
65
-
39
+
66
40
  tags.each do |tag|
67
41
  value = expected_values.delete(tag.name)
68
-
42
+
69
43
  assert_not_nil value, "Expected count for #{tag.name} was not provided"
70
44
  assert_equal value, tag.count, "Expected value of #{value} for #{tag.name}, but was #{tag.count}"
71
45
  end
72
-
46
+
73
47
  unless expected_values.empty?
74
48
  assert false, "The following tag counts were not present: #{expected_values.inspect}"
75
49
  end
76
50
  end
77
51
 
78
- # def assert_queries(num = 1)
79
- # $query_count = 0
80
- # yield
81
- # ensure
82
- # assert_equal num, $query_count, "#{$query_count} instead of #{num} queries were executed."
83
- # end
84
-
85
- # def assert_queries(num = 1, options = {})
86
- # ignore_none = options.fetch(:ignore_none) { num == :any }
87
- # SQLCounter.clear_log
88
- # yield
89
- # ensure
90
- # the_log = ignore_none ? SQLCounter.log_all : SQLCounter.log
91
- # if num == :any
92
- # assert_operator the_log.size, :>=, 1, "1 or more queries expected, but none were executed."
93
- # else
94
- # mesg = "#{the_log.size} instead of #{num} queries were executed.#{the_log.size == 0 ? '' : "\nQueries:\n#{the_log.join("\n")}"}"
95
- # assert_equal num, the_log.size, mesg
96
- # end
97
- # end
98
-
99
- def assert_no_queries(&block)
100
- assert_queries(0, &block)
101
- end
102
-
103
52
  # From Rails trunk
104
53
  def assert_difference(expressions, difference = 1, message = nil, &block)
105
- expression_evaluations = [expressions].flatten.collect{|expression| lambda { eval(expression, block.binding) } }
106
-
54
+ expression_evaluations = [expressions].flatten.collect{ |expression| lambda { eval(expression, block.binding) } }
55
+
107
56
  original_values = expression_evaluations.inject([]) { |memo, expression| memo << expression.call }
108
57
  yield
109
58
  expression_evaluations.each_with_index do |expression, i|
110
59
  assert_equal original_values[i] + difference, expression.call, message
111
60
  end
112
61
  end
113
-
62
+
114
63
  def assert_no_difference(expressions, message = nil, &block)
115
64
  assert_difference expressions, 0, message, &block
116
65
  end
117
-
118
- end
66
+ end
Binary file
Binary file