|
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 "<Domain group {}: {}>".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 "<Domain {}: {}>".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 "<User(name='%s', fullname='%s', password='%s')>" % (self.name, self.fullname, self.password)
|
|
|
|
|
|
Model.metadata.create_all(db_endine)
|