Implement PDF export functionality for audit reports
- Added QUICK_START_PDF_EXPORT.md for user guidance on PDF export features. - Developed Web/pdf_audit_export.py for generating DIN 5008 compliant PDFs. - Enhanced Web/app.py with new routes for quick and official PDF exports. - Updated Web/templates/admin_audit.html to include new PDF export buttons. - Created verify_pdf_export_setup.py to verify installation and configuration of the PDF export system.
This commit is contained in:
@@ -0,0 +1,235 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Invario PDF Audit Export - Implementation Verification Script
|
||||
|
||||
This script verifies that all components of the PDF audit export system
|
||||
are correctly installed and configured.
|
||||
"""
|
||||
|
||||
import sys
|
||||
import os
|
||||
|
||||
def verify_files():
|
||||
"""Verify all required files exist."""
|
||||
print("=" * 60)
|
||||
print("INVARIO PDF AUDIT EXPORT - INSTALLATION VERIFICATION")
|
||||
print("=" * 60)
|
||||
print()
|
||||
|
||||
files_to_check = {
|
||||
"Core Module": [
|
||||
"Web/pdf_audit_export.py",
|
||||
],
|
||||
"Flask Integration": [
|
||||
"Web/app.py", # Should contain new routes
|
||||
"Web/templates/admin_audit.html", # Should contain new buttons
|
||||
],
|
||||
"Documentation": [
|
||||
"PDF_AUDIT_EXPORT_DOCUMENTATION.md",
|
||||
"PDF_IMPLEMENTATION_GUIDE.md",
|
||||
"QUICK_START_PDF_EXPORT.md",
|
||||
]
|
||||
}
|
||||
|
||||
base_path = os.path.dirname(os.path.abspath(__file__))
|
||||
all_ok = True
|
||||
|
||||
for category, files in files_to_check.items():
|
||||
print(f"\n[{category}]")
|
||||
for filename in files:
|
||||
filepath = os.path.join(base_path, filename)
|
||||
exists = os.path.exists(filepath)
|
||||
status = "✓" if exists else "✗"
|
||||
print(f" {status} {filename}")
|
||||
if not exists:
|
||||
all_ok = False
|
||||
|
||||
return all_ok
|
||||
|
||||
def verify_dependencies():
|
||||
"""Verify Python dependencies are installed."""
|
||||
print("\n[Python Dependencies]")
|
||||
|
||||
dependencies = [
|
||||
("reportlab", "PDF generation"),
|
||||
("qrcode", "QR code generation"),
|
||||
("pillow", "Image processing"),
|
||||
("flask", "Web framework"),
|
||||
("pymongo", "MongoDB driver"),
|
||||
]
|
||||
|
||||
all_ok = True
|
||||
for package, description in dependencies:
|
||||
try:
|
||||
__import__(package)
|
||||
print(f" ✓ {package:15} - {description}")
|
||||
except ImportError:
|
||||
print(f" ✗ {package:15} - {description}")
|
||||
all_ok = False
|
||||
|
||||
return all_ok
|
||||
|
||||
def verify_routes():
|
||||
"""Verify new routes are defined in app.py."""
|
||||
print("\n[Flask Routes]")
|
||||
|
||||
routes_to_check = [
|
||||
"/admin/audit/export/pdf/quick",
|
||||
"/admin/audit/export/pdf/official",
|
||||
]
|
||||
|
||||
app_py_path = "Web/app.py"
|
||||
if not os.path.exists(app_py_path):
|
||||
print(" ✗ app.py not found")
|
||||
return False
|
||||
|
||||
with open(app_py_path, 'r') as f:
|
||||
app_content = f.read()
|
||||
|
||||
all_ok = True
|
||||
for route in routes_to_check:
|
||||
if route in app_content:
|
||||
print(f" ✓ {route}")
|
||||
else:
|
||||
print(f" ✗ {route}")
|
||||
all_ok = False
|
||||
|
||||
return all_ok
|
||||
|
||||
def verify_template():
|
||||
"""Verify template updates are in place."""
|
||||
print("\n[HTML Template Updates]")
|
||||
|
||||
template_path = "Web/templates/admin_audit.html"
|
||||
if not os.path.exists(template_path):
|
||||
print(" ✗ admin_audit.html not found")
|
||||
return False
|
||||
|
||||
with open(template_path, 'r') as f:
|
||||
template_content = f.read()
|
||||
|
||||
checks = {
|
||||
"DIN 5008 Info Box": "DIN 5008",
|
||||
"PDF Quick-Check Button": "admin_audit_export_pdf_quick",
|
||||
"PDF Official Button": "admin_audit_export_pdf_official",
|
||||
}
|
||||
|
||||
all_ok = True
|
||||
for check_name, check_string in checks.items():
|
||||
if check_string in template_content:
|
||||
print(f" ✓ {check_name}")
|
||||
else:
|
||||
print(f" ✗ {check_name}")
|
||||
all_ok = False
|
||||
|
||||
return all_ok
|
||||
|
||||
def get_statistics():
|
||||
"""Get implementation statistics."""
|
||||
print("\n[Implementation Statistics]")
|
||||
|
||||
stats = {
|
||||
"Web/pdf_audit_export.py": "PDF Export Module",
|
||||
"PDF_AUDIT_EXPORT_DOCUMENTATION.md": "Technical Documentation",
|
||||
"PDF_IMPLEMENTATION_GUIDE.md": "Implementation Guide",
|
||||
"QUICK_START_PDF_EXPORT.md": "Quick Start Guide",
|
||||
}
|
||||
|
||||
total_lines = 0
|
||||
for filename, description in stats.items():
|
||||
if os.path.exists(filename):
|
||||
with open(filename, 'r') as f:
|
||||
lines = len(f.readlines())
|
||||
print(f" {filename:45} {lines:5} lines - {description}")
|
||||
total_lines += lines
|
||||
|
||||
print(f"\n Total documentation: {total_lines} lines")
|
||||
|
||||
def print_next_steps():
|
||||
"""Print next steps for the user."""
|
||||
print("\n" + "=" * 60)
|
||||
print("NEXT STEPS")
|
||||
print("=" * 60)
|
||||
print("""
|
||||
1. CONFIGURE SCHOOL INFO (Optional)
|
||||
Edit config.json and add:
|
||||
{
|
||||
"school": {
|
||||
"name": "Your School Name",
|
||||
"address": "School Address",
|
||||
"postal_code": "12345",
|
||||
"city": "City Name",
|
||||
"school_number": "123456",
|
||||
"it_admin": "Admin Name"
|
||||
}
|
||||
}
|
||||
|
||||
2. RESTART THE SYSTEM
|
||||
./start.sh
|
||||
or: python Web/app.py
|
||||
|
||||
3. TEST PDF EXPORTS
|
||||
- Login to http://localhost:8000/admin/audit
|
||||
- Click "🚀 Schnell-Check" for compact PDF
|
||||
- Click "📋 Amtlicher Bericht" for full DIN 5008 report
|
||||
|
||||
4. VERIFY COMPLIANCE
|
||||
- Check PDF opens in your PDF reader
|
||||
- Verify school info is correct
|
||||
- Test signature fields
|
||||
- Verify barrierefreiheit (accessibility)
|
||||
|
||||
5. DEPLOY TO PRODUCTION
|
||||
- Update your deployment scripts
|
||||
- Document new export procedures
|
||||
- Train staff on Quick-Check vs Official Report
|
||||
""")
|
||||
|
||||
def main():
|
||||
"""Run all verifications."""
|
||||
print()
|
||||
|
||||
checks = [
|
||||
("File Structure", verify_files),
|
||||
("Dependencies", verify_dependencies),
|
||||
("Flask Routes", verify_routes),
|
||||
("HTML Template", verify_template),
|
||||
]
|
||||
|
||||
all_passed = True
|
||||
for name, check_func in checks:
|
||||
try:
|
||||
passed = check_func()
|
||||
if not passed:
|
||||
all_passed = False
|
||||
except Exception as e:
|
||||
print(f"\n✗ Error during {name} check: {e}")
|
||||
all_passed = False
|
||||
|
||||
# Get statistics
|
||||
get_statistics()
|
||||
|
||||
# Print results
|
||||
print("\n" + "=" * 60)
|
||||
if all_passed:
|
||||
print("✓ ALL VERIFICATION CHECKS PASSED!")
|
||||
print("=" * 60)
|
||||
print_next_steps()
|
||||
else:
|
||||
print("✗ SOME VERIFICATION CHECKS FAILED")
|
||||
print("=" * 60)
|
||||
print("\nPlease check the errors above and verify:")
|
||||
print("1. All files are in the correct locations")
|
||||
print("2. All dependencies are installed")
|
||||
print("3. app.py and admin_audit.html have been updated")
|
||||
sys.exit(1)
|
||||
|
||||
print("\n" + "=" * 60)
|
||||
print("For detailed documentation, see:")
|
||||
print(" - QUICK_START_PDF_EXPORT.md (Start here!)")
|
||||
print(" - PDF_IMPLEMENTATION_GUIDE.md (Technical details)")
|
||||
print(" - PDF_AUDIT_EXPORT_DOCUMENTATION.md (Requirements)")
|
||||
print("=" * 60 + "\n")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user