sebasmos's picture
Deploy Sherlock
d6f13c4
raw
history blame
2.68 kB
"""
Utility functions for the project assistant.
"""
from datetime import datetime
from pathlib import Path
from typing import List, Dict, Any
def format_date(date: datetime) -> str:
"""Format a datetime object for display."""
if date is None:
return "Unknown date"
return date.strftime("%B %d, %Y")
def format_action_item(item: Dict[str, Any]) -> str:
"""Format an action item for display."""
parts = []
if item.get('assignee'):
parts.append(f"**{item['assignee']}**:")
parts.append(item['task'])
if item.get('deadline'):
parts.append(f"(by {item['deadline']})")
return " ".join(parts)
def get_project_stats(meetings: List[Any]) -> Dict[str, Any]:
"""Calculate statistics across all projects."""
stats = {
'total_meetings': len(meetings),
'total_action_items': 0,
'completed_action_items': 0,
'open_action_items': 0,
'total_blockers': 0,
'total_decisions': 0,
'projects': {}
}
for meeting in meetings:
project = meeting.project_name
if project not in stats['projects']:
stats['projects'][project] = {
'meetings': 0,
'action_items': 0,
'blockers': 0,
'decisions': 0
}
stats['projects'][project]['meetings'] += 1
for item in meeting.action_items:
stats['total_action_items'] += 1
stats['projects'][project]['action_items'] += 1
if item.completed:
stats['completed_action_items'] += 1
else:
stats['open_action_items'] += 1
stats['total_blockers'] += len(meeting.blockers)
stats['projects'][project]['blockers'] += len(meeting.blockers)
stats['total_decisions'] += len(meeting.decisions)
stats['projects'][project]['decisions'] += len(meeting.decisions)
return stats
def create_sample_meeting(project_name: str, output_path: Path) -> None:
"""Create a sample meeting note template."""
template = f"""# Meeting: [Meeting Title]
Date: {datetime.now().strftime('%Y-%m-%d')}
Participants: [Name1, Name2, Name3]
## Discussion
[What was discussed in the meeting]
## Decisions
- [Decision 1]
- [Decision 2]
## Action Items
- [ ] [Person]: [Task description] by [deadline]
- [ ] [Person]: [Task description]
## Blockers
- [Blocker description]
"""
output_path.parent.mkdir(parents=True, exist_ok=True)
output_path.write_text(template)
print(f"Created sample meeting template at {output_path}")