оптимизировал сохранение данных и загрузку задач из Redmine
This commit is contained in:
@@ -52,6 +52,7 @@ class ClockifyAPI(ClockifyConfig):
|
||||
if not tags:
|
||||
logger.info(f"{Fore.YELLOW}В базе данных нет тегов! Обновите БД при помощи флага -i [--init-db]{Fore.RESET}")
|
||||
return []
|
||||
tags_by_id = {tag.id: tag for tag in tags}
|
||||
|
||||
result = []
|
||||
for activity in tqdm(activities, desc="Парсинг задач"):
|
||||
@@ -64,13 +65,13 @@ class ClockifyAPI(ClockifyConfig):
|
||||
time_worked_out_total += time_to_hour((end if end else datetime.utcnow()) - start)
|
||||
|
||||
|
||||
tag = [tag for tag in tags if tag.id == tag_id]
|
||||
tag = tags_by_id.get(tag_id)
|
||||
|
||||
if not tag:
|
||||
tag = self.get_tags(True, tag_id=tag_id, **{"page-size": self.tags_count})
|
||||
if isinstance(tag, Tag):
|
||||
db.insert_tags([tag])
|
||||
tags.append(tag)
|
||||
tags_by_id[tag.id] = tag
|
||||
from config import red
|
||||
try:
|
||||
task_id = parse_task_id(tag.title)
|
||||
@@ -84,7 +85,6 @@ class ClockifyAPI(ClockifyConfig):
|
||||
logger.error(f"{Fore.RED} Тег не найден: {tag_id}{Fore.RESET}")
|
||||
continue
|
||||
else:
|
||||
tag = tag[0]
|
||||
task_id = parse_task_id(tag.title)
|
||||
|
||||
author = db.get_user_by("clockify_user_id", activity["userId"])
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
"""Константы API-клиентов."""
|
||||
|
||||
REQUEST_TIMEOUT = 30
|
||||
REDMINE_ISSUES_LIMIT = 100
|
||||
|
||||
@@ -8,7 +8,7 @@ from config import RedmineConfig, config
|
||||
from classes import Activity, ActivityType
|
||||
from enums import ActivityTypes
|
||||
from exceptions import InvalidToken
|
||||
from .constants import REQUEST_TIMEOUT
|
||||
from .constants import REDMINE_ISSUES_LIMIT, REQUEST_TIMEOUT
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -142,11 +142,13 @@ class RedmineAPI(RedmineConfig):
|
||||
def get_issues(self) -> list[Task]:
|
||||
"""Получает задачи с сервера Redmine"""
|
||||
issues = []
|
||||
for i in range(25):
|
||||
offset = 0
|
||||
total_count = None
|
||||
while total_count is None or offset < total_count:
|
||||
resp = requests.get(
|
||||
self.base_url + self.issues,
|
||||
headers={"X-Redmine-Api-Key": self.token},
|
||||
params={"limit": 100, "offset": 100 * i, "status_id": "*"},
|
||||
params={"limit": REDMINE_ISSUES_LIMIT, "offset": offset, "status_id": "*"},
|
||||
timeout=REQUEST_TIMEOUT,
|
||||
)
|
||||
if not resp.ok:
|
||||
@@ -157,6 +159,8 @@ class RedmineAPI(RedmineConfig):
|
||||
logger.error("Ошибка RedmineAPI: пустой ответ")
|
||||
return []
|
||||
issues.extend(data["issues"])
|
||||
total_count = data.get("total_count", len(issues))
|
||||
offset += data.get("limit", REDMINE_ISSUES_LIMIT)
|
||||
return [Task(**{
|
||||
"id": issue["id"],
|
||||
"subject": issue["subject"],
|
||||
|
||||
Reference in New Issue
Block a user