feat: Implement comprehensive database setup system
- Add complete database setup script (setup_complete_database.py) - Add quick deployment script (quick_deploy.sh) - Add comprehensive documentation (DATABASE_SETUP_README.md) - Move individual db scripts to backup_db_scripts folder - Update external_server.conf with correct database settings - Clean up obsolete documentation files - Streamline deployment process to single command Features: - One-script database creation for all tables and triggers - Automated permissions and roles setup - Complete verification and error handling - Production-ready deployment workflow - Maintains backward compatibility with individual scripts
This commit is contained in:
@@ -1,110 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import mariadb
|
||||
import os
|
||||
import sys
|
||||
|
||||
def get_external_db_connection():
|
||||
"""Reads the external_server.conf file and returns a MariaDB database connection."""
|
||||
# Get the instance folder path
|
||||
current_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
instance_folder = os.path.join(current_dir, '../../instance')
|
||||
settings_file = os.path.join(instance_folder, 'external_server.conf')
|
||||
|
||||
if not os.path.exists(settings_file):
|
||||
raise FileNotFoundError(f"The external_server.conf file is missing: {settings_file}")
|
||||
|
||||
# Read settings from the configuration file
|
||||
settings = {}
|
||||
with open(settings_file, 'r') as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if line and '=' in line:
|
||||
key, value = line.split('=', 1)
|
||||
settings[key] = value
|
||||
|
||||
print(f"Connecting to MariaDB:")
|
||||
print(f" Host: {settings.get('server_domain', 'N/A')}")
|
||||
print(f" Port: {settings.get('port', 'N/A')}")
|
||||
print(f" Database: {settings.get('database_name', 'N/A')}")
|
||||
|
||||
return mariadb.connect(
|
||||
user=settings['username'],
|
||||
password=settings['password'],
|
||||
host=settings['server_domain'],
|
||||
port=int(settings['port']),
|
||||
database=settings['database_name']
|
||||
)
|
||||
|
||||
def main():
|
||||
try:
|
||||
print("=== Adding Email Column to Users Table ===")
|
||||
conn = get_external_db_connection()
|
||||
cursor = conn.cursor()
|
||||
|
||||
# First, check the current table structure
|
||||
print("\n1. Checking current table structure...")
|
||||
cursor.execute("DESCRIBE users")
|
||||
columns = cursor.fetchall()
|
||||
|
||||
has_email = False
|
||||
for column in columns:
|
||||
print(f" Column: {column[0]} ({column[1]})")
|
||||
if column[0] == 'email':
|
||||
has_email = True
|
||||
|
||||
if not has_email:
|
||||
print("\n2. Adding email column...")
|
||||
cursor.execute("ALTER TABLE users ADD COLUMN email VARCHAR(255)")
|
||||
conn.commit()
|
||||
print(" ✓ Email column added successfully")
|
||||
else:
|
||||
print("\n2. Email column already exists")
|
||||
|
||||
# Now check and display all users
|
||||
print("\n3. Current users in database:")
|
||||
cursor.execute("SELECT id, username, role, email FROM users")
|
||||
users = cursor.fetchall()
|
||||
|
||||
if users:
|
||||
print(f" Found {len(users)} users:")
|
||||
for user in users:
|
||||
email = user[3] if user[3] else "No email"
|
||||
print(f" - ID: {user[0]}, Username: {user[1]}, Role: {user[2]}, Email: {email}")
|
||||
else:
|
||||
print(" No users found - creating test users...")
|
||||
|
||||
# Create some test users
|
||||
test_users = [
|
||||
('admin_user', 'admin123', 'admin', 'admin@company.com'),
|
||||
('manager_user', 'manager123', 'manager', 'manager@company.com'),
|
||||
('warehouse_user', 'warehouse123', 'warehouse_manager', 'warehouse@company.com'),
|
||||
('quality_user', 'quality123', 'quality_manager', 'quality@company.com')
|
||||
]
|
||||
|
||||
for username, password, role, email in test_users:
|
||||
try:
|
||||
cursor.execute("""
|
||||
INSERT INTO users (username, password, role, email)
|
||||
VALUES (%s, %s, %s, %s)
|
||||
""", (username, password, role, email))
|
||||
print(f" ✓ Created user: {username} ({role})")
|
||||
except mariadb.IntegrityError as e:
|
||||
print(f" ⚠ User {username} already exists: {e}")
|
||||
|
||||
conn.commit()
|
||||
print(" ✓ Test users created successfully")
|
||||
|
||||
conn.close()
|
||||
print("\n=== Database Update Complete ===")
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Error: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
@@ -1,151 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Database script to add the printed_labels column to the order_for_labels table
|
||||
This column will track whether labels have been printed for each order (boolean: 0=false, 1=true)
|
||||
Default value: 0 (false)
|
||||
"""
|
||||
|
||||
import sys
|
||||
import os
|
||||
import mariadb
|
||||
from flask import Flask
|
||||
|
||||
# Add the app directory to the path
|
||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
|
||||
def get_db_connection():
|
||||
"""Get database connection using settings from external_server.conf"""
|
||||
# Go up two levels from this script to reach py_app directory, then to instance
|
||||
app_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
settings_file = os.path.join(app_root, 'instance', 'external_server.conf')
|
||||
|
||||
settings = {}
|
||||
with open(settings_file, 'r') as f:
|
||||
for line in f:
|
||||
key, value = line.strip().split('=', 1)
|
||||
settings[key] = value
|
||||
|
||||
return mariadb.connect(
|
||||
user=settings['username'],
|
||||
password=settings['password'],
|
||||
host=settings['server_domain'],
|
||||
port=int(settings['port']),
|
||||
database=settings['database_name']
|
||||
)
|
||||
|
||||
def add_printed_labels_column():
|
||||
"""
|
||||
Adds the printed_labels column to the order_for_labels table after the line_number column
|
||||
Column type: TINYINT(1) (boolean: 0=false, 1=true)
|
||||
Default value: 0 (false)
|
||||
"""
|
||||
try:
|
||||
conn = get_db_connection()
|
||||
cursor = conn.cursor()
|
||||
|
||||
# Check if table exists
|
||||
cursor.execute("SHOW TABLES LIKE 'order_for_labels'")
|
||||
result = cursor.fetchone()
|
||||
|
||||
if not result:
|
||||
print("❌ Table 'order_for_labels' does not exist. Please create it first.")
|
||||
return False
|
||||
|
||||
# Check if column already exists
|
||||
cursor.execute("SHOW COLUMNS FROM order_for_labels LIKE 'printed_labels'")
|
||||
column_exists = cursor.fetchone()
|
||||
|
||||
if column_exists:
|
||||
print("ℹ️ Column 'printed_labels' already exists.")
|
||||
# Show current structure
|
||||
cursor.execute("DESCRIBE order_for_labels")
|
||||
columns = cursor.fetchall()
|
||||
print("\n📋 Current table structure:")
|
||||
for col in columns:
|
||||
null_info = 'NULL' if col[2] == 'YES' else 'NOT NULL'
|
||||
default_info = f" DEFAULT {col[4]}" if col[4] else ""
|
||||
print(f" 📌 {col[0]:<25} {col[1]:<20} {null_info}{default_info}")
|
||||
else:
|
||||
# Add the column after line_number
|
||||
alter_table_sql = """
|
||||
ALTER TABLE order_for_labels
|
||||
ADD COLUMN printed_labels TINYINT(1) NOT NULL DEFAULT 0
|
||||
COMMENT 'Boolean flag: 0=labels not printed, 1=labels printed'
|
||||
AFTER line_number
|
||||
"""
|
||||
|
||||
cursor.execute(alter_table_sql)
|
||||
conn.commit()
|
||||
print("✅ Column 'printed_labels' added successfully!")
|
||||
|
||||
# Show the updated structure
|
||||
cursor.execute("DESCRIBE order_for_labels")
|
||||
columns = cursor.fetchall()
|
||||
print("\n📋 Updated table structure:")
|
||||
for col in columns:
|
||||
null_info = 'NULL' if col[2] == 'YES' else 'NOT NULL'
|
||||
default_info = f" DEFAULT {col[4]}" if col[4] else ""
|
||||
highlight = "🆕 " if col[0] == 'printed_labels' else " "
|
||||
print(f"{highlight}{col[0]:<25} {col[1]:<20} {null_info}{default_info}")
|
||||
|
||||
# Show count of existing records that will have printed_labels = 0
|
||||
cursor.execute("SELECT COUNT(*) FROM order_for_labels")
|
||||
count = cursor.fetchone()[0]
|
||||
if count > 0:
|
||||
print(f"\n📊 {count} existing records now have printed_labels = 0 (false)")
|
||||
|
||||
conn.close()
|
||||
|
||||
except mariadb.Error as e:
|
||||
print(f"❌ Database error: {e}")
|
||||
return False
|
||||
except Exception as e:
|
||||
print(f"❌ Error: {e}")
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def verify_column():
|
||||
"""Verify the column was added correctly"""
|
||||
try:
|
||||
conn = get_db_connection()
|
||||
cursor = conn.cursor()
|
||||
|
||||
# Test the column functionality
|
||||
cursor.execute("SELECT COUNT(*) as total, SUM(printed_labels) as printed FROM order_for_labels")
|
||||
result = cursor.fetchone()
|
||||
|
||||
if result:
|
||||
total, printed = result
|
||||
print(f"\n🔍 Verification:")
|
||||
print(f" 📦 Total orders: {total}")
|
||||
print(f" 🖨️ Printed orders: {printed or 0}")
|
||||
print(f" 📄 Unprinted orders: {total - (printed or 0)}")
|
||||
|
||||
conn.close()
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Verification failed: {e}")
|
||||
return False
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("🔧 Adding printed_labels column to order_for_labels table...")
|
||||
print("="*60)
|
||||
|
||||
success = add_printed_labels_column()
|
||||
|
||||
if success:
|
||||
print("\n🔍 Verifying column addition...")
|
||||
verify_column()
|
||||
print("\n✅ Database modification completed successfully!")
|
||||
print("\n📝 Column Details:")
|
||||
print(" • Name: printed_labels")
|
||||
print(" • Type: TINYINT(1) (boolean)")
|
||||
print(" • Default: 0 (false - labels not printed)")
|
||||
print(" • Values: 0 = not printed, 1 = printed")
|
||||
print(" • Position: After line_number column")
|
||||
else:
|
||||
print("\n❌ Database modification failed!")
|
||||
|
||||
print("="*60)
|
||||
@@ -1,105 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import mariadb
|
||||
import os
|
||||
import sys
|
||||
|
||||
def get_external_db_connection():
|
||||
"""Reads the external_server.conf file and returns a MariaDB database connection."""
|
||||
# Get the instance folder path
|
||||
current_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
instance_folder = os.path.join(current_dir, '../../instance')
|
||||
settings_file = os.path.join(instance_folder, 'external_server.conf')
|
||||
|
||||
if not os.path.exists(settings_file):
|
||||
raise FileNotFoundError(f"The external_server.conf file is missing: {settings_file}")
|
||||
|
||||
# Read settings from the configuration file
|
||||
settings = {}
|
||||
with open(settings_file, 'r') as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if line and '=' in line:
|
||||
key, value = line.split('=', 1)
|
||||
settings[key] = value
|
||||
|
||||
print(f"Connecting to MariaDB with settings:")
|
||||
print(f" Host: {settings.get('server_domain', 'N/A')}")
|
||||
print(f" Port: {settings.get('port', 'N/A')}")
|
||||
print(f" Database: {settings.get('database_name', 'N/A')}")
|
||||
print(f" Username: {settings.get('username', 'N/A')}")
|
||||
|
||||
# Create a database connection
|
||||
return mariadb.connect(
|
||||
user=settings['username'],
|
||||
password=settings['password'],
|
||||
host=settings['server_domain'],
|
||||
port=int(settings['port']),
|
||||
database=settings['database_name']
|
||||
)
|
||||
|
||||
def main():
|
||||
try:
|
||||
print("=== Checking External MariaDB Database ===")
|
||||
conn = get_external_db_connection()
|
||||
cursor = conn.cursor()
|
||||
|
||||
# Create users table if it doesn't exist
|
||||
print("\n1. Creating/verifying users table...")
|
||||
cursor.execute('''
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
username VARCHAR(50) UNIQUE NOT NULL,
|
||||
password VARCHAR(255) NOT NULL,
|
||||
role VARCHAR(50) NOT NULL,
|
||||
email VARCHAR(255)
|
||||
)
|
||||
''')
|
||||
print(" ✓ Users table created/verified")
|
||||
|
||||
# Check existing users
|
||||
print("\n2. Checking existing users...")
|
||||
cursor.execute("SELECT id, username, role, email FROM users")
|
||||
users = cursor.fetchall()
|
||||
|
||||
if users:
|
||||
print(f" Found {len(users)} existing users:")
|
||||
for user in users:
|
||||
email = user[3] if user[3] else "No email"
|
||||
print(f" - ID: {user[0]}, Username: {user[1]}, Role: {user[2]}, Email: {email}")
|
||||
else:
|
||||
print(" No users found in external database")
|
||||
|
||||
# Create some test users
|
||||
print("\n3. Creating test users...")
|
||||
test_users = [
|
||||
('admin_user', 'admin123', 'admin', 'admin@company.com'),
|
||||
('manager_user', 'manager123', 'manager', 'manager@company.com'),
|
||||
('warehouse_user', 'warehouse123', 'warehouse_manager', 'warehouse@company.com'),
|
||||
('quality_user', 'quality123', 'quality_manager', 'quality@company.com')
|
||||
]
|
||||
|
||||
for username, password, role, email in test_users:
|
||||
try:
|
||||
cursor.execute("""
|
||||
INSERT INTO users (username, password, role, email)
|
||||
VALUES (%s, %s, %s, %s)
|
||||
""", (username, password, role, email))
|
||||
print(f" ✓ Created user: {username} ({role})")
|
||||
except mariadb.IntegrityError as e:
|
||||
print(f" ⚠ User {username} already exists: {e}")
|
||||
|
||||
conn.commit()
|
||||
print(" ✓ Test users created successfully")
|
||||
|
||||
conn.close()
|
||||
print("\n=== Database Check Complete ===")
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Error: {e}")
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
@@ -1,60 +0,0 @@
|
||||
import mariadb
|
||||
import os
|
||||
|
||||
def get_external_db_connection():
|
||||
"""Get MariaDB connection using external_server.conf"""
|
||||
settings_file = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../instance/external_server.conf'))
|
||||
settings = {}
|
||||
with open(settings_file, 'r') as f:
|
||||
for line in f:
|
||||
key, value = line.strip().split('=', 1)
|
||||
settings[key] = value
|
||||
return mariadb.connect(
|
||||
user=settings['username'],
|
||||
password=settings['password'],
|
||||
host=settings['server_domain'],
|
||||
port=int(settings['port']),
|
||||
database=settings['database_name']
|
||||
)
|
||||
|
||||
def create_external_users_table():
|
||||
"""Create users table and superadmin user in external MariaDB database"""
|
||||
try:
|
||||
conn = get_external_db_connection()
|
||||
cursor = conn.cursor()
|
||||
|
||||
# Create users table if not exists (MariaDB syntax)
|
||||
cursor.execute('''
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
username VARCHAR(50) UNIQUE NOT NULL,
|
||||
password VARCHAR(255) NOT NULL,
|
||||
role VARCHAR(50) NOT NULL
|
||||
)
|
||||
''')
|
||||
|
||||
# Insert superadmin user if not exists
|
||||
cursor.execute('''
|
||||
INSERT IGNORE INTO users (username, password, role)
|
||||
VALUES (%s, %s, %s)
|
||||
''', ('superadmin', 'superadmin123', 'superadmin'))
|
||||
|
||||
# Check if user was created/exists
|
||||
cursor.execute("SELECT username, password, role FROM users WHERE username = %s", ('superadmin',))
|
||||
result = cursor.fetchone()
|
||||
|
||||
if result:
|
||||
print(f"SUCCESS: Superadmin user exists in external database")
|
||||
print(f"Username: {result[0]}, Password: {result[1]}, Role: {result[2]}")
|
||||
else:
|
||||
print("ERROR: Failed to create/find superadmin user")
|
||||
|
||||
conn.commit()
|
||||
conn.close()
|
||||
print("External MariaDB users table setup completed.")
|
||||
|
||||
except Exception as e:
|
||||
print(f"ERROR: {e}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
create_external_users_table()
|
||||
@@ -1,110 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Database script to create the order_for_labels table
|
||||
This table will store order information for label generation
|
||||
"""
|
||||
|
||||
import sys
|
||||
import os
|
||||
import mariadb
|
||||
from flask import Flask
|
||||
|
||||
# Add the app directory to the path
|
||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
|
||||
def get_db_connection():
|
||||
"""Get database connection using settings from external_server.conf"""
|
||||
# Go up two levels from this script to reach py_app directory, then to instance
|
||||
app_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
settings_file = os.path.join(app_root, 'instance', 'external_server.conf')
|
||||
|
||||
settings = {}
|
||||
with open(settings_file, 'r') as f:
|
||||
for line in f:
|
||||
key, value = line.strip().split('=', 1)
|
||||
settings[key] = value
|
||||
|
||||
return mariadb.connect(
|
||||
user=settings['username'],
|
||||
password=settings['password'],
|
||||
host=settings['server_domain'],
|
||||
port=int(settings['port']),
|
||||
database=settings['database_name']
|
||||
)
|
||||
|
||||
def create_order_for_labels_table():
|
||||
"""
|
||||
Creates the order_for_labels table with the specified structure
|
||||
"""
|
||||
try:
|
||||
conn = get_db_connection()
|
||||
cursor = conn.cursor()
|
||||
|
||||
# First check if table already exists
|
||||
cursor.execute("SHOW TABLES LIKE 'order_for_labels'")
|
||||
result = cursor.fetchone()
|
||||
|
||||
if result:
|
||||
print("Table 'order_for_labels' already exists.")
|
||||
# Show current structure
|
||||
cursor.execute("DESCRIBE order_for_labels")
|
||||
columns = cursor.fetchall()
|
||||
print("\nCurrent table structure:")
|
||||
for col in columns:
|
||||
print(f" {col[0]} - {col[1]} {'NULL' if col[2] == 'YES' else 'NOT NULL'}")
|
||||
else:
|
||||
# Create the table
|
||||
create_table_sql = """
|
||||
CREATE TABLE order_for_labels (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT 'Unique identifier',
|
||||
comanda_productie VARCHAR(15) NOT NULL COMMENT 'Production Order',
|
||||
cod_articol VARCHAR(15) COMMENT 'Article Code',
|
||||
descr_com_prod VARCHAR(50) NOT NULL COMMENT 'Production Order Description',
|
||||
cantitate INT(3) NOT NULL COMMENT 'Quantity',
|
||||
com_achiz_client VARCHAR(25) COMMENT 'Client Purchase Order',
|
||||
nr_linie_com_client INT(3) COMMENT 'Client Order Line Number',
|
||||
customer_name VARCHAR(50) COMMENT 'Customer Name',
|
||||
customer_article_number VARCHAR(25) COMMENT 'Customer Article Number',
|
||||
open_for_order VARCHAR(25) COMMENT 'Open for Order Status',
|
||||
line_number INT(3) COMMENT 'Line Number',
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 'Record creation timestamp',
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Record update timestamp'
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Table for storing order information for label generation'
|
||||
"""
|
||||
|
||||
cursor.execute(create_table_sql)
|
||||
conn.commit()
|
||||
print("✅ Table 'order_for_labels' created successfully!")
|
||||
|
||||
# Show the created structure
|
||||
cursor.execute("DESCRIBE order_for_labels")
|
||||
columns = cursor.fetchall()
|
||||
print("\n📋 Table structure:")
|
||||
for col in columns:
|
||||
null_info = 'NULL' if col[2] == 'YES' else 'NOT NULL'
|
||||
default_info = f" DEFAULT {col[4]}" if col[4] else ""
|
||||
print(f" 📌 {col[0]:<25} {col[1]:<20} {null_info}{default_info}")
|
||||
|
||||
conn.close()
|
||||
|
||||
except mariadb.Error as e:
|
||||
print(f"❌ Database error: {e}")
|
||||
return False
|
||||
except Exception as e:
|
||||
print(f"❌ Error: {e}")
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("🏗️ Creating order_for_labels table...")
|
||||
print("="*50)
|
||||
|
||||
success = create_order_for_labels_table()
|
||||
|
||||
if success:
|
||||
print("\n✅ Database setup completed successfully!")
|
||||
else:
|
||||
print("\n❌ Database setup failed!")
|
||||
|
||||
print("="*50)
|
||||
@@ -1,141 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import mariadb
|
||||
import os
|
||||
import sys
|
||||
|
||||
def get_external_db_connection():
|
||||
"""Reads the external_server.conf file and returns a MariaDB database connection."""
|
||||
# Get the instance folder path
|
||||
current_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
instance_folder = os.path.join(current_dir, '../../instance')
|
||||
settings_file = os.path.join(instance_folder, 'external_server.conf')
|
||||
|
||||
if not os.path.exists(settings_file):
|
||||
raise FileNotFoundError(f"The external_server.conf file is missing: {settings_file}")
|
||||
|
||||
# Read settings from the configuration file
|
||||
settings = {}
|
||||
with open(settings_file, 'r') as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if line and '=' in line:
|
||||
key, value = line.split('=', 1)
|
||||
settings[key] = value
|
||||
|
||||
return mariadb.connect(
|
||||
user=settings['username'],
|
||||
password=settings['password'],
|
||||
host=settings['server_domain'],
|
||||
port=int(settings['port']),
|
||||
database=settings['database_name']
|
||||
)
|
||||
|
||||
def main():
|
||||
try:
|
||||
print("=== Creating Permission Management Tables ===")
|
||||
conn = get_external_db_connection()
|
||||
cursor = conn.cursor()
|
||||
|
||||
# 1. Create permissions table
|
||||
print("\n1. Creating permissions table...")
|
||||
cursor.execute('''
|
||||
CREATE TABLE IF NOT EXISTS permissions (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
permission_key VARCHAR(255) UNIQUE NOT NULL,
|
||||
page VARCHAR(100) NOT NULL,
|
||||
page_name VARCHAR(255) NOT NULL,
|
||||
section VARCHAR(100) NOT NULL,
|
||||
section_name VARCHAR(255) NOT NULL,
|
||||
action VARCHAR(50) NOT NULL,
|
||||
action_name VARCHAR(255) NOT NULL,
|
||||
description TEXT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
||||
)
|
||||
''')
|
||||
print(" ✓ Permissions table created/verified")
|
||||
|
||||
# 2. Create role_permissions table
|
||||
print("\n2. Creating role_permissions table...")
|
||||
cursor.execute('''
|
||||
CREATE TABLE IF NOT EXISTS role_permissions (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
role VARCHAR(50) NOT NULL,
|
||||
permission_key VARCHAR(255) NOT NULL,
|
||||
granted BOOLEAN DEFAULT TRUE,
|
||||
granted_by VARCHAR(50),
|
||||
granted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
UNIQUE KEY unique_role_permission (role, permission_key),
|
||||
FOREIGN KEY (permission_key) REFERENCES permissions(permission_key) ON DELETE CASCADE
|
||||
)
|
||||
''')
|
||||
print(" ✓ Role permissions table created/verified")
|
||||
|
||||
# 3. Create role_hierarchy table for role management
|
||||
print("\n3. Creating role_hierarchy table...")
|
||||
cursor.execute('''
|
||||
CREATE TABLE IF NOT EXISTS role_hierarchy (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
role_name VARCHAR(50) UNIQUE NOT NULL,
|
||||
display_name VARCHAR(255) NOT NULL,
|
||||
description TEXT,
|
||||
level INT DEFAULT 0,
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
||||
)
|
||||
''')
|
||||
print(" ✓ Role hierarchy table created/verified")
|
||||
|
||||
# 4. Create permission_audit_log table for tracking changes
|
||||
print("\n4. Creating permission_audit_log table...")
|
||||
cursor.execute('''
|
||||
CREATE TABLE IF NOT EXISTS permission_audit_log (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
role VARCHAR(50) NOT NULL,
|
||||
permission_key VARCHAR(255) NOT NULL,
|
||||
action ENUM('granted', 'revoked') NOT NULL,
|
||||
changed_by VARCHAR(50) NOT NULL,
|
||||
changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
reason TEXT,
|
||||
ip_address VARCHAR(45)
|
||||
)
|
||||
''')
|
||||
print(" ✓ Permission audit log table created/verified")
|
||||
|
||||
conn.commit()
|
||||
|
||||
# 5. Check if we need to populate initial data
|
||||
print("\n5. Checking for existing data...")
|
||||
cursor.execute("SELECT COUNT(*) FROM permissions")
|
||||
permission_count = cursor.fetchone()[0]
|
||||
|
||||
if permission_count == 0:
|
||||
print(" No permissions found - will need to populate with default data")
|
||||
print(" Run 'populate_permissions.py' to initialize the permission system")
|
||||
else:
|
||||
print(f" Found {permission_count} existing permissions")
|
||||
|
||||
cursor.execute("SELECT COUNT(*) FROM role_hierarchy")
|
||||
role_count = cursor.fetchone()[0]
|
||||
|
||||
if role_count == 0:
|
||||
print(" No roles found - will need to populate with default roles")
|
||||
else:
|
||||
print(f" Found {role_count} existing roles")
|
||||
|
||||
conn.close()
|
||||
print("\n=== Permission Database Schema Created Successfully ===")
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Error: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
@@ -1,45 +0,0 @@
|
||||
import sqlite3
|
||||
import os
|
||||
|
||||
def create_roles_and_users_tables(db_path):
|
||||
conn = sqlite3.connect(db_path)
|
||||
cursor = conn.cursor()
|
||||
# Create users table if not exists
|
||||
cursor.execute('''
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
username TEXT UNIQUE NOT NULL,
|
||||
password TEXT NOT NULL,
|
||||
role TEXT NOT NULL
|
||||
)
|
||||
''')
|
||||
# Insert superadmin user if not exists (default password: 'admin', change after first login)
|
||||
cursor.execute('''
|
||||
INSERT OR IGNORE INTO users (username, password, role)
|
||||
VALUES (?, ?, ?)
|
||||
''', ('superadmin', 'superadmin123', 'superadmin'))
|
||||
# Create roles table if not exists
|
||||
cursor.execute('''
|
||||
CREATE TABLE IF NOT EXISTS roles (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name TEXT UNIQUE NOT NULL,
|
||||
access_level TEXT NOT NULL,
|
||||
description TEXT
|
||||
)
|
||||
''')
|
||||
# Insert superadmin role if not exists
|
||||
cursor.execute('''
|
||||
INSERT OR IGNORE INTO roles (name, access_level, description)
|
||||
VALUES (?, ?, ?)
|
||||
''', ('superadmin', 'full', 'Full access to all app areas and functions'))
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
if __name__ == "__main__":
|
||||
# Default path to users.db in instance folder
|
||||
instance_folder = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../instance'))
|
||||
if not os.path.exists(instance_folder):
|
||||
os.makedirs(instance_folder)
|
||||
db_path = os.path.join(instance_folder, 'users.db')
|
||||
create_roles_and_users_tables(db_path)
|
||||
print("Roles and users tables created. Superadmin user and role initialized.")
|
||||
@@ -1,42 +0,0 @@
|
||||
import mariadb
|
||||
|
||||
# Database connection credentials
|
||||
db_config = {
|
||||
"user": "trasabilitate",
|
||||
"password": "Initial01!",
|
||||
"host": "localhost",
|
||||
"database": "trasabilitate_database"
|
||||
}
|
||||
|
||||
# Connect to the database
|
||||
try:
|
||||
conn = mariadb.connect(**db_config)
|
||||
cursor = conn.cursor()
|
||||
print("Connected to the database successfully!")
|
||||
|
||||
# Create the scan1_orders table
|
||||
create_table_query = """
|
||||
CREATE TABLE IF NOT EXISTS scan1_orders (
|
||||
Id INT AUTO_INCREMENT PRIMARY KEY, -- Auto-incremented ID with 6 digits
|
||||
operator_code VARCHAR(4) NOT NULL, -- Operator code with 4 characters
|
||||
CP_full_code VARCHAR(15) NOT NULL UNIQUE, -- Full CP code with up to 15 characters
|
||||
OC1_code VARCHAR(4) NOT NULL, -- OC1 code with 4 characters
|
||||
OC2_code VARCHAR(4) NOT NULL, -- OC2 code with 4 characters
|
||||
CP_base_code VARCHAR(10) GENERATED ALWAYS AS (LEFT(CP_full_code, 10)) STORED, -- Auto-generated base code (first 10 characters of CP_full_code)
|
||||
quality_code INT(3) NOT NULL, -- Quality code with 3 digits
|
||||
date DATE NOT NULL, -- Date in format dd-mm-yyyy
|
||||
time TIME NOT NULL, -- Time in format hh:mm:ss
|
||||
approved_quantity INT DEFAULT 0, -- Auto-incremented quantity for quality_code = 000
|
||||
rejected_quantity INT DEFAULT 0 -- Auto-incremented quantity for quality_code != 000
|
||||
);
|
||||
"""
|
||||
cursor.execute(create_table_query)
|
||||
print("Table 'scan1_orders' created successfully!")
|
||||
|
||||
# Commit changes and close the connection
|
||||
conn.commit()
|
||||
cursor.close()
|
||||
conn.close()
|
||||
|
||||
except mariadb.Error as e:
|
||||
print(f"Error connecting to the database: {e}")
|
||||
@@ -1,41 +0,0 @@
|
||||
import mariadb
|
||||
|
||||
# Database connection credentials
|
||||
# (reuse from create_scan_1db.py or update as needed)
|
||||
db_config = {
|
||||
"user": "trasabilitate",
|
||||
"password": "Initial01!",
|
||||
"host": "localhost",
|
||||
"database": "trasabilitate_database"
|
||||
}
|
||||
|
||||
try:
|
||||
conn = mariadb.connect(**db_config)
|
||||
cursor = conn.cursor()
|
||||
print("Connected to the database successfully!")
|
||||
|
||||
# Create the scanfg_orders table (same structure as scan1_orders)
|
||||
create_table_query = """
|
||||
CREATE TABLE IF NOT EXISTS scanfg_orders (
|
||||
Id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
operator_code VARCHAR(4) NOT NULL,
|
||||
CP_full_code VARCHAR(15) NOT NULL UNIQUE,
|
||||
OC1_code VARCHAR(4) NOT NULL,
|
||||
OC2_code VARCHAR(4) NOT NULL,
|
||||
CP_base_code VARCHAR(10) GENERATED ALWAYS AS (LEFT(CP_full_code, 10)) STORED,
|
||||
quality_code INT(3) NOT NULL,
|
||||
date DATE NOT NULL,
|
||||
time TIME NOT NULL,
|
||||
approved_quantity INT DEFAULT 0,
|
||||
rejected_quantity INT DEFAULT 0
|
||||
);
|
||||
"""
|
||||
cursor.execute(create_table_query)
|
||||
print("Table 'scanfg_orders' created successfully!")
|
||||
|
||||
conn.commit()
|
||||
cursor.close()
|
||||
conn.close()
|
||||
|
||||
except mariadb.Error as e:
|
||||
print(f"Error connecting to the database: {e}")
|
||||
@@ -1,70 +0,0 @@
|
||||
import mariadb
|
||||
|
||||
# Database connection credentials
|
||||
db_config = {
|
||||
"user": "trasabilitate",
|
||||
"password": "Initial01!",
|
||||
"host": "localhost",
|
||||
"database": "trasabilitate_database"
|
||||
}
|
||||
|
||||
# Connect to the database
|
||||
try:
|
||||
conn = mariadb.connect(**db_config)
|
||||
cursor = conn.cursor()
|
||||
print("Connected to the database successfully!")
|
||||
|
||||
# Delete old triggers if they exist
|
||||
try:
|
||||
cursor.execute("DROP TRIGGER IF EXISTS increment_approved_quantity;")
|
||||
print("Old trigger 'increment_approved_quantity' deleted successfully.")
|
||||
except mariadb.Error as e:
|
||||
print(f"Error deleting old trigger 'increment_approved_quantity': {e}")
|
||||
|
||||
try:
|
||||
cursor.execute("DROP TRIGGER IF EXISTS increment_rejected_quantity;")
|
||||
print("Old trigger 'increment_rejected_quantity' deleted successfully.")
|
||||
except mariadb.Error as e:
|
||||
print(f"Error deleting old trigger 'increment_rejected_quantity': {e}")
|
||||
|
||||
# Create corrected trigger for approved_quantity
|
||||
create_approved_trigger = """
|
||||
CREATE TRIGGER increment_approved_quantity
|
||||
BEFORE INSERT ON scan1_orders
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NEW.quality_code = 000 THEN
|
||||
SET NEW.approved_quantity = (
|
||||
SELECT COUNT(*)
|
||||
FROM scan1_orders
|
||||
WHERE CP_base_code = NEW.CP_base_code AND quality_code = 000
|
||||
) + 1;
|
||||
SET NEW.rejected_quantity = (
|
||||
SELECT COUNT(*)
|
||||
FROM scan1_orders
|
||||
WHERE CP_base_code = NEW.CP_base_code AND quality_code != 000
|
||||
);
|
||||
ELSE
|
||||
SET NEW.approved_quantity = (
|
||||
SELECT COUNT(*)
|
||||
FROM scan1_orders
|
||||
WHERE CP_base_code = NEW.CP_base_code AND quality_code = 000
|
||||
);
|
||||
SET NEW.rejected_quantity = (
|
||||
SELECT COUNT(*)
|
||||
FROM scan1_orders
|
||||
WHERE CP_base_code = NEW.CP_base_code AND quality_code != 000
|
||||
) + 1;
|
||||
END IF;
|
||||
END;
|
||||
"""
|
||||
cursor.execute(create_approved_trigger)
|
||||
print("Trigger 'increment_approved_quantity' created successfully!")
|
||||
|
||||
# Commit changes and close the connection
|
||||
conn.commit()
|
||||
cursor.close()
|
||||
conn.close()
|
||||
|
||||
except mariadb.Error as e:
|
||||
print(f"Error connecting to the database or creating triggers: {e}")
|
||||
@@ -1,73 +0,0 @@
|
||||
import mariadb
|
||||
|
||||
# Database connection credentials
|
||||
db_config = {
|
||||
"user": "trasabilitate",
|
||||
"password": "Initial01!",
|
||||
"host": "localhost",
|
||||
"database": "trasabilitate_database"
|
||||
}
|
||||
|
||||
# Connect to the database
|
||||
try:
|
||||
conn = mariadb.connect(**db_config)
|
||||
cursor = conn.cursor()
|
||||
print("Connected to the database successfully!")
|
||||
|
||||
# Delete old triggers if they exist
|
||||
try:
|
||||
cursor.execute("DROP TRIGGER IF EXISTS increment_approved_quantity_fg;")
|
||||
print("Old trigger 'increment_approved_quantity_fg' deleted successfully.")
|
||||
except mariadb.Error as e:
|
||||
print(f"Error deleting old trigger 'increment_approved_quantity_fg': {e}")
|
||||
|
||||
try:
|
||||
cursor.execute("DROP TRIGGER IF EXISTS increment_rejected_quantity_fg;")
|
||||
print("Old trigger 'increment_rejected_quantity_fg' deleted successfully.")
|
||||
except mariadb.Error as e:
|
||||
print(f"Error deleting old trigger 'increment_rejected_quantity_fg': {e}")
|
||||
|
||||
# Create corrected trigger for approved_quantity in scanfg_orders
|
||||
create_approved_trigger_fg = """
|
||||
CREATE TRIGGER increment_approved_quantity_fg
|
||||
BEFORE INSERT ON scanfg_orders
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NEW.quality_code = 000 THEN
|
||||
SET NEW.approved_quantity = (
|
||||
SELECT COUNT(*)
|
||||
FROM scanfg_orders
|
||||
WHERE CP_base_code = NEW.CP_base_code AND quality_code = 000
|
||||
) + 1;
|
||||
SET NEW.rejected_quantity = (
|
||||
SELECT COUNT(*)
|
||||
FROM scanfg_orders
|
||||
WHERE CP_base_code = NEW.CP_base_code AND quality_code != 000
|
||||
);
|
||||
ELSE
|
||||
SET NEW.approved_quantity = (
|
||||
SELECT COUNT(*)
|
||||
FROM scanfg_orders
|
||||
WHERE CP_base_code = NEW.CP_base_code AND quality_code = 000
|
||||
);
|
||||
SET NEW.rejected_quantity = (
|
||||
SELECT COUNT(*)
|
||||
FROM scanfg_orders
|
||||
WHERE CP_base_code = NEW.CP_base_code AND quality_code != 000
|
||||
) + 1;
|
||||
END IF;
|
||||
END;
|
||||
"""
|
||||
cursor.execute(create_approved_trigger_fg)
|
||||
print("Trigger 'increment_approved_quantity_fg' created successfully for scanfg_orders table!")
|
||||
|
||||
# Commit changes and close the connection
|
||||
conn.commit()
|
||||
cursor.close()
|
||||
conn.close()
|
||||
|
||||
print("\n✅ All triggers for scanfg_orders table created successfully!")
|
||||
print("The approved_quantity and rejected_quantity will now be calculated automatically.")
|
||||
|
||||
except mariadb.Error as e:
|
||||
print(f"Error connecting to the database or creating triggers: {e}")
|
||||
@@ -1,25 +0,0 @@
|
||||
import mariadb
|
||||
from app.warehouse import get_db_connection
|
||||
from flask import Flask
|
||||
import os
|
||||
|
||||
def create_warehouse_locations_table():
|
||||
conn = get_db_connection()
|
||||
cursor = conn.cursor()
|
||||
cursor.execute('''
|
||||
CREATE TABLE IF NOT EXISTS warehouse_locations (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
location_code VARCHAR(12) NOT NULL UNIQUE,
|
||||
size INT,
|
||||
description VARCHAR(250)
|
||||
)
|
||||
''')
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
if __name__ == "__main__":
|
||||
instance_path = os.path.abspath("instance")
|
||||
app = Flask(__name__, instance_path=instance_path)
|
||||
with app.app_context():
|
||||
create_warehouse_locations_table()
|
||||
print("warehouse_locations table created or already exists.")
|
||||
@@ -1,30 +0,0 @@
|
||||
import mariadb
|
||||
|
||||
# Database connection credentials
|
||||
def get_db_connection():
|
||||
return mariadb.connect(
|
||||
user="trasabilitate", # Replace with your username
|
||||
password="Initial01!", # Replace with your password
|
||||
host="localhost", # Replace with your host
|
||||
port=3306, # Default MariaDB port
|
||||
database="trasabilitate_database" # Replace with your database name
|
||||
)
|
||||
|
||||
try:
|
||||
# Connect to the database
|
||||
conn = get_db_connection()
|
||||
cursor = conn.cursor()
|
||||
|
||||
# Delete query
|
||||
delete_query = "DELETE FROM scan1_orders"
|
||||
cursor.execute(delete_query)
|
||||
conn.commit()
|
||||
|
||||
print("All data from the 'scan1_orders' table has been deleted successfully.")
|
||||
|
||||
# Close the connection
|
||||
cursor.close()
|
||||
conn.close()
|
||||
|
||||
except mariadb.Error as e:
|
||||
print(f"Error deleting data: {e}")
|
||||
@@ -1,26 +0,0 @@
|
||||
import mariadb
|
||||
import os
|
||||
|
||||
def get_external_db_connection():
|
||||
settings_file = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../instance/external_server.conf'))
|
||||
settings = {}
|
||||
with open(settings_file, 'r') as f:
|
||||
for line in f:
|
||||
key, value = line.strip().split('=', 1)
|
||||
settings[key] = value
|
||||
return mariadb.connect(
|
||||
user=settings['username'],
|
||||
password=settings['password'],
|
||||
host=settings['server_domain'],
|
||||
port=int(settings['port']),
|
||||
database=settings['database_name']
|
||||
)
|
||||
|
||||
if __name__ == "__main__":
|
||||
conn = get_external_db_connection()
|
||||
cursor = conn.cursor()
|
||||
cursor.execute("DROP TABLE IF EXISTS users")
|
||||
cursor.execute("DROP TABLE IF EXISTS roles")
|
||||
conn.commit()
|
||||
conn.close()
|
||||
print("Dropped users and roles tables from external database.")
|
||||
@@ -1,53 +0,0 @@
|
||||
import sqlite3
|
||||
import os
|
||||
|
||||
def check_database(db_path, description):
|
||||
"""Check if a database exists and show its users."""
|
||||
if os.path.exists(db_path):
|
||||
print(f"\n{description}: FOUND at {db_path}")
|
||||
try:
|
||||
conn = sqlite3.connect(db_path)
|
||||
cursor = conn.cursor()
|
||||
|
||||
# Check if users table exists
|
||||
cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='users'")
|
||||
if cursor.fetchone():
|
||||
cursor.execute("SELECT id, username, password, role FROM users")
|
||||
users = cursor.fetchall()
|
||||
if users:
|
||||
print("Users in this database:")
|
||||
for user in users:
|
||||
print(f" ID: {user[0]}, Username: {user[1]}, Password: {user[2]}, Role: {user[3]}")
|
||||
else:
|
||||
print(" Users table exists but is empty")
|
||||
else:
|
||||
print(" No users table found")
|
||||
conn.close()
|
||||
except Exception as e:
|
||||
print(f" Error reading database: {e}")
|
||||
else:
|
||||
print(f"\n{description}: NOT FOUND at {db_path}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
# Check different possible locations for users.db
|
||||
|
||||
# 1. Root quality_recticel/instance/users.db
|
||||
root_instance = "/home/ske087/quality_recticel/instance/users.db"
|
||||
check_database(root_instance, "Root instance users.db")
|
||||
|
||||
# 2. App instance folder
|
||||
app_instance = "/home/ske087/quality_recticel/py_app/instance/users.db"
|
||||
check_database(app_instance, "App instance users.db")
|
||||
|
||||
# 3. Current working directory
|
||||
cwd_db = "/home/ske087/quality_recticel/py_app/users.db"
|
||||
check_database(cwd_db, "Working directory users.db")
|
||||
|
||||
# 4. Flask app database (relative to py_app)
|
||||
flask_db = "/home/ske087/quality_recticel/py_app/app/users.db"
|
||||
check_database(flask_db, "Flask app users.db")
|
||||
|
||||
print("\n" + "="*50)
|
||||
print("RECOMMENDATION:")
|
||||
print("The login should use the external MariaDB database.")
|
||||
print("Make sure you have created the superadmin user in MariaDB using create_roles_table.py")
|
||||
@@ -1,143 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import mariadb
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Add the app directory to the path so we can import our permissions module
|
||||
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
|
||||
|
||||
from permissions import APP_PERMISSIONS, ROLE_HIERARCHY, ACTIONS, get_all_permissions, get_default_permissions_for_role
|
||||
|
||||
def get_external_db_connection():
|
||||
"""Reads the external_server.conf file and returns a MariaDB database connection."""
|
||||
current_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
instance_folder = os.path.join(current_dir, '../../instance')
|
||||
settings_file = os.path.join(instance_folder, 'external_server.conf')
|
||||
|
||||
if not os.path.exists(settings_file):
|
||||
raise FileNotFoundError(f"The external_server.conf file is missing: {settings_file}")
|
||||
|
||||
settings = {}
|
||||
with open(settings_file, 'r') as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if line and '=' in line:
|
||||
key, value = line.split('=', 1)
|
||||
settings[key] = value
|
||||
|
||||
return mariadb.connect(
|
||||
user=settings['username'],
|
||||
password=settings['password'],
|
||||
host=settings['server_domain'],
|
||||
port=int(settings['port']),
|
||||
database=settings['database_name']
|
||||
)
|
||||
|
||||
def main():
|
||||
try:
|
||||
print("=== Populating Permission System ===")
|
||||
conn = get_external_db_connection()
|
||||
cursor = conn.cursor()
|
||||
|
||||
# 1. Populate all permissions
|
||||
print("\n1. Populating permissions...")
|
||||
permissions = get_all_permissions()
|
||||
|
||||
for perm in permissions:
|
||||
try:
|
||||
cursor.execute('''
|
||||
INSERT INTO permissions (permission_key, page, page_name, section, section_name, action, action_name)
|
||||
VALUES (%s, %s, %s, %s, %s, %s, %s)
|
||||
ON DUPLICATE KEY UPDATE
|
||||
page_name = VALUES(page_name),
|
||||
section_name = VALUES(section_name),
|
||||
action_name = VALUES(action_name),
|
||||
updated_at = CURRENT_TIMESTAMP
|
||||
''', (
|
||||
perm['key'],
|
||||
perm['page'],
|
||||
perm['page_name'],
|
||||
perm['section'],
|
||||
perm['section_name'],
|
||||
perm['action'],
|
||||
perm['action_name']
|
||||
))
|
||||
except Exception as e:
|
||||
print(f" ⚠ Error inserting permission {perm['key']}: {e}")
|
||||
|
||||
conn.commit()
|
||||
print(f" ✓ Populated {len(permissions)} permissions")
|
||||
|
||||
# 2. Populate role hierarchy
|
||||
print("\n2. Populating role hierarchy...")
|
||||
for role_name, role_data in ROLE_HIERARCHY.items():
|
||||
try:
|
||||
cursor.execute('''
|
||||
INSERT INTO role_hierarchy (role_name, display_name, description, level)
|
||||
VALUES (%s, %s, %s, %s)
|
||||
ON DUPLICATE KEY UPDATE
|
||||
display_name = VALUES(display_name),
|
||||
description = VALUES(description),
|
||||
level = VALUES(level),
|
||||
updated_at = CURRENT_TIMESTAMP
|
||||
''', (
|
||||
role_name,
|
||||
role_data['name'],
|
||||
role_data['description'],
|
||||
role_data['level']
|
||||
))
|
||||
except Exception as e:
|
||||
print(f" ⚠ Error inserting role {role_name}: {e}")
|
||||
|
||||
conn.commit()
|
||||
print(f" ✓ Populated {len(ROLE_HIERARCHY)} roles")
|
||||
|
||||
# 3. Set default permissions for each role
|
||||
print("\n3. Setting default role permissions...")
|
||||
for role_name in ROLE_HIERARCHY.keys():
|
||||
default_permissions = get_default_permissions_for_role(role_name)
|
||||
|
||||
print(f" Setting permissions for {role_name}: {len(default_permissions)} permissions")
|
||||
|
||||
for permission_key in default_permissions:
|
||||
try:
|
||||
cursor.execute('''
|
||||
INSERT INTO role_permissions (role, permission_key, granted, granted_by)
|
||||
VALUES (%s, %s, TRUE, 'system')
|
||||
ON DUPLICATE KEY UPDATE
|
||||
granted = TRUE,
|
||||
updated_at = CURRENT_TIMESTAMP
|
||||
''', (role_name, permission_key))
|
||||
except Exception as e:
|
||||
print(f" ⚠ Error setting permission {permission_key} for {role_name}: {e}")
|
||||
|
||||
conn.commit()
|
||||
|
||||
# 4. Show summary
|
||||
print("\n4. Permission Summary:")
|
||||
cursor.execute('''
|
||||
SELECT r.role_name, r.display_name, COUNT(rp.permission_key) as permission_count
|
||||
FROM role_hierarchy r
|
||||
LEFT JOIN role_permissions rp ON r.role_name = rp.role AND rp.granted = TRUE
|
||||
GROUP BY r.role_name, r.display_name
|
||||
ORDER BY r.level DESC
|
||||
''')
|
||||
|
||||
results = cursor.fetchall()
|
||||
for role_name, display_name, count in results:
|
||||
print(f" {display_name} ({role_name}): {count} permissions")
|
||||
|
||||
conn.close()
|
||||
print("\n=== Permission System Initialization Complete ===")
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Error: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
@@ -1,30 +0,0 @@
|
||||
import sqlite3
|
||||
import os
|
||||
|
||||
instance_folder = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../instance'))
|
||||
db_path = os.path.join(instance_folder, 'users.db')
|
||||
|
||||
if not os.path.exists(db_path):
|
||||
print("users.db not found at", db_path)
|
||||
exit(1)
|
||||
|
||||
conn = sqlite3.connect(db_path)
|
||||
cursor = conn.cursor()
|
||||
|
||||
# Check if users table exists
|
||||
cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='users'")
|
||||
if not cursor.fetchone():
|
||||
print("No users table found in users.db.")
|
||||
conn.close()
|
||||
exit(1)
|
||||
|
||||
# Print all users
|
||||
cursor.execute("SELECT id, username, password, role FROM users")
|
||||
rows = cursor.fetchall()
|
||||
if not rows:
|
||||
print("No users found in users.db.")
|
||||
else:
|
||||
print("Users in users.db:")
|
||||
for row in rows:
|
||||
print(f"id={row[0]}, username={row[1]}, password={row[2]}, role={row[3]}")
|
||||
conn.close()
|
||||
@@ -1,34 +0,0 @@
|
||||
import mariadb
|
||||
|
||||
# Database connection credentials
|
||||
db_config = {
|
||||
"user": "trasabilitate",
|
||||
"password": "Initial01!",
|
||||
"host": "localhost",
|
||||
"database": "trasabilitate_database"
|
||||
}
|
||||
|
||||
try:
|
||||
# Connect to the database
|
||||
conn = mariadb.connect(**db_config)
|
||||
cursor = conn.cursor()
|
||||
|
||||
# Query to fetch all records from the scan1 table
|
||||
query = "SELECT * FROM scan1_orders ORDER BY Id DESC LIMIT 15"
|
||||
cursor.execute(query)
|
||||
|
||||
# Fetch and print the results
|
||||
rows = cursor.fetchall()
|
||||
if rows:
|
||||
print("Records in the 'scan1_orders' table:")
|
||||
for row in rows:
|
||||
print(row)
|
||||
else:
|
||||
print("No records found in the 'scan1_orders' table.")
|
||||
|
||||
# Close the connection
|
||||
cursor.close()
|
||||
conn.close()
|
||||
|
||||
except mariadb.Error as e:
|
||||
print(f"Error connecting to the database: {e}")
|
||||
@@ -1,50 +0,0 @@
|
||||
import mariadb
|
||||
|
||||
# Database connection credentials
|
||||
DB_CONFIG = {
|
||||
"user": "sa",
|
||||
"password": "12345678",
|
||||
"host": "localhost",
|
||||
"database": "recticel"
|
||||
}
|
||||
|
||||
def recreate_order_for_labels_table():
|
||||
conn = mariadb.connect(**DB_CONFIG)
|
||||
cursor = conn.cursor()
|
||||
print("Connected to the database successfully!")
|
||||
|
||||
# Drop the table if it exists
|
||||
cursor.execute("DROP TABLE IF EXISTS order_for_labels")
|
||||
print("Dropped existing 'order_for_labels' table.")
|
||||
|
||||
# Create the table with the new unique constraint
|
||||
create_table_sql = """
|
||||
CREATE TABLE order_for_labels (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT 'Unique identifier',
|
||||
comanda_productie VARCHAR(15) NOT NULL UNIQUE COMMENT 'Production Order (unique)',
|
||||
cod_articol VARCHAR(15) COMMENT 'Article Code',
|
||||
descr_com_prod VARCHAR(50) NOT NULL COMMENT 'Production Order Description',
|
||||
cantitate INT(3) NOT NULL COMMENT 'Quantity',
|
||||
data_livrare DATE COMMENT 'Delivery date',
|
||||
dimensiune VARCHAR(20) COMMENT 'Dimensions',
|
||||
com_achiz_client VARCHAR(25) COMMENT 'Client Purchase Order',
|
||||
nr_linie_com_client INT(3) COMMENT 'Client Order Line Number',
|
||||
customer_name VARCHAR(50) COMMENT 'Customer Name',
|
||||
customer_article_number VARCHAR(25) COMMENT 'Customer Article Number',
|
||||
open_for_order VARCHAR(25) COMMENT 'Open for Order Status',
|
||||
line_number INT(3) COMMENT 'Line Number',
|
||||
printed_labels TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'Boolean flag: 0=labels not printed, 1=labels printed',
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 'Record creation timestamp',
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Record update timestamp'
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Table for storing order information for label generation';
|
||||
"""
|
||||
cursor.execute(create_table_sql)
|
||||
print("Created new 'order_for_labels' table with unique comanda_productie.")
|
||||
|
||||
conn.commit()
|
||||
cursor.close()
|
||||
conn.close()
|
||||
print("Done.")
|
||||
|
||||
if __name__ == "__main__":
|
||||
recreate_order_for_labels_table()
|
||||
@@ -1,34 +0,0 @@
|
||||
import sqlite3
|
||||
import os
|
||||
from flask import Flask
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config['SECRET_KEY'] = 'your_secret_key' # Use the same key as in __init__.py
|
||||
|
||||
instance_folder = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../instance'))
|
||||
if not os.path.exists(instance_folder):
|
||||
os.makedirs(instance_folder)
|
||||
db_path = os.path.join(instance_folder, 'users.db')
|
||||
|
||||
conn = sqlite3.connect(db_path)
|
||||
cursor = conn.cursor()
|
||||
|
||||
# Create users table if not exists
|
||||
cursor.execute('''
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
username TEXT UNIQUE NOT NULL,
|
||||
password TEXT NOT NULL,
|
||||
role TEXT NOT NULL
|
||||
)
|
||||
''')
|
||||
|
||||
# Insert superadmin user if not exists
|
||||
cursor.execute('''
|
||||
INSERT OR IGNORE INTO users (username, password, role)
|
||||
VALUES (?, ?, ?)
|
||||
''', ('superadmin', 'superadmin123', 'superadmin'))
|
||||
|
||||
conn.commit()
|
||||
conn.close()
|
||||
print("Internal users.db seeded with superadmin user.")
|
||||
637
py_app/app/db_create_scripts/setup_complete_database.py
Executable file
637
py_app/app/db_create_scripts/setup_complete_database.py
Executable file
@@ -0,0 +1,637 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Complete Database Setup Script for Trasabilitate Application
|
||||
This script creates all necessary database tables, triggers, and initial data
|
||||
for quick deployment of the application.
|
||||
|
||||
Usage: python3 setup_complete_database.py
|
||||
"""
|
||||
|
||||
import mariadb
|
||||
import sqlite3
|
||||
import os
|
||||
import sys
|
||||
from datetime import datetime
|
||||
|
||||
# Database configuration
|
||||
DB_CONFIG = {
|
||||
"user": "trasabilitate",
|
||||
"password": "Initial01!",
|
||||
"host": "localhost",
|
||||
"database": "trasabilitate"
|
||||
}
|
||||
|
||||
def print_step(step_num, description):
|
||||
"""Print formatted step information"""
|
||||
print(f"\n{'='*60}")
|
||||
print(f"Step {step_num}: {description}")
|
||||
print('='*60)
|
||||
|
||||
def print_success(message):
|
||||
"""Print success message"""
|
||||
print(f"✅ {message}")
|
||||
|
||||
def print_error(message):
|
||||
"""Print error message"""
|
||||
print(f"❌ {message}")
|
||||
|
||||
def test_database_connection():
|
||||
"""Test if we can connect to the database"""
|
||||
print_step(1, "Testing Database Connection")
|
||||
try:
|
||||
conn = mariadb.connect(**DB_CONFIG)
|
||||
print_success("Successfully connected to MariaDB database 'trasabilitate'")
|
||||
conn.close()
|
||||
return True
|
||||
except Exception as e:
|
||||
print_error(f"Failed to connect to database: {e}")
|
||||
print("\nPlease ensure:")
|
||||
print("1. MariaDB is running")
|
||||
print("2. Database 'trasabilitate' exists")
|
||||
print("3. User 'trasabilitate' has been created with password 'Initial01!'")
|
||||
print("4. User has all privileges on the database")
|
||||
return False
|
||||
|
||||
def create_scan_tables():
|
||||
"""Create scan1_orders and scanfg_orders tables"""
|
||||
print_step(2, "Creating Scan Tables (scan1_orders & scanfg_orders)")
|
||||
|
||||
try:
|
||||
conn = mariadb.connect(**DB_CONFIG)
|
||||
cursor = conn.cursor()
|
||||
|
||||
# Create scan1_orders table
|
||||
scan1_table_query = """
|
||||
CREATE TABLE IF NOT EXISTS scan1_orders (
|
||||
Id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
operator_code VARCHAR(4) NOT NULL,
|
||||
CP_full_code VARCHAR(15) NOT NULL UNIQUE,
|
||||
OC1_code VARCHAR(4) NOT NULL,
|
||||
OC2_code VARCHAR(4) NOT NULL,
|
||||
CP_base_code VARCHAR(10) GENERATED ALWAYS AS (LEFT(CP_full_code, 10)) STORED,
|
||||
quality_code INT(3) NOT NULL,
|
||||
date DATE NOT NULL,
|
||||
time TIME NOT NULL,
|
||||
approved_quantity INT DEFAULT 0,
|
||||
rejected_quantity INT DEFAULT 0
|
||||
);
|
||||
"""
|
||||
cursor.execute(scan1_table_query)
|
||||
print_success("Table 'scan1_orders' created successfully")
|
||||
|
||||
# Create scanfg_orders table
|
||||
scanfg_table_query = """
|
||||
CREATE TABLE IF NOT EXISTS scanfg_orders (
|
||||
Id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
operator_code VARCHAR(4) NOT NULL,
|
||||
CP_full_code VARCHAR(15) NOT NULL UNIQUE,
|
||||
OC1_code VARCHAR(4) NOT NULL,
|
||||
OC2_code VARCHAR(4) NOT NULL,
|
||||
CP_base_code VARCHAR(10) GENERATED ALWAYS AS (LEFT(CP_full_code, 10)) STORED,
|
||||
quality_code INT(3) NOT NULL,
|
||||
date DATE NOT NULL,
|
||||
time TIME NOT NULL,
|
||||
approved_quantity INT DEFAULT 0,
|
||||
rejected_quantity INT DEFAULT 0
|
||||
);
|
||||
"""
|
||||
cursor.execute(scanfg_table_query)
|
||||
print_success("Table 'scanfg_orders' created successfully")
|
||||
|
||||
conn.commit()
|
||||
cursor.close()
|
||||
conn.close()
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print_error(f"Failed to create scan tables: {e}")
|
||||
return False
|
||||
|
||||
def create_order_for_labels_table():
|
||||
"""Create order_for_labels table"""
|
||||
print_step(3, "Creating Order for Labels Table")
|
||||
|
||||
try:
|
||||
conn = mariadb.connect(**DB_CONFIG)
|
||||
cursor = conn.cursor()
|
||||
|
||||
order_labels_query = """
|
||||
CREATE TABLE IF NOT EXISTS order_for_labels (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
comanda_productie VARCHAR(15) NOT NULL,
|
||||
cod_articol VARCHAR(15) NULL,
|
||||
descr_com_prod VARCHAR(50) NOT NULL,
|
||||
cantitate INT(3) NOT NULL,
|
||||
com_achiz_client VARCHAR(25) NULL,
|
||||
nr_linie_com_client INT(3) NULL,
|
||||
customer_name VARCHAR(50) NULL,
|
||||
customer_article_number VARCHAR(25) NULL,
|
||||
open_for_order VARCHAR(25) NULL,
|
||||
line_number INT(3) NULL,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
||||
);
|
||||
"""
|
||||
cursor.execute(order_labels_query)
|
||||
print_success("Table 'order_for_labels' created successfully")
|
||||
|
||||
conn.commit()
|
||||
cursor.close()
|
||||
conn.close()
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print_error(f"Failed to create order_for_labels table: {e}")
|
||||
return False
|
||||
|
||||
def create_warehouse_locations_table():
|
||||
"""Create warehouse_locations table"""
|
||||
print_step(4, "Creating Warehouse Locations Table")
|
||||
|
||||
try:
|
||||
conn = mariadb.connect(**DB_CONFIG)
|
||||
cursor = conn.cursor()
|
||||
|
||||
warehouse_query = """
|
||||
CREATE TABLE IF NOT EXISTS warehouse_locations (
|
||||
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
location_code VARCHAR(12) NOT NULL UNIQUE,
|
||||
size INT,
|
||||
description VARCHAR(250)
|
||||
);
|
||||
"""
|
||||
cursor.execute(warehouse_query)
|
||||
print_success("Table 'warehouse_locations' created successfully")
|
||||
|
||||
conn.commit()
|
||||
cursor.close()
|
||||
conn.close()
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print_error(f"Failed to create warehouse_locations table: {e}")
|
||||
return False
|
||||
|
||||
def create_permissions_tables():
|
||||
"""Create permission management tables"""
|
||||
print_step(5, "Creating Permission Management Tables")
|
||||
|
||||
try:
|
||||
conn = mariadb.connect(**DB_CONFIG)
|
||||
cursor = conn.cursor()
|
||||
|
||||
# Create permissions table
|
||||
permissions_query = """
|
||||
CREATE TABLE IF NOT EXISTS permissions (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
permission_key VARCHAR(255) UNIQUE NOT NULL,
|
||||
page VARCHAR(100) NOT NULL,
|
||||
page_name VARCHAR(255) NOT NULL,
|
||||
section VARCHAR(100) NOT NULL,
|
||||
section_name VARCHAR(255) NOT NULL,
|
||||
action VARCHAR(50) NOT NULL,
|
||||
action_name VARCHAR(255) NOT NULL,
|
||||
description TEXT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
"""
|
||||
cursor.execute(permissions_query)
|
||||
print_success("Table 'permissions' created successfully")
|
||||
|
||||
# Create role_permissions table
|
||||
role_permissions_query = """
|
||||
CREATE TABLE IF NOT EXISTS role_permissions (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
role_name VARCHAR(100) NOT NULL,
|
||||
permission_id INT NOT NULL,
|
||||
granted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
granted_by VARCHAR(100),
|
||||
FOREIGN KEY (permission_id) REFERENCES permissions(id) ON DELETE CASCADE,
|
||||
UNIQUE KEY unique_role_permission (role_name, permission_id)
|
||||
);
|
||||
"""
|
||||
cursor.execute(role_permissions_query)
|
||||
print_success("Table 'role_permissions' created successfully")
|
||||
|
||||
# Create role_hierarchy table
|
||||
role_hierarchy_query = """
|
||||
CREATE TABLE IF NOT EXISTS role_hierarchy (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
role_name VARCHAR(100) UNIQUE NOT NULL,
|
||||
role_display_name VARCHAR(255) NOT NULL,
|
||||
level INT NOT NULL,
|
||||
parent_role VARCHAR(100),
|
||||
description TEXT,
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
"""
|
||||
cursor.execute(role_hierarchy_query)
|
||||
print_success("Table 'role_hierarchy' created successfully")
|
||||
|
||||
# Create permission_audit_log table
|
||||
audit_log_query = """
|
||||
CREATE TABLE IF NOT EXISTS permission_audit_log (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
action VARCHAR(50) NOT NULL,
|
||||
role_name VARCHAR(100),
|
||||
permission_key VARCHAR(255),
|
||||
user_id VARCHAR(100),
|
||||
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
details TEXT,
|
||||
ip_address VARCHAR(45)
|
||||
);
|
||||
"""
|
||||
cursor.execute(audit_log_query)
|
||||
print_success("Table 'permission_audit_log' created successfully")
|
||||
|
||||
conn.commit()
|
||||
cursor.close()
|
||||
conn.close()
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print_error(f"Failed to create permissions tables: {e}")
|
||||
return False
|
||||
|
||||
def create_sqlite_tables():
|
||||
"""Create SQLite tables for users and roles"""
|
||||
print_step(6, "Creating SQLite User and Role Tables")
|
||||
|
||||
try:
|
||||
# Create instance folder if it doesn't exist
|
||||
instance_folder = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../instance'))
|
||||
if not os.path.exists(instance_folder):
|
||||
os.makedirs(instance_folder)
|
||||
|
||||
db_path = os.path.join(instance_folder, 'users.db')
|
||||
|
||||
conn = sqlite3.connect(db_path)
|
||||
cursor = conn.cursor()
|
||||
|
||||
# Create users table
|
||||
cursor.execute('''
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
username TEXT UNIQUE NOT NULL,
|
||||
password TEXT NOT NULL,
|
||||
role TEXT NOT NULL
|
||||
)
|
||||
''')
|
||||
|
||||
# Insert superadmin user if not exists
|
||||
cursor.execute('''
|
||||
INSERT OR IGNORE INTO users (username, password, role)
|
||||
VALUES (?, ?, ?)
|
||||
''', ('superadmin', 'superadmin123', 'superadmin'))
|
||||
|
||||
# Create roles table
|
||||
cursor.execute('''
|
||||
CREATE TABLE IF NOT EXISTS roles (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name TEXT UNIQUE NOT NULL,
|
||||
access_level TEXT NOT NULL,
|
||||
description TEXT
|
||||
)
|
||||
''')
|
||||
|
||||
# Insert superadmin role if not exists
|
||||
cursor.execute('''
|
||||
INSERT OR IGNORE INTO roles (name, access_level, description)
|
||||
VALUES (?, ?, ?)
|
||||
''', ('superadmin', 'full', 'Full access to all app areas and functions'))
|
||||
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
print_success("SQLite tables created and superadmin user initialized")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print_error(f"Failed to create SQLite tables: {e}")
|
||||
return False
|
||||
|
||||
def create_database_triggers():
|
||||
"""Create database triggers for automatic quantity calculations"""
|
||||
print_step(7, "Creating Database Triggers")
|
||||
|
||||
try:
|
||||
conn = mariadb.connect(**DB_CONFIG)
|
||||
cursor = conn.cursor()
|
||||
|
||||
# Drop existing triggers if they exist
|
||||
trigger_drops = [
|
||||
"DROP TRIGGER IF EXISTS increment_approved_quantity;",
|
||||
"DROP TRIGGER IF EXISTS increment_rejected_quantity;",
|
||||
"DROP TRIGGER IF EXISTS increment_approved_quantity_fg;",
|
||||
"DROP TRIGGER IF EXISTS increment_rejected_quantity_fg;"
|
||||
]
|
||||
|
||||
for drop_query in trigger_drops:
|
||||
cursor.execute(drop_query)
|
||||
|
||||
# Create trigger for scan1_orders approved quantity
|
||||
scan1_approved_trigger = """
|
||||
CREATE TRIGGER increment_approved_quantity
|
||||
AFTER INSERT ON scan1_orders
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NEW.quality_code = 000 THEN
|
||||
UPDATE scan1_orders
|
||||
SET approved_quantity = approved_quantity + 1
|
||||
WHERE CP_base_code = NEW.CP_base_code;
|
||||
ELSE
|
||||
UPDATE scan1_orders
|
||||
SET rejected_quantity = rejected_quantity + 1
|
||||
WHERE CP_base_code = NEW.CP_base_code;
|
||||
END IF;
|
||||
END;
|
||||
"""
|
||||
cursor.execute(scan1_approved_trigger)
|
||||
print_success("Trigger 'increment_approved_quantity' created for scan1_orders")
|
||||
|
||||
# Create trigger for scanfg_orders approved quantity
|
||||
scanfg_approved_trigger = """
|
||||
CREATE TRIGGER increment_approved_quantity_fg
|
||||
AFTER INSERT ON scanfg_orders
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NEW.quality_code = 000 THEN
|
||||
UPDATE scanfg_orders
|
||||
SET approved_quantity = approved_quantity + 1
|
||||
WHERE CP_base_code = NEW.CP_base_code;
|
||||
ELSE
|
||||
UPDATE scanfg_orders
|
||||
SET rejected_quantity = rejected_quantity + 1
|
||||
WHERE CP_base_code = NEW.CP_base_code;
|
||||
END IF;
|
||||
END;
|
||||
"""
|
||||
cursor.execute(scanfg_approved_trigger)
|
||||
print_success("Trigger 'increment_approved_quantity_fg' created for scanfg_orders")
|
||||
|
||||
conn.commit()
|
||||
cursor.close()
|
||||
conn.close()
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print_error(f"Failed to create database triggers: {e}")
|
||||
return False
|
||||
|
||||
def populate_permissions_data():
|
||||
"""Populate permissions and roles with default data"""
|
||||
print_step(8, "Populating Permissions and Roles Data")
|
||||
|
||||
try:
|
||||
conn = mariadb.connect(**DB_CONFIG)
|
||||
cursor = conn.cursor()
|
||||
|
||||
# Define all permissions
|
||||
permissions_data = [
|
||||
# Home page permissions
|
||||
('home.view', 'home', 'Home Page', 'navigation', 'Navigation', 'view', 'View Home Page', 'Access to home page'),
|
||||
|
||||
# Scan1 permissions
|
||||
('scan1.view', 'scan1', 'Scan1 Page', 'scanning', 'Scanning Operations', 'view', 'View Scan1', 'Access to scan1 page'),
|
||||
('scan1.scan', 'scan1', 'Scan1 Page', 'scanning', 'Scanning Operations', 'scan', 'Perform Scan1', 'Ability to perform scan1 operations'),
|
||||
('scan1.history', 'scan1', 'Scan1 Page', 'scanning', 'Scanning Operations', 'history', 'View Scan1 History', 'View scan1 operation history'),
|
||||
|
||||
# ScanFG permissions
|
||||
('scanfg.view', 'scanfg', 'ScanFG Page', 'scanning', 'Scanning Operations', 'view', 'View ScanFG', 'Access to scanfg page'),
|
||||
('scanfg.scan', 'scanfg', 'ScanFG Page', 'scanning', 'Scanning Operations', 'scan', 'Perform ScanFG', 'Ability to perform scanfg operations'),
|
||||
('scanfg.history', 'scanfg', 'ScanFG Page', 'scanning', 'Scanning Operations', 'history', 'View ScanFG History', 'View scanfg operation history'),
|
||||
|
||||
# Warehouse permissions
|
||||
('warehouse.view', 'warehouse', 'Warehouse Management', 'warehouse', 'Warehouse Operations', 'view', 'View Warehouse', 'Access to warehouse page'),
|
||||
('warehouse.manage_locations', 'warehouse', 'Warehouse Management', 'warehouse', 'Warehouse Operations', 'manage', 'Manage Locations', 'Add, edit, delete warehouse locations'),
|
||||
('warehouse.view_locations', 'warehouse', 'Warehouse Management', 'warehouse', 'Warehouse Operations', 'view_locations', 'View Locations', 'View warehouse locations'),
|
||||
|
||||
# Labels permissions
|
||||
('labels.view', 'labels', 'Label Management', 'labels', 'Label Operations', 'view', 'View Labels', 'Access to labels page'),
|
||||
('labels.print', 'labels', 'Label Management', 'labels', 'Label Operations', 'print', 'Print Labels', 'Print labels'),
|
||||
('labels.manage_orders', 'labels', 'Label Management', 'labels', 'Label Operations', 'manage', 'Manage Label Orders', 'Manage label orders'),
|
||||
|
||||
# Print Module permissions
|
||||
('print.view', 'print', 'Print Module', 'printing', 'Printing Operations', 'view', 'View Print Module', 'Access to print module'),
|
||||
('print.execute', 'print', 'Print Module', 'printing', 'Printing Operations', 'execute', 'Execute Print', 'Execute print operations'),
|
||||
('print.manage_queue', 'print', 'Print Module', 'printing', 'Printing Operations', 'manage_queue', 'Manage Print Queue', 'Manage print queue'),
|
||||
|
||||
# Settings permissions
|
||||
('settings.view', 'settings', 'Settings', 'system', 'System Management', 'view', 'View Settings', 'Access to settings page'),
|
||||
('settings.edit', 'settings', 'Settings', 'system', 'System Management', 'edit', 'Edit Settings', 'Modify application settings'),
|
||||
('settings.database', 'settings', 'Settings', 'system', 'System Management', 'database', 'Database Settings', 'Manage database settings'),
|
||||
|
||||
# User Management permissions
|
||||
('users.view', 'users', 'User Management', 'admin', 'Administration', 'view', 'View Users', 'View user list'),
|
||||
('users.create', 'users', 'User Management', 'admin', 'Administration', 'create', 'Create Users', 'Create new users'),
|
||||
('users.edit', 'users', 'User Management', 'admin', 'Administration', 'edit', 'Edit Users', 'Edit existing users'),
|
||||
('users.delete', 'users', 'User Management', 'admin', 'Administration', 'delete', 'Delete Users', 'Delete users'),
|
||||
|
||||
# Permission Management permissions
|
||||
('permissions.view', 'permissions', 'Permission Management', 'admin', 'Administration', 'view', 'View Permissions', 'View permissions'),
|
||||
('permissions.assign', 'permissions', 'Permission Management', 'admin', 'Administration', 'assign', 'Assign Permissions', 'Assign permissions to roles'),
|
||||
('permissions.audit', 'permissions', 'Permission Management', 'admin', 'Administration', 'audit', 'View Audit Log', 'View permission audit log'),
|
||||
]
|
||||
|
||||
# Insert permissions
|
||||
permission_insert_query = """
|
||||
INSERT IGNORE INTO permissions
|
||||
(permission_key, page, page_name, section, section_name, action, action_name, description)
|
||||
VALUES (%s, %s, %s, %s, %s, %s, %s, %s)
|
||||
"""
|
||||
|
||||
cursor.executemany(permission_insert_query, permissions_data)
|
||||
print_success(f"Inserted {len(permissions_data)} permissions")
|
||||
|
||||
# Define role hierarchy
|
||||
roles_data = [
|
||||
('superadmin', 'Super Administrator', 1, None, 'Full system access with all permissions'),
|
||||
('admin', 'Administrator', 2, 'superadmin', 'Administrative access with most permissions'),
|
||||
('manager', 'Manager', 3, 'admin', 'Management level access'),
|
||||
('quality_manager', 'Quality Manager', 4, 'manager', 'Quality control and scanning operations'),
|
||||
('warehouse_manager', 'Warehouse Manager', 4, 'manager', 'Warehouse operations and management'),
|
||||
('quality_worker', 'Quality Worker', 5, 'quality_manager', 'Basic quality scanning operations'),
|
||||
('warehouse_worker', 'Warehouse Worker', 5, 'warehouse_manager', 'Basic warehouse operations'),
|
||||
]
|
||||
|
||||
# Insert roles
|
||||
role_insert_query = """
|
||||
INSERT IGNORE INTO role_hierarchy
|
||||
(role_name, role_display_name, level, parent_role, description)
|
||||
VALUES (%s, %s, %s, %s, %s)
|
||||
"""
|
||||
|
||||
cursor.executemany(role_insert_query, roles_data)
|
||||
print_success(f"Inserted {len(roles_data)} roles")
|
||||
|
||||
# Assign permissions to roles
|
||||
# Get all permission IDs
|
||||
cursor.execute("SELECT id, permission_key FROM permissions")
|
||||
permissions = {key: id for id, key in cursor.fetchall()}
|
||||
|
||||
# Define role-permission mappings
|
||||
role_permissions = {
|
||||
'superadmin': list(permissions.values()), # All permissions
|
||||
'admin': [pid for key, pid in permissions.items() if not key.startswith('permissions.audit')], # All except audit
|
||||
'manager': [permissions[key] for key in permissions.keys() if any(key.startswith(prefix) for prefix in ['home.', 'settings.view', 'users.view'])],
|
||||
'quality_manager': [permissions[key] for key in permissions.keys() if any(key.startswith(prefix) for prefix in ['home.', 'scan1.', 'scanfg.', 'labels.', 'print.'])],
|
||||
'warehouse_manager': [permissions[key] for key in permissions.keys() if any(key.startswith(prefix) for prefix in ['home.', 'warehouse.', 'labels.'])],
|
||||
'quality_worker': [permissions[key] for key in permissions.keys() if any(key.startswith(prefix) for prefix in ['home.', 'scan1.view', 'scan1.scan', 'scanfg.view', 'scanfg.scan'])],
|
||||
'warehouse_worker': [permissions[key] for key in permissions.keys() if any(key.startswith(prefix) for prefix in ['home.', 'warehouse.view', 'warehouse.view_locations'])],
|
||||
}
|
||||
|
||||
# Insert role permissions
|
||||
for role, permission_ids in role_permissions.items():
|
||||
for permission_id in permission_ids:
|
||||
cursor.execute("""
|
||||
INSERT IGNORE INTO role_permissions (role_name, permission_id)
|
||||
VALUES (%s, %s)
|
||||
""", (role, permission_id))
|
||||
|
||||
print_success("Role permissions assigned successfully")
|
||||
|
||||
conn.commit()
|
||||
cursor.close()
|
||||
conn.close()
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print_error(f"Failed to populate permissions data: {e}")
|
||||
return False
|
||||
|
||||
def update_external_config():
|
||||
"""Update external_server.conf with correct database settings"""
|
||||
print_step(9, "Updating External Server Configuration")
|
||||
|
||||
try:
|
||||
config_path = os.path.join(os.path.dirname(__file__), '../../instance/external_server.conf')
|
||||
|
||||
config_content = """server_domain=localhost
|
||||
port=3306
|
||||
database_name=trasabilitate
|
||||
username=trasabilitate
|
||||
password=Initial01!
|
||||
"""
|
||||
|
||||
# Create instance directory if it doesn't exist
|
||||
os.makedirs(os.path.dirname(config_path), exist_ok=True)
|
||||
|
||||
with open(config_path, 'w') as f:
|
||||
f.write(config_content)
|
||||
|
||||
print_success("External server configuration updated")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print_error(f"Failed to update external config: {e}")
|
||||
return False
|
||||
|
||||
def verify_database_setup():
|
||||
"""Verify that all tables were created successfully"""
|
||||
print_step(10, "Verifying Database Setup")
|
||||
|
||||
try:
|
||||
conn = mariadb.connect(**DB_CONFIG)
|
||||
cursor = conn.cursor()
|
||||
|
||||
# Check MariaDB tables
|
||||
cursor.execute("SHOW TABLES")
|
||||
tables = [table[0] for table in cursor.fetchall()]
|
||||
|
||||
expected_tables = [
|
||||
'scan1_orders',
|
||||
'scanfg_orders',
|
||||
'order_for_labels',
|
||||
'warehouse_locations',
|
||||
'permissions',
|
||||
'role_permissions',
|
||||
'role_hierarchy',
|
||||
'permission_audit_log'
|
||||
]
|
||||
|
||||
print("\n📊 MariaDB Tables Status:")
|
||||
for table in expected_tables:
|
||||
if table in tables:
|
||||
print_success(f"Table '{table}' exists")
|
||||
else:
|
||||
print_error(f"Table '{table}' missing")
|
||||
|
||||
# Check triggers
|
||||
cursor.execute("SHOW TRIGGERS")
|
||||
triggers = [trigger[0] for trigger in cursor.fetchall()]
|
||||
|
||||
expected_triggers = [
|
||||
'increment_approved_quantity',
|
||||
'increment_approved_quantity_fg'
|
||||
]
|
||||
|
||||
print("\n🔧 Database Triggers Status:")
|
||||
for trigger in expected_triggers:
|
||||
if trigger in triggers:
|
||||
print_success(f"Trigger '{trigger}' exists")
|
||||
else:
|
||||
print_error(f"Trigger '{trigger}' missing")
|
||||
|
||||
cursor.close()
|
||||
conn.close()
|
||||
|
||||
# Check SQLite database
|
||||
instance_folder = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../instance'))
|
||||
sqlite_path = os.path.join(instance_folder, 'users.db')
|
||||
|
||||
if os.path.exists(sqlite_path):
|
||||
print_success("SQLite database 'users.db' exists")
|
||||
else:
|
||||
print_error("SQLite database 'users.db' missing")
|
||||
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print_error(f"Failed to verify database setup: {e}")
|
||||
return False
|
||||
|
||||
def main():
|
||||
"""Main function to orchestrate the complete database setup"""
|
||||
print("🚀 Trasabilitate Application - Complete Database Setup")
|
||||
print(f"Started at: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
||||
|
||||
steps = [
|
||||
test_database_connection,
|
||||
create_scan_tables,
|
||||
create_order_for_labels_table,
|
||||
create_warehouse_locations_table,
|
||||
create_permissions_tables,
|
||||
create_sqlite_tables,
|
||||
create_database_triggers,
|
||||
populate_permissions_data,
|
||||
update_external_config,
|
||||
verify_database_setup
|
||||
]
|
||||
|
||||
success_count = 0
|
||||
|
||||
for step in steps:
|
||||
if step():
|
||||
success_count += 1
|
||||
else:
|
||||
print(f"\n❌ Setup failed at step: {step.__name__}")
|
||||
print("Please check the error messages above and resolve the issues.")
|
||||
sys.exit(1)
|
||||
|
||||
print(f"\n{'='*60}")
|
||||
print("🎉 DATABASE SETUP COMPLETED SUCCESSFULLY!")
|
||||
print(f"{'='*60}")
|
||||
print(f"✅ All {success_count} steps completed successfully")
|
||||
print(f"📅 Completed at: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
||||
print("\n📋 Setup Summary:")
|
||||
print(" • MariaDB tables created with triggers")
|
||||
print(" • SQLite user database initialized")
|
||||
print(" • Permissions system fully configured")
|
||||
print(" • Default superadmin user created (username: superadmin, password: superadmin123)")
|
||||
print(" • Configuration files updated")
|
||||
print("\n🚀 Your application is ready to run!")
|
||||
print(" Run: python3 run.py")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,37 +0,0 @@
|
||||
import mariadb
|
||||
|
||||
# Database connection credentials
|
||||
def get_db_connection():
|
||||
return mariadb.connect(
|
||||
user="trasabilitate", # Replace with your username
|
||||
password="Initial01!", # Replace with your password
|
||||
host="localhost", # Replace with your host
|
||||
port=3306, # Default MariaDB port
|
||||
database="trasabilitate_database" # Replace with your database name
|
||||
)
|
||||
|
||||
try:
|
||||
# Connect to the database
|
||||
conn = get_db_connection()
|
||||
cursor = conn.cursor()
|
||||
|
||||
# Insert query
|
||||
insert_query = """
|
||||
INSERT INTO scan1_orders (operator_code, CP_full_code, OC1_code, OC2_code, quality_code, date, time)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?)
|
||||
"""
|
||||
# Values to insert
|
||||
values = ('OP01', 'CP12345678-0002', 'OC11', 'OC22', 000, '2025-04-22', '14:30:00')
|
||||
|
||||
# Execute the query
|
||||
cursor.execute(insert_query, values)
|
||||
conn.commit()
|
||||
|
||||
print("Test data inserted successfully into scan1_orders.")
|
||||
|
||||
# Close the connection
|
||||
cursor.close()
|
||||
conn.close()
|
||||
|
||||
except mariadb.Error as e:
|
||||
print(f"Error inserting data: {e}")
|
||||
Reference in New Issue
Block a user