redmine_crm 0.0.23 → 0.0.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -1
  3. data/Gemfile +1 -1
  4. data/README.md +166 -33
  5. data/Rakefile +3 -12
  6. data/bitbucket-pipelines.yml +42 -0
  7. data/config/currency_iso.json +12 -0
  8. data/doc/CHANGELOG +81 -2
  9. data/lib/redmine_crm/acts_as_draftable/draft.rb +40 -0
  10. data/lib/redmine_crm/acts_as_draftable/rcrm_acts_as_draftable.rb +170 -0
  11. data/lib/redmine_crm/acts_as_list/list.rb +282 -0
  12. data/lib/redmine_crm/{rcrm_acts_as_taggable.rb → acts_as_taggable/rcrm_acts_as_taggable.rb} +105 -93
  13. data/lib/redmine_crm/acts_as_taggable/tag.rb +81 -0
  14. data/lib/redmine_crm/acts_as_taggable/tag_list.rb +111 -0
  15. data/lib/redmine_crm/acts_as_taggable/tagging.rb +16 -0
  16. data/lib/redmine_crm/acts_as_viewed/rcrm_acts_as_viewed.rb +274 -0
  17. data/lib/redmine_crm/{rcrm_acts_as_votable.rb → acts_as_votable/rcrm_acts_as_votable.rb} +15 -14
  18. data/lib/redmine_crm/acts_as_votable/rcrm_acts_as_voter.rb +20 -0
  19. data/lib/redmine_crm/{votable.rb → acts_as_votable/votable.rb} +54 -65
  20. data/lib/redmine_crm/{vote.rb → acts_as_votable/vote.rb} +6 -8
  21. data/lib/redmine_crm/{voter.rb → acts_as_votable/voter.rb} +29 -34
  22. data/lib/redmine_crm/assets_manager.rb +43 -0
  23. data/lib/redmine_crm/colors_helper.rb +192 -0
  24. data/lib/redmine_crm/compatibility/application_controller_patch.rb +33 -0
  25. data/lib/redmine_crm/currency/formatting.rb +0 -3
  26. data/lib/redmine_crm/currency/heuristics.rb +1 -1
  27. data/lib/redmine_crm/currency/loader.rb +5 -6
  28. data/lib/redmine_crm/helpers/external_assets_helper.rb +19 -0
  29. data/lib/redmine_crm/helpers/form_tag_helper.rb +76 -0
  30. data/lib/redmine_crm/helpers/tags_helper.rb +1 -3
  31. data/lib/redmine_crm/helpers/vote_helper.rb +29 -32
  32. data/lib/redmine_crm/liquid/drops/issues_drop.rb +191 -0
  33. data/lib/redmine_crm/liquid/drops/news_drop.rb +54 -0
  34. data/lib/redmine_crm/liquid/drops/projects_drop.rb +86 -0
  35. data/lib/redmine_crm/liquid/drops/time_entries_drop.rb +65 -0
  36. data/lib/redmine_crm/liquid/drops/users_drop.rb +68 -0
  37. data/lib/redmine_crm/liquid/filters/arrays.rb +187 -0
  38. data/lib/redmine_crm/liquid/filters/base.rb +217 -0
  39. data/lib/redmine_crm/liquid/filters/colors.rb +31 -0
  40. data/lib/redmine_crm/money_helper.rb +2 -4
  41. data/lib/redmine_crm/version.rb +1 -1
  42. data/lib/redmine_crm.rb +56 -21
  43. data/redmine_crm.gemspec +9 -4
  44. data/test/acts_as_draftable/draft_test.rb +29 -0
  45. data/test/acts_as_draftable/rcrm_acts_as_draftable_test.rb +179 -0
  46. data/test/{acts_as_taggable_test.rb → acts_as_taggable/rcrm_acts_as_taggable_test.rb} +117 -156
  47. data/test/acts_as_taggable/tag_list_test.rb +34 -0
  48. data/test/acts_as_taggable/tag_test.rb +72 -0
  49. data/test/acts_as_taggable/tagging_test.rb +15 -0
  50. data/test/{viewed_test.rb → acts_as_viewed/rcrm_acts_as_viewed_test.rb} +17 -15
  51. data/test/acts_as_votable/rcrm_acts_as_votable_test.rb +19 -0
  52. data/test/acts_as_votable/rcrm_acts_as_voter_test.rb +14 -0
  53. data/test/{votable_model_test.rb → acts_as_votable/votable_test.rb} +34 -5
  54. data/test/{voter_model_test.rb → acts_as_votable/voter_test.rb} +8 -8
  55. data/test/currency_test.rb +10 -10
  56. data/test/database.yml +14 -14
  57. data/test/fixtures/issues.yml +13 -1
  58. data/test/fixtures/news.yml +8 -0
  59. data/test/fixtures/projects.yml +10 -0
  60. data/test/fixtures/users.yml +6 -2
  61. data/test/liquid/drops/issues_drop_test.rb +34 -0
  62. data/test/liquid/drops/news_drop_test.rb +38 -0
  63. data/test/liquid/drops/projects_drop_test.rb +44 -0
  64. data/test/liquid/drops/uses_drop_test.rb +36 -0
  65. data/test/liquid/filters/arrays_filter_test.rb +31 -0
  66. data/test/liquid/filters/base_filter_test.rb +63 -0
  67. data/test/liquid/filters/colors_filter_test.rb +33 -0
  68. data/test/liquid/liquid_helper.rb +34 -0
  69. data/test/models/issue.rb +14 -0
  70. data/test/models/news.rb +3 -0
  71. data/test/models/project.rb +8 -0
  72. data/test/{fixtures → models}/user.rb +5 -1
  73. data/test/{fixtures → models}/vote_classes.rb +0 -21
  74. data/test/money_helper_test.rb +5 -5
  75. data/test/schema.rb +33 -10
  76. data/test/test_helper.rb +20 -72
  77. data/vendor/assets/images/vcard.png +0 -0
  78. data/vendor/assets/javascripts/Chart.bundle.min.js +16 -0
  79. data/vendor/assets/javascripts/select2.js +3 -0
  80. data/vendor/assets/javascripts/select2_helpers.js +186 -0
  81. data/vendor/assets/stylesheets/select2.css +414 -0
  82. metadata +162 -38
  83. data/lib/redmine_crm/rcrm_acts_as_viewed.rb +0 -287
  84. data/lib/redmine_crm/rcrm_acts_as_voter.rb +0 -27
  85. data/lib/redmine_crm/tag.rb +0 -81
  86. data/lib/redmine_crm/tag_list.rb +0 -112
  87. data/lib/redmine_crm/tagging.rb +0 -20
  88. data/test/fixtures/issue.rb +0 -14
  89. data/test/tag_test.rb +0 -64
  90. data/test/tagging_test.rb +0 -14
  91. 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