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
data/lib/redmine_crm.rb CHANGED
@@ -1,27 +1,66 @@
1
- require "redmine_crm/version"
2
-
3
- require "redmine_crm/tag"
4
- require "redmine_crm/tag_list"
5
- require "redmine_crm/tagging"
6
- require "redmine_crm/rcrm_acts_as_taggable"
7
- require "redmine_crm/helpers/tags_helper"
8
- require "redmine_crm/currency"
9
- require "redmine_crm/money_helper"
10
- require "redmine_crm/rcrm_acts_as_votable"
11
- require "redmine_crm/rcrm_acts_as_voter"
12
- require "redmine_crm/vote"
13
- require "redmine_crm/voter"
14
- require "redmine_crm/rcrm_acts_as_viewed"
1
+ require 'active_record'
2
+ require 'action_view'
3
+
4
+ require 'redmine_crm/version'
5
+ require 'redmine_crm/engine'
6
+
7
+ require 'redmine_crm/settings'
8
+ require 'redmine_crm/settings/money'
9
+
10
+ require 'redmine_crm/acts_as_list/list'
11
+ require 'redmine_crm/acts_as_taggable/tag'
12
+ require 'redmine_crm/acts_as_taggable/tag_list'
13
+ require 'redmine_crm/acts_as_taggable/tagging'
14
+ require 'redmine_crm/acts_as_taggable/rcrm_acts_as_taggable'
15
+ require 'redmine_crm/acts_as_viewed/rcrm_acts_as_viewed'
16
+ require 'redmine_crm/acts_as_votable/rcrm_acts_as_votable'
17
+ require 'redmine_crm/acts_as_votable/rcrm_acts_as_voter'
18
+ require 'redmine_crm/acts_as_votable/vote'
19
+ require 'redmine_crm/acts_as_votable/voter'
20
+ require 'redmine_crm/acts_as_draftable/rcrm_acts_as_draftable'
21
+ require 'redmine_crm/acts_as_draftable/draft'
22
+
23
+ require 'redmine_crm/currency'
24
+ require 'redmine_crm/helpers/tags_helper'
25
+ require 'redmine_crm/money_helper'
26
+ require 'redmine_crm/colors_helper'
27
+
28
+ require 'liquid'
29
+ require 'redmine_crm/liquid/filters/base'
30
+ require 'redmine_crm/liquid/filters/arrays'
31
+ require 'redmine_crm/liquid/filters/colors'
32
+ require 'redmine_crm/liquid/drops/issues_drop'
33
+ require 'redmine_crm/liquid/drops/news_drop'
34
+ require 'redmine_crm/liquid/drops/projects_drop'
35
+ require 'redmine_crm/liquid/drops/users_drop'
36
+ require 'redmine_crm/liquid/drops/time_entries_drop'
37
+
38
+ require 'redmine_crm/helpers/external_assets_helper'
39
+ require 'redmine_crm/helpers/form_tag_helper'
40
+ require 'redmine_crm/assets_manager'
41
+
42
+ require 'redmine_crm/compatibility/application_controller_patch'
43
+
44
+ module RedmineCrm
45
+ GEM_NAME = 'redmine_crm'.freeze
46
+ end
15
47
 
16
48
  if defined?(ActiveRecord::Base)
17
- ActiveRecord::Base.extend(RedmineCrm::ActsAsVotable::Votable)
49
+ ActiveRecord::Base.send :include, RedmineCrm::ActsAsList::List
18
50
  ActiveRecord::Base.extend(RedmineCrm::ActsAsVotable::Voter)
51
+ ActiveRecord::Base.extend(RedmineCrm::ActsAsVotable::Votable)
19
52
  end
20
53
 
21
- def requires_redmine_crm(arg)
54
+ RedmineCrm::AssetsManager.install_assets
22
55
 
56
+ if defined?(ActionView::Base)
57
+ ActionView::Base.send :include, RedmineCrm::ExternalAssetsHelper
58
+ ActionView::Base.send :include, RedmineCrm::FormTagHelper
59
+ end
60
+
61
+ def requires_redmine_crm(arg)
23
62
  def compare_versions(requirement, current)
24
- raise ArgumentError.new("wrong version format") unless check_version_format(requirement)
63
+ raise ArgumentError.new('wrong version format') unless check_version_format(requirement)
25
64
  requirement = requirement.split('.').collect(&:to_i)
26
65
  requirement <=> current.slice(0, requirement.size)
27
66
  end
@@ -33,11 +72,11 @@ def requires_redmine_crm(arg)
33
72
  arg = { :version_or_higher => arg } unless arg.is_a?(Hash)
34
73
  arg.assert_valid_keys(:version, :version_or_higher)
35
74
 
36
- current = RedmineCrm::VERSION.split(".").map{|x| x.to_i}
75
+ current = RedmineCrm::VERSION.split('.').map { |x| x.to_i }
37
76
  arg.each do |k, req|
38
77
  case k
39
78
  when :version_or_higher
40
- raise ArgumentError.new(":version_or_higher accepts a version string only") unless req.is_a?(String)
79
+ raise ArgumentError.new(':version_or_higher accepts a version string only') unless req.is_a?(String)
41
80
  unless compare_versions(req, current) <= 0
42
81
  Rails.logger.error "\033[31m[ERROR]\033[0m Redmine requires redmine_crm gem version #{req} or higher (you're using #{RedmineCrm::VERSION}).\n\033[31m[ERROR]\033[0m Please update with 'bundle update redmine_crm'." if Rails.logger
43
82
  abort "\033[31mRedmine requires redmine_crm gem version #{req} or higher (you're using #{RedmineCrm::VERSION}).\nPlease update with 'bundle update redmine_crm'.\033[0m"
@@ -53,9 +92,9 @@ def requires_redmine_crm(arg)
53
92
  abort "\033[31mRedmine requires redmine_crm gem version between #{req.first} and #{req.last} (you're using #{RedmineCrm::VERSION}).\nPlease update with 'bundle update redmine_crm'.\033[0m"
54
93
  end
55
94
  else
56
- raise ArgumentError.new(":version option accepts a version string, an array or a range of versions")
95
+ raise ArgumentError.new(':version option accepts a version string, an array or a range of versions')
57
96
  end
58
97
  end
59
98
  end
60
99
  true
61
- end
100
+ end
data/redmine_crm.gemspec CHANGED
@@ -6,17 +6,23 @@ require 'redmine_crm/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "redmine_crm"
8
8
  spec.version = RedmineCrm::VERSION
9
- spec.authors = ["RedmineCRM"]
9
+ spec.authors = ["RedmineUP"]
10
10
  spec.email = ["support@redminecrm.com"]
11
- spec.summary = %q{Common libraries for RedmineCRM plugins for Redmine}
12
- spec.description = %q{Common libraries for RedmineCRM plugins for Redmine. Requered Redmine from http://redmine.org}
13
- spec.homepage = ""
14
- spec.license = "GPL2"
11
+ spec.summary = %q{Common libraries for RedmineUP plugins for Redmine}
12
+ spec.description = %q{Common libraries for RedmineUP plugins (www.redmineup.com) for Redmine. Requered Redmine from http://redmine.org}
13
+ spec.homepage = "https://www.redmineup.com"
14
+ spec.license = "GPL-2.0"
15
15
 
16
16
  spec.files = `git ls-files -z`.split("\x0")
17
17
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- end
21
+ spec.add_runtime_dependency 'rails'
22
+ spec.add_runtime_dependency 'liquid', '< 2.6.4'
23
+ spec.add_runtime_dependency 'rubyzip'
22
24
 
25
+ spec.add_development_dependency 'sqlite3'
26
+ spec.add_development_dependency 'mysql2'
27
+ spec.add_development_dependency 'pg'
28
+ end
@@ -0,0 +1,29 @@
1
+ require File.expand_path('../../test_helper', __FILE__)
2
+
3
+ class DraftTest < ActiveSupport::TestCase
4
+ def test_restore
5
+ issue = Issue.new(subject: 'some subject', description: 'some description')
6
+
7
+ issue.save_draft
8
+ restored_issue = RedmineCrm::ActsAsDraftable::Draft.find(issue.draft_id).restore
9
+
10
+ assert_equal issue.subject, restored_issue.subject
11
+ assert_equal issue.description, restored_issue.description
12
+ end
13
+
14
+ def test_restore_all
15
+ first_issue = Issue.new(subject: 'first subject')
16
+ first_issue.save_draft
17
+ second_issue = Issue.new(subject: 'second subject')
18
+ second_issue.save_draft
19
+
20
+ restored_issues = RedmineCrm::ActsAsDraftable::Draft.restore_all
21
+ assert_equal [first_issue.subject, second_issue.subject], restored_issues.map(&:subject).sort
22
+ end
23
+
24
+ private
25
+
26
+ def current_user
27
+ users(:sam)
28
+ end
29
+ end
@@ -0,0 +1,178 @@
1
+ require File.expand_path('../../test_helper', __FILE__)
2
+
3
+ class RcrmActsAsDraftableTest < ActiveSupport::TestCase
4
+ def test_rcrm_acts_as_draftable_without_arguments
5
+ assert_nothing_raised do
6
+ Project.rcrm_acts_as_draftable
7
+ end
8
+ end
9
+
10
+ def test_rcrm_acts_as_draftable_with_parent
11
+ assert_nothing_raised do
12
+ News.rcrm_acts_as_draftable(parent: :author)
13
+ end
14
+ assert User.new.respond_to?(:drafts)
15
+ end
16
+
17
+ def test_rcrm_acts_as_draftable_with_non_existing_parent
18
+ assert_raises do
19
+ Issue.rcrm_acts_as_draftable(parent: :foo)
20
+ end
21
+ end
22
+
23
+ def test_rcrm_acts_as_draftable_with_non_hash_argument
24
+ assert_raises do
25
+ Issue.rcrm_acts_as_draftable('bar')
26
+ end
27
+ end
28
+
29
+ def test_rcrm_acts_as_draftable_with_invalid_hash_key
30
+ assert_raises do
31
+ Issue.rcrm_acts_as_draftable(baz: 'qux')
32
+ end
33
+ end
34
+
35
+ def test_drafts
36
+ Issue.rcrm_acts_as_draftable parent: :project
37
+ issue = Issue.new
38
+ issue.save_draft
39
+
40
+ assert_equal 1, Issue.drafts(current_user).count
41
+ assert_equal RedmineCrm::ActsAsDraftable::Draft, Issue.drafts(current_user).first.class
42
+ end
43
+
44
+ def test_from_draft
45
+ Issue.rcrm_acts_as_draftable parent: :project
46
+ issue = Issue.new(subject: 'subject')
47
+ issue.save_draft
48
+
49
+ issue_from_draft = Issue.from_draft(issue.draft_id)
50
+
51
+ assert_equal Issue, issue_from_draft.class
52
+ assert_equal true, issue_from_draft.new_record?
53
+ assert_equal issue.draft_id, issue_from_draft.draft_id
54
+
55
+ assert_equal issue.subject, issue_from_draft.subject
56
+ end
57
+
58
+ def test_draft_deleted_after_save
59
+ issue = Issue.new(subject: 'subject')
60
+ issue.save_draft
61
+
62
+ issue_from_draft = Issue.from_draft(issue.draft_id)
63
+
64
+ assert_difference 'Issue.count' do
65
+ assert_difference 'RedmineCrm::ActsAsDraftable::Draft.count', -1 do
66
+ issue_from_draft.save!
67
+ end
68
+ end
69
+ assert_nil issue_from_draft.draft_id
70
+ end
71
+
72
+ def test_from_draft_with_non_existing_draft_id
73
+ assert_raises do
74
+ Issue.from_draft(999)
75
+ end
76
+ end
77
+
78
+ def test_from_draft_with_wrong_type
79
+ Project.rcrm_acts_as_draftable
80
+
81
+ project = Project.new
82
+ project.save_draft
83
+
84
+ assert_raises do
85
+ Issue.from_draft(project.draft_id)
86
+ end
87
+ end
88
+
89
+ def test_dump_to_draft
90
+ assert_equal String, Issue.new.dump_to_draft.class
91
+ end
92
+
93
+ def test_load_from_draft
94
+ attributes = {subject: 'subject', description: 'description'}
95
+ draft = Issue.new(attributes).dump_to_draft
96
+
97
+ issue = Issue.new
98
+ issue.load_from_draft(draft)
99
+
100
+ assert_equal attributes[:subject], issue.subject
101
+ assert_equal attributes[:description], issue.description
102
+ end
103
+
104
+ def test_save_draft
105
+ Issue.rcrm_acts_as_draftable parent: :project
106
+ attributes = { subject: 'subject' }
107
+ issue = Issue.new(attributes)
108
+
109
+ assert_no_difference 'Issue.count' do
110
+ assert_difference 'RedmineCrm::ActsAsDraftable::Draft.count' do
111
+ result = issue.save_draft
112
+ assert_equal true, result
113
+ end
114
+ end
115
+ assert_not_nil issue.draft_id
116
+
117
+ draft = RedmineCrm::ActsAsDraftable::Draft.find(issue.draft_id)
118
+ assert_equal 'Issue', draft.target_type
119
+ assert_equal current_user.id, draft.user_id
120
+ assert_equal attributes[:subject], draft.restore.subject
121
+ end
122
+
123
+ def test_save_draft_with_associations
124
+ Issue.rcrm_acts_as_draftable parent: :project
125
+ issue = Issue.new(project: projects(:second_project))
126
+ issue.save_draft
127
+
128
+ draft = RedmineCrm::ActsAsDraftable::Draft.find(issue.draft_id)
129
+ assert_equal issue.project.name, draft.restore.project.name
130
+ end
131
+
132
+ def test_save_draft_updates_existing_draft
133
+ Issue.rcrm_acts_as_draftable parent: :project
134
+ issue = Issue.new
135
+ issue.save_draft
136
+
137
+ issue.subject = 'changed subject'
138
+ assert_no_difference 'Issue.count' do
139
+ assert_no_difference 'RedmineCrm::ActsAsDraftable::Draft.count' do
140
+ issue.save_draft
141
+ end
142
+ end
143
+
144
+ draft = RedmineCrm::ActsAsDraftable::Draft.find(issue.draft_id)
145
+ assert_equal issue.subject, draft.restore.subject
146
+ end
147
+
148
+ def test_save_draft_does_not_save_persisted_object
149
+ issue = issues(:second_issue)
150
+ assert_equal false, issue.save_draft
151
+ end
152
+
153
+ def test_save_draft_saves_persisted_but_changed_object
154
+ issue = issues(:second_issue)
155
+ issue.subject = 'changed subject'
156
+ assert_equal true, issue.save_draft
157
+ end
158
+
159
+ def test_update_draft
160
+ issue = Issue.new(subject: 'subject')
161
+ issue.save_draft
162
+
163
+ assert_no_difference 'Issue.count' do
164
+ assert_no_difference 'RedmineCrm::ActsAsDraftable::Draft.count' do
165
+ issue.update_draft(subject: 'updated_subject')
166
+ end
167
+ end
168
+
169
+ draft = RedmineCrm::ActsAsDraftable::Draft.find(issue.draft_id)
170
+ assert_equal issue.subject, draft.restore.subject
171
+ end
172
+
173
+ private
174
+
175
+ def current_user
176
+ users(:sam)
177
+ end
178
+ end