aboutsummaryrefslogtreecommitdiffstats
path: root/src/expense/app.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/expense/app.py')
-rw-r--r--src/expense/app.py54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/expense/app.py b/src/expense/app.py
new file mode 100644
index 0000000..6a7b99b
--- /dev/null
+++ b/src/expense/app.py
@@ -0,0 +1,54 @@
+"""
+The app setup.
+"""
+
+import os
+from flask import Flask
+from flask_sqlalchemy import SQLAlchemy
+from flask_login import LoginManager
+from sqlalchemy.orm import DeclarativeBase, MappedAsDataclass
+
+
+class Base(DeclarativeBase, MappedAsDataclass):
+ """SQLAlchemy Base model that is serailizeable"""
+
+ pass
+
+
+db = SQLAlchemy(model_class=Base)
+loginManager = LoginManager()
+
+
+def create_app(instance_path=None) -> Flask:
+ """Application Factory for Flask"""
+ app = Flask(__name__, instance_relative_config=True, instance_path=instance_path)
+
+ try:
+ os.makedirs(app.instance_path)
+ except OSError:
+ pass
+
+ app.config.from_pyfile("config.py")
+
+ db.init_app(app)
+ loginManager.init_app(app)
+
+ with app.app_context():
+ from . import auth
+
+ app.register_blueprint(auth.auth)
+
+ from . import tracker
+
+ app.register_blueprint(tracker.tracker)
+ app.add_url_rule("/", endpoint="index")
+
+ from . import model
+
+ db.create_all()
+
+ model.populate_table()
+
+ loginManager.login_view = "auth.login" # type: ignore
+
+ return app