Módulo         Permisos

Contenido

  • Requerimientos
  • Tipos de Usuarios
  • Modelo
  • Métodos
  • Helpers
  • Documentación

Requerimientos

El objetivo es diseñar un sistema que permita autorizar o no a los distintos usuarios a realizar las acciones que ofrece la plataforma. Debe ser de manera administrable desde una interfaz web.

Debe permitir mediante helpers consultar si un usuario puede o no realizar una acción cuando se intenta acceder a ella.

Diseñe el protocolo para asignar los permisos que mejor le parezca para lograr el objetivo.

Tomar en consideración que los permisos se asignan por acción y dependiendo de la unidad.

Tipos de Usuarios

Admin de Unidad

Super  Admin

Admin de Unidad

Admin de Unidad

Usuario

Usuario

Usuario

Usuario

Usuario

Modelo

Métodos

  • Verifica si la unidad a la que se accede existe.

  • Verifica si el modelo al que se accede existe.

  • Verifica si la acción a la que se accede existe.

  • superadmin - acceso inmediato

  • admin de unidad - accede a la cualquier modelo de esa unidad.

  • usuario

    • Verifica si se tiene algún rol que pertenezca a la unidad.

    • Verifica si se tiene al menos un rol que tenga acceso al modelo y a la acción a la que se accede.

can_access_unit_and_action?

Core Method

Helpers

is_allow?(model_name, action_name)

admin?

Helper que filtra hipervínculos dependiendo de las acciones que puede realizar el usuario.

Helper que filtra los hipervínculos de administración en el sidebar.

# app/views/doc_category/index.html.erb
<% if is_allow? 'DocCategory', 'edit'%>
 | <%= link_to "Editar", edit_unit_doc_category_path(@unit,category) %>
<% end %>
# app/views/layouts/application.html.erb
<% if admin? %>
            <%= render "layouts/administration" %>
<% end -%>

https://docs.google.com/document/d/1ti7z84PikmtP6jr4GAaDs-MHjdqyZu7RKgqa69Hmwfw/edit#heading=h.owqylzllembg

Documentación

google drive

Módulo Orden de Compra

Contenido

  • Gema Prawn
  • Generación de pdf

Gema prawn

# Gemfile
gem 'prawn'
gem 'prawn-table', '~> 0.1.0'
# app/controllers/buy_order_controller.rb
def show_pdf
    @order = BuyOrder.find(params[:buy_order_id])
    pdf = ReportPdf.new(@order)
    send_data pdf.render, filename: 'report.pdf', type: 'application/pdf'
end

Instalación

Generar pdf

Gema prawn

Clase Prawn

class ReportPdf < Prawn::Document
  def initialize(order)
    super()
    @order = order
    header
    move_down(20)
    text "Orden de Compra n° " + @order.id.to_s
    table_orden
    move_down(20)
    text "Detalle"
    table_detalle
  end
 
  def header
    image "#{Rails.root}/app/assets/images/Di-logo.png", width: 300, height: 43, position: :center 
  end
 
  def text_content
    y_position = cursor - 50
    text "Orden de Compra n° " + @order.id.to_s
  end

  def table_orden
    content = [["Fecha ingreso", @order.fecha],["Solicitante", @order.nombres],
                ["correo", @order.correo],["Area / Proyecto", @order.area_proyecto],
                ["Cuenta Presupuestaria", @order.cuenta_presupuestaria],["Descripcion", @order.descripcion],
                ["Valor Estimado", @order.estimativo]]
    table content do
      column(0).font_style = :bold
      self.header = true
      self.row_colors = ['DDDDDD', 'FFFFFF']
      self.column_widths = [220, 320]
    end
  end
 
  def table_detalle
    ...
  end
 
  def product_rows
    ..
  end

Generación de pdf

Ordenes de Compra
Confirmar formato

WAM

Contenido

  • Personas
  • Módulos
  • Buscador
  • Perfil
  • Métodos

Personas

Fue creado un modelo del tipo activeldap llamado people, el cual tendra una base general y reconocera a cualquier unidad con un dn=uid

# app/models/people
class People < ActiveLdap::Base
  ldap_mapping dn_attribute: "uid",
               prefix: ""
  ...
end

Modulos

  • Buscador
  • Edición de Información.
  • Cambio y recuperación de contraseña.

                         En proceso..

  • Creación de usuarios.

Buscador

El buscador se conecta de forma directa con el servidor de ldap utilizando metodos de activeldap.


if People.find(:all,
               :filter => {:cn => '*',
                           :uid => busqueda})
 && People.find(:all,
                :filter => {:cn => busqueda,
                            :uid => '*'})
  	@people = People.find(:all, 
                              :filter => {:cn => busqueda,
                                          :uid => '*'})
  	uids = People.find(:all, busqueda)

Problemas

Al igual que con el buscador de wam, búsquedas generales como "a" o "s" pueden llegar a romper el buscador. Esto podría ser controlado mas adelante con un tiempo máximo de búsqueda.

Resultados

Los resultados de la búsqueda son reflejados en una tabla con su nombre completo y su email.

Perfil

En el espacio de usuario fue agregada una vista de perfil, la cual incluye la información básica, y los métodos de adición/edición de información y cambios de contraseña.

Métodos

El método de cambio de información exigen la confirmación por contraseña.

 

El método de cambio de contraseña exige un mínimo de 7 caracteres de longitud por ahora.

 

def editInfo
    #Busca al usuario en el servidor ldap usando la uid en la sesion actual
    user = People.find(session[:uid])
    #los parametros que no se encuentren vacios se actualizan
    if !params[:givenName].empty?
      user.givenName = params[:givenName]
    end
    if !params[:sn].empty?
      user.sn = params[:sn]
    end
    if !params[:mail].empty?
      user.mail = params[:mail]
    end
    if !params[:password].empty? && People.check_password(params[:password] , user.userPassword)
      user.save
      flash[:success] = 'Datos actualizados con exito'
      redirect_to profile_users_path
    else
      flash.alert = "contraseña equivocada"
      redirect_to profile_users_path
    end
end

Módulo de

memorias

Contenido

  • Diagrama de flujo
  • Fases del Proceso de Titulación
  • Registro de Inscripción del Tema
  • Buscador de alumnos
  • Administración de memorias
  • Seguimiento

Diagrama Proceso de Titulación v2 basado en el modelo hecho por María José Vargas y conversaciones con Sra. Angela Miranda, secretaria de pregrado y Profesor Hubert Hoffmann, Jefe de Carrera.

  • Fase I :
    • Se tienen los datos del alumno y memoria.
    • Se tiene la firma del profesor guía.
    • Se tiene la firma de profesor seminario de memoria.
    • Se espera la firma del jefe de carrera.
  • Fase II :
    • Se tiene la firma del formulario y memo para inscripción del trabajo de titulación del jefe de carrera.
    • Espera envío a dirección de estudios.
  • Fase III :
    • Espera de regreso de documento desde dirección de estudios.
  • Fase IV :
    • En espera de asignación de fecha para examen.
  • Fase V :
    • Titulado.

Proceso de Titulación

Formulario

Registro Inscripción Tema de Memoria de Titulación

Buscador de alumnos

Creación de memorias

Creación de memorias

Detalles de una memoria

Seguimiento

Seguimiento

Qué queda por hacer

  • Generación de planillas Excel
  • Generación automática del Formulario
  • Agregar los permisos del módulo

Otros Avances

http://204.87.169.114:3000/units/direccion/buy_orders

http://204.87.169.114:3000/units/pregrado/doc_categories

                           .../units/infraestructura-y-tecnologia/buy_orders

Friendly URLS

  • Diccionario
  • Diccionario
# app/models/dictionary.rb
class Dictionary < ActiveRecord::Base
    def self.units
        { "direccion" => 1, 
        'pregrado' => 2, 
        'postgrado' => 3, 
        'investigacion' => 4, 
        'extension' => 5, 
        'infraestructura-y-tecnologia' => 6 }
    end
end
# app/controller/application_controller.rb
def current_unit
    unit_name = request.env['PATH_INFO'].split('/')[2].to_s
    return Dictionary.units[unit_name]
end
# app/models/unit.rb
def to_param
    	"#{nombre}".parameterize
end

Cambiamos el nombre  de la unidad en en la url

Extraemos el nombre de la unidad

Dictionary.unit['pregrado']

Joomla

Probar la posibilidad de integración con template de la Universidad.

En espera de Template

Demo

Intranet: Presentación Martes 24

By Sam W

Intranet: Presentación Martes 24

  • 957