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
+80 -1
View File
@@ -11,7 +11,7 @@ from werkzeug.utils import secure_filename
import bleach
from app import db, limiter
from app.models import (User, Ticket, Comment, ActivityLog, KnowledgeBase,
KBAttachment, UserRole, TicketStatus)
KBAttachment, UserRole, TicketStatus, CannedResponse)
from app.services.log_service import log_action
from app.services.validation_service import validate_password, validate_file
@@ -851,6 +851,85 @@ def export_tickets():
)
# ─── Canned Responses Management ─────────────────────────────────────────────
@admin_bp.route('/canned-responses')
@login_required
@it_required
def canned_responses():
"""List all canned responses."""
items = CannedResponse.query.order_by(
CannedResponse.category, CannedResponse.title
).all()
categories = sorted({r.category for r in items if r.category})
return render_template('admin/canned_responses.html',
items=items, categories=categories)
@admin_bp.route('/canned-responses/new', methods=['GET', 'POST'])
@login_required
@it_required
def canned_response_new():
if request.method == 'POST':
title = request.form.get('title', '').strip()
body = request.form.get('body', '').strip()
category = request.form.get('category', '').strip()
if not title or not body:
flash('Title and body are required.', 'danger')
return render_template('admin/canned_response_edit.html', item=None)
item = CannedResponse(
title = title,
body = body,
category = category or None,
created_by = current_user.id,
)
db.session.add(item)
db.session.flush()
log_action(current_user.id, 'canned_response_create', 'canned_response', item.id,
f'title={title}')
db.session.commit()
logger.info(f'[CANNED RESPONSE CREATE] id={item.id} by user_id={current_user.id}')
flash('Canned response created.', 'success')
return redirect(url_for('admin.canned_responses'))
return render_template('admin/canned_response_edit.html', item=None)
@admin_bp.route('/canned-responses/<int:item_id>/edit', methods=['GET', 'POST'])
@login_required
@it_required
def canned_response_edit(item_id):
item = db.session.get(CannedResponse, item_id) or abort(404)
if request.method == 'POST':
item.title = request.form.get('title', item.title).strip()
item.body = request.form.get('body', item.body).strip()
item.category = request.form.get('category', '').strip() or None
item.is_active = bool(request.form.get('is_active'))
if not item.title or not item.body:
flash('Title and body are required.', 'danger')
return render_template('admin/canned_response_edit.html', item=item)
log_action(current_user.id, 'canned_response_edit', 'canned_response', item.id,
f'title={item.title}')
db.session.commit()
logger.info(f'[CANNED RESPONSE EDIT] id={item.id} by user_id={current_user.id}')
flash('Canned response updated.', 'success')
return redirect(url_for('admin.canned_responses'))
return render_template('admin/canned_response_edit.html', item=item)
@admin_bp.route('/canned-responses/<int:item_id>/delete', methods=['POST'])
@login_required
@it_required
def canned_response_delete(item_id):
item = db.session.get(CannedResponse, item_id) or abort(404)
log_action(current_user.id, 'canned_response_delete', 'canned_response', item.id,
f'title={item.title}')
logger.info(f'[CANNED RESPONSE DELETE] id={item.id} by user_id={current_user.id}')
db.session.delete(item)
db.session.commit()
flash('Canned response deleted.', 'success')
return redirect(url_for('admin.canned_responses'))
def _roles():
return [UserRole.EMPLOYEE, UserRole.IT_STAFF, UserRole.ADMIN]