klastera 1.2.0 → 1.2.4

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
  SHA256:
3
- metadata.gz: ae9963c78d2880fca43b1fd6bef6be6c7ebcdd957289dd1117d81b815fdef707
4
- data.tar.gz: 3ae1a3a37239c56675aaa9b9c82cfd65f6262777746bf6e720465c62e66af069
3
+ metadata.gz: 5cc4bc5d29598040f68599863b41983f415778050bc988fb0c35b67e7d9e264b
4
+ data.tar.gz: d96dd17be603a6683084bc34c9c040c51e4cb9422af7a2956c97860f812299ae
5
5
  SHA512:
6
- metadata.gz: ed36fabfe91b44b8d8209a1484081021be21cb0309bfd8731cd1380aa6dcf210464f0e1e6cd5dbba218691cbae023223160ee287d6b698ce99756bc452e4c563
7
- data.tar.gz: 62ce187ce73ebf4bf07e045835a1f3c79a0c2a911c0f45c54d980938851afdf38dfe8f632641f0b6da40b5c62e82d03cf7d0286b321fed90c3873c267cce2574
6
+ metadata.gz: ad8633404c203750947c1566d4c1d883bd7c33c1eae58982bb0489d62e769255caad49d75277244ad4b50f79fd95ef361c37408078d5ff657a7da7324d3bf75a
7
+ data.tar.gz: a4c6e14fafdd2eaa1c7664901a1590800d89006a257412b04b483c313fcdc61a1797340028ffe0e9c0bd9a15d38c3783d823bba4d665cd194dd8790d2369e971
@@ -9,6 +9,7 @@ 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
15
  includes(:cluster_entities).where("cluster_entities.entity_id = #{self.table_name}.id")
@@ -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?
@@ -75,18 +103,21 @@ module Klastera
75
103
  scope_klass = scope_class(scope).where(organization_id: organization)
76
104
  session_clusters(user,organization) do |clusters|
77
105
  if organization.is_in_cluster_mode?
106
+ scope_klass = scope_klass.select("DISTINCT ON (#{scope.table_name}.id) #{scope.table_name}.id, #{scope.table_name}.*")
78
107
  scope_klass = scope_klass.includes(includes) if includes.present?
79
108
  cluster_ids = clusters.map(&:id)
80
109
  if organization.required_suborganization_mode?
81
110
  scope_klass = scope_klass.joins(:cluster_entities).where( cluster_entities: { cluster_id: cluster_ids } )
82
111
  else
112
+ or_these_cluster_ids = cluster_ids.present? ? " OR cluster_entities.cluster_id IN (#{cluster_ids.join(",")})" : ""
83
113
  scope_klass = scope_klass.joins("
84
114
  LEFT OUTER JOIN cluster_entities
85
- ON cluster_entities.cluster_id IN (#{cluster_ids.join(",")})
86
- AND entity_id = #{scope.table_name}.id
115
+ ON entity_id = #{scope.table_name}.id
87
116
  AND entity_type = '#{scope}'
88
- ")
117
+ ").where("cluster_entities.id IS NULL#{or_these_cluster_ids}")
89
118
  end
119
+ # Provisional fix to avoid SQL clashes due to DISTINCT ON clause
120
+ scope_klass = scope_class(scope).where(organization_id: organization).where(id: scope_klass.map(&:id))
90
121
  end
91
122
  end
92
123
  scope_klass
@@ -118,38 +149,42 @@ module Klastera
118
149
  end
119
150
  clusters
120
151
  end
121
- end
122
152
 
123
- included do
124
- if respond_to?(:helper_method)
125
- helper_method :cluster_scope
126
- helper_method :user_cluster
127
- helper_method :cluster_user
128
- helper_method :cluster_organization
129
- helper_method :cluster_clusters
130
- helper_method :cluster_scope_filtered
131
- helper_method :user_has_more_than_one_cluster
132
- 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)
133
165
  end
134
- if respond_to?(:hide_action)
135
- hide_action :cluster_scope
136
- hide_action :cluster_scope=
137
- hide_action :user_cluster
138
- hide_action :user_cluster=
139
- hide_action :cluster_user
140
- hide_action :cluster_user=
141
- hide_action :cluster_organization
142
- hide_action :cluster_organization=
143
- hide_action :cluster_clusters
144
- hide_action :cluster_clusters=
145
- hide_action :cluster_scope_filtered
146
- hide_action :cluster_scope_filtered=
147
- hide_action :user_has_more_than_one_cluster
148
- hide_action :user_has_more_than_one_cluster=
149
- hide_action :clusters_from
150
- 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))
151
174
  end
152
- 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
153
188
  end
154
189
 
155
190
  def set_the_lonely_cluster
@@ -161,16 +196,22 @@ module Klastera
161
196
  end
162
197
  end
163
198
 
164
- def cluster_scope(scope,includes=[])
165
- Klastera.cluster_scope!(cluster_user,cluster_organization,scope,includes)
199
+ def set_cluster_filter
200
+ @filter = ::ClusterFilter.new(cluster_filter_params)
166
201
  end
167
202
 
168
- def cluster_user
169
- 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)
170
207
  end
171
208
 
172
- def cluster_organization
173
- 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)
174
215
  end
175
216
 
176
217
  def cluster_clusters
@@ -187,26 +228,30 @@ module Klastera
187
228
  )
188
229
  end
189
230
 
190
- def user_has_more_than_one_cluster
191
- @cluster_clusters ||= cluster_clusters
192
- @cluster_clusters.size > 1
193
- end
194
-
195
231
  def clusters_from(scope,includes=[])
196
232
  Klastera.clusters_from!(cluster_user,cluster_organization,scope,includes)
197
233
  end
198
234
 
199
- def set_cluster_filter
200
- @filter = ::ClusterFilter.new(cluster_filter_params)
201
- end
202
-
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)
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
+ )
207
243
  end
208
244
 
209
- def cluster_filter_permit_params
210
- [ :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 ]
211
256
  end
212
257
  end
@@ -1,3 +1,3 @@
1
1
  module Klastera
2
- VERSION = "1.2.0"
3
- end
2
+ VERSION = "1.2.4"
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.0
4
+ version: 1.2.4
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-05-30 00:00:00.000000000 Z
11
+ date: 2020-06-06 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
@@ -1,4 +0,0 @@
1
- module Klastera
2
- module ClustersHelper
3
- end
4
- end