2023-02-27 16:21:22 -03:00
|
|
|
#from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
|
|
|
|
#from datetime import datetime
|
2023-02-28 00:15:12 -03:00
|
|
|
from flask import current_app, url_for
|
2023-02-27 16:21:22 -03:00
|
|
|
from flask_login import UserMixin
|
|
|
|
from sqlalchemy.sql import func
|
|
|
|
from sqlalchemy.dialects import postgresql, sqlite
|
|
|
|
from webinterface import db, login_manager
|
|
|
|
|
|
|
|
@login_manager.user_loader
|
|
|
|
def load_user(user_id):
|
|
|
|
return Persona.query.filter(Persona.rut==user_id).one_or_none()
|
|
|
|
|
|
|
|
class Identidad(db.Model):
|
|
|
|
__tablename__ = 'identidades'
|
|
|
|
__table_args__ = { 'schema': 'usuarios' }
|
|
|
|
__bind_key__ = 'system'
|
|
|
|
|
|
|
|
id = db.Column(db.BigInteger(), primary_key=True, autoincrement=True)
|
|
|
|
|
|
|
|
login = db.Column(db.String(50), unique=True, nullable=False)
|
|
|
|
alias = db.Column(db.String(50))
|
|
|
|
|
|
|
|
creado = db.Column(db.DateTime(timezone=True), server_default=func.now())
|
|
|
|
modificado = db.Column(db.DateTime(timezone=True), server_onupdate=func.now())
|
|
|
|
|
|
|
|
sesiones = db.relationship('Sesion', back_populates='identidad', lazy=True)
|
|
|
|
ubicaciones = db.relationship('Ubicacion', back_populates='identidad', lazy=True)
|
|
|
|
|
|
|
|
tipo = db.Column(db.String(20))
|
|
|
|
__mapper_args__ = {
|
|
|
|
'polymorphic_identity':'Identidad',
|
|
|
|
'polymorphic_on':tipo
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
class Cuenta(Identidad):
|
|
|
|
__tablename__ = 'cuentas'
|
|
|
|
__table_args__ = { 'schema': 'usuarios' }
|
|
|
|
__bind_key__ = 'system'
|
|
|
|
|
|
|
|
id = db.Column(db.BigInteger(), db.ForeignKey('usuarios.identidades.id'), primary_key=True)
|
|
|
|
|
|
|
|
clave = db.Column(db.String(60), nullable=False)
|
|
|
|
sysadmin = db.Column(db.Boolean, default=0)
|
|
|
|
ultimoacceso = db.Column(db.DateTime(timezone=True))
|
|
|
|
|
|
|
|
__mapper_args__ = {
|
|
|
|
'polymorphic_identity':'Cuenta'
|
|
|
|
}
|
|
|
|
|
|
|
|
correos = db.relationship('Correo', back_populates='cuenta', lazy=True)
|
|
|
|
|
|
|
|
def set_default(self, correo):
|
|
|
|
for item in self.correos:
|
|
|
|
if correo == item:
|
|
|
|
correo.default = True
|
|
|
|
else:
|
|
|
|
correo.default = False
|
|
|
|
|
|
|
|
@property
|
|
|
|
def correodefecto(self):
|
|
|
|
last = None
|
|
|
|
for item in self.correos:
|
|
|
|
if item.default == True:
|
|
|
|
return item
|
|
|
|
elif last is None:
|
|
|
|
last = item
|
|
|
|
|
|
|
|
return last
|
|
|
|
|
|
|
|
@correodefecto.setter
|
|
|
|
def correodefecto(self, correo):
|
|
|
|
if correo.cuenta != self:
|
|
|
|
pass
|
|
|
|
|
|
|
|
for item in self.correos:
|
|
|
|
if item == correo:
|
|
|
|
item.default = True
|
|
|
|
else:
|
|
|
|
item.default = False
|
|
|
|
|
|
|
|
class Persona(Cuenta,UserMixin):
|
|
|
|
__tablename__ = 'personas'
|
|
|
|
__table_args__ = { 'schema': 'usuarios' }
|
|
|
|
__bind_key__ = 'system'
|
|
|
|
|
|
|
|
id = db.Column(db.BigInteger(), db.ForeignKey('usuarios.cuentas.id'), primary_key=True)
|
|
|
|
|
|
|
|
nombres = db.Column(db.String(100), nullable=False)
|
|
|
|
apellidop = db.Column(db.String(100), nullable=False)
|
|
|
|
apellidom = db.Column(db.String(100))
|
|
|
|
|
|
|
|
rut = db.Column(db.String(20), unique=True, nullable=False)
|
|
|
|
telefono = db.Column(db.String(20), nullable=True)
|
|
|
|
foto = db.Column(db.String(50), nullable=False, default='default.jpg')
|
|
|
|
|
|
|
|
__mapper_args__ = {
|
|
|
|
'polymorphic_identity':'Persona'
|
|
|
|
}
|
|
|
|
def get_id(self):
|
|
|
|
return self.rut
|
|
|
|
|
|
|
|
@property
|
|
|
|
def nombrecompleto(self):
|
|
|
|
if self.apellidom is not None:
|
|
|
|
return u"{} {} {}.".format(self.nombres.partition(' ')[0], self.apellidop, self.apellidom[0])
|
|
|
|
else:
|
|
|
|
return u"{} {}.".format(self.nombres.partition(' ')[0], self.apellidop)
|
|
|
|
@property
|
|
|
|
def safe_nombrecompleto(self):
|
|
|
|
return "{}".format(self.nombrecompleto.encode('utf-8'))
|
|
|
|
@property
|
|
|
|
def ascii_nombrecompleto(self):
|
|
|
|
return unidecode.unidecode(self.nombrecompleto)
|
|
|
|
|
|
|
|
def is_in(self, comision=0):
|
|
|
|
return True
|
|
|
|
|
2023-02-28 00:15:12 -03:00
|
|
|
@property
|
|
|
|
def sidebar_menu(self):
|
|
|
|
import json
|
|
|
|
from .gestion import AccesoGestion
|
|
|
|
# Primer menu, de carrera Visión de jefe de carrera
|
|
|
|
amGestion = AccesoGestion()
|
|
|
|
|
|
|
|
if amGestion.in_gestion():
|
|
|
|
cat = u"Gobernanza"
|
|
|
|
links = []
|
|
|
|
|
|
|
|
for modulo in amGestion.get_nodes():
|
|
|
|
links.append((modulo.nodobase.nombre, modulo.nodobase.tipo, modulo.nodobase.descripcion, url_for('gestion.main', uri=modulo.uri) ))
|
|
|
|
|
|
|
|
if amGestion.is_admin():
|
|
|
|
links.append((u'Comisiones','users-cog','gestion.manager', url_for('gestion.manager')))
|
|
|
|
|
|
|
|
if amGestion.sysadmin:
|
|
|
|
links.append((u'Módulos','boxes','gestion.modulos', url_for("gestion.modulos")))
|
|
|
|
|
|
|
|
if len(links) > 0:
|
|
|
|
yield(100, u"Dashboard", "tasks", cat, links)
|
|
|
|
|
|
|
|
cat = "Información Oficial" #
|
|
|
|
links = [
|
|
|
|
("GTFS Estático", "map-marked-alt", "main.home", url_for("main.home")),
|
|
|
|
("GTFS Dinamico", "satellite-dish", "main.home", url_for("main.home")),
|
|
|
|
("Paradas", "store", "main.home", url_for("main.home")),
|
|
|
|
("Rutas", "bus-alt", "main.home", url_for("main.home")),
|
|
|
|
("Conductores", "user-alt", "main.home", url_for("main.home")),
|
|
|
|
("Vehículo", "shuttle-van", "main.home", url_for("main.home")),
|
|
|
|
("En construcción", "tools", "main.home", url_for("main.home")),
|
|
|
|
# ("Críticos", "user-injured", "main.home"),
|
|
|
|
]
|
|
|
|
yield(200, "Gran Concepción", "city", cat, links)
|
2023-02-27 16:21:22 -03:00
|
|
|
|
|
|
|
class Correo(db.Model):
|
|
|
|
__tablename__ = 'correos'
|
|
|
|
__table_args__ = { 'schema': 'usuarios' }
|
|
|
|
__bind_key__ = 'system'
|
|
|
|
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
|
|
correo = db.Column(db.String(100), unique=True, nullable=False)
|
|
|
|
|
|
|
|
cuentaid = db.Column(db.BigInteger(), db.ForeignKey('usuarios.cuentas.id'), nullable=False)
|
|
|
|
cuenta = db.relationship('Cuenta', back_populates='correos')
|
|
|
|
default = db.Column(db.Boolean, default=0)
|
|
|
|
|
|
|
|
|
|
|
|
class Sesion(db.Model):
|
|
|
|
__tablename__ = 'sesiones'
|
|
|
|
__table_args__ = { 'schema': 'registros' }
|
|
|
|
__bind_key__ = 'system'
|
|
|
|
|
|
|
|
id = db.Column(db.BigInteger(), primary_key=True)
|
|
|
|
|
|
|
|
identidadid = db.Column(db.BigInteger(), db.ForeignKey('usuarios.identidades.id'), nullable=False)
|
|
|
|
identidad = db.relationship('Identidad', back_populates='sesiones')
|
|
|
|
|
|
|
|
dispositivoid = db.Column(db.Integer, db.ForeignKey('registros.dispositivos.id'), nullable=False)
|
|
|
|
dispositivo = db.relationship('Dispositivo')
|
|
|
|
|
|
|
|
conexiones = db.relationship('Conexion')
|
|
|
|
|
|
|
|
iniciada = db.Column(db.DateTime(timezone=True), server_default=func.now())
|
|
|
|
ultimo = db.Column(db.DateTime(timezone=True), server_onupdate=func.now())
|
|
|
|
|
|
|
|
def __repr__(self):
|
|
|
|
return u"Session ('{}','{}','{}')".format(self.identidad.login, self.ipaddr.ipaddr, self.useragent.parsed_ua)
|
|
|
|
|
|
|
|
class Conexion(db.Model):
|
|
|
|
__tablename__ = 'conexiones'
|
|
|
|
__table_args__ = { 'schema': 'registros' }
|
|
|
|
__bind_key__ = 'system'
|
|
|
|
|
|
|
|
id = db.Column(db.BigInteger(), primary_key=True)
|
|
|
|
|
|
|
|
ipaddrid = db.Column(db.Integer, db.ForeignKey('registros.ipaddrs.id'), nullable=False)
|
|
|
|
ipaddr = db.relationship('Ipaddr')
|
|
|
|
|
|
|
|
sesionid = db.Column(db.Integer, db.ForeignKey('registros.sesiones.id'), nullable=False)
|
|
|
|
sesion = db.relationship('Sesion', back_populates='conexiones', lazy=True)
|
|
|
|
|
|
|
|
iniciada = db.Column(db.DateTime(timezone=True), server_default=func.now())
|
|
|
|
ultimo = db.Column(db.DateTime(timezone=True), server_onupdate=func.now())
|
|
|
|
|
|
|
|
__table_args__ = (db.UniqueConstraint('ipaddrid', 'sesionid', name='_una_ip_sesion_uc'),{ 'schema': 'registros' })
|
|
|
|
|
|
|
|
class Ubicacion(db.Model):
|
|
|
|
__tablename__ = 'ubicaciones'
|
|
|
|
__table_args__ = { 'schema': 'registros' }
|
|
|
|
__bind_key__ = 'system'
|
|
|
|
|
|
|
|
id = db.Column(db.BigInteger(), primary_key=True)
|
|
|
|
|
|
|
|
ipaddrid = db.Column(db.Integer, db.ForeignKey('registros.ipaddrs.id'), nullable=False)
|
|
|
|
ipaddr = db.relationship('Ipaddr')
|
|
|
|
|
|
|
|
identidadid = db.Column(db.Integer, db.ForeignKey('usuarios.identidades.id'), nullable=False)
|
|
|
|
identidad = db.relationship('Identidad', back_populates='ubicaciones', lazy=True)
|
|
|
|
|
|
|
|
descripcion = db.Column(db.String(200), nullable=True)
|
|
|
|
|
|
|
|
iniciada = db.Column(db.DateTime(timezone=True), server_default=func.now())
|
|
|
|
ultimo = db.Column(db.DateTime(timezone=True), server_onupdate=func.now())
|
|
|
|
|
|
|
|
__table_args__ = (db.UniqueConstraint('ipaddrid', 'identidadid', name='_una_ip_identidad_uc'),{ 'schema': 'registros' })
|
|
|
|
|
|
|
|
class Ipaddr(db.Model):
|
|
|
|
__tablename__ = 'ipaddrs'
|
|
|
|
__table_args__ = { 'schema': 'registros' }
|
|
|
|
__bind_key__ = 'system'
|
|
|
|
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
|
|
|
|
|
|
ipaddr = db.Column(db.String(15).with_variant(postgresql.INET(), 'postgresql'), unique=True, nullable=False)
|
|
|
|
hostname = db.Column(db.String(100), nullable=True)
|
|
|
|
|
|
|
|
def __repr__(self):
|
|
|
|
return "IpAddr('{}','{}')".format(self.ipaddr, self.hostname)
|
|
|
|
|
|
|
|
class Dispositivo(db.Model):
|
|
|
|
__tablename__ = 'dispositivos'
|
|
|
|
__table_args__ = { 'schema': 'registros' }
|
|
|
|
__bind_key__ = 'system'
|
|
|
|
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
|
|
useragent = db.Column(db.String(1024), unique=True, nullable=False)
|
|
|
|
parsed_ua = db.Column(db.String(150))
|
|
|
|
dev = db.Column(db.String(50))
|
|
|
|
os = db.Column(db.String(50))
|
|
|
|
browser = db.Column(db.String(50))
|
|
|
|
|
|
|
|
def __repr__(self):
|
|
|
|
return "Useragent('{}')".format(self.parsed_ua)
|
|
|
|
|
|
|
|
class Ruta(db.Model):
|
|
|
|
__tablename__ = 'rutas'
|
|
|
|
__table_args__ = { 'schema': 'registros' }
|
|
|
|
__bind_key__ = 'system'
|
|
|
|
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
|
|
ruta = db.Column(db.String(100), unique=True, nullable=False)
|
|
|
|
|
|
|
|
def __repr__(self):
|
|
|
|
return "Url('{}')".format(self.ruta)
|
|
|
|
|
|
|
|
class Registro(db.Model):
|
|
|
|
__tablename__ = 'registros'
|
|
|
|
__table_args__ = { 'schema': 'registros' }
|
|
|
|
__bind_key__ = 'system'
|
|
|
|
|
|
|
|
id = db.Column(db.BigInteger(), primary_key=True)
|
|
|
|
|
|
|
|
sitioid = db.Column(db.Integer, db.ForeignKey('registros.sitios.id'), nullable=False)
|
|
|
|
sitio = db.relationship('Sitio')
|
|
|
|
|
|
|
|
rutaid = db.Column(db.Integer, db.ForeignKey('registros.rutas.id'), nullable=False)
|
|
|
|
ruta = db.relationship('Ruta')
|
|
|
|
|
|
|
|
sesionid = db.Column(db.BigInteger().with_variant(sqlite.INTEGER(), 'sqlite'), db.ForeignKey('registros.sesiones.id'), nullable=False)
|
|
|
|
sesion = db.relationship('Sesion')
|
|
|
|
|
|
|
|
ipaddrid = db.Column(db.Integer, db.ForeignKey('registros.ipaddrs.id'), nullable=False)
|
|
|
|
ipaddr = db.relationship('Ipaddr')
|
|
|
|
|
|
|
|
tamano = db.Column(db.Integer)
|
|
|
|
creado = db.Column(db.DateTime, server_default=func.now())
|
|
|
|
|
|
|
|
def __repr__(self):
|
|
|
|
return "Registro('{}')".format(self.ruta.ruta)
|
|
|
|
|
|
|
|
class Sitio(db.Model):
|
|
|
|
__tablename__ = 'sitios'
|
|
|
|
__table_args__ = { 'schema': 'registros' }
|
|
|
|
__bind_key__ = 'system'
|
|
|
|
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
|
|
sitio = db.Column(db.String(100), unique=True, nullable=False)
|