sistema_web/models/system.py

298 lines
11 KiB
Python
Raw Normal View History

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)