Ejemplo n.º 1
0
class Calendario(Base):
    __tablename__ = 'calendarios'
    id = db.Column(db.Integer, primary_key=True)
    tipo = db.Column(db.Integer, nullable=False)
    nombre = db.Column(db.String(128), nullable=False)
    direccion = db.Column(db.String(128), nullable=False)
    etiqueta = db.Column(db.String(50), nullable=False)
    color = db.Column(db.String(6), nullable=False, default="000000")
Ejemplo n.º 2
0
class Reparticion(Base):
    """Modelo de reparticiones de la Municipalidad"""
    __tablename__ = 'reparticiones'

    id = db.Column(db.Integer, primary_key=True)
    nombre = db.Column(db.String(128), nullable=False, unique=True)

    def __repr__(self):
        return self.nombre
Ejemplo n.º 3
0
class Usuario(UserMixin, Base):
    __tablename__ = 'usuarios'
    id = db.Column(db.Integer, primary_key=True)
    usuario = db.Column(db.String(64), index=True, unique=True)
    password_hash = db.Column(db.String(128))
    rol_id = db.Column(db.Integer, db.ForeignKey('roles.id'), nullable=False)

    def __init__(self, *args, **kwargs):
        super().__init__(**kwargs)
        if self.rol is None:
            self.rol = Rol.query.filter_by(default=True).first()

    def __repr__(self):
        return "<Usuario {}>".format(self.usuario)

    def set_password(self, password):
        assert password is not None
        self.password_hash = generate_password_hash(password)

    def check_password(self, password):
        return check_password_hash(self.password_hash, password)

    def can(self, permission):
        return self.rol is not None and self.rol.tiene_permiso(permission)
Ejemplo n.º 4
0
class Agente(Base):
    """Modelo de agentes de la municipalidad

    Se relaciona con la reparticion a través del campo reparticion_id, y
    con los turnos a través de los campos de turnos.
    """
    def __init__(self, **kwargs):
        """Inicializamos con atributos en caso de que sean indicados"""
        super().__init__(**kwargs)
        self.__dict__.update(kwargs)

    __tablename__ = 'agentes'

    id = db.Column(db.Integer, primary_key=True)
    nombre = db.Column(db.String(128), nullable=False)
    apellido = db.Column(db.String(128), nullable=False)
    dni = db.Column(db.Integer, nullable=False, unique=True)
    telefono = db.Column(db.String(70), nullable=True)
    domicilio_calle = db.Column(db.String(128), nullable=True)
    domicilio_numero = db.Column(db.String(128), nullable=True)
    domicilio_piso = db.Column(db.String(128), nullable=True)
    domicilio_depto = db.Column(db.String(128), nullable=True)
    legajo = db.Column(db.Integer, nullable=True)
    reparticion_id = db.Column(db.Integer,
                               db.ForeignKey('reparticiones.id'),
                               nullable=False)
    reparticion = db.relationship('Reparticion')
    apto_psi = db.Column(db.Integer, nullable=True)
    apto_med = db.Column(db.Integer, nullable=True)
    observaciones = db.Column(db.Text, nullable=True)
    turnos = db.relationship('Turno',
                             backref='agente',
                             cascade='all, delete-orphan')

    # Los nombres de los turnos no llevan turno_ delante para evitar
    # conflictos de nombre con los campos de turno del formulario
    psi_1 = db.relationship('Turno',
                            primaryjoin='and_(Agente.id==Turno.agente_id, '
                            'Turno.tipo==1, Turno.numero==1)',
                            uselist=False)
    psi_2 = db.relationship('Turno',
                            primaryjoin='and_(Agente.id==Turno.agente_id, '
                            'Turno.tipo==1, Turno.numero==2)',
                            uselist=False)
    med_1 = db.relationship('Turno',
                            primaryjoin='and_(Agente.id==Turno.agente_id, '
                            'Turno.tipo==2, Turno.numero==1)',
                            uselist=False)
    med_2 = db.relationship('Turno',
                            primaryjoin='and_(Agente.id==Turno.agente_id, '
                            'Turno.tipo==2, Turno.numero==2)',
                            uselist=False)

    def __repr__(self):
        return "Agente {apellido}, {nombre} (DNI: {dni})".format(
            apellido=self.apellido, nombre=self.nombre, dni=self.dni)

    @classmethod
    def con_turnos(cls, **kwargs):
        """Factory method que devuelve una instancia de Agente con turnos

        Este método devuelve un agente con cuatro turnos, dos de cada tipo,
        de modo tal que luego, al editar el agente, el guardado pueda ser
        realizado sin necesidad de crear/eliminar turnos según los cambios
        del formulario.
        """
        agente = cls(**kwargs)
        turnos = [
            Turno(tipo=1, numero=1, fecha=None, ausente=False),
            Turno(tipo=1, numero=2, fecha=None, ausente=False),
            Turno(tipo=2, numero=1, fecha=None, ausente=False),
            Turno(tipo=2, numero=2, fecha=None, ausente=False)
        ]
        agente.turnos.extend(turnos)
        return agente
Ejemplo n.º 5
0
class Rol(db.Model):
    __tablename__ = 'roles'
    id = db.Column(db.Integer, primary_key=True)
    nombre = db.Column(db.String(32), unique=True)
    default = db.Column(db.Boolean, default=False, index=True)
    permisos = db.Column(db.Integer)
    usuarios = db.relationship('Usuario', backref='rol', lazy='dynamic')

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        if self.permisos is None:
            self.permisos = 0

    def __repr__(self):
        return "<Rol {}>".format(self.nombre)

    def agregar_permisos(self, *permisos):
        """Método para asignar permisos a un rol

        Se pueden pasar uno o más permisos a la vez para asignar.
        """
        for permiso in permisos:
            if not self.tiene_permiso(permiso):
                self.permisos += permiso

    def quitar_permisos(self, *permisos):
        """Método para quitar permisos a un rol

        Se pueden pasar uno o más permisos a la vez para quitar.
        """
        for permiso in permisos:
            if self.tiene_permiso(permiso):
                self.permisos -= permiso

    def reiniciar_permisos(self):
        """Método para reiniciar los permisos

        Al invocarse este método los permisos de la instancia de esta
        clase se vuelven a 0 (sin permisos).
        """
        self.permisos = 0

    def tiene_permiso(self, permiso):
        """Método para verificar si un rol tiene un permiso
        """
        return self.permisos & permiso == permiso

    @staticmethod
    def insertar_roles():
        """Método estático para insertar roles en la base de datos
        """
        roles = {
            'CARGA_AGENTES': [Permiso.VER_AGENTES, Permiso.CREAR_AGENTE],
            'EDITA_AGENTES':
            [Permiso.VER_AGENTES, Permiso.CREAR_AGENTE, Permiso.EDITAR_AGENTE],
            'ADMIN': [
                Permiso.VER_AGENTES, Permiso.CREAR_AGENTE,
                Permiso.EDITAR_AGENTE, Permiso.ADMIN
            ]
        }
        rol_por_defecto = 'CARGA_AGENTES'
        for r in roles:
            rol = Rol.query.filter_by(nombre=r).first()
            if rol is None:
                rol = Rol(nombre=r)
            rol.reiniciar_permisos()
            rol.agregar_permisos(*roles[r])
            rol.default = (rol.nombre == rol_por_defecto)
            db.session.add(rol)
        db.session.commit()