Skip to content

Commit

Permalink
Merge pull request #11 from ricardobranco777/multi_redmine
Browse files Browse the repository at this point in the history
Fetch multiple Redmine tickets with one call
  • Loading branch information
ricardobranco777 authored Jun 27, 2024
2 parents a901896 + 2004136 commit 2d47370
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 1 deletion.
2 changes: 1 addition & 1 deletion services/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ def get_urltag(string: str) -> dict[str, str | bool] | None:
# URL
string = string if string.startswith("https://") else f"https://{string}"
url = urlparse(string)
hostname = url.hostname.removeprefix("www.") if url.hostname is not None else ""
hostname = url.hostname if url.hostname is not None else ""
path = url.path.strip("/")
repo: str = ""
is_pr: bool = False
Expand Down
1 change: 1 addition & 0 deletions services/guess.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ def guess_service(server: str) -> Any:
"progress.opensuse.org": MyRedmine,
"src.opensuse.org": MyGitea,
"src.suse.de": MyGitea,
"illumos.org": MyRedmine,
"www.illumos.org": MyRedmine,
}
for hostname, cls in servers.items():
Expand Down
26 changes: 26 additions & 0 deletions services/redmine.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,32 @@ def get_issue(self, issue_id: str = "", **kwargs) -> Issue | None:
return None
return self._to_issue(info)

def get_issues(self, issues: list[dict]) -> list[Issue | None]:
try:
found = [
self._to_issue(info)
for info in self.client.issue.filter(
issue_id=",".join([issue["issue_id"] for issue in issues])
)
]
except (BaseRedmineError, RequestException) as exc:
logging.error("Redmine: %s: get_issues(): %s", self.url, exc)
return []
found_ids = {str(issue.raw["id"]) for issue in found}
not_found = [
self._not_found(
tag=f"{self.tag}#{issue['issue_id']}",
url=f"{self.url}/issues/{issue['issue_id']}",
)
for issue in issues
if issue["issue_id"] not in found_ids
]
# Old Redmine instances don't support fetching multiple issues at once
# so fetch them one by one in the base class calling get_issue() above
if len(found) == 1 and len(not_found) >= len(found):
return super().get_issues(issues)
return found + not_found # type: ignore

def _to_issue(self, info: Any) -> Issue:
return Issue(
tag=f"{self.tag}#{info.id}",
Expand Down

0 comments on commit 2d47370

Please sign in to comment.