Изменил формат Номера задачи
This commit is contained in:
@@ -11,7 +11,10 @@
|
|||||||
|Описание задачи (Description)|Комментарий|Уточнение у аналитика|
|
|Описание задачи (Description)|Комментарий|Уточнение у аналитика|
|
||||||
|Теги (Tags)|<Задача> - <Название задачи>|28882 - Прочие активности по Ветро|
|
|Теги (Tags)|<Задача> - <Название задачи>|28882 - Прочие активности по Ветро|
|
||||||
|Трекать/Не трекать (Billable/Non-billable)|<Занесена в Redmine или нет>|Если выбрано, то активность будет перенесена
|
|Трекать/Не трекать (Billable/Non-billable)|<Занесена в Redmine или нет>|Если выбрано, то активность будет перенесена
|
||||||
|
Тег обязательно должен содержать номер задачи (5 цифр) в начале.<br>
|
||||||
|
28882 - Прочие активности<br>
|
||||||
|
28882<br>
|
||||||
|
28882 Прочие активности<br>
|
||||||
|
|
||||||
### Запуск:
|
### Запуск:
|
||||||
Клонируйте [репозиторий](https://git.sbps.ru/e.vlasov/redmine_tracker) и перейдите в него в командной строке:
|
Клонируйте [репозиторий](https://git.sbps.ru/e.vlasov/redmine_tracker) и перейдите в него в командной строке:
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ from tqdm import tqdm
|
|||||||
from config import ClockifyConfig, config
|
from config import ClockifyConfig, config
|
||||||
from classes import Activity, Tag, VetroProject
|
from classes import Activity, Tag, VetroProject
|
||||||
from exceptions import InvalidToken
|
from exceptions import InvalidToken
|
||||||
from utils import time_to_hour
|
from utils import parse_task_id, time_to_hour
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
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)
|
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]
|
tag = [tag for tag in self.get_tags() if tag.id == tag_id][0]
|
||||||
try:
|
try:
|
||||||
task_id, _ = tag.title.split(" - ")
|
task_id = parse_task_id(tag.title)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
logger.info(f'{activity["timeInterval"]["start"]}: {activity["description"]} - Неправильный формат тега {tag}')
|
logger.info(f'{activity["timeInterval"]["start"]}: {activity["description"]} - Неправильный формат тега {tag}')
|
||||||
continue
|
continue
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ class Activity:
|
|||||||
is_tracked: bool = False
|
is_tracked: bool = False
|
||||||
|
|
||||||
def __str__(self):
|
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
|
@dataclass
|
||||||
|
|||||||
2
db/db.py
2
db/db.py
@@ -23,6 +23,7 @@ class Database:
|
|||||||
logger.error("Ошибка при инициализации БД:", e)
|
logger.error("Ошибка при инициализации БД:", e)
|
||||||
self.con.rollback()
|
self.con.rollback()
|
||||||
|
|
||||||
|
# Сделать изменение поля is_tracked при IntegrityError
|
||||||
def insert_activities(self, activities: list[Activity]):
|
def insert_activities(self, activities: list[Activity]):
|
||||||
cur = self.con.cursor()
|
cur = self.con.cursor()
|
||||||
is_updated = True
|
is_updated = True
|
||||||
@@ -53,7 +54,6 @@ class Database:
|
|||||||
if not is_updated:
|
if not is_updated:
|
||||||
logging.info("База данных устарела. Рекомендуем обновить с помощью флага -i [--init-db]")
|
logging.info("База данных устарела. Рекомендуем обновить с помощью флага -i [--init-db]")
|
||||||
|
|
||||||
# Доделать
|
|
||||||
def insert_time_entries(self, activities: list[Activity]):
|
def insert_time_entries(self, activities: list[Activity]):
|
||||||
cur = self.con.cursor()
|
cur = self.con.cursor()
|
||||||
for act in activities:
|
for act in activities:
|
||||||
|
|||||||
4
utils.py
4
utils.py
@@ -1,4 +1,5 @@
|
|||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
|
import re
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from config import config
|
from config import config
|
||||||
@@ -28,3 +29,6 @@ def str_to_date(date: str) -> Optional[datetime]:
|
|||||||
def format_date(date: datetime) -> datetime:
|
def format_date(date: datetime) -> datetime:
|
||||||
if date:
|
if date:
|
||||||
return date.strftime(config.DATETIME_FORMAT)
|
return date.strftime(config.DATETIME_FORMAT)
|
||||||
|
|
||||||
|
def parse_task_id(tag: str) -> int:
|
||||||
|
return int(re.search(r"^(?P<task_id>\d{5})", tag).group("task_id"))
|
||||||
|
|||||||
Reference in New Issue
Block a user