feat: add archive/delete/restore sessions with header preview
This commit is contained in:
@@ -637,29 +637,73 @@ def register_routes(bp):
|
||||
flash('You do not have access to this module', 'danger')
|
||||
return redirect(url_for('home'))
|
||||
|
||||
# Get user's active sessions with process info and scan counts
|
||||
active_sessions = query_db('''
|
||||
SELECT cs.*, cp.process_name, cp.process_key
|
||||
FROM cons_sessions cs
|
||||
JOIN cons_processes cp ON cs.process_id = cp.id
|
||||
WHERE cs.created_by = ? AND cs.status = 'active'
|
||||
ORDER BY cs.created_at DESC
|
||||
''', [user_id])
|
||||
# Check if user wants to see archived/deleted sessions
|
||||
show_archived = request.args.get('show_archived') == '1'
|
||||
|
||||
# Get sessions based on filter
|
||||
if show_archived:
|
||||
# Show active + archived + last 20 deleted
|
||||
all_sessions = query_db('''
|
||||
SELECT cs.*, cp.process_name, cp.process_key
|
||||
FROM cons_sessions cs
|
||||
JOIN cons_processes cp ON cs.process_id = cp.id
|
||||
WHERE cs.created_by = ?
|
||||
ORDER BY
|
||||
CASE cs.status
|
||||
WHEN 'active' THEN 1
|
||||
WHEN 'archived' THEN 2
|
||||
WHEN 'deleted' THEN 3
|
||||
END,
|
||||
cs.created_at DESC
|
||||
''', [user_id])
|
||||
|
||||
# Separate active, archived, and deleted (limit deleted to 20)
|
||||
active_sessions = [s for s in all_sessions if s['status'] == 'active']
|
||||
archived_sessions = [s for s in all_sessions if s['status'] == 'archived']
|
||||
deleted_sessions = [s for s in all_sessions if s['status'] == 'deleted'][:20]
|
||||
|
||||
combined_sessions = active_sessions + archived_sessions + deleted_sessions
|
||||
else:
|
||||
# Show only active sessions
|
||||
combined_sessions = query_db('''
|
||||
SELECT cs.*, cp.process_name, cp.process_key
|
||||
FROM cons_sessions cs
|
||||
JOIN cons_processes cp ON cs.process_id = cp.id
|
||||
WHERE cs.created_by = ? AND cs.status = 'active'
|
||||
ORDER BY cs.created_at DESC
|
||||
''', [user_id])
|
||||
|
||||
# Get scan counts for each session from their dynamic tables
|
||||
# Get scan counts and header values for each session
|
||||
sessions_with_counts = []
|
||||
for sess in active_sessions:
|
||||
for sess in combined_sessions:
|
||||
sess_dict = dict(sess)
|
||||
|
||||
# Get scan count
|
||||
table_name = get_detail_table_name(sess['process_key'])
|
||||
try:
|
||||
count_result = query_db(f'''
|
||||
SELECT COUNT(*) as scan_count FROM {table_name}
|
||||
WHERE session_id = ? AND is_deleted = 0
|
||||
''', [sess['id']], one=True)
|
||||
sess_dict = dict(sess)
|
||||
sess_dict['scan_count'] = count_result['scan_count'] if count_result else 0
|
||||
except:
|
||||
sess_dict = dict(sess)
|
||||
sess_dict['scan_count'] = 0
|
||||
|
||||
# Get first 5 required header fields with their values
|
||||
header_fields = query_db('''
|
||||
SELECT cpf.field_label, cshv.field_value
|
||||
FROM cons_process_fields cpf
|
||||
LEFT JOIN cons_session_header_values cshv
|
||||
ON cpf.id = cshv.field_id AND cshv.session_id = ?
|
||||
WHERE cpf.process_id = ?
|
||||
AND cpf.table_type = 'header'
|
||||
AND cpf.is_required = 1
|
||||
AND cpf.is_active = 1
|
||||
ORDER BY cpf.sort_order, cpf.id
|
||||
LIMIT 5
|
||||
''', [sess['id'], sess['process_id']])
|
||||
|
||||
sess_dict['header_preview'] = header_fields
|
||||
sessions_with_counts.append(sess_dict)
|
||||
|
||||
# Get available process types for creating new sessions
|
||||
@@ -668,8 +712,9 @@ def register_routes(bp):
|
||||
''')
|
||||
|
||||
return render_template('conssheets/staff_index.html',
|
||||
sessions=sessions_with_counts,
|
||||
processes=processes)
|
||||
sessions=sessions_with_counts,
|
||||
processes=processes,
|
||||
show_archived=show_archived)
|
||||
|
||||
|
||||
@bp.route('/new/<int:process_id>', methods=['GET', 'POST'])
|
||||
@@ -982,6 +1027,60 @@ def register_routes(bp):
|
||||
|
||||
return jsonify({'success': True})
|
||||
|
||||
@bp.route('/session/<int:session_id>/unarchive', methods=['POST'])
|
||||
@login_required
|
||||
def unarchive_session(session_id):
|
||||
"""Unarchive a session back to active"""
|
||||
sess = query_db('SELECT * FROM cons_sessions WHERE id = ?', [session_id], one=True)
|
||||
|
||||
if not sess:
|
||||
return jsonify({'success': False, 'message': 'Session not found'})
|
||||
|
||||
# Check permission
|
||||
if sess['created_by'] != session['user_id'] and session['role'] not in ['owner', 'admin']:
|
||||
return jsonify({'success': False, 'message': 'Permission denied'})
|
||||
|
||||
execute_db('UPDATE cons_sessions SET status = "active" WHERE id = ?', [session_id])
|
||||
|
||||
return jsonify({'success': True})
|
||||
|
||||
|
||||
@bp.route('/session/<int:session_id>/delete', methods=['POST'])
|
||||
@role_required('owner', 'admin')
|
||||
def delete_session(session_id):
|
||||
"""Delete a session (admin only) - soft delete session and all detail rows"""
|
||||
sess = query_db('SELECT cs.*, cp.process_key FROM cons_sessions cs JOIN cons_processes cp ON cs.process_id = cp.id WHERE cs.id = ?', [session_id], one=True)
|
||||
|
||||
if not sess:
|
||||
return jsonify({'success': False, 'message': 'Session not found'})
|
||||
|
||||
# Update session status
|
||||
execute_db('UPDATE cons_sessions SET status = "deleted" WHERE id = ?', [session_id])
|
||||
|
||||
# Mark all detail rows as deleted
|
||||
table_name = get_detail_table_name(sess['process_key'])
|
||||
execute_db(f'UPDATE {table_name} SET is_deleted = 1 WHERE session_id = ?', [session_id])
|
||||
|
||||
return jsonify({'success': True})
|
||||
|
||||
|
||||
@bp.route('/session/<int:session_id>/restore', methods=['POST'])
|
||||
@role_required('owner', 'admin')
|
||||
def restore_session(session_id):
|
||||
"""Restore a deleted session (admin only) - restore session and all detail rows"""
|
||||
sess = query_db('SELECT cs.*, cp.process_key FROM cons_sessions cs JOIN cons_processes cp ON cs.process_id = cp.id WHERE cs.id = ?', [session_id], one=True)
|
||||
|
||||
if not sess:
|
||||
return jsonify({'success': False, 'message': 'Session not found'})
|
||||
|
||||
# Update session status to active
|
||||
execute_db('UPDATE cons_sessions SET status = "active" WHERE id = ?', [session_id])
|
||||
|
||||
# Restore all detail rows
|
||||
table_name = get_detail_table_name(sess['process_key'])
|
||||
execute_db(f'UPDATE {table_name} SET is_deleted = 0 WHERE session_id = ?', [session_id])
|
||||
|
||||
return jsonify({'success': True})
|
||||
|
||||
@bp.route('/session/<int:session_id>/template')
|
||||
@login_required
|
||||
|
||||
Reference in New Issue
Block a user