Class: Bulkrax::ObjectFactory
- Inherits:
-
ObjectFactoryInterface
- Object
- ObjectFactoryInterface
- Bulkrax::ObjectFactory
- Includes:
- FileFactory
- Defined in:
- app/factories/bulkrax/object_factory.rb
Overview
rubocop:disable Metrics/ClassLength
Instance Attribute Summary
Attributes inherited from ObjectFactoryInterface
#attributes, #importer_run_id, #klass, #object, #related_parents_parsed_mapping, #replace_files, #source_identifier_value, #update_files, #user, #work_identifier, #work_identifier_search_field
Class Method Interface collapse
- .add_child_to_parent_work(parent:, child:) ⇒ Object
- .add_resource_to_collection(collection:, resource:, user:) ⇒ Object
- .clean! ⇒ Object
- .export_properties ⇒ Object
-
.field_multi_value?(field:, model:, admin_set_id: nil) ⇒ Boolean
Unused admin set included to support flexible contexts in the Valkyrie version.
-
.field_supported?(field:, model:, admin_set_id: nil) ⇒ Boolean
rubocop:disable Lint/UnusedMethodArgument.
- .file_sets_for(resource:) ⇒ Object
-
.filename_for(fileset:) ⇒ String
#input [Fileset or FileMetadata].
- .find(id) ⇒ Object
- .find_or_create_default_admin_set ⇒ Object
-
.model_name(resource:) ⇒ String
The name of the model class for the given resource/object.
- .ordered_file_sets_for(object) ⇒ Object
-
.original_file(fileset:) ⇒ File
The original file.
- .publish ⇒ Object
-
.query(q, **kwargs) ⇒ Object
rubocop:enable Metrics/ParameterLists.
- .save!(resource:) ⇒ Object
-
.search_by_property(value:, klass:, field: nil, search_field: nil, name_field: nil, verify_property: false) ⇒ NilClass, ActiveFedora::Base
rubocop:disable Metrics/ParameterLists.
- .solr_name(field_name) ⇒ Object
-
.thumbnail_for(resource:) ⇒ File or FileMetadata
A thumbnail is linked to a work rather than the file set itself.
- .update_index(resources: []) ⇒ Object
- .update_index_for_file_sets_of(resource:) ⇒ Object
Instance Method Summary collapse
Methods inherited from ObjectFactoryInterface
add_user_to_collection_permissions, #add_user_to_collection_permissions, #base_permitted_attributes, #create, default_admin_set_id, default_admin_set_or_nil, #find, #find_or_create, find_or_nil, #initialize, #run, #run!, #search_by_identifier, #transformation_removes_blank_hash_values, #update
Methods included from Loggable
#log_created, #log_deleted_fs, #log_updated
Methods included from DynamicRecordLookup
Constructor Details
This class inherits a constructor from Bulkrax::ObjectFactoryInterface
Class Method Details
.add_child_to_parent_work(parent:, child:) ⇒ Object
This does not save either object. We need to do that in another loop. Why? Because we might be adding many items to the parent.
14 15 16 17 18 |
# File 'app/factories/bulkrax/object_factory.rb', line 14 def self.add_child_to_parent_work(parent:, child:) return true if parent.ordered_members.to_a.include?(child) parent.ordered_members << child end |
.add_resource_to_collection(collection:, resource:, user:) ⇒ Object
20 21 22 23 24 25 |
# File 'app/factories/bulkrax/object_factory.rb', line 20 def self.add_resource_to_collection(collection:, resource:, user:) collection.try(:reindex_extent=, Hyrax::Adapters::NestingIndexAdapter::LIMITED_REINDEX) if defined?(Hyrax::Adapters::NestingIndexAdapter) resource.member_of_collections << collection save!(resource: resource, user: user) end |
.clean! ⇒ Object
164 165 166 167 168 |
# File 'app/factories/bulkrax/object_factory.rb', line 164 def self.clean! super do ActiveFedora::Cleaner.clean! end end |
.export_properties ⇒ Object
67 68 69 70 71 |
# File 'app/factories/bulkrax/object_factory.rb', line 67 def self.export_properties # TODO: Consider how this may or may not work for Valkyrie properties = Bulkrax.curation_concerns.map { |work| work.properties.keys }.flatten.uniq.sort properties.reject { |prop| Bulkrax.reserved_properties.include?(prop) } end |
.field_multi_value?(field:, model:, admin_set_id: nil) ⇒ Boolean
Unused admin set included to support flexible contexts in the Valkyrie version
74 75 76 77 78 79 |
# File 'app/factories/bulkrax/object_factory.rb', line 74 def self.field_multi_value?(field:, model:, admin_set_id: nil) # rubocop:disable Lint/UnusedMethodArgument return false unless field_supported?(field: field, model: model) return false unless model.singleton_methods.include?(:properties) model&.properties&.[](field)&.[]("multiple") end |
.field_supported?(field:, model:, admin_set_id: nil) ⇒ Boolean
rubocop:disable Lint/UnusedMethodArgument
81 82 83 |
# File 'app/factories/bulkrax/object_factory.rb', line 81 def self.field_supported?(field:, model:, admin_set_id: nil) # rubocop:disable Lint/UnusedMethodArgument model.method_defined?(field) && model.properties[field].present? end |
.file_sets_for(resource:) ⇒ Object
85 86 87 88 89 90 |
# File 'app/factories/bulkrax/object_factory.rb', line 85 def self.file_sets_for(resource:) return [] if resource.blank? return [resource] if resource.is_a?(Bulkrax.file_model_class) resource.file_sets end |
.filename_for(fileset:) ⇒ String
#input [Fileset or FileMetadata]
58 59 60 61 62 63 |
# File 'app/factories/bulkrax/object_factory.rb', line 58 def self.filename_for(fileset:) file = original_file(fileset: fileset) file.file_name.first rescue NoMethodError nil end |
.find(id) ⇒ Object
95 96 97 98 99 |
# File 'app/factories/bulkrax/object_factory.rb', line 95 def self.find(id) ActiveFedora::Base.find(id) rescue ActiveFedora::ObjectNotFoundError => e raise ObjectFactoryInterface::ObjectNotFoundError, e. end |
.find_or_create_default_admin_set ⇒ Object
101 102 103 104 |
# File 'app/factories/bulkrax/object_factory.rb', line 101 def self.find_or_create_default_admin_set # NOTE: Hyrax 5+ removed this method AdminSet.find_or_create_default_admin_set_id end |
.model_name(resource:) ⇒ String
Returns the name of the model class for the given resource/object.
33 34 35 |
# File 'app/factories/bulkrax/object_factory.rb', line 33 def self.model_name(resource:) resource.has_model.first end |
.ordered_file_sets_for(object) ⇒ Object
178 179 180 |
# File 'app/factories/bulkrax/object_factory.rb', line 178 def self.ordered_file_sets_for(object) object&.ordered_members.to_a.select(&:file_set?) end |
.original_file(fileset:) ⇒ File
Returns the original file.
51 52 53 |
# File 'app/factories/bulkrax/object_factory.rb', line 51 def self.original_file(fileset:) fileset.try(:original_file) end |
.publish ⇒ Object
106 107 108 |
# File 'app/factories/bulkrax/object_factory.rb', line 106 def self.publish(**) return true end |
.query(q, **kwargs) ⇒ Object
rubocop:enable Metrics/ParameterLists
160 161 162 |
# File 'app/factories/bulkrax/object_factory.rb', line 160 def self.query(q, **kwargs) ActiveFedora::SolrService.query(q, **kwargs) end |
.save!(resource:) ⇒ Object
182 183 184 |
# File 'app/factories/bulkrax/object_factory.rb', line 182 def self.save!(resource:, **) resource.save! end |
.search_by_property(value:, klass:, field: nil, search_field: nil, name_field: nil, verify_property: false) ⇒ NilClass, ActiveFedora::Base
HEY WE’RE USING THIS FOR A WINGS CUSTOM QUERY. BE CAREFUL WITH REMOVING IT.
rubocop:disable Metrics/ParameterLists
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 |
# File 'app/factories/bulkrax/object_factory.rb', line 130 def self.search_by_property(value:, klass:, field: nil, search_field: nil, name_field: nil, verify_property: false) return nil unless klass.respond_to?(:where) # We're not going to try to match nil nor "". return if value.blank? return if verify_property && !klass.properties.keys.include?(search_field) search_field ||= field name_field ||= field raise "You must provide either (search_field AND name_field) OR field parameters" if search_field.nil? || name_field.nil? # NOTE: Query can return partial matches (something6 matches both # something6 and something68) so we need to weed out any that are not the # correct full match. But other items might be in the multivalued field, # so we have to go through them one at a time. # # A ssi field is string, so we're looking at exact matches. # A tesi field is text, so partial matches work. # # We need to wrap the result in an Array, else we might have a scalar that # will result again in partial matches. match = klass.where(search_field => value).detect do |m| # Don't use Array.wrap as we likely have an ActiveTriples::Relation # which defiantly claims to be an Array yet does not behave consistently # with an Array. Hopefully the name_field is not a Date or Time object, # Because that too will be a mess. Array(m.send(name_field)).include?(value) end return match if match end |
.solr_name(field_name) ⇒ Object
170 171 172 173 174 175 176 |
# File 'app/factories/bulkrax/object_factory.rb', line 170 def self.solr_name(field_name) if defined?(Hyrax) Hyrax.index_field_mapper.solr_name(field_name) else ActiveFedora.index_field_mapper.solr_name(field_name) end end |
.thumbnail_for(resource:) ⇒ File or FileMetadata
A thumbnail is linked to a work rather than the file set itself.
40 41 42 43 44 45 46 |
# File 'app/factories/bulkrax/object_factory.rb', line 40 def self.thumbnail_for(resource:) return nil unless resource.respond_to?(:thumbnail) return resource.thumbnail if resource.thumbnail.present? return nil unless resource.respond_to?(:parent) && resource.parent.present? return nil unless resource.parent.respond_to?(:thumbnail) resource.parent.thumbnail end |
.update_index(resources: []) ⇒ Object
186 187 188 |
# File 'app/factories/bulkrax/object_factory.rb', line 186 def self.update_index(resources: []) Array(resources).each(&:update_index) end |
.update_index_for_file_sets_of(resource:) ⇒ Object
27 28 29 |
# File 'app/factories/bulkrax/object_factory.rb', line 27 def self.update_index_for_file_sets_of(resource:) resource.file_sets.each(&:update_index) if resource.respond_to?(:file_sets) end |
Instance Method Details
#delete(_user) ⇒ Object
202 203 204 205 206 207 |
# File 'app/factories/bulkrax/object_factory.rb', line 202 def delete(_user) obj = find raise ObjectFactoryInterface::ObjectNotFoundError, "Object not found to delete" unless obj obj.delete(eradicate: true) end |
#find_by_id ⇒ Object
192 193 194 195 196 197 198 199 200 |
# File 'app/factories/bulkrax/object_factory.rb', line 192 def find_by_id return false if attributes[:id].blank? # Rails / Ruby upgrade, we moved from :exists? to :exist? However we want to continue (for a # bit) to support older versions. method_name = klass.respond_to?(:exist?) ? :exist? : :exists? klass.find(attributes[:id]) if klass.send(method_name, attributes[:id]) rescue Valkyrie::Persistence::ObjectNotFoundError false end |