Skip to content

Commit

Permalink
Merge branch 'release/0.4.5'
Browse files Browse the repository at this point in the history
  • Loading branch information
mauriciopasquier committed Sep 20, 2016
2 parents 182b99b + 01d0792 commit 5494279
Show file tree
Hide file tree
Showing 19 changed files with 291 additions and 27 deletions.
2 changes: 1 addition & 1 deletion VERSION
@@ -1 +1 @@
0.4.4
0.4.5
4 changes: 4 additions & 0 deletions app/assets/stylesheets/comunes/busquedas.css.scss
Expand Up @@ -36,3 +36,7 @@ table.busquedas {
text-align: center; }
.acciones { width: 20%; }
}

.atributos_perfiles input {
width: auto;
}
16 changes: 12 additions & 4 deletions app/controllers/perfiles_controller.rb
Expand Up @@ -115,13 +115,13 @@ def exportar
end

def procesar
# TODO Decidir si hay que limpiar la selección o es más útil retenerla
self.perfiles_seleccionados = nil

respond_with @perfiles, location: nil do |format|
format.csv do
send_data CSVSerializer.new(@perfiles).as_csv(
# FIXME No permite exportar a usuarios anónimos
headers: true, checks: current_usuario.try(:checks_csv_perfiles),
headers: true, checks: current_usuario.try(:checks_csv_perfiles) || seleccion_params[:atributos],
base: Perfil
), filename: archivo_csv
end
Expand All @@ -134,6 +134,7 @@ def seleccionar
respond_with @perfiles = PaginadorDecorator.decorate(@perfiles)
end

# TODO Mover a selecciones_controller
def almacenar
# Perfiles recién seleccionados y los ya viejos
(self.perfiles_seleccionados += Array.wrap(params[:perfil_ids])).uniq!
Expand Down Expand Up @@ -211,6 +212,10 @@ def perfil_params
)
end

def seleccion_params
params.require(:seleccion).permit(atributos: [])
end

# Prepara el scope para la lista de perfiles
def preparar
# Precargar las asociaciones que necesita el index
Expand Down Expand Up @@ -262,14 +267,14 @@ def cargar_perfiles_seleccionados
def buscar_perfiles_o_exportar
# Guarda los checkboxes que estaban marcados
if usuario_signed_in?
current_usuario.update_attribute :checks_csv_perfiles, params[:atributos]
current_usuario.update_attribute :checks_csv_perfiles, seleccion_params[:atributos]
end

# TODO extraer a método propio
# Perfiles con +_destroy+ marcado
remover = if params[:csv].present?
params[:csv][:perfiles_attributes].each_pair.collect do |id, atributos|
id if marcado_para_remover?(atributos)
id.to_i if marcado_para_remover?(atributos)
end.reject { |elemento| elemento.nil? }
end
self.perfiles_seleccionados -= remover unless remover.nil?
Expand All @@ -280,6 +285,9 @@ def buscar_perfiles_o_exportar
when t('comunes.perfiles_asociados.submit')
session[:despues_de_seleccionar] = almacenar_perfiles_path
redirect_to seleccionar_perfiles_path(q: params[:q])
when t('perfiles.exportar.seleccionar_por_provincia')
session[:despues_de_seleccionar] = almacenar_perfiles_path
redirect_to por_provincias_seleccion_path
when t('perfiles.exportar.submit')
# Nada, continuamos a procesar
else
Expand Down
33 changes: 33 additions & 0 deletions app/controllers/selecciones_controller.rb
Expand Up @@ -6,9 +6,42 @@ def create
publicas = ubicaciones.joins(:perfil).where(perfil: { publico: true })

# Almacena en la sesión los perfiles seleccionados
# TODO Unificar funcionamiento de "sumar perfiles" cuando haya forma de
# limpiar
session[:perfiles_seleccionados] = publicas.pluck(:perfil_id).uniq

# Si falla algo podemos enviar tipo: 'error'
render json: { tipo: 'notice', mensaje: t('.perfiles_seleccionados', count: publicas.count) }
end

def almacenar_por_provincias
ubicaciones = Ubicacion.en_provincias(seleccion_params[:provincia_ids])
perfiles = Perfil.accessible_by(current_ability).joins(:ubicacion).where(ubicacion: { id: ubicaciones.ids }).ids

# TODO Tal vez abstraer la seleccion actual en un objeto
# Perfiles recién seleccionados y los ya viejos
(self.perfiles_seleccionados += perfiles).uniq!

# TODO redirigir según el botón apretado en +seleccionar+ (e.g. puede
# dirigir a exportar, a eliminar, a rrrear)
redirect_to exportar_perfiles_path
end

protected

# FIXME Usar en todas las acciones
def seleccion_params
params.require(:seleccion).permit(
provincia_ids: []
)
end

# TODO Tal vez abstraer la seleccion actual en un objeto
def perfiles_seleccionados=(perfiles)
session[:perfiles_seleccionados] = perfiles
end

def perfiles_seleccionados
Array.wrap session[:perfiles_seleccionados]
end
end
2 changes: 1 addition & 1 deletion app/decorators/ubicacion_decorator.rb
Expand Up @@ -20,7 +20,7 @@ def srid
end

def to_s
source.descripcion || transformar || ''
source.descripcion || "#{y}, #{x}" || ''
end

def mapa(zoom = 9)
Expand Down
1 change: 1 addition & 0 deletions app/helpers/perfiles_helper.rb
Expand Up @@ -65,6 +65,7 @@ def marcados
end

# Define el método a usar por el formulario de selección de perfiles
# FIXME Es peligroso usar params directamente
def metodo_de_seleccion
@metodo_de_seleccion ||= (params[:metodo] || :put)
end
Expand Down
4 changes: 4 additions & 0 deletions app/models/ign_provincia.rb
@@ -0,0 +1,4 @@
# Modelo de consulta de la información geográfica de las provincias de
# Argentina, según el IGN
class IgnProvincia < ActiveRecord::Base
end
12 changes: 12 additions & 0 deletions app/models/provincia.rb
Expand Up @@ -10,4 +10,16 @@ class Provincia < Lookup
enum_accessor :slug

alias_attribute :nombre, :valor
# La foreign key de IgnProvincia
alias_attribute :gid, :ign_provincia_id

# FIXME Reemplazar por :belongs_to cuando convierta Provincia a ActiveRecord
def ign_provincia
IgnProvincia.find_by gid: ign_provincia_id
end

# Encuentra las ubicaciones dentro del área de esta provincia
def ubicaciones
Ubicacion.en_provincias(self.id)
end
end
23 changes: 23 additions & 0 deletions app/models/ubicacion.rb
Expand Up @@ -30,6 +30,29 @@ def self.en_caja(noreste: {}, sudoeste: {})
where('coordenadas && ?', caja)
end

# Encuentra las ubicaciones dentro del polígono o polígonos
def self.en_poligonos(poligonos)
puntos = Ubicacion.arel_table[:coordenadas]

where(poligonos.st_intersects(puntos))
end

# Encuentra las ubicaciones dentro de una o más provincias
def self.en_provincias(provincia_ids)
poligonos = IgnProvincia.arel_table[:geog]

# FIXME Reemplazar por query cuando convierta Provincia a ActiveRecord
#
# gids = Provincia.select(:gid).where(id: provincia_ids)
#
# Tal vez pueda unificarla con el otro where
gids = Provincia.find(Array.wrap(provincia_ids)).map(&:ign_provincia_id)

Ubicacion.en_poligonos(poligonos)
.where(ign_provincias: { gid: gids })
.from('ubicaciones, ign_provincias')
end

def self.ransackable_attributes(auth_object = nil)
super(auth_object) - ['created_at', 'updated_at', 'perfil_id', 'id']
end
Expand Down
13 changes: 10 additions & 3 deletions app/serializers/csv_serializer.rb
Expand Up @@ -7,6 +7,9 @@ class CSVSerializer < ActiveModel::ArraySerializer
def as_csv(*args)
o = args.extract_options!

# Evitamos pasar nil a `encabezado`
o[:checks] ||= []

CSV.generate(headers: o[:headers], force_quotes: true) do |csv|
csv << encabezado(o[:checks], o[:base]) if csv.headers
object.each do |perfil|
Expand All @@ -20,10 +23,14 @@ def as_csv(*args)
end

# TODO Reingeniería
def encabezado(columnas = nil, base = nil)
def encabezado(columnas = [], base = nil)
lista = HashWithIndifferentAccess.new(stub(base).serializable_hash).sort.flatten_tree
if columnas.present?
lista.select {|i| columnas.include? i}

# Si hay alguna columna seleccionada, la usamos para filtrar la lista de
# atributos
if columnas.any?(&:present?)
lista.select { |i| columnas.include? i }
# Si no, usamos todos los atributos
else
lista
end.keys
Expand Down
5 changes: 3 additions & 2 deletions app/views/comunes/_perfiles_asociados.html.haml
Expand Up @@ -23,6 +23,7 @@
= field_set_tag 'Agregar más perfiles', class: 'celeste_oscuro plegable' do
#busqueda_perfil
= search_form_for @busqueda_perfil do |b|
.span-18= b.text_field :ubicacion_descripcion_or_serie_nombre_or_numero_cont
.span-18= b.text_field :ubicacion_descripcion_or_serie_nombre_or_numero_cont,
placeholder: t('.como_buscar')

.span-2.last= b.submit t(".submit"), id: :seleccion
.span-2.last= b.submit t('.submit'), id: :seleccion
32 changes: 18 additions & 14 deletions app/views/perfiles/exportar.html.haml
@@ -1,13 +1,13 @@
= form_tag procesar_perfiles_path(format: :csv), class: 'span-24 last', id: 'csv'

= field_set_tag "Exportar a CSV", class: 'celeste_oscuro span-23 last' do
= field_set_tag 'Exportar a CSV', class: 'celeste_oscuro span-23 last' do

#controles.span-22.last
#marcar.span-4.opcion
#marcar_tag.span-3.campo
= label_tag 'check_marcar', 'Marcar todo'
= label_tag 'check_marcar', 'Todos los atributos'
#desmarcar_tag.span-3.campo.desaparecer
= label_tag 'check_marcar', 'Desmarcar todo'
= label_tag 'check_marcar', 'Todos los atributos'
.span-1.last.campo
= check_box_tag 'check_marcar', true, false, id: 'check_marcar'
#encabezado.span-4.opcion
Expand All @@ -16,20 +16,24 @@
.span-1.last.campo
= check_box_tag 'incluir_encabezado', true, true, id: 'incluir_encabezado'

= field_set_tag "Atributos de los perfiles", class: 'celeste span-22 last plegable' do

-# TODO usar fields_for?
#perfiles.checks.span-22.last
- atributos.each do |a|
.span-7.campo{class: cycle('celeste_oscuro', 'celeste')}
= label_tag do
= check_box_tag("atributos[]", a, marcados.include?(a)) + a.to_s.humanize

= field_set_tag "Agregar perfiles para exportar", class: 'celeste span-22 last plegable' do
= field_set_tag 'Agregar perfiles para exportar', class: 'celeste span-22 last plegable' do

.span-21.campo= render partial: 'comunes/perfiles_asociados',
locals: { perfiles: @perfiles, param: 'csv', bloqueado: false }

.acciones.span-4= submit_tag t('.submit')
.span-21.campo
.span-6= submit_tag t('.seleccionar_por_provincia')

= field_set_tag 'Atributos de los perfiles', class: 'celeste span-22 last plegable' do

#perfiles.checks.span-22.last.atributos_perfiles
= collection_check_boxes(:seleccion, :atributos, atributos, :to_s, :humanize) do |a|
.span-21.last.campo{class: cycle('celeste_oscuro', 'celeste')}
= a.label do
= a.text
= a.check_box

.acciones
.span-4= submit_tag t('.submit')

= volver_arriba
27 changes: 27 additions & 0 deletions app/views/selecciones/por_provincias.html.haml
@@ -0,0 +1,27 @@
#seleccion_por_provincia
= form_tag almacenar_por_provincias_seleccion_path, method: :put, class: 'span-24'

= field_set_tag 'Seleccionar perfiles', class: 'celeste_oscuro span-23 last' do
#controles.span-22.last
#marcar.span-4.opcion
#marcar_tag.span-3.campo
= label_tag 'check_marcar', 'De todas las provincias'
#desmarcar_tag.span-3.campo.desaparecer
= label_tag 'check_marcar', 'De todas las provincias'
.span-1.last.campo
= check_box_tag 'check_marcar', true, false, id: 'check_marcar'

= field_set_tag 'De las provincias', class: 'celeste span-22 last plegable' do

.checks.span-22.last.atributos_perfiles
= collection_check_boxes(:seleccion, :provincia_ids, Provincia.all, :id, :valor, include_hidden: false) do |provincia|
.span-21.last.campo{class: cycle('celeste_oscuro', 'celeste')}
= provincia.label do
= provincia.text
= provincia.check_box

.acciones
.span-4= submit_tag t('.volver')
.span-4= submit_tag t('.seleccionar')

= volver_arriba
2 changes: 1 addition & 1 deletion config/application.rb
Expand Up @@ -41,7 +41,7 @@ class Application < Rails::Application
config.assets.enabled = true

# Version of your assets, change this if you want to expire all your assets
config.assets.version = '0.4.4'
config.assets.version = '0.4.5'

# Traduzco el path
config.assets.prefix = '/estaticos'
Expand Down
5 changes: 5 additions & 0 deletions config/locales/sisinta.es.yml
Expand Up @@ -44,6 +44,7 @@ es:
exportar: 'Seleccionar'
exportar:
submit: 'Exportar'
seleccionar_por_provincia: 'Seleccionar por provincia'
usuarios:
update_varios:
notice: 'Los usuarios se actualizaron correctamente.'
Expand All @@ -59,6 +60,7 @@ es:
submit: 'Actualizar'
comunes:
perfiles_asociados:
como_buscar: 'Por ubicación, serie o número de perfil'
submit: 'Buscar'
helpers:
submit:
Expand Down Expand Up @@ -104,3 +106,6 @@ es:
perfiles_seleccionados:
one: '1 perfil seleccionado'
other: '%{count} perfiles seleccionados'
por_provincias:
volver: 'Cancelar'
seleccionar: 'Seleccionar'
5 changes: 4 additions & 1 deletion config/routes.rb
Expand Up @@ -73,7 +73,10 @@
end

with_options path_names: femeninos do |r|
r.resource :seleccion
r.resource :seleccion do
get 'por_provincias'
put 'almacenar_por_provincias'
end

r.resources :fases do
collection do
Expand Down

0 comments on commit 5494279

Please sign in to comment.