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

audios  [R] 
delete_cover_photo  [R] 
photos  [R] 
videos  [R] 

Public Instance methods

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 165
165:   def audios(subsite)
166:     unless @audios
167:       @audios = {:es => [], :eu => [], :en => []}
168:              
169:       return @audios if self.multimedia_path.blank?
170: 
171:       # Lista de todos los audios en <dir>/*.flv y <dir>/solo_subsite/*.mp3
172:       list_of_audios = Dir.glob(full_multimedia_path + "*.mp3") + Dir.glob(full_multimedia_path + "solo_#{subsite}/*.mp3")
173:       list_of_audios = list_of_audios.collect {|a| a.sub(Document::MULTIMEDIA_PATH, '')}
174:     
175:       Document::LANGUAGES.each do |l|
176:         # Meto en cada idioma solo los que acaban en "_<idioma>.mp3"
177:         @audios[l.to_sym] = list_of_audios.select {|a| a.match("_#{l}.mp3")}
178:         list_of_audios = list_of_audios - @audios[l.to_sym]
179:       end
180: 
181:       Document::LANGUAGES.each do |l|
182:         @audios[l.to_sym] = @audios[l.to_sym] + list_of_audios
183:       end
184:     end
185:     return @audios
186:   end

Accessor para borrar la foto de portada

[Source]

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

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

[Source]

     # File app/models/document.rb, line 240
240:   def department
241:     dept = nil
242:     if self.organization
243:       dept = self.organization.root
244:     end
245:     dept
246:   end

Directorio donde se guardan los adjuntos borrados de este documento

[Source]

     # File app/models/document.rb, line 285
285:   def dir_for_deleted
286:     dummy, year, month_day_dir = self.multimedia_path.match(/^([^\/]+)\/(.+)$/).to_a
287:     dir_for_deleted = Document::MULTIMEDIA_PATH + year + "/borradas/" + month_day_dir
288:   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 146
146:   def featured_video(subsite)
147:     videos(subsite)[:featured][I18n.locale.to_sym]
148:   end

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

Las News y las Page de la web, tienen contenido multimedia (videos para streaming y para descarga, audios y mini-galería de fotos). Es contenido variable y se produce anterior o posteriormente a la propia noticia, y por personas diferentes a las que pueden crear el contenido de la noticia.

Además, estos contenidos pueden ser muy pesados, por lo que subirlos a la web a través de formularios podría dar problemas de timeouts con algunos proxies.

Por todo ello, este contenido se sube al servidor a través de SFTP y se enlaza con la noticia indicando en multimedia_dir el lugar donde se encuentran los ficheros (ruta relativa al home del usuario SFTP) y full_multimedia_path devuelve la ruta absoluta.

[Source]

    # File app/models/document.rb, line 61
61:   def full_multimedia_path
62:     "#{Document::MULTIMEDIA_PATH}#{multimedia_path}"
63:   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 189
189:   def has_audios?(subsite)
190:     audios(subsite)[I18n.locale.to_sym].length > 0
191:   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 151
151:   def has_cover_photo?
152:     self.cover_photo_file_name.present?
153:   end

Indica si este documento tiene documentos adjuntos

[Source]

     # File app/models/document.rb, line 217
217:   def has_files?
218:     a_documents.count > 0
219:   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 194
194:   def has_photos?(subsite)
195:     photos(subsite).length > 0
196:   end

[Source]

     # File app/models/document.rb, line 134
134:   def has_professional_videos?(subsite)
135:     videos(subsite)[:mpg][I18n.locale.to_sym].length > 0
136:   end

Deprecated: Indicaba si este documento tiene transcripciones.

[Source]

     # File app/models/document.rb, line 222
222:   def has_transcriptions?
223:     a_transcriptions.count > 0
224:   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 140
140:   def has_video?(subsite)
141:     !featured_video(subsite).nil?
142:   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 130
130:   def has_videos?(subsite)
131:     videos(subsite)[:list][I18n.locale.to_sym].length > 0 || videos(subsite)[:mpg][I18n.locale.to_sym].length > 0 
132:   end

Devuelve el icono del departamento al que pertenece la noticia/evento

[Source]

     # File app/models/document.rb, line 250
250:   def icon
251:     ic = nil
252:     if self.organization && self.organization.icon
253:       ic = self.organization.icon
254:     end    
255:     ic
256:   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 260
260:   def move_multimedia_files_to_trash
261:     if self.multimedia_path
262: 
263:       FileUtils.mkdir_p(dir_for_deleted)
264:       FileUtils.mv(Dir.glob("#{Document::MULTIMEDIA_PATH}#{self.multimedia_path}*.*"), dir_for_deleted)
265:       
266:       FileUtils.mkdir_p(dir_for_deleted + "solo_irekia")
267:       FileUtils.mv(Dir.glob("#{Document::MULTIMEDIA_PATH}#{self.multimedia_path}solo_irekia/*.*"), dir_for_deleted + "solo_irekia/")
268:       
269:       FileUtils.mkdir_p(dir_for_deleted + "solo_agencia")
270:       FileUtils.mv(Dir.glob("#{Document::MULTIMEDIA_PATH}#{self.multimedia_path}solo_agencia/*.*"), dir_for_deleted + "solo_agencia/")
271:   
272:       logger.info "Moviendo #{Document::MULTIMEDIA_PATH}#{self.multimedia_path}*.* a #{dir_for_deleted}"
273:   
274:       FileUtils.rm_rf("#{Document::MULTIMEDIA_PATH}#{self.multimedia_path}")
275:       
276:       # Los videos de la webtv dejarán de funcionar porque están en el mismo directorio
277:       self.webtv_videos.update_all("draft='t', document_id=NULL")
278:       self.gallery_photos.update_all("document_id=NULL")
279:       self.album.update_attributes(:document_id => nil, :draft => true) if self.album
280:     end
281:     return true
282:   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 iguales a los keys de PhotoPaths::PHOTOS_SIZES

Ejemplos:

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

Se excluyen las fotos de portada de todos los videos flv.

[Source]

     # File app/models/document.rb, line 207
207:   def photos(subsite)
208:     @photos = [] if self.multimedia_path.blank?
209:     unless @photos
210:       @photos = Dir.glob(full_multimedia_path + "*.jpg") + Dir.glob(full_multimedia_path + "solo_#{subsite}/*.jpg")
211:       @photos = @photos - video_previews_in_all_languages(subsite) if has_video?(subsite) 
212:     end
213:     return @photos
214:   end

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

[Source]

     # File app/models/document.rb, line 233
233:   def pretty_body(lang_code=I18n.locale)
234:      send("body_#{lang_code}") ? send("body_#{lang_code}").gsub(/<p.*>###<.*\/p>/, '').gsub(/<p.*>@@@<.*\/p>/, '') : ""
235:   end

Indica si un documento está publicado

[Source]

    # File app/models/document.rb, line 39
39:   def published?
40:     !draft && published_at <= Time.now
41:   end

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

[Source]

     # File app/models/document.rb, line 228
228:   def translated_to?(lang_code)
229:     self.send("title_#{lang_code}").present? && self.send("body_#{lang_code}").present?
230:   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 71
 71:   def videos(subsite="irekia")
 72:     unless @videos
 73:       @videos = {:list => {:es => [], :eu => [], :en => []}, 
 74:                 :featured => {:es => nil, :eu => nil, :en => nil}, 
 75:                 :mpg => {:es => [], :eu => [], :en => []}}
 76:       
 77:       return @videos if self.multimedia_path.blank?
 78:       
 79:       # Lista de todos los videos en <dir>/*.flv y <dir>/solo_subsite/*.flv
 80:       list_of_videos = Dir.glob(full_multimedia_path + "*.flv") + Dir.glob(full_multimedia_path + "solo_#{subsite}/*.flv") + \
 81:                        Dir.glob(full_multimedia_path + "*.mpg") + Dir.glob(full_multimedia_path + "solo_#{subsite}/*.mpg") + \
 82:                        Dir.glob(full_multimedia_path + "*.mpeg") + Dir.glob(full_multimedia_path + "solo_#{subsite}/*.mpeg")
 83:       list_of_videos = list_of_videos.collect {|a| a.sub(Document::MULTIMEDIA_PATH, '')}
 84:       
 85:       Document::LANGUAGES.each do |l|
 86:         # Meto en cada idioma solo los que acaban en "_<idioma>.flv"
 87:         list_of_videos.each do |video|
 88:           if m = video.match(/(.+)_#{l}.flv/)
 89:             if m.to_a[1][-1..-1].eql?("1")
 90:               # Si acaba en "1", es el video de portada
 91:               @videos[:featured][l.to_sym] = video.sub(Document::MULTIMEDIA_PATH, '')
 92:             else
 93:               @videos[:list][l.to_sym] << video.sub(Document::MULTIMEDIA_PATH, '')
 94:             end
 95:           elsif m = video.match(/(.+)_#{l}.(mpg|mpeg)/)
 96:             @videos[:mpg][l.to_sym] << video.sub(Document::MULTIMEDIA_PATH, '')
 97:           end
 98:         end
 99:         list_of_videos = list_of_videos - (@videos[:list][l.to_sym] + [@videos[:featured][l.to_sym]] + @videos[:mpg][l.to_sym])
100:       end
101:       
102:       Document::LANGUAGES.each do |l|
103:         # Meto en todos, los que no acaban en "_<idioma>.flv"
104:         list_of_videos.each do |video|
105:           if video.match(/1.flv$/)
106:             # Si el nombre es "*1.flv", es la de portada
107:             @videos[:featured][l.to_sym] = video.sub(Document::MULTIMEDIA_PATH, '') if @videos[:featured][l.to_sym].nil?
108:           elsif video.match(/(mpg|mpeg)$/)
109:             @videos[:mpg][l.to_sym] << video.sub(Document::MULTIMEDIA_PATH, '')
110:           else
111:             @videos[:list][l.to_sym] << video.sub(Document::MULTIMEDIA_PATH, '')
112:           end
113:         end
114:       end
115:       
116:       Document::LANGUAGES.each do |l|
117:         if @videos[:featured][l.to_sym].nil?
118:           first_flv = @videos[:list][l.to_sym].select {|v| v.match(/.flv$/)}.first
119:           @videos[:featured][l.to_sym] = first_flv
120:           @videos[:list][l.to_sym].delete(first_flv)
121:         end
122:       end
123:       
124:     end
125:     return @videos
126:   end

Protected Instance methods

Asigna el tag del departamento al que pertenece el documento. Se llama desde before_save

[Source]

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

Al principio se podía elegir si las noticias eran puntuables o no, ahora ya no lo es ninguna. Aquí se desactivan las puntuaciones para todas.

[Source]

     # File app/models/document.rb, line 313
313:   def disable_ratings
314:     self.has_ratings = false
315:     return true
316:   end

[Validate]