budget-bear/database.py
2022-10-30 02:20:51 -07:00

69 lines
2.5 KiB
Python
Executable File

import datetime
from peewee import *
DATABASE = 'budget.db'
instance = SqliteDatabase(DATABASE, pragmas=[('foreign_keys', 'on')])
def create_tables():
"""Helper function to create database tables. Should be called manually."""
with instance:
instance.create_tables([User, TransactionCategory, Transaction, Source])
# Make my user.
instance.connect()
User.create(username='ciphercules')
instance.close()
def add_default_categories():
categories = [
{"food": ["snacks", "fast_food", "groceries", "restaurant"]},
{"clothing": []},
{"event": ["event_food", "birthday", "movie_theater"]},
{"finance": ["interest"]},
{"hobby": ["gym", "game_development", "projects", "education"]},
{"home_improvement": []},
{"pet": ["health", "dog_food"]},
{"media": ["book", "music", "television", "video_game"]},
{"health": ["medicine"]},
{"transit": ["car_insurance", "car_registration", "gas", "parking", "taxi", "car_maintenance"]},
{"utilities": ["electricity", "gas", "laundry", "cell_phone", "trash", "water"]},
{"rent": []},
]
instance.connect()
with instance.atomic():
for parent, children in categories.items():
parent_db = TransactionCategory.create(name=parent)
for child in children:
TransactionCategory.create(name=child, parent=parent_db)
class BaseModel(Model):
class Meta:
database = instance
class User(BaseModel):
username = CharField(unique=True, primary_key=True)
class TransactionCategory(BaseModel):
primary_key = AutoField(primary_key=True)
name = CharField(unique=True)
parent = ForeignKeyField('self', null=True, backref='children')
class Source(BaseModel):
filename=CharField(unique=True, primary_key=True)
type = IntegerField()
created_date = DateTimeField(default=datetime.datetime.now)
user = ForeignKeyField(User, backref='transactions')
class Transaction(BaseModel):
# Metadata
primary_key = AutoField(primary_key=True)
source = ForeignKeyField(Source, backref='transactions')
created_date = DateTimeField(default=datetime.datetime.now)
user = ForeignKeyField(User, backref='transactions')
# Real data
transaction_date = DateTimeField()
description = CharField()
amount = FloatField()
subcategory = ForeignKeyField(TransactionCategory, backref='+', null=True)