Tracker for updating and getting data Datamanager to serialize/deserialize Main for initialization Config for config
80 lines
2.5 KiB
Python
80 lines
2.5 KiB
Python
import json
|
|
from pathlib import Path
|
|
from core.user import User
|
|
from core.item import Item
|
|
from core.transaction import Transaction
|
|
|
|
|
|
class DataManager:
|
|
def __init__(self, data_dir) -> None:
|
|
self.data_dir = Path(data_dir)
|
|
self.data_dir.mkdir(exist_ok=True)
|
|
|
|
self.users_file = self.data_dir / "users.json"
|
|
self.items_file = self.data_dir / "items.json"
|
|
self.debts_file = self.data_dir / "debts.json"
|
|
self.transactions_file = self.data_dir / "transactions.json"
|
|
|
|
self._init_files()
|
|
|
|
def _init_files(self):
|
|
if not self.users_file.exists():
|
|
self._save_json(self.users_file, {})
|
|
if not self.items_file.exists():
|
|
self._save_json(self.items_file, {})
|
|
if not self.debts_file.exists():
|
|
self._save_json(self.debts_file, {})
|
|
if not self.transactions_file.exists():
|
|
self._save_json(self.transactions_file, [])
|
|
|
|
def load_users(self):
|
|
data = self._load_json(self.users_file)
|
|
return {
|
|
user_id: User.from_json(user_data) for user_id, user_data in data.items()
|
|
}
|
|
|
|
def load_items(self):
|
|
data = self._load_json(self.items_file)
|
|
return {
|
|
item_id: Item.from_json(item_data) for item_id, item_data in data.items()
|
|
}
|
|
|
|
def load_debts(self):
|
|
return self._load_json(self.debts_file)
|
|
|
|
def load_transactions(self):
|
|
data = self._load_json(self.transactions_file)
|
|
return [Transaction.from_json(t) for t in data]
|
|
|
|
def save_users(self, users):
|
|
data = {user_id: user.to_json() for user_id, user in users.items()}
|
|
self._save_json(self.users_file, data)
|
|
|
|
def save_items(self, items):
|
|
data = {item_id: item.to_json() for item_id, item in items.items()}
|
|
self._save_json(self.items_file, data)
|
|
|
|
def save_debts(self, debts):
|
|
self._save_json(self.debts_file, debts)
|
|
|
|
def save_transactions(self, transactions):
|
|
data = [t.to_json() for t in transactions]
|
|
self._save_json(self.transactions_file, data)
|
|
|
|
def _load_json(self, filepath):
|
|
try:
|
|
with open(filepath, "r") as f:
|
|
return json.load(f)
|
|
|
|
except (FileNotFoundError, json.JSONDecodeError):
|
|
return (
|
|
{}
|
|
if filepath.name.endswith(".json")
|
|
and "transaction" not in filepath.name
|
|
else []
|
|
)
|
|
|
|
def _save_json(self, filepath, data):
|
|
with open(filepath, "w") as f:
|
|
json.dump(data, f, indent=2)
|