feat(dashboard): add milestone view and configurable columns
fixes #16, fixes #19 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -6,7 +6,7 @@ import json
|
||||
import re
|
||||
from dataclasses import asdict
|
||||
|
||||
from gitea_dashboard.collector import RepoData
|
||||
from gitea_dashboard.collector import MilestoneData, RepoData
|
||||
|
||||
# Caracteres de controle ASCII (0x00-0x1F) sauf \t (0x09), \n (0x0A), \r (0x0D)
|
||||
_CONTROL_CHAR_RE = re.compile(r"[\x00-\x08\x0b\x0c\x0e-\x1f]")
|
||||
@@ -44,3 +44,23 @@ def export_json(repos: list[RepoData], indent: int = 2) -> str:
|
||||
Chaine JSON indentee, prete pour stdout ou ecriture fichier.
|
||||
"""
|
||||
return json.dumps(repos_to_dicts(repos), indent=indent, ensure_ascii=False)
|
||||
|
||||
|
||||
def milestones_to_dicts(milestones: list[MilestoneData]) -> list[dict]:
|
||||
"""Convertit une liste de MilestoneData en liste de dicts serialisables.
|
||||
|
||||
Sanitize les champs texte (repo_name, title) pour les caracteres de controle.
|
||||
"""
|
||||
result = []
|
||||
for ms in milestones:
|
||||
d = asdict(ms)
|
||||
for field in ("repo_name", "title"):
|
||||
if isinstance(d.get(field), str):
|
||||
d[field] = _sanitize_control_chars(d[field])
|
||||
result.append(d)
|
||||
return result
|
||||
|
||||
|
||||
def export_milestones_json(milestones: list[MilestoneData], indent: int = 2) -> str:
|
||||
"""Exporte les milestones en JSON formate."""
|
||||
return json.dumps(milestones_to_dicts(milestones), indent=indent, ensure_ascii=False)
|
||||
|
||||
Reference in New Issue
Block a user