Spaces:
Sleeping
ITU-T Report Generator - Web Interface Project Status
Date: 2026-05-26
Branch: feature/web-interface
Status: 95% Complete - Final Testing in Progress
π Table of Contents
- Project Overview
- What We Built
- Architecture
- File Structure
- What's Working
- Current Issue (Being Debugged)
- What Remains to Do
- How to Test
- Technical Details
- Important Notes for Developers
1. Project Overview
Goal
Create a web interface to generate ITU-T Working Party and Question reports without using the command line or manually editing JSON files.
Before
# User had to:
1. Create a JSON config file manually (vim config.json)
2. Run: python generate_wp_report.py config.json
3. Wait 5 minutes
4. Manually zip the template: zip -r report.zip wp_doc_template/
5. Upload to Overleaf
After (Goal)
1. Open http://localhost:5000 in browser
2. Fill form (30 seconds)
3. Click "Generate Report"
4. Download ZIP
5. Upload to Overleaf β Done!
2. What We Built
Complete Application Stack
β Backend (Python/Flask)
- Flask web server with 4 routes
- Input validation (server-side)
- Report generation wrapper
- Automatic file cleanup
- Error handling (404, 500)
β Frontend (HTML/CSS/JavaScript)
- Responsive form with Bootstrap 5
- AJAX submission (no page reload)
- Client-side validation
- Progress indicators
- ITU-branded design
β Documentation
- Technical README
- User guide (USAGE.md)
- Test script
- This status document
Statistics
- 14 files created (~1540 lines of code)
- Backend: ~690 lines Python
- Frontend: ~450 lines HTML/CSS/JS
- Documentation: ~250 lines
3. Architecture
3.1 High-Level Flow
User Browser
β
β Fill form β Click "Generate"
β
Flask Server (app.py)
β
βββ Validate input (validators.py)
βββ Create temp directory (file_handler.py)
βββ Generate report (report_generator.py)
β β
β βββ Call existing scripts-new/generate_wp_report.py
β β
β βββ Scrape ITU website (2-5 min)
βββ Create ZIP (file_handler.py)
βββ Return download link
β
User downloads ZIP
β
Upload to Overleaf β Compile β PDF β
3.2 Backend Architecture
# app.py (Flask Application)
@app.route('/') # Home page
@app.route('/api/generate-wp-report') # Generate WP report
@app.route('/api/generate-question-report') # Generate Question report
@app.route('/api/download/<id>') # Download ZIP
# utils/ (Backend Modules)
βββ file_handler.py
β βββ create_temp_directory() # Create unique temp folder
β βββ create_zip() # Compress template
β βββ cleanup_old_files() # Delete files > 1h
β βββ copy_template() # Copy WP/Question template
β
βββ report_generator.py
β βββ generate_wp_report() # Wrapper for WP generation
β βββ generate_question_report() # Wrapper for Question generation
β
βββ validators.py
βββ validate_wp_config() # Validate WP data
βββ validate_question_config() # Validate Question data
βββ validate_dates() # Check start < end
βββ sanitize_string() # Basic XSS protection
3.3 Frontend Architecture
// static/js/app.js
document.addEventListener('DOMContentLoaded', function() {
// 1. Toggle WP/Question fields
// 2. Form submission via AJAX (fetch API)
// 3. Show progress/success/error messages
// 4. Client-side date validation
});
3.4 Data Flow
// Frontend sends:
{
"group": 17,
"workingParty": 1,
"place": "Geneva",
"start": "2026/06/03",
"end": "2026/06/11",
"sessions": 1,
"meetingDays": ["2026/06/10"]
}
// Backend returns:
{
"success": true,
"download_id": "20260526_153045",
"filename": "wp_report_20260526_153045.zip"
}
4. File Structure
sg17collab/
βββ .gitignore # β
Created (root level)
β
βββ auto-doc-latex/
βββ scripts-new/ # Existing (unchanged)
β βββ generate_wp_report.py
β βββ generate_question_report.py
β βββ common/
β
βββ wp_doc_template/ # Existing (unchanged)
βββ question_doc_template/ # Existing (unchanged)
β
βββ web-app/ # β
NEW - All created
βββ app.py # β
Flask application (238 lines)
βββ config.py # β
Configuration (102 lines)
βββ requirements.txt # β
Dependencies
βββ README.md # β
Technical docs
βββ USAGE.md # β
User guide
βββ PROJECT_STATUS.md # β
This file
βββ test_setup.py # β
Backend test script
βββ test_config.json # β
Test data
β
βββ utils/ # β
Backend modules
β βββ __init__.py
β βββ file_handler.py # β
(85 lines)
β βββ report_generator.py # β
(95 lines)
β βββ validators.py # β
(186 lines)
β
βββ templates/ # β
HTML templates
β βββ index.html # β
Main form (165 lines)
β
βββ static/ # β
Frontend assets
β βββ css/
β β βββ style.css # β
(115 lines)
β βββ js/
β βββ app.js # β
(185 lines)
β
βββ temp/ # β
Generated files
βββ .gitkeep
βββ README.md
5. What's Working
β Fully Tested and Working
| Component | Status | Test Method |
|---|---|---|
| Flask server startup | β | python app.py β runs on port 5000 |
Route / (home page) |
β | curl http://localhost:5000/ β 200 OK |
| Static files (CSS/JS) | β | curl http://localhost:5000/static/css/style.css β 200 |
| Input validation (dates) | β | POST with start > end β 400 error returned |
| Input validation (fields) | β | POST missing fields β 400 with clear errors |
| Error handler 404 | β | GET /invalid-route β 404 JSON |
| Error handler 500 | β | Errors return JSON with success: false |
| Package imports | β | from utils import * works |
create_temp_directory() |
β | Creates unique folders with timestamp |
validate_wp_config() |
β | Detects invalid dates, missing fields |
validate_question_config() |
β | Works correctly |
sanitize_string() |
β | Removes XSS characters |
| Frontend HTML | β | Renders correctly in browser |
| Frontend CSS | β | Bootstrap + custom styles applied |
| Frontend JS loading | β | app.js loads without errors |
β οΈ Partially Tested
| Component | Status | Notes |
|---|---|---|
| Report generation (full flow) | β³ | Backend API tested via curl, frontend integration in progress |
generate_wp_report() |
β³ | Function exists, not fully tested (requires ITU connection) |
generate_question_report() |
β³ | Function exists, not fully tested |
| ZIP creation | β³ | Function exists, not fully tested |
| Download endpoint | β³ | Route exists, not fully tested |
6. Current Issue (Being Debugged)
Problem Description
User filled the form and clicked "Generate Report", but nothing happened (page refreshed instead of AJAX submission).
Root Cause Identified
User was accessing the page via VS Code Live Server (port 5500) instead of Flask (port 5000):
- Port 5500: Jinja2 templates (
{{ url_for() }}) are NOT compiled β CSS/JS fail to load β JavaScript doesn't run - Port 5000: Flask compiles templates β Everything works
Recent Fix Applied
File: static/js/app.js (line 72)
BEFORE:
const config = {
documentType: 'report', // β Backend doesn't expect this
group: parseInt(formData.get('group')),
// ...
};
AFTER:
const config = {
group: parseInt(formData.get('group')), // β
Removed documentType
// ...
};
Reason: Backend validators (validate_wp_config()) don't expect a documentType field. Including it caused validation errors.
Current Status
- User confirmed: now on correct port (5000)
- Only one error remaining:
favicon.ico 404(harmless) - Next step: User needs to test form submission again with hard refresh (Ctrl+F5)
7. What Remains to Do
7.1 Critical (Blocks Release)
Test full report generation flow
- Fill form β Submit β Wait 2-5 min β Download ZIP
- Verify ZIP contents match expected structure
- Test both WP and Question reports
Verify generated reports
- Compare output from web interface vs. command-line script
- Ensure all
.texfiles are identical - Check that manual sections placeholders are present
7.2 Important (Should Do Before Merge)
Error handling improvements
- Better error messages if ITU website is down
- Timeout handling (currently 5 min, might need adjustment)
- Network error UX (show helpful message)
User experience
- Add favicon.ico to remove 404 error
- Test on mobile/tablet (responsive design should work but not tested)
- Add "Copy download link" button
Documentation
- Add screenshots to USAGE.md
- Create video/GIF demo
- Update main README.md with web interface section
7.3 Nice to Have (Future Enhancements)
Features
- CSV work programme upload
- Progress bar (detailed steps)
- Preview of scraped data before generation
- History of generated reports (session-based)
- Direct Overleaf API integration
Technical
- Add unit tests (pytest)
- Add integration tests
- CI/CD pipeline
- Docker container
- Production WSGI server (Gunicorn)
8. How to Test
8.1 Prerequisites
# From project root
cd auto-doc-latex/web-app
# Activate venv
../../../venv/Scripts/activate # Windows
source ../../../venv/bin/activate # Linux/Mac
# Install dependencies
pip install Flask Werkzeug beautifulsoup4 lxml python-dateutil
# Note: pycurl may fail on Windows, it's only needed for backend scripts
8.2 Start the Application
python app.py
Expected output:
* Serving Flask app 'app'
* Debug mode: on
* Running on http://127.0.0.1:5000
8.3 Access the Interface
Open browser: http://localhost:5000 (or http://127.0.0.1:5000)
β οΈ IMPORTANT: Do NOT open the HTML file directly via VS Code Live Server (port 5500)!
8.4 Test Working Party Report
Fill form with:
- Report Type:
Working Party Report - Study Group:
17 - Working Party:
1 - Place:
Geneva - Start Date:
2026-06-03 - End Date:
2026-06-11 - Sessions:
1 - Meeting Days:
2026/06/10
Click "Generate Report"
Expected behavior:
- Button changes to "Generating..." with spinner
- Blue alert box: "Generating report... This may take 2-5 minutes"
- Wait (script scrapes ITU website)
- Green success box with "Download LaTeX Files (ZIP)" button
- Click download β ZIP file downloads
If error occurs:
- Red alert box appears with error message
- Check console (F12) for JavaScript errors
- Check Flask terminal for backend errors
8.5 Test Question Report
Same as above but:
- Report Type:
Question Report - Question:
10(instead of Working Party) - No Sessions or Meeting Days fields
8.6 Verify Generated Files
Unzip the downloaded file:
wp_doc_template/ (or question_doc_template/)
βββ main.tex
βββ chapters/
β βββ *.tex
β βββ results/ # β Auto-generated files should be here
β βββ 00-variables.tex
β βββ 01-introduction-content.tex
β βββ 02-executive-summary-content.tex
β βββ ...
βββ styles/
βββ images/
Check:
-
results/folder contains generated.texfiles -
00-variables.texhas correct values (place, dates, etc.) - Manual sections have
\textit{For manual entry.}placeholders - No error messages in
.texfiles
8.7 Backend Tests (Without Browser)
# Run test script
python test_setup.py
# All tests should pass (except Flask dependency if not installed)
Test API directly with curl:
# Test validation (should return error)
curl -X POST http://127.0.0.1:5000/api/generate-wp-report \
-H "Content-Type: application/json" \
-d '{"group":17,"workingParty":1,"place":"","start":"2026/06/03","end":"2026/06/11"}'
# Expected: {"success": false, "error": "Place is required"}
9. Technical Details
9.1 Routes and Endpoints
| Route | Method | Purpose | Request Body | Response |
|---|---|---|---|---|
/ |
GET | Render home page | N/A | HTML |
/api/generate-wp-report |
POST | Generate WP report | JSON config | JSON {success, download_id} |
/api/generate-question-report |
POST | Generate Question report | JSON config | JSON {success, download_id} |
/api/download/<id> |
GET | Download ZIP | N/A | File (ZIP) |
/static/<path> |
GET | Serve static files | N/A | File (CSS/JS/images) |
9.2 Configuration Values
File: config.py
# Arbitrary values (can be adjusted)
MAX_CONTENT_LENGTH = 16 MB # Max upload size
TEMP_FILE_MAX_AGE = 1 hour # Auto-cleanup age
GENERATION_TIMEOUT = 300 seconds # 5 minutes
Paths (auto-detected):
BASE_DIR # web-app/
SCRIPTS_DIR # scripts-new/
WP_TEMPLATE_DIR # wp_doc_template/
TEMP_DIR # web-app/temp/
9.3 Dependencies
Runtime (Python 3.8+):
- Flask 3.1.3
- Werkzeug 3.1.8
- beautifulsoup4 4.14.2
- lxml 6.0.2
- python-dateutil 2.9.0
Frontend:
- Bootstrap 5.3.0 (CDN)
- Vanilla JavaScript (no frameworks)
9.4 Key Design Decisions
- No database: All data is ephemeral (deleted after 1h)
- Session-only: No user accounts, no persistence
- Single-threaded: One report generation at a time (Flask dev server)
- Local-only: Binds to 127.0.0.1 (not exposed to internet)
- No authentication: Assumes trusted local environment
- Bootstrap CDN: No offline support, requires internet
- Jinja2 templates: Flask renders HTML server-side
- AJAX submission: No page reload, better UX
9.5 Security Considerations
Current protections:
- Input validation (server + client)
- Basic string sanitization (removes
< > ; & |etc.) - No file uploads (except future CSV feature)
- No database (no SQL injection risk)
- No eval() or exec() calls
Known limitations:
- No CSRF protection (not needed for local-only app)
- No rate limiting
- No authentication
- Debug mode enabled (shows stack traces)
For production deployment:
- Disable debug mode
- Add authentication
- Use WSGI server (Gunicorn)
- Add HTTPS
- Add CSRF tokens
- Implement rate limiting
10. Important Notes for Developers
10.1 Common Pitfalls
β DON'T:
- Open
templates/index.htmldirectly in browser - Use VS Code Live Server (port 5500)
- Forget to activate venv before installing dependencies
- Run
generate_wp_report.pydirectly (use wrapper inutils/) - Commit files in
temp/folder (ignored by .gitignore)
β DO:
- Always access via Flask (port 5000)
- Hard refresh (Ctrl+F5) after JS changes
- Check browser console (F12) for JS errors
- Check Flask terminal for Python errors
- Test both WP and Question reports
10.2 Debugging Tips
Frontend not working:
- Check browser console (F12) for errors
- Verify URL is
http://localhost:5000(not 5500) - Hard refresh: Ctrl+F5 (clears cache)
- Check Network tab: look for failed requests (red)
Backend errors:
- Check Flask terminal output
- Look for stack traces
- Test API with curl (isolate backend from frontend)
- Check
temp/folder for generated files
Report generation fails:
- Check internet connection (needs to reach www.itu.int)
- Verify dates are valid (start < end)
- Check Flask timeout (default 5 min)
- Look at ITU website (might be down)
10.3 File Locations Reference
# If you need to find something:
Backend logic β utils/*.py
Form HTML β templates/index.html
Form submission JS β static/js/app.js (line ~48: form.addEventListener)
Validation β utils/validators.py
Report generation β utils/report_generator.py
Flask routes β app.py (line ~32: @app.route)
Configuration β config.py
CSS styles β static/css/style.css
10.4 Git Status
Branch: feature/web-interface
Untracked files:
?? .gitignore # Root level
?? auto-doc-latex/web-app/ # Entire web-app folder
To commit:
git add .
git commit -m "feat: add web interface for ITU-T report generation
- Flask application with WP and Question report generation
- Modern frontend with Bootstrap 5
- Input validation (client and server side)
- Automatic file cleanup
- Complete documentation (README + USAGE + PROJECT_STATUS)
"
To merge (later):
git checkout main
git merge feature/web-interface
git push origin main
10.5 Next Session Checklist
When resuming work:
- Verify Flask is NOT running:
taskkill /F /IM python.exe - Activate venv
- Navigate to
auto-doc-latex/web-app - Start Flask:
python app.py - Open browser: http://localhost:5000
- Test report generation (2-5 min per test)
- Verify downloaded ZIP structure
- Upload to Overleaf and compile to PDF (final validation)
11. Questions to Resolve
Should we keep the
documentTypefield?- Currently: Removed from frontend, not used in validation
- Original scripts expect it in JSON
- Decision needed: Remove completely or add to validation?
Timeout value:
- Current: 5 minutes
- Is this enough for all report types?
- Should we make it configurable per report type?
Error messages:
- Current: Show raw Python exceptions in dev mode
- Should we sanitize error messages for users?
- Keep technical details in logs only?
CSV upload feature:
- Planned but not implemented
- Is it needed for MVP?
- How to handle large CSVs?
12. Contact & Resources
Documentation:
- Technical:
auto-doc-latex/web-app/README.md - User guide:
auto-doc-latex/web-app/USAGE.md - This document:
auto-doc-latex/web-app/PROJECT_STATUS.md
Test:
- Backend:
python test_setup.py - Frontend: Open http://localhost:5000 and test manually
Logs:
- Flask: Terminal output or
flask_test.log - Browser: F12 β Console tab
End of Document
Last Updated: 2026-05-26 22:30
Status: Ready for final testing and validation
Appendix: Quick Reference Commands
# Start application
cd auto-doc-latex/web-app
python app.py
# Test backend
python test_setup.py
# Stop Flask
# Windows: taskkill /F /IM python.exe
# Linux/Mac: pkill -f "python app.py"
# View logs
tail -f flask_test.log
# Test API
curl -X POST http://127.0.0.1:5000/api/generate-wp-report \
-H "Content-Type: application/json" \
-d '{"group":17,"workingParty":1,"place":"Geneva","start":"2026/06/03","end":"2026/06/11","sessions":1}'
# Check Flask status
curl -s http://127.0.0.1:5000/ | grep "ITU-T"