|
# retoor <retoor@molodetz.nl>
|
|
|
|
from dataclasses import dataclass
|
|
|
|
from devplacepy.config import INTERNAL_MODEL
|
|
from devplacepy.database import get_setting, internal_gateway_key
|
|
from devplacepy.services.base import ConfigField
|
|
|
|
BASE_URL_DEFAULT = "https://retoor.molodetz.nl"
|
|
OWNER_DEFAULT = "retoor"
|
|
REPO_DEFAULT = "pydevplace"
|
|
HTTP_TIMEOUT_SECONDS = 20.0
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class GiteaConfig:
|
|
base_url: str
|
|
owner: str
|
|
repo: str
|
|
token: str
|
|
ai_enhance: bool
|
|
ai_model: str
|
|
ai_key: str
|
|
|
|
@property
|
|
def api_base(self) -> str:
|
|
return f"{self.base_url.rstrip('/')}/api/v1"
|
|
|
|
@property
|
|
def repo_base(self) -> str:
|
|
return f"{self.api_base}/repos/{self.owner}/{self.repo}"
|
|
|
|
@property
|
|
def is_configured(self) -> bool:
|
|
return bool(self.base_url and self.owner and self.repo and self.token)
|
|
|
|
|
|
CONFIG_FIELDS: list[ConfigField] = [
|
|
ConfigField(
|
|
"gitea_base_url",
|
|
"Gitea base URL",
|
|
type="url",
|
|
default=BASE_URL_DEFAULT,
|
|
help="Origin of the Gitea instance, without the /api path.",
|
|
group="Gitea",
|
|
),
|
|
ConfigField(
|
|
"gitea_owner",
|
|
"Repository owner",
|
|
type="str",
|
|
default=OWNER_DEFAULT,
|
|
help="Owner (user or organisation) of the issue tracker repository.",
|
|
group="Gitea",
|
|
),
|
|
ConfigField(
|
|
"gitea_repo",
|
|
"Repository name",
|
|
type="str",
|
|
default=REPO_DEFAULT,
|
|
help="Repository whose issues back the bug tracker.",
|
|
group="Gitea",
|
|
),
|
|
ConfigField(
|
|
"gitea_token",
|
|
"Gitea access token",
|
|
type="password",
|
|
default="",
|
|
secret=True,
|
|
help="Personal access token with repo issue scope. All actions use this single account.",
|
|
group="Gitea",
|
|
),
|
|
ConfigField(
|
|
"bug_ai_enhance",
|
|
"Improve tickets with AI",
|
|
type="bool",
|
|
default=True,
|
|
help="Rewrite each submitted report into a consistent, high-quality ticket before posting.",
|
|
group="AI",
|
|
),
|
|
ConfigField(
|
|
"bug_ai_model",
|
|
"AI model",
|
|
type="str",
|
|
default=INTERNAL_MODEL,
|
|
help="Model name sent to the internal AI gateway for ticket enhancement.",
|
|
group="AI",
|
|
),
|
|
ConfigField(
|
|
"bug_ai_key",
|
|
"AI API key",
|
|
type="password",
|
|
default="",
|
|
secret=True,
|
|
help="Defaults to the internal gateway key when left blank.",
|
|
group="AI",
|
|
),
|
|
]
|
|
|
|
|
|
def gitea_config() -> GiteaConfig:
|
|
ai_key = get_setting("bug_ai_key", "") or internal_gateway_key()
|
|
return GiteaConfig(
|
|
base_url=get_setting("gitea_base_url", BASE_URL_DEFAULT),
|
|
owner=get_setting("gitea_owner", OWNER_DEFAULT),
|
|
repo=get_setting("gitea_repo", REPO_DEFAULT),
|
|
token=get_setting("gitea_token", ""),
|
|
ai_enhance=get_setting("bug_ai_enhance", "1") == "1",
|
|
ai_model=get_setting("bug_ai_model", INTERNAL_MODEL),
|
|
ai_key=ai_key,
|
|
)
|
|
|
|
|
|
def is_configured() -> bool:
|
|
return gitea_config().is_configured
|