69 lines
2.5 KiB
Python
Executable File
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) |