Files
vetro_redmine/api.py

96 lines
3.2 KiB
Python

import os
from dotenv import load_dotenv
from requests import get, put, post
from constants import RELEASE_STATUS_ID, VETRO_PROJECT_ID, STAND_FIELD_ID, CHECK_STATUS_ID
from utils import get_current_tuesday, date_from_iso, get_responsible
load_dotenv()
SITE_URL = os.getenv("SITE_URL")
KEY = os.getenv("KEY")
class RedmineAPI:
def __init__(self, base: str, key: str) -> None:
self._base = base
self._key = key
self._headers = {"X-Redmine-API-Key": self._key}
def put(self, *args, **kwargs) -> bool:
if len(args) > 0:
args = tuple([self._base + list(args)[0]] + list(args)[1:])
elif "url" in kwargs:
kwargs["url"] = self._base + kwargs["url"]
kwargs["headers"] = self._headers
return put(*args, **kwargs).status_code == 204
def get(self, *args, **kwargs) -> dict:
if len(args) > 0:
args = tuple([self._base + list(args)[0]] + list(args)[1:])
elif "url" in kwargs:
kwargs["url"] = self._base + kwargs["url"]
kwargs["headers"] = self._headers
return get(*args, **kwargs).json()
def post(self, *args, **kwargs) -> dict:
if len(args) > 0:
args = tuple([self._base + list(args)[0]] + list(args)[1:])
elif "url" in kwargs:
kwargs["url"] = self._base + kwargs["url"]
kwargs["headers"] = self._headers
return post(*args, **kwargs).json()
def get_issue(self, issue_id: int) -> dict:
result = self.get(f"/issues/{issue_id}.json")
return result["issue"]
def get_release_issues(self, version_id: int) -> list[dict]:
result = self.get(
"/issues.json",
params={"assigned_to_id": "me", "status_id": RELEASE_STATUS_ID, "fixed_version_id": version_id}
)
return result["issues"]
def get_versions(self) -> list[dict]:
result = self.get(f"/projects/{VETRO_PROJECT_ID}/versions.json")
return result["versions"]
def get_current_version(self) -> dict | None:
versions = self.get_versions()
tuesday = get_current_tuesday()
return next(filter(lambda version: date_from_iso(version["created_on"]) == tuesday, versions), None)
def get_user(self, last_name: str, first_name: str) -> dict | None:
result = self.get("/users.json", params={"status": 1, "lastname": last_name, "firstname": first_name})
return next(iter(result["users"]), None)
def edit_issue(self, issue_id: int, data: dict) -> bool:
return self.put(f"/issues/{issue_id}.json", json={"issue": data})
def release_issue(self, issue_id: int) -> bool:
issue = self.get_issue(issue_id)
last_name, first_name = get_responsible(issue)
user = api.get_user(last_name=last_name, first_name=first_name)
assigned_to_id = user["id"]
return self.edit_issue(issue_id, data={
"assigned_to_id": assigned_to_id,
"status_id": CHECK_STATUS_ID,
"custom_fields": [{"id": STAND_FIELD_ID, "value": "prod"}]
})
def add_version(self, data: dict) -> dict:
result = self.post(f"/projects/{VETRO_PROJECT_ID}/versions.json", json={"version": data})
return result["version"]
api = RedmineAPI(SITE_URL, KEY)