04/06 adding some additional functions
This commit is contained in:
+60
-1
@@ -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}>'
|
||||
|
||||
Reference in New Issue
Block a user