from sqlalchemy import Column, Integer, String, Boolean, ForeignKey, Table, exists from sqlalchemy.orm import relationship import hashlib from db import Model, db_endine, session import uuid from validators import domain as domain_validator groups_domains = Table( 'groups_domains', Model.metadata, Column('domain_id', Integer, ForeignKey('domain_groups.id')), Column('group_id', Integer, ForeignKey('domains.id')) ) class DomainGroup(Model): __tablename__ = 'domain_groups' id = Column(Integer, primary_key=True) name = Column(String(200), nullable=False) domains = relationship("Domain", secondary=groups_domains, back_populates="groups") def __init__(self, name): self.name = name def __repr__(self): return "".format(self.id, self.name) @classmethod def from_json(cls, data): return cls(**data) class Domain(Model): __tablename__ = 'domains' id = Column(Integer, primary_key=True) domain = Column(String(200), nullable=False) domains = relationship("DomainGroup", secondary=groups_domains, back_populates="domains") def __init__(self, domain): self.validate_domain(domain) self.domain = domain def validate_domain(self, domain=None): domain = domain or self.domain return domain_validator(domain, raise_errors=True) def __repr__(self): return "".format(self.id, self.domain) @classmethod def from_json(cls, data): return cls(**data) class User(Model): __tablename__ = 'users' id = Column(Integer, primary_key=True) username = Column(String(50), unique=True) token = Column(String(250), default='Unknown') is_active = Column(Boolean, default=False) def __init__(self, username: str): self.username = username m = hashlib.sha256() m.update('{}{}'.format(username, uuid.uuid4()).encode('utf-8')) self.token = m.hexdigest() @classmethod def validate(cls, username, token): return session.query(cls).filter(cls.username == username, cls.token == token).count() == 1 def __repr__(self): return "" % (self.name, self.fullname, self.password) Model.metadata.create_all(db_endine)