04/06 adding some additional functions

This commit is contained in:
2026-04-06 18:02:16 -04:00
parent bc236a3d19
commit 299bf2ca05
12 changed files with 1142 additions and 9 deletions
+60 -1
View File
@@ -359,4 +359,63 @@ class SystemSetting(db.Model):
return row
def __repr__(self):
return f'<SystemSetting {self.key}={self.value}>'
return f'<SystemSetting {self.key}={self.value}>'
class TicketLink(db.Model):
"""Bidirectional link between two related tickets.
A single row represents a symmetric relationship — if TKT-A is linked to
TKT-B, the link is stored once with ticket_id < linked_ticket_id (enforced
at the application layer). Queries must search both columns to find all
links for a given ticket.
Use cases: duplicate tickets, related outages, follow-up work items.
"""
__tablename__ = 'ticket_links'
id = db.Column(db.Integer, primary_key=True)
ticket_id = db.Column(db.Integer, db.ForeignKey('tickets.id'), nullable=False)
linked_ticket_id = db.Column(db.Integer, db.ForeignKey('tickets.id'), nullable=False)
link_type = db.Column(db.String(20), default='related', nullable=False)
# link_type values: 'related' | 'duplicate' | 'follow_up'
created_by = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
ticket = db.relationship('Ticket', foreign_keys=[ticket_id],
backref=db.backref('links_as_source', lazy='dynamic',
cascade='all, delete-orphan'))
linked_ticket = db.relationship('Ticket', foreign_keys=[linked_ticket_id],
backref=db.backref('links_as_target', lazy='dynamic',
cascade='all, delete-orphan'))
creator = db.relationship('User', foreign_keys=[created_by])
__table_args__ = (
db.UniqueConstraint('ticket_id', 'linked_ticket_id', name='uq_ticket_link'),
)
def __repr__(self):
return f'<TicketLink {self.ticket_id}{self.linked_ticket_id} ({self.link_type})>'
class CannedResponse(db.Model):
"""Pre-written IT reply templates for common ticket scenarios.
IT staff can insert these into comment boxes with one click, saving
typing time for repetitive responses like 'please restart and confirm',
'escalating to vendor', or 'issue resolved after patch applied'.
"""
__tablename__ = 'canned_responses'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(120), nullable=False)
body = db.Column(db.Text, nullable=False)
category = db.Column(db.String(50)) # optional grouping label
created_by = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
is_active = db.Column(db.Boolean, default=True, nullable=False)
creator = db.relationship('User', foreign_keys=[created_by])
def __repr__(self):
return f'<CannedResponse {self.title}>'