Switch to peewee ORM

This commit is contained in:
3wc
2023-10-28 00:42:30 +01:00
parent 65f16a252c
commit cd278b32aa
2 changed files with 142 additions and 294 deletions

View File

@ -5,15 +5,26 @@ from textual.containers import Horizontal, Vertical
from textual.coordinate import Coordinate
from textual.screen import Screen
from .db import DatabaseManager, Category, Activity, KimaiProject, KimaiCustomer
from .kimai import KimaiAPI, Customer as KimaiAPICustomer, Project as KimaiAPIProject, Activity as KimaiAPIActivity
from peewee import fn, JOIN
from .db import (
db,
HamsterCategory,
HamsterActivity,
HamsterFact,
KimaiProject,
KimaiCustomer,
KimaiActivity,
)
from .kimai import (
KimaiAPI,
Customer as KimaiAPICustomer,
Project as KimaiAPIProject,
Activity as KimaiAPIActivity,
)
class ListScreen(Screen):
def __init__(self, db_manager):
self.db_manager = db_manager
super().__init__()
def compose(self) -> ComposeResult:
"""create child widgets for the app."""
yield Header()
@ -67,14 +78,29 @@ class ActivitiesScreen(ListScreen):
def _refresh(self, filter_query=None):
self.table.clear()
# List activities with the count of facts
activities = Activity.list(self.db_manager, filter_query)
activities = (
HamsterActivity.select(
HamsterActivity,
HamsterCategory,
fn.Count(HamsterFact.id).alias("facts_count")
)
.join(HamsterCategory, JOIN.LEFT_OUTER)
.switch(HamsterActivity)
.join(HamsterFact, JOIN.LEFT_OUTER)
.group_by(HamsterActivity)
)
if filter_query:
activities = activities.where(
HamsterActivity.name.contains(filter_query)
| HamsterCategory.name.contains(filter_query)
)
self.table.add_rows(
[
[
activity.category_id,
activity.category_name,
activity.category.id,
activity.category.name,
activity.id,
activity.name,
activity.facts_count,
@ -102,8 +128,8 @@ class ActivitiesScreen(ListScreen):
Coordinate(self.table.cursor_coordinate.row, 2),
)
activity = Activity.get_by_id(self.db_manager, activity_id)
activity.delete()
activity = HamsterActivity.get(id=activity_id)
activity.delete_instance()
# supply the row key to `remove_row` to delete the row.
self.table.remove_row(row_key)
@ -111,7 +137,7 @@ class ActivitiesScreen(ListScreen):
def action_move_facts(self) -> None:
row_idx: int = self.table.cursor_row
row_cells = self.table.get_row_at(row_idx)
self.move_from_activity = Activity.get_by_id(self.db_manager, row_cells[2])
self.move_from_activity = HamsterActivity.get(id=row_cells[2])
for col_idx, cell_value in enumerate(row_cells):
cell_coordinate = Coordinate(row_idx, col_idx)
self.table.update_cell_at(
@ -122,10 +148,12 @@ class ActivitiesScreen(ListScreen):
def on_data_table_row_selected(self, event):
if getattr(self, "move_from_activity", None) is not None:
move_to_activity = Activity.get_by_id(
self.db_manager, self.table.get_cell_at(Coordinate(event.cursor_row, 2))
move_to_activity = HamsterActivity.get(
self.table.get_cell_at(Coordinate(event.cursor_row, 2))
)
self.move_from_activity.move_facts(move_to_activity)
HamsterFact.update({HamsterFact.activity:
move_to_activity}).where(HamsterFact.activity ==
self.move_from_activity).execute()
filter_input = self.query_one("#filter")
self._refresh(filter_input.value)
del self.move_from_activity
@ -143,16 +171,26 @@ class CategoriesScreen(ListScreen):
def _refresh(self, filter_query=None):
self.table.clear()
categories = Category.list(
self.db_manager, filter_query=filter_query
categories = (
HamsterCategory.select(
HamsterCategory,
fn.Count(HamsterActivity.id).alias("activities_count")
)
.join(HamsterActivity, JOIN.LEFT_OUTER)
.group_by(HamsterCategory)
)
if filter_query:
categories = categories.where(
HamsterCategory.name.contains(filter_query)
)
self.table.add_rows(
[
[
category.id,
category.name,
category.activity_count,
category.activities_count,
]
for category in categories
]
@ -174,8 +212,8 @@ class CategoriesScreen(ListScreen):
category_id = self.table.get_cell_at(
Coordinate(self.table.cursor_coordinate.row, 0),
)
category = Category.get_by_id(self.db_manager, category_id)
category.delete()
category = HamsterCategory.get(id=category_id)
category.delete_instance()
# supply the row key to `remove_row` to delete the row.
self.table.remove_row(row_key)
@ -193,15 +231,33 @@ class KimaiScreen(ListScreen):
def _refresh(self, filter_query=None):
self.table.clear()
projects = KimaiProject.list(self.db_manager, filter_query)
projects = (
KimaiProject.select(
KimaiProject,
KimaiCustomer,
fn.Count(KimaiActivity.id).alias("activities_count")
)
.join(KimaiCustomer, JOIN.LEFT_OUTER)
.switch(KimaiProject)
.join(KimaiActivity, JOIN.LEFT_OUTER)
.group_by(KimaiProject)
)
if filter_query:
projects = projects.where(
KimaiProject.name.contains(filter_query)
| KimaiCustomer.name.contains(filter_query)
)
self.table.add_rows(
[
[
project.customer_id,
project.customer_name,
project.customer.id,
project.customer.name,
project.id,
project.name,
project.activities_count
]
for project in projects
]
@ -213,21 +269,28 @@ class KimaiScreen(ListScreen):
api = KimaiAPI()
customers = KimaiAPICustomer.list(api)
for customer in customers:
KimaiCustomer(self.db_manager, id=customer.id, name=customer.name).save()
with db.atomic():
KimaiCustomer.insert_many([{
'id': customer.id,
'name': customer.name
} for customer in customers]).execute()
projects = KimaiAPIProject.list(api)
for project in projects:
KimaiProject(self.db_manager, id=project.id, name=project.name,
customer_id=project.customer.id, customer_name="").save()
with db.atomic():
KimaiProject.insert_many([{
'id': project.id,
'name': project.name,
'customer_id': project.customer.id
} for project in projects]).execute()
self._refresh()
def on_mount(self) -> None:
self.table = self.query_one(DataTable)
self.table.cursor_type = "row"
self.columns = self.table.add_columns("customer id", "customer",
"project id", "project")
self.columns = self.table.add_columns(
"customer id", "customer", "project id", "project", "activities"
)
# self.sort = (self.columns[1], self.columns[3])
self.sort = self.columns[1]
self._refresh()
@ -243,12 +306,12 @@ class HamsterToolsApp(App):
]
def __init__(self):
self.db_manager = DatabaseManager("hamster-testing.db")
db.init("hamster-testing.db")
self.MODES = {
"categories": CategoriesScreen(self.db_manager),
"activities": ActivitiesScreen(self.db_manager),
"kimai": KimaiScreen(self.db_manager)
"categories": CategoriesScreen(),
"activities": ActivitiesScreen(),
"kimai": KimaiScreen(),
}
super().__init__()
@ -258,4 +321,4 @@ class HamsterToolsApp(App):
def action_quit(self) -> None:
self.exit()
self.db_manager.close()
db.close()