from sqlalchemy import Boolean, Column, DateTime, ForeignKey, Integer, String
from sqlalchemy.dialects.postgresql import CIDR
from sqlalchemy.orm import relationship, backref
from . import db
from . import login
from flask_login import UserMixin
from flask import redirect, url_for, flash
class User(db.Model, UserMixin):
id = Column(String, primary_key=True)
email = Column(String, unique=True, nullable=False)
password = Column(String, nullable=False)
pref_name = Column(String, nullable=False)
last_login = Column(DateTime, nullable=False)
active = Column(Boolean, nullable=False)
is_admin = Column(Boolean, nullable=False, default=False)
roles = relationship('Role', secondary='roles_users',backref=backref('users', lazy='dynamic'))
peers = relationship('Peer', backref='owner', lazy=True)
networks = relationship('Network', backref="manager", lazy=True)
def __repr__(self):
return f"<User {email}>"
def __str__(self):
return self.pref_name
class Role(db.Model):
id = Column(String, primary_key=True)
name = Column(String, unique=True)
description = Column(String)
class RolesUsers(db.Model):
__tablename__ = "roles_users"
id = Column(Integer(), primary_key=True)
user_id = Column('user_id', String(), ForeignKey('user.id'))
role_id = Column('role_id', String(), ForeignKey('role.id'))
@login.user_loader
def load_user(user_id):
return User.query.filter_by(id=user_id).first()
@login.unauthorized_handler
def unauth():
flash("Please log in first")
return redirect(url_for("auth.login"))
class Peer(db.Model):
id = Column(String, primary_key=True)
addr = Column(CIDR, nullable=False)
public_key = Column(String, nullable=False)
description = Column(String, nullable=False)
owner_id = Column(String, ForeignKey('user.id'), nullable=False)
class Network(db.Model):
id = Column(String, primary_key=True)
subnet = Column(CIDR, nullable=False, unique=True)
description = Column(String, nullable=True)
manager_id = Column(String, ForeignKey('user.id'), nullable=False)
def __repr__(self):
return f"{self.description} ({self.subnet})"
def __str__(self):
return f"{self.description} ({self.subnet})"
class EnrollRequest(db.Model):
id = Column(String, primary_key=True)
user = Column(String, ForeignKey('user.id'), nullable=False)
expires = Column(DateTime, nullable=False)