redmine_crm 0.0.32 → 0.0.33

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 53e88df183eaac044b20107ec4bb73502d92239a
4
- data.tar.gz: b37a3fea030250fba44999d8070c374003570273
3
+ metadata.gz: 5242b016d5072c81150cb2008b3fc7633a96216f
4
+ data.tar.gz: b3f77eb78ff97c6c06ef28e57b8d17af8d7f8e34
5
5
  SHA512:
6
- metadata.gz: 017078dd495d19f831c5d5981e202e230c082de7d3dbb39adf42b4fb8f05d01a782cce1864b50c5767e1292725e0d6c938bdc3c1af448707449a8e3f37d01e25
7
- data.tar.gz: 735298c2dab4727a52483e097cc8cdfdfdec0d443d3fb746d5ec7146ea5f77350b58b2ec60bcdf51aeecbcdaf7b74db95b69fc37335b8ccde3964a65172c0a7a
6
+ metadata.gz: ef26d5b1ee5e367ef7240ca961cdeb3bbaaf75b0af6c2c68f779b988302998cd2ee2b69c7a21ac48b22ea18f6ffb141cfa42afb033ca1dc7c0389cd97b395aa4
7
+ data.tar.gz: f0779bd48b8225c24411e243b4dcb7a8b17b359e51dc57dd894c57f9388e3dcdc3316edd9ee67fb48b223828246025dc083b2034e157cb02d550c4d2c338dde1
@@ -12,6 +12,6 @@ pipelines:
12
12
  - bundler --version
13
13
  - bundle install
14
14
  - gem install byebug
15
- - gem install rails -v 4.2.7.1
15
+ - gem install rails -v 5.1.2
16
16
  - gem install sqlite3
17
17
  - rake test
@@ -2528,5 +2528,17 @@
2528
2528
  "thousands_separator": ",",
2529
2529
  "iso_numeric": "967",
2530
2530
  "smallest_denomination": 5
2531
+ },
2532
+ "btc": {
2533
+ "priority": 100,
2534
+ "iso_code": "BTC",
2535
+ "name": "Bitcoin",
2536
+ "symbol": "฿",
2537
+ "subunit": "sat",
2538
+ "subunit_to_unit": 100000000,
2539
+ "symbol_first": false,
2540
+ "html_entity": "฿",
2541
+ "decimal_mark": ",",
2542
+ "thousands_separator": "."
2531
2543
  }
2532
2544
  }
data/doc/CHANGELOG CHANGED
@@ -4,6 +4,16 @@ Redmine crm gem - general functions for plugins (tags, vote, viewing, currency)
4
4
  Copyright (C) 2011-2017 RedmineUP
5
5
  https://www.redmineup.com/
6
6
 
7
+ == 2017-12-18 v0.0.33
8
+
9
+ * Rails 5 support (Redmine 4)
10
+ * rcrm_acts_as_list (Redmine 4)
11
+ * Bitcoin currency support
12
+
13
+ == 2017-07-18 v0.0.32
14
+
15
+ * charjs added
16
+
7
17
  == 2017-05-29 v0.0.31
8
18
 
9
19
  * select2 controls for contacts and people
data/lib/redmine_crm.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'redmine_crm/version'
2
2
 
3
+ require 'redmine_crm/acts_as_list/list'
3
4
  require 'redmine_crm/acts_as_taggable/tag'
4
5
  require 'redmine_crm/acts_as_taggable/tag_list'
5
6
  require 'redmine_crm/acts_as_taggable/tagging'
@@ -26,8 +27,9 @@ require 'redmine_crm/helpers/external_assets_helper'
26
27
  require 'redmine_crm/assets_manager'
27
28
 
28
29
  if defined?(ActiveRecord::Base)
29
- ActiveRecord::Base.extend(RedmineCrm::ActsAsVotable::Votable)
30
+ ActiveRecord::Base.include(RedmineCrm::ActsAsList::List)
30
31
  ActiveRecord::Base.extend(RedmineCrm::ActsAsVotable::Voter)
32
+ ActiveRecord::Base.extend(RedmineCrm::ActsAsVotable::Votable)
31
33
  end
32
34
 
33
35
  RedmineCrm::AssetsManager.install_assets
@@ -0,0 +1,282 @@
1
+ module RedmineCrm
2
+ module ActsAsList
3
+ module List
4
+ def self.included(base)
5
+ base.extend(ClassMethods)
6
+ end
7
+
8
+ # This +acts_as+ extension provides the capabilities for sorting and reordering a number of objects in a list.
9
+ # The class that has this specified needs to have a +position+ column defined as an integer on
10
+ # the mapped database table.
11
+ #
12
+ # Todo list example:
13
+ #
14
+ # class TodoList < ActiveRecord::Base
15
+ # has_many :todo_items, :order => "position"
16
+ # end
17
+ #
18
+ # class TodoItem < ActiveRecord::Base
19
+ # belongs_to :todo_list
20
+ # acts_as_list :scope => :todo_list
21
+ # end
22
+ #
23
+ # todo_list.first.move_to_bottom
24
+ # todo_list.last.move_higher
25
+ module ClassMethods
26
+ # Configuration options are:
27
+ #
28
+ # * +column+ - specifies the column name to use for keeping the position integer (default: +position+)
29
+ # * +scope+ - restricts what is to be considered a list. Given a symbol, it'll attach <tt>_id</tt>
30
+ # (if it hasn't already been added) and use that as the foreign key restriction. It's also possible
31
+ # to give it an entire string that is interpolated if you need a tighter scope than just a foreign key.
32
+ # Example: <tt>acts_as_list :scope => 'todo_list_id = #{todo_list_id} AND completed = 0'</tt>
33
+ def rcrm_acts_as_list(options = {})
34
+
35
+ configuration = { :column => "position", :scope => "1 = 1" }
36
+ configuration.update(options) if options.is_a?(Hash)
37
+
38
+ configuration[:scope] = "#{configuration[:scope]}_id".intern if configuration[:scope].is_a?(Symbol) && configuration[:scope].to_s !~ /_id$/
39
+
40
+ if configuration[:scope].is_a?(Symbol)
41
+ scope_condition_method = %(
42
+ def scope_condition
43
+ if #{configuration[:scope].to_s}.nil?
44
+ "#{configuration[:scope].to_s} IS NULL"
45
+ else
46
+ "#{configuration[:scope].to_s} = \#{#{configuration[:scope].to_s}}"
47
+ end
48
+ end
49
+ )
50
+ else
51
+ scope_condition_method = "def scope_condition() \"#{configuration[:scope]}\" end"
52
+ end
53
+
54
+ class_eval <<-EOV
55
+ include RedmineCrm::ActsAsList::List::InstanceMethods
56
+
57
+ def rcrm_acts_as_list_class
58
+ ::#{self.name}
59
+ end
60
+
61
+ def position_column
62
+ '#{configuration[:column]}'
63
+ end
64
+
65
+ #{scope_condition_method}
66
+
67
+ before_destroy :remove_from_list
68
+ before_create :add_to_list_bottom
69
+ EOV
70
+ end
71
+ end
72
+
73
+ # All the methods available to a record that has had <tt>acts_as_list</tt> specified. Each method works
74
+ # by assuming the object to be the item in the list, so <tt>chapter.move_lower</tt> would move that chapter
75
+ # lower in the list of all chapters. Likewise, <tt>chapter.first?</tt> would return +true+ if that chapter is
76
+ # the first in the list of all chapters.
77
+ module InstanceMethods
78
+ # Insert the item at the given position (defaults to the top position of 1).
79
+ def insert_at(position = 1)
80
+ insert_at_position(position)
81
+ end
82
+
83
+ # Swap positions with the next lower item, if one exists.
84
+ def move_lower
85
+ return unless lower_item
86
+
87
+ rcrm_acts_as_list_class.transaction do
88
+ lower_item.decrement_position
89
+ increment_position
90
+ end
91
+ end
92
+
93
+ # Swap positions with the next higher item, if one exists.
94
+ def move_higher
95
+ return unless higher_item
96
+
97
+ rcrm_acts_as_list_class.transaction do
98
+ higher_item.increment_position
99
+ decrement_position
100
+ end
101
+ end
102
+
103
+ # Move to the bottom of the list. If the item is already in the list, the items below it have their
104
+ # position adjusted accordingly.
105
+ def move_to_bottom
106
+ return unless in_list?
107
+ rcrm_acts_as_list_class.transaction do
108
+ decrement_positions_on_lower_items
109
+ assume_bottom_position
110
+ end
111
+ end
112
+
113
+ # Move to the top of the list. If the item is already in the list, the items above it have their
114
+ # position adjusted accordingly.
115
+ def move_to_top
116
+ return unless in_list?
117
+ rcrm_acts_as_list_class.transaction do
118
+ increment_positions_on_higher_items
119
+ assume_top_position
120
+ end
121
+ end
122
+
123
+ # Move to the given position
124
+ def move_to=(pos)
125
+ case pos.to_s
126
+ when 'highest'
127
+ move_to_top
128
+ when 'higher'
129
+ move_higher
130
+ when 'lower'
131
+ move_lower
132
+ when 'lowest'
133
+ move_to_bottom
134
+ end
135
+ reset_positions_in_list
136
+ end
137
+
138
+ def reset_positions_in_list
139
+ rcrm_acts_as_list_class.where(scope_condition).reorder("#{position_column} ASC, id ASC").each_with_index do |item, i|
140
+ unless item.send(position_column) == (i + 1)
141
+ rcrm_acts_as_list_class.where({:id => item.id}).
142
+ update_all({position_column => (i + 1)})
143
+ end
144
+ end
145
+ end
146
+
147
+ # Removes the item from the list.
148
+ def remove_from_list
149
+ if in_list?
150
+ decrement_positions_on_lower_items
151
+ update_attribute position_column, nil
152
+ end
153
+ end
154
+
155
+ # Increase the position of this item without adjusting the rest of the list.
156
+ def increment_position
157
+ return unless in_list?
158
+ update_attribute position_column, self.send(position_column).to_i + 1
159
+ end
160
+
161
+ # Decrease the position of this item without adjusting the rest of the list.
162
+ def decrement_position
163
+ return unless in_list?
164
+ update_attribute position_column, self.send(position_column).to_i - 1
165
+ end
166
+
167
+ # Return +true+ if this object is the first in the list.
168
+ def first?
169
+ return false unless in_list?
170
+ self.send(position_column) == 1
171
+ end
172
+
173
+ # Return +true+ if this object is the last in the list.
174
+ def last?
175
+ return false unless in_list?
176
+ self.send(position_column) == bottom_position_in_list
177
+ end
178
+
179
+ # Return the next higher item in the list.
180
+ def higher_item
181
+ return nil unless in_list?
182
+ rcrm_acts_as_list_class.where(
183
+ "#{scope_condition} AND #{position_column} = #{(send(position_column).to_i - 1).to_s}"
184
+ ).first
185
+ end
186
+
187
+ # Return the next lower item in the list.
188
+ def lower_item
189
+ return nil unless in_list?
190
+ rcrm_acts_as_list_class.where(
191
+ "#{scope_condition} AND #{position_column} = #{(send(position_column).to_i + 1).to_s}"
192
+ ).first
193
+ end
194
+
195
+ # Test if this record is in a list
196
+ def in_list?
197
+ !send(position_column).nil?
198
+ end
199
+
200
+ private
201
+
202
+ def add_to_list_top
203
+ increment_positions_on_all_items
204
+ end
205
+
206
+ def add_to_list_bottom
207
+ self[position_column] = bottom_position_in_list.to_i + 1
208
+ end
209
+
210
+ # Overwrite this method to define the scope of the list changes
211
+ def scope_condition() "1" end
212
+
213
+ # Returns the bottom position number in the list.
214
+ # bottom_position_in_list # => 2
215
+ def bottom_position_in_list(except = nil)
216
+ item = bottom_item(except)
217
+ item ? item.send(position_column) : 0
218
+ end
219
+
220
+ # Returns the bottom item
221
+ def bottom_item(except = nil)
222
+ conditions = scope_condition
223
+ conditions = "#{conditions} AND #{self.class.primary_key} != #{except.id}" if except
224
+ rcrm_acts_as_list_class.where(conditions).reorder("#{position_column} DESC").first
225
+ end
226
+
227
+ # Forces item to assume the bottom position in the list.
228
+ def assume_bottom_position
229
+ update_attribute(position_column, bottom_position_in_list(self).to_i + 1)
230
+ end
231
+
232
+ # Forces item to assume the top position in the list.
233
+ def assume_top_position
234
+ update_attribute(position_column, 1)
235
+ end
236
+
237
+ # This has the effect of moving all the higher items up one.
238
+ def decrement_positions_on_higher_items(position)
239
+ rcrm_acts_as_list_class.
240
+ where("#{scope_condition} AND #{position_column} <= #{position}").
241
+ update_all("#{position_column} = (#{position_column} - 1)")
242
+ end
243
+
244
+ # This has the effect of moving all the lower items up one.
245
+ def decrement_positions_on_lower_items
246
+ return unless in_list?
247
+ rcrm_acts_as_list_class.
248
+ where("#{scope_condition} AND #{position_column} > #{send(position_column).to_i}").
249
+ update_all("#{position_column} = (#{position_column} - 1)")
250
+ end
251
+
252
+ # This has the effect of moving all the higher items down one.
253
+ def increment_positions_on_higher_items
254
+ return unless in_list?
255
+ rcrm_acts_as_list_class.
256
+ where("#{scope_condition} AND #{position_column} < #{send(position_column).to_i}").
257
+ update_all("#{position_column} = (#{position_column} + 1)")
258
+ end
259
+
260
+ # This has the effect of moving all the lower items down one.
261
+ def increment_positions_on_lower_items(position)
262
+ rcrm_acts_as_list_class.
263
+ where("#{scope_condition} AND #{position_column} >= #{position}").
264
+ update_all("#{position_column} = (#{position_column} + 1)")
265
+ end
266
+
267
+ # Increments position (<tt>position_column</tt>) of all items in the list.
268
+ def increment_positions_on_all_items
269
+ rcrm_acts_as_list_class.
270
+ where("#{scope_condition}").
271
+ update_all("#{position_column} = (#{position_column} + 1)")
272
+ end
273
+
274
+ def insert_at_position(position)
275
+ remove_from_list
276
+ increment_positions_on_lower_items(position)
277
+ self.update_attribute(position_column, position)
278
+ end
279
+ end
280
+ end
281
+ end
282
+ end
@@ -24,7 +24,8 @@ module RedmineCrm
24
24
  include RedmineCrm::ActsAsTaggable::Taggable::InstanceMethods
25
25
  extend RedmineCrm::ActsAsTaggable::Taggable::SingletonMethods
26
26
 
27
- alias_method_chain :reload, :tag_list
27
+ alias_method :reload_without_tag_list, :reload
28
+ alias_method :reload, :reload_with_tag_list
28
29
 
29
30
  class_eval do
30
31
  def self.taggable?
@@ -230,8 +231,8 @@ module RedmineCrm
230
231
  # scope(:find)
231
232
 
232
233
  conditions = []
233
- conditions << send(:sanitize_conditions, options.delete(:conditions)) if options[:conditions]
234
- conditions << send(:sanitize_conditions, scope) if scope
234
+ conditions << send(:sanitize_sql, options.delete(:conditions)) if options[:conditions]
235
+ conditions << send(:sanitize_sql, scope) if scope
235
236
  conditions << "#{Tagging.table_name}.taggable_type = #{quote_string_value(base_class.name)}"
236
237
  conditions << type_condition unless descends_from_active_record?
237
238
  conditions.compact!
@@ -253,7 +254,7 @@ module RedmineCrm
253
254
 
254
255
  private
255
256
  def quote_string_value(object)
256
- sanitize(object)
257
+ connection.quote(object)
257
258
  end
258
259
 
259
260
  def tags_condition(tags, table_name = Tag.table_name)
@@ -144,7 +144,8 @@ module RedmineCrm
144
144
  target = self
145
145
  target.views = ((target.views || 0) + 1) unless options[:only_total]
146
146
  target.total_views = ((target.total_views || 0) + 1)
147
- target.save(:validate => false)
147
+ target.record_timestamps = false
148
+ target.save(:validate => false, :touch => false)
148
149
  # target.save_without_validation
149
150
  end
150
151
  end
@@ -235,7 +235,7 @@ module RedmineCrm
235
235
  updates[scope_cache_field :cached_weighted_average, vote_scope] = weighted_average(true, vote_scope)
236
236
  end
237
237
  end
238
-
238
+ self.record_timestamps = false
239
239
  if (::ActiveRecord::VERSION::MAJOR == 3) && (::ActiveRecord::VERSION::MINOR != 0)
240
240
  self.update_attributes(updates, :without_protection => true) if !updates.empty?
241
241
  else
@@ -1,3 +1,3 @@
1
1
  module RedmineCrm
2
- VERSION = "0.0.32"
2
+ VERSION = "0.0.33"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redmine_crm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.32
4
+ version: 0.0.33
5
5
  platform: ruby
6
6
  authors:
7
7
  - RedmineUP
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-18 00:00:00.000000000 Z
11
+ date: 2017-12-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: liquid
@@ -41,6 +41,7 @@ files:
41
41
  - doc/CHANGELOG
42
42
  - doc/LICENSE.txt
43
43
  - lib/redmine_crm.rb
44
+ - lib/redmine_crm/acts_as_list/list.rb
44
45
  - lib/redmine_crm/acts_as_taggable/rcrm_acts_as_taggable.rb
45
46
  - lib/redmine_crm/acts_as_taggable/tag.rb
46
47
  - lib/redmine_crm/acts_as_taggable/tag_list.rb