Files
quality_app-v2/documentation/LABELS_TABLE_DATABASE_MANAGEMENT_CHECK.md
2026-02-10 15:41:24 +02:00

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 (/labels routes)

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.TABLES dynamically
  • 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_labels will 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 mysqldump to 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_labels table 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:

  1. Backup Retention Settings - Works with all tables

  2. Scheduled Backups - Backs up all tables including order_for_labels

  3. Recent Backups List - Shows all backups regardless of table count

  4. Restore Database - Restores all tables from backup

  5. 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

  6. 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:

  1. All table queries are dynamic - They query information_schema.TABLES directly
  2. No hardcoded lists - There are no whitelist or blacklist of tables
  3. No exclusions - Only warehouse_locations has special handling (to preserve 2 default locations), but order_for_labels uses standard truncate
  4. 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.