[open-ils-commits] [GIT] Evergreen ILS branch master updated. 4acbcfc9e799eeb6a342a26cb6eac8932b57bf75

Evergreen Git git at git.evergreen-ils.org
Mon Jul 30 16:25:11 EDT 2012


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Evergreen ILS".

The branch, master has been updated
       via  4acbcfc9e799eeb6a342a26cb6eac8932b57bf75 (commit)
       via  ea72a97aaa3cfd6bfb3d41c53dae665756f56507 (commit)
      from  dbc5fe423f30eb2a826ce57ded79d70c8da8c2e1 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 4acbcfc9e799eeb6a342a26cb6eac8932b57bf75
Author: Dan Scott <dscott at laurentian.ca>
Date:   Mon Jul 30 16:24:45 2012 -0400

    Wrap upgrade script for TPAC advanced search VR formats
    
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/src/sql/Pg/002.schema.config.sql b/Open-ILS/src/sql/Pg/002.schema.config.sql
index ec191cb..420b915 100644
--- a/Open-ILS/src/sql/Pg/002.schema.config.sql
+++ b/Open-ILS/src/sql/Pg/002.schema.config.sql
@@ -87,7 +87,7 @@ CREATE TRIGGER no_overlapping_deps
     BEFORE INSERT OR UPDATE ON config.db_patch_dependencies
     FOR EACH ROW EXECUTE PROCEDURE evergreen.array_overlap_check ('deprecates');
 
-INSERT INTO config.upgrade_log (version, applied_to) VALUES ('0728', :eg_version); -- berick/miker
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('0729', :eg_version); -- tsbere/denials
 
 CREATE TABLE config.bib_source (
 	id		SERIAL	PRIMARY KEY,
diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.vr_format_value_maps.sql b/Open-ILS/src/sql/Pg/upgrade/0729.vr_format_value_maps.sql
similarity index 95%
rename from Open-ILS/src/sql/Pg/upgrade/XXXX.vr_format_value_maps.sql
rename to Open-ILS/src/sql/Pg/upgrade/0729.vr_format_value_maps.sql
index 21d9d24..7d5ceb4 100644
--- a/Open-ILS/src/sql/Pg/upgrade/XXXX.vr_format_value_maps.sql
+++ b/Open-ILS/src/sql/Pg/upgrade/0729.vr_format_value_maps.sql
@@ -1,3 +1,10 @@
+-- Evergreen DB patch 0729.vr_format_value_maps.sql
+--
+BEGIN;
+
+-- check whether patch can be applied
+SELECT evergreen.upgrade_deps_block_check('0729', :eg_version);
+
 CREATE OR REPLACE FUNCTION config.update_coded_value_map(in_ctype TEXT, in_code TEXT, in_value TEXT, in_description TEXT DEFAULT NULL, in_opac_visible BOOL DEFAULT NULL, in_search_label TEXT DEFAULT NULL, in_is_simple BOOL DEFAULT NULL, add_only BOOL DEFAULT FALSE) RETURNS VOID AS $f$
 DECLARE
     current_row config.coded_value_map%ROWTYPE;
@@ -47,3 +54,6 @@ SELECT config.update_coded_value_map('vr_format', 'u', 'Unknown', add_only := TR
 SELECT config.update_coded_value_map('vr_format', 'v', 'DVD', add_only := TRUE);
 SELECT config.update_coded_value_map('vr_format', 'z', 'Other', add_only := TRUE);
 SELECT config.update_coded_value_map('vr_format', ' ', 'Unspecified', add_only := TRUE);
+
+
+COMMIT;

commit ea72a97aaa3cfd6bfb3d41c53dae665756f56507
Author: Thomas Berezansky <tsbere at mvlc.org>
Date:   Fri Apr 13 17:24:43 2012 -0400

    TPac: Advanced Search Config
    
    Move advanced search limiter config to config.tt2.
    
    This should, in theory, make it much easier to customize the fields shown
    for searching in TPac.
    
    Also adds the VR Format Coded Value Maps so that we can populate that
    limiter with them.
    
    And removes dojo.css from being loaded - That includes reset stuff that
    messes with our CSS but doesn't seem to give us any benefit.
    
    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>
    Signed-off-by: Dan Scott <dscott at laurentian.ca>

diff --git a/Open-ILS/src/sql/Pg/002.schema.config.sql b/Open-ILS/src/sql/Pg/002.schema.config.sql
index c3b6197..ec191cb 100644
--- a/Open-ILS/src/sql/Pg/002.schema.config.sql
+++ b/Open-ILS/src/sql/Pg/002.schema.config.sql
@@ -755,6 +755,35 @@ CREATE VIEW config.lit_form_map AS SELECT code, value, description FROM config.c
 CREATE VIEW config.audience_map AS SELECT code, value, description FROM config.coded_value_map WHERE ctype = 'audience';
 CREATE VIEW config.videorecording_format_map AS SELECT code, value FROM config.coded_value_map WHERE ctype = 'vr_format';
 
+CREATE OR REPLACE FUNCTION config.update_coded_value_map(in_ctype TEXT, in_code TEXT, in_value TEXT, in_description TEXT DEFAULT NULL, in_opac_visible BOOL DEFAULT NULL, in_search_label TEXT DEFAULT NULL, in_is_simple BOOL DEFAULT NULL, add_only BOOL DEFAULT FALSE) RETURNS VOID AS $f$
+DECLARE
+    current_row config.coded_value_map%ROWTYPE;
+BEGIN
+    -- Look for a current value
+    SELECT INTO current_row * FROM config.coded_value_map WHERE ctype = in_ctype AND code = in_code;
+    -- If we have one..
+    IF FOUND THEN
+        -- Update anything we were handed
+        current_row.value := COALESCE(current_row.value, in_value);
+        current_row.description := COALESCE(current_row.description, in_description);
+        current_row.opac_visible := COALESCE(current_row.opac_visible, in_opac_visible);
+        current_row.search_label := COALESCE(current_row.search_label, in_search_label);
+        current_row.is_simple := COALESCE(current_row.is_simple, in_is_simple);
+        UPDATE config.coded_value_map
+            SET
+                value = current_row.value,
+                description = current_row.description,
+                opac_visible = current_row.opac_visible,
+                search_label = current_row.search_label,
+                is_simple = current_row.is_simple
+            WHERE id = current_row.id;
+    ELSIF NOT add_only THEN
+        INSERT INTO config.coded_value_map(ctype, code, value, description, opac_visible, search_label, is_simple) VALUES
+            (in_ctype, in_code, in_value, in_description, COALESCE(in_opac_visible, TRUE), in_search_label, COALESCE(in_is_simple, FALSE));
+    END IF;
+END;
+$f$ LANGUAGE PLPGSQL;
+
 CREATE OR REPLACE FUNCTION oils_tsearch2 () RETURNS TRIGGER AS $$
 DECLARE
     normalizer      RECORD;
diff --git a/Open-ILS/src/sql/Pg/950.data.seed-values.sql b/Open-ILS/src/sql/Pg/950.data.seed-values.sql
index f415b40..ed53b9b 100644
--- a/Open-ILS/src/sql/Pg/950.data.seed-values.sql
+++ b/Open-ILS/src/sql/Pg/950.data.seed-values.sql
@@ -6352,6 +6352,28 @@ INSERT INTO config.coded_value_map (id, ctype, code, value) VALUES
     (535, 'bib_level', 'm', oils_i18n_gettext('535', 'Monograph/Item', 'ccvm', 'value')),
     (536, 'bib_level', 's', oils_i18n_gettext('536', 'Serial', 'ccvm', 'value'));
 
+INSERT INTO config.coded_value_map(id, ctype, code, value) VALUES
+    (537, 'vr_format', 'a', oils_i18n_gettext('537', 'Beta', 'ccvm', 'value')),
+    (538, 'vr_format', 'b', oils_i18n_gettext('538', 'VHS', 'ccvm', 'value')),
+    (539, 'vr_format', 'c', oils_i18n_gettext('539', 'U-matic', 'ccvm', 'value')),
+    (540, 'vr_format', 'd', oils_i18n_gettext('540', 'EIAJ', 'ccvm', 'value')),
+    (541, 'vr_format', 'e', oils_i18n_gettext('541', 'Type C', 'ccvm', 'value')),
+    (542, 'vr_format', 'f', oils_i18n_gettext('542', 'Quadruplex', 'ccvm', 'value')),
+    (543, 'vr_format', 'g', oils_i18n_gettext('543', 'Laserdisc', 'ccvm', 'value')),
+    (544, 'vr_format', 'h', oils_i18n_gettext('544', 'CED videodisc', 'ccvm', 'value')),
+    (545, 'vr_format', 'i', oils_i18n_gettext('545', 'Betacam', 'ccvm', 'value')),
+    (546, 'vr_format', 'j', oils_i18n_gettext('546', 'Betacam SP', 'ccvm', 'value')),
+    (547, 'vr_format', 'k', oils_i18n_gettext('547', 'Super-VHS', 'ccvm', 'value')),
+    (548, 'vr_format', 'm', oils_i18n_gettext('548', 'M-II', 'ccvm', 'value')),
+    (549, 'vr_format', 'o', oils_i18n_gettext('549', 'D-2', 'ccvm', 'value')),
+    (550, 'vr_format', 'p', oils_i18n_gettext('550', '8 mm.', 'ccvm', 'value')),
+    (551, 'vr_format', 'q', oils_i18n_gettext('551', 'Hi-8 mm.', 'ccvm', 'value')),
+    (552, 'vr_format', 's', oils_i18n_gettext('552', 'Blu-ray disc', 'ccvm', 'value')),
+    (553, 'vr_format', 'u', oils_i18n_gettext('553', 'Unknown', 'ccvm', 'value')),
+    (554, 'vr_format', 'v', oils_i18n_gettext('554', 'DVD', 'ccvm', 'value')),
+    (555, 'vr_format', 'z', oils_i18n_gettext('555', 'Other', 'ccvm', 'value')),
+    (556, 'vr_format', ' ', oils_i18n_gettext('556', 'Unspecified', 'ccvm', 'value'));
+
 SELECT SETVAL('config.coded_value_map_id_seq'::TEXT, (SELECT max(id) FROM config.coded_value_map));
 
 -- Trigger Event Definitions -------------------------------------------------
diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.vr_format_value_maps.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.vr_format_value_maps.sql
new file mode 100644
index 0000000..21d9d24
--- /dev/null
+++ b/Open-ILS/src/sql/Pg/upgrade/XXXX.vr_format_value_maps.sql
@@ -0,0 +1,49 @@
+CREATE OR REPLACE FUNCTION config.update_coded_value_map(in_ctype TEXT, in_code TEXT, in_value TEXT, in_description TEXT DEFAULT NULL, in_opac_visible BOOL DEFAULT NULL, in_search_label TEXT DEFAULT NULL, in_is_simple BOOL DEFAULT NULL, add_only BOOL DEFAULT FALSE) RETURNS VOID AS $f$
+DECLARE
+    current_row config.coded_value_map%ROWTYPE;
+BEGIN
+    -- Look for a current value
+    SELECT INTO current_row * FROM config.coded_value_map WHERE ctype = in_ctype AND code = in_code;
+    -- If we have one..
+    IF FOUND AND NOT add_only THEN
+        -- Update anything we were handed
+        current_row.value := COALESCE(current_row.value, in_value);
+        current_row.description := COALESCE(current_row.description, in_description);
+        current_row.opac_visible := COALESCE(current_row.opac_visible, in_opac_visible);
+        current_row.search_label := COALESCE(current_row.search_label, in_search_label);
+        current_row.is_simple := COALESCE(current_row.is_simple, in_is_simple);
+        UPDATE config.coded_value_map
+            SET
+                value = current_row.value,
+                description = current_row.description,
+                opac_visible = current_row.opac_visible,
+                search_label = current_row.search_label,
+                is_simple = current_row.is_simple
+            WHERE id = current_row.id;
+    ELSE
+        INSERT INTO config.coded_value_map(ctype, code, value, description, opac_visible, search_label, is_simple) VALUES
+            (in_ctype, in_code, in_value, in_description, COALESCE(in_opac_visible, TRUE), in_search_label, COALESCE(in_is_simple, FALSE));
+    END IF;
+END;
+$f$ LANGUAGE PLPGSQL;
+
+SELECT config.update_coded_value_map('vr_format', 'a', 'Beta', add_only := TRUE);
+SELECT config.update_coded_value_map('vr_format', 'b', 'VHS', add_only := TRUE);
+SELECT config.update_coded_value_map('vr_format', 'c', 'U-matic', add_only := TRUE);
+SELECT config.update_coded_value_map('vr_format', 'd', 'EIAJ', add_only := TRUE);
+SELECT config.update_coded_value_map('vr_format', 'e', 'Type C', add_only := TRUE);
+SELECT config.update_coded_value_map('vr_format', 'f', 'Quadruplex', add_only := TRUE);
+SELECT config.update_coded_value_map('vr_format', 'g', 'Laserdisc', add_only := TRUE);
+SELECT config.update_coded_value_map('vr_format', 'h', 'CED videodisc', add_only := TRUE);
+SELECT config.update_coded_value_map('vr_format', 'i', 'Betacam', add_only := TRUE);
+SELECT config.update_coded_value_map('vr_format', 'j', 'Betacam SP', add_only := TRUE);
+SELECT config.update_coded_value_map('vr_format', 'k', 'Super-VHS', add_only := TRUE);
+SELECT config.update_coded_value_map('vr_format', 'm', 'M-II', add_only := TRUE);
+SELECT config.update_coded_value_map('vr_format', 'o', 'D-2', add_only := TRUE);
+SELECT config.update_coded_value_map('vr_format', 'p', '8 mm.', add_only := TRUE);
+SELECT config.update_coded_value_map('vr_format', 'q', 'Hi-8 mm.', add_only := TRUE);
+SELECT config.update_coded_value_map('vr_format', 's', 'Blu-ray disc', add_only := TRUE);
+SELECT config.update_coded_value_map('vr_format', 'u', 'Unknown', add_only := TRUE);
+SELECT config.update_coded_value_map('vr_format', 'v', 'DVD', add_only := TRUE);
+SELECT config.update_coded_value_map('vr_format', 'z', 'Other', add_only := TRUE);
+SELECT config.update_coded_value_map('vr_format', ' ', 'Unspecified', add_only := TRUE);
diff --git a/Open-ILS/src/templates/opac/parts/advanced/global_row.tt2 b/Open-ILS/src/templates/opac/parts/advanced/global_row.tt2
index 5171c35..3647fe7 100644
--- a/Open-ILS/src/templates/opac/parts/advanced/global_row.tt2
+++ b/Open-ILS/src/templates/opac/parts/advanced/global_row.tt2
@@ -14,7 +14,7 @@
     # scalar.merge treats the scalar as a 1-item array
     WHILE queries.size < rowcount; queries = queries.merge(['']); END;
     WHILE bools.size < rowcount; bools = bools.merge(['and']); END;
-    WHILE qtypes.size < rowcount; qtypes = qtypes.merge(['keyword']); END;
+    WHILE qtypes.size < rowcount; qtypes = qtypes.merge(search.default_qtypes.${qtypes.size} ? [search.default_qtypes.${qtypes.size}] : ['keyword']); END;
 
     FOR qtype IN qtypes;
         c = contains.shift;
diff --git a/Open-ILS/src/templates/opac/parts/advanced/search.tt2 b/Open-ILS/src/templates/opac/parts/advanced/search.tt2
index 697f951..ecc40fb 100644
--- a/Open-ILS/src/templates/opac/parts/advanced/search.tt2
+++ b/Open-ILS/src/templates/opac/parts/advanced/search.tt2
@@ -28,46 +28,24 @@
     <tr>
         <td align='top'>
           <div style="width:100%;" class="header_middle">[% l('Search Filters') %]</div>
-          <table cellpadding='10' cellspacing='0' border='0'><tr>
+          <table cellpadding='10' cellspacing='0' border='0'>
+[%
+    in_row = 0;
+    FOR adv_chunk IN search.adv_config;
+        NEXT IF adv_chunk.adv_hide;
+        IF in_row == 0;
+            in_row = 1; %]
+            <tr>
+[%
+        END; %]
             <td valign='top'>
-                <strong>[% l("Item Type") %]</strong><br />
-                [%  INCLUDE "opac/parts/coded_value_selector.tt2"
-                        attr=["mattype", "item_type"] multiple="multiple" size="4" %]
-            </td>
-            <td valign='top'>
-                <strong>[% l("Language") %]</strong><br />
-                [%  INCLUDE "opac/parts/coded_value_selector.tt2"
-                        attr="item_lang" multiple="multiple" size="4" %]
-            </td>
-            <td valign='top'>
-                <strong>[% l("Audience") %]</strong><br />
-                    [% INCLUDE "opac/parts/coded_value_selector.tt2"
-                        attr=["audience_group", "audience"] multiple="multiple" size="4" %]
-                </select>
-            </td>
-            <td valign='top'>
-            <strong>[% l("Sort Results") %]</strong>
-              <table class='adv_global_filter_sort'>
-                <tr>
-                    <td align='center' width='100%'>
-                        [% INCLUDE "opac/parts/filtersort.tt2"
-                            value=CGI.param('sort') class='results_header_sel' %]
-                    </td>
-                </tr>
-              </table>
-            </td>
-          </tr></table>
-        </td>
-    </tr>
-    <tr>
-        <td colspan="2">
-            <table cellpadding='10' cellspacing='0' border='0'>
-                <tbody>
-                    <tr>
-                        <td valign='top'>
-                            <strong>[% l("Search Library") %]</strong><br />
-                            [% PROCESS "opac/parts/org_selector.tt2";
-                                INCLUDE build_org_selector show_loc_groups=1 %]
+                <strong>[% adv_chunk.adv_label %]</strong><br />
+[%
+        IF adv_chunk.adv_special;
+            SWITCH adv_chunk.adv_special;
+                CASE "lib_selector";
+                    PROCESS "opac/parts/org_selector.tt2";
+                        INCLUDE build_org_selector show_loc_groups=1; %]
                             <div style="position:relative;top:7px;">
                                 <input type='checkbox' name="modifier"
                                     value="available"[% CGI.param('modifier').grep('available').size ? ' checked="checked"' : '' %]
@@ -76,9 +54,8 @@
                                     for='opac.result.limit2avail'>
                                     [% l("Limit to Available") %]</label>
                             </div>
-                        </td>
-                        <td valign='top'>
-                            <strong>[% l("Publication Year") %]</strong><br />
+[%
+                CASE "pub_year"; %]
                             <select name='pubdate' onchange='
                                 if(this.selectedIndex == 3)
                                     unHideMe($("adv_global_pub_date_2_span"));
@@ -98,18 +75,23 @@
                                    [% l("and") %] <input name='date2' type='text' size='4' maxlength='4' value="[% CGI.param('date2') | html %]" />
                                 </span>
                             </div>
-                        </td>
-                    </tr>
-                    <!-- TODO: Copy Location Filter -->
-                    <tr class='hide_me'>
-                        <td align='right'>[% l("Shelving Location") %]</td>
-                        <td align='left'>
-                            <select size='3' multiple='multiple'>
-                                [%# TODO: add filter options... %]
-                            </select>
-                        </td>
-                    </tr>
-                </tbody>
+[%
+                CASE "sort_selector";
+                    INCLUDE "opac/parts/filtersort.tt2"
+                        value=CGI.param('sort') class='results_header_sel';
+            END;
+        ELSIF adv_chunk.adv_attr;
+            INCLUDE "opac/parts/coded_value_selector.tt2"
+                attr=adv_chunk.adv_attr multiple="multiple" size="4";
+        END; %]
+            </td>
+[%
+        IF adv_chunk.adv_break;
+            in_row = 0; %]
+            </tr>
+[%
+        END;
+    END; %]
             </table>
         </td>
     </tr>
diff --git a/Open-ILS/src/templates/opac/parts/base.tt2 b/Open-ILS/src/templates/opac/parts/base.tt2
index fc73804..c7175b6 100644
--- a/Open-ILS/src/templates/opac/parts/base.tt2
+++ b/Open-ILS/src/templates/opac/parts/base.tt2
@@ -13,7 +13,6 @@
         <link rel="unapi-server" type="application/xml" title="unAPI" href="/opac/extras/unapi" />
         [% IF want_dojo %]
         <style type="text/css">
-            @import "[% ctx.media_prefix %]/js/dojo/dojo/resources/dojo.css";
             @import "[% ctx.media_prefix %]/js/dojo/dijit/themes/tundra/tundra.css";
         </style>
         [% END %]
diff --git a/Open-ILS/src/templates/opac/parts/config.tt2 b/Open-ILS/src/templates/opac/parts/config.tt2
index 9d802e3..813280a 100644
--- a/Open-ILS/src/templates/opac/parts/config.tt2
+++ b/Open-ILS/src/templates/opac/parts/config.tt2
@@ -69,4 +69,37 @@ facet.display = [
     {facet_class => 'subject', facet_order => ['name', 'geographic']}
 ];
 
+##############################################################################
+# Define the advanced search limiters and labels.
+# adv_label is the (translated) label for the limiter
+# adv_attr is an array of possible limiters, the first one that has any
+#   values will be used
+# adv_break will end the current row. If specified with a label/attr it
+#   will do so *after* that limiter.
+# adv_special will drop in a special entry:
+#   lib_selector will put the search library box (with limit to available)
+#   pub_year will put the publication year box
+#   sort_selector will put the sort results selector
+
+search.adv_config = [
+    {adv_label => l("Item Type"), adv_attr => ["mattype", "item_type"]},
+    {adv_label => l("Item Form"), adv_attr => "item_form"},
+    {adv_label => l("Language"),  adv_attr => "item_lang"},
+    {adv_label => l("Audience"),  adv_attr => ["audience_group", "audience"], adv_break => 1},
+    {adv_label => l("Video Format"), adv_attr => "vr_format"},
+    {adv_label => l("Bib Level"), adv_attr => "bib_level"},
+    {adv_label => l("Literary Form"), adv_attr => "lit_form", adv_break => 1},
+    {adv_label => l("Search Library"), adv_special => "lib_selector"},
+    {adv_label => l("Publication Year"), adv_special => "pub_year"},
+    {adv_label => l("Sort Results"), adv_special => "sort_selector"},
+];
+
+##############################################################################
+# For each search box the default "query type" value can be specified here
+# This is the actual backend value, not the label
+# Also note that including more than the row count entries won't add rows
+# The first entry should be used as a default for "basic" search as well
+
+search.default_qtypes = ['keyword','title','author'];
+
 %]
diff --git a/Open-ILS/src/templates/opac/parts/qtype_selector.tt2 b/Open-ILS/src/templates/opac/parts/qtype_selector.tt2
index 278111b..a56bfe3 100644
--- a/Open-ILS/src/templates/opac/parts/qtype_selector.tt2
+++ b/Open-ILS/src/templates/opac/parts/qtype_selector.tt2
@@ -8,7 +8,7 @@
     {value => "id|bibcn", label => l("Bib Call Number")}
 ] %]
 <select name="qtype"[% IF id; ' id="'; id ; '"' ; END %]>
-    [%  query_type = query_type || CGI.param('qtype');
+    [%  query_type = query_type || CGI.param('qtype') || search.default_qtypes.0;
         FOR qt IN query_types -%]
     <option value='[% qt.value | html %]'[%
         query_type == qt.value ? ' selected="selected"' : ''

-----------------------------------------------------------------------

Summary of changes:
 Open-ILS/src/sql/Pg/002.schema.config.sql          |   31 +++++++-
 Open-ILS/src/sql/Pg/950.data.seed-values.sql       |   22 +++++
 .../sql/Pg/upgrade/0729.vr_format_value_maps.sql   |   59 +++++++++++++
 .../templates/opac/parts/advanced/global_row.tt2   |    2 +-
 .../src/templates/opac/parts/advanced/search.tt2   |   90 ++++++++------------
 Open-ILS/src/templates/opac/parts/base.tt2         |    1 -
 Open-ILS/src/templates/opac/parts/config.tt2       |   33 +++++++
 .../src/templates/opac/parts/qtype_selector.tt2    |    2 +-
 8 files changed, 182 insertions(+), 58 deletions(-)
 create mode 100644 Open-ILS/src/sql/Pg/upgrade/0729.vr_format_value_maps.sql


hooks/post-receive
-- 
Evergreen ILS


More information about the open-ils-commits mailing list