Skip to content

Commit dce9d7b

Browse files
committed
Can now specify the week for the summary
1 parent b4a75cb commit dce9d7b

File tree

4 files changed

+74
-10
lines changed

4 files changed

+74
-10
lines changed

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -538,6 +538,14 @@ curl "http://localhost:8000/admin/llm-usage/summary?start_date=2026-02-01T00:00:
538538
curl -X POST "http://localhost:8000/admin/weekly-summary/trigger"
539539
```
540540

541+
or for a specific week:
542+
543+
```bash
544+
curl -X POST "http://10.0.0.181:8000/admin/weekly-summary/trigger" \
545+
-H "Content-Type: application/json" \
546+
-d '{"date": "2026-02-06"}'
547+
```
548+
541549
**Get next scheduled run time:**
542550
```bash
543551
curl "http://localhost:8000/admin/weekly-summary/next-run"

routes/admin.py

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@
1818
config = get_config()
1919
templates = Jinja2Templates(directory="templates")
2020

21+
22+
class WeeklySummaryTriggerRequest(BaseModel):
23+
"""Request body for triggering weekly summary generation."""
24+
25+
date: Optional[str] = None # Format: YYYY-MM-DD (e.g., "2026-02-04")
26+
27+
2128
# Client logs storage
2229
CLIENT_LOGS_DIR = Path("/tmp/audio-stream-client-logs")
2330
CLIENT_LOGS_FILE = CLIENT_LOGS_DIR / "client.log"
@@ -40,11 +47,20 @@ async def stats_page(request: Request):
4047

4148

4249
@router.post("/weekly-summary/trigger")
43-
def trigger_weekly_summary():
50+
def trigger_weekly_summary(
51+
request: WeeklySummaryTriggerRequest = WeeklySummaryTriggerRequest(),
52+
):
4453
"""
4554
Manually trigger the weekly summary generation.
4655
4756
Useful for testing the weekly summary feature without waiting for Friday 11pm.
57+
58+
Request body (optional):
59+
{
60+
"date": "YYYY-MM-DD" // Generate summary for the week containing this date
61+
}
62+
63+
If no date is provided, generates summary for the current week.
4864
"""
4965
if not config.weekly_summary_enabled:
5066
raise HTTPException(
@@ -54,16 +70,41 @@ def trigger_weekly_summary():
5470
try:
5571
from services.scheduler import trigger_weekly_summary_now
5672

57-
logger.info("Manual trigger of weekly summary requested")
58-
trigger_weekly_summary_now()
73+
# Parse the date if provided
74+
target_date = None
75+
if request.date:
76+
try:
77+
# Parse YYYY-MM-DD format
78+
target_date = datetime.strptime(request.date, "%Y-%m-%d")
79+
logger.info(
80+
f"Manual trigger of weekly summary requested for date: {request.date}"
81+
)
82+
except ValueError:
83+
raise HTTPException(
84+
status_code=400,
85+
detail=f"Invalid date format. Expected YYYY-MM-DD, got: {request.date}",
86+
)
87+
else:
88+
logger.info("Manual trigger of weekly summary requested for current week")
89+
90+
trigger_weekly_summary_now(target_date)
91+
92+
message = (
93+
f"Weekly summary generation started for {request.date}. Check logs for progress."
94+
if request.date
95+
else "Weekly summary generation started for current week. Check logs for progress."
96+
)
5997

6098
return JSONResponse(
6199
{
62100
"status": "triggered",
63-
"message": "Weekly summary generation started. Check logs for progress.",
101+
"message": message,
102+
"date": request.date if request.date else "current",
64103
}
65104
)
66105

106+
except HTTPException:
107+
raise
67108
except Exception as e:
68109
logger.error(f"Error triggering weekly summary: {e}", exc_info=True)
69110
raise HTTPException(status_code=500, detail=str(e))

services/scheduler.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
"""
66

77
import logging
8+
from datetime import datetime
9+
from typing import Optional
810
from apscheduler.schedulers.background import BackgroundScheduler # type: ignore
911
from apscheduler.triggers.cron import CronTrigger # type: ignore
1012
from pytz import timezone # type: ignore
@@ -88,15 +90,22 @@ def get_scheduler() -> BackgroundScheduler | None:
8890
return _scheduler
8991

9092

91-
def trigger_weekly_summary_now() -> None:
93+
def trigger_weekly_summary_now(target_date: Optional[datetime] = None) -> None:
9294
"""
9395
Manually trigger the weekly summary job immediately.
9496
9597
Useful for testing or manual runs.
98+
99+
Args:
100+
target_date: Optional datetime to generate summary for.
101+
If None, uses current date.
96102
"""
97103
try:
98-
logger.info("Manually triggering weekly summary")
99-
result = generate_and_save_weekly_summary()
104+
if target_date:
105+
logger.info(f"Manually triggering weekly summary for date: {target_date}")
106+
else:
107+
logger.info("Manually triggering weekly summary for current week")
108+
result = generate_and_save_weekly_summary(target_date)
100109

101110
if result:
102111
logger.info(f"Weekly summary created: {result['url']}")

services/weekly_summary.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -661,12 +661,18 @@ def _generate_and_attach_tts(
661661
return {"noteId": note_id, "url": _get_trilium_note_url(note_id)}
662662

663663

664-
def generate_and_save_weekly_summary() -> Optional[Dict[str, str]]:
664+
def generate_and_save_weekly_summary(
665+
target_date: Optional[datetime] = None,
666+
) -> Optional[Dict[str, str]]:
665667
"""
666668
Main function to generate and save weekly summary.
667669
668670
This is called by the scheduler every Friday at 11pm Pacific.
669671
672+
Args:
673+
target_date: Optional datetime to generate summary for.
674+
If None, uses current date. Used to generate summaries for past weeks.
675+
670676
Behavior for existing summaries:
671677
- If audio file exists on disk:
672678
- Check if already attached to Trilium note
@@ -690,8 +696,8 @@ def generate_and_save_weekly_summary() -> Optional[Dict[str, str]]:
690696
try:
691697
logger.info("Starting weekly summary generation")
692698

693-
# Get current week number
694-
now = datetime.now(timezone.utc)
699+
# Get week number for target date (defaults to current date)
700+
now = target_date if target_date else datetime.now(timezone.utc)
695701
year, week = get_week_number(now)
696702
week_year = f"{year}-W{week:02d}"
697703
logger.info(f"Generating summary for week {week_year}")

0 commit comments

Comments
 (0)