diff --git a/api/clockify.py b/api/clockify.py index 82109b7..802681c 100644 --- a/api/clockify.py +++ b/api/clockify.py @@ -6,7 +6,7 @@ import requests from tqdm import tqdm from config import ClockifyConfig, config -from classes import Activity, Tag +from classes import Activity, ActivityType, Tag from exceptions import InvalidToken from utils import time_to_hour @@ -106,9 +106,7 @@ class ClockifyAPI(ClockifyConfig): except Exception as e: logger.error(e) return - - def _check_token(self, token: str) -> str: resp = requests.get(self.base_url + self.user_url, headers={"X-API-KEY": token}) if not resp.ok: diff --git a/api/redmine.py b/api/redmine.py index 7961748..4cef47e 100644 --- a/api/redmine.py +++ b/api/redmine.py @@ -4,8 +4,8 @@ import requests from tqdm import tqdm from config import RedmineConfig, config -from classes import Activity -from enums import ActivityType +from classes import Activity, ActivityType +from enums import ActivityType as ActivityTypeEnum from exceptions import InvalidToken logger = logging.getLogger(__name__) @@ -34,7 +34,7 @@ class RedmineAPI(RedmineConfig): "time_entry": { "issue_id": activity.task_id, "hours": activity.time_spent, - "activity_id": ActivityType.DEVELOPMENT, + "activity_id": ActivityTypeEnum.DEVELOPMENT, "comments": activity.description, "spent_on": activity.date_start.strftime(self.datetime_format) } @@ -55,7 +55,16 @@ class RedmineAPI(RedmineConfig): else: logger.info(f"Не все задачи были занесены в Redmine. Занесено {len(tracked)}") return tracked - + + def get_time_entry_activities(self): + resp = requests.get(self.base_url + self.time_entry_activities, headers={"X-Redmine-API-KEY": self.token}) + logging.debug(resp.json()) + if resp.ok: + return [ + ActivityType(id=act.get("id"), title=act.get("name")) + for act in resp.json().get("time_entry_activities") + if act.get("active") + ] def _check_token(self, token): resp = requests.get(self.base_url + self.my_account_url, headers={"X-Redmine-Api-Key": token}) diff --git a/classes/__init__.py b/classes/__init__.py index 9c2db31..2562cf6 100644 --- a/classes/__init__.py +++ b/classes/__init__.py @@ -1 +1 @@ -from .classes import Activity, Tag +from .classes import Activity, ActivityType, Tag # noqa: F401 diff --git a/classes/classes.py b/classes/classes.py index 8a78b35..cd21170 100644 --- a/classes/classes.py +++ b/classes/classes.py @@ -30,3 +30,12 @@ class Tag: def __str__(self): return self.title + + +@dataclass +class ActivityType: + id: str + title: str + + def __str__(self): + return self.title diff --git a/config/clockify.py b/config/clockify.py index 0c6447a..176574a 100644 --- a/config/clockify.py +++ b/config/clockify.py @@ -24,4 +24,4 @@ class ClockifyConfig: return "%Y-%m-%dT%H:%M:%SZ" def update_time_entry(self, activity_id): - return f"/workspaces/{self.workspace_id}/time-entries/{activity_id}" \ No newline at end of file + return f"/workspaces/{self.workspace_id}/time-entries/{activity_id}" diff --git a/config/redmine.py b/config/redmine.py index d30cc77..19baf1b 100644 --- a/config/redmine.py +++ b/config/redmine.py @@ -13,4 +13,8 @@ class RedmineConfig: @property def datetime_format(self): - return "%Y-%m-%d" \ No newline at end of file + return "%Y-%m-%d" + + @property + def time_entry_activities(self): + return "/enumerations/time_entry_activities.json" diff --git a/db/db.py b/db/db.py index 0adfba3..6291db6 100644 --- a/db/db.py +++ b/db/db.py @@ -1,8 +1,8 @@ import logging import sqlite3 as sq -from classes import Activity, Tag -from enums import ActivityType +from classes import Activity, ActivityType, Tag +from enums import ActivityType as ActivityTypeEnum logger = logging.getLogger(__name__) @@ -60,7 +60,7 @@ class Database: act.id, act.time_spent, act.task_id, - ActivityType.DEVELOPMENT + ActivityTypeEnum.DEVELOPMENT ) ) self.con.commit() @@ -93,11 +93,11 @@ class Database: except Exception as e: logger.debug(e) - def insert_activity_types(self, activity_types: dict): + def insert_activity_types(self, activity_types: list[ActivityType]): cur = self.con.cursor() - for k,v in activity_types.items(): + for activity_type in activity_types: try: - cur.execute("INSERT INTO activity_types VALUES(?, ?)", (k, v)) + cur.execute("INSERT INTO activity_types VALUES(?, ?)", (activity_type.id, activity_type.title)) self.con.commit() except Exception as e: logger.debug(e) diff --git a/track.py b/track.py index d206ffb..032161c 100644 --- a/track.py +++ b/track.py @@ -45,6 +45,8 @@ def main(): workspace_id=WORKSPACE_ID, user_id=USER_ID ) + red = RedmineAPI(config.REDMINE_TOKEN) + db.insert_tags(clock.get_tags()) db.insert_vetro_projects(config.VETRO_PROJECTS) activities = clock.get_activities( @@ -55,18 +57,11 @@ def main(): }, ) db.insert_activities(activities) - db.insert_activity_types({ - 9: "Разработка", - 8: "Бизнес-анализ", - 57: "Code review", - 58: "Внутренние консультации", - 60: "Поддержка", - }) + db.insert_activity_types(red.get_time_entry_activities()) if args.debug: logger.debug("Пропускаем этап загрузки трудочасов") return try: - red = RedmineAPI(config.REDMINE_TOKEN) tracked_activities = red.track_activities(activities) clock.mark_tracked(tracked_activities) db.insert_time_entries(tracked_activities)