Skip to content

Commit 4b617a0

Browse files
committed
feat(2397): update docs and improve error messages
1 parent 7883d28 commit 4b617a0

2 files changed

Lines changed: 48 additions & 5 deletions

File tree

docs/commands.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ The LLM call is a Celery task; the worker must be running and `OPENROUTER_API_KE
288288
|------------------|--------|------------------------------------------------------------------------------------------------------------|
289289
| `--all-missing` | bool | Queue generation for every active version that has stored release notes but no `whats_new` summary yet. |
290290
| `--version` | string | Slug of a single version to (re)generate. Format: `boost-1-90-0`. |
291-
| `--force` | bool | Regenerate even when a summary already exists (clears `whats_new` first; the chained save task replaces it). |
291+
| `--force` | bool | Regenerate even when a summary already exists. The chained save task overwrites `whats_new` and resets `whats_new_approved` to `False`, so regenerated content goes back through admin moderation. |
292292
| `--dry-run` | bool | List the versions that would be queued without queuing them. |
293293
| `--validate` | bool | Run the prompt synchronously against the latest `--limit` versions (that have release notes) and print the LLM output. No DB writes. Use to review prompt changes before sign-off. |
294294
| `--limit` | int | Number of versions to process when `--validate` is set. Default: 10. |

versions/management/commands/generate_whats_new.py

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,9 @@ def command(
7070
if not all_missing and not version_slug:
7171
raise click.UsageError("Pass --all-missing, --version <slug>, or --validate.")
7272

73-
versions = _select_versions(version_slug, force)
73+
versions, reason = _select_versions(version_slug, force)
7474
if not versions:
75-
click.secho("No versions matched.", fg="yellow")
75+
_warn_no_versions(reason, version_slug)
7676
return
7777

7878
for version in versions:
@@ -87,20 +87,63 @@ def command(
8787

8888

8989
def _select_versions(version_slug: str | None, force: bool):
90+
"""Return ``(versions, reason)`` where ``reason`` explains an empty list.
91+
92+
``reason`` is ``None`` when ``versions`` is non-empty. Otherwise it is one of
93+
``"slug_not_found"``, ``"already_populated"``, ``"none_missing"``, or
94+
``"no_release_notes"`` — see ``_warn_no_versions`` for the user-facing text.
95+
"""
9096
qs = Version.objects.active().exclude(name__in=["master", "develop"])
9197
if version_slug:
9298
qs = qs.filter(slug=version_slug)
99+
if not qs.exists():
100+
return [], "slug_not_found"
93101
if not force:
94-
qs = qs.filter(whats_new="")
102+
filtered = qs.filter(whats_new="")
103+
if not filtered.exists():
104+
return [], "already_populated" if version_slug else "none_missing"
105+
qs = filtered
95106

96107
rendered_keys = set(
97108
RenderedContent.objects.filter(
98109
cache_key__startswith="release_notes_boost-"
99110
).values_list("cache_key", flat=True)
100111
)
101-
return [
112+
versions = [
102113
v for v in qs.order_by("name") if v.release_notes_cache_key in rendered_keys
103114
]
115+
if versions:
116+
return versions, None
117+
return [], "no_release_notes"
118+
119+
120+
def _warn_no_versions(reason: str | None, version_slug: str | None) -> None:
121+
if reason == "slug_not_found":
122+
message = (
123+
f"No active version with slug '{version_slug}'. "
124+
"Check the slug format (e.g. boost-1-90-0)."
125+
)
126+
elif reason == "already_populated":
127+
message = (
128+
f"Version '{version_slug}' already has a whats_new summary. "
129+
"Pass --force to regenerate."
130+
)
131+
elif reason == "none_missing":
132+
message = (
133+
"All active versions already have whats_new summaries. "
134+
"Use --version <slug> --force to regenerate one."
135+
)
136+
elif version_slug:
137+
message = (
138+
f"Version '{version_slug}' has no stored release notes. "
139+
"Run `manage.py import_release_notes` first."
140+
)
141+
else:
142+
message = (
143+
"No versions with stored release notes to process. "
144+
"Run `manage.py import_release_notes` first."
145+
)
146+
click.secho(message, fg="yellow")
104147

105148

106149
def _validate(limit: int):

0 commit comments

Comments
 (0)