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

assign_department_tag audios can_be_read_by? delete_cover_photo= department dir_for_deleted disable_ratings featured_video full_multimedia_path has_audios? has_cover_photo? has_files? has_photos? has_transcriptions? has_video? has_videos? icon move_multimedia_files_to_trash photos pretty_body published? translated_to? video_preview_file_and_url video_preview_img videos

### Included Modules

Sluggable FerretMethods DocumentPaths

### Attributes

delete_cover_photo | [R] |

### Public Instance methods

assign_department_tag()

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

audios(subsite)

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

can_be_read_by?(user)

     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

delete_cover_photo=(value)

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

department()

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

dir_for_deleted()

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

disable_ratings()

[Source]

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

featured_video(subsite)

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

full_multimedia_path()

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

has_audios?(subsite)

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

has_cover_photo?()

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

has_files?()

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

has_photos?(subsite)

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

has_transcriptions?()

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

has_video?(subsite)

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

has_videos?(subsite)

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

icon()

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

move_multimedia_files_to_trash()

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

photos(subsite)

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

pretty_body()

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

published?()

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

translated_to?(lang_code)

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

video_preview_file_and_url(subsite)

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

video_preview_img(subsite)

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

videos(subsite="irekia")

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]