This commit is contained in:
2025-12-23 01:12:10 +03:00
parent 69706d0cb7
commit 6ec4bd00e2
22 changed files with 1923 additions and 175 deletions
+108
View File
@@ -1,7 +1,11 @@
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
import secrets
from argon2 import PasswordHasher
from argon2.exceptions import VerifyMismatchError
db = SQLAlchemy()
ph = PasswordHasher()
class MedodsAPI(db.Model):
@@ -67,6 +71,66 @@ class VkAPI(db.Model):
}
class UsersBirthdate(db.Model):
__tablename__ = "users_birthdate"
id = db.Column(db.Integer, primary_key=True)
enabled = db.Column(db.Boolean, default=True)
name = db.Column(db.Text)
short_name = db.Column(db.Text)
sex = db.Column(db.Text)
birthdate = db.Column(db.Date)
photo_link = db.Column(db.Text, nullable=True)
congratulations = db.Column(db.Text, nullable=True)
specialties = db.Column(db.JSON)
post_link = db.Column(db.Text, nullable=True)
publish_at = db.Column(db.DateTime, nullable=True)
created_at = db.Column(db.DateTime, default=datetime.now)
updated_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now)
def toDict(self):
return {
"id": self.id,
"enabled": self.enabled,
"name": self.name,
"shortName": self.short_name,
"sex": self.sex,
"birthdate": self.birthdate.strftime("%Y-%m-%d"),
"photoLink": self.photo_link,
"congratulations": self.congratulations,
"specialties": self.specialties,
"postLink": self.post_link,
"publishAt": (
self.publish_at.strftime("%Y-%m-%d %H:%M:%S")
if self.publish_at
else None
),
"created_at": self.created_at.strftime("%Y-%m-%d %H:%M:%S"),
"updated_at": self.updated_at.strftime("%Y-%m-%d %H:%M:%S"),
}
class BirthdateScheduler(db.Model):
__tablename__ = "birthdate_scheduler"
id = db.Column(db.Integer, primary_key=True)
hour = db.Column(db.Integer)
minute = db.Column(db.Integer)
enabled = db.Column(db.Boolean)
created_at = db.Column(db.DateTime, default=datetime.now)
updated_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now)
def toDict(self):
return {
"id": self.id,
"hour": self.hour,
"minute": self.minute,
"enabled": self.enabled,
"created_at": self.created_at.strftime("%Y-%m-%d %H:%M:%S"),
"updated_at": self.updated_at.strftime("%Y-%m-%d %H:%M:%S"),
}
class UsersMedods(db.Model):
__tablename__ = "users_medods"
@@ -138,3 +202,47 @@ class PostScheduler(db.Model):
"created_at": self.created_at.strftime("%Y-%m-%d %H:%M:%S"),
"updated_at": self.updated_at.strftime("%Y-%m-%d %H:%M:%S"),
}
class Protection(db.Model):
__tablename__ = "protection"
id = db.Column(db.Integer, primary_key=True)
password = db.Column(db.Text, nullable=False) # hash
token = db.Column(db.Text, nullable=False)
# =========================
# Пароль
# =========================
def set_password(self, raw_password: str) -> None:
"""
Хэширует и сохраняет пароль (Argon2)
"""
self.password = ph.hash(raw_password)
def verify_password(self, raw_password: str) -> bool:
"""
Проверяет пароль
"""
try:
return ph.verify(self.password, raw_password)
except VerifyMismatchError:
return False
# =========================
# Token
# =========================
def generate_token(self) -> str:
"""
Генерирует новый token и сохраняет его
"""
self.token = secrets.token_urlsafe(32)
return self.token
def verify_token(self, token: str) -> bool:
"""
Проверяет token
"""
return bool(token) and secrets.compare_digest(self.token, token)