Guest User

Untitled

a guest
Dec 18th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.21 KB | None | 0 0
  1. class Container
  2. include Mongoid::Document
  3. include Mongoid::Timestamps
  4. # include Mongoid::Versioning
  5. include Mongoid::Userstamp
  6. # include VersionExtras
  7. # max_versions 5
  8.  
  9. ACCEPTED_MODELS = %w[
  10. Article Page Film LinkItem CollectionEntry
  11. ].map(&:freeze).freeze
  12.  
  13. field :name, type: String
  14. field :template_tag, type: String
  15. field :description, type: String
  16. field :url, type: String
  17. field :allowed_models, type: Array, default: ACCEPTED_MODELS
  18. field :hash_string, type: String, default: "{}"
  19.  
  20. index({ name: 1 })
  21. index({ template_tag: 1 })
  22.  
  23. belongs_to :category
  24. has_and_belongs_to_many :articles
  25. has_and_belongs_to_many :films
  26. has_and_belongs_to_many :pages
  27. has_and_belongs_to_many :link_items
  28. has_and_belongs_to_many :collection_entries
  29.  
  30. validate :validate_accepted_models
  31. validates :name, presence: true
  32.  
  33. before_save :build_associations
  34. before_validation -> { allowed_models.reject!(&:blank?) }
  35. after_save :clear_cache
  36.  
  37. # Build the associations from the hash_string
  38. def build_associations
  39. parsed_hash_string.flat_map {|i| i[:klass] }.uniq.each do |klass|
  40. ids_array = parsed_hash_string.find_all { |i| i[:klass] == klass}
  41. # Pull docs into array
  42. documents = klass.constantize.where(id: ids_array)
  43. # Clear then add the record's associations
  44. self.send(klass.tableize).substitute(documents)
  45. end
  46. end
  47.  
  48. # Used as callback from foreign association. Cleans up hashes.
  49. def self.remove_associations_from_hash(item)
  50. item.containers.each do |container|
  51. new_hash = container.parsed_hash_string
  52. new_hash.delete_if{|o| o[:id] == item.id.to_s}
  53. container.hash_string = new_hash
  54. container.save!
  55. end
  56. end
  57.  
  58. # Array of containing objects
  59. def contents
  60. parsed_hash_string.map { |i| i[:klass].constantize.find(i[:id]) }
  61. end
  62.  
  63. def get_items
  64. contents.reject do |item|
  65. (item.class == Article && item.is_scheduled? && !@user_is_admin)
  66. end
  67. end
  68.  
  69. # CACHES
  70.  
  71. # Clear attached caches
  72. def clear_cache
  73. puts "CLEARING #{template_tag}"
  74. Rails.cache.delete("containers/#{template_tag}")
  75. case template_tag
  76. when "homeCarouselHighlights", "moduleCallSheet"
  77. Rails.cache.delete("views/action/home")
  78. Rails.cache.delete("views/action/home/admin")
  79. when "catpopular"
  80. Rails.cache.delete("views/super_nav")
  81. when "festCarouselHighlights"
  82. Rails.cache.delete("views/page/fest_home")
  83. Rails.cache.delete("views/page/fest_home_admin")
  84. when "todayAtTribeca"
  85. Rails.cache.delete("views/module_last_call")
  86. when "audienceAwardNarrative", 'audienceAwardDocs'
  87. @page = Page.find_by(title: 'Audience Award');
  88. Rails.cache.delete("pages/#{@page.id}/#{@page.updated_at.to_i}") if @page
  89. end
  90. end
  91.  
  92. # clear any caches associated w/ this content
  93. def self.clear_content_caches(item)
  94. item.containers.each(&:clear_cache)
  95. end
  96.  
  97. # clear all caches
  98. def self.flush_all_caches
  99. Container.all.each(&:clear_cache)
  100. end
  101.  
  102. private
  103.  
  104. def validate_accepted_models
  105. return if allowed_models.all? { |m| ACCEPTED_MODELS.include?(m) }
  106. errors.add(:allowed_models, "contains invalid models")
  107. end
  108.  
  109. def parsed_hash_string
  110. JSON.parse(hash_string, symbolize_names: true)
  111. end
  112. end
Add Comment
Please, Sign In to add comment