feat(订阅式软件提供): 按包名详情接口在 README 为空时合成默认 Markdown

新增 _DefaultReadme:由包名、说明、安装命令、依赖表与版本历史合成 README;仅 PackageByNameView(官网数据源)使用,配置页读到的仍是作者原文,避免合成内容被回写。
This commit is contained in:
TermiNexus committed 2026-10-07 20:16:08 +08:00
1 parent 4bd5697cff
commit aa56281493
1 file changed
+35 -1
+35 -1
View File
@@ -97,6 +97,36 @@ def _DetailRow(package):
} }
def _DefaultReadme(package, releases):
"""包作者未填写 README 时,由包信息合成一份 Markdown 默认 README
仅用于官网展示(`PackageByNameView`);配置页读取到的仍是「作者填写的原文」,
避免把合成内容回写成用户数据。
"""
lines = [f'# {package.PackageName}', '']
lines += [package.PackageDesc.strip() or '该软件包暂未填写说明。', '']
lines += ['## 安装', '', '```bash', f'venom install {package.PackageName}', '```', '']
dependencies = package.Dependencies or []
lines += ['## 依赖', '']
if dependencies:
lines += ['| 依赖包 | 版本约束 |', '| --- | --- |']
lines += [f"| {d.get('Name', '')} | {d.get('Version') or '*'} |" for d in dependencies]
else:
lines += ['无外部依赖。']
lines += ['']
lines += ['## 版本历史', '']
if releases:
lines += [f"- `{r.Version}` · {_Time(r.CreateTime)}" for r in releases]
else:
lines += ['尚未发布任何版本。']
lines += ['']
return '\n'.join(lines)
class PackageListView(APIView): class PackageListView(APIView):
"""包列表 / 新建包""" """包列表 / 新建包"""
@@ -198,4 +228,8 @@ class PackageByNameView(APIView):
PackageName=name).first() PackageName=name).first()
if package is None: if package is None:
return _err(f'包「{name}」不存在', 404, status=404) return _err(f'包「{name}」不存在', 404, status=404)
return _ok(_DetailRow(package)) row = _DetailRow(package)
# 作者未填 README 时给出合成内容,官网不出现「无 README」占位
if not row['Readme']:
row['Readme'] = _DefaultReadme(package, list(package.releases.all()))
return _ok(row)