feat: file mobile issues without an owner (Closes #855)
CI / lint (pull_request) Successful in 1m50s
CI / build-release (pull_request) Successful in 6s
CI / release-candidate (pull_request) Has been skipped

This commit is contained in:
timmy committed 2026-08-14 23:05:59 +00:00
1 parent fc35b17d24
commit ed246ce6dd
12 files changed
+275 -63

No files matched your search

+6 -3
View File
@@ -1469,12 +1469,14 @@ async def create_issue(
repository: str,
title: str,
body: str,
assignee: str,
assignee: str | None,
label_ids: list[int] | None = None,
milestone_id: int | None = None,
due_date: str | None = None,
) -> dict:
payload: dict = {"title": title, "body": body, "assignee": assignee}
payload: dict = {"title": title, "body": body}
if assignee is not None:
payload["assignee"] = assignee
if label_ids:
payload["labels"] = label_ids
if milestone_id is not None:
@@ -1497,7 +1499,8 @@ async def create_issue(
for item in assignees
if isinstance(item, dict) and isinstance(item.get("login"), str)
]
if confirmed_assignees != [assignee]:
expected_assignees = [assignee] if assignee is not None else []
if confirmed_assignees != expected_assignees:
raise ValueError(
"Gitea did not confirm self-assignment or exact issue assignment"
)
+10 -2
View File
@@ -742,6 +742,7 @@ def _validate_binary_attachment(filename: str, content_type: str, content: bytes
class IssueCreation(BaseModel):
title: str = Field(min_length=1, max_length=255)
body: str = Field(default="", max_length=10_000)
unassigned: bool = False
assignee: str | None = Field(
default=None, pattern=r"^[A-Za-z0-9_.-]+$", max_length=255
)
@@ -766,6 +767,12 @@ class IssueCreation(BaseModel):
def strip_issue_body(cls, value: str) -> str:
return value.strip()
@model_validator(mode="after")
def require_one_owner_intent(self):
if self.unassigned and self.assignee is not None:
raise ValueError("assignee and unassigned cannot be requested together")
return self
@field_validator("due_date")
@classmethod
def validate_due_date(cls, value: str | None) -> str | None:
@@ -4717,8 +4724,8 @@ async def create_assigned_issue(
login = user.get("login") if isinstance(user, dict) else None
if not login or accessible is None:
raise HTTPException(status_code=404, detail="Repository not found")
assignee = login
if creation.assignee and creation.assignee != login:
assignee = None if creation.unassigned else login
if not creation.unassigned and creation.assignee and creation.assignee != login:
eligible = {
item["login"]
for item in await gitea_proxy.issue_handoff_candidates(repository)
@@ -4772,6 +4779,7 @@ async def create_assigned_issue(
creation.title,
creation.body,
creation.assignee,
creation.unassigned,
tuple(creation.label_ids),
creation.milestone_id,
creation.due_date,