(Also, renamed aggregate "member" to "constituent", since "member" is rather vague.)
HN3V252LIH47SV655UM22DJUWEXVFAT265A7AGKLG6W73E3FE3ZAC
M6WGSGNMB53OI77MZKW4BRFFX3YNARSBKZI37RIOJY5FJKWIRTJAC
JJHVQGELU4HADD7VGKJMIXFK4WU6PSLPWTRQV365LO5OO7X66J6AC
ODNCGFQ5FPKFI624BVMLW7PJ2EFJOR3TY66OCZM42UNNTWBCF2TQC
PMNWRTGJ4GVSMSSAWSUD57B26PCRAHMZIQ5SIWJIK7A74ENKEQLAC
J5UVLXOK6EDIL5I7VKWH4V2QDS4DPD7FHRK6XBWSXFRQS4JKXFZQC
2GUAKGTBTNFFER343SQWSLFYIXXHJLDSGH5JHF7QMC3AVZB7Q3TQC
K22TMPH534XFKE6MWYRZSOCRWB7MCBKTMUBIBDF36FJR5DF5UE3AC
CAFO4ATEEGH75AMJ2CAE2FI6IUXAOY4TTJWIQHZFKKITUJGXXXTAC
3PNG7NIBQQURUUPRVQXYL342OT7JUUYOMY2JJNP6YDX7SYJDZMYAC
Z6MDQIGODVE7RXX5U5D64EEC2ZDEZ36Z4ZMPFYIHWBG42IXUDYFQC
<td>[% INCLUDE renderStatus build=build icon=0 %]</td>
<td>
[% INCLUDE renderStatus build=build icon=0 %]
[% IF isAggregate;
nrMembers = 0;
nrFinished = 0;
nrFailedMembers = 0;
FOREACH b IN build.members_;
nrMembers = nrMembers + 1;
IF b.finished; nrFinished = nrFinished + 1; END;
IF b.finished && b.buildstatus != 0; nrFailedMembers = nrFailedMembers + 1; END;
END;
%];
[%+ IF nrFinished == 0 && nrFailedMembers == 0 %]
all [% nrMembers %] constituent builds succeeded
[% ELSE %]
[% nrFailedMembers %] out of [% nrMembers %] constituent builds failed
[% IF nrFinished < nrMembers %]
([% nrMembers - nrFinished %] still pending)
[% END %]
[% END %]
[% END %]
</td>