class Product(db.Model): __tablename__ = 'product' ProductId = db.Column(db.Integer, primary_key=True, nullable=False) ProductName = db.Column(db.String(255)) Thumbnail = db.Column(db.String(255)) ModelID = db.Column(db.Integer)
class Hub(BaseModel): """ Appium hub """ __tablename__ = "hubs" id = db.Column(db.Integer, primary_key=True) # pk name = db.Column(db.String(100), nullable=False) # hub name url = db.Column(db.String(100), nullable=False) # hub url port = db.Column(db.Integer, nullable=False) # hub port path = db.Column(db.String(100), nullable=False) # hub path status = db.Column(db.Integer, nullable=False) # hub status 0: available, 1: unavailable created_time = Column(DateTime, default=datetime.datetime.utcnow) updated_time = Column(DateTime, default=datetime.datetime.utcnow) def __init__(self, name, url, port, path, *args, **kwargs): self.name = name self.url = url self.port = port self.path = path self.status = 1 self.created_time = datetime.datetime.now() self.updated_time = datetime.datetime.now() if kwargs and kwargs['id']: self.id = kwargs['id'] @staticmethod def all_hubs(): """ Get all hubs. :return: """ return Hub.query.order_by(Hub.id.desc()).all()
class RequestsThemesModel(db.Model): __tablename__ = 'request_themes' id = db.Column(db.Text(length=36), default=lambda: str(uuid.uuid4()), primary_key=True) tag = db.Column(db.String(80), unique=True, nullable=False) requests = db.relationship("RequestModel", lazy="dynamic", cascade="all, delete-orphan") @classmethod def find_by_id(cls, _id: int) -> "RequestsThemesModel": return cls.query.filter_by(id=_id).first() @classmethod def find_by_tag(cls, tag: str) -> "RequestsThemesModel": return cls.query.filter_by(tag=tag).first() def turn_to_json(self) -> dict: return { "id": self.id, "tag": self.tag, "requests": [request.turn_to_json() for request in self.requests.all()] } def save_to_db(self): db.session.add(self) db.session.commit() def delete_from_db(self): db.session.delete(self) db.session.commit()
class Game(db.Model): id = db.Column(db.Integer, primary_key=True) #accessname = db.Column(db.String(255), unique=True, nullable=True) status = db.Column(db.Integer, default=0) #1 if active, 0 if not active game_type_id = db.Column( db.Integer, db.ForeignKey("game_type.id", ondelete="SET NULL")) host_id = db.Column( db.Integer, db.ForeignKey( "player.id", ondelete="SET NULL")) #One of the players has to be a host tournament_id = db.Column( db.Integer, db.ForeignKey( "tournament.id", ondelete="SET NULL")) #Being part of a tournament is optional game_token = db.Column(db.String(20), unique=True, nullable=False) created_at = db.Column(db.DateTime, nullable=False, default=func.now()) finished_at = db.Column(db.DateTime) #Relationships to other models game_type = db.relationship("GameType", back_populates="game") host = db.relationship("Player", back_populates="game") scores = db.relationship("PlayerScore", cascade="all, delete-orphan", back_populates="game") tournament = db.relationship("Tournament", back_populates="game")
class Post(BaseModel): __tablename__ = "posts" id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=True) title = db.Column(db.String(100), nullable=False) content = db.Column(db.Text, nullable=False) views = db.Column(db.Integer, nullable=False) status = db.Column(db.Integer, nullable=False) created_time = db.Column(UTCDateTime(timezone=True), default=time_utcnow, nullable=False) updated_time = db.Column(UTCDateTime(timezone=True), default=time_utcnow, nullable=False) def __init__(self, user_id, title, content, *args, **kwargs): self.user_id = user_id self.title = title self.content = content self.views = 0 self.status = 1 self.created_time = datetime.now() self.updated_time = datetime.now() if kwargs and kwargs['id']: self.id = kwargs['id'] @classmethod def get_post(cls, post_id): post = cls.query.get(post_id) return post
class Email(db.Model): """ Email Model """ id = db.Column(db.Integer, unique=True, primary_key=True, autoincrement=True) email = db.Column(db.String(250), nullable=True, unique=True) contact_id = db.Column(db.Integer, db.ForeignKey('contact.id'))
class Tournament(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(255), unique=True, nullable=False) status = db.Column(db.Integer, default=0) created_at = db.Column(db.DateTime, nullable=False, default=func.now()) finished_at = db.Column(db.DateTime) game = db.relationship("Game", back_populates="tournament")
class Contact(db.Model): """ Contact Model """ id = db.Column(db.Integer, unique=True, primary_key=True, autoincrement=True) username = db.Column(db.String(50), nullable=False, unique=True) first_name = db.Column(db.String(250), nullable=False) last_name = db.Column(db.String(250), nullable=False) date_created = db.Column(db.DateTime(), nullable=False) emails = db.relationship('Email', backref='contact', cascade='all, delete, delete-orphan', single_parent=True) def __repr__(self): return f"<Contact(username='******')>"
class Bill(db.Model): __tablename__ = 'bill' BillId = db.Column(db.Integer, primary_key=True, nullable=False) Type = db.Column(db.Integer) TotalMoney = db.Column(db.Float) Description = db.Column(db.String(1000)) Datetime = db.Column(db.DateTime()) Weather = db.Column(db.Integer) Temperature = db.Column(db.Integer)
class RequestModel(db.Model): __tablename__ = "requests" id = db.Column(db.Integer, nullable=False, primary_key=True) theme = db.Column(db.String(80), nullable=False) body = db.Column(db.String(190), nullable=False) # creator = db.relationship( # "UserModel", # lazy="dynamic", # cascade="all, delete-orphan" # ) # executor = db.relationship( # "UserModel", # lazy="dynamic", # cascade="all, delete-orphan" # ) status = db.Column(db.Integer, nullable=False) @classmethod def find_by_id(cls, _id: int) -> "RequestModel": return cls.query.filter_by(id=_id).first() @classmethod def find_by_theme(cls, theme: str) -> "RequestModel": return cls.query.filter_by(theme=theme).first() def turn_to_json(self): return { "id": self.id, "theme": self.theme, "body": self.body, "status": self.status } def save_to_db(self): db.session.add(self) db.session.commit() def delete_from(self): db.session.delete(self) db.session.commit()
class GameType(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(255), unique=True, nullable=False) max_players = db.Column(db.Integer) min_players = db.Column(db.Integer) #Relationships to other models game = db.relationship("Game", back_populates="game_type") lboard = db.relationship("Leaderboard", cascade="all, delete-orphan", back_populates="game_type")
class RequestModel(db.Model): __tablename__ = "requests" id = db.Column(db.Text(length=36), default=lambda: str(uuid.uuid4()), primary_key=True) theme = db.Column(db.Text, db.ForeignKey("request_themes.id")) title = db.Column(db.String(80), nullable=False) body = db.Column(db.String(190), nullable=False) creator = db.Column(db.Text(length=36), db.ForeignKey("users.id"), nullable=False) # executor = db.Column(db.Text(length=36), db.ForeignKey("users.id"), nullable=True) status = db.Column(db.Integer, nullable=False) @classmethod def find_by_id(cls, _id: int) -> "RequestModel": return cls.query.filter_by(id=_id).first() @classmethod def find_by_theme(cls, theme: str) -> "RequestModel": return cls.query.filter_by(theme=theme).first() def turn_to_json(self) -> dict: return { "id": self.id, "theme": self.theme, "title": self.title, "body": self.body, "status": self.status, "creator": self.creator } def save_to_db(self): db.session.add(self) db.session.commit() def delete_from(self): db.session.delete(self) db.session.commit()
class Device(BaseModel): """ Devices """ __tablename__ = "devices" id = db.Column(db.Integer, primary_key=True) # pk hub_id = db.Column(db.Integer, db.ForeignKey("hubs.id"), nullable=False) # fk: hub_id name = db.Column(db.String(100), nullable=False) # device name device_type = db.Column(db.Integer, nullable=False) # device type 0: simulator, 1: real device platform = db.Column(db.String(100), nullable=False) # platform: iOS/Android model = db.Column(db.String(100), nullable=False) # device model platform_version = db.Column(db.String(100), nullable=False) # platform version api_level = db.Column(db.String(100), nullable=False) # api level (only for Android) status = db.Column(db.Integer, nullable=False) # device status 0: available, 1: unavailable created_time = Column(DateTime, default=datetime.datetime.utcnow) updated_time = Column(DateTime, default=datetime.datetime.utcnow) def __init__(self, hub_id, name, device_type, platform, model, platform_version, api_level, *args, **kwargs): self.hub_id = hub_id self.name = name self.device_type = device_type self.platform = platform self.model = model self.platform_version = platform_version self.api_level = api_level self.status = 0 self.created_time = datetime.datetime.now() self.updated_time = datetime.datetime.now() if kwargs and kwargs['id']: self.id = kwargs['id'] @staticmethod def all_devices(): """ Get all devices. :return: """ return Device.query.order_by(Device.id.desc()).all()
class Pool(db.Model): id = db.Column(db.Integer, primary_key=True) timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow) tx1 = db.Column(db.JSON) tx2 = db.Column(db.JSON) tx3 = db.Column(db.JSON) tx4 = db.Column(db.JSON) tx5 = db.Column(db.JSON) tx6 = db.Column(db.JSON) tx7 = db.Column(db.JSON) tx8 = db.Column(db.JSON) tx9 = db.Column(db.JSON) tx10 = db.Column(db.JSON) winner = db.Column(db.String(50)) topbid = db.Column(db.VARCHAR(length=36)) poolval = db.Column(db.VARCHAR(length=60)) def __repr__(self): return '<Pool {}>'.format(self.body)
class CustomerModel(db.Model): # type: ignore # pylint: disable=no-member __tablename__ = 'customers' id = db.Column(db.Integer, primary_key=True, autoincrement=True) name = db.Column(db.String(256), nullable=False) created_at = db.Column(db.DateTime, default=datetime.utcnow) updated_at = \ db.Column(db.DateTime, onupdate=datetime.utcnow, nullable=True) deleted = db.Column(db.Boolean, default=False, nullable=False) wallet = relationship( 'WalletModel', cascade='all, delete-orphan', backref='customer', uselist=False, ) def __init__(self, **kwargs): super().__init__(**kwargs) self.wallet = WalletModel(amount=0)
class ConfirmationModel(db.Model): __tablename__ = 'confirmations' id = db.Column(db.String(50), primary_key=True) expire_at = db.Column(db.Integer, nullable=False) confirmed = db.Column(db.Boolean, nullable=False) user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False) user = db.relationship("UserModel") def __init__(self, user_id: int, **kwargs): super().__init__(**kwargs) self.user_id = user_id self.id = uuid4().hex self.expire_at = int(time.time()) + EXPIRATION_DELTA self.confirmed = False @property def expired(self) -> bool: return time.time() > self.expire_at def force_to_expire(self) -> None: if not self.expired: self.expire_at = time.time() self.save_to_db() @classmethod def find_by_id(cls, _id: str) -> "ConfirmationModel": return cls.query.filter_by(id=_id).first() def save_to_db(self) -> None: db.session.add(self) db.session.commit() def delete_from_db(self) -> None: db.session.add(self) db.session.commit()
class Queue(db.Model): id = db.Column(db.Integer, primary_key=True) timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow) addresses = db.Column(db.String(500), unique=True) tx = db.Column(db.JSON) bid = db.Column(db.VARCHAR(length=36))
class User(db.Model): # noqa: WPS230 __tablename__ = 'users' __table_args__ = {'extend_existing': True} def __init__( # noqa: S107 WPS211 self, login: str, email: str, password: str = '', firstname: str = '', middlename: str = '', lastname: str = '', image: bytes = '', github_id: str = None, is_oauth: bool = False, is_superuser: bool = False, is_aproved: bool = False, ): self.login = login self.password = password self.email = email self.firstname = firstname self.middlename = middlename self.lastname = lastname self.image = image self.github_id = github_id self.is_oauth = is_oauth self.is_superuser = is_superuser self.is_aproved = is_aproved id = db.Column(db.Integer, primary_key=True) # noqa: A003 login = db.Column(db.String(), unique=True) password = db.Column(db.String()) email = db.Column(db.String(), unique=True) firstname = db.Column(db.String(), nullable=True) middlename = db.Column(db.String(), nullable=True) lastname = db.Column(db.String(), nullable=True) image = db.Column(db.String(), nullable=True) github_id = db.Column(db.String(), nullable=True) is_oauth = db.Column(db.Boolean, default=False, nullable=False) is_superuser = db.Column(db.Boolean, default=False, nullable=False) is_aproved = db.Column(db.Boolean, default=False, nullable=True) db.relationship( # noqa: WPS604 'User', backref='users', lazy='dynamic', ) question_relation = db.relationship( 'TestQuestionUserRelation', back_populates='user', ) def __str__(self): return '{0} <id {1}>'.format(self.login, self.id) def avatar(self, size): if self.image is None: image_str = self.email User.query.filter_by(id=self.context['auth'].user.id).update( {'image': self.email}) db.session.commit() else: image_str = self.image digest = md5(image_str.encode('utf-8')).hexdigest() return f'https://www.gravatar.com/avatar/{digest}?d=identicon&s={size}' def __repr__(self): return '<id {0}>'.format(self.id) @classmethod def hash_password(cls, password: str): return generate_password_hash(password=password) def check_password(self, password): if not self.password: return False return check_password_hash(self.password, password) def get_token_for_mail_aproved(self, expires_in=600): """Функция генерации токена. Она нужна для подтверждения регистрации пользователя через электронную почту expires_in - время действия токена в секундах """ return jwt.encode({ 'user_id': self.id, 'exp': time() + expires_in }, junior_app.config['SECRET_KEY'], algorithm='HS256').decode('utf-8') @classmethod def verify_token_for_mail_aproved(cls, token): """Функция для проверки токена. Она нужна для подтверждения пользователя через электронную почту """ try: user_id = jwt.decode( token, junior_app.config['SECRET_KEY'], algorithms=['HS256'], )['user_id'] except jwt.ExpiredSignatureError: flash('Ссылка устарела') return redirect(url_for('auth.login')) try: user = User.query.get(user_id) except User.DoesNotExist(): return None user.is_aproved = True return user
class User(BaseModel): __tablename__ = "users" id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(100), nullable=False) password_hash = db.Column(db.Text, nullable=False) email = db.Column(db.String(200), unique=True, nullable=False) gender = db.Column(db.Integer, nullable=False) desc = db.Column(db.Text, nullable=False) credit = db.Column(db.Integer, nullable=False) role = db.Column(db.String(20), nullable=False) status = db.Column(db.Integer, nullable=False) created_time = db.Column(UTCDateTime(timezone=True), default=time_utcnow, nullable=False) updated_time = db.Column(UTCDateTime(timezone=True), default=time_utcnow, nullable=False) posts = db.relationship("Post", backref="user", lazy="dynamic") def __init__(self, username, password_hash, email, gender, *args, **kwargs): self.username = username self.password_hash = password_hash self.email = email self.gender = gender self.desc = '' self.credit = 0 self.role = 'user' self.status = 1 self.created_time = datetime.now() self.updated_time = datetime.now() if kwargs and kwargs['id']: self.id = kwargs['id'] # Properties @property def is_active(self): """ 用户状态是否有效 :return: """ return self.status == 1 @property def is_admin(self): """ 用户是否是管理员 :return: """ return self.role == 'admin' @classmethod def authenticate(cls, username, password): """ 用户认证 :param username: :param password: :return: """ session = db_session() user = session.query(User).filter_by(username=username).first() if user and user._verify_password(password): return user return None def all_posts(self): return Post.query.\ filter(Post.user_id == self.id).\ order_by(Post.id.desc()).all() def get_id(self): return self.id def _verify_password(self, password): """ 验证用户密码 :param password: :return: """ return check_password_hash(self.password_hash, password)
class Post(db.Model): __tablename__ = 'posts' id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(128), nullable=False) description = db.Column(db.Text, nullable=False) contents = db.Column(db.Text, nullable=False) tags = db.Column(ARRAY(db.String)) comments = db.relationship( 'Comment', backref='post', lazy='dynamic', cascade='save-update, merge, delete, delete-orphan') owner_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) favorited_by = db.relationship( 'User', secondary=favorites_assoc, backref=db.backref('favorites', lazy='dynamic'), # Eager load the users who favorited this post using an # additional SELECT IN query lazy='selectin') created_at = db.Column(db.DateTime, nullable=False, default=dt.datetime.now) modified_at = db.Column(db.DateTime, nullable=False, default=dt.datetime.now) def save(self): self.modified_at = dt.datetime.now() db.session.add(self) db.session.commit() def update(self, **kwargs): for attr, value in kwargs.items(): setattr(self, attr, value) self.save() def delete(self): db.session.delete(self) db.session.commit() def favorite(self, user): self.favorited_by.append(user) self.save() def unfavorite(self, user): try: self.favorited_by.remove(user) self.save() except ValueError: pass @staticmethod def get_all(): return Post.query.all() @staticmethod def get_one(_id): return Post.query.get(_id) @hybrid_property def favorites_count(self): return len(self.favorited_by) def __repr__(self): return f"<id {self.id}>"
class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(128), nullable=False) bio = db.Column(db.String(300), nullable=True) username = db.Column(db.String(128), nullable=False, unique=True) email = db.Column(db.String(128), unique=True, nullable=False) password = db.Column(db.String(128), nullable=True) avatar = db.Column(db.String(300), nullable=True) posts = db.relationship( 'Post', # Eager load the author of each post using an INNER JOIN # NOTE: joined loading is more commonly used to load # many-to-one not null relationships, not collections backref=db.backref('author', lazy='joined', innerjoin=True), lazy='dynamic') comments = db.relationship( 'Comment', # Eager load the author of each comment using an INNER JOIN backref=db.backref('author', lazy='joined', innerjoin=True), lazy=True) created_at = db.Column(db.DateTime, nullable=False, default=dt.datetime.now) modified_at = db.Column(db.DateTime, nullable=False, default=dt.datetime.now) def __init__(self, name, username, email, password, bio='', avatar=''): self.name = name self.email = email self.username = username self.bio = bio self.avatar = avatar self.set_password(password) def save(self): self.modified_at = dt.datetime.now() db.session.add(self) db.session.commit() def update(self, **kwargs): for attr, value in kwargs.items(): if attr == 'password': self.set_password(value) else: setattr(self, attr, value) self.save() def delete(self): db.session.delete(self) db.session.commit() @staticmethod def get_all(): return User.query.all() @staticmethod def get_one(_id): return User.query.get(_id) @staticmethod def get_by_email(email): return User.query.filter_by(email=email).first() @staticmethod def get_by_username(username): return User.query.filter_by(username=username).first() @property def picture(self): if self.avatar: return url_for('static', filename=f"uploads/{self.avatar}", _external=True) return None def set_password(self, password): self.password = bcrypt.generate_password_hash( password, rounds=10).decode('utf-8') def check_hash(self, password): return bcrypt.check_password_hash(self.password, password) def __repr__(self): return f"<id {self.id}>"
class User(db.Model): # noqa: WPS230 __tablename__ = 'users' __table_args__ = {'extend_existing': True} def __init__( # noqa: S107 WPS211 self, login: str, email: str, password: str = '', firstname: str = '', middlename: str = '', lastname: str = '', image: str = '', gravatar: str = '', github_id: str = None, yandex_id: str = None, is_oauth: bool = False, is_superuser: bool = False, is_aproved: bool = False, ): self.login = login self.password = password self.email = email self.firstname = firstname self.middlename = middlename self.lastname = lastname self.image = image self.gravatar = gravatar self.github_id = github_id self.yandex_id = yandex_id self.is_oauth = is_oauth self.is_superuser = is_superuser self.is_aproved = is_aproved id = db.Column(db.Integer, primary_key=True) # noqa: A003 login = db.Column(db.String(), unique=True) password = db.Column(db.String()) email = db.Column(db.String(), unique=True) firstname = db.Column(db.String(), nullable=True) middlename = db.Column(db.String(), nullable=True) lastname = db.Column(db.String(), nullable=True) image = db.Column(db.String(), default=email, nullable=True) gravatar = db.Column( db.Enum('gravatar', 'face', ''), default='gravatar', name='avatar_type', nullable=True, ) github_id = db.Column(db.String(), nullable=True) yandex_id = db.Column(db.String(), nullable=True) is_oauth = db.Column(db.Boolean, default=False, nullable=False) is_superuser = db.Column(db.Boolean, default=False, nullable=False) is_aproved = db.Column(db.Boolean, default=False, nullable=True) db.relationship( # noqa: WPS604 'User', backref='users', lazy='dynamic', ) question_relation = db.relationship( 'TestQuestionUserRelation', back_populates='user', ) answer_relation = db.relationship( 'AnswerUsersRelations', back_populates='user', ) answers = db.relationship('Answer', back_populates='users', uselist=False) def __str__(self): return '{0} <id {1}>'.format(self.login, self.id) def avatar(self, size): # если нет строки с картинкой, используется email # и обновляется БД - теперь в картинке email if self.image is None: image_str = self.email User.query.filter_by(id=session['auth'].user.id).update( {'image': self.email}) db.session.commit() else: image_str = self.image if not self.gravatar or self.gravatar == 'gravatar': digest = md5(image_str.encode('utf-8')).hexdigest() image_str = f'{os.getenv("GRAVATAR_API")}{digest}?d=identicon&s={size}' if self.gravatar == 'face': image_str = f'{os.getenv("FACE_API")}{size}/{self.image}.png' return image_str def __repr__(self): return '<id {0}>'.format(self.id) @classmethod def hash_password(cls, password: str): return generate_password_hash(password=password) def check_password(self, password): if not self.password: return False return check_password_hash(self.password, password) def get_token_for_mail_aproved(self, expires_in=600): """Функция генерации токена. Она нужна для подтверждения регистрации пользователя через электронную почту expires_in - время действия токена в секундах """ return jwt.encode({ 'user_id': self.id, 'exp': time() + expires_in }, junior_app.config['SECRET_KEY'], algorithm='HS256').decode('utf-8') def get_oauth_dict(self): """Возвращает словарь сервисов OAuth, связанных с аккаунтом. Если не связан, то в качестве ключа пустота. """ backends = dict() user_data = self.__dict__ for backend in junior_app.config['OAUTH_BACKEND']: backends[backend] = user_data.get(f'{backend}_id', False) return backends @classmethod def verify_token_for_mail_aproved(cls, token): """Функция для проверки токена. Она нужна для подтверждения пользователя через электронную почту """ try: user_id = jwt.decode( token, junior_app.config['SECRET_KEY'], algorithms=['HS256'], )['user_id'] except jwt.ExpiredSignatureError: flash('Ссылка устарела') return redirect(url_for('auth.login')) try: user = User.query.get(user_id) except User.DoesNotExist(): return None user.is_aproved = True return user
class User(db.Model): id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(500), unique=True)
class UserModel(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), nullable=False, unique=True, index=True) name = db.Column(db.String(80)) surname = db.Column(db.String(80)) profile_pic = db.Column(db.String(64), nullable=False, default="gg_default_profile_pic.png") locality = db.Column(db.String(120)) password = db.Column(db.String(80), nullable=False) email = db.Column(db.String(120), nullable=False, unique=True) sha_private = db.Column(db.String(256), nullable=False) # just for development balance = db.Column(db.Integer, default=0) second_fa_enabled = db.Column(db.Boolean, nullable=False, default=False) # MAY BE NOT PRODUCTION IMPLEMENTING token_2fa = db.Column(db.String(120)) confirmation = db.relationship( "ConfirmationModel", lazy="dynamic", cascade="all, delete-orphan" ) @property def most_recent_confirmation(self) -> "ConfirmationModel": return self.confirmation.order_by(db.desc(ConfirmationModel.expire_at)).first() def turn_to_json(self): return {"username": self.username, "id": self.id, "locality": self.locality, "profile_pic": self.profile_pic } @classmethod def find_by_id(cls, _id: int) -> "UserModel": return cls.query.get(_id) @classmethod def find_by_email(cls, email: str) -> "UserModel": return cls.query.filter_by(email=email).first() @classmethod def find_by_username(cls, username: str) -> "UserModel": return cls.query.filter_by(username=username).first() @classmethod # TODO: TESTING VERSION MAYBE def find_by_token_2fa(cls, token: str) -> "UserModel": return cls.query.filter_by(token_2fa=token).first() @classmethod def find_by_sha_token(cls, token: str) -> "UserModel": return cls.query.filter_by(sha_private=token).first() @classmethod def find_by_locality(cls, locality: str): pass def confirm(self) -> Response: link = request.url_root[0:-1] + url_for( "confirmation", confirmation_id=self.most_recent_confirmation.id ) subject = f"{response_quote('user_registration_confirmation_subject')}" text = f"{response_quote('user_registration_confirmation_text')} {link}" html = f'<html>{response_quote("user_registration_confirmation_text")}: <a href="{link}">{link}</a></html>' return MailGun.send_email_message([self.email], subject, text, html) def send_email_2fa_code(self, code: str) -> Response: subject = response_quote("email2fa_code_mail_subject") text = response_quote("email2fa_code_mail_text") html = f'<html>' \ f'{response_quote("email2fa_code_mail_text").format(EmailSecondFA.token_expiration_delta().seconds // 60)} ' \ f'<h4>{code}</h4></html>' return MailGun.send_email_message([self.email], subject, text, html) def save_to_db(self) -> None: db.session.add(self) db.session.commit() def delete_from_db(self) -> None: db.session.delete(self) db.session.commit()