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