schmeckels/helper.py
2020-03-19 00:12:18 +01:00

65 lines
1.9 KiB
Python

#! /usr/bin/env python3
import os
import sys
from xdg import XDG_CONFIG_HOME, XDG_DATA_HOME
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from models import Category, Transaction
CONFIG_DIR = os.path.join(XDG_CONFIG_HOME, "schmeckels")
DATA_DIR = os.path.join(XDG_DATA_HOME, "schmeckels")
def create_dirs():
for directory in [CONFIG_DIR, DATA_DIR]:
try:
os.mkdir(directory)
except FileExistsError:
pass
def build_database_filename(profile_name):
return f"{DATA_DIR}/{profile_name}.db"
def get_session(profile_name):
if not profile_name:
count = len(os.listdir(DATA_DIR))
if count == 1:
filename = f"{DATA_DIR}/{os.listdir(DATA_DIR)[0]}"
else:
print("--profile is required when you have more than one database.")
sys.exit(1)
else:
filename = build_database_filename(profile_name)
if os.path.exists(filename) and os.path.isfile(filename):
engine = create_engine(f"sqlite:///{filename}")
Session = sessionmaker(bind=engine)
return Session()
else:
print(f"No database for profile '{profile_name}'. Did you run 'init'?")
sys.exit(1)
def create_category(name, parent, profile):
session = get_session(profile)
c = session.query(Category).filter(Category.name == name).first()
if not c:
c = Category(name=name, parent_id=parent)
session.add(c)
session.commit()
return c.id
def add_category(name, profile):
parts = name.split(":")
if len(parts) == 1:
return create_category(name, None, profile)
else:
for i in range(len(parts) - 1):
parent = parts[i]
child = parts[i + 1]
parent_id = create_category(parent, None, profile)
id = create_category(child, parent_id, profile)
return id