убрал служебный id Clockify из комментариев Redmine
This commit is contained in:
@@ -4,7 +4,5 @@ from enums import ActivityTypes
|
|||||||
|
|
||||||
REQUEST_TIMEOUT = 30
|
REQUEST_TIMEOUT = 30
|
||||||
REDMINE_ISSUES_LIMIT = 100
|
REDMINE_ISSUES_LIMIT = 100
|
||||||
REDMINE_TIME_ENTRIES_LIMIT = 100
|
|
||||||
CLOCKIFY_ACTIVITY_COMMENT_PREFIX = "Clockify activity ID:"
|
|
||||||
ACTIVITY_TYPE_BY_VETRO_PROJECT = {}
|
ACTIVITY_TYPE_BY_VETRO_PROJECT = {}
|
||||||
DEFAULT_ACTIVITY_TYPE = ActivityTypes.DEVELOPMENT
|
DEFAULT_ACTIVITY_TYPE = ActivityTypes.DEVELOPMENT
|
||||||
|
|||||||
@@ -10,10 +10,8 @@ from exceptions import InvalidToken
|
|||||||
from utils import format_hours
|
from utils import format_hours
|
||||||
from .constants import (
|
from .constants import (
|
||||||
ACTIVITY_TYPE_BY_VETRO_PROJECT,
|
ACTIVITY_TYPE_BY_VETRO_PROJECT,
|
||||||
CLOCKIFY_ACTIVITY_COMMENT_PREFIX,
|
|
||||||
DEFAULT_ACTIVITY_TYPE,
|
DEFAULT_ACTIVITY_TYPE,
|
||||||
REDMINE_ISSUES_LIMIT,
|
REDMINE_ISSUES_LIMIT,
|
||||||
REDMINE_TIME_ENTRIES_LIMIT,
|
|
||||||
REQUEST_TIMEOUT,
|
REQUEST_TIMEOUT,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -44,16 +42,6 @@ class RedmineAPI(RedmineConfig):
|
|||||||
]
|
]
|
||||||
for activity in activities_to_track:
|
for activity in activities_to_track:
|
||||||
try:
|
try:
|
||||||
if not config.is_debug and self.has_time_entry_for_activity(activity):
|
|
||||||
activity.is_tracked = True
|
|
||||||
if on_success:
|
|
||||||
on_success(activity)
|
|
||||||
tracked.append(activity)
|
|
||||||
logger.info(
|
|
||||||
f"{Fore.GREEN}{self.format_activity_result(activity, is_beginner)}"
|
|
||||||
f"{Fore.RESET}".ljust(100) + "✅"
|
|
||||||
)
|
|
||||||
continue
|
|
||||||
if not config.is_debug:
|
if not config.is_debug:
|
||||||
resp = requests.post(
|
resp = requests.post(
|
||||||
self.base_url + self.time_entries_url,
|
self.base_url + self.time_entries_url,
|
||||||
@@ -63,7 +51,7 @@ class RedmineAPI(RedmineConfig):
|
|||||||
"issue_id": activity.task_id,
|
"issue_id": activity.task_id,
|
||||||
"hours": round(activity.time_spent / (2 if is_beginner else 1), 3),
|
"hours": round(activity.time_spent / (2 if is_beginner else 1), 3),
|
||||||
"activity_id": self.get_activity_type_id(activity),
|
"activity_id": self.get_activity_type_id(activity),
|
||||||
"comments": self.get_comment(activity),
|
"comments": activity.description,
|
||||||
"spent_on": activity.date_start.strftime(self.datetime_format)
|
"spent_on": activity.date_start.strftime(self.datetime_format)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -105,10 +93,6 @@ class RedmineAPI(RedmineConfig):
|
|||||||
hours = round(activity.time_spent / (2 if is_beginner else 1), 3)
|
hours = round(activity.time_spent / (2 if is_beginner else 1), 3)
|
||||||
return f"#{activity.task_id} | {format_hours(hours)} | {activity.description}"
|
return f"#{activity.task_id} | {format_hours(hours)} | {activity.description}"
|
||||||
|
|
||||||
def get_comment(self, activity: Activity) -> str:
|
|
||||||
"""Формирует комментарий Redmine с внешним id активности Clockify."""
|
|
||||||
return f"{activity.description}\n{CLOCKIFY_ACTIVITY_COMMENT_PREFIX} {activity.id}"
|
|
||||||
|
|
||||||
def get_activity_type_id(self, activity: Activity) -> int:
|
def get_activity_type_id(self, activity: Activity) -> int:
|
||||||
"""Возвращает тип деятельности Redmine для активности Clockify."""
|
"""Возвращает тип деятельности Redmine для активности Clockify."""
|
||||||
return ACTIVITY_TYPE_BY_VETRO_PROJECT.get(
|
return ACTIVITY_TYPE_BY_VETRO_PROJECT.get(
|
||||||
@@ -116,27 +100,6 @@ class RedmineAPI(RedmineConfig):
|
|||||||
DEFAULT_ACTIVITY_TYPE,
|
DEFAULT_ACTIVITY_TYPE,
|
||||||
)
|
)
|
||||||
|
|
||||||
def has_time_entry_for_activity(self, activity: Activity) -> bool:
|
|
||||||
"""Проверяет, была ли активность Clockify уже перенесена в Redmine."""
|
|
||||||
resp = requests.get(
|
|
||||||
self.base_url + self.time_entries_url,
|
|
||||||
headers={"X-Redmine-Api-Key": self.token},
|
|
||||||
params={
|
|
||||||
"issue_id": activity.task_id,
|
|
||||||
"spent_on": activity.date_start.strftime(self.datetime_format),
|
|
||||||
"limit": REDMINE_TIME_ENTRIES_LIMIT,
|
|
||||||
},
|
|
||||||
timeout=REQUEST_TIMEOUT,
|
|
||||||
)
|
|
||||||
if not resp.ok:
|
|
||||||
logger.error(f"Ошибка RedmineAPI: {resp.text} {resp.status_code}")
|
|
||||||
return False
|
|
||||||
marker = f"{CLOCKIFY_ACTIVITY_COMMENT_PREFIX} {activity.id}"
|
|
||||||
return any(
|
|
||||||
marker in time_entry.get("comments", "")
|
|
||||||
for time_entry in resp.json().get("time_entries", [])
|
|
||||||
)
|
|
||||||
|
|
||||||
def get_time_entry_activities(self) -> list[ActivityType]:
|
def get_time_entry_activities(self) -> list[ActivityType]:
|
||||||
"""Получает виды Деятельности с сервера Redmine"""
|
"""Получает виды Деятельности с сервера Redmine"""
|
||||||
resp = requests.get(
|
resp = requests.get(
|
||||||
|
|||||||
Reference in New Issue
Block a user