function get_user_training_dashboard
Retrieves a user's training dashboard data by querying Neo4j for required and completed training records associated with controlled documents.
/tf/active/vicechatdev/CDocs/controllers/training_controller.py
700 - 803
moderate
Purpose
This function provides a comprehensive view of a user's training status by fetching both pending/in-progress training requirements and completed training records from a Neo4j graph database. It returns structured data suitable for displaying a training dashboard UI, including document details, dates, status, and summary statistics. The function handles Neo4j DateTime conversions and provides error handling with fallback responses.
Source Code
def get_user_training_dashboard(user: DocUser) -> Dict[str, Any]:
"""
Get user's training dashboard data including required and completed training.
Args:
user: User requesting training dashboard
Returns:
Dictionary with training data
"""
try:
from CDocs.models.training import UserTraining
# Get user's required training (not yet completed)
required_query = """
MATCH (u:User {UID: $user_uid})-[r:REQUIRES_TRAINING]->(d:ControlledDocument)
WHERE r.status IN ['REQUIRED', 'IN_PROGRESS']
RETURN {
uid: u.UID + '-' + d.UID,
document: {
uid: d.UID,
title: d.title,
doc_number: d.docNumber
},
expires_date: r.expires_date,
assigned_date: r.assigned_date,
status: r.status,
assigned_by: r.assigned_by,
validity_days: r.validity_days,
user_uid: u.UID,
document_uid: d.UID
} as training
ORDER BY r.expires_date ASC
"""
required_training = []
required_result = db.run_query(required_query, {"user_uid": user.uid})
if required_result:
required_training = [record["training"] for record in required_result]
# Get user's completed training records
completed_query = """
MATCH (u:User {UID: $user_uid})-[r:REQUIRES_TRAINING]->(d:ControlledDocument)
WHERE r.status = 'COMPLETED'
RETURN {
uid: u.UID + '-' + d.UID,
document: {
uid: d.UID,
title: d.title,
doc_number: d.docNumber
},
completed_date: r.completed_date,
assigned_date: r.assigned_date,
status: r.status,
score: r.score,
assigned_by: r.assigned_by,
user_uid: u.UID,
document_uid: d.UID
} as training
ORDER BY r.completed_date DESC
"""
completed_training = []
completed_result = db.run_query(completed_query, {"user_uid": user.uid})
if completed_result:
completed_training = [record["training"] for record in completed_result]
# Convert Neo4j DateTime objects to ISO strings
def convert_datetime(item):
if isinstance(item, dict):
for key, value in item.items():
if hasattr(value, 'iso_format'): # Neo4j DateTime
item[key] = value.iso_format()
elif isinstance(value, dict):
convert_datetime(value)
return item
required_training = [convert_datetime(item) for item in required_training]
completed_training = [convert_datetime(item) for item in completed_training]
return {
"success": True,
"required_training": required_training,
"completed_training": completed_training,
"summary": {
"required_count": len(required_training),
"completed_count": len(completed_training),
"total_count": len(required_training) + len(completed_training)
}
}
except Exception as e:
logger.error(f"Error getting user training dashboard: {e}")
return {
"success": False,
"message": f"Failed to get training dashboard: {e}",
"required_training": [],
"completed_training": [],
"summary": {
"required_count": 0,
"completed_count": 0,
"total_count": 0
}
}
Parameters
| Name | Type | Default | Kind |
|---|---|---|---|
user |
DocUser | - | positional_or_keyword |
Parameter Details
user: A DocUser object representing the user requesting their training dashboard. Must have a 'uid' attribute that corresponds to a User node in the Neo4j database. This UID is used to query the user's training relationships.
Return Value
Type: Dict[str, Any]
Returns a dictionary with keys: 'success' (bool indicating operation success), 'required_training' (list of training records with status REQUIRED or IN_PROGRESS, sorted by expiration date), 'completed_training' (list of completed training records sorted by completion date descending), 'summary' (dict with counts: required_count, completed_count, total_count), and 'message' (error message if success is False). Each training record includes document details (uid, title, doc_number), dates, status, and assignment information.
Dependencies
CDocs.models.trainingCDocs.models.user_extensionsCDocs.db.db_operationsCDocs.controllerslogging
Required Imports
from typing import Dict, Any
from CDocs.models.user_extensions import DocUser
from CDocs.db import db_operations as db
from CDocs.controllers import log_controller_action
import logging
Conditional/Optional Imports
These imports are only needed under specific conditions:
from CDocs.models.training import UserTraining
Condition: Imported inside the function body, loaded when the function executes
Required (conditional)Usage Example
from CDocs.models.user_extensions import DocUser
from your_module import get_user_training_dashboard
# Assume user object is already authenticated and retrieved
user = DocUser(uid='user-123', name='John Doe')
# Get training dashboard
dashboard_data = get_user_training_dashboard(user)
if dashboard_data['success']:
print(f"Required training: {dashboard_data['summary']['required_count']}")
print(f"Completed training: {dashboard_data['summary']['completed_count']}")
# Display required training
for training in dashboard_data['required_training']:
print(f"Document: {training['document']['title']}")
print(f"Status: {training['status']}")
print(f"Expires: {training['expires_date']}")
# Display completed training
for training in dashboard_data['completed_training']:
print(f"Document: {training['document']['title']}")
print(f"Completed: {training['completed_date']}")
print(f"Score: {training.get('score', 'N/A')}")
else:
print(f"Error: {dashboard_data['message']}")
Best Practices
- Ensure the user object passed has a valid 'uid' attribute that exists in the Neo4j database
- The function handles exceptions gracefully and returns a structured response even on failure, so always check the 'success' field before processing results
- Neo4j DateTime objects are automatically converted to ISO format strings for JSON serialization
- The function is decorated with @log_controller_action, so ensure logging is properly configured
- Required training is sorted by expiration date (ascending) to prioritize urgent items
- Completed training is sorted by completion date (descending) to show recent completions first
- The function queries relationships with specific status values: 'REQUIRED', 'IN_PROGRESS', and 'COMPLETED' - ensure these match your database schema
- Consider implementing pagination if users have large numbers of training records to avoid performance issues
Tags
Similar Components
AI-powered semantic similarity - components with related functionality:
-
function get_training_overview 80.4% similar
-
function get_document_training_info 72.2% similar
-
function complete_user_training_by_uid 70.6% similar
-
function get_training_assignment 70.4% similar
-
class UserTraining 69.7% similar