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.
- checksums.yaml +4 -4
- data/.gitignore +4 -1
- data/Gemfile +1 -1
- data/README.md +166 -33
- data/Rakefile +3 -12
- data/bitbucket-pipelines.yml +42 -0
- data/config/currency_iso.json +12 -0
- data/doc/CHANGELOG +81 -2
- data/lib/redmine_crm/acts_as_draftable/draft.rb +40 -0
- data/lib/redmine_crm/acts_as_draftable/rcrm_acts_as_draftable.rb +170 -0
- data/lib/redmine_crm/acts_as_list/list.rb +282 -0
- data/lib/redmine_crm/{rcrm_acts_as_taggable.rb → acts_as_taggable/rcrm_acts_as_taggable.rb} +105 -93
- data/lib/redmine_crm/acts_as_taggable/tag.rb +81 -0
- data/lib/redmine_crm/acts_as_taggable/tag_list.rb +111 -0
- data/lib/redmine_crm/acts_as_taggable/tagging.rb +16 -0
- data/lib/redmine_crm/acts_as_viewed/rcrm_acts_as_viewed.rb +274 -0
- data/lib/redmine_crm/{rcrm_acts_as_votable.rb → acts_as_votable/rcrm_acts_as_votable.rb} +15 -14
- data/lib/redmine_crm/acts_as_votable/rcrm_acts_as_voter.rb +20 -0
- data/lib/redmine_crm/{votable.rb → acts_as_votable/votable.rb} +54 -65
- data/lib/redmine_crm/{vote.rb → acts_as_votable/vote.rb} +6 -8
- data/lib/redmine_crm/{voter.rb → acts_as_votable/voter.rb} +29 -34
- data/lib/redmine_crm/assets_manager.rb +43 -0
- data/lib/redmine_crm/colors_helper.rb +192 -0
- data/lib/redmine_crm/compatibility/application_controller_patch.rb +33 -0
- data/lib/redmine_crm/currency/formatting.rb +0 -3
- data/lib/redmine_crm/currency/heuristics.rb +1 -1
- data/lib/redmine_crm/currency/loader.rb +5 -6
- data/lib/redmine_crm/helpers/external_assets_helper.rb +19 -0
- data/lib/redmine_crm/helpers/form_tag_helper.rb +76 -0
- data/lib/redmine_crm/helpers/tags_helper.rb +1 -3
- data/lib/redmine_crm/helpers/vote_helper.rb +29 -32
- data/lib/redmine_crm/liquid/drops/issues_drop.rb +191 -0
- data/lib/redmine_crm/liquid/drops/news_drop.rb +54 -0
- data/lib/redmine_crm/liquid/drops/projects_drop.rb +86 -0
- data/lib/redmine_crm/liquid/drops/time_entries_drop.rb +65 -0
- data/lib/redmine_crm/liquid/drops/users_drop.rb +68 -0
- data/lib/redmine_crm/liquid/filters/arrays.rb +187 -0
- data/lib/redmine_crm/liquid/filters/base.rb +217 -0
- data/lib/redmine_crm/liquid/filters/colors.rb +31 -0
- data/lib/redmine_crm/money_helper.rb +2 -4
- data/lib/redmine_crm/version.rb +1 -1
- data/lib/redmine_crm.rb +56 -21
- data/redmine_crm.gemspec +9 -4
- data/test/acts_as_draftable/draft_test.rb +29 -0
- data/test/acts_as_draftable/rcrm_acts_as_draftable_test.rb +179 -0
- data/test/{acts_as_taggable_test.rb → acts_as_taggable/rcrm_acts_as_taggable_test.rb} +117 -156
- data/test/acts_as_taggable/tag_list_test.rb +34 -0
- data/test/acts_as_taggable/tag_test.rb +72 -0
- data/test/acts_as_taggable/tagging_test.rb +15 -0
- data/test/{viewed_test.rb → acts_as_viewed/rcrm_acts_as_viewed_test.rb} +17 -15
- data/test/acts_as_votable/rcrm_acts_as_votable_test.rb +19 -0
- data/test/acts_as_votable/rcrm_acts_as_voter_test.rb +14 -0
- data/test/{votable_model_test.rb → acts_as_votable/votable_test.rb} +34 -5
- data/test/{voter_model_test.rb → acts_as_votable/voter_test.rb} +8 -8
- data/test/currency_test.rb +10 -10
- data/test/database.yml +14 -14
- data/test/fixtures/issues.yml +13 -1
- data/test/fixtures/news.yml +8 -0
- data/test/fixtures/projects.yml +10 -0
- data/test/fixtures/users.yml +6 -2
- data/test/liquid/drops/issues_drop_test.rb +34 -0
- data/test/liquid/drops/news_drop_test.rb +38 -0
- data/test/liquid/drops/projects_drop_test.rb +44 -0
- data/test/liquid/drops/uses_drop_test.rb +36 -0
- data/test/liquid/filters/arrays_filter_test.rb +31 -0
- data/test/liquid/filters/base_filter_test.rb +63 -0
- data/test/liquid/filters/colors_filter_test.rb +33 -0
- data/test/liquid/liquid_helper.rb +34 -0
- data/test/models/issue.rb +14 -0
- data/test/models/news.rb +3 -0
- data/test/models/project.rb +8 -0
- data/test/{fixtures → models}/user.rb +5 -1
- data/test/{fixtures → models}/vote_classes.rb +0 -21
- data/test/money_helper_test.rb +5 -5
- data/test/schema.rb +33 -10
- data/test/test_helper.rb +20 -72
- data/vendor/assets/images/vcard.png +0 -0
- data/vendor/assets/javascripts/Chart.bundle.min.js +16 -0
- data/vendor/assets/javascripts/select2.js +3 -0
- data/vendor/assets/javascripts/select2_helpers.js +186 -0
- data/vendor/assets/stylesheets/select2.css +414 -0
- metadata +162 -38
- data/lib/redmine_crm/rcrm_acts_as_viewed.rb +0 -287
- data/lib/redmine_crm/rcrm_acts_as_voter.rb +0 -27
- data/lib/redmine_crm/tag.rb +0 -81
- data/lib/redmine_crm/tag_list.rb +0 -112
- data/lib/redmine_crm/tagging.rb +0 -20
- data/test/fixtures/issue.rb +0 -14
- data/test/tag_test.rb +0 -64
- data/test/tagging_test.rb +0 -14
- 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
|
data/test/models/news.rb
ADDED
@@ -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
|
data/test/money_helper_test.rb
CHANGED
@@ -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,
|
8
|
-
assert_equal
|
9
|
-
assert_equal
|
10
|
-
assert_equal
|
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 :
|
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
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
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
|
29
|
-
ActiveRecord::Base.establish_connection(ENV['DB'] ||
|
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
|
-
|
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__) +
|
42
|
-
|
43
|
-
self.
|
44
|
-
self.use_instantiated_fixtures
|
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
|