Version 7.1.6

Minor release: identifier story overhaul + more permissive PlantUML importer. Closes #230, #225, #108, #236 and completes the is_id work from #478 / #486. Frontend submodule advances twice to expose the two new attribute checkboxes.

Highlights

  • New ``Property.is_external_id`` (closes #230, #225, #108): B-UML now distinguishes the internal surrogate PK (is_id) from user-facing identifiers (is_external_id). Composite keys supported. Flag round-trips through metamodel, JSON converters, and code builder. SQLAlchemy emits unique=True on non-PK external ids (subsumes #108’s UNIQUE ask). Django emits unique=True and — crucially for #225 — uses external ids in __str__ so ForeignKey dropdowns show isbn / first_name - last_name instead of the PK.

  • ``is_id`` propagation completed (#478): PR #486 landed the metamodel + converters but deferred the builder, generators, and editor. Finished here: domain_model_to_code emits is_id=True, Django template emits primary_key=True, editor gains an ID checkbox (SQLAlchemy already worked).

  • PlantUML importer permissiveness (closes #236): grammar now accepts single-dash - associations, integer / boolean type aliases, and trailing < / > direction hints on labels. Lexer/parser regenerated with ANTLR 4.13.2.

  • Django template whitespace fix: pre-existing bug where the attribute for-loop stripped every newline — rendered models.py was invalid Python. Regression test compiles the output.

  • Editor UI (submodule c4252a6 → b5102c0): two new attribute-popup checkboxes (ID, External ID), {id} / {external id} markers in the display name, plus c50f6dc (attribute/method reorder — piggybacked on develop).

Testing

11 new tests: metamodel setter validation, JSON↔BUML round-trip, code-builder exec round-trip, SQLAlchemy schema introspection + real IntegrityError on duplicate external-id, Django field emission + __str__ variants + compile() sanity, and 5 PlantUML grammar regressions. Full suite: 692 passed, 5 skipped, 3 xfailed.