From 08ca8d1b4d6f67b3669ea8de7e684d9c7d181915 Mon Sep 17 00:00:00 2001 From: Eduard Date: Thu, 22 May 2025 17:29:53 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=82=20=D0=9D=D0=BE=D0=BC=D0=B5?= =?UTF-8?q?=D1=80=D0=B0=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.MD | 5 ++++- api/clockify.py | 4 ++-- classes/classes.py | 2 +- db/db.py | 2 +- utils.py | 4 ++++ 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/README.MD b/README.MD index 59c1e97..5a5e66e 100644 --- a/README.MD +++ b/README.MD @@ -11,7 +11,10 @@ |Описание задачи (Description)|Комментарий|Уточнение у аналитика| |Теги (Tags)|<Задача> - <Название задачи>|28882 - Прочие активности по Ветро| |Трекать/Не трекать (Billable/Non-billable)|<Занесена в Redmine или нет>|Если выбрано, то активность будет перенесена - +Тег обязательно должен содержать номер задачи (5 цифр) в начале.
+28882 - Прочие активности
+28882
+28882 Прочие активности
### Запуск: Клонируйте [репозиторий](https://git.sbps.ru/e.vlasov/redmine_tracker) и перейдите в него в командной строке: diff --git a/api/clockify.py b/api/clockify.py index 56b2b6b..e6d8e5c 100644 --- a/api/clockify.py +++ b/api/clockify.py @@ -8,7 +8,7 @@ from tqdm import tqdm from config import ClockifyConfig, config from classes import Activity, Tag, VetroProject from exceptions import InvalidToken -from utils import time_to_hour +from utils import parse_task_id, time_to_hour logger = logging.getLogger(__name__) @@ -42,7 +42,7 @@ class ClockifyAPI(ClockifyConfig): time_worked_out_total += time_to_hour((end if end else datetime.utcnow()) - start) tag = [tag for tag in self.get_tags() if tag.id == tag_id][0] try: - task_id, _ = tag.title.split(" - ") + task_id = parse_task_id(tag.title) except ValueError: logger.info(f'{activity["timeInterval"]["start"]}: {activity["description"]} - Неправильный формат тега {tag}') continue diff --git a/classes/classes.py b/classes/classes.py index 82dcc76..dab665d 100644 --- a/classes/classes.py +++ b/classes/classes.py @@ -18,7 +18,7 @@ class Activity: is_tracked: bool = False def __str__(self): - return f'{self.date_start + timedelta(hours=3)}|{self.description} для задачи #{self.task_id}' + return f'|{self.date_start + timedelta(hours=3)}| {self.description} для задачи #{self.task_id}' @dataclass diff --git a/db/db.py b/db/db.py index 0d865d8..8de11ec 100644 --- a/db/db.py +++ b/db/db.py @@ -23,6 +23,7 @@ class Database: logger.error("Ошибка при инициализации БД:", e) self.con.rollback() + # Сделать изменение поля is_tracked при IntegrityError def insert_activities(self, activities: list[Activity]): cur = self.con.cursor() is_updated = True @@ -53,7 +54,6 @@ class Database: if not is_updated: logging.info("База данных устарела. Рекомендуем обновить с помощью флага -i [--init-db]") - # Доделать def insert_time_entries(self, activities: list[Activity]): cur = self.con.cursor() for act in activities: diff --git a/utils.py b/utils.py index 04b37d2..3ae614e 100644 --- a/utils.py +++ b/utils.py @@ -1,4 +1,5 @@ from datetime import datetime, timedelta +import re from typing import Optional from config import config @@ -28,3 +29,6 @@ def str_to_date(date: str) -> Optional[datetime]: def format_date(date: datetime) -> datetime: if date: return date.strftime(config.DATETIME_FORMAT) + +def parse_task_id(tag: str) -> int: + return int(re.search(r"^(?P\d{5})", tag).group("task_id"))