Module: Dor::Processable
- Extended by:
- ActiveSupport::Concern
- Includes:
- Upgradable, SolrDocHelper
- Included in:
- AdminPolicyObject, BasicItem, Collection, Set, Versionable
- Defined in:
- lib/dor/models/processable.rb
Constant Summary collapse
- STATUS_CODE_DISP_TXT =
verbiage we want to use to describe an item when it has completed a particular step
{ 0 => 'Unknown Status', #if there are no milestones for the current version, someone likely messed up the versioning process. 1 => 'Registered', 2 => 'In accessioning', 3 => 'In accessioning (described)', 4 => 'In accessioning (described, published)', 5 => 'In accessioning (described, published, deposited)', 6 => 'Accessioned', 7 => 'Accessioned (indexed)', 8 => 'Accessioned (indexed, ingested)', 9 => 'Opened' }
- STEPS =
milestones from accessioning and the order they happen in
{ 'registered' => 1, 'submitted' => 2, 'described' => 3, 'published' => 4, 'deposited' => 5, 'accessioned' => 6, 'indexed' => 7, 'shelved' => 8, 'opened' => 1 }
Instance Method Summary collapse
-
#build_datastream(datastream, force = false, is_required = false) ⇒ Object
Takes the name of a datastream, as a string (fooMetadata).
- #cleanup ⇒ Object
- #empty_datastream?(datastream) ⇒ Boolean
-
#find_metadata_file(datastream) ⇒ Object
Takes the name of a datastream, as a string.
-
#initialize_workflow(name, repo = 'dor', create_ds = true, priority = 0) ⇒ Object
Initilizes workflow for the object in the workflow service It will set the priorty of the new workflow to the current_priority if it is > 0 It will set lane_id from the item’s APO default workflow lane.
- #milestones ⇒ Object
- #set_workflows_datastream_location ⇒ Object
- #status(include_time = false) ⇒ Object
- #status_info ⇒ Object
- #to_solr(solr_doc = Hash.new, *args) ⇒ Object
Methods included from Upgradable
add_upgrade_callback, included, run_upgrade_callbacks, #upgrade!
Methods included from SolrDocHelper
Instance Method Details
#build_datastream(datastream, force = false, is_required = false) ⇒ Object
Takes the name of a datastream, as a string (fooMetadata). Builds that datastream using the content of a file if such a file exists and is newer than the object’s current datastream; otherwise, builds the datastream by calling build_fooMetadata_datastream.
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
# File 'lib/dor/models/processable.rb', line 75 def build_datastream(datastream, force = false, is_required = false) # See if the datastream exists as a file and if the file's # timestamp is newer than the datastream's timestamp. ds = datastreams[datastream] filename = (datastream) use_file = filename && (ds.createDate.nil? || File.mtime(filename) >= ds.createDate) # Build datastream. if use_file content = File.read(filename) ds.content = content ds.ng_xml = Nokogiri::XML(content) if ds.respond_to?(:ng_xml) ds.save unless ds.digital_object.new? elsif force or empty_datastream?(ds) meth = "build_#{datastream}_datastream".to_sym if respond_to?(meth) content = self.send(meth, ds) ds.save unless ds.digital_object.new? end end # Check for success. if is_required && empty_datastream?(ds) raise "Required datastream #{datastream} could not be populated!" end return ds end |
#cleanup ⇒ Object
101 102 103 |
# File 'lib/dor/models/processable.rb', line 101 def cleanup() CleanupService.cleanup(self) end |
#empty_datastream?(datastream) ⇒ Boolean
53 54 55 56 57 58 59 60 61 |
# File 'lib/dor/models/processable.rb', line 53 def empty_datastream?(datastream) if datastream.new? true elsif datastream.class.respond_to?(:xml_template) datastream.content.to_s.empty? or EquivalentXml.equivalent?(datastream.content, datastream.class.xml_template) else datastream.content.to_s.empty? end end |
#find_metadata_file(datastream) ⇒ Object
Takes the name of a datastream, as a string. Tries to find a file for the datastream. Returns the path to it or nil.
66 67 68 69 |
# File 'lib/dor/models/processable.rb', line 66 def (datastream) druid = DruidTools::Druid.new(pid, Dor::Config.stacks.local_workspace_root) return druid.("#{datastream}.xml") end |
#initialize_workflow(name, repo = 'dor', create_ds = true, priority = 0) ⇒ Object
Initilizes workflow for the object in the workflow service
It will set the priorty of the new workflow to the current_priority if it is > 0
It will set lane_id from the item's APO default workflow lane
214 215 216 217 218 219 220 |
# File 'lib/dor/models/processable.rb', line 214 def initialize_workflow(name, repo='dor', create_ds=true, priority=0) priority = workflows.current_priority if priority == 0 opts = { :create_ds => create_ds } opts[:priority] = priority if(priority > 0) opts[:lane_id] = default_workflow_lane Dor::WorkflowService.create_workflow(repo, self.pid, name, Dor::WorkflowObject.initial_workflow(name), opts) end |
#milestones ⇒ Object
105 106 107 |
# File 'lib/dor/models/processable.rb', line 105 def milestones Dor::WorkflowService.get_milestones('dor',self.pid) end |
#set_workflows_datastream_location ⇒ Object
41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/dor/models/processable.rb', line 41 def set_workflows_datastream_location # This is a work-around for some strange logic in ActiveFedora that # don't allow self.workflows.new? to work if we load the object using # .load_instance_from_solr. return if self.respond_to? :inner_object and self.inner_object.is_a? ActiveFedora::SolrDigitalObject if self.workflows.new? workflows.mimeType = 'application/xml' workflows.dsLocation = File.join(Dor::Config.workflow.url,"dor/objects/#{self.pid}/workflows") end end |
#status(include_time = false) ⇒ Object
142 143 144 145 146 147 148 149 150 |
# File 'lib/dor/models/processable.rb', line 142 def status(include_time=false) status_info_hash = status_info current_version, status_code, status_time = status_info_hash[:current_version], status_info_hash[:status_code], status_info_hash[:status_time] #use the translation table to get the appropriate verbage for the latest step result = "v#{current_version} #{STATUS_CODE_DISP_TXT[status_code]}" result += " #{format_date(status_time)}" if include_time return result end |
#status_info ⇒ Object
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
# File 'lib/dor/models/processable.rb', line 109 def status_info() current_version = '1' begin current_version = self.versionMetadata.current_version_id rescue end current_milestones = [] #only get steps that are part of accessioning and part of the current version. That can mean they were archived with the current version #number, or they might be active (no version number). milestones.each do |m| if STEPS.keys.include?(m[:milestone]) and (m[:version].nil? or m[:version] == current_version) current_milestones << m unless m[:milestone] == 'registered' and current_version.to_i > 1 end end status_code = 0 status_time = '' #for each milestone in the current version, see if it comes after the current 'last' step, if so, make it the last and record the date/time current_milestones.each do |m| name = m[:milestone] time = m[:at].utc.xmlschema if STEPS.keys.include? name if STEPS[name] > status_code status_code = STEPS[name] status_time = time end end end return {:current_version => current_version, :status_code => status_code, :status_time => status_time} end |
#to_solr(solr_doc = Hash.new, *args) ⇒ Object
152 153 154 155 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 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 |
# File 'lib/dor/models/processable.rb', line 152 def to_solr(solr_doc=Hash.new, *args) super(solr_doc, *args) sortable_milestones = {} current_version='1' begin current_version = self.versionMetadata.current_version_id rescue end current_version_num=current_version.to_i if self.respond_to?('versionMetadata') #add an entry with version id, tag and description for each version while current_version_num > 0 add_solr_value(solr_doc, 'versions', current_version_num.to_s + ';' + self.versionMetadata.tag_for_version(current_version_num.to_s) + ';' + self.versionMetadata.description_for_version(current_version_num.to_s), :string, [:displayable]) current_version_num -= 1 end end self.milestones.each do |milestone| = milestone[:at].utc.xmlschema sortable_milestones[milestone[:milestone]] ||= [] sortable_milestones[milestone[:milestone]] << add_solr_value(solr_doc, 'lifecycle', milestone[:milestone], :string, [:searchable, :facetable]) unless milestone[:version] milestone[:version]=current_version end add_solr_value(solr_doc, 'lifecycle', "#{milestone[:milestone]}:#{};#{milestone[:version]}", :string, [:displayable]) end sortable_milestones.each do |milestone, unordered_dates| dates = unordered_dates.sort #create the published_dt and published_day fields and the like add_solr_value(solr_doc, milestone+'_day', DateTime.parse(dates.last).beginning_of_day.utc.xmlschema.split('T').first, :string, [:stored_searchable, :facetable]) add_solr_value(solr_doc, milestone, dates.first, :date, [:stored_searchable, :facetable]) #fields for OAI havester to sort on add_solr_value(solr_doc, "#{milestone}_earliest_dt", dates.first, :date, [:sortable]) add_solr_value(solr_doc, "#{milestone}_latest_dt", dates.last, :date, [:sortable]) #for future faceting add_solr_value(solr_doc, "#{milestone}_earliest", dates.first, :date, [:searchable, :facetable]) add_solr_value(solr_doc, "#{milestone}_latest", dates.last, :date, [:searchable, :facetable]) end add_solr_value(solr_doc,"status",status,:string, [:displayable]) if sortable_milestones['opened'] #add a facetable field for the date when the open version was opened opened_date=sortable_milestones['opened'].sort.last add_solr_value(solr_doc, "version_opened", DateTime.parse(opened_date).beginning_of_day.utc.xmlschema.split('T').first, :string, [ :searchable, :facetable]) end add_solr_value(solr_doc, "current_version", current_version.to_s, :string, [ :displayable , :facetable]) add_solr_value(solr_doc, "last_modified_day", self.modified_date.to_s.split('T').first, :string, [ :facetable ]) add_solr_value(solr_doc, "rights", rights, :string, [:facetable]) if self.respond_to? :rights solr_doc end |