ajout d'un paneau admin
This commit is contained in:
@@ -92,4 +92,7 @@ from app.models.user_gamertag import UserGamertag
|
||||
from app.models.contract import Contract
|
||||
from app.models.team_note import TeamNote
|
||||
from app.models.personal_note import PersonalNote
|
||||
from app.models.one_on_one_request import OneOnOneRequest
|
||||
from app.models.one_on_one_request import OneOnOneRequest
|
||||
from app.models.admin_settings import AppSettings
|
||||
from app.models.backup_record import BackupRecord
|
||||
from app.models.audit_log import AuditLog
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
"""Global application settings stored as key-value pairs in the database."""
|
||||
|
||||
from app.extensions import db
|
||||
|
||||
|
||||
class AppSettings(db.Model):
|
||||
"""Key-value store for global application settings.
|
||||
|
||||
Stores toggles and configuration that admins control through the
|
||||
admin panel, such as whether tryouts are open, season state, etc.
|
||||
"""
|
||||
|
||||
__tablename__ = 'app_settings'
|
||||
|
||||
key = db.Column(db.String(100), primary_key=True)
|
||||
value = db.Column(db.Text, nullable=True)
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# Well-known keys (documented here for discoverability)
|
||||
# ------------------------------------------------------------------
|
||||
# tryouts_open – "true" / "false" (default: "true")
|
||||
# season_active – "true" / "false" (default: "false")
|
||||
# season_name – e.g. "Fall 2026"
|
||||
# season_start – ISO date string
|
||||
# season_end – ISO date string
|
||||
|
||||
@staticmethod
|
||||
def get(key, default=None):
|
||||
"""Return the value for *key*, or *default* if not set."""
|
||||
row = db.session.get(AppSettings, key)
|
||||
return row.value if row is not None else default
|
||||
|
||||
@staticmethod
|
||||
def set(key, value):
|
||||
"""Upsert a setting."""
|
||||
row = db.session.get(AppSettings, key)
|
||||
if row is None:
|
||||
row = AppSettings(key=key, value=str(value) if value is not None else None)
|
||||
db.session.add(row)
|
||||
else:
|
||||
row.value = str(value) if value is not None else None
|
||||
db.session.commit()
|
||||
|
||||
@staticmethod
|
||||
def get_bool(key, default=False):
|
||||
"""Return a boolean setting."""
|
||||
val = AppSettings.get(key)
|
||||
if val is None:
|
||||
return default
|
||||
return val.lower() in ('true', '1', 'yes', 'on')
|
||||
|
||||
@staticmethod
|
||||
def set_bool(key, value):
|
||||
"""Store a boolean setting as 'true' / 'false'."""
|
||||
AppSettings.set(key, 'true' if value else 'false')
|
||||
@@ -0,0 +1,32 @@
|
||||
"""Audit log for tracking sensitive administrative actions."""
|
||||
|
||||
from app.extensions import db
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
class AuditLog(db.Model):
|
||||
"""Append-only log of critical admin actions for accountability."""
|
||||
|
||||
__tablename__ = 'audit_logs'
|
||||
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=True)
|
||||
action = db.Column(db.String(100), nullable=False)
|
||||
details = db.Column(db.Text, nullable=True)
|
||||
ip_address = db.Column(db.String(64), nullable=True)
|
||||
created_at = db.Column(db.DateTime, default=datetime.utcnow)
|
||||
|
||||
user = db.relationship('User', foreign_keys=[user_id], backref='audit_logs')
|
||||
|
||||
@staticmethod
|
||||
def record(user_id, action, details=None, ip_address=None):
|
||||
"""Create a new audit log entry."""
|
||||
entry = AuditLog(
|
||||
user_id=user_id,
|
||||
action=action,
|
||||
details=details,
|
||||
ip_address=ip_address,
|
||||
)
|
||||
db.session.add(entry)
|
||||
db.session.commit()
|
||||
return entry
|
||||
@@ -0,0 +1,21 @@
|
||||
"""Records of database backups created through the admin panel."""
|
||||
|
||||
from app.extensions import db
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
class BackupRecord(db.Model):
|
||||
"""Metadata for a database backup stored on disk."""
|
||||
|
||||
__tablename__ = 'backup_records'
|
||||
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
filename = db.Column(db.String(255), nullable=False)
|
||||
file_path = db.Column(db.String(500), nullable=False)
|
||||
size_bytes = db.Column(db.BigInteger, nullable=True)
|
||||
backup_type = db.Column(db.String(20), default='manual') # 'manual' or 'auto'
|
||||
notes = db.Column(db.Text, nullable=True)
|
||||
created_by_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=True)
|
||||
created_at = db.Column(db.DateTime, default=datetime.utcnow)
|
||||
|
||||
creator = db.relationship('User', foreign_keys=[created_by_id], backref='backups')
|
||||
Reference in New Issue
Block a user