You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

82 lines
3.8 KiB

from flask_sqlalchemy import SQLAlchemy
from flask_login import UserMixin
from werkzeug.security import generate_password_hash, check_password_hash
from datetime import datetime
db = SQLAlchemy()
class User(UserMixin, db.Model):
__tablename__ = 'user'
__table_args__ = {'mysql_charset': 'utf8mb4', 'mysql_collate': 'utf8mb4_unicode_ci'}
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True, nullable=False, index=True)
email = db.Column(db.String(120), unique=True, nullable=False, index=True)
password_hash = db.Column(db.String(256), nullable=False)
is_admin = db.Column(db.Boolean, default=False)
is_active = db.Column(db.Boolean, default=True)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
emails_received = db.relationship('Email', foreign_keys='Email.recipient_id', backref='recipient', lazy='dynamic')
emails_sent = db.relationship('Email', foreign_keys='Email.sender_id', backref='sender', lazy='dynamic')
def set_password(self, password):
self.password_hash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password_hash, password)
class Email(db.Model):
__tablename__ = 'email'
__table_args__ = {'mysql_charset': 'utf8mb4', 'mysql_collate': 'utf8mb4_unicode_ci'}
id = db.Column(db.Integer, primary_key=True)
sender_id = db.Column(db.Integer, db.ForeignKey('user.id'), index=True)
recipient_id = db.Column(db.Integer, db.ForeignKey('user.id'), index=True)
sender_address = db.Column(db.String(120), nullable=False)
recipient_address = db.Column(db.String(120), default='')
subject = db.Column(db.String(256), default='')
body = db.Column(db.Text(65535), default='')
raw_data = db.Column(db.Text(65535))
created_at = db.Column(db.DateTime, default=datetime.utcnow, index=True)
is_read = db.Column(db.Boolean, default=False)
is_deleted = db.Column(db.Boolean, default=False, index=True)
is_draft = db.Column(db.Boolean, default=False, index=True)
is_starred = db.Column(db.Boolean, default=False, index=True)
class EmailFilter(db.Model):
__tablename__ = 'email_filter'
__table_args__ = {'mysql_charset': 'utf8mb4', 'mysql_collate': 'utf8mb4_unicode_ci'}
id = db.Column(db.Integer, primary_key=True)
filter_type = db.Column(db.String(20), nullable=False) # 'email' or 'ip'
value = db.Column(db.String(120), nullable=False)
action = db.Column(db.String(20), default='block') # 'block' or 'allow'
created_at = db.Column(db.DateTime, default=datetime.utcnow)
class Log(db.Model):
__tablename__ = 'log'
__table_args__ = {'mysql_charset': 'utf8mb4', 'mysql_collate': 'utf8mb4_unicode_ci'}
id = db.Column(db.Integer, primary_key=True)
level = db.Column(db.String(20), default='INFO', index=True)
message = db.Column(db.Text(65535), nullable=False)
source = db.Column(db.String(50))
ip_address = db.Column(db.String(45))
created_at = db.Column(db.DateTime, default=datetime.utcnow, index=True)
class Contact(db.Model):
__tablename__ = 'contact'
__table_args__ = {'mysql_charset': 'utf8mb4', 'mysql_collate': 'utf8mb4_unicode_ci'}
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False, index=True)
contact_user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
name = db.Column(db.String(64), nullable=False)
email = db.Column(db.String(120), nullable=False)
note = db.Column(db.String(256), default='')
created_at = db.Column(db.DateTime, default=datetime.utcnow)
owner = db.relationship('User', foreign_keys=[user_id], backref='contacts')
contact_user = db.relationship('User', foreign_keys=[contact_user_id])