pantry-track/webserver.py
2025-08-28 17:58:05 -05:00

117 lines
4.5 KiB
Python

from flask import Flask, render_template, session, request, redirect, jsonify, send_from_directory
from flask_assets import Environment, Bundle
from authlib.integrations.flask_client import OAuth
import config, psycopg2, main
import database
from webpush import trigger_push_notifications_for_subscriptions
from application.administration import administration_api
from application.access_module import access_api
from application.site_management import site_management_api
from application.recipes import recipes_api
from application.items import items_API
from application.poe import poe_api
from application.shoppinglists import shoplist_api
from application.receipts import receipts_api
from application.meal_planner import meal_planner_api
from application.database_postgres.UsersModel import UsersModel
from application.database_postgres.SitesModel import SitesModel
from flasgger import Swagger
from outh import oauth
psycopg2.extras.register_uuid()
def create_app():
app = Flask(__name__, instance_relative_config=True)
oauth.init_app(app)
swagger = Swagger(app)
app.config.from_pyfile('application.cfg.py')
oauth.register(
name=app.config['OAUTH_NAME'],
client_id=app.config['OAUTH_CLIENT_ID'],
client_secret=app.config['OAUTH_CLIENT_SECRET'],
access_token_url=app.config['OAUTH_ACCESS_TOKEN_URL'],
authorize_url=app.config['OAUTH_AUTHORIZE_URL'],
userinfo_endpoint=app.config['OAUTH_USERINFO_ENDPOINT'],
api_base_url=app.config['OAUTH_API_BASE_URL'],
jwks_uri=app.config['OAUTH_JWKS_URI'],
client_kwargs=app.config['OAUTH_CLIENT_KWARGS'],
)
assets = Environment(app)
app.secret_key = app.config['APP_SECRET']
app.register_blueprint(access_api.access_api, url_prefix="/access")
app.register_blueprint(administration_api.admin_api, url_prefix='/administration')
app.register_blueprint(items_API.items_api, url_prefix='/items')
app.register_blueprint(poe_api.point_of_ease, url_prefix='/poe')
app.register_blueprint(site_management_api.site_management_api, url_prefix="/site-management")
app.register_blueprint(receipts_api.receipt_api, url_prefix='/receipts')
app.register_blueprint(shoplist_api.shopping_list_api, url_prefix="/shopping-lists")
app.register_blueprint(recipes_api.recipes_api, url_prefix='/recipes')
app.register_blueprint(meal_planner_api.meal_planner_api, url_prefix='/planner')
js = Bundle('js/uikit.min.js', 'js/uikit-icons.min.js', output='gen/main.js')
assets.register('js_all', js)
assets.init_app(app)
return app
app = create_app()
@app.context_processor
def inject_user():
if 'user_uuid' in session.keys() and session['user_uuid'] is not None:
user = UsersModel.select_tuple('', {'key': session['user_uuid']})
session['user'] = user
if user:
return dict(
user_uuid=session.get('user')['user_uuid'],
username=session.get('user')['user_name'],
system_admin=session.get('user')['user_is_system_admin']
)
return dict(username="")
@app.route("/changeSite", methods=["POST"])
def changeSite():
if request.method == "POST":
site = request.json['site']
session['selected_site'] = site
return jsonify({'error': False, 'message': 'Site Changed!'})
@app.route("/api/push-subscriptions", methods=["POST"])
def create_push_subscription():
json_data = request.get_json()
database_config = config.config()
with psycopg2.connect(**database_config) as conn:
with conn.cursor() as cur:
cur.execute(f"SELECT * FROM push_subscriptions WHERE subscription_json = %s;", (json_data['subscription_json'],))
rows = cur.fetchone()
if rows is None:
cur.execute(f"INSERT INTO push_subscriptions (subscription_json) VALUES (%s);", (json_data['subscription_json'],))
return jsonify({
"status": "success"
})
@app.route("/subscribe")
def subscribe():
return render_template("subscribe.html")
@app.route('/favicon.ico')
def favicon():
return send_from_directory(
app.static_folder, 'pictures/favicon.ico', mimetype='image/vnd.microsoft.icon'
)
@app.route("/")
@access_api.login_required
def home():
sites = [SitesModel.select_tuple('', {'key': site})['site_name'] for site in session['user'].get('user_sites', [])]
session['selected_site'] = sites[0]
access_api.update_session_user()
return redirect("/items")
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5811, debug=True)