Module: Shared::IsData
- Extended by:
- ActiveSupport::Concern
- Included in:
- AlternateValue, AssertedDistribution, Attribution, BiocurationClassification, BiologicalAssociation, BiologicalAssociationsBiologicalAssociationsGraph, BiologicalAssociationsGraph, BiologicalRelationship, BiologicalRelationshipType, CachedMap, CachedMapItem, CachedMapItemTranslation, CachedMapRegister, CharacterState, Citation, CitationTopic, CollectingEvent, CollectionObject, CollectionObjectObservation, CollectionProfile, CommonName, Confidence, Container, ContainerItem, Content, ControlledVocabularyTerm, DataAttribute, DatasetRecord, DatasetRecordField, Depiction, DerivedCollectionObject, Descriptor, Document, Documentation, Download, Extract, FieldOccurrence, GeneAttribute, GeographicArea, GeographicAreaType, GeographicAreasGeographicItem, GeographicItem, Georeference, Identifier, Image, ImportDataset, Label, Language, Lead, Loan, LoanItem, Namespace, Note, Observation, ObservationMatrix, ObservationMatrixColumn, ObservationMatrixColumnItem, ObservationMatrixRow, ObservationMatrixRowItem, Organization, OriginRelationship, Otu, OtuPageLayout, OtuPageLayoutSection, OtuRelationship, Person, PreparationType, ProjectMember, ProjectSource, Protocol, ProtocolRelationship, RangedLotCategory, Repository, Role, Sequence, SequenceRelationship, Serial, SerialChronology, SledImage, Source, SqedDepiction, Tag, TaggedSectionKeyword, TaxonDetermination, TaxonName, TaxonNameClassification, TaxonNameRelationship, TypeMaterial
- Defined in:
- app/models/concerns/shared/is_data.rb
Overview
Shared code for a classes that are “data” sensu TaxonWorks (things like Projects, users, and preferences are not data).
!! This module must in included last !!
Defined Under Namespace
Modules: Annotation, ClassMethods, HasRoles, Levenshtein, Metamorphosize, Navigation, Pinnable, Scopes, Stripper
Instance Method Summary
collapse
Instance Method Details
#errors_excepting(*keys) ⇒ Hash
237
238
239
240
241
242
243
|
# File 'app/models/concerns/shared/is_data.rb', line 237
def errors_excepting(*keys)
valid?
keys.each do |k|
errors.delete(k)
end
errors
end
|
#full_error_messages_excepting(*keys) ⇒ Array
273
274
275
|
# File 'app/models/concerns/shared/is_data.rb', line 273
def full_error_messages_excepting(*keys)
errors_excepting(*keys).full_messages
end
|
#identical ⇒ Scope
260
261
262
263
264
265
266
267
268
269
|
# File 'app/models/concerns/shared/is_data.rb', line 260
def identical
klass = self.class
attr = Stripper.strip_identical_attributes(klass, attributes)
if id
scope = klass.where(attr).not_self(self)
else
scope = klass.where(attr)
end
scope
end
|
223
224
225
|
# File 'app/models/concerns/shared/is_data.rb', line 223
def
self.class < Shared::SharedAcrossProjects ? true : false
end
|
#is_destroyable?(user) ⇒ Boolean
Returns whether it is permissible to try to destroy the record based on its relationships to projects the user is in. I.e. false if it is related to data in a project in which they user is not a member. !! Does not look at :dependendant assertions
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
|
# File 'app/models/concerns/shared/is_data.rb', line 156
def is_destroyable?(user)
u = user
u = User.find(user) if !user.kind_of?(User)
return true if u.is_administrator?
p = u.projects.pluck(:id)
self.class.reflect_on_all_associations(:has_many).each do |r|
if r.klass.column_names.include?('project_id')
return false if send(r.name).where.not(project_id: p).any? end
end
self.class.reflect_on_all_associations(:has_one).each do |r|
if if o = send(r.name)
return false if o.respond_to?(:project_id) && !p.include?(o.project_id)
end
end
end
true
end
|
#is_editable?(user) ⇒ Boolean
184
185
186
187
188
189
190
|
# File 'app/models/concerns/shared/is_data.rb', line 184
def is_editable?(user)
u = user
u = User.find(user) if !user.kind_of?(User)
return true if u.is_administrator? ||
return false if !is_in_users_projects?(u)
true
end
|
#is_in_use?(exclude = [], only = []) ⇒ Boolean
!! provide only exclude or only
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
|
# File 'app/models/concerns/shared/is_data.rb', line 202
def is_in_use?(exclude = [], only = [])
if only.empty?
self.class.reflect_on_all_associations(:has_many).each do |r|
next if exclude.include?(r.name)
return true if self.send(r.name).count(:all) > 0
end
self.class.reflect_on_all_associations(:has_one).each do |r|
next if exclude.include?(r.name)
return true if self.send(r.name).count(:all) > 0
end
else
only.each do |r|
return true if self.send(r.to_s).count(:all) > 0
end
end
false
end
|
#is_in_users_projects?(user) ⇒ Boolean
192
193
194
|
# File 'app/models/concerns/shared/is_data.rb', line 192
def is_in_users_projects?(user)
user.projects.pluck(:id).include?(project_id)
end
|
Returns the same object, but namespaced to the base class used many places, might be good target for optimization.
230
231
232
233
|
# File 'app/models/concerns/shared/is_data.rb', line 230
def metamorphosize
return self if self.class.descends_from_active_record?
self.becomes(self.class.base_class)
end
|
#similar ⇒ Scope
246
247
248
249
250
251
252
253
254
255
256
257
|
# File 'app/models/concerns/shared/is_data.rb', line 246
def similar
klass = self.class
attr = Stripper.strip_similar_attributes(klass, attributes)
attr = attr.select{ |_kee, val| val.present? }
if id
scope = klass.where(attr).not_self(self)
else
scope = klass.where(attr)
end
scope
end
|