klastera 1.2.1 → 1.2.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3d1ff69c5abf0d989e26c1bfa2be9da2f8c9f5e8100bd4670f1c70d05c91cb13
4
- data.tar.gz: 3bda3826a8d07270008bd4789ecc0eee72706984d9e3065f64bcc7475b844296
3
+ metadata.gz: 149afa24eba1225396134f74b791f7d1e960480af16f5785d7f1a76570eea5d3
4
+ data.tar.gz: e801acbf180a965cf9a922bfc0e7ad3006df21a780b7d9cbb279cad0c33a4f22
5
5
  SHA512:
6
- metadata.gz: 39e4ec148db926bd2881d1e88e45b4c6071eccbd9aee45964e5c8d547d83f7513e6b1fc9882dfd6c1b06fe2bd146f0153aa935f4869809e09c554736ca8288e3
7
- data.tar.gz: '09cbc4eb782c613ddfa68c4704dc6511ba77c49137539b2fc7d52c084e25a5ecfc28e52b38231081ddbea920468eac23aadca10449009196bd25a7d7c36e46d0'
6
+ metadata.gz: e43ab98889edd3d9ece42a1f496bfc614ee77ac4721344694adf1e084d05192bcc97a43e69be19247095d9b18c3131a5d86d123be9a69ef85544965af6bb419b
7
+ data.tar.gz: e994dfd1ae541212674faed964c526a38ee3ef14020af970893f54f04d054bf6b9abe36822cf5456ade0cb47a5570576c0cd790604b5d0e70ef71e41f12ae039
data/Rakefile CHANGED
@@ -14,7 +14,7 @@ RDoc::Task.new(:rdoc) do |rdoc|
14
14
  rdoc.rdoc_files.include('lib/**/*.rb')
15
15
  end
16
16
 
17
- #APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
17
+ APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
18
18
  load 'rails/tasks/engine.rake'
19
19
 
20
20
 
@@ -9,9 +9,10 @@ module Klastera::Concerns::Clusterizable
9
9
 
10
10
  validates :cluster_id, presence: true, if: proc { self.try(:cluster_id) && self.organization.required_suborganization_mode? }
11
11
  validate :at_least_one_cluster_entity, if: proc { self.organization.required_suborganization_mode? }
12
+ validate :uniqueness_of_cluster_entity_record
12
13
 
13
14
  scope :related_clusters, ->() {
14
- includes(:cluster_entities).where("cluster_entities.entity_id = #{self.table_name}.id")
15
+ joins(:cluster_entities).where("cluster_entities.entity_id = #{self.table_name}.id")
15
16
  }
16
17
 
17
18
  def at_least_one_cluster_entity
@@ -20,8 +21,15 @@ module Klastera::Concerns::Clusterizable
20
21
  end
21
22
  end
22
23
 
23
- def clusters_string_separated_by(separator)
24
- self.cluster_entities.map{|ce|ce.cluster.name}.join(separator)
24
+ ##
25
+ # This is a legacy method and we don't recommend using it.
26
+ # Implement directly Klastera.entity_clusters_string_list instead of this method.
27
+ # TODO: In order to deprecate it, you will need to perform some changes in the main app
28
+ ##
29
+ def clusters_string_separated_by(separator,attribute=:name)
30
+ Klastera.entity_clusters_string_list!(
31
+ self.cluster_entities, separator, attribute
32
+ )
25
33
  end
26
34
 
27
35
  def has_one_cluster_entity
@@ -29,6 +37,12 @@ module Klastera::Concerns::Clusterizable
29
37
  return errors.add(:cluster_entities, I18n.t('klastera.messages.has_one_cluster_entity'))
30
38
  end
31
39
  end
40
+
41
+ def uniqueness_of_cluster_entity_record
42
+ if cluster_entities.map(&:cluster_id).uniq.size != cluster_entities.size
43
+ return errors.add(:cluster_entities, I18n.t('klastera.messages.duplicated_cluster_entity') )
44
+ end
45
+ end
32
46
  end
33
47
 
34
48
  module ClassMethods
@@ -1,6 +1,6 @@
1
1
  <tr class="nested-fields">
2
2
  <td class="field">
3
- <%= f.select :cluster_id, cluster_clusters.map{|c|[c.name,c.id]}, { include_blank: true }, { class: 'form-control' } %>
3
+ <%= f.select :cluster_id, @cluster_clusters.map{|c|[c.name,c.id]}, { include_blank: true }, { class: 'form-control' } %>
4
4
  </td>
5
5
  <td class="action vertical-align-middle text-center" width="44">
6
6
  <%= link_to_remove_association f, class: 'btn btn-danger btn-xs text-danger' do %>
@@ -1,4 +1,5 @@
1
1
  <% if cluster_organization.is_in_cluster_mode? %>
2
+ <% @cluster_clusters = cluster_clusters %>
2
3
  <div class="col-xs-12">
3
4
  <% if hide_title||=false %>
4
5
  <div class="form-group file required <%=f.object.class.name.parameterize%>_cluster_entity<%=' has-error' if f.object.errors.has_key?(:cluster_entities)%>">
@@ -26,6 +27,7 @@
26
27
  <table id="cluster-entities" class="table table-striped">
27
28
  <tbody class="cluster-entity-rows">
28
29
  <%= f.fields_for :cluster_entities do |cluster_entity|%>
30
+ <% next unless @cluster_clusters.map(&:id).include?(cluster_entity.try(:object).try(:cluster_id)) %>
29
31
  <%= render 'layouts/klastera/cluster_entity_fields', f: cluster_entity %>
30
32
  <% end %>
31
33
  </body>
@@ -61,6 +61,7 @@ es:
61
61
  at_least_one_cluster_entity: Debe agregar al menos un cluster
62
62
  record_action_successfully: Registro %{a} exitosamente
63
63
  cant_delete_the_last_record_in_required_suborganization_mode: No se puede eliminar el único cluster de esta organización
64
+ duplicated_cluster_entity: Hay un cluster duplicado
64
65
  new_cluster_id:
65
66
  nil: Cluster no existe
66
67
  same: Cluster no puede ser el mismo
@@ -5,8 +5,36 @@ module Klastera
5
5
 
6
6
  extend ActiveSupport::Concern
7
7
 
8
+ KLSTR_HELPERS = %i[
9
+ cluster_user cluster_organization user_has_more_than_one_cluster
10
+ cluster_scope cluster_clusters cluster_scope_filtered clusters_from
11
+ user_clusters_string_list
12
+ ]
13
+
8
14
  class << self
9
15
 
16
+ def set_cluster_entities_attributes!(entity,array_cluster_ids)
17
+ cluster_entities_attributes = {}
18
+ entity_cluster_entities = entity.try(:cluster_entities) || []
19
+ entity_clusters = entity_cluster_entities.map(&:cluster_id).sort
20
+ array_cluster_ids = array_cluster_ids.map(&:id).sort
21
+ if array_cluster_ids != entity_clusters
22
+ now = DateTime.now
23
+ entity_cluster_entities.each_with_index do |ec,index|
24
+ remove_cluster = true
25
+ if array_cluster_ids.include?(ec.cluster_id)
26
+ remove_cluster = false
27
+ array_cluster_ids.delete(ec.cluster_id)
28
+ end
29
+ cluster_entities_attributes[index] = { id: ec.id, cluster_id: ec.cluster_id, _destroy: remove_cluster }
30
+ end
31
+ array_cluster_ids.each_with_index do |cluster_id,index|
32
+ cluster_entities_attributes[now.to_i+index] = { cluster_id: cluster_id, _destroy: false }
33
+ end
34
+ end
35
+ cluster_entities_attributes
36
+ end
37
+
10
38
  #
11
39
  # I like to wrap methods
12
40
  #
@@ -30,7 +58,7 @@ module Klastera
30
58
  # A force cluster organization won't return an entity out of a cluster, but
31
59
  # we don't know if the clusterized entities are fully definition-compliant.
32
60
  cluster_array << nil if cluster_organization.optional_suborganization_mode?
33
- active_record_collection = active_record_collection.where("cluster_entities.cluster_id": cluster_array)
61
+ active_record_collection = active_record_collection.joins(:cluster_entities).where("cluster_entities.cluster_id": cluster_array)
34
62
  end
35
63
  # you may use a block only with clusterizable data
36
64
  yield(active_record_collection) if block_given?
@@ -81,12 +109,12 @@ module Klastera
81
109
  if organization.required_suborganization_mode?
82
110
  scope_klass = scope_klass.joins(:cluster_entities).where( cluster_entities: { cluster_id: cluster_ids } )
83
111
  else
112
+ or_these_cluster_ids = cluster_ids.present? ? " OR cluster_entities.cluster_id IN (#{cluster_ids.join(",")})" : ""
84
113
  scope_klass = scope_klass.joins("
85
114
  LEFT OUTER JOIN cluster_entities
86
- ON cluster_entities.cluster_id IN (#{cluster_ids.join(",")})
87
- AND entity_id = #{scope.table_name}.id
115
+ ON entity_id = #{scope.table_name}.id
88
116
  AND entity_type = '#{scope}'
89
- ")
117
+ ").where("cluster_entities.id IS NULL#{or_these_cluster_ids}")
90
118
  end
91
119
  # Provisional fix to avoid SQL clashes due to DISTINCT ON clause
92
120
  scope_klass = scope_class(scope).where(organization_id: organization).where(id: scope_klass.map(&:id))
@@ -121,38 +149,42 @@ module Klastera
121
149
  end
122
150
  clusters
123
151
  end
124
- end
125
152
 
126
- included do
127
- if respond_to?(:helper_method)
128
- helper_method :cluster_scope
129
- helper_method :user_cluster
130
- helper_method :cluster_user
131
- helper_method :cluster_organization
132
- helper_method :cluster_clusters
133
- helper_method :cluster_scope_filtered
134
- helper_method :user_has_more_than_one_cluster
135
- helper_method :clusters_from
153
+ ##
154
+ # Return a string with cluster attribute separated by separator argument
155
+ # A array of cluster ids can be passed fo filter the result
156
+ #
157
+ def entity_clusters_string_list!(cluster_entities,separator,attribute=:name,allowed_cluster_ids=nil)
158
+ _cluster_entities = cluster_entities.reject(&:nil?)
159
+ if allowed_cluster_ids.is_a?(Array)
160
+ _cluster_entities.select!{|ce| allowed_cluster_ids.include?(ce.cluster_id)}
161
+ end
162
+ _cluster_entities.map do |ce|
163
+ ce.cluster.try(attribute)
164
+ end.compact.join(separator)
136
165
  end
137
- if respond_to?(:hide_action)
138
- hide_action :cluster_scope
139
- hide_action :cluster_scope=
140
- hide_action :user_cluster
141
- hide_action :user_cluster=
142
- hide_action :cluster_user
143
- hide_action :cluster_user=
144
- hide_action :cluster_organization
145
- hide_action :cluster_organization=
146
- hide_action :cluster_clusters
147
- hide_action :cluster_clusters=
148
- hide_action :cluster_scope_filtered
149
- hide_action :cluster_scope_filtered=
150
- hide_action :user_has_more_than_one_cluster
151
- hide_action :user_has_more_than_one_cluster=
152
- hide_action :clusters_from
153
- hide_action :clusters_from=
166
+
167
+ ##
168
+ # cluster_clusters needs the logged user and its organization
169
+ # that why, we perfomed this logic here
170
+ #
171
+ def user_clusters_string_list!(user,organization,cluster_entities,separator,attribute=:name)
172
+ @_session_clusters ||= self.session_clusters(user,organization)
173
+ self.entity_clusters_string_list!(cluster_entities, separator, attribute, @_session_clusters.map(&:id))
154
174
  end
155
- before_action :set_the_lonely_cluster, only: %i[ create update ]
175
+ end
176
+
177
+ def cluster_user
178
+ current_user
179
+ end
180
+
181
+ def cluster_organization
182
+ current_organization
183
+ end
184
+
185
+ def user_has_more_than_one_cluster
186
+ @cluster_clusters ||= cluster_clusters
187
+ @cluster_clusters.size > 1
156
188
  end
157
189
 
158
190
  def set_the_lonely_cluster
@@ -164,16 +196,22 @@ module Klastera
164
196
  end
165
197
  end
166
198
 
167
- def cluster_scope(scope,includes=[])
168
- Klastera.cluster_scope!(cluster_user,cluster_organization,scope,includes)
199
+ def set_cluster_filter
200
+ @filter = ::ClusterFilter.new(cluster_filter_params)
169
201
  end
170
202
 
171
- def cluster_user
172
- current_user
203
+ def cluster_filter_params
204
+ parameters = params.require(:cluster_filter) rescue nil
205
+ return {} if parameters.blank?
206
+ parameters.permit(*cluster_filter_permit_params)
173
207
  end
174
208
 
175
- def cluster_organization
176
- current_organization
209
+ def cluster_filter_permit_params
210
+ [ :cluster_id ].concat( ::ClusterFilter.attributes )
211
+ end
212
+
213
+ def cluster_scope(scope,includes=[])
214
+ Klastera.cluster_scope!(cluster_user,cluster_organization,scope,includes)
177
215
  end
178
216
 
179
217
  def cluster_clusters
@@ -190,26 +228,30 @@ module Klastera
190
228
  )
191
229
  end
192
230
 
193
- def user_has_more_than_one_cluster
194
- @cluster_clusters ||= cluster_clusters
195
- @cluster_clusters.size > 1
196
- end
197
-
198
231
  def clusters_from(scope,includes=[])
199
232
  Klastera.clusters_from!(cluster_user,cluster_organization,scope,includes)
200
233
  end
201
234
 
202
- def set_cluster_filter
203
- @filter = ::ClusterFilter.new(cluster_filter_params)
204
- end
205
-
206
- def cluster_filter_params
207
- parameters = params.require(:cluster_filter) rescue nil
208
- return {} if parameters.blank?
209
- parameters.permit(*cluster_filter_permit_params)
235
+ def user_clusters_string_list(object_entity,separator,attribute=:name)
236
+ Klastera.user_clusters_string_list!(
237
+ cluster_user,
238
+ cluster_organization,
239
+ object_entity.try(:cluster_entities),
240
+ separator,
241
+ attribute
242
+ )
210
243
  end
211
244
 
212
- def cluster_filter_permit_params
213
- [ :cluster_id ].concat( ::ClusterFilter.attributes )
245
+ included do
246
+ Klastera::KLSTR_HELPERS.each do |action|
247
+ if respond_to?(:helper_method)
248
+ helper_method(action)
249
+ end
250
+ if respond_to?(:hide_action)
251
+ hide_action(helper)
252
+ hide_action("#{helper}=")
253
+ end
254
+ end
255
+ before_action :set_the_lonely_cluster, only: %i[ create update ]
214
256
  end
215
257
  end
@@ -1,3 +1,3 @@
1
1
  module Klastera
2
- VERSION = "1.2.1"
2
+ VERSION = "1.2.4.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: klastera
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.2.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gino Barahona
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-01 00:00:00.000000000 Z
11
+ date: 2020-06-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -54,7 +54,6 @@ files:
54
54
  - app/controllers/klastera/application_controller.rb
55
55
  - app/controllers/klastera/clusters_controller.rb
56
56
  - app/helpers/klastera/application_helper.rb
57
- - app/helpers/klastera/clusters_helper.rb
58
57
  - app/models/klastera/cluster.rb
59
58
  - app/models/klastera/cluster_entity.rb
60
59
  - app/models/klastera/cluster_filter.rb
@@ -128,7 +127,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
128
127
  - !ruby/object:Gem::Version
129
128
  version: '0'
130
129
  requirements: []
131
- rubygems_version: 3.0.8
130
+ rubygems_version: 3.1.2
132
131
  signing_key:
133
132
  specification_version: 4
134
133
  summary: Clusterization Engine
@@ -1,4 +0,0 @@
1
- module Klastera
2
- module ClustersHelper
3
- end
4
- end