63 lines
2.3 KiB
Python
63 lines
2.3 KiB
Python
from datetime import datetime
|
|
from enum import Enum
|
|
from flask_sqlalchemy import SQLAlchemy
|
|
from flask_login import UserMixin
|
|
from werkzeug.security import generate_password_hash, check_password_hash
|
|
from app.config.database import db
|
|
|
|
|
|
class UserRole(Enum):
|
|
"""User role enumeration for role-based access control."""
|
|
|
|
VIEWER = "viewer"
|
|
USER = "user"
|
|
ADMIN = "admin"
|
|
|
|
|
|
class User(UserMixin, db.Model):
|
|
"""User model for authentication and authorization."""
|
|
|
|
__tablename__ = "users"
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
username = db.Column(db.String(50), unique=True, nullable=False)
|
|
email = db.Column(db.String(100), unique=True, nullable=False)
|
|
password_hash = db.Column(db.String(255), nullable=False)
|
|
user_level = db.Column(db.String(20), nullable=False)
|
|
preferred_language = db.Column(db.String(5), default="en")
|
|
preferred_theme = db.Column(db.String(10), default="light")
|
|
created_at = db.Column(db.DateTime, default=datetime.utcnow)
|
|
last_login = db.Column(db.DateTime)
|
|
is_active = db.Column(db.Boolean, default=True)
|
|
|
|
# Relationships
|
|
user_projects = db.relationship("UserProject", backref="user", lazy=True)
|
|
user_script_tags = db.relationship("UserScriptTag", backref="user", lazy=True)
|
|
execution_logs = db.relationship("ExecutionLog", backref="user", lazy=True)
|
|
|
|
def set_password(self, password):
|
|
"""Set password hash."""
|
|
self.password_hash = generate_password_hash(password)
|
|
|
|
def check_password(self, password):
|
|
"""Check password against hash."""
|
|
return check_password_hash(self.password_hash, password)
|
|
|
|
def get_id(self):
|
|
"""Return user ID as string for Flask-Login."""
|
|
return str(self.id)
|
|
|
|
def to_dict(self):
|
|
"""Convert user to dictionary."""
|
|
return {
|
|
"id": self.id,
|
|
"username": self.username,
|
|
"email": self.email,
|
|
"user_level": self.user_level,
|
|
"preferred_language": self.preferred_language,
|
|
"preferred_theme": self.preferred_theme,
|
|
"created_at": self.created_at.isoformat() if self.created_at else None,
|
|
"last_login": self.last_login.isoformat() if self.last_login else None,
|
|
"is_active": self.is_active,
|
|
}
|