refs #62274 Все действия после релиза задачи.
This commit is contained in:
54
api.py
54
api.py
@@ -1,9 +1,10 @@
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
from requests import get
|
from requests import get, put
|
||||||
|
|
||||||
from constants import RELEASE_STATUS_ID
|
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()
|
load_dotenv()
|
||||||
|
|
||||||
@@ -16,6 +17,17 @@ class RedmineAPI:
|
|||||||
self._key = key
|
self._key = key
|
||||||
self._headers = {"X-Redmine-API-Key": self._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:
|
def get(self, *args, **kwargs) -> dict:
|
||||||
if len(args) > 0:
|
if len(args) > 0:
|
||||||
args = tuple([self._base + list(args)[0]] + list(args)[1:])
|
args = tuple([self._base + list(args)[0]] + list(args)[1:])
|
||||||
@@ -27,8 +39,42 @@ class RedmineAPI:
|
|||||||
|
|
||||||
return get(*args, **kwargs).json()
|
return get(*args, **kwargs).json()
|
||||||
|
|
||||||
def get_release_issues(self) -> list[dict]:
|
def get_issue(self, issue_id: int) -> dict:
|
||||||
result = self.get("/issues.json", params={"assigned_to_id": "me", "status_id": RELEASE_STATUS_ID})
|
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, "fix_version_id": version_id}
|
||||||
|
)
|
||||||
return result["issues"]
|
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"}]
|
||||||
|
})
|
||||||
|
|
||||||
api = RedmineAPI(SITE_URL, KEY)
|
api = RedmineAPI(SITE_URL, KEY)
|
||||||
|
|||||||
@@ -1 +1,7 @@
|
|||||||
RELEASE_STATUS_ID = 9
|
RELEASE_STATUS_ID = 9
|
||||||
|
CHECK_STATUS_ID = 3
|
||||||
|
|
||||||
|
VETRO_PROJECT_ID = 10
|
||||||
|
|
||||||
|
RESPONSIBLE_FIELD_ID = 37
|
||||||
|
STAND_FIELD_ID = 6
|
||||||
|
|||||||
@@ -1,2 +1,3 @@
|
|||||||
dotenv
|
dotenv
|
||||||
requests
|
requests
|
||||||
|
python-dateutil
|
||||||
|
|||||||
21
utils.py
Normal file
21
utils.py
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
from datetime import date, datetime
|
||||||
|
from dateutil.relativedelta import relativedelta, TU
|
||||||
|
|
||||||
|
from constants import RESPONSIBLE_FIELD_ID
|
||||||
|
|
||||||
|
def get_current_tuesday() -> date:
|
||||||
|
today = date.today()
|
||||||
|
if today.weekday() == 1:
|
||||||
|
return today
|
||||||
|
else:
|
||||||
|
return today + relativedelta(weekday=TU(-1))
|
||||||
|
|
||||||
|
def date_from_iso(datetime_: str) -> date:
|
||||||
|
return datetime.fromisoformat(datetime_).date()
|
||||||
|
|
||||||
|
def get_responsible(issue: dict) -> tuple[str, str] | None:
|
||||||
|
field = next(filter(lambda field: field["id"] == RESPONSIBLE_FIELD_ID, issue["custom_fields"]), None)
|
||||||
|
if field:
|
||||||
|
return tuple(field["value"].split(" "))
|
||||||
|
else:
|
||||||
|
return None
|
||||||
Reference in New Issue
Block a user