Version 7.1.4¶
Patch release: the “From Spreadsheet” project creation flow now accepts XLSX workbooks as advertised. Backend-only fix — no metamodel, generator, or public API contract changes. The frontend submodule pointer is unchanged.
Highlights¶
XLSX uploads in ``/besser_api/csv-to-domain-model`` no longer fail with “Unsupported file type ‘.xlsx’” (#501): the Project Hub “From Spreadsheet” dialog already exposed
accept=".csv,.xlsx,.xls,..."on its file input and the copy promised “Auto-generate a class diagram from CSV/XLSX files”, but the backend’s_validate_uploadwhitelisted only{".csv"}and rejected everything else with a 415.conversion_router.pynow carries anALLOWED_SPREADSHEET_EXTENSIONS = {".csv", ".xlsx"}set, validates.xlsxcontent by checking the ZIP magic bytes (PK\x03\x04), and converts each uploaded workbook’s first worksheet to a UTF-8 CSV viaopenpyxlinside the request’s temp directory before handing the resulting path list to the existingcsv_to_domain_modelreverse engineer.csv_reverse.pyitself is unchanged — the xlsx-to-csv normalization happens entirely in the endpoint.New optional backend dependency: ``openpyxl >= 3.1.0`` added to
besser/utilities/web_modeling_editor/backend/requirements.txt(not the top-levelrequirements.txt— this only matters for the editor backend). The import is lazy inside the helper, so the rest of the backend stays importable when the package is missing; if a user uploads XLSX without openpyxl installed they get a clear 500 with installation instructions instead of a traceback.Legacy ``.xls`` (BIFF) is deliberately not supported: reading
.xlswould require the deprecatedxlrdpackage (upstream dropped.xlsxsupport in 2.0 and warns against use for new work). Users who upload.xlsget the same clear 415 as before, listing.csv, .xlsxas the allowed extensions.Regression coverage in
tests/utilities/web_modeling_editor/backend/test_spreadsheet_import.py: CSV upload still succeeds, XLSX upload succeeds and produces aClassDiagram, unsupported extensions return 415 with both allowed extensions named in the error, and malformed XLSX (bad magic bytes) returns 400 before reaching openpyxl.