оптимизировал сохранение данных и загрузку задач из Redmine
This commit is contained in:
190
db/db.py
190
db/db.py
@@ -33,8 +33,8 @@ class Database:
|
||||
|
||||
def insert_activities(self, activities: list[Activity]):
|
||||
"""Сохраняет в базу данных активности Clockify"""
|
||||
for act in activities:
|
||||
try:
|
||||
try:
|
||||
for act in activities:
|
||||
self.cursor.execute(
|
||||
"""INSERT INTO activity(
|
||||
id,
|
||||
@@ -48,7 +48,18 @@ class Database:
|
||||
task_id,
|
||||
project_id,
|
||||
author_id
|
||||
) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
|
||||
) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
ON CONFLICT(id) DO UPDATE SET
|
||||
description = excluded.description,
|
||||
time_spent = excluded.time_spent,
|
||||
date_start = excluded.date_start,
|
||||
date_end = excluded.date_end,
|
||||
is_tracked = excluded.is_tracked,
|
||||
vetro_project_id = excluded.vetro_project_id,
|
||||
tag_id = excluded.tag_id,
|
||||
task_id = excluded.task_id,
|
||||
project_id = excluded.project_id,
|
||||
author_id = excluded.author_id""",
|
||||
(
|
||||
act.id,
|
||||
act.description,
|
||||
@@ -63,31 +74,16 @@ class Database:
|
||||
act.author_id,
|
||||
)
|
||||
)
|
||||
except sq.IntegrityError:
|
||||
self.cursor.execute(
|
||||
"""UPDATE activity
|
||||
SET description = ?, time_spent = ?, date_start = ?, date_end = ?, is_tracked = ?, vetro_project_id = ?, tag_id = ?, task_id = ?, project_id = ?
|
||||
WHERE id = ?""",
|
||||
(
|
||||
act.description,
|
||||
act.time_spent,
|
||||
act.date_start,
|
||||
act.date_end,
|
||||
act.is_tracked,
|
||||
act.vetro_project_id,
|
||||
act.tag_id,
|
||||
act.task_id,
|
||||
act.project_id,
|
||||
act.id,
|
||||
)
|
||||
)
|
||||
finally:
|
||||
self.con.commit()
|
||||
except sq.Error as e:
|
||||
self.con.rollback()
|
||||
logger.error(f"Не удалось сохранить активности: {e}")
|
||||
else:
|
||||
self.con.commit()
|
||||
|
||||
def insert_time_entries(self, activities: list[Activity]):
|
||||
"""Сохраняет в базу данных трудочасы Redmine"""
|
||||
for act in activities:
|
||||
try:
|
||||
try:
|
||||
for act in activities:
|
||||
self.cursor.execute(
|
||||
"""INSERT INTO time_entry
|
||||
(date, description, activity_id, time_spent, task_id, activity_type_id, author_id)
|
||||
@@ -102,59 +98,60 @@ class Database:
|
||||
act.author_id
|
||||
)
|
||||
)
|
||||
self.con.commit()
|
||||
except sq.IntegrityError as e:
|
||||
self.con.rollback()
|
||||
logger.error(f"Не удалось сохранить трудочасы по активности {act.id}: {e}")
|
||||
except sq.IntegrityError as e:
|
||||
self.con.rollback()
|
||||
logger.error(f"Не удалось сохранить трудочасы: {e}")
|
||||
else:
|
||||
self.con.commit()
|
||||
|
||||
|
||||
def insert_tags(self, tags: list[Tag]):
|
||||
"""Сохраняет в базу данных теги Clockify"""
|
||||
for tag in tags:
|
||||
try:
|
||||
self.cursor.execute("INSERT INTO tag VALUES(?, ?)",(tag.id, tag.title))
|
||||
except sq.IntegrityError:
|
||||
try:
|
||||
for tag in tags:
|
||||
self.cursor.execute(
|
||||
"""UPDATE tag
|
||||
SET title = ?
|
||||
WHERE id = ?""",
|
||||
(tag.title, tag.id)
|
||||
"""INSERT INTO tag VALUES(?, ?)
|
||||
ON CONFLICT(id) DO UPDATE SET title = excluded.title""",
|
||||
(tag.id, tag.title)
|
||||
)
|
||||
finally:
|
||||
self.con.commit()
|
||||
except sq.Error as e:
|
||||
self.con.rollback()
|
||||
logger.error(f"Не удалось сохранить теги: {e}")
|
||||
else:
|
||||
self.con.commit()
|
||||
|
||||
|
||||
def insert_vetro_projects(self, vetro_projects: list[VetroProject]):
|
||||
"""Сохраняет в базу данных Проекты (ДО) Ветро Clockify"""
|
||||
if not vetro_projects:
|
||||
return
|
||||
for vetro_project in vetro_projects:
|
||||
try:
|
||||
self.cursor.execute("INSERT INTO vetro_project VALUES(?, ?)", (vetro_project.id, vetro_project.title))
|
||||
except sq.IntegrityError:
|
||||
self.cursor.execute("""
|
||||
UPDATE vetro_project
|
||||
SET title = ?
|
||||
WHERE id = ?""",
|
||||
(vetro_project.title, vetro_project.id)
|
||||
try:
|
||||
for vetro_project in vetro_projects:
|
||||
self.cursor.execute(
|
||||
"""INSERT INTO vetro_project VALUES(?, ?)
|
||||
ON CONFLICT(id) DO UPDATE SET title = excluded.title""",
|
||||
(vetro_project.id, vetro_project.title)
|
||||
)
|
||||
finally:
|
||||
self.con.commit()
|
||||
except sq.Error as e:
|
||||
self.con.rollback()
|
||||
logger.error(f"Не удалось сохранить проекты Ветро: {e}")
|
||||
else:
|
||||
self.con.commit()
|
||||
|
||||
def insert_activity_types(self, activity_types: list[ActivityType]):
|
||||
"""Сохраняет в базу данных Деятельности Redmine"""
|
||||
for activity_type in activity_types:
|
||||
try:
|
||||
self.cursor.execute("INSERT INTO activity_type VALUES(?, ?)", (activity_type.id, activity_type.title))
|
||||
except sq.IntegrityError:
|
||||
self.cursor.execute("""
|
||||
UPDATE activity_type
|
||||
SET title = ?
|
||||
WHERE id = ?""",
|
||||
(activity_type.title, activity_type.id)
|
||||
try:
|
||||
for activity_type in activity_types:
|
||||
self.cursor.execute(
|
||||
"""INSERT INTO activity_type VALUES(?, ?)
|
||||
ON CONFLICT(id) DO UPDATE SET title = excluded.title""",
|
||||
(activity_type.id, activity_type.title)
|
||||
)
|
||||
finally:
|
||||
self.con.commit()
|
||||
except sq.Error as e:
|
||||
self.con.rollback()
|
||||
logger.error(f"Не удалось сохранить типы деятельности: {e}")
|
||||
else:
|
||||
self.con.commit()
|
||||
|
||||
def insert_user(self, **kwargs):
|
||||
"""Сохраняет в базу данных пользователя"""
|
||||
@@ -162,35 +159,35 @@ class Database:
|
||||
self.cursor.execute("""INSERT INTO user(
|
||||
clockify_user_id, clockify_email, clockify_username,
|
||||
redmine_user_id, redmine_email, first_name, last_name, redmine_username)
|
||||
VALUES(?, ?, ?, ?, ?, ?, ?, ?)""", [v for k, v in kwargs.items()])
|
||||
except sq.IntegrityError:
|
||||
self.cursor.execute("""
|
||||
UPDATE user
|
||||
SET clockify_email = ?,
|
||||
clockify_username = ?,
|
||||
redmine_email = ?,
|
||||
first_name = ?,
|
||||
last_name = ?,
|
||||
redmine_username = ?
|
||||
WHERE redmine_user_id = ? AND clockify_user_id = ?""",
|
||||
VALUES(?, ?, ?, ?, ?, ?, ?, ?)
|
||||
ON CONFLICT(clockify_user_id) DO UPDATE SET
|
||||
clockify_email = excluded.clockify_email,
|
||||
clockify_username = excluded.clockify_username,
|
||||
redmine_email = excluded.redmine_email,
|
||||
first_name = excluded.first_name,
|
||||
last_name = excluded.last_name,
|
||||
redmine_username = excluded.redmine_username""",
|
||||
(
|
||||
kwargs["clockify_user_id"],
|
||||
kwargs["clockify_email"],
|
||||
kwargs["clockify_username"],
|
||||
kwargs["redmine_user_id"],
|
||||
kwargs["redmine_email"],
|
||||
kwargs["first_name"],
|
||||
kwargs["last_name"],
|
||||
kwargs["redmine_username"],
|
||||
kwargs["redmine_user_id"],
|
||||
kwargs["clockify_user_id"]
|
||||
)
|
||||
)
|
||||
finally:
|
||||
except sq.Error as e:
|
||||
self.con.rollback()
|
||||
logger.error(f"Не удалось сохранить пользователя: {e}")
|
||||
else:
|
||||
self.con.commit()
|
||||
|
||||
def insert_tasks(self, tasks: list[Task]):
|
||||
"""Сохраняет в БД Задачи из Redmine"""
|
||||
for task in tasks:
|
||||
try:
|
||||
try:
|
||||
for task in tasks:
|
||||
self.cursor.execute("""
|
||||
INSERT INTO task(
|
||||
"id",
|
||||
@@ -202,7 +199,15 @@ class Database:
|
||||
"tracker",
|
||||
"project"
|
||||
)
|
||||
VALUES(?, ?, ?, ?, ?, ?, ?, ?)""",
|
||||
VALUES(?, ?, ?, ?, ?, ?, ?, ?)
|
||||
ON CONFLICT(id) DO UPDATE SET
|
||||
"subject" = excluded."subject",
|
||||
"description" = excluded."description",
|
||||
"status" = excluded."status",
|
||||
"priority" = excluded."priority",
|
||||
"author" = excluded."author",
|
||||
"tracker" = excluded."tracker",
|
||||
"project" = excluded."project" """,
|
||||
[
|
||||
task.id,
|
||||
task.subject,
|
||||
@@ -213,30 +218,11 @@ class Database:
|
||||
task.tracker,
|
||||
task.project,
|
||||
])
|
||||
except sq.IntegrityError:
|
||||
self.cursor.execute("""
|
||||
UPDATE task
|
||||
SET "subject" = ?,
|
||||
"description" = ?,
|
||||
"status" = ?,
|
||||
"priority" = ?,
|
||||
"author" = ?,
|
||||
"tracker" = ?,
|
||||
"project" = ?
|
||||
WHERE "id" = ?""",
|
||||
(
|
||||
task.subject,
|
||||
task.description,
|
||||
task.status,
|
||||
task.priority,
|
||||
task.author,
|
||||
task.tracker,
|
||||
task.project,
|
||||
task.id
|
||||
)
|
||||
)
|
||||
finally:
|
||||
self.con.commit()
|
||||
except sq.Error as e:
|
||||
self.con.rollback()
|
||||
logger.error(f"Не удалось сохранить задачи: {e}")
|
||||
else:
|
||||
self.con.commit()
|
||||
|
||||
def get_user_by(self, by_field: str, value: str):
|
||||
"""Получает пользователя из бд"""
|
||||
|
||||
Reference in New Issue
Block a user