From: Bill Erickson Date: Fri, 21 Sep 2012 17:58:46 +0000 (-0400) Subject: TPAC Org unit hiding X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=73be0cad84be5b1cd263b53557fdf9cae88ce161;p=evergreen%2Fequinox.git TPAC Org unit hiding Adds support for the opac.org_unit_hiding.depth org unit setting to TPAC, which makes out-of-scope org units disappear (except when explicitly requested). Ui changes: All search org unit selectors Holds pickup lib selector Copy summary in search results page Copy list in search results page Copy summary in record detail page (which controls the copy grid). Org unit hiding is based on the physical_loc (Physical Location) param / cookie, which is the closest analog to 'ol' (original location), from which it was based in the JSPAC. Signed-off-by: Bill Erickson --- diff --git a/Open-ILS/src/templates/opac/parts/misc_util.tt2 b/Open-ILS/src/templates/opac/parts/misc_util.tt2 index c188e97f57..f29ed96e4e 100644 --- a/Open-ILS/src/templates/opac/parts/misc_util.tt2 +++ b/Open-ILS/src/templates/opac/parts/misc_util.tt2 @@ -165,6 +165,8 @@ ); END; + ou_hiding_disabled = org_hiding_disabled(); + FOR volume IN xml.findnodes('//*[local-name()="volumes"]/*[local-name()="volume"]'); # Check volume visibility - could push this into XPath @@ -229,6 +231,13 @@ status = copy.findnodes('./*[local-name()="status"]'); NEXT IF status.getAttribute('opac_visible') == 'false'; + UNLESS ou_hiding_disabled; + # extract the circ_lib id from the circ_lib node + circ_lib = copy.findnodes('./*[local-name()="circ_lib"]'); + circ_lib_id = circ_lib.getAttribute('id').replace('.*/', ''); + NEXT UNLESS org_within_hiding_scope(circ_lib_id); + END; + holding = { label => vol.label, part_label => part_label, @@ -292,4 +301,81 @@ loc_name = 'locg'; loc_value = CGI.param(loc_name) || CGI.param('loc') || ctx.search_ou; END; + + # evaluates to true if test_ou is within the same depth- + # scoped tree as ctx_ou. both ou's are org unit objects. + MACRO org_within_scope(ctx_ou, test_ou, depth) BLOCK; + IF ctx_ou.id == test_ou.id; + 1; + ELSIF depth == 0; + # there's a party in my org tree and everyone's invited + 1; + ELSE; + # start at the top of the depth-scoped tree + # and search down until we find the test_ou + + IF depth; + WHILE depth < ctx_ou.ou_type.depth AND ctx_ou.id != test_ou.id; + ctx_ou = ctx.get_aou(ctx_ou.parent_ou); + END; + END; + + IF ctx_ou.id == test_ou.id; # may now be a parent org + 1; + ELSE; + + FOR child IN ctx_ou.children; + IF org_within_scope(child, test_ou); + 1; LAST; + END; + END; + END; + END; + END; + + MACRO org_within_hiding_scope(org_id) BLOCK; + # org unit hiding is based on the immutable physical_loc + # and is not meant to change as search/pref/etc libs change + + IF ctx.physical_loc; + + depth = ctx.get_org_setting(ctx.physical_loc, 'opac.org_unit_hiding.depth'); + IF depth; + + org_within_scope( + ctx.get_aou(ctx.physical_loc), + ctx.get_aou(org_id), + depth + ); + + ELSE; # depth is null or 0 + 1; + END; + ELSE; # no physical_loc means no org unit hiding + 1; + END; + END; + + # Evaluates to true if the context org (defaults to get_library) + # is not within the hiding scope. Also evaluates to true if the + # user's pref_ou is set and it's out of hiding scope. + # Always evaluates to true when ctx.is_staff + MACRO org_hiding_disabled(ctx_org) BLOCK; + IF ctx.is_staff; + 1; + ELSE; + SET ctx_org = ctx.search_ou UNLESS ctx_org; + + # beware locg values formatted as org:loc + ctx_org = ctx_org | replace(':.*', ''); + + IF !org_within_hiding_scope(ctx_org); + 1; + + ELSIF ctx.pref_ou AND ctx.pref_ou != ctx_org AND + !org_within_hiding_scope(ctx.pref_ou); + 1; + END; + END; + END; %] diff --git a/Open-ILS/src/templates/opac/parts/org_selector.tt2 b/Open-ILS/src/templates/opac/parts/org_selector.tt2 index 159af59c9a..74e848eae2 100644 --- a/Open-ILS/src/templates/opac/parts/org_selector.tt2 +++ b/Open-ILS/src/templates/opac/parts/org_selector.tt2 @@ -19,6 +19,11 @@ BLOCK build_org_selector; IF !value; value = loc_value; END; + + # if the selected org unit is out of hiding scope, + # disable the ou-hide scoping altogether. + hiding_disabled = org_hiding_disabled(value); + %]