Class: Lcms::Engine::Resource
- Inherits:
 - 
      ApplicationRecord
      
        
- Object
 - ActiveRecord::Base
 - ApplicationRecord
 - Lcms::Engine::Resource
 
 
- Includes:
 - Navigable, Searchable
 
- Defined in:
 - app/models/lcms/engine/resource.rb
 
Constant Summary collapse
- MEDIA_TYPES =
 %i(video podcast).map { |t| resource_types[t] }.freeze
- GENERIC_TYPES =
 %i(text_set quick_reference_guide resource_other).map { |t| resource_types[t] }.freeze
- SUBJECTS =
 %w(ela math lead).freeze
- HIERARCHY =
 %i(subject grade module unit lesson).freeze
Class Method Summary collapse
- .find_by_directory(*dir) ⇒ Object
 - .find_podcast_by_url(url) ⇒ Object
 - .find_video_by_url(url) ⇒ Object
 - .hierarchy ⇒ Object
 - .metadata_from_dir(dir) ⇒ Object
 - 
  
    
      .ransackable_scopes(_auth_object = nil)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
used for ransack search on the admin.
 - 
  
    
      .tree(name = nil)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
return resources tree by a curriculum name if no argument is provided, then it’s any curriculum tree.
 - .where_metadata_in(key, arr) ⇒ Object
 
Instance Method Summary collapse
- #assessment? ⇒ Boolean
 - #copyrights ⇒ Object
 - #directory ⇒ Object
 - #do_not_skip_indexing? ⇒ Object
 - #document ⇒ Object
 - #document? ⇒ Boolean
 - #download_categories ⇒ Object
 - #filtered_named_tags ⇒ Object
 - #generic? ⇒ Boolean
 - #grades ⇒ Object
 - #grades=(gds) ⇒ Object
 - #lesson_number ⇒ Object
 - #media? ⇒ Boolean
 - #named_tags ⇒ Object
 - #next_hierarchy_level ⇒ Object
 - 
  
    
      #opr?  ⇒ Boolean 
    
    
  
  
  
  
  
  
  
  
  
    
‘Optional prerequisite` - github.com/learningtapestry/unbounded/issues/557.
 - #pdf_downloads?(category = nil) ⇒ Boolean
 - #prerequisite? ⇒ Boolean
 - #related_resources ⇒ Object
 - #self_and_ancestors_not_persisted ⇒ Object
 - #should_index? ⇒ Boolean
 - #subject ⇒ Object
 - #tag_standards ⇒ Object
 - #tree? ⇒ Boolean
 - #unit_bundles? ⇒ Boolean
 - #update_metadata ⇒ Object
 - #update_position ⇒ Object
 
Class Method Details
.find_by_directory(*dir) ⇒ Object
      94 95 96 97 98 99 100 101  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 94 def find_by_directory(*dir) dir = dir&.flatten&.select(&:present?) return unless dir.present? type = hierarchy[dir.size - 1] = (dir).to_json where('metadata @> ?', ).where(curriculum_type: type).first end  | 
  
.find_podcast_by_url(url) ⇒ Object
      103 104 105  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 103 def find_podcast_by_url(url) podcast.where(url: url).first end  | 
  
.find_video_by_url(url) ⇒ Object
      107 108 109 110  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 107 def find_video_by_url(url) video_id = MediaEmbed.video_id(url) video.where("url ~ '#{video_id}(&|$)'").first end  | 
  
.hierarchy ⇒ Object
      112 113 114  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 112 def hierarchy Lcms::Engine::Resource::HIERARCHY end  | 
  
.metadata_from_dir(dir) ⇒ Object
      89 90 91 92  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 89 def (dir) pairs = hierarchy[0...dir.size].zip(dir) pairs.to_h.compact.stringify_keys end  | 
  
.ransackable_scopes(_auth_object = nil) ⇒ Object
used for ransack search on the admin
      117 118 119  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 117 def ransackable_scopes(_auth_object = nil) %i(grades) end  | 
  
.tree(name = nil) ⇒ Object
return resources tree by a curriculum name if no argument is provided, then it’s any curriculum tree.
      123 124 125 126 127 128 129 130 131  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 123 def tree(name = nil) if name.present? joins(:curriculum).where('curriculums.name = ? OR curriculums.slug = ?', name, name) elsif (default = Lcms::Engine::Curriculum.default) where(curriculum_id: default.id) else where(nil) end end  | 
  
.where_metadata_in(key, arr) ⇒ Object
      133 134 135 136 137  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 133 def (key, arr) arr = Array.wrap(arr).compact.map(&:downcase) clauses = Array.new(arr.count) { "lower(resources.metadata->>'#{key}') = ?" }.join(' OR ') where(clauses, *arr) end  | 
  
Instance Method Details
#assessment? ⇒ Boolean
      156 157 158  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 156 def assessment? ['assessment'].present? end  | 
  
#copyrights ⇒ Object
      253 254 255  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 253 def copyrights copyright_attributions end  | 
  
#directory ⇒ Object
      177 178 179 180 181  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 177 def directory @directory ||= Lcms::Engine::Resource.hierarchy.map do |key| key == :grade ? grades.average(abbr: false) : [key.to_s] end.compact end  | 
  
#do_not_skip_indexing? ⇒ Object
      225  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 225 alias do_not_skip_indexing? should_index?  | 
  
#document ⇒ Object
      257 258 259  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 257 def document documents.actives.order(updated_at: :desc).first end  | 
  
#document? ⇒ Boolean
      261 262 263  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 261 def document? document.present? end  | 
  
#download_categories ⇒ Object
      206 207 208 209 210 211 212  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 206 def download_categories @download_categories ||= resource_downloads.includes(:download_category).includes(:download) .sort_by { |rd| rd.download_category&.position.to_i } .group_by { |d| d.download_category&.title.to_s } .transform_values { |v| v.sort_by { |d| [d.download.main ? 0 : 1, d.download.title] } } end  | 
  
#filtered_named_tags ⇒ Object
      243 244 245 246 247  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 243 def = stds = [:ccss_standards].map { |n| Standard.filter_ccss_standards(n, subject) }.compact .merge(ccss_standards: stds) end  | 
  
#generic? ⇒ Boolean
      164 165 166  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 164 def generic? %w(text_set quick_reference_guide resource_other).include?(resource_type) end  | 
  
#grades ⇒ Object
      187 188 189  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 187 def grades Grades.new(self) end  | 
  
#grades=(gds) ⇒ Object
      191 192 193  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 191 def grades=(gds) .merge! 'grade' => gds end  | 
  
#lesson_number ⇒ Object
      195 196 197  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 195 def lesson_number @lesson_number ||= short_title.match(/(\d+)/)&.[](1).to_i end  | 
  
#media? ⇒ Boolean
      160 161 162  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 160 def media? %w(video podcast).include? resource_type end  | 
  
#named_tags ⇒ Object
      230 231 232 233 234 235 236 237 238 239 240 241  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 230 def { keywords: (tag_list + topic_list).compact.uniq, resource_type: resource_type, ell_appropriate: ell_appropriate, ccss_standards: tag_standards, ccss_domain: nil, # resource.standards.map { |std| std.domain.try(:name) }.uniq ccss_cluster: nil, # resource.standards.map { |std| std.cluster.try(:name) }.uniq authors: reading_assignment_texts.map { |t| t..try(:name) }.compact.uniq, texts: reading_assignment_texts.map(&:name).uniq } end  | 
  
#next_hierarchy_level ⇒ Object
      265 266 267 268  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 265 def next_hierarchy_level index = Lcms::Engine::Resource.hierarchy.index(curriculum_type.to_sym) Lcms::Engine::Resource.hierarchy[index + 1] end  | 
  
#opr? ⇒ Boolean
‘Optional prerequisite` - github.com/learningtapestry/unbounded/issues/557
      169 170 171  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 169 def opr? tag_list.include?('opr') end  | 
  
#pdf_downloads?(category = nil) ⇒ Boolean
      214 215 216 217 218 219 220 221 222 223  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 214 def pdf_downloads?(category = nil) if category.present? resource_downloads.joins(:download) .where(download_category: category) .where(downloads: { content_type: 'application/pdf' }) .exists? else downloads.where(content_type: 'application/pdf').exists? end end  | 
  
#prerequisite? ⇒ Boolean
      173 174 175  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 173 def prerequisite? tag_list.include?('prereq') end  | 
  
#related_resources ⇒ Object
      199 200 201 202 203 204  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 199 def @related_resources ||= .includes(:related_resource) .order(:position) .map(&:related_resource) end  | 
  
#self_and_ancestors_not_persisted ⇒ Object
      274 275 276 277 278 279  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 274 def self_and_ancestors_not_persisted # during create we can't call self_and_ancestors directly on the resource # because this query uses the associations on resources_hierarchies # which are only created after the resource is persisted [self] + parent&.self_and_ancestors.to_a end  | 
  
#should_index? ⇒ Boolean
      226 227 228  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 226 def should_index? do_not_skip_indexing? && (tree? || media? || generic?) end  | 
  
#subject ⇒ Object
      183 184 185  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 183 def subject ['subject'] end  | 
  
#tag_standards ⇒ Object
      249 250 251  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 249 def tag_standards standards.map(&:alt_names).flatten.uniq end  | 
  
#tree? ⇒ Boolean
      152 153 154  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 152 def tree? curriculum_id.present? end  | 
  
#unit_bundles? ⇒ Boolean
      270 271 272  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 270 def unit_bundles? unit? && document_bundles.any? end  | 
  
#update_metadata ⇒ Object
      281 282 283 284 285 286 287  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 281 def = self_and_ancestors_not_persisted .each_with_object({}) do |r, obj| obj[r.curriculum_type] = r.short_title end.compact .merge! if .present? end  | 
  
#update_position ⇒ Object
      289 290 291  | 
    
      # File 'app/models/lcms/engine/resource.rb', line 289 def update_position self.hierarchical_position = HierarchicalPosition.new(self).position end  |