- Add SchemaVerifier class for automatic database schema verification and repair - Implement warehouse_manager (Level 75) and warehouse_worker (Level 35) roles - Add zone-based access control for warehouse workers - Implement worker-manager binding system with zone filtering - Add comprehensive database auto-repair on Docker initialization - Remove Module Access section from user form (role-based access only) - Add autocomplete attributes to password fields for better UX - Include detailed documentation for warehouse implementation - Update initialize_db.py with schema verification as Step 0
17 KiB
Warehouse Module: Roles, Access Control & Worker-Manager Binding
Executive Summary
This document proposes a comprehensive role-based access control (RBAC) system for the warehouse module, including:
- New warehouse module roles (warehouse_manager, warehouse_worker)
- Worker-Manager binding model for hierarchical access control
- Granular access control rules differentiating manager vs worker capabilities
- Database schema extensions to support these features
1. Current System Architecture
Existing Roles (in access_control.py)
ROLES = {
'superadmin': Level 100 - Full system access (all modules)
'admin': Level 90 - Administrative access (quality, settings)
'manager': Level 70 - Full quality module access
'worker': Level 50 - Limited quality inspections
}
Current Module Structure
- quality: Inspections + Reports
- Workers can: View + Create inspections
- Managers can: View, Create, Edit, Delete inspections + Export/Download reports
- settings: System configuration
- Only superadmin/admin can access
- warehouse: NEW - Boxes management, locations, inventory
2. Proposed Warehouse Module Roles
2.1 New Roles for Warehouse Module
warehouse_manager (Level 75)
- Description: Full warehouse module access - manages operations, inventory, and reports
- Assigned Modules:
['quality', 'warehouse'](if quality access granted) - Page Access: ALL warehouse pages (input + report/analytics)
- Key Capabilities:
- Set box locations (input pages)
- Create/manage warehouse locations
- View inventory reports and analytics
- Export warehouse data
- Download reports
- Manage warehouse users/workers
warehouse_worker (Level 35)
- Description: Limited warehouse module access - can only input data, no reports
- Assigned Modules:
['warehouse'] - Page Access: INPUT PAGES ONLY
- Key Capabilities:
- Set box locations
- Create/update warehouse entries
- View own submitted data
- ✗ Cannot view reports
- ✗ Cannot access analytics
- ✗ Cannot export data
- ✗ Cannot manage other users
3. Warehouse Module Page Structure
3.1 Input Pages (accessible to both manager & worker)
/warehouse/ Dashboard/launcher
/warehouse/set-boxes-locations Add/update box inventory
/warehouse/locations Create/manage location codes
/warehouse/set-boxes-locations Quick entry form
3.2 Report/Analytics Pages (MANAGER ONLY)
/warehouse/reports Analytics & reports dashboard
/warehouse/reports/inventory-summary Inventory overview
/warehouse/reports/location-usage Location utilization stats
/warehouse/reports/stock-movements Historical movements
/warehouse/reports/export Data export interface
/warehouse/analytics/trends Trend analysis
4. Worker-Manager Binding Model
4.1 Database Schema: worker_manager_bindings
CREATE TABLE worker_manager_bindings (
id INT AUTO_INCREMENT PRIMARY KEY,
manager_id INT NOT NULL, -- warehouse_manager user ID
worker_id INT NOT NULL, -- warehouse_worker user ID
warehouse_zone VARCHAR(100), -- OPTIONAL: restrict worker to specific zone
is_active TINYINT(1) DEFAULT 1,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY unique_binding (manager_id, worker_id),
FOREIGN KEY (manager_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (worker_id) REFERENCES users(id) ON DELETE CASCADE,
CHECK (manager_id != worker_id) -- Prevent self-binding
);
4.2 Binding Semantics
- One-to-Many Relationship: A manager can oversee multiple workers, but a worker is assigned to ONE primary manager
- Optional Zone Restriction: Workers can be confined to specific warehouse zones (e.g., "Zone A", "Cold Storage", "High Shelf")
- Hierarchy Enforcement:
- Managers can only view/edit data from their assigned workers
- Workers can only see their own data
- Superadmin/admin can override and see everything
5. Access Control Rules (MODULE_PERMISSIONS)
5.1 Updated Structure for Warehouse Module
MODULE_PERMISSIONS = {
'warehouse': {
'name': 'Warehouse Module',
'sections': {
'input': {
'name': 'Warehouse Data Input',
'actions': {
'view': 'View warehouse input pages',
'create': 'Create warehouse entries',
'edit': 'Edit warehouse entries',
'delete': 'Delete warehouse entries'
},
'superadmin': ['view', 'create', 'edit', 'delete'],
'admin': ['view', 'create', 'edit', 'delete'],
'warehouse_manager': ['view', 'create', 'edit', 'delete'],
'warehouse_worker': ['view', 'create', 'edit'],
'manager': [], # Quality managers don't auto-get warehouse access
'worker': []
},
'reports': {
'name': 'Warehouse Reports & Analytics',
'actions': {
'view': 'View warehouse reports',
'export': 'Export warehouse data',
'download': 'Download reports',
'analytics': 'View analytics'
},
'superadmin': ['view', 'export', 'download', 'analytics'],
'admin': ['view', 'export', 'download', 'analytics'],
'warehouse_manager': ['view', 'export', 'download', 'analytics'],
'warehouse_worker': [], # Workers get NO report access
'manager': [],
'worker': []
},
'locations': {
'name': 'Location Management',
'actions': {
'view': 'View locations',
'create': 'Create locations',
'edit': 'Edit locations',
'delete': 'Delete locations'
},
'superadmin': ['view', 'create', 'edit', 'delete'],
'admin': ['view', 'create', 'edit', 'delete'],
'warehouse_manager': ['view', 'create', 'edit', 'delete'],
'warehouse_worker': ['view'], # Workers can only view existing locations
'manager': [],
'worker': []
},
'management': {
'name': 'Warehouse User Management',
'actions': {
'manage_workers': 'Manage assigned workers',
'manage_zones': 'Manage warehouse zones'
},
'superadmin': ['manage_workers', 'manage_zones'],
'admin': ['manage_workers', 'manage_zones'],
'warehouse_manager': ['manage_workers'], # Can assign/manage workers
'warehouse_worker': [], # No management access
'manager': [],
'worker': []
}
}
}
}
6. Implementation Details
6.1 Database Changes Required
-
Insert new roles into
rolestable:INSERT INTO roles (name, description, level) VALUES ('warehouse_manager', 'Warehouse Manager - Full warehouse module access', 75), ('warehouse_worker', 'Warehouse Worker - Input-only warehouse access', 35); -
Create worker-manager binding table (see schema above)
-
Update user interface to assign warehouse roles
6.2 Code Changes
A. Update access_control.py
Add new roles:
ROLES = {
# ... existing roles ...
'warehouse_manager': {
'name': 'Warehouse Manager',
'description': 'Full access to warehouse module operations',
'level': 75,
'modules': ['warehouse']
},
'warehouse_worker': {
'name': 'Warehouse Worker',
'description': 'Limited warehouse access - input only, no reports',
'level': 35,
'modules': ['warehouse']
}
}
Add warehouse module permissions (see 5.1 above)
B. Create route decorators
def can_access_warehouse_reports(f):
"""Only warehouse_manager, admin, superadmin can access reports"""
@wraps(f)
def decorated_function(*args, **kwargs):
user_role = session.get('role', 'worker')
if user_role not in ['superadmin', 'admin', 'warehouse_manager']:
flash('Access denied: Only managers can view warehouse reports', 'error')
return redirect(url_for('warehouse.warehouse_index'))
return f(*args, **kwargs)
return decorated_function
def can_access_warehouse_input(f):
"""warehouse_manager and warehouse_worker can access input pages"""
@wraps(f)
def decorated_function(*args, **kwargs):
user_role = session.get('role', 'worker')
if user_role not in ['superadmin', 'admin', 'warehouse_manager', 'warehouse_worker']:
flash('Access denied: You do not have warehouse access', 'error')
return redirect(url_for('main.dashboard'))
return f(*args, **kwargs)
return decorated_function
C. Worker data filtering
Workers should only see their own entries. Managers see all their workers' entries.
def get_worker_data_filter(user_id, user_role):
"""Get SQL WHERE clause based on role and worker-manager binding"""
if user_role == 'superadmin' or user_role == 'admin':
return "" # No filter - see everything
if user_role == 'warehouse_manager':
# Get all workers assigned to this manager
cursor = get_db().cursor()
cursor.execute("""
SELECT worker_id FROM worker_manager_bindings
WHERE manager_id = %s AND is_active = 1
""", (user_id,))
worker_ids = [row[0] for row in cursor.fetchall()]
if worker_ids:
return f"AND created_by_user_id IN ({','.join(map(str, worker_ids))})"
return "AND created_by_user_id = %s" % user_id # If no workers, see own data
if user_role == 'warehouse_worker':
return f"AND created_by_user_id = {user_id}" # Only their own data
return ""
7. User Interface Changes
7.1 User Creation/Edit Form (user_form.html)
Add warehouse role options to the role dropdown:
<!-- Existing roles -->
<option value="superadmin">Super Admin (Level 100)</option>
<option value="admin">Admin (Level 90)</option>
<option value="manager">Manager - Quality (Level 70)</option>
<option value="warehouse_manager">Manager - Warehouse (Level 75)</option>
<option value="worker">Worker - Quality (Level 50)</option>
<option value="warehouse_worker">Worker - Warehouse (Level 35)</option>
7.2 New Page: Warehouse Worker Assignment
Create /settings/warehouse-worker-assignment page:
- Managers can assign workers to themselves
- Shows assigned workers with zone restrictions
- Allows zone-specific filtering
8. Configuration in access_control.py
8.1 Complete Updated ROLES Dictionary
ROLES = {
'superadmin': {
'name': 'Super Administrator',
'description': 'Full system access to all modules and features',
'level': 100,
'modules': ['quality', 'settings', 'warehouse']
},
'admin': {
'name': 'Administrator',
'description': 'Administrative access - can manage users and system configuration',
'level': 90,
'modules': ['quality', 'settings', 'warehouse']
},
'manager': {
'name': 'Manager - Quality',
'description': 'Full access to quality module and quality control',
'level': 70,
'modules': ['quality']
},
'warehouse_manager': {
'name': 'Manager - Warehouse',
'description': 'Full access to warehouse module - input and reports',
'level': 75,
'modules': ['warehouse']
},
'worker': {
'name': 'Worker - Quality',
'description': 'Limited access to quality inspections - input only',
'level': 50,
'modules': ['quality']
},
'warehouse_worker': {
'name': 'Worker - Warehouse',
'description': 'Limited access to warehouse - input pages only, no reports',
'level': 35,
'modules': ['warehouse']
}
}
9. Page Access Matrix
| Page | superadmin | admin | manager (quality) | warehouse_manager | worker (quality) | warehouse_worker |
|---|---|---|---|---|---|---|
/warehouse/ |
✓ | ✓ | ✗ | ✓ | ✗ | ✓ |
/warehouse/set-boxes-locations |
✓ | ✓ | ✗ | ✓ | ✗ | ✓ |
/warehouse/locations |
✓ | ✓ | ✗ | ✓ | ✗ | ✓ |
/warehouse/reports |
✓ | ✓ | ✗ | ✓ | ✗ | ✗ |
/warehouse/reports/inventory-summary |
✓ | ✓ | ✗ | ✓ | ✗ | ✗ |
/warehouse/analytics/trends |
✓ | ✓ | ✗ | ✓ | ✗ | ✗ |
10. Implementation Roadmap
Phase 1: Database & Backend (Priority: HIGH)
- Add new roles to database (
warehouse_manager,warehouse_worker) - Create
worker_manager_bindingstable - Update
access_control.pywith new ROLES and MODULE_PERMISSIONS - Create access check decorators
- Add data filtering logic in warehouse routes
Phase 2: User Interface (Priority: MEDIUM)
- Update
user_form.htmlwith warehouse role options - Create warehouse worker assignment page
- Add worker-manager binding UI
Phase 3: Warehouse Route Protection (Priority: HIGH)
- Add decorators to report routes
- Add decorators to input routes
- Implement data filtering for workers
Phase 4: Testing & Validation (Priority: HIGH)
- Test manager access to all pages
- Test worker access (should block reports)
- Test superadmin/admin override
- Test worker-manager binding enforcement
11. Security Considerations
11.1 Data Isolation
- Workers MUST NOT see other workers' data
- Workers MUST NOT see any warehouse reports
- Managers see ONLY their assigned workers' data
- Database queries MUST include proper WHERE clauses
11.2 Role Verification
- Always verify role in routes, not just in UI
- Use decorators on ALL sensitive routes
- Log access attempts to reports (audit trail)
11.3 Cross-Module Access
- Quality managers (role='manager') should NOT auto-get warehouse access
- Warehouse staff should NOT auto-get quality access
- Explicitly assign roles per module
12. Example SQL Queries
12.1 Create New Roles
INSERT INTO roles (name, description, level) VALUES
('warehouse_manager', 'Warehouse Manager - Full warehouse module access', 75),
('warehouse_worker', 'Warehouse Worker - Input-only warehouse access', 35);
12.2 Create Worker-Manager Binding Table
CREATE TABLE IF NOT EXISTS worker_manager_bindings (
id INT AUTO_INCREMENT PRIMARY KEY,
manager_id INT NOT NULL,
worker_id INT NOT NULL,
warehouse_zone VARCHAR(100),
is_active TINYINT(1) DEFAULT 1,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY unique_binding (manager_id, worker_id),
FOREIGN KEY (manager_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (worker_id) REFERENCES users(id) ON DELETE CASCADE,
CHECK (manager_id != worker_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
12.3 Assign Worker to Manager
INSERT INTO worker_manager_bindings (manager_id, worker_id, warehouse_zone)
VALUES (5, 12, NULL); -- Manager ID 5 oversees Worker ID 12, all zones
12.4 Get All Workers for a Manager
SELECT u.id, u.username, u.full_name, wmb.warehouse_zone
FROM worker_manager_bindings wmb
JOIN users u ON wmb.worker_id = u.id
WHERE wmb.manager_id = ? AND wmb.is_active = 1
ORDER BY u.full_name;
13. Summary Table
| Feature | Current | Proposed |
|---|---|---|
| Warehouse roles | None | 2 new roles |
| Role levels | 4 (super, admin, manager, worker) | 6 (+ warehouse_manager, warehouse_worker) |
| Access control granularity | By role | By role + worker-manager binding |
| Worker data isolation | N/A | Full isolation by worker ID |
| Report access | By role | Managers only |
| Zone restrictions | None | Optional per binding |
| Database tables | 0 warehouse-specific | 1 new table (worker_manager_bindings) |
14. Benefits of This Model
✅ Clear Role Hierarchy: Seven distinct roles with clear separation of concerns
✅ Worker Data Privacy: Workers only see their own entries, no cross-worker visibility
✅ Manager Oversight: Managers see all their workers' data for supervision
✅ Scalability: Supports many workers per manager without access conflicts
✅ Compliance: Easily auditable access patterns for compliance/security
✅ Flexibility: Zone restrictions enable specialized warehouse areas
✅ Backward Compatibility: Existing quality roles remain unchanged
Next Steps
Would you like me to implement:
- Database schema changes?
- Updates to
access_control.py? - Warehouse route protections?
- User interface updates?
- All of the above?
Please confirm and I'll proceed with implementation.