From 9688bd644d02b3643d3b64347908017a5c246390 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=AD=D0=B4=D1=83=D0=B0=D1=80=D0=B4?= Date: Fri, 3 Oct 2025 18:15:45 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0=D0=BB=20=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=20=D0=BE?= =?UTF-8?q?=D1=82=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/clockify.py | 38 +++++++++++++++++++------------------- api/redmine.py | 27 ++++++++++++++------------- classes/classes.py | 2 +- config/__init__.py | 6 ++++++ track.py | 15 +++++++-------- 5 files changed, 47 insertions(+), 41 deletions(-) diff --git a/api/clockify.py b/api/clockify.py index 01d4498..2f6da59 100644 --- a/api/clockify.py +++ b/api/clockify.py @@ -140,27 +140,27 @@ class ClockifyAPI(ClockifyConfig): """ for activity in activities: try: - resp = requests.put( - self.base_url + self.update_time_entry( - activity_id=activity.id - ), json={ - "billable": True, - "start": activity.date_start.strftime(config.DATETIME_FORMAT), - "end": activity.date_end.strftime(config.DATETIME_FORMAT) if activity.date_end else None, - "description": activity.description, - "tagIds": [activity.tag_id], - "taskId": activity.vetro_project_id, - "projectId": activity.project_id - }, headers={ - "X-API-KEY": self.token - } - ) - if resp.ok: - logger.debug(resp.json()) - logger.info(f"✅{Fore.GREEN}{activity}{Fore.RESET}") + if not config.is_debug: + resp = requests.put( + self.base_url + self.update_time_entry( + activity_id=activity.id + ), json={ + "billable": True, + "start": activity.date_start.strftime(config.DATETIME_FORMAT), + "end": activity.date_end.strftime(config.DATETIME_FORMAT) if activity.date_end else None, + "description": activity.description, + "tagIds": [activity.tag_id], + "taskId": activity.vetro_project_id, + "projectId": activity.project_id + }, headers={ + "X-API-KEY": self.token + } + ) + if config.is_debug or resp.ok: + logger.info(f"{Fore.GREEN}{activity}{Fore.RESET}✅") else: logger.debug(resp.json()) - logger.error(f"❌{Fore.RED}{activity}{Fore.RESET}") + logger.error(f"{Fore.RED}{activity}{Fore.RESET}❌") except Exception as e: logger.error(e) return diff --git a/api/redmine.py b/api/redmine.py index d51d0b5..85d5af1 100644 --- a/api/redmine.py +++ b/api/redmine.py @@ -37,20 +37,21 @@ class RedmineAPI(RedmineConfig): if not(not activity.is_tracked and activity.date_end): continue try: - resp = requests.post( - self.base_url + self.time_entries_url, - headers={"X-Redmine-Api-Key": self.token}, - json={ - "time_entry": { - "issue_id": activity.task_id, - "hours": activity.time_spent / (2 if is_beginner else 1), - "activity_id": ActivityTypes.DEVELOPMENT, - "comments": activity.description, - "spent_on": activity.date_start.strftime(self.datetime_format) + if not config.is_debug: + resp = requests.post( + self.base_url + self.time_entries_url, + headers={"X-Redmine-Api-Key": self.token}, + json={ + "time_entry": { + "issue_id": activity.task_id, + "hours": activity.time_spent / (2 if is_beginner else 1), + "activity_id": ActivityTypes.DEVELOPMENT, + "comments": activity.description, + "spent_on": activity.date_start.strftime(self.datetime_format) + } } - } - ) - if resp.ok: + ) + if config.is_debug or resp.ok: activity.is_tracked = True tracked.append(activity) logger.debug(activity) diff --git a/classes/classes.py b/classes/classes.py index ce1e801..5c4b5fc 100644 --- a/classes/classes.py +++ b/classes/classes.py @@ -19,7 +19,7 @@ class Activity: is_tracked: bool = False def __str__(self): - return f'({self.task_id}) - {self.description};' + return f'({self.task_id}) - {self.description}'[:60] @dataclass diff --git a/config/__init__.py b/config/__init__.py index 62eb0d3..83977d4 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -17,6 +17,8 @@ class Config(BaseSettings): USER_ID: str = None WORKSPACE_ID: str = None + MODE: str = "prod" + TRIAL_END_DATE: str = datetime.today().strftime("%Y-%m-%d") ENV_TXT: str = ".env.txt" @@ -44,6 +46,10 @@ class Config(BaseSettings): def is_beginner(self): from utils import str_to_date return datetime.today() < str_to_date(self.TRIAL_END_DATE) + + @property + def is_debug(self): + return self.MODE == "debug" def configure_argument_parser(): diff --git a/track.py b/track.py index 58abe28..b0219bb 100644 --- a/track.py +++ b/track.py @@ -13,14 +13,15 @@ logging.basicConfig( from colorama import Fore # noqa: E402 -from config import arg_parser, clock, db, red # noqa: E402 +from config import arg_parser, clock, config, db, red # noqa: E402 from utils import check_envs, db_update, format_date, get_start_end_dates # noqa: E402 def main(): - args = arg_parser.parse_args() + args = arg_parser.parse_args() - if args.debug: + if is_debug := args.debug: + config.MODE = "debug" logging.getLogger().setLevel(logging.DEBUG) logger = logging.getLogger(__name__) @@ -59,14 +60,12 @@ def main(): logger.info(Fore.YELLOW + "Нет задач для занесения трудочасов" + Fore.RESET) return db.insert_activities(activities) - if args.debug: - logger.debug("Пропускаем этап загрузки трудочасов") - return try: tracked_activities = red.track_activities(activities) clock.mark_tracked(tracked_activities) - db.insert_time_entries(tracked_activities) - db.insert_activities(tracked_activities) + if not is_debug: + db.insert_time_entries(tracked_activities) + db.insert_activities(tracked_activities) except Exception as e: logger.error(e)