summary history files

web/penny/cli/seed.py
import penny
from penny import models
from penny.models import db
from penny.extensions import user_datastore
from penny.common.init_data import import_all_types
from flask import Flask
from flask.cli import AppGroup
import random
import click
from typing import Optional
from flask_security.utils import hash_password
from sqlalchemy.exc import IntegrityError

seed_cli: AppGroup = AppGroup("seed")

@seed_cli.command("types")
def seed_types() -> None:
    """seed the db with types"""
    app: Flask = penny.create_app()
    with app.app_context():
        import_all_types()


@seed_cli.command("account")
@click.option("--email", default="test@example.org")
@click.option("--password", default="secret")
def seed_account(email: str, password: str) -> None:
    """seed the db with a test user account and resources"""
    app: Flask = penny.create_app()

    user: Optional[models.User] = None

    with app.app_context():
        import_all_types()
        user = models.db.session.query(models.User).filter_by(email=email).one_or_none()
        if user is None:
            user = user_datastore.create_user(email=email, password=hash_password(password))
            try:
                db.session.commit()
            except IntegrityError:
                db.session.rollback()
            user = models.db.session.query(models.User).filter_by(email=email).one_or_none()

    assert user is not None

    entity_type: models.EntityType = (
        models.db.session.query(models.EntityType).filter_by(name="Person").one()
    )

    entity: models.Entity = models.Entity.query.filter_by(
        name="test person entity", user_id=user.id
    ).first()
    if entity is None:
        entity = models.Entity(
            name="test person entity", entitytype_id=entity_type.id, user_id=user.id
        )
    models.db.session.add(entity)

    bankaccount_type: models.BankAccountType = (
        models.db.session.query(models.BankAccountType)
        .filter_by(name="Credit Card")
        .one()
    )

    bankaccounts: list[models.BankAccount] = [
        models.BankAccount(
            user_id=user.id,
            number="test number 1",
            bank="test bank 1",
            bankaccounttype_id=bankaccount_type.id,
            entity_id=entity.id,
            desc="test desc 1",
        )
    ]

    for i in bankaccounts:
        bankaccount: models.BankAccount = models.BankAccount.query.filter_by(
            user_id=i.user_id,
            number=i.number,
            bank=i.bank,
            bankaccounttype_id=i.bankaccounttype_id,
            entity_id=i.entity_id,
            desc=i.desc,
        ).first()
        if bankaccount is None:
            models.db.session.add(i)

    account_types: list[models.AccountType] = models.AccountType.query.filter_by(
        name="Expense"
    ).all()

    accounts: list[models.Account] = [
        models.Account(
            user_id=user.id,
            name="test name 1",
            desc="test desc 1",
            accounttype_id=random.choice(account_types).id,
            entity_id=entity.id,
        )
    ]

    for i in accounts:
        models.db.session.add(i)
        models.db.session.commit()

    transactions: list[models.Transaction] = [
        models.Transaction(
            user_id=user.id,
            debit=-100,
            credit=0,
            memo="test memo 1 MELBOURNE VIC",
            bankaccount_id=random.choice(bankaccounts).id,
            account_id=random.choice(accounts).id,
        ),
        models.Transaction(
            user_id=user.id,
            debit=-150,
            credit=0,
            memo="test memo 2",
            bankaccount_id=random.choice(bankaccounts).id,
            account_id=random.choice(accounts).id,
        ),
        models.Transaction(
            user_id=user.id,
            debit=-150,
            credit=0,
            memo="test memo 3",
            bankaccount_id=random.choice(bankaccounts).id,
            account_id=random.choice(accounts).id,
        ),
    ]

    for i in transactions:
        models.db.session.add(i)
        models.db.session.commit()

    models.db.session.commit()

    return None