- Created app/ package with 6 modules: - __init__.py: Application factory (create_app function) - routes.py: All route handlers (473 lines) - models.py: Data persistence layer (41 lines) - validators.py: Input validation functions (48 lines) - email_service.py: Email sending functions (85 lines) - utils.py: Utility functions (30 lines) - Implemented Flask application factory pattern - Created run.py as minimal entry point - Updated all test imports to use new module structure - Fixed template/static folder paths for package structure - All 102 tests passing - Improved maintainability with clear separation of concerns - Follows Flask best practices for scalable applications
31 lines
935 B
Python
31 lines
935 B
Python
"""
|
|
Utility functions for the Flask job application system.
|
|
"""
|
|
from datetime import datetime
|
|
from flask import session, current_app
|
|
|
|
|
|
def check_rate_limit():
|
|
"""
|
|
Check if user is submitting forms too quickly.
|
|
Returns (allowed: bool, wait_seconds: int)
|
|
"""
|
|
now = datetime.now()
|
|
last_submit_str = session.get('last_submission_time')
|
|
|
|
if last_submit_str:
|
|
try:
|
|
last_submit = datetime.fromisoformat(last_submit_str)
|
|
elapsed = (now - last_submit).total_seconds()
|
|
|
|
if elapsed < current_app.config['RATE_LIMIT_SECONDS']:
|
|
wait_seconds = int(current_app.config['RATE_LIMIT_SECONDS'] - elapsed) + 1
|
|
return False, wait_seconds
|
|
except (ValueError, TypeError):
|
|
# Invalid timestamp, allow submission
|
|
pass
|
|
|
|
# Update last submission time
|
|
session['last_submission_time'] = now.isoformat()
|
|
return True, 0
|