updated documentation folder
This commit is contained in:
@@ -3,8 +3,6 @@ import os
|
||||
import mariadb
|
||||
from datetime import datetime, timedelta
|
||||
from flask import Blueprint, render_template, redirect, url_for, request, flash, session, current_app, jsonify, send_from_directory
|
||||
from .models import User
|
||||
from . import db
|
||||
from reportlab.lib.pagesizes import letter
|
||||
from reportlab.pdfgen import canvas
|
||||
import csv
|
||||
@@ -94,9 +92,9 @@ def login():
|
||||
except:
|
||||
user_modules = []
|
||||
|
||||
# Superadmin and admin have access to all modules
|
||||
if user['role'] in ['superadmin', 'admin']:
|
||||
user_modules = ['quality', 'warehouse', 'labels']
|
||||
# Superadmin has access to all modules
|
||||
if user['role'] == 'superadmin':
|
||||
user_modules = ['quality', 'warehouse', 'labels', 'daily_mirror']
|
||||
|
||||
session['modules'] = user_modules
|
||||
print("Logged in as:", session.get('user'), session.get('role'), "modules:", user_modules)
|
||||
@@ -3580,4 +3578,137 @@ def help(page='index'):
|
||||
# "pdf_url": "https://your-linux-server/generate_labels_pdf/15",
|
||||
# "printer_name": "default",
|
||||
# "copies": 1
|
||||
# }
|
||||
# }
|
||||
|
||||
# ========================================
|
||||
# DATABASE BACKUP MANAGEMENT ROUTES
|
||||
# ========================================
|
||||
|
||||
@bp.route('/api/backup/create', methods=['POST'])
|
||||
@admin_plus
|
||||
def api_backup_create():
|
||||
"""Create a new database backup"""
|
||||
try:
|
||||
from app.database_backup import DatabaseBackupManager
|
||||
|
||||
backup_manager = DatabaseBackupManager()
|
||||
result = backup_manager.create_backup()
|
||||
|
||||
return jsonify(result)
|
||||
except Exception as e:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'Backup failed: {str(e)}'
|
||||
}), 500
|
||||
|
||||
@bp.route('/api/backup/list', methods=['GET'])
|
||||
@admin_plus
|
||||
def api_backup_list():
|
||||
"""List all available backups"""
|
||||
try:
|
||||
from app.database_backup import DatabaseBackupManager
|
||||
|
||||
backup_manager = DatabaseBackupManager()
|
||||
backups = backup_manager.list_backups()
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'backups': backups
|
||||
})
|
||||
except Exception as e:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'Failed to list backups: {str(e)}'
|
||||
}), 500
|
||||
|
||||
@bp.route('/api/backup/download/<filename>', methods=['GET'])
|
||||
@admin_plus
|
||||
def api_backup_download(filename):
|
||||
"""Download a backup file"""
|
||||
try:
|
||||
from app.database_backup import DatabaseBackupManager
|
||||
from flask import send_file
|
||||
import os
|
||||
|
||||
backup_manager = DatabaseBackupManager()
|
||||
backup_path = backup_manager.backup_path
|
||||
file_path = os.path.join(backup_path, filename)
|
||||
|
||||
# Security: ensure filename doesn't contain path traversal
|
||||
if '..' in filename or '/' in filename:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': 'Invalid filename'
|
||||
}), 400
|
||||
|
||||
if os.path.exists(file_path):
|
||||
return send_file(file_path, as_attachment=True, download_name=filename)
|
||||
else:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': 'Backup file not found'
|
||||
}), 404
|
||||
except Exception as e:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'Download failed: {str(e)}'
|
||||
}), 500
|
||||
|
||||
@bp.route('/api/backup/delete/<filename>', methods=['DELETE'])
|
||||
@admin_plus
|
||||
def api_backup_delete(filename):
|
||||
"""Delete a backup file"""
|
||||
try:
|
||||
from app.database_backup import DatabaseBackupManager
|
||||
|
||||
backup_manager = DatabaseBackupManager()
|
||||
result = backup_manager.delete_backup(filename)
|
||||
|
||||
return jsonify(result)
|
||||
except Exception as e:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'Delete failed: {str(e)}'
|
||||
}), 500
|
||||
|
||||
@bp.route('/api/backup/schedule', methods=['GET', 'POST'])
|
||||
@admin_plus
|
||||
def api_backup_schedule():
|
||||
"""Get or save backup schedule configuration"""
|
||||
try:
|
||||
from app.database_backup import DatabaseBackupManager
|
||||
|
||||
backup_manager = DatabaseBackupManager()
|
||||
|
||||
if request.method == 'POST':
|
||||
schedule = request.json
|
||||
result = backup_manager.save_backup_schedule(schedule)
|
||||
return jsonify(result)
|
||||
else:
|
||||
schedule = backup_manager.get_backup_schedule()
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'schedule': schedule
|
||||
})
|
||||
except Exception as e:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'Schedule operation failed: {str(e)}'
|
||||
}), 500
|
||||
|
||||
@bp.route('/api/backup/restore/<filename>', methods=['POST'])
|
||||
@superadmin_only
|
||||
def api_backup_restore(filename):
|
||||
"""Restore database from a backup file (superadmin only)"""
|
||||
try:
|
||||
from app.database_backup import DatabaseBackupManager
|
||||
|
||||
backup_manager = DatabaseBackupManager()
|
||||
result = backup_manager.restore_backup(filename)
|
||||
|
||||
return jsonify(result)
|
||||
except Exception as e:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'Restore failed: {str(e)}'
|
||||
}), 500
|
||||
Reference in New Issue
Block a user