Upgrade allow adding image in ticket details page comment section

This commit is contained in:
2026-03-30 11:14:35 -04:00
parent 2beef382b7
commit bf29ccb287
13 changed files with 419 additions and 26 deletions
+46 -1
View File
@@ -308,4 +308,49 @@ class KBAttachment(db.Model):
return f'/admin/kb/files/{self.stored_name}'
def __repr__(self):
return f'<KBAttachment {self.filename}>'
return f'<KBAttachment {self.filename}>'
class SystemSetting(db.Model):
"""Key-value store for application-wide configuration flags.
Values are persisted as strings; helper class methods handle
typed access so callers never touch raw strings directly.
"""
__tablename__ = 'system_settings'
id = db.Column(db.Integer, primary_key=True)
key = db.Column(db.String(100), unique=True, nullable=False, index=True)
value = db.Column(db.String(500), nullable=False)
description = db.Column(db.String(256))
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
@classmethod
def get(cls, key, default=None):
"""Return the raw string value for *key*, or *default* if absent."""
row = cls.query.filter_by(key=key).first()
return row.value if row else default
@classmethod
def get_bool(cls, key, default=True):
"""Return the value for *key* coerced to bool."""
raw = cls.get(key)
if raw is None:
return default
return raw.lower() in ('1', 'true', 'yes', 'on')
@classmethod
def set(cls, key, value, description=None):
"""Upsert *key* = *value*. Caller is responsible for committing."""
row = cls.query.filter_by(key=key).first()
if row:
row.value = str(value)
if description is not None:
row.description = description
else:
row = cls(key=key, value=str(value), description=description)
db.session.add(row)
return row
def __repr__(self):
return f'<SystemSetting {self.key}={self.value}>'