#!/usr/bin/env python3 """ Time Tracker Application Entry Point """ import os import atexit from app import create_app, db from app.models import User, Project, TimeEntry, Task, Settings, Invoice, InvoiceItem, Client app = create_app() def cleanup_on_exit(): """Cleanup function called when the application exits""" try: from app.utils.license_server import stop_license_client stop_license_client() print("Phone home function stopped") except Exception as e: print(f"Error stopping phone home function: {e}") # Register cleanup function atexit.register(cleanup_on_exit) @app.shell_context_processor def make_shell_context(): """Add database models to Flask shell context""" return { 'db': db, 'User': User, 'Project': Project, 'TimeEntry': TimeEntry, 'Task': Task, 'Settings': Settings, 'Invoice': Invoice, 'InvoiceItem': InvoiceItem, 'Client': Client } @app.cli.command() def init_db(): """Initialize the database with tables and default data""" from app.models import Settings, User # Create all tables db.create_all() # Initialize settings if they don't exist if not Settings.query.first(): settings = Settings() db.session.add(settings) db.session.commit() print("Database initialized with default settings") # Create admin user if it doesn't exist admin_username = os.getenv('ADMIN_USERNAMES', 'admin').split(',')[0] if not User.query.filter_by(username=admin_username).first(): admin_user = User(username=admin_username, role='admin') db.session.add(admin_user) db.session.commit() print(f"Created admin user: {admin_username}") print("Database initialization complete!") @app.cli.command() def create_admin(): """Create an admin user""" username = input("Enter admin username: ").strip() if not username: print("Username cannot be empty") return if User.query.filter_by(username=username).first(): print(f"User {username} already exists") return user = User(username=username, role='admin') db.session.add(user) db.session.commit() print(f"Created admin user: {username}") if __name__ == '__main__': app.run(host='0.0.0.0', port=8080, debug=os.getenv('FLASK_DEBUG', 'false').lower() == 'true')