From 39ede4f880901d920837422c28ac648ada37d2df Mon Sep 17 00:00:00 2001 From: quicklike Date: Tue, 20 May 2025 21:24:30 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BD=D0=B5=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D1=8B=D0=B5?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=BB=D1=8F=20=D0=B2=20=D0=B1=D0=B0=D0=B7=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/clockify.py | 4 ++-- api/redmine.py | 2 +- config/__init__.py | 4 +++- db/db.py | 44 +++++++++++++++++++++++++------------------- track.py | 2 ++ 5 files changed, 33 insertions(+), 23 deletions(-) diff --git a/api/clockify.py b/api/clockify.py index 2543966..8bebe6f 100644 --- a/api/clockify.py +++ b/api/clockify.py @@ -31,7 +31,7 @@ class ClockifyAPI(ClockifyConfig): result = [] for activity in tqdm(activities, desc="Парсинг задач"): if not activity.get("tagIds"): - logging.info(f"{activity["timeInterval"]["start"]}: {activity["description"]} - У задачи нет тегов") + logging.info(f'{activity["timeInterval"]["start"]}: {activity["description"]} - У задачи нет тегов') continue for tag_id in activity.get("tagIds", {"tagIds": []}): start = datetime.strptime(activity["timeInterval"]["start"], config.DATETIME_FORMAT) @@ -41,7 +41,7 @@ class ClockifyAPI(ClockifyConfig): try: task_id, task_title = tag.title.split(" - ") except ValueError: - logging.info(f"{activity["timeInterval"]["start"]}: {activity["description"]} - Неправильный формат тега {tag}") + logging.info(f'{activity["timeInterval"]["start"]}: {activity["description"]} - Неправильный формат тега {tag}') continue result.append( Activity( diff --git a/api/redmine.py b/api/redmine.py index 546414f..5c88c5e 100644 --- a/api/redmine.py +++ b/api/redmine.py @@ -61,5 +61,5 @@ class RedmineAPI(RedmineConfig): logging.error("Invalid Token for RedmineAPI") raise InvalidToken resp = resp.json()['user'] - logging.debug({"login": resp["login"], "email": resp["mail"], "full_name": f"{resp["firstname"]} {resp["lastname"]}"}) + logging.debug({"login": resp["login"], "email": resp["mail"], "full_name": f'{resp["firstname"]} {resp["lastname"]}'}) return token \ No newline at end of file diff --git a/config/__init__.py b/config/__init__.py index 62ff352..f326081 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -1,12 +1,14 @@ import argparse from pydantic_settings import BaseSettings +from dotenv import load_dotenv from db.db import Database - from .clockify import ClockifyConfig # noqa: F401 from .redmine import RedmineConfig # noqa: F401 +load_dotenv() + class Config(BaseSettings): CLOCKIFY_TOKEN: str diff --git a/db/db.py b/db/db.py index f7c5d21..5c2d8f3 100644 --- a/db/db.py +++ b/db/db.py @@ -10,19 +10,17 @@ class Database: self.con = sq.connect(db_name) self.con.cursor().executescript('''CREATE TABLE IF NOT EXISTS "activities" ( "id" VARCHAR NOT NULL UNIQUE, - "vetro_project_id" VARCHAR NOT NULL, - "vetro_project_title" VARCHAR NOT NULL, - "task_id" VARCHAR NOT NULL, - "description" VARCHAR NOT NULL, - "task_title" VARCHAR NOT NULL, - "tag_id" VARCHAR NOT NULL, - "project_id" VARCHAR NOT NULL, - "time_spent" NUMERIC NOT NULL, + "description" VARCHAR NOT NULL, + "time_spent" NUMERIC NOT NULL, "date_start" DATETIME NOT NULL, "date_end" DATETIME, "is_tracked" BOOLEAN NOT NULL DEFAULT false, + "vetro_project_id" VARCHAR NOT NULL, + "tag_id" VARCHAR NOT NULL, + "project_id" VARCHAR NOT NULL, PRIMARY KEY("id"), FOREIGN KEY ("tag_id") REFERENCES "tags"("id") + FOREIGN KEY ("vetro_project_id") REFERENCES "vetro_projects"("id") ON UPDATE NO ACTION ON DELETE NO ACTION ); @@ -35,9 +33,7 @@ CREATE TABLE IF NOT EXISTS "tags" ( CREATE TABLE IF NOT EXISTS "vetro_projects" ( "id" VARCHAR NOT NULL UNIQUE, "title" VARCHAR NOT NULL, - PRIMARY KEY("id"), - FOREIGN KEY ("id") REFERENCES "activities"("vetro_project_id") - ON UPDATE NO ACTION ON DELETE NO ACTION + PRIMARY KEY("id") ); CREATE TABLE IF NOT EXISTS "time_entry" ( @@ -63,19 +59,17 @@ CREATE TABLE IF NOT EXISTS "time_entry" ( for act in activities: try: cur.execute( - "INSERT INTO activities VALUES(?, ?, ? ,? ,? ,? ,? ,? ,? ,? ,? ,?)", + "INSERT INTO activities VALUES(?,?,?,?,?,?,?,?,?)", ( - act.id,act.vetro_project_id, - act.vetro_project_title, - act.task_id, + act.id, act.description, - act.task_title, - act.tag_id, - act.project_id, act.time_spent, act.date_start, act.date_end, - act.is_tracked + act.is_tracked, + act.vetro_project_id, + act.tag_id, + act.project_id, ) ) self.con.commit() @@ -123,4 +117,16 @@ CREATE TABLE IF NOT EXISTS "time_entry" ( except Exception as e: logging.error(e) + + def insert_vetro_projects(self, vetro_projects: dict): + cur = self.con.cursor() + for k, v in vetro_projects.items(): + try: + cur.execute("INSERT INTO vetro_projects VALUES(?, ?)", (k, v)) + self.con.commit() + except Exception as e: + logging.error(e) + + + diff --git a/track.py b/track.py index 4056fc8..317cae1 100644 --- a/track.py +++ b/track.py @@ -38,6 +38,8 @@ def main(): }, ) db.insert_activities(activities) + db.insert_tags(clock.get_tags()) + db.insert_vetro_projects(config.VETRO_PROJECTS) # tracked_activities = red.track_activities(activities) # clock.mark_tracked(tracked_activities) for activity in activities: