Hide fieldsets without visible fields, and support dynamic fieldsets.

Review Request #12291 — Created May 20, 2022 and submitted — Latest diff uploaded


Review Board


Registered fieldsets with registered fields were always being shown,
even if none of the fields inside were visible. This was because we only
determined visibility based on registered classes, and didn't even
instantiate fields until we had begun rendering the fieldset template.

This was prominent when installing Power Pack 5, which registers a
fieldset for SOS. This is shown but empty on any review request not
backed by SOS.

This change moves field construction out of the template rendering and
into the fieldset itself. A new build_fields() method is responsible
for instantiating all the fields, and a fields property returns a
cached view of that. This is combined with a new should_render
property, which considers visibility of the contained fields.

That simplifies templates and fixes visibility, but it also opens the
door to dynamic fields/fieldsets. A long-term project we've had is a
field editor for Power Pack, and that requires a way to dynamically
create new fieldsets and fields without first registering them globally.
This change enables the dynamic fields part, leaving only dynamic
fieldset generation remaining.

There are also some documentation fixes and a few fixes for state
assumptions noticed during testing.

Verified that the SOS fieldset wasn't being shown outside of SOS-based
review requests.

Added new unit tests, which all pass.

Tested all the current fields we show on review requests.