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
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])
|