Class Document
In: app/models/document.rb
Parent: ActiveRecord::Base

Esta es la super clase para Noticias, Eventos y Páginas de la web. Dicho de otra forma News, Event y Page son subclases de Document y comparten la tabla documents

Methods

Included Modules

Sluggable FerretMethods DocumentPaths

Attributes

delete_cover_photo  [R] 

Public Instance methods

For the documents that belong to a department, a before_save :assign_department_tag is called Ex. news.rb and event.rb

[Source]

     # File app/models/document.rb, line 238
238:   def assign_department_tag
239:     # self.tag_list = self.tag_list - Department.find(:all).map {|dept| dept.tag_name}
240:     self.tag_list.add(self.department.tag_name) if self.department
241:   end

Devuelve la lista de audios para este documento, en el subsite especificado (irekia o agencia) Ejemplo:

audios("agencia")[:es]:audios para agencia en castellano

[Source]

     # File app/models/document.rb, line 154
154:   def audios(subsite)
155:     audios = {:es => [], :eu => [], :en => []}
156:              
157:     return audios if self.multimedia_path.blank?
158: 
159:     # Lista de todos los audios en <dir>/*.flv y <dir>/solo_subsite/*.mp3
160:     list_of_audios = Dir.glob(full_multimedia_path + "*.mp3") + Dir.glob(full_multimedia_path + "solo_#{subsite}/*.mp3")
161:     list_of_audios = list_of_audios.collect {|a| a.sub(Document::MULTIMEDIA_PATH, '')}
162:     
163:     Document::LANGUAGES.each do |l|
164:       # Meto en cada idioma solo los que acaban en "_<idioma>.mp3"
165:       audios[l.to_sym] = list_of_audios.select {|a| a.match("_#{l}.mp3")}
166:       list_of_audios = list_of_audios - audios[l.to_sym]
167:     end
168: 
169:     Document::LANGUAGES.each do |l|
170:       audios[l.to_sym] = audios[l.to_sym] + list_of_audios
171:     end
172:     
173:     return audios
174:   end
 Devuleve true si el user puede ver el contenido y false si no puede.
 Se usara en los resultados de las búsquedas.

 Todos los usuarios pueden ver los eventos publicados de Irekia

 Los usuarios con acceso a Agencia, pueden ver además, los eventos y las noticias publicadas de la Agencia.
 Los demás usuarios pueden ver los tipos a los que se da acceso el método can_acces? de su tipo
 o el método can?('access', doc_type) que coge los permisos de la tabla con permisos por usuario.

[Source]

     # File app/models/document.rb, line 285
285:   def can_be_read_by?(user)
286:     # si el documento es de irekia y está publicado lo ven todos
287:     pubilic_published = self.show_in_irekia? && self.published?
288:     
289:     if pubilic_published
290:       res = true
291:     else
292:       res = false
293:       if !(user.nil? || user.eql?(:false))
294:         # usuario logeado
295:         if user.has_ma_access?
296:           # usuarios con acceso a la agencia: periodistas, colaboradores y operadores de streaming
297:           res = (self.show_in_irekia? || self.show_in_agencia?) && self.published?
298:         else
299:           # otros usuarios registrados
300:           res = user.can_access?(self.type.to_s.pluralize.downcase) || user.can?('access', self.type.to_s.pluralize.downcase)
301:         end
302:       end
303:     end
304:             
305:     res
306:   end

Accessor para borrar la foto de portada

[Source]

     # File app/models/document.rb, line 147
147:   def delete_cover_photo=(value)
148:     self.cover_photo = nil if value.to_i == 1
149:   end

Departamento al que pertenece un documento. Solo para noticias y eventos

[Source]

     # File app/models/document.rb, line 228
228:   def department
229:     dept = nil
230:     if self.organization
231:       dept = self.organization.root
232:     end
233:     dept
234:   end

Directorio donde se guardan los adjuntos borrados de este documento

[Source]

     # File app/models/document.rb, line 274
274:   def dir_for_deleted
275:     dummy, year, month_day_dir = self.multimedia_path.match(/^([^\/]+)\/(.+)$/).to_a
276:     dir_for_deleted = Document::MULTIMEDIA_PATH + year + "/borradas/" + month_day_dir
277:   end

[Source]

     # File app/models/document.rb, line 222
222:   def disable_ratings
223:     self.has_ratings = false
224:     return true
225:   end

Devuelve el video destacado para este documento, en el subsite especificado (irekia o agencia) y en el idioma actual

[Source]

     # File app/models/document.rb, line 113
113:   def featured_video(subsite)
114:     videos(subsite)[:featured][I18n.locale.to_sym]
115:   end

Construye la ruta absoluta al directorio de contenidos multimedia de un documento

[Source]

    # File app/models/document.rb, line 47
47:   def full_multimedia_path
48:     "#{Document::MULTIMEDIA_PATH}#{multimedia_path}"
49:   end

Indica si hay audios para este documento en el idioma actual, en el subsite especificado (irekia o agencia)

[Source]

     # File app/models/document.rb, line 177
177:   def has_audios?(subsite)
178:     audios(subsite)[I18n.locale.to_sym].length > 0
179:   end

Indica si hay foto de portada. Sólo se usa en caso de que no haya video de portada

[Source]

     # File app/models/document.rb, line 141
141:   def has_cover_photo?
142:     self.cover_photo_file_name.present?
143:   end

Indica si este documento tiene documentos adjuntos

[Source]

     # File app/models/document.rb, line 201
201:   def has_files?
202:     a_documents.count > 0
203:   end

Indica si hay fotos para este documento en el idioma actual, en el subsite especificado (irekia o agencia)

[Source]

     # File app/models/document.rb, line 182
182:   def has_photos?(subsite)
183:     photos(subsite).length > 0
184:   end

Deprecated: Indicaba si este documento tiene transcripciones.

[Source]

     # File app/models/document.rb, line 206
206:   def has_transcriptions?
207:     a_transcriptions.count > 0
208:   end

Indica si hay video destacado para este documento, en el subsite especificado (irekia o agencia) y en el idioma actual

[Source]

     # File app/models/document.rb, line 108
108:   def has_video?(subsite)
109:     !featured_video(subsite).nil?
110:   end

Indica si hay videos secundarios para este documento, en el subsite especificado (irekia o agencia) y en el idioma actual

[Source]

     # File app/models/document.rb, line 103
103:   def has_videos?(subsite)
104:     videos(subsite)[:list][I18n.locale.to_sym].length > 0
105:   end

Icono del departamento al que pertenece la noticia/evento

[Source]

     # File app/models/document.rb, line 244
244:   def icon
245:     ic = nil
246:     if self.organization && self.organization.icon
247:       ic = self.organization.icon
248:     end    
249:     ic
250:   end

Mueve a la "papelera" los ficheros multimedia cuando se borra una noticia/pagina Se llama desde after_destroy

[Source]

     # File app/models/document.rb, line 254
254:   def move_multimedia_files_to_trash
255:     if self.multimedia_path
256: 
257:       FileUtils.mkdir_p(dir_for_deleted)
258:       FileUtils.mv(Dir.glob("#{Document::MULTIMEDIA_PATH}#{self.multimedia_path}*.*"), dir_for_deleted)
259:       
260:       FileUtils.mkdir_p(dir_for_deleted + "solo_irekia")
261:       FileUtils.mv(Dir.glob("#{Document::MULTIMEDIA_PATH}#{self.multimedia_path}solo_irekia/*.*"), dir_for_deleted + "solo_irekia/")
262:       
263:       FileUtils.mkdir_p(dir_for_deleted + "solo_agencia")
264:       FileUtils.mv(Dir.glob("#{Document::MULTIMEDIA_PATH}#{self.multimedia_path}solo_agencia/*.*"), dir_for_deleted + "solo_agencia/")
265:   
266:       logger.info "Moviendo #{Document::MULTIMEDIA_PATH}#{self.multimedia_path}*.* a #{dir_for_deleted}"
267:   
268:       FileUtils.rm_rf("#{Document::MULTIMEDIA_PATH}#{self.multimedia_path}")
269:     end
270:     return true
271:   end

Devuelve la lista de fotos disponibles para en el subsite especificado (irekia o agencia). Devuelve sólo la lista de fotos originales. Los tamaños adicionales se guardan con el mismo nombre en subdirectorios con nombres "small", "medium", "large". Ejemplos:

photos("irekia"):lista de fotos pequeñas para irekia
photos("agencia"):lista de fotos grandes para agencia

[Source]

     # File app/models/document.rb, line 192
192:   def photos(subsite)
193:     return [] if self.multimedia_path.blank?
194: 
195:     photos = Dir.glob(full_multimedia_path + "*.jpg") + Dir.glob(full_multimedia_path + "solo_#{subsite}/*.jpg")
196:     photos = photos - video_previews_in_all_languages(subsite) if has_video?(subsite)
197:     return photos
198:   end

Quita del cuerpo del documento el separador de la entradilla ###

[Source]

     # File app/models/document.rb, line 217
217:   def pretty_body
218:      body ? body.sub(/<p.*>###<.*\/p>/, '') : ""
219:   end

Determina si un documento está publicado

[Source]

    # File app/models/document.rb, line 36
36:   def published?
37:     !draft && published_at <= Time.now
38:   end

Indica si un documento está traducido a lang_code Los idiomas disponibles son Document::LANGUAGES

[Source]

     # File app/models/document.rb, line 212
212:   def translated_to?(lang_code)
213:     self.send("title_#{lang_code}").present? && self.send("body_#{lang_code}").present?
214:   end

Devuelve el path absoluto y la url de la imagen de preview del video destacado de este documento, en el subsite especificado (irekia o agencia) y en el idioma actual

[Source]

     # File app/models/document.rb, line 119
119:   def video_preview_file_and_url(subsite)
120:     video_preview_filename = self.videos(subsite)[:featured][I18n.locale.to_sym].sub('.flv', '.jpg')
121:     video_preview_file = "#{Document::MULTIMEDIA_PATH}#{video_preview_filename}"
122:     video_preview_url = "#{Document::MULTIMEDIA_URL}#{video_preview_filename}"
123:     unless File.exists?(video_preview_file)
124:       # Si no esta la imagen nombre_es.jpg, buscamos nombre.jpg
125:       preview_without_locale = video_preview_filename.sub(/_#{I18n.locale.to_sym}.jpg/, '.jpg')
126:       if File.exists?("#{Document::MULTIMEDIA_PATH}#{preview_without_locale}")
127:         video_preview_file = "#{Document::MULTIMEDIA_PATH}#{preview_without_locale}"
128:         video_preview_url = "#{Document::MULTIMEDIA_URL}#{preview_without_locale}"
129:       end
130:     end
131:     return {:file => video_preview_file, :url => video_preview_url}
132:   end

Devuelve la imagen de preview del video destacado de este documento, en el subsite especificado (irekia o agencia) y en el idioma actual, o en su ausencia, la imagen por defecto

[Source]

     # File app/models/document.rb, line 136
136:   def video_preview_img(subsite)
137:     preview_img = File.exists?(video_preview_file_and_url(subsite)[:file]) ? video_preview_file_and_url(subsite)[:url] : "/images/video_preview.jpg"    
138:   end

Devuelve todos los videos disponibles para este documento, en el subsite especificado (irekia o agencia), separados por idiomas: Ejemplos de uso:

videos("irekia")[:featured][:es]:video destacado en irekia para la versión en castellano
videos("agencia")[:list][:es]:videos secundarios en la agencia para la versión en castellano

[Source]

     # File app/models/document.rb, line 55
 55:   def videos(subsite="irekia")
 56:     videos = {:list => {:es => [], :eu => [], :en => []}, :featured => {:es => nil, :eu => nil, :en => nil}}
 57: 
 58:     return videos if self.multimedia_path.blank?
 59:     
 60:     # Lista de todos los videos en <dir>/*.flv y <dir>/solo_subsite/*.flv
 61:     list_of_videos = Dir.glob(full_multimedia_path + "*.flv") + Dir.glob(full_multimedia_path + "solo_#{subsite}/*.flv") + \
 62:                      Dir.glob(full_multimedia_path + "*.mpg") + Dir.glob(full_multimedia_path + "solo_#{subsite}/*.mpg") + \
 63:                      Dir.glob(full_multimedia_path + "*.mpeg") + Dir.glob(full_multimedia_path + "solo_#{subsite}/*.mpeg") 
 64:     list_of_videos = list_of_videos.collect {|a| a.sub(Document::MULTIMEDIA_PATH, '')}
 65:     Document::LANGUAGES.each do |l|
 66:       # Meto en cada idioma solo los que acaban en "_<idioma>.flv"
 67:       list_of_videos.each do |video|
 68:         if m = video.match(/(.+)_#{l}.(flv|mpg|mpeg)/)
 69:           if m.to_a[1][-1..-1].eql?("1") && m.to_a[2].eql?("flv")
 70:             # Si acaba en "1", es el video de portada
 71:             videos[:featured][l.to_sym] = video.sub(Document::MULTIMEDIA_PATH, '')
 72:           else
 73:             videos[:list][l.to_sym] << video.sub(Document::MULTIMEDIA_PATH, '')
 74:           end
 75:         end
 76:       end
 77:       list_of_videos = list_of_videos - (videos[:list][l.to_sym] + [videos[:featured][l.to_sym]])
 78:     end
 79: 
 80:     Document::LANGUAGES.each do |l|
 81:       # Meto en todos los que no acaban en "_<idioma>.flv"
 82:       list_of_videos.each do |video|
 83:         if video.match(/1.flv$/)
 84:           # Si el nombre es "*1.flv", es la de portada
 85:           videos[:featured][l.to_sym] = video.sub(Document::MULTIMEDIA_PATH, '') if videos[:featured][l.to_sym].nil?
 86:         else
 87:           videos[:list][l.to_sym] << video.sub(Document::MULTIMEDIA_PATH, '')
 88:         end
 89:       end
 90:     end
 91:     
 92:     Document::LANGUAGES.each do |l|
 93:       if videos[:featured][l.to_sym].nil?
 94:         first_flv = videos[:list][l.to_sym].select {|v| v.match(/.flv$/)}.first
 95:         videos[:featured][l.to_sym] = first_flv
 96:         videos[:list][l.to_sym].delete(first_flv)
 97:       end
 98:     end
 99:     return videos
100:   end

[Validate]