Skip to content

Commit

Permalink
Merge pull request #970 from guivaloz:guivaloz/filtros-modulos-permis…
Browse files Browse the repository at this point in the history
…os-roles

Filtros en modulos, permisos y roles
  • Loading branch information
guivaloz authored Apr 26, 2024
2 parents ff750ff + bec56d4 commit a1ce54d
Show file tree
Hide file tree
Showing 11 changed files with 183 additions and 41 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,20 +30,20 @@
<form class="row g-1 mb-3" id="filtradorForm" onsubmit="filtrosAutoridades.buscar(); return false;">
<div class="col-2">
<div class="form-floating">
<input id="filtroClave" type="text" class="form-control" aria-label="Clave" style="text-transform: uppercase;">
<label for="filtroClave">Clave</label>
<input id="filtroAutoridadClave" type="text" class="form-control" aria-label="Clave" style="text-transform: uppercase;">
<label for="filtroAutoridadClave">Clave</label>
</div>
</div>
<div class="col-4">
<div class="form-floating">
<input id="filtroDescripcion" type="text" class="form-control" aria-label="Descripcion" style="text-transform: uppercase;">
<label for="filtroDescripcion">Descripción</label>
<input id="filtroAutoridadDescripcion" type="text" class="form-control" aria-label="Descripcion" style="text-transform: uppercase;">
<label for="filtroAutoridadDescripcion">Descripción</label>
</div>
</div>
<div class="col-3">
<div class="form-floating">
<input id="filtroDistrito" type="text" class="form-control" aria-label="Distrito" style="text-transform: uppercase;">
<label for="filtroDistrito">Distrito</label>
<input id="filtroAutoridadDistritoNombre" type="text" class="form-control" aria-label="Distrito" style="text-transform: uppercase;">
<label for="filtroAutoridadDistritoNombre">Distrito</label>
</div>
</div>
<div class="col-3 text-end">
Expand Down Expand Up @@ -118,9 +118,9 @@
};
// Filtros autoridades
const filtrosAutoridades = new FiltrosDataTable('#autoridades_datatable', configDataTable);
filtrosAutoridades.agregarInput('filtroClave', 'clave');
filtrosAutoridades.agregarInput('filtroDescripcion', 'descripcion');
filtrosAutoridades.agregarInput('filtroDistrito', 'distrito_nombre');
filtrosAutoridades.agregarInput('filtroAutoridadClave', 'clave');
filtrosAutoridades.agregarInput('filtroAutoridadDescripcion', 'descripcion');
filtrosAutoridades.agregarInput('filtroAutoridadDistritoNombre', 'distrito_nombre');
filtrosAutoridades.precargar();
</script>
{% endblock %}
2 changes: 1 addition & 1 deletion plataforma_web/blueprints/autoridades/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ def datatable_json():
consulta = consulta.filter_by(materia_id=request.form["materia_id"])
if "clave" in request.form:
try:
clave = safe_clave(request.form["clave"], max_len=24)
clave = safe_clave(request.form["clave"])
if clave != "":
consulta = consulta.filter(Autoridad.clave.contains(clave))
except ValueError:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,14 @@
<form class="row g-1 mb-3" id="filtradorForm" onsubmit="filtrosDistritos.buscar(); return false;">
<div class="col-2">
<div class="form-floating">
<input id="filtroClave" type="text" class="form-control" aria-label="Clave" style="text-transform: uppercase;">
<label for="filtroClave">Clave</label>
<input id="filtroDistritoClave" type="text" class="form-control" aria-label="Clave" style="text-transform: uppercase;">
<label for="filtroDistritoClave">Clave</label>
</div>
</div>
<div class="col-4">
<div class="form-floating">
<input id="filtroNombre" type="text" class="form-control" aria-label="Nombre" style="text-transform: uppercase;">
<label for="filtroNombre">Nombre</label>
<input id="filtroDistritoNombre" type="text" class="form-control" aria-label="Nombre" style="text-transform: uppercase;">
<label for="filtroDistritoNombre">Nombre</label>
</div>
</div>
<div class="col-6 text-end">
Expand Down Expand Up @@ -98,8 +98,8 @@
];
// Filtros distritos
const filtrosDistritos = new FiltrosDataTable('#distritos_datatable', configDataTable);
filtrosDistritos.agregarInput('filtroClave', 'clave');
filtrosDistritos.agregarInput('filtroNombre', 'nombre');
filtrosDistritos.agregarInput('filtroDistritoClave', 'clave');
filtrosDistritos.agregarInput('filtroDistritoNombre', 'nombre');
filtrosDistritos.precargar();
</script>
{% endblock %}
2 changes: 1 addition & 1 deletion plataforma_web/blueprints/distritos/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ def datatable_json():
consulta = consulta.filter_by(estatus="A")
if "clave" in request.form:
try:
clave = safe_clave(request.form["clave"], max_len=24)
clave = safe_clave(request.form["clave"])
if clave != "":
consulta = consulta.filter(Distrito.clave.contains(clave))
except ValueError:
Expand Down
32 changes: 30 additions & 2 deletions plataforma_web/blueprints/modulos/templates/modulos/list.jinja2
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@

{% block topbar_actions %}
{% call topbar.page_buttons(titulo) %}
{% if current_user.can_view('PERMISOS') %}
{{ topbar.button('Permisos', url_for('permisos.list_active'), 'mdi:lock') }}
{% endif %}
{% if current_user.can_view('ROLES') %}
{{ topbar.button('Roles', url_for('roles.list_active'), 'mdi:gamepad') }}
{% endif %}
Expand All @@ -24,6 +27,24 @@

{% block content %}
{% call list.card() %}
<!-- Filtros modulos -->
<div class="row">
<div class="col">
<form class="row g-1 mb-3" id="filtradorForm" onsubmit="filtrosModulos.buscar(); return false;">
<div class="col-6">
<div class="form-floating">
<input id="filtroModuloNombre" type="text" class="form-control" aria-label="Nombre" style="text-transform: uppercase;">
<label for="filtroModuloNombre">Nombre</label>
</div>
</div>
<div class="col-6 text-end">
<button title="Buscar" class="btn btn-primary btn-lg" onclick="filtrosModulos.buscar(); return false;" id="button-buscar"><span class="iconify" data-icon="mdi:magnify"></span></button>
<button title="Limpiar" class="btn btn-warning btn-lg" type="reset" onclick="filtrosModulos.limpiar();" id="button-limpiar"><span class="iconify" data-icon="mdi:broom"></span></button>
</div>
</form>
</div>
</div>
<!-- Datatable modulos -->
<table id="modulos_datatable" class="table {% if estatus == 'B'%}table-dark{% endif %} display nowrap" style="width:100%">
<thead>
<tr>
Expand All @@ -37,8 +58,12 @@
{% endblock %}

{% block custom_javascript %}
{{ list.config_datatable() }}
<script src="/static/js/datatables-constructor.js"></script>
<script src="/static/js/datatables-filtros.js"></script>
<script>
// DataTable modulos
const constructorDataTable = new ConfigDataTable( '{{ csrf_token() }}' );
let configDataTable = constructorDataTable.config();
configDataTable['ajax']['url'] = '/modulos/datatable_json';
configDataTable['ajax']['data'] = {{ filtros }};
configDataTable['columns'] = [
Expand Down Expand Up @@ -72,6 +97,9 @@
}
}
];
$('#modulos_datatable').DataTable(configDataTable);
// Filtros modulos
const filtrosModulos = new FiltrosDataTable('#modulos_datatable', configDataTable);
filtrosModulos.agregarInput('filtroModuloNombre', 'nombre');
filtrosModulos.precargar();
</script>
{% endblock %}
7 changes: 7 additions & 0 deletions plataforma_web/blueprints/modulos/views.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""
Modulos, vistas
"""

import json

from flask import Blueprint, flash, redirect, render_template, request, url_for
Expand Down Expand Up @@ -34,10 +35,16 @@ def datatable_json():
draw, start, rows_per_page = get_datatable_parameters()
# Consultar
consulta = Modulo.query
# Primero filtrar por columnas propias
if "estatus" in request.form:
consulta = consulta.filter_by(estatus=request.form["estatus"])
else:
consulta = consulta.filter_by(estatus="A")
if "nombre" in request.form:
nombre = safe_string(request.form["nombre"], save_enie=True)
if nombre != "":
consulta = consulta.filter(Modulo.nombre.contains(nombre))
# Ordenar y paginar
registros = consulta.order_by(Modulo.nombre).offset(start).limit(rows_per_page).all()
total = consulta.count()
# Elaborar datos para DataTable
Expand Down
53 changes: 51 additions & 2 deletions plataforma_web/blueprints/permisos/templates/permisos/list.jinja2
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,45 @@

{% block content %}
{% call list.card() %}
<!-- Filtros permisos -->
<div class="row">
<div class="col">
<form class="row g-1 mb-3" id="filtradorForm" onsubmit="filtrosPermisos.buscar(); return false;">
<div class="col-3">
<div class="form-floating">
<input id="filtroPermisoDescripcion" type="text" class="form-control" aria-label="Descripción" style="text-transform: uppercase;">
<label for="filtroPermisoDescripcion">Descripción</label>
</div>
</div>
<div class="col-3">
<div class="form-floating">
<input id="filtroPermisoRolNombre" type="text" class="form-control" aria-label="Rol" style="text-transform: uppercase;">
<label for="filtroPermisoRolNombre">Rol</label>
</div>
</div>
<div class="col-2">
<div class="form-floating">
<input id="filtroPermisoModuloNombre" type="text" class="form-control" aria-label="Módulo" style="text-transform: uppercase;">
<label for="filtroPermisoModuloNombre">Módulo</label>
</div>
</div>
<div class="col-2">
<select id="filtroPermisoNivel" class="form-select" aria-label="Nivel">
<option selected value="">Todos los niveles</option>
<option value="1">VER</option>
<option value="2">VER y MODIFICAR</option>
<option value="3">VER, MODIFICAR y CREAR</option>
<option value="4">ADMINISTRAR</option>
</select>
</div>
<div class="col-2 text-end">
<button title="Buscar" class="btn btn-primary btn-lg" onclick="filtrosPermisos.buscar(); return false;" id="button-buscar"><span class="iconify" data-icon="mdi:magnify"></span></button>
<button title="Limpiar" class="btn btn-warning btn-lg" type="reset" onclick="filtrosPermisos.limpiar();" id="button-limpiar"><span class="iconify" data-icon="mdi:broom"></span></button>
</div>
</form>
</div>
</div>
<!-- Datatable permisos -->
<table id="permisos_datatable" class="table {% if estatus == 'B'%}table-dark{% endif %} display nowrap" style="width:100%">
<thead>
<tr>
Expand All @@ -38,8 +77,12 @@
{% endblock %}

{% block custom_javascript %}
{{ list.config_datatable() }}
<script src="/static/js/datatables-constructor.js"></script>
<script src="/static/js/datatables-filtros.js"></script>
<script>
// DataTable permisos
const constructorDataTable = new ConfigDataTable( '{{ csrf_token() }}' );
let configDataTable = constructorDataTable.config();
configDataTable['ajax']['url'] = '/permisos/datatable_json';
configDataTable['ajax']['data'] = {{ filtros }};
configDataTable['columns'] = [
Expand Down Expand Up @@ -79,6 +122,12 @@
}
}
];
$('#permisos_datatable').DataTable(configDataTable);
// Filtros permisos
const filtrosPermisos = new FiltrosDataTable('#permisos_datatable', configDataTable);
filtrosPermisos.agregarInput('filtroPermisoDescripcion', 'descripcion');
filtrosPermisos.agregarInput('filtroPermisoRolNombre', 'rol_nombre');
filtrosPermisos.agregarInput('filtroPermisoModuloNombre', 'modulo_nombre');
filtrosPermisos.agregarInput('filtroPermisoNivel', 'nivel');
filtrosPermisos.precargar();
</script>
{% endblock %}
22 changes: 21 additions & 1 deletion plataforma_web/blueprints/permisos/views.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
"""
Permisos, vistas
"""

import json
from flask import Blueprint, flash, redirect, render_template, request, url_for
from flask_login import current_user, login_required

from lib.datatables import get_datatable_parameters, output_datatable_json
from lib.safe_string import safe_message
from lib.safe_string import safe_message, safe_string

from plataforma_web.blueprints.bitacoras.models import Bitacora
from plataforma_web.blueprints.modulos.models import Modulo
Expand Down Expand Up @@ -34,6 +35,7 @@ def datatable_json():
draw, start, rows_per_page = get_datatable_parameters()
# Consultar
consulta = Permiso.query
# Primero filtrar por columnas propias
if "estatus" in request.form:
consulta = consulta.filter_by(estatus=request.form["estatus"])
else:
Expand All @@ -42,6 +44,24 @@ def datatable_json():
consulta = consulta.filter_by(modulo_id=request.form["modulo_id"])
if "rol_id" in request.form:
consulta = consulta.filter_by(rol_id=request.form["rol_id"])
if "descripcion" in request.form:
descripcion = safe_string(request.form["descripcion"], save_enie=True)
if descripcion != "":
consulta = consulta.filter(Permiso.descripcion.contains(descripcion))
if "nivel" in request.form:
nivel = safe_string(request.form["nivel"], save_enie=True)
if nivel != "":
consulta = consulta.filter_by(nivel=nivel)
# Luego filtrar por columnas de otras tablas
if "rol_nombre" in request.form:
rol_nombre = safe_string(request.form["rol_nombre"], save_enie=True)
if rol_nombre != "":
consulta = consulta.join(Rol).filter(Rol.nombre.contains(rol_nombre))
if "modulo_nombre" in request.form:
modulo_nombre = safe_string(request.form["modulo_nombre"], save_enie=True)
if modulo_nombre != "":
consulta = consulta.join(Modulo).filter(Modulo.nombre.contains(modulo_nombre))
# Ordenar y paginar
registros = consulta.order_by(Permiso.nombre).offset(start).limit(rows_per_page).all()
total = consulta.count()
# Elaborar datos para DataTable
Expand Down
32 changes: 30 additions & 2 deletions plataforma_web/blueprints/roles/templates/roles/list.jinja2
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
{% if current_user.can_view('MODULOS') %}
{{ topbar.button('Módulos', url_for('modulos.list_active'), 'mdi:toy-brick') }}
{% endif %}
{% if current_user.can_view('PERMISOS') %}
{{ topbar.button('Permisos', url_for('permisos.list_active'), 'mdi:lock') }}
{% endif %}
{% if current_user.can_view('USUARIOS') %}
{{ topbar.button('Usuarios', url_for('usuarios.list_active'), 'mdi:account-key') }}
{% endif %}
Expand All @@ -24,6 +27,24 @@

{% block content %}
{% call list.card() %}
<!-- Filtros roles -->
<div class="row">
<div class="col">
<form class="row g-1 mb-3" id="filtradorForm" onsubmit="filtrosRoles.buscar(); return false;">
<div class="col-6">
<div class="form-floating">
<input id="filtroRolNombre" type="text" class="form-control" aria-label="Nombre" style="text-transform: uppercase;">
<label for="filtroRolNombre">Nombre</label>
</div>
</div>
<div class="col-6 text-end">
<button title="Buscar" class="btn btn-primary btn-lg" onclick="filtrosRoles.buscar(); return false;" id="button-buscar"><span class="iconify" data-icon="mdi:magnify"></span></button>
<button title="Limpiar" class="btn btn-warning btn-lg" type="reset" onclick="filtrosRoles.limpiar();" id="button-limpiar"><span class="iconify" data-icon="mdi:broom"></span></button>
</div>
</form>
</div>
</div>
<!-- Datatable roles -->
<table id="roles_datatable" class="table {% if estatus == 'B'%}table-dark{% endif %} display nowrap" style="width:100%">
<thead>
<tr>
Expand All @@ -35,8 +56,12 @@
{% endblock %}

{% block custom_javascript %}
{{ list.config_datatable() }}
<script src="/static/js/datatables-constructor.js"></script>
<script src="/static/js/datatables-filtros.js"></script>
<script>
// DataTable roles
const constructorDataTable = new ConfigDataTable( '{{ csrf_token() }}' );
let configDataTable = constructorDataTable.config();
configDataTable['ajax']['url'] = '/roles/datatable_json';
configDataTable['ajax']['data'] = {{ filtros }};
configDataTable['columns'] = [
Expand All @@ -51,6 +76,9 @@
}
}
];
$('#roles_datatable').DataTable(configDataTable);
// Filtros roles
const filtrosRoles = new FiltrosDataTable('#roles_datatable', configDataTable);
filtrosRoles.agregarInput('filtroRolNombre', 'nombre');
filtrosRoles.precargar();
</script>
{% endblock %}
Loading

0 comments on commit a1ce54d

Please sign in to comment.