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)