10 KiB
Database Management - Labels Module Table Coverage Check
Summary
✅ All database management functions properly include the order_for_labels table from the labels module
The database management page uses dynamic table queries from information_schema.TABLES, which automatically includes all database tables, including the newly created order_for_labels table.
Table Status
order_for_labels Table
- Module: Labels
- Purpose: Stores label printing queue for production orders
- Status: ✅ Properly created in database initialization
- Created in:
initialize_db.py:399-444 - First Use: Labels module (
/labelsroutes)
Table Schema:
CREATE TABLE IF NOT EXISTS order_for_labels (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
comanda_productie VARCHAR(50) NOT NULL,
cod_articol VARCHAR(50),
descr_com_prod TEXT,
cantitate DECIMAL(10, 2),
com_achiz_client VARCHAR(50),
nr_linie_com_client VARCHAR(50),
customer_name VARCHAR(255),
customer_article_number VARCHAR(100),
open_for_order TINYINT(1) DEFAULT 1,
line_number INT,
printed_labels TINYINT(1) DEFAULT 0,
data_livrara DATE,
dimensiune VARCHAR(50),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_comanda_productie (comanda_productie),
INDEX idx_printed_labels (printed_labels),
INDEX idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
Database Management Functions Review
1. ✅ Database Management Page - database_management()
Location: app/modules/settings/routes.py:596-634
URL: GET /settings/database-management
# Get list of tables
cursor.execute("""
SELECT TABLE_NAME, TABLE_ROWS
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
ORDER BY TABLE_NAME
""")
tables = [{'name': row[0], 'rows': row[1]} for row in cursor.fetchall()]
Coverage: ✅ INCLUDES order_for_labels
- Queries
information_schema.TABLESdynamically - Gets ALL tables in the database
2. ✅ Get Database Tables API - get_database_tables()
Location: app/modules/settings/routes.py:841-866
URL: GET /settings/api/database/tables
# Get list of all tables with their row counts
cursor.execute("""
SELECT TABLE_NAME, TABLE_ROWS
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
ORDER BY TABLE_NAME
""")
tables = [{'name': row[0], 'rows': row[1] or 0} for row in cursor.fetchall()]
Coverage: ✅ INCLUDES order_for_labels
- Used by the truncate table dropdown
- Returns all tables dynamically
Frontend: database_management.html:1065-1103
function loadDatabaseTables() {
fetch('{{ url_for("settings.get_database_tables") }}')
.then(response => response.json())
.then(data => {
if (data.success && data.tables && data.tables.length > 0) {
const select = document.getElementById('truncate-table-select');
// Clear existing options except the first placeholder
select.innerHTML = '<option value="">-- Select a table --</option>';
// Add all tables as options
data.tables.forEach(table => {
const option = document.createElement('option');
option.value = table.name;
option.textContent = `${table.name} (${table.rows} rows)`;
select.appendChild(option);
});
}
});
}
3. ✅ Truncate Table - truncate_table()
Location: app/modules/settings/routes.py:869-929
URL: POST /settings/api/database/truncate
# Validate table name
cursor.execute("""
SELECT TABLE_NAME FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = %s
""", (table,))
if not cursor.fetchone():
cursor.close()
return jsonify({'error': 'Table not found'}), 404
# Special handling for warehouse_locations
if table == 'warehouse_locations':
# ... special truncate logic ...
else:
# For all other tables, perform standard truncate
cursor.execute(f'TRUNCATE TABLE {table}')
Coverage: ✅ INCLUDES order_for_labels
- Validates table exists dynamically from database
- Uses standard TRUNCATE for all tables except
warehouse_locations order_for_labelswill use standard TRUNCATE (no special handling needed)
4. ✅ Backup Database - create_backup()
Location: app/modules/settings/routes.py:700-785
URL: POST /settings/api/backup
cmd = [
'mysqldump',
'-h', db_host,
'-u', db_user,
f'-p{db_password}',
'--skip-ssl',
db_name
]
Coverage: ✅ INCLUDES order_for_labels
- Uses
mysqldumpto backup entire database - All tables automatically included
5. ✅ Restore Database - restore_database()
Location: app/modules/settings/routes.py:764-810
URL: POST /settings/api/database/restore
# Execute SQL statements from backup
for statement in sql_content.split(';'):
statement = statement.strip()
if statement:
try:
cursor.execute(statement)
except Exception as e:
pass
Coverage: ✅ INCLUDES order_for_labels
- Restores all tables from backup file
- Backup files contain
order_for_labelstable definition and data
6. ✅ Get Backups List - get_backups_list()
Location: app/modules/settings/routes.py:643-689
URL: GET /settings/api/backups
cursor.execute("""
SELECT ROUND(SUM(data_length + index_length) / 1024 / 1024, 2)
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
""")
db_size = cursor.fetchone()[0]
Coverage: ✅ INCLUDES order_for_labels
- Calculates total database size
- Includes size of all tables including
order_for_labels
Template Coverage
Database Management Template
Location: app/templates/modules/settings/database_management.html
Components:
-
✅ Backup Retention Settings - Works with all tables
-
✅ Scheduled Backups - Backs up all tables including
order_for_labels -
✅ Recent Backups List - Shows all backups regardless of table count
-
✅ Restore Database - Restores all tables from backup
-
✅ Clear Table Data - Dropdown populated with ALL tables dynamically:
<select class="form-select" id="truncate-table-select"> <option value="">-- Loading tables... --</option> </select>This dropdown is populated by
loadDatabaseTables()which fetches from/settings/api/database/tables -
✅ Upload Backup File - Accepts any SQL backup containing any tables
Verification Results
Database Initialization
✅ order_for_labels table is created in initialize_db.py:399-444
Database Schema Verifier
✅ order_for_labels is included in db_schema_verifier.py:98-110:
tables_to_verify = {
'users': self.get_users_schema,
'user_credentials': self.get_user_credentials_schema,
'user_modules': self.get_user_modules_schema,
'user_permissions': self.get_user_permissions_schema,
'roles': self.get_roles_schema,
'worker_manager_bindings': self.get_worker_manager_bindings_schema,
'application_settings': self.get_application_settings_schema,
'audit_logs': self.get_audit_logs_schema,
'backup_schedules': self.get_backup_schedules_schema,
'order_for_labels': self.get_order_for_labels_schema, # ✅ INCLUDED
}
Dynamic Queries
✅ All table-related functions use dynamic queries from information_schema.TABLES
- No hardcoded table exclusions
- No table whitelists
- All tables treated equally
Action Items
No Changes Required ✅
The database management page and all related functions already properly include the order_for_labels table from the labels module because:
- All table queries are dynamic - They query
information_schema.TABLESdirectly - No hardcoded lists - There are no whitelist or blacklist of tables
- No exclusions - Only
warehouse_locationshas special handling (to preserve 2 default locations), butorder_for_labelsuses standard truncate - Standard SQL backup/restore - All tables are backed up and restored automatically
Ongoing Maintenance
- If new tables are added in the future, they will automatically appear in the database management interface
- The system is future-proof for adding new modules with new tables
- Schema verification will automatically verify and repair any new tables defined in
db_schema_verifier.py
Summary Table: All Database Management Functions
| Function | Location | Query Type | Includes order_for_labels | Notes |
|---|---|---|---|---|
database_management() |
routes.py:596 | Dynamic from information_schema | ✅ YES | Page load, displays all tables |
get_database_tables() |
routes.py:841 | Dynamic from information_schema | ✅ YES | API endpoint, used for dropdown |
truncate_table() |
routes.py:869 | Dynamic validation + TRUNCATE | ✅ YES | Uses standard TRUNCATE |
create_backup() |
routes.py:700 | mysqldump (all tables) | ✅ YES | Includes all tables |
restore_database() |
routes.py:764 | SQL file restoration | ✅ YES | Restores all tables from file |
get_backups_list() |
routes.py:643 | Database size calculation | ✅ YES | DB size includes all tables |
loadDatabaseTables() |
database_management.html:1065 | JavaScript fetch API | ✅ YES | Populates dropdown dynamically |
Conclusion
✅ Complete Coverage Achieved
The /settings/database-management page and all database management functions properly include and support the order_for_labels table from the labels module. No code changes are required.
The system uses dynamic table discovery from information_schema.TABLES, ensuring that any new tables added in the future will automatically be included in all database management operations.