55a088eff4
New database table: maintenance_records - Fields: asset, start_date, end_date, status (open/in_progress/closed), initial_diagnosis, action_taken, action_result New routes (/maintenance/): - List with status + asset filters and pagination - POST /new — create record (editor+); auto-sets asset status to 'maintenance' - GET /<id>/edit — opens list page with modal pre-filled - POST /<id>/update — save edits; auto-clears 'maintenance' status on close - POST /<id>/delete — remove record UI: - Bootstrap modal form shared for add and edit - Clicking any table row opens the modal pre-filled with that row's data - Asset field locked in edit mode (cannot change asset) - Delete button per row (with confirmation) - Sidebar: 'Maintenance' link added under Hardware section
76 lines
2.7 KiB
Python
76 lines
2.7 KiB
Python
import os
|
|
from datetime import datetime, date
|
|
from flask import Flask
|
|
from werkzeug.middleware.proxy_fix import ProxyFix
|
|
from config import config
|
|
from app.extensions import db, migrate, login_manager
|
|
|
|
|
|
def create_app(config_name='default'):
|
|
app = Flask(__name__)
|
|
app.config.from_object(config[config_name])
|
|
|
|
# Ensure storage directories exist
|
|
for folder_key in ('UPLOAD_FOLDER', 'PDF_FOLDER', 'TEMPLATE_FOLDER', 'DOCX_FOLDER'):
|
|
folder = os.path.join(app.root_path, '..', app.config[folder_key])
|
|
os.makedirs(folder, exist_ok=True)
|
|
|
|
# Proxy and script-name middleware for umbrella nginx
|
|
app.wsgi_app = ProxyFix(app.wsgi_app, x_for=1, x_proto=1, x_host=1, x_port=1)
|
|
from app.utils.script_name_fix import ScriptNameFix
|
|
app.wsgi_app = ScriptNameFix(app.wsgi_app)
|
|
|
|
# Initialize extensions
|
|
db.init_app(app)
|
|
migrate.init_app(app, db)
|
|
login_manager.init_app(app)
|
|
|
|
# Import models so Flask-Migrate detects them
|
|
from app.models import admin_user, user, asset, assignment, paperwork, audit_log, document_template, maintenance # noqa: F401
|
|
|
|
# Register blueprints
|
|
from app.routes.auth import bp as auth_bp
|
|
from app.routes.dashboard import bp as dashboard_bp
|
|
from app.routes.users import bp as users_bp
|
|
from app.routes.assets import bp as assets_bp
|
|
from app.routes.assignments import bp as assignments_bp
|
|
from app.routes.paperwork import bp as paperwork_bp
|
|
from app.routes.audit import bp as audit_bp
|
|
from app.routes.settings import bp as settings_bp
|
|
from app.routes.doc_templates import bp as doc_templates_bp
|
|
from app.routes.internal import bp as internal_bp
|
|
from app.routes.maintenance import bp as maintenance_bp
|
|
|
|
app.register_blueprint(auth_bp)
|
|
app.register_blueprint(dashboard_bp)
|
|
app.register_blueprint(users_bp)
|
|
app.register_blueprint(assets_bp)
|
|
app.register_blueprint(assignments_bp)
|
|
app.register_blueprint(paperwork_bp)
|
|
app.register_blueprint(audit_bp)
|
|
app.register_blueprint(settings_bp)
|
|
app.register_blueprint(doc_templates_bp)
|
|
app.register_blueprint(internal_bp)
|
|
app.register_blueprint(maintenance_bp)
|
|
|
|
# Inject common template variables
|
|
from datetime import datetime, date
|
|
|
|
@app.context_processor
|
|
def inject_globals():
|
|
return {
|
|
'now': datetime.utcnow(),
|
|
'today': date.today(),
|
|
'today_date': date.today().isoformat(),
|
|
}
|
|
|
|
# Portal SSO: auto-login users arriving via the umbrella nginx gateway
|
|
from app.utils.portal_sso import init_portal_sso
|
|
init_portal_sso(app)
|
|
|
|
# Ensure DB schema exists (idempotent)
|
|
with app.app_context():
|
|
db.create_all()
|
|
|
|
return app
|