schmeckels/helper.py
Felix Breidenstein db555fa3b3 Fix autosort
2020-10-18 20:11:17 +02:00

94 lines
2.4 KiB
Python

#! /usr/bin/env python3
import os
import sys
import yaml
import re
from xdg import XDG_CONFIG_HOME, XDG_DATA_HOME
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
import models
import locale
try:
from yaml import CLoader as Loader
except ImportError:
from yaml import Loader
CONFIG_DIR = os.path.join(XDG_CONFIG_HOME, "schmeckels")
DATA_DIR = os.path.join(XDG_DATA_HOME, "schmeckels")
def format_amount(cents):
amount = cents / 100
return f"{amount:,.2f}"
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 build_rules_filename(profile_name):
return f"{CONFIG_DIR}/{profile_name}.yaml"
def check_single_profile():
files = os.listdir(DATA_DIR)
if len(files) == 1:
return files[0].split(".")[0]
else:
print("--profile is required when you have more than one database.")
sys.exit(1)
def list_profiles():
files = os.listdir(DATA_DIR)
return [x.split(".")[0] for x in files]
def get_session(profile_name):
if not profile_name:
profile_name = check_single_profile()
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 get_rules(profile_name):
if not profile_name:
profile_name = check_single_profile()
filename = build_rules_filename(profile_name)
if os.path.exists(filename) and os.path.isfile(filename):
with open(filename) as fh:
data = yaml.load(fh, Loader=Loader)
for rule in data:
if rule.get("name"):
rule["name_regex"] = re.compile(rule["name"])
if rule.get("description"):
rule["desc_regex"] = re.compile(rule["description"])
return data
else:
print(f"No rules for profile '{profile_name}'. Did you run 'init'?")
sys.exit(1)
def create_tag(name, profile, session):
t = session.query(models.Tag).filter(models.Tag.name == name).first()
if not t:
t = models.Tag(name=name)
session.add(t)
session.commit()
return t