/
Snikius
/
kanban
Обзор
Документация
Войти
/
Snikius
/
kanban
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
models.py
129 строк
5 KB
ssamushenkov
Integrate Kanban with Scalecar SSO
10 июл 2026, 18:10
10 июл 2026, 18:10
183f99f
Код
Авторство
О чём код?
from datetime import datetime, timezone import hashlib from flask_sqlalchemy import SQLAlchemy from flask_login import UserMixin from werkzeug.security import generate_password_hash, check_password_hash db = SQLAlchemy() class User(UserMixin, db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) login = db.Column(db.String(80), unique=True, nullable=False, index=True) name = db.Column(db.String(200), nullable=True) email = db.Column(db.String(254), nullable=True) password_hash = db.Column(db.String(256), nullable=False) created_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc)) # relationships created_tasks = db.relationship('Task', backref='creator', lazy='dynamic', foreign_keys='Task.creator_id') assigned_tasks = db.relationship('Task', backref='assignee', lazy='dynamic', foreign_keys='Task.assignee_id') comments = db.relationship('Comment', backref='author', lazy='dynamic') def set_password(self, password): method = 'scrypt' if hasattr(hashlib, 'scrypt') else 'pbkdf2:sha256' self.password_hash = generate_password_hash(password, method=method) def check_password(self, password): return check_password_hash(self.password_hash, password) class Column(db.Model): __tablename__ = 'columns' id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(200), nullable=False) color = db.Column(db.String(7), default='#6b7280') # hex color position = db.Column(db.Integer, default=0) created_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc)) tasks = db.relationship('Task', backref='column', lazy='dynamic', order_by='Task.position') def to_dict(self): return { 'id': self.id, 'title': self.title, 'color': self.color, 'position': self.position, } class Task(db.Model): __tablename__ = 'tasks' id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(300), nullable=False) description = db.Column(db.Text, default='') external_key = db.Column(db.String(80), unique=True, nullable=True, index=True) priority = db.Column(db.String(80), nullable=True) issue_type = db.Column(db.String(80), nullable=True) source_status = db.Column(db.String(120), nullable=True) parent_key = db.Column(db.String(80), nullable=True) creator_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) assignee_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=True) column_id = db.Column(db.Integer, db.ForeignKey('columns.id'), nullable=False) position = db.Column(db.Integer, default=0) created_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc)) updated_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc)) comments = db.relationship('Comment', backref='task', lazy='dynamic', order_by='Comment.created_at') attachments = db.relationship('Attachment', backref='task', lazy='dynamic') class Comment(db.Model): __tablename__ = 'comments' id = db.Column(db.Integer, primary_key=True) task_id = db.Column(db.Integer, db.ForeignKey('tasks.id'), nullable=False) author_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) text = db.Column(db.Text, nullable=False) created_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc)) updated_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc)) attachments = db.relationship('Attachment', backref='comment', lazy='dynamic') class Attachment(db.Model): __tablename__ = 'attachments' id = db.Column(db.Integer, primary_key=True) task_id = db.Column(db.Integer, db.ForeignKey('tasks.id'), nullable=False) comment_id = db.Column(db.Integer, db.ForeignKey('comments.id'), nullable=True) filename = db.Column(db.String(500), nullable=False) # stored filename original_filename = db.Column(db.String(500), nullable=False) content_type = db.Column(db.String(200), nullable=False) file_path = db.Column(db.String(1000), nullable=False) uploaded_by = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) created_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc)) uploader = db.relationship('User', backref='uploaded_attachments') class NotificationOutbox(db.Model): __tablename__ = 'notification_outbox' id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, nullable=False, index=True) task_id = db.Column(db.Integer, nullable=False, index=True) recipient_email = db.Column(db.String(254), nullable=False) subject = db.Column(db.String(500), nullable=False) body = db.Column(db.Text, nullable=False) attempts = db.Column(db.Integer, nullable=False, default=0) last_error = db.Column(db.String(1000), nullable=True) created_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc), index=True) sent_at = db.Column(db.DateTime, nullable=True, index=True) class SsoToken(db.Model): __tablename__ = 'sso_tokens' nonce = db.Column(db.String(64), primary_key=True) expires_at = db.Column(db.DateTime, nullable=False, index=True)