-Evergreen doesn't keep a GNU-style ChangeLog except in release tarballs.
-Those seeking a change log are encouraged to run 'git log -v', or read
-it online at: http://git.evergreen-ils.org/?p=Evergreen.git;a=log
+commit d5ccc21e2ace9fe14e9c0549d39e487b3138bd57
+Author: Dan Wells <dbw2@calvin.edu>
+Date: Thu Aug 25 18:08:07 2016 -0400
+
+ Update release notes
+
+ Signed-off-by: Dan Wells <dbw2@calvin.edu>
+
+536 0 docs/RELEASE_NOTES_2_11.adoc
+0 16 docs/RELEASE_NOTES_NEXT/Administration/Action_Trigger_Email_Headers.adoc
+0 15 docs/RELEASE_NOTES_NEXT/Administration/lp1568046-tablefunc-extension-removed.adoc
+0 29 docs/RELEASE_NOTES_NEXT/Administration/user-activity-purge.adoc
+0 6 docs/RELEASE_NOTES_NEXT/Cataloging/auth_bib_update.adoc
+0 16 docs/RELEASE_NOTES_NEXT/Cataloging/auth_prop_bib_update.adoc
+0 6 docs/RELEASE_NOTES_NEXT/Cataloging/bib_source_in_901s.txt
+0 12 docs/RELEASE_NOTES_NEXT/Cataloging/marc_bib_update.adoc
+0 21 docs/RELEASE_NOTES_NEXT/Circulation/aged-circs-see-light-of-day.adoc
+0 26 docs/RELEASE_NOTES_NEXT/Circulation/canceled-transit-copy-status.adoc
+0 18 docs/RELEASE_NOTES_NEXT/Circulation/copy-status-is-avail.adoc
+0 20 docs/RELEASE_NOTES_NEXT/Circulation/email_cko_receipts.adoc
+0 18 docs/RELEASE_NOTES_NEXT/Circulation/limit_payment_amounts_accepted.txt
+0 17 docs/RELEASE_NOTES_NEXT/Client/added-fields-for-client-interfaces.adoc
+0 7 docs/RELEASE_NOTES_NEXT/OPAC/combine_notice_prefs_tables.adoc
+0 14 docs/RELEASE_NOTES_NEXT/OPAC/improved-myopac-holds-screens.adoc
+0 74 docs/RELEASE_NOTES_NEXT/OPAC/popularity-rating.txt
+0 9 docs/RELEASE_NOTES_NEXT/OPAC/remove_advanced_hold_options_for_parts.adoc
+0 8 docs/RELEASE_NOTES_NEXT/SIP/SIP_Workstation_Name.adoc
+0 7 docs/RELEASE_NOTES_NEXT/SIP/SIP_renewal_blocks.adoc
+0 7 docs/RELEASE_NOTES_NEXT/Translations/Updates.adoc
+21 41 docs/installation/server_upgrade.txt
+ create mode 100644 docs/RELEASE_NOTES_2_11.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Administration/Action_Trigger_Email_Headers.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Administration/lp1568046-tablefunc-extension-removed.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Administration/user-activity-purge.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/auth_bib_update.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/auth_prop_bib_update.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/bib_source_in_901s.txt
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/marc_bib_update.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/aged-circs-see-light-of-day.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/canceled-transit-copy-status.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/copy-status-is-avail.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/email_cko_receipts.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/limit_payment_amounts_accepted.txt
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Client/added-fields-for-client-interfaces.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/combine_notice_prefs_tables.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/improved-myopac-holds-screens.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/popularity-rating.txt
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/remove_advanced_hold_options_for_parts.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/SIP/SIP_Workstation_Name.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/SIP/SIP_renewal_blocks.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Translations/Updates.adoc
+
+commit ccceb089a6011894aa174c1b7895933dd1e9fdb6
+Author: Dan Wells <dbw2@calvin.edu>
+Date: Thu Jul 28 18:51:35 2016 -0400
+
+ Bumping Perl version string for 2.11.0
+
+ Signed-off-by: Dan Wells <dbw2@calvin.edu>
+
+1 1 Open-ILS/src/perlmods/lib/OpenILS.pm
+
+commit 0c156fa06433c7b97ac7277a13dbc918dec4bb7e
+Author: Dan Wells <dbw2@calvin.edu>
+Date: Wed Sep 21 16:08:05 2016 -0400
+
+ Translation updates - po files
+
+ Signed-off-by: Dan Wells <dbw2@calvin.edu>
+
+77 77 build/i18n/po/acq/cs-CZ.po
+1853 0 build/i18n/po/acq/es-ES.po
+1633 0 build/i18n/po/conify/cs-CZ.po
+23 9 build/i18n/po/db.seed/es-ES.po
+5 5 build/i18n/po/fm_IDL.dtd/cs-CZ.po
+5 5 build/i18n/po/tpac/cs-CZ.po
+4 4 build/i18n/po/webstaff/cs-CZ.po
+178 166 build/i18n/po/webstaff/es-ES.po
+ create mode 100644 build/i18n/po/acq/es-ES.po
+ create mode 100644 build/i18n/po/conify/cs-CZ.po
+
+commit c487a8f751911848d118432a45c27c8e7c3c5aa2
+Author: Kathy Lussier <klussier@masslnc.org>
+Date: Wed Sep 21 12:42:42 2016 -0400
+
+ Docs: 2.11 Release Notes updates
+
+ Updates to the 2.11, including: adding a note about Ubuntu Xenial support,
+ adding acknowledgements for translators and for some who were missed in the
+ first iteration of Release Notes, slimming down the activity metric release
+ notes entry and moving the original, detail-rich entry to the TechRef directory.
+
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+
+4 0 docs/RELEASE_NOTES_NEXT/Administration/ubuntu-xenial-support.adoc
+52 79 docs/RELEASE_NOTES_NEXT/OPAC/popularity-rating.txt
+14 2 docs/RELEASE_NOTES_NEXT/_acknowledgments
+101 0 docs/TechRef/popularity-rating.txt
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Administration/ubuntu-xenial-support.adoc
+ create mode 100644 docs/TechRef/popularity-rating.txt
+
+commit 6bd672af7d6c755c36b65f8efa336002a8a36d5a
+Author: Chris Sharp <csharp@georgialibraries.org>
+Date: Thu Sep 15 14:28:09 2016 -0400
+
+ LP#1624025 - Add 'is_available' field to config::copy_status
+
+ The fix to bug 1464709 overlooked a necessary place to define
+ the newly added 'is_available' column to the config.copy_status
+ table.
+
+ Signed-off-by: Chris Sharp <csharp@georgialibraries.org>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+1 1 Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/config.pm
+
+commit 2a7a6e81bea10340638629a2dee24ce4ee3d0c68
+Author: Kathy Lussier <klussier@masslnc.org>
+Date: Wed Sep 14 12:47:16 2016 -0400
+
+ Docs: 2.11 release note fixes
+
+ 2.11 release note entries edited for clarity, grammar, spelling and style.
+
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+
+1 1 docs/RELEASE_NOTES_NEXT/Cataloging/bib_source_in_901s.txt
+10 13 docs/RELEASE_NOTES_NEXT/Cataloging/marc_bib_update.adoc
+1 1 docs/RELEASE_NOTES_NEXT/Circulation/aged-circs-see-light-of-day.adoc
+3 2 docs/RELEASE_NOTES_NEXT/Circulation/copy-status-is-avail.adoc
+2 2 docs/RELEASE_NOTES_NEXT/Circulation/email_cko_receipts.adoc
+10 8 docs/RELEASE_NOTES_NEXT/Circulation/limit_payment_amounts_accepted.txt
+1 1 docs/RELEASE_NOTES_NEXT/OPAC/improved-myopac-holds-screens.adoc
+2 2 docs/RELEASE_NOTES_NEXT/OPAC/remove_advanced_hold_options_for_parts.adoc
+
+commit b6da36c9684017c2b1e4855d5188cf844c02ee85
+Author: Kathy Lussier <klussier@masslnc.org>
+Date: Wed Sep 14 10:53:30 2016 -0400
+
+ Docs: Adding acknowledgements to the 2.11 release notes
+
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+
+24 5 docs/RELEASE_NOTES_NEXT/_acknowledgments
+
+commit 8284edcdd3de5392b4265f3ee2e806dda761cdc1
+Author: Dan Wells <dbw2@calvin.edu>
+Date: Fri Sep 9 09:37:31 2016 -0400
+
+ Translation updates - po files
+
+ Signed-off-by: Dan Wells <dbw2@calvin.edu>
+
+9 9 build/i18n/po/acq.js/es-ES.po
+1853 0 build/i18n/po/acq/cs-CZ.po
+198 0 build/i18n/po/actor/cs-CZ.po
+54 0 build/i18n/po/booking/cs-CZ.po
+8 4 build/i18n/po/cat.properties/cs-CZ.po
+7 3 build/i18n/po/cat.properties/de-DE.po
+7 3 build/i18n/po/cat.properties/en-CA.po
+7 3 build/i18n/po/cat.properties/en-GB.po
+7 3 build/i18n/po/cat.properties/es-ES.po
+7 3 build/i18n/po/cat.properties/fi-FI.po
+7 3 build/i18n/po/cat.properties/fr-CA.po
+7 3 build/i18n/po/cat.properties/hy-AM.po
+7 3 build/i18n/po/cat.properties/oc-FR.po
+7 3 build/i18n/po/cat.properties/pt-BR.po
+7 3 build/i18n/po/cat.properties/ru-RU.po
+7 3 build/i18n/po/cat.properties/tr-TR.po
+58 0 build/i18n/po/cat/cs-CZ.po
+16 4 build/i18n/po/circ.properties/cs-CZ.po
+16 4 build/i18n/po/circ.properties/de-DE.po
+15 3 build/i18n/po/circ.properties/en-CA.po
+15 3 build/i18n/po/circ.properties/en-GB.po
+15 3 build/i18n/po/circ.properties/es-ES.po
+15 3 build/i18n/po/circ.properties/fi-FI.po
+15 3 build/i18n/po/circ.properties/fr-CA.po
+15 3 build/i18n/po/circ.properties/hy-AM.po
+15 3 build/i18n/po/circ.properties/oc-FR.po
+15 3 build/i18n/po/circ.properties/pt-BR.po
+15 3 build/i18n/po/circ.properties/ru-RU.po
+15 3 build/i18n/po/circ.properties/tr-TR.po
+335 0 build/i18n/po/circ/cs-CZ.po
+12 4 build/i18n/po/common.properties/cs-CZ.po
+11 3 build/i18n/po/common.properties/de-DE.po
+11 3 build/i18n/po/common.properties/en-CA.po
+11 3 build/i18n/po/common.properties/en-GB.po
+11 3 build/i18n/po/common.properties/es-ES.po
+11 3 build/i18n/po/common.properties/fi-FI.po
+11 3 build/i18n/po/common.properties/fr-CA.po
+11 3 build/i18n/po/common.properties/hy-AM.po
+11 3 build/i18n/po/common.properties/oc-FR.po
+11 3 build/i18n/po/common.properties/pt-BR.po
+11 3 build/i18n/po/common.properties/ru-RU.po
+23 10 build/i18n/po/conify.js/cs-CZ.po
+17 7 build/i18n/po/conify.js/de-DE.po
+19 9 build/i18n/po/conify.js/en-CA.po
+19 9 build/i18n/po/conify.js/en-GB.po
+19 9 build/i18n/po/conify.js/es-ES.po
+19 9 build/i18n/po/conify.js/fi-FI.po
+19 9 build/i18n/po/conify.js/fr-CA.po
+19 9 build/i18n/po/conify.js/hy-AM.po
+17 7 build/i18n/po/conify.js/oc-FR.po
+19 9 build/i18n/po/conify.js/pt-BR.po
+19 9 build/i18n/po/conify.js/ru-RU.po
+17 7 build/i18n/po/conify.js/tr-TR.po
+3290 3222 build/i18n/po/db.seed/cs-CZ.po
+3278 3217 build/i18n/po/db.seed/de-DE.po
+3283 3219 build/i18n/po/db.seed/en-CA.po
+3283 3219 build/i18n/po/db.seed/en-GB.po
+3284 3220 build/i18n/po/db.seed/es-ES.po
+3285 3221 build/i18n/po/db.seed/fi-FI.po
+3284 3220 build/i18n/po/db.seed/fr-CA.po
+3285 3221 build/i18n/po/db.seed/hy-AM.po
+3283 3219 build/i18n/po/db.seed/oc-FR.po
+3283 3219 build/i18n/po/db.seed/pt-BR.po
+3283 3219 build/i18n/po/db.seed/ru-RU.po
+3283 3219 build/i18n/po/db.seed/tr-TR.po
+2857 2720 build/i18n/po/fm_IDL.dtd/cs-CZ.po
+2829 2699 build/i18n/po/fm_IDL.dtd/de-DE.po
+2839 2709 build/i18n/po/fm_IDL.dtd/en-CA.po
+2836 2706 build/i18n/po/fm_IDL.dtd/en-GB.po
+2839 2709 build/i18n/po/fm_IDL.dtd/es-ES.po
+2839 2709 build/i18n/po/fm_IDL.dtd/fi-FI.po
+2831 2701 build/i18n/po/fm_IDL.dtd/fr-CA.po
+2839 2709 build/i18n/po/fm_IDL.dtd/hy-AM.po
+2829 2699 build/i18n/po/fm_IDL.dtd/oc-FR.po
+2834 2704 build/i18n/po/fm_IDL.dtd/pt-BR.po
+2834 2704 build/i18n/po/fm_IDL.dtd/ru-RU.po
+2829 2699 build/i18n/po/fm_IDL.dtd/tr-TR.po
+58 42 build/i18n/po/ils_events.xml/cs-CZ.po
+55 39 build/i18n/po/ils_events.xml/de-DE.po
+57 41 build/i18n/po/ils_events.xml/en-CA.po
+57 41 build/i18n/po/ils_events.xml/en-GB.po
+57 41 build/i18n/po/ils_events.xml/es-ES.po
+57 41 build/i18n/po/ils_events.xml/fi-FI.po
+58 42 build/i18n/po/ils_events.xml/fr-CA.po
+57 41 build/i18n/po/ils_events.xml/hy-AM.po
+57 41 build/i18n/po/ils_events.xml/pt-BR.po
+56 40 build/i18n/po/ils_events.xml/ru-RU.po
+385 0 build/i18n/po/kpac/cs-CZ.po
+11 3 build/i18n/po/lang.dtd/ar-AR.po
+16 8 build/i18n/po/lang.dtd/cs-CZ.po
+11 3 build/i18n/po/lang.dtd/de-DE.po
+11 3 build/i18n/po/lang.dtd/en-CA.po
+11 3 build/i18n/po/lang.dtd/en-GB.po
+11 3 build/i18n/po/lang.dtd/es-ES.po
+11 3 build/i18n/po/lang.dtd/fi-FI.po
+11 3 build/i18n/po/lang.dtd/fr-CA.po
+11 3 build/i18n/po/lang.dtd/hy-AM.po
+11 3 build/i18n/po/lang.dtd/oc-FR.po
+11 3 build/i18n/po/lang.dtd/pt-BR.po
+11 3 build/i18n/po/lang.dtd/ru-RU.po
+11 3 build/i18n/po/lang.dtd/tr-TR.po
+4 4 build/i18n/po/offline.properties/cs-CZ.po
+16 4 build/i18n/po/patron.properties/cs-CZ.po
+15 3 build/i18n/po/patron.properties/de-DE.po
+15 3 build/i18n/po/patron.properties/en-CA.po
+15 3 build/i18n/po/patron.properties/en-GB.po
+15 3 build/i18n/po/patron.properties/es-ES.po
+15 3 build/i18n/po/patron.properties/fi-FI.po
+15 3 build/i18n/po/patron.properties/fr-CA.po
+15 3 build/i18n/po/patron.properties/hy-AM.po
+15 3 build/i18n/po/patron.properties/oc-FR.po
+15 3 build/i18n/po/patron.properties/pt-BR.po
+15 3 build/i18n/po/patron.properties/ru-RU.po
+15 3 build/i18n/po/patron.properties/tr-TR.po
+6 6 build/i18n/po/reports.js/cs-CZ.po
+413 0 build/i18n/po/serial/cs-CZ.po
+188 159 build/i18n/po/tpac/ar-AR.po
+196 165 build/i18n/po/tpac/cs-CZ.po
+189 160 build/i18n/po/tpac/de-DE.po
+192 163 build/i18n/po/tpac/en-CA.po
+192 163 build/i18n/po/tpac/en-GB.po
+196 164 build/i18n/po/tpac/es-ES.po
+192 163 build/i18n/po/tpac/fi-FI.po
+244 215 build/i18n/po/tpac/fr-CA.po
+192 163 build/i18n/po/tpac/hy-AM.po
+189 160 build/i18n/po/tpac/oc-FR.po
+192 163 build/i18n/po/tpac/pt-BR.po
+189 160 build/i18n/po/tpac/tr-TR.po
+146 0 build/i18n/po/urlverify/cs-CZ.po
+1409 290 build/i18n/po/webstaff/cs-CZ.po
+1395 289 build/i18n/po/webstaff/es-ES.po
+ create mode 100644 build/i18n/po/acq/cs-CZ.po
+ create mode 100644 build/i18n/po/actor/cs-CZ.po
+ create mode 100644 build/i18n/po/booking/cs-CZ.po
+ create mode 100644 build/i18n/po/cat/cs-CZ.po
+ create mode 100644 build/i18n/po/circ/cs-CZ.po
+ create mode 100644 build/i18n/po/kpac/cs-CZ.po
+ create mode 100644 build/i18n/po/serial/cs-CZ.po
+ create mode 100644 build/i18n/po/urlverify/cs-CZ.po
+
+commit ee711968b69b8e4a6613f630d975965d28162e27
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Mon Mar 7 12:42:51 2016 -0500
+
+ LP#1436987: webstaff - fix patron search form
+
+ This patch ensures that the patron profile and
+ search OU values are retained when going from a patron
+ search to a single record and back to the patron search.
+
+ To test the fix for this bug:
+
+ [1] Search for a patron using the expanded patron search fields,
+ making sure to select values for the profile and search
+ OU dropdowns.
+ [2] Open a record, then click "Patron Search" to return to the
+ search form.
+ [3] Verify that the profile and search library are set and
+ that the same patron records are retrieved.
+
+ This patch includes elements from a patch originally written
+ by Victoria Lewis <vlewis@catalystitservices.com>
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+6 1 Open-ILS/web/js/ui/default/staff/circ/patron/app.js
+
+commit e1a555e3d1d1c2a079a0fd6294e8d1fafa3f8818
+Author: Dan Scott <dscott@laurentian.ca>
+Date: Mon Sep 5 21:34:20 2016 -0400
+
+ SIP manual testing formatting cleanup
+
+ The extra ** in the sample SIP lines was distracting. Also, it wasn't clear
+ which password to use when $password was used twice, so disambiguate it to
+ identify user vs. SIP password.
+
+ Signed-off-by: Dan Scott <dscott@laurentian.ca>
+
+27 14 docs/admin/sip_server.txt
+
+commit 43bf9d219862d45668cf2229b7b181350cd3ce65
+Author: Chris Sharp <csharp@georgialibraries.org>
+Date: Wed Aug 31 07:14:49 2016 -0400
+
+ LP1613374: Release notes formatting fix.
+
+ Signed-off-by: Chris Sharp <csharp@georgialibraries.org>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+9 9 docs/RELEASE_NOTES_NEXT/Circulation/canceled-transit-copy-status.adoc
+
+commit 9b47089fd67daa7041161a9c71a02320797055d6
+Author: Dan Wells <dbw2@calvin.edu>
+Date: Mon Aug 29 17:38:10 2016 -0400
+
+ Stamping upgrade script for Spanish locale seed data
+
+ Signed-off-by: Dan Wells <dbw2@calvin.edu>
+
+1 1 Open-ILS/src/sql/Pg/002.schema.config.sql
+11 0 Open-ILS/src/sql/Pg/upgrade/1000.data.add-spanish-to-i18n-locale.sql
+0 11 Open-ILS/src/sql/Pg/upgrade/XXXX.data.add-spanish-to-i18n-locale.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/1000.data.add-spanish-to-i18n-locale.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.add-spanish-to-i18n-locale.sql
+
+commit dddb70dff3d508b673d12b169fb41ca0473c6f9e
+Author: Ben Shum <ben@evergreener.net>
+Date: Mon Aug 29 15:37:48 2016 -0400
+
+ LP#1618183: Add Spanish to config.i18n_locale
+
+ Add Spanish to this table so that it is an option for supported translations.
+
+ Signed-off-by: Ben Shum <ben@evergreener.net>
+ Signed-off-by: Dan Wells <dbw2@calvin.edu>
+
+3 0 Open-ILS/src/sql/Pg/950.data.seed-values.sql
+11 0 Open-ILS/src/sql/Pg/upgrade/XXXX.data.add-spanish-to-i18n-locale.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.add-spanish-to-i18n-locale.sql
+
+commit 6bc0bc2fb3f405ad4609a9be2992374c57bf0328
+Author: Jeff Godin <jgodin@tadl.org>
+Date: Mon Aug 29 12:58:27 2016 -0400
+
+ LP#1618136 Fix webstaff IDL2js.js test failures
+
+ Fix webstaff test failures due to an invalid IDL2js.js file by adding
+ newly-required preprocessing to the support script that generates that
+ file when running tests.
+
+ Signed-off-by: Jeff Godin <jgodin@tadl.org>
+ Signed-off-by: Ben Shum <ben@evergreener.net>
+ Signed-off-by: Dan Wells <dbw2@calvin.edu>
+
+15 1 Open-ILS/web/js/ui/default/staff/test/data/idl2js.pl
+
+commit e07ac6c32679a87ecf2dcc5c4c11a01347871313
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Fri Aug 26 17:00:20 2016 -0400
+
+ Stamp 0999 upgrade; remove merge conflict markers
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Dan Wells <dbw2@calvin.edu>
+
+1 1 Open-ILS/src/sql/Pg/002.schema.config.sql
+0 3 Open-ILS/src/sql/Pg/950.data.seed-values.sql
+14 0 Open-ILS/src/sql/Pg/upgrade/0999.schema.staging-user-setting.sql
+0 12 Open-ILS/src/sql/Pg/upgrade/YYYY.schema.staging-user-setting.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0999.schema.staging-user-setting.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/YYYY.schema.staging-user-setting.sql
+
+commit ec802af48798087d8fda770fff67d9e2ebcffc40
+Author: Dan Wells <dbw2@calvin.edu>
+Date: Thu Aug 25 17:55:36 2016 -0400
+
+ Translation updates - newpot
+
+ Signed-off-by: Dan Wells <dbw2@calvin.edu>
+
+1835 0 build/i18n/po/acq/acq.pot
+192 0 build/i18n/po/actor/actor.pot
+52 0 build/i18n/po/booking/booking.pot
+5 1 build/i18n/po/cat.properties/cat.properties.pot
+56 0 build/i18n/po/cat/cat.pot
+13 1 build/i18n/po/circ.properties/circ.properties.pot
+333 0 build/i18n/po/circ/circ.pot
+9 1 build/i18n/po/common.properties/common.properties.pot
+16 5 build/i18n/po/conify.js/conify.js.pot
+1592 0 build/i18n/po/conify/conify.pot
+3293 3219 build/i18n/po/db.seed/db.seed.pot
+2827 2697 build/i18n/po/fm_IDL.dtd/fm_IDL.dtd.pot
+51 40 build/i18n/po/ils_events.xml/ils_events.xml.pot
+365 0 build/i18n/po/kpac/kpac.pot
+9 1 build/i18n/po/lang.dtd/lang.dtd.pot
+13 1 build/i18n/po/patron.properties/patron.properties.pot
+406 0 build/i18n/po/serial/serial.pot
+183 156 build/i18n/po/tpac/tpac.pot
+132 0 build/i18n/po/urlverify/urlverify.pot
+620 0 build/i18n/po/vandelay/vandelay.pot
+1380 284 build/i18n/po/webstaff/webstaff.pot
+ create mode 100644 build/i18n/po/acq/acq.pot
+ create mode 100644 build/i18n/po/actor/actor.pot
+ create mode 100644 build/i18n/po/booking/booking.pot
+ create mode 100644 build/i18n/po/cat/cat.pot
+ create mode 100644 build/i18n/po/circ/circ.pot
+ create mode 100644 build/i18n/po/conify/conify.pot
+ create mode 100644 build/i18n/po/kpac/kpac.pot
+ create mode 100644 build/i18n/po/serial/serial.pot
+ create mode 100644 build/i18n/po/urlverify/urlverify.pot
+ create mode 100644 build/i18n/po/vandelay/vandelay.pot
+
+commit b54e57616d0659975e250faa1fa069d16a6bd598
+Author: Ben Shum <ben@evergreener.net>
+Date: Wed Aug 24 16:33:18 2016 -0400
+
+ LP#1095280: i18n - Add templates to update_pofiles
+
+ Signed-off-by: Ben Shum <ben@evergreener.net>
+ Signed-off-by: Dan Wells <dbw2@calvin.edu>
+
+10 0 build/i18n/scripts/update_pofiles
+
+commit df174c20829437634a7a4377420af88e1e057757
+Author: Ben Shum <ben@evergreener.net>
+Date: Wed Aug 24 09:32:47 2016 -0400
+
+ LP#1095280: i18n - Add new templates for translation to Makefile
+
+ Add various source and output files for new templates directories for i18n
+ along with make targets and other copy commands.
+
+ Signed-off-by: Ben Shum <ben@evergreener.net>
+ Signed-off-by: Dan Wells <dbw2@calvin.edu>
+
+93 1 build/i18n/Makefile
+
+commit a66cccae9cd9a76356437bce06ffd155e05276ab
+Author: Ben Shum <ben@evergreener.net>
+Date: Wed Aug 24 09:25:27 2016 -0400
+
+ LP#1095280: i18n - Move existing templates closer together in Makefile
+
+ In the interest of making it easier to edit, move all the lines
+ for generating i18n translation files for Open-ILS/src/templates/*
+ closer together.
+
+ Signed-off-by: Ben Shum <ben@evergreener.net>
+ Signed-off-by: Dan Wells <dbw2@calvin.edu>
+
+2 2 build/i18n/Makefile
+
+commit 18c769a8441e9728007c59ae88c6965f3655cc56
+Author: Chris Sharp <csharp@georgialibraries.org>
+Date: Thu Aug 25 07:15:11 2016 -0400
+
+ LP#1613374 - Canceled Transit status Release Notes
+
+ Signed-off-by: Chris Sharp <csharp@georgialibraries.org>
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+
+26 0 docs/RELEASE_NOTES_NEXT/Circulation/canceled-transit-copy-status.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/canceled-transit-copy-status.adoc
+
+commit b2af4872895e860abd8b48cc5cb2cf06c68bb852
+Author: Kathy Lussier <klussier@masslnc.org>
+Date: Wed Aug 24 19:43:44 2016 -0400
+
+ Docs: Some missing release notes for 2.11
+
+ We were missing release notes for some of the new fields added to client
+ interfaces as well as one of the new SIP features.
+
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+
+17 0 docs/RELEASE_NOTES_NEXT/Client/added-fields-for-client-interfaces.adoc
+7 0 docs/RELEASE_NOTES_NEXT/SIP/SIP_renewal_blocks.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Client/added-fields-for-client-interfaces.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/SIP/SIP_renewal_blocks.adoc
+
+commit 15ad6d45c3066c3e88c6d6e0c28b2f445a3132b0
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Wed Aug 24 18:32:02 2016 -0400
+
+ Stamping upgrade scripts for aged circs display branch
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1 1 Open-ILS/src/sql/Pg/002.schema.config.sql
+141 0 Open-ILS/src/sql/Pg/upgrade/0998.schema.aged-circ-chains.sql
+0 141 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.aged-circ-chains.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0998.schema.aged-circ-chains.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.aged-circ-chains.sql
+
+commit 3f2d3a0335fe935e4ec3a310b018b76cdd9f7e3f
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Wed Aug 24 17:01:01 2016 -0400
+
+ LP#1497335 Show Last Few Circs patron retrieve options
+
+ In the Show Last Few Circulations window (XUL), disable the "Retrieve
+ Last Patron" button when the most recent circulation is aged. Disable
+ the "Retrieve All These Patrons" button when all circulations displayed
+ are aged.
+
+ Fixes a sort bug in open-ils.circ.copy_checkout_history.retrieve.
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+1 1 Open-ILS/src/perlmods/lib/OpenILS/Application/Circ.pm
+14 0 Open-ILS/xul/staff_client/server/circ/circ_summary.xul
+
+commit 57697077ec3a4431c16d043d1d9270c3e18c1fba
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Wed Aug 3 15:18:59 2016 -0400
+
+ LP#1497335 Aged circ display release notes
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+21 0 docs/RELEASE_NOTES_NEXT/Circulation/aged-circs-see-light-of-day.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/aged-circs-see-light-of-day.adoc
+
+commit b9e5c623f2cde86b1b87d07ba9e4a637f1b3ac5e
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Wed Aug 3 14:45:39 2016 -0400
+
+ LP#1497335 Item details shows aged circs (XUL edition)
+
+ * Item Status -> Circulation History now displays aged circulations as
+ appropriate, showing "<Aged Circulation>" in lieu the patron's name.
+
+ * Item Status (and others) -> Show Last Few Circulations, ditto above.
+ Also, the 'Add Billing' button is disabled when displayed with an aged
+ circulation row.
+
+ * Copy -> Retrieve Last Patron action now includes aged circulations
+ when looking for the most recent circulation. When the most recent
+ circ is an aged circ, the UI reports "Item XXX circulation is an aged
+ circulation and has no linked user". Among other things, this means
+ the 3rd from last circ will not be confused as the 2nd to last circ
+ when the 2nd to last is aged.
+
+ * Mark Item Damaged will warn if the circ in question is aged. This is
+ just a sanity check and should never happen in reality, since the UI
+ only supports this option on checked out items (i.e. active circs).
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+14 0 Open-ILS/xul/staff_client/server/cat/util.js
+34 19 Open-ILS/xul/staff_client/server/circ/alternate_copy_summary.js
+10 1 Open-ILS/xul/staff_client/server/circ/checkin.js
+17 9 Open-ILS/xul/staff_client/server/circ/circ_brief.xul
+10 1 Open-ILS/xul/staff_client/server/circ/renew.js
+4 0 Open-ILS/xul/staff_client/server/circ/util.js
+2 0 Open-ILS/xul/staff_client/server/locale/en-US/circ.properties
+
+commit 11d7f2206e4583db64626f9761c00c7746242cbe
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Wed Aug 3 13:52:33 2016 -0400
+
+ LP#1497335 Browser client item details aged circs
+
+ 1. Use all_circulation (combcirc) class (now accessible via pcrud) to
+ render the item Circ History List tab. In cases where a combcirc object
+ has no 'usr' value, the interface displays <Aged Circulation> where
+ the patron's name would normally be and disables the 'Add Billing'
+ button.
+
+ 2. Handle null 'usr' values in the item status Recent Circ History tab.
+ When a renewal chain summary has no 'usr' value, the interface displays
+ <Aged Circulation> where the patron's name would normally be.
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+5 2 Open-ILS/src/templates/staff/cat/item/t_circ_list_pane.tt2
+8 5 Open-ILS/src/templates/staff/cat/item/t_circs_pane.tt2
+11 9 Open-ILS/web/js/ui/default/staff/cat/item/app.js
+
+commit 52bf3fe8e791c43448c49fa9818f5790625c724c
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Wed Aug 3 13:34:29 2016 -0400
+
+ LP#1497335 Aged/All circulation API access
+
+ Various SQL, IDL, and API changes for accessing aged circulations,
+ primarily via all_circulation objects, for imporoved staff client
+ integration.
+
+ *. Support open-ils.pcrud access to the action.all_circulation DB view /
+ 'combcirc' class.
+
+ *. Add missing parent_circ, checkin_scan_time, checkin_workstation to
+ combcirc class.
+
+ *. Add 'usr' field to combcirc. The action.all_circulation VIEW will
+ return NULL as the 'usr' column value when returning data for an
+ aged_circulation.
+
+ *. Add virtual 'active_circ' and 'aged_circ' fields to combcirc for
+ fleshing the related action.circulation or action.aged_circulation
+ object.
+
+ * Adds SQL functions for action.all_circ_chain and
+ action.summarize_all_circ_chain, which pull data from
+ aged_circulation.
+
+ *. API calls
+ open-ils.circ.[prev_]renewal_chain.retrieve_by_circ[.summary] now return
+ data for active and aged circulations by using action.all_circ_chain and
+ action.summarize_all_circ_chain. When using these APIs, a null value
+ in the 'usr' column is the indication that a given circulation or circ
+ chain summary represents an aged circulation.
+
+ * API open-ils.circ.copy_details.retrieve will now optionally return
+ aged circ data within the copy circ history.
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+17 1 Open-ILS/examples/fm_IDL.xml
+1 1 Open-ILS/src/perlmods/lib/OpenILS/Application/AppUtils.pm
+75 71 Open-ILS/src/perlmods/lib/OpenILS/Application/Circ.pm
+92 2 Open-ILS/src/sql/Pg/090.schema.action.sql
+141 0 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.aged-circ-chains.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.aged-circ-chains.sql
+
+commit 8decad6183c9c3786377bd59eae8c55472ab35c4
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Wed Aug 24 18:07:13 2016 -0400
+
+ Stamping upgrade script for Canceled Transit status branch
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1 1 Open-ILS/src/sql/Pg/002.schema.config.sql
+7 0 Open-ILS/src/sql/Pg/upgrade/0997.data.canceled-transit-item-status.sql
+0 7 Open-ILS/src/sql/Pg/upgrade/XXXX.data.canceled-transit-item-status.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0997.data.canceled-transit-item-status.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.canceled-transit-item-status.sql
+
+commit a5f6a489ea0436b085831fcf033ca176c61204f9
+Author: Chris Sharp <csharp@georgialibraries.org>
+Date: Wed Aug 24 14:23:09 2016 -0400
+
+ LP#1613374 - Check stored copy status before clobbering it.
+
+ Some transit.copy_statuses would result in some other behavior
+ upon checkin, so we check all that would go into 'Reshelving'
+ status, otherwise, restore the stored status.
+
+ Signed-off-by: Chris Sharp <csharp@georgialibraries.org>
+ Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+15 2 Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Transit.pm
+
+commit 58cd99ec3a4f83fd2d68b2e732069587c70b1459
+Author: Chris Sharp <csharp@georgialibraries.org>
+Date: Tue Aug 23 09:32:59 2016 -0400
+
+ LP#1613374 - Add 'Canceled Transit' to non-'BAD' copy statuses.
+
+ During checkin, Circulate.pm checks the copy status and if it
+ isn't listed as an okay status, the event COPY_BAD_STATUS is
+ returned, which requires an override. This change makes copies
+ in 'Canceled Transit' status check in without an alert.
+
+ Signed-off-by: Chris Sharp <csharp@georgialibraries.org>
+ Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1 0 Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm
+
+commit 49ea249d5f7d315aa7bf1980edb4c7ea961f7833
+Author: Chris Sharp <csharp@georgialibraries.org>
+Date: Tue Aug 16 07:11:24 2016 -0400
+
+ LP#1613374 - Add 'Canceled Transit' to "magical statuses"
+
+ Signed-off-by: Chris Sharp <csharp@georgialibraries.org>
+ Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+2 1 Open-ILS/xul/staff_client/chrome/content/main/constants.js
+
+commit fcc46ccaa72260f8dc970df156985c983f1e19f4
+Author: Chris Sharp <csharp@georgialibraries.org>
+Date: Mon Aug 22 08:58:24 2016 -0400
+
+ LP#1613374 - Make 'Canceled Transit' status holdable and OPAC-visible.
+
+ Signed-off-by: Chris Sharp <csharp@georgialibraries.org>
+ Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1 1 Open-ILS/src/sql/Pg/950.data.seed-values.sql
+1 1 Open-ILS/src/sql/Pg/upgrade/XXXX.data.canceled-transit-item-status.sql
+
+commit 6c27a324d4665b7c64d37784ac339037bdb31423
+Author: Chris Sharp <csharp@georgialibraries.org>
+Date: Wed Aug 24 14:12:04 2016 -0400
+
+ LP#1613374 - Set item status to 'Canceled Transit' when transit is canceled.
+
+ I opened a separate bug report on this issue (bug 1613374) before realizing
+ bug 1306666 was reported. This commit creates a new 'Canceled Transit' status
+ that signals to staff what happened to an item when a transit is aborted/canceled.
+
+ Signed-off-by: Chris Sharp <csharp@georgialibraries.org>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+ Conflicts:
+ Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Transit.pm
+
+ Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1 6 Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Transit.pm
+1 1 Open-ILS/src/perlmods/lib/OpenILS/Const.pm
+1 0 Open-ILS/src/sql/Pg/950.data.seed-values.sql
+7 0 Open-ILS/src/sql/Pg/upgrade/XXXX.data.canceled-transit-item-status.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.canceled-transit-item-status.sql
+
+commit c820aa492739c544e09a7b646a09b8507ae3993b
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Wed Aug 24 18:01:33 2016 -0400
+
+ Stamping upgrade for email receipts
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1 1 Open-ILS/src/sql/Pg/002.schema.config.sql
+105 0 Open-ILS/src/sql/Pg/upgrade/0996.data.email-checkout-receipt.sql
+0 103 Open-ILS/src/sql/Pg/upgrade/XXXX.data.email-checkout-receipt.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0996.data.email-checkout-receipt.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.email-checkout-receipt.sql
+
+commit 33746b32ffab1c7d5e530df8acc9336c2b15859f
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Mon Aug 22 18:08:37 2016 -0400
+
+ LP#1356477: release notes for email checkout receipts
+
+ A portion of the text was written by Angela Kilsdonk.
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+20 0 docs/RELEASE_NOTES_NEXT/Circulation/email_cko_receipts.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/email_cko_receipts.adoc
+
+commit 92f1bdb26d0027b52b3b3db84ff3d52104d6b1fe
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Thu Aug 4 10:38:48 2016 -0400
+
+ LP#1356477: update selfcheck interface
+
+ This patch replaces the Logout and Logout with Receipt buttons in
+ the selfcheck interface with a single Logout button and a set of radio
+ buttons (whose labels are clickable) that allow the user to specify
+ whether they want an email receipt, a print receipt, or no receipt upon
+ logging out.
+
+ If the user has no email address, the option to select email receipts
+ will not be presented to them.
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+7 2 Open-ILS/src/templates/circ/selfcheck/summary.tt2
+70 7 Open-ILS/web/js/ui/default/circ/selfcheck/selfcheck.js
+
+commit 4d512bfac53dfdc94696f1731bbae6e50542bccc
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Thu Aug 4 12:07:14 2016 -0400
+
+ LP#1356477: move email receipt checkbox on patron editor
+
+ This patch updates the patron editor so that the checkbox
+ for setting whether the user wishes to get email checkout
+ receipts by default is moved next to the email address
+ input.
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+13 2 Open-ILS/src/templates/staff/circ/patron/t_edit.tt2
+
+commit f8422d9abd41f9b10b1b1cc4cc824e0eaef5b84e
+Author: Mike Rylander <miker@esilibrary.com>
+Date: Wed Aug 3 16:51:54 2016 -0400
+
+ LP#1356477: add quick receipt button
+
+ This patch adds a new button to the webstaff checkout page
+ called Quick Receipt. If the button itself is pushed, a
+ receipt containing the current checkouts is either printed
+ or emailed, depending on the user's preference. If the
+ drop-down portion of the button is used, staff members can
+ override the user's default preference to print or email
+ the receipt.
+
+ The Quick Receipt button is enabled only if at least one
+ checkout has been made during the current session.
+
+ Note that email receipts is an option only when the patron
+ has an email address supplied.
+
+ An icon next to the Quick Receipt button will be either a
+ printer or an envelope depending on the user's preferred
+ receipt setting.
+
+ This patch also modifies the "Done" button. If pressed, the session
+ is ended and the receipt is generated according to the user's
+ preferences, but the drop-down portion can be used to end
+ the session while letting the staff member choose how the
+ receipt is emitted.
+
+ If a receipt is emailed, a toast is displayed saying so.
+
+ Signed-off-by: Mike Rylander <miker@esilibrary.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+2 0 Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm
+25 4 Open-ILS/src/templates/staff/circ/patron/t_checkout.tt2
+2 0 Open-ILS/src/templates/staff/circ/share/circ_strings.tt2
+8 1 Open-ILS/web/js/ui/default/staff/circ/patron/app.js
+83 10 Open-ILS/web/js/ui/default/staff/circ/patron/checkout.js
+1 0 Open-ILS/web/js/ui/default/staff/services/user.js
+2 0 Open-ILS/web/js/ui/default/staff/test/karma.conf.js
+
+commit 9d1d36d3d56dcbe46d462ce8e431911df7b7166b
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Wed Aug 3 15:38:49 2016 -0400
+
+ LP#1356477: teach OPAC patron registration form about staged user (opt-in) settings
+
+ This patch causes a checkbox to be added for each user setting
+ that controls opt-in for active Action/Trigger event definitions. In
+ the specific context of email checkout receipts, this means that
+ a patron who is self-registering can elect to get email checkout
+ receipts by default.
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+52 2 Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Register.pm
+15 0 Open-ILS/src/templates/opac/register.tt2
+
+commit aa47fc5fdc1a5a9f3889fc3f67588739ba9e1700
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Wed Aug 3 15:36:18 2016 -0400
+
+ LP#1356477: teach webstaff patron editor about staged user settings
+
+ This patch also fixes a bug that preferred the webstaff patron editor
+ from successfully removing a staged patron upon completing the
+ registration of the patron.
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+5 1 Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js
+
+commit f3d2d070e8ca3a8b12a820489ee6caff8dc1c7e9
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Wed Aug 3 15:37:39 2016 -0400
+
+ LP#1356477: create new staging table for user settings
+
+ This patch creates a new table called staging.setting_stage
+ that allows for storing user settings when a patron uses
+ (for example) the self-registration page.
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+11 0 Open-ILS/examples/fm_IDL.xml
+17 3 Open-ILS/src/perlmods/lib/OpenILS/Application/Actor/Stage.pm
+9 0 Open-ILS/src/sql/Pg/015.schema.staging.sql
+12 0 Open-ILS/src/sql/Pg/upgrade/YYYY.schema.staging-user-setting.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/YYYY.schema.staging-user-setting.sql
+
+commit 7e3a8e2c61f4ee24317d11d478930851671b1c1d
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Mon Aug 8 16:50:08 2016 -0400
+
+ LP#1356477: add ability to unconditionally send email
+
+ This patch defines and uses an
+ open-ils.trigger.event.autocreate.ignore_opt_in method that does what
+ it says on the tin; the caller is reponsible for not abusing this.
+
+ This supports a use case in the webstaff checkout interface where staff
+ can choose to have the receipt be emailed, provided that the patron
+ record has an email address defined, even if the user setting to
+ email receipts by default is not set. (It is assumed that the staff
+ member would have gotten permission from the patron on the spot.)
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1 1 Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/CircNotify.pm
+9 1 Open-ILS/src/perlmods/lib/OpenILS/Application/Trigger.pm
+
+commit 53fc56475feedb6433a28f5c49096de7a46d87a9
+Author: Mike Rylander <miker@esilibrary.com>
+Date: Wed Aug 3 12:45:10 2016 -0400
+
+ LP#1356477: business logic for email checking receipts
+
+ This patch adds two methods, open-ils.circ.checkout.batch_notify
+ and open-ils.circ.checkout.batch_notify.session, that when passed
+ a set of circulation IDs, creates A/T events for the
+ checkout notification hooks. In the specific case of the email
+ checkout receipts feature, the seed data contains a stock
+ event that would send out emails, but it is conceivable
+ that other forms of notification could be done by defining
+ A/T events appropriately.
+
+ Signed-off-by: Mike Rylander <miker@esilibrary.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+3 0 Open-ILS/src/extras/ils_events.xml
+1 0 Open-ILS/src/perlmods/lib/OpenILS/Application/Circ.pm
+145 0 Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/CircNotify.pm
+ create mode 100644 Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/CircNotify.pm
+
+commit b09ad8fd9ccf37b374ddf9840cf20fc63f45a624
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Wed Aug 3 12:18:19 2016 -0400
+
+ LP#1356477: seed data for email checkout receipts
+
+ This patch adds seed data for email checkout receipts,
+ including:
+
+ - The action/trigger hooks circ.checkout.batch_notify
+ and circ.checkout.batch_notify.session.
+ - The default event definition
+ - The circ.send_email_checkout_receipts (Email checkout receipts by
+ default?) user setting.
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+ Conflicts:
+ Open-ILS/src/sql/Pg/950.data.seed-values.sql
+
+102 0 Open-ILS/src/sql/Pg/950.data.seed-values.sql
+103 0 Open-ILS/src/sql/Pg/upgrade/XXXX.data.email-checkout-receipt.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.email-checkout-receipt.sql
+
+commit be0ed357743e8b36f13fe38a9127dc8bd0f4172e
+Author: Ben Shum <ben@evergreener.net>
+Date: Tue Jul 5 13:03:57 2016 -0400
+
+ LP#1603708: Remove support for Ubuntu 12.04 Precise
+
+ With support for Ubuntu 16.04 Xenial in place, remove the oldest LTS, which is
+ Ubuntu 12.04 Precise.
+
+ Signed-off-by: Ben Shum <ben@evergreener.net>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1 11 Open-ILS/src/extras/Makefile.install
+1 1 Open-ILS/src/extras/install/Makefile.common
+0 148 Open-ILS/src/extras/install/Makefile.ubuntu-precise
+7 14 docs/installation/server_installation.txt
+1 2 docs/installation/server_upgrade.txt
+ delete mode 100644 Open-ILS/src/extras/install/Makefile.ubuntu-precise
+
+commit 7bdfe9f5a2e8771c481bf8e15ad7da350b654533
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Wed Aug 24 14:55:29 2016 -0400
+
+ Stamping upgrade script for badge seed data
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1 1 Open-ILS/src/sql/Pg/002.schema.config.sql
+8 0 Open-ILS/src/sql/Pg/upgrade/0995.data.popularity-badge-seed-data.sql
+0 8 Open-ILS/src/sql/Pg/upgrade/XXXX.data.popularity-badge-seed-data.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0995.data.popularity-badge-seed-data.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.popularity-badge-seed-data.sql
+
+commit 6d176feb4e4bbfc67e9c4179cd7e446fd148fd4d
+Author: Kathy Lussier <klussier@masslnc.org>
+Date: Tue Aug 23 16:01:35 2016 -0400
+
+ LP#1614237: Popularity badge seed data
+
+ Adding popularity badge seed data for a badge based on Holds Requested over the
+ past 5 years.
+
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+4 0 Open-ILS/src/sql/Pg/950.data.seed-values.sql
+8 0 Open-ILS/src/sql/Pg/upgrade/XXXX.data.popularity-badge-seed-data.sql
+3 0 docs/RELEASE_NOTES_NEXT/OPAC/popularity-rating.txt
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.popularity-badge-seed-data.sql
+
+commit fd725a7eb939fedb31f6eb13066f45b35baabb9c
+Author: Kathy Lussier <klussier@masslnc.org>
+Date: Wed Aug 17 18:29:09 2016 -0400
+
+ LP#1614290: Add badge_score_generator to example crontab
+
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+3 0 Open-ILS/examples/crontab.example
+
+commit 9fc06033c0805b3f1832e74c0953d243d1a9465d
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Wed Aug 24 14:51:32 2016 -0400
+
+ Moving function creation to later in the schema def, where its deps exist.
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+0 20 Open-ILS/src/sql/Pg/002.schema.config.sql
+20 0 Open-ILS/src/sql/Pg/005.schema.actors.sql
+
+commit 12159383d46bf76db3e710a689ad8b5140436007
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Wed Aug 24 12:56:28 2016 -0400
+
+ Stamping upgrade script for authority edit changes and propagation improvement
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1 1 Open-ILS/src/sql/Pg/002.schema.config.sql
+144 0 Open-ILS/src/sql/Pg/upgrade/0994.schema.authority-propage-edit-date.sql
+0 142 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.authority-propage-edit-date.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0994.schema.authority-propage-edit-date.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.authority-propage-edit-date.sql
+
+commit 84bed711249098679ae25f83eeb588871022ed19
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Wed Aug 24 11:38:49 2016 -0400
+
+ LP#1588948: Only attempt a bib update if the heading changes
+
+ This should significantly reduce the churn on bibs and the time to save
+ an authority where the heading that would propagate to bibs has not changed.
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+2 2 Open-ILS/src/sql/Pg/999.functions.global.sql
+82 2 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.authority-propage-edit-date.sql
+
+commit d61a652d97339961fd4a65bf27c77f4bc1314ffb
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Mon Jun 13 13:57:30 2016 -0400
+
+ LP#1588948 Auth propagate bib meta on change only
+
+ Only update bib record editor and edit_date if an authority record
+ change propagation resulted in a modified bib record.
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+9 2 Open-ILS/src/sql/Pg/999.functions.global.sql
+20 1 Open-ILS/src/sql/Pg/t/authority-update-bib-propagation.pg
+9 2 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.authority-propage-edit-date.sql
+
+commit 8e959742b7751403e942694d1123a3f38cbbb239
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Mon Jun 6 10:19:30 2016 -0400
+
+ LP#1588948 Release notes (auth prop. bib edit[or|_date])
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+16 0 docs/RELEASE_NOTES_NEXT/Cataloging/auth_prop_bib_update.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/auth_prop_bib_update.adoc
+
+commit 7605ed8a65a2151e42a3e8c20cd8640f81fab962
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Mon Jun 6 11:14:47 2016 -0400
+
+ LP#1588948 Authority propagation PGTAP test
+
+ Adds a new general purpose authority->bib propagation pgtap test,
+ covering basic propagation and editor / edit_date propagation.
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+105 0 Open-ILS/src/sql/Pg/t/authority-update-bib-propagation.pg
+ create mode 100644 Open-ILS/src/sql/Pg/t/authority-update-bib-propagation.pg
+
+commit 28d9ccf8df4cd3e9989d91e3053c26aca6a48e76
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Fri Jun 3 15:16:58 2016 -0400
+
+ LP#1588948 Propagate authority->bib edit[or|_date]
+
+ Adds a new global flag 'ingest.disable_authority_auto_update_bib_meta',
+ which is disabled by default.
+
+ When disabled, the 'editor' and 'edit_date' columns on bib records
+ updated via authority field propagation are updated to the value of the
+ editor on the authority record and NOW(), respectively.
+
+ When enabled, editor and edit_date are not modified.
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+12 0 Open-ILS/src/sql/Pg/950.data.seed-values.sql
+32 6 Open-ILS/src/sql/Pg/999.functions.global.sql
+55 0 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.authority-propage-edit-date.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.authority-propage-edit-date.sql
+
+commit 95ea3d5223963777f8d76d11ab0dd7e4eeeeceff
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Wed Aug 24 12:38:58 2016 -0400
+
+ Stamping upgrade script for transient usr_activity
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1 1 Open-ILS/src/sql/Pg/002.schema.config.sql
+35 0 Open-ILS/src/sql/Pg/upgrade/0993.schema.usr_activity_transient.sql
+0 35 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.usr_activity_transient.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0993.schema.usr_activity_transient.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.usr_activity_transient.sql
+
+commit cfad22b42c2b3bbe04697a31644c925eff8e6a1a
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Fri Apr 15 17:07:02 2016 -0400
+
+ LP#1570909 User activity purge release notes
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Chris Sharp <csharp@georgialibraries.org>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+29 0 docs/RELEASE_NOTES_NEXT/Administration/user-activity-purge.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Administration/user-activity-purge.adoc
+
+commit fc5b3ec873215363be00ca4ff51ccd4a42403280
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Fri Apr 15 16:54:48 2016 -0400
+
+ LP#1570909 User activity purge pgtap test
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Chris Sharp <csharp@georgialibraries.org>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+68 0 Open-ILS/src/sql/Pg/live_t/purge-user-activity.pg
+ create mode 100644 Open-ILS/src/sql/Pg/live_t/purge-user-activity.pg
+
+commit ea8b2ae34dee14d15f4958ced3dadbdc4ea8ebbe
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Fri Apr 15 16:26:57 2016 -0400
+
+ LP#1570909 User activity purge function
+
+ Utility function for removing all activity entries by activity type,
+ except for the most recent entry per user. This is primarily useful
+ when cleaning up rows prior to setting the transient flag on an
+ activity type to true. It allows for immediate cleanup of data (e.g.
+ for patron privacy) and lets admins control when the data is deleted,
+ which could be useful for huge activity tables.
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Chris Sharp <csharp@georgialibraries.org>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+20 0 Open-ILS/src/sql/Pg/002.schema.config.sql
+25 0 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.usr_activity_transient.sql
+
+commit b1f4d599b87a375ab43b7439dcc2ba1208c7c5be
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Fri Apr 15 11:23:33 2016 -0400
+
+ LP#1570909 User activity transient default
+
+ Only retain the most recent user activity entry (per activity type) by
+ default.
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Chris Sharp <csharp@georgialibraries.org>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1 1 Open-ILS/src/sql/Pg/002.schema.config.sql
+10 0 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.usr_activity_transient.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.usr_activity_transient.sql
+
+commit 40e20683c5d2aa78a128ed019be163349545a4d7
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Wed Aug 24 12:17:11 2016 -0400
+
+ Stamping upgrade of is_available branch
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1 1 Open-ILS/src/sql/Pg/002.schema.config.sql
+231 0 Open-ILS/src/sql/Pg/upgrade/0992.schema.copy_status_co_allowed.sql
+0 229 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.copy_status_co_allowed.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0992.schema.copy_status_co_allowed.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.copy_status_co_allowed.sql
+
+commit d60ea525afa3e4318f474f481e9c8b911ff39e99
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Wed Aug 24 10:26:28 2016 -0400
+
+ LP#1464709 Copy status is_available release notes
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+17 0 docs/RELEASE_NOTES_NEXT/Circulation/copy-status-is-avail.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/copy-status-is-avail.adoc
+
+commit f0aa5d587467a42e61669f1d3e417489e57813d3
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Tue Aug 23 16:59:33 2016 -0400
+
+ LP#1464709: Disentangle on-holds-shelf from is_available
+
+ Avoid treating On-Holds-Shelf items as is_available so they do not
+ appear in the catalog as #available.
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+1 1 Open-ILS/src/sql/Pg/100.circ_matrix.sql
+1 1 Open-ILS/src/sql/Pg/950.data.seed-values.sql
+2 2 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.copy_status_co_allowed.sql
+
+commit fed65df3c669e1337f187d533e9033a697d6b263
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Thu Aug 18 09:52:20 2016 -0400
+
+ LP#1464709: teach QP about is_available statuses
+
+ We look them up, cache them, and use them for the #available modifier.
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+11 2 Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/metabib.pm
+
+commit 2c40b84273316525de7ef65ca6ceca9f939c7052
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Thu Aug 27 17:24:38 2015 -0400
+
+ LP#1464709 Rename checkout_ok to is_available
+
+ And update pgptap to check for only 2 is_available statuses (not
+ on-holds shelf).
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1 1 Open-ILS/examples/fm_IDL.xml
+1 1 Open-ILS/src/sql/Pg/002.schema.config.sql
+1 1 Open-ILS/src/sql/Pg/100.circ_matrix.sql
+3 3 Open-ILS/src/sql/Pg/950.data.seed-values.sql
+4 4 Open-ILS/src/sql/Pg/live_t/lp1464709-copy-stat-co-ok.live.pg
+3 3 Open-ILS/src/sql/Pg/t/lp1464709-copy-stat-co-ok.pg
+3 3 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.copy_status_co_allowed.sql
+3 3 Open-ILS/web/conify/global/config/copy_status.html
+1 1 Open-ILS/web/js/dojo/openils/conify/nls/conify.js
+
+commit 3c37c14663fbf9eea99e2bcd82773a229d02bf1c
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Mon Jun 15 18:09:01 2015 -0400
+
+ LP#1464709 Non-standard copy status pgtap tests
+
+ Includes unit test plus a set of live tests.
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+48 0 Open-ILS/src/sql/Pg/live_t/lp1464709-copy-stat-co-ok.live.pg
+29 0 Open-ILS/src/sql/Pg/t/lp1464709-copy-stat-co-ok.pg
+ create mode 100644 Open-ILS/src/sql/Pg/live_t/lp1464709-copy-stat-co-ok.live.pg
+ create mode 100644 Open-ILS/src/sql/Pg/t/lp1464709-copy-stat-co-ok.pg
+
+commit 31480730b2458e8915660f4fb78893418ccdf9cb
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Wed Jun 3 19:30:40 2015 -0400
+
+ LP#1464709 Seamless non-standard copy status checkout
+
+ Add a new boolean configuration option to copy statuses which allow such
+ copies to be checked out without requiring an alert or override.
+
+ New column is config.copy_status.checkout_ok. Any status with this
+ boolean enabled will be treated the same as Available, Reshelving, and
+ Holds Shelf status copies in that the status will be considered
+ checkout-able.
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+2 1 Open-ILS/examples/fm_IDL.xml
+2 1 Open-ILS/src/sql/Pg/002.schema.config.sql
+2 1 Open-ILS/src/sql/Pg/100.circ_matrix.sql
+3 3 Open-ILS/src/sql/Pg/950.data.seed-values.sql
+229 0 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.copy_status_co_allowed.sql
+12 0 Open-ILS/web/conify/global/config/copy_status.html
+1 0 Open-ILS/web/js/dojo/openils/conify/nls/conify.js
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.copy_status_co_allowed.sql
+
+commit 51759b283ca19b15a252faa830c2e4b4a3199695
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Wed Aug 24 11:58:56 2016 -0400
+
+ Stamping upgrade script for ranked-volumes update
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1 1 Open-ILS/src/sql/Pg/002.schema.config.sql
+98 0 Open-ILS/src/sql/Pg/upgrade/0991.function.unapi.ranked_volumes.sql
+0 98 Open-ILS/src/sql/Pg/upgrade/XXXX.function.unapi.ranked_volumes.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0991.function.unapi.ranked_volumes.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.function.unapi.ranked_volumes.sql
+
+commit db9a0bb41e4bd569fbbdc7e4a57778da98f69604
+Author: Dan Wells <dbw2@calvin.edu>
+Date: Tue May 10 15:41:54 2016 -0400
+
+ LP#1315552 Don't use circ_lib name in ranked_volumes
+
+ ranked_volumes() is supposed to return only volume info, but the name
+ returned was from copy.circ_lib, not acn.owning_lib, so it could result
+ in duplicate rows if circ_lib's varied across a single acn.
+
+ Let's just use the owning_lib name instead. Note: the circ_lib join
+ is left undisturbed to keep the current sorting behavior
+ (necessary?).
+
+ Signed-off-by: Dan Wells <dbw2@calvin.edu>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+3 2 Open-ILS/src/sql/Pg/990.schema.unapi.sql
+98 0 Open-ILS/src/sql/Pg/upgrade/XXXX.function.unapi.ranked_volumes.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.function.unapi.ranked_volumes.sql
+
+commit f5867b209304ecaf25ce94bf538299d9d15cc34e
+Author: Jason Boyer <jboyer@library.in.gov>
+Date: Fri May 6 14:08:48 2016 -0400
+
+ LP1259196: Use Location as Workstation on Login
+
+ When using a SIPServer with LP1579144 applied, use the
+ Location (CP) field of the Login (93) message as a
+ workstation name. This allows you to determine which
+ selfcheck performed which circulation.
+
+ Signed-off-by: Jason Boyer <jboyer@library.in.gov>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+16 8 Open-ILS/src/perlmods/lib/OpenILS/SIP.pm
+8 0 docs/RELEASE_NOTES_NEXT/SIP/SIP_Workstation_Name.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/SIP/SIP_Workstation_Name.adoc
+
+commit 58fc8f0c8383c60299186debb54730f8883394ac
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Wed Aug 24 10:49:41 2016 -0400
+
+ Correct upgrade script
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1 1 Open-ILS/src/sql/Pg/upgrade/0990.data.copy-count-badge.sql
+
+commit 36f331390345e05e264e96a0d70d598e1f2bc263
+Author: Kathy Lussier <klussier@masslnc.org>
+Date: Thu Aug 18 21:10:43 2016 -0400
+
+ LP#1612274: Release notes for improved holds interfaces
+
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+14 0 docs/RELEASE_NOTES_NEXT/OPAC/improved-myopac-holds-screens.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/improved-myopac-holds-screens.adoc
+
+commit 504076521062d6b52842e137e79877b1abf8f2a5
+Author: Kathy Lussier <klussier@masslnc.org>
+Date: Thu Aug 11 13:24:00 2016 -0400
+
+ LP#1612274: Add distinct classes for hold statuses
+
+ With more data in the My Account hold status field, libraries may want to
+ style some statuses or dates differently so that they pop out to the user. Each
+ hold status and date now has its own class for more flexible styling.
+
+ The available status also now has a green, bold font and the suspended status
+ has a red, bold font.
+
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+10 0 Open-ILS/src/templates/opac/css/style.css.tt2
+51 39 Open-ILS/src/templates/opac/parts/hold_status.tt2
+
+commit b39eaf4328563a8965a2fabfdad52b898795d116
+Author: Kathy Lussier <klussier@masslnc.org>
+Date: Wed Aug 10 23:41:51 2016 -0400
+
+ LP#1612274: Improve display of holds status in My Account
+
+ Collapse the data contained in the Activate, Active, and Date Fulfilled columns
+ into the status filed on the My Account holds and holds history interfaces.
+ This change cleans up the display and removes extraneous information that the
+ user doesn't need to see.
+
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+4 0 Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Holds.pm
+2 7 Open-ILS/src/templates/opac/css/style.css.tt2
+5 27 Open-ILS/src/templates/opac/myopac/hold_history.tt2
+0 10 Open-ILS/src/templates/opac/myopac/holds.tt2
+26 5 Open-ILS/src/templates/opac/parts/hold_status.tt2
+
+commit 2888b409b32cfe541247cc2e39ba23d0e19170c6
+Author: Kathy Lussier <klussier@masslnc.org>
+Date: Mon Aug 22 14:02:58 2016 -0400
+
+ LP#1613730: Stamping upgrade script for copy count badge
+
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+
+1 1 Open-ILS/src/sql/Pg/002.schema.config.sql
+36 0 Open-ILS/src/sql/Pg/upgrade/0990.data.copy-count-badge.sql
+0 34 Open-ILS/src/sql/Pg/upgrade/XXXX.data.copy-count-badge.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0990.data.copy-count-badge.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.copy-count-badge.sql
+
+commit da240e76b8a16cf7e079ab09b1fd8571a4d68818
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Thu Aug 18 12:58:25 2016 -0400
+
+ LP#1613730: Add a "Copy Count" rating function for badges
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+
+31 1 Open-ILS/src/sql/Pg/220.schema.rating.sql
+34 0 Open-ILS/src/sql/Pg/upgrade/XXXX.data.copy-count-badge.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.data.copy-count-badge.sql
+
+commit c597e8f644afc216f7ed86e01765da12a79f6780
+Author: Chris Sharp <csharp@georgialibraries.org>
+Date: Sat Aug 20 14:52:15 2016 -0400
+
+ LP#1586221 - Remove "no spaces" message from login form.
+
+ Since the fix to bug 1086064 removes any spaces entered into
+ the login form, it is now inaccurate to require the user to type
+ their cards with no spaces (since most library cards have spaces
+ in the number on the physical card).
+
+ Signed-off-by: Chris Sharp <csharp@georgialibraries.org>
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+
+1 1 Open-ILS/src/templates/opac/parts/login/form.tt2
+
+commit 079d0ed5f08da74201b79f53275f559aba8a19f2
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Mon Aug 15 14:07:21 2016 -0400
+
+ LP#1613381: combine two tables in patron notification preferences
+
+ This patch consolidates the two tables in the public catalog
+ notification preferences page into one table, as patrons have
+ no reason to care about the distinction between A/T opt-in
+ settings and the hold, phone, and SMS user settings.
+
+ This patch also adds a <label> element for opt-in setting
+ names.
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+12 23 Open-ILS/src/templates/opac/myopac/prefs_notify.tt2
+7 0 docs/RELEASE_NOTES_NEXT/OPAC/combine_notice_prefs_tables.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/combine_notice_prefs_tables.adoc
+
+commit 4e4525c85e795a42231ffbb0e8e10c027d50a682
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Wed Aug 17 10:53:19 2016 -0400
+
+ LP#1476049: disable serve-cgi-bin Apache config on Jessie and Xenial
+
+ This patch ensures that the stock Apache configuration
+ "serve-cgi-bin" is disabled when installing on Debian Jessie
+ and Ubuntu Xenial, as otherwise the default cgi-bin location
+ can override what Evergreen specifies for offline.pl.
+
+ To test:
+
+ [1] Run the Makefile.install step on Jessie or Xenial; verify
+ that there is no /etc/apache2/conf-enabled/serve-cgi-bin.conf
+ symlink.
+ [2] Proceed with the rest of the Evergreen installation; verify
+ that the Apache error log doesn't contain a warning like this:
+
+ "The Alias directive in /etc/apache2/sites-enabled/eg.conf ...
+ will probably never match because it overlaps an earlier
+ ScriptAlias."
+
+ [3] For extra credit, verify that one can access offline circulation
+ sessions.
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+3 0 Open-ILS/src/extras/install/Makefile.debian-jessie
+3 0 Open-ILS/src/extras/install/Makefile.ubuntu-xenial
+
+commit 3d78e822af3a6337430825dcf328889ea254c6b6
+Author: Michele Morgan <mmorgan@noblenet.org>
+Date: Tue Aug 16 14:47:43 2016 -0400
+
+ LP#1583729 Item status screen column options do not include age protection
+
+ Adds the age_protect field to several missing copy interfaces:
+
+ XUL client:
+
+ - Item status list view column picker
+ - Item status alternate view
+ - Holdings Maintenance column picker
+
+ Web client:
+
+ - Item status alternate view
+ - Holdings view column picker
+
+ Also addresses an issue with displaying the circ modifier in some item
+ interfaces.
+
+ Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1 0 Open-ILS/src/templates/staff/cat/catalog/t_holdings.tt2
+2 0 Open-ILS/src/templates/staff/cat/item/t_summary_pane.tt2
+1 1 Open-ILS/web/js/ui/default/staff/cat/item/app.js
+1 1 Open-ILS/web/js/ui/default/staff/cat/services/holdings.js
+1 0 Open-ILS/web/opac/locale/en-US/lang.dtd
+1 0 Open-ILS/xul/staff_client/server/cat/copy_browser.js
+6 1 Open-ILS/xul/staff_client/server/circ/alternate_copy_summary.js
+2 1 Open-ILS/xul/staff_client/server/circ/alternate_copy_summary.xul
+15 0 Open-ILS/xul/staff_client/server/circ/util.js
+1 0 Open-ILS/xul/staff_client/server/locale/en-US/circ.properties
+1 0 Open-ILS/xul/staff_client/server/locale/en-US/common.properties
+
+commit 059411ba21bb1dffb2d2db351ce1eddfc540fb8f
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Fri Aug 5 12:39:54 2016 -0400
+
+ LP#1527694 Webstaff egHatch supports 'LoginSession' storage
+
+ Adds support for a class of cached value (AKA "LoginSession" items)
+ that are cleared when either the user logs out or the browser is closed.
+ Values are stored as cookies.
+
+ Authentication tokens and "retrieve last patron" data are now stored as
+ "LoginSession" items.
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+6 6 Open-ILS/web/js/ui/default/staff/circ/patron/app.js
+17 7 Open-ILS/web/js/ui/default/staff/services/auth.js
+85 3 Open-ILS/web/js/ui/default/staff/services/hatch.js
+
+commit 350500afb00a0a2b244ef93d5cabb9549ffa59cd
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Thu Aug 4 12:34:56 2016 -0400
+
+ LP#1527694 Webstaff clear last patron
+
+ Store most recent patron ID via cookie instead of localStorage so the
+ value can expire when then browser is closed.
+
+ Adds angular-cookies (ngCookies) dependency.
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+ Conflicts:
+ Open-ILS/web/js/ui/default/staff/bower.json
+
+1 0 Open-ILS/src/templates/staff/base_js.tt2
+2 0 Open-ILS/web/js/ui/default/staff/Gruntfile.js
+2 1 Open-ILS/web/js/ui/default/staff/bower.json
+6 6 Open-ILS/web/js/ui/default/staff/circ/patron/app.js
+1 1 Open-ILS/web/js/ui/default/staff/services/core.js
+1 0 Open-ILS/web/js/ui/default/staff/test/karma.conf.js
+
+commit f6eeb168a73ac86506890997ae6f426d8ddaedbe
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Thu Aug 4 17:56:32 2016 -0400
+
+ LP#1522635 Webstaff lost (etc.) checkout completes
+
+ Resolves an issue in the browser client where checkout of LOST
+ (and other non status='checked out' copies) failed to show the
+ open-circ-exists dialog. In short, when searching for an existing
+ open circulation, look for any open circulation linked to the copy,
+ regardless of the status of the copy.
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+6 12 Open-ILS/web/js/ui/default/staff/circ/services/circ.js
+
+commit 997a30a6973b9161c7336a086534c41810665f50
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Thu Aug 4 15:22:22 2016 -0400
+
+ LP#1464350 Webstaff home page catalog search
+
+ Search the catalog directly from the home/splash page in the browser
+ client.
+
+ A side effect of this commit is that it's now possible to jump directly
+ to a set of search results in the embedded catalog by going to:
+
+ /eg/staff/cat/catalog/results?<query-params>
+
+ E.g.
+
+ /eg/staff/cat/catalog/results?query=scores&qtype=subject
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+13 0 Open-ILS/src/templates/staff/t_splash.tt2
+12 4 Open-ILS/web/js/ui/default/staff/app.js
+21 0 Open-ILS/web/js/ui/default/staff/cat/catalog/app.js
+
+commit d78e8a4f5e3a9fa501573e7f26bf69de566632ad
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Wed Aug 10 12:10:58 2016 -0400
+
+ start adding form validation to receipt template editor
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+5 2 Open-ILS/src/templates/staff/css/style.css.tt2
+5 3 Open-ILS/src/templates/staff/reporter/t_edit_template.tt2
+
+commit b1f1f64b932bf113c7e6ddf80ee66b892dc6fdfd
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Mon Aug 8 17:05:10 2016 -0400
+
+ Ignore null fleshed objects in autofleshing grid columns
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+2 0 Open-ILS/web/js/ui/default/staff/services/grid.js
+
+commit 804a907f4b21132c2b5c7865eed955df2a5e3814
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Mon Aug 8 15:09:43 2016 -0400
+
+ Repair output popup, and add Reports to the splash page
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+6 0 Open-ILS/src/templates/staff/t_splash.tt2
+1 1 Open-ILS/web/reports/oils_rpt_folder_window.js
+
+commit 59af472f0726b7ffdc89c66dab685fd3e686c9f7
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Mon Aug 8 14:15:09 2016 -0400
+
+ Report Templates!
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+22 14 Open-ILS/examples/fm_IDL.xml
+5 0 Open-ILS/src/perlmods/lib/OpenILS/WWW/IDL2js.pm
+0 0 Open-ILS/src/templates/staff/css/reporter.css
+21 0 Open-ILS/src/templates/staff/reporter/index.tt2
+180 0 Open-ILS/src/templates/staff/reporter/share/report_strings.tt2
+233 0 Open-ILS/src/templates/staff/reporter/t_edit_template.tt2
+1 0 Open-ILS/src/templates/staff/reporter/t_legacy.tt2
+1 1 Open-ILS/src/templates/staff/share/t_confirm_dialog.tt2
+23 0 Open-ILS/src/templates/staff/share/t_select_dialog.tt2
+1 1 Open-ILS/web/js/ui/default/staff/bower.json
+440 0 Open-ILS/web/js/ui/default/staff/reporter/services/template.js
+600 0 Open-ILS/web/js/ui/default/staff/reporter/template/app.js
+80 2 Open-ILS/web/js/ui/default/staff/services/idl.js
+72 9 Open-ILS/web/js/ui/default/staff/services/ui.js
+1 1 Open-ILS/xsl/fm_IDL2js.xsl
+ create mode 100644 Open-ILS/src/templates/staff/css/reporter.css
+ create mode 100644 Open-ILS/src/templates/staff/reporter/index.tt2
+ create mode 100644 Open-ILS/src/templates/staff/reporter/share/report_strings.tt2
+ create mode 100644 Open-ILS/src/templates/staff/reporter/t_edit_template.tt2
+ create mode 100644 Open-ILS/src/templates/staff/reporter/t_legacy.tt2
+ create mode 100644 Open-ILS/src/templates/staff/share/t_select_dialog.tt2
+ create mode 100644 Open-ILS/web/js/ui/default/staff/reporter/services/template.js
+ create mode 100644 Open-ILS/web/js/ui/default/staff/reporter/template/app.js
+
+commit 541921ab1de0a45002a501a2bea545c47f2c5252
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Mon Aug 8 14:10:32 2016 -0400
+
+ Let the legacy interface do the right thing when embedded in the web client
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+22 5 Open-ILS/web/reports/oils_rpt_folder_window.js
+2 1 Open-ILS/web/reports/oils_rpt_param_editor.js
+3 0 Open-ILS/web/reports/oils_rpt_utils.js
+
+commit 461eef4e0bd4caec45adafdce2ec9c8095a24256
+Author: Jason Etheridge <jason@esilibrary.com>
+Date: Mon Jul 11 15:57:48 2016 -0400
+
+ toward ou type dropdown
+
+12 0 Open-ILS/src/templates/staff/admin/actor/org_unit/t_main_tab.tt2
+
+commit d72697057908bbbecc961cc9a0eae421ab688c7d
+Author: Jason Etheridge <jason@esilibrary.com>
+Date: Mon Jul 11 14:52:53 2016 -0400
+
+ child node creation
+
+ Signed-off-by: Jason Etheridge <jason@esilibrary.com>
+
+8 0 Open-ILS/src/templates/staff/admin/actor/org_unit/t_main_tab.tt2
+14 4 Open-ILS/web/js/ui/default/staff/admin/actor/org_unit/app.js
+
+commit 60c2eb3b9137c7b07c1bdbb7c1cbd1ab598d0b5e
+Author: Jason Etheridge <jason@esilibrary.com>
+Date: Mon Jul 11 11:59:06 2016 -0400
+
+ change to delete to remove, since JS uses delete
+
+ Signed-off-by: Jason Etheridge <jason@esilibrary.com>
+
+1 1 Open-ILS/src/templates/staff/admin/actor/org_unit/t_main_tab.tt2
+1 1 Open-ILS/web/js/ui/default/staff/admin/actor/org_unit/app.js
+
+commit a2d1ab854f916606d9af3ce991c9601ff8c9897f
+Author: Jason Etheridge <jason@esilibrary.com>
+Date: Mon Jul 11 11:25:00 2016 -0400
+
+ UI tweak and org deletion
+
+ Signed-off-by: Jason Etheridge <jason@esilibrary.com>
+
+2 0 Open-ILS/src/templates/staff/admin/actor/org_unit/index.tt2
+23 3 Open-ILS/src/templates/staff/admin/actor/org_unit/t_main_tab.tt2
+16 2 Open-ILS/web/js/ui/default/staff/admin/actor/org_unit/app.js
+
+commit 4e911171a113e5d7562ed998229f108a9120badc
+Author: Jason Etheridge <jason@esilibrary.com>
+Date: Mon Jul 11 10:20:43 2016 -0400
+
+ toast, comments, logging
+
+ Signed-off-by: Jason Etheridge <jason@esilibrary.com>
+
+6 0 Open-ILS/src/templates/staff/admin/actor/org_unit/index.tt2
+1 1 Open-ILS/src/templates/staff/admin/actor/org_unit/t_main_tab.tt2
+14 11 Open-ILS/web/js/ui/default/staff/admin/actor/org_unit/app.js
+
+commit 872c8c2f0d98016fc1639dcc0d49300ae03e1660
+Author: Jason Etheridge <jason@esilibrary.com>
+Date: Fri Jun 10 14:22:45 2016 -0400
+
+ programmatic selection of tree node still not working
+
+ Signed-off-by: Jason Etheridge <jason@esilibrary.com>
+
+13 2 Open-ILS/web/js/ui/default/staff/admin/actor/org_unit/app.js
+
+commit aca3dd932957a062eb5f6385bb89d3dfae08d011
+Author: Jason Etheridge <jason@esilibrary.com>
+Date: Fri Jun 10 14:17:13 2016 -0400
+
+ refactor
+
+ Signed-off-by: Jason Etheridge <jason@esilibrary.com>
+
+30 25 Open-ILS/web/js/ui/default/staff/admin/actor/org_unit/app.js
+
+commit d914aab30ba0ccf75a081aa8dfcf157e8385c1e1
+Author: Jason Etheridge <jason@esilibrary.com>
+Date: Fri Jun 10 14:16:22 2016 -0400
+
+ getting changes to stick within a session
+
+ Signed-off-by: Jason Etheridge <jason@esilibrary.com>
+
+15 3 Open-ILS/web/js/ui/default/staff/admin/actor/org_unit/app.js
+
+commit 297a0b142326320f54f83b1f3d9d7f7c9a0b495a
+Author: Jason Etheridge <jason@esilibrary.com>
+Date: Fri Jun 10 12:37:01 2016 -0400
+
+ better stub out the other tabs, and try to select CONS by default
+
+ Signed-off-by: Jason Etheridge <jason@esilibrary.com>
+
+1 0 Open-ILS/src/templates/staff/admin/actor/org_unit/t_addresses_tab.tt2
+1 0 Open-ILS/src/templates/staff/admin/actor/org_unit/t_hours_tab.tt2
+2 2 Open-ILS/src/templates/staff/admin/actor/org_unit/t_index.tt2
+1 0 Open-ILS/web/js/ui/default/staff/admin/actor/org_unit/app.js
+
+commit efa65bd5c7640758585070e66819f06e82522b78
+Author: Jason Etheridge <jason@esilibrary.com>
+Date: Wed May 11 15:17:47 2016 -0400
+
+ Toward an Angular replacement for Org Units Conify
+
+ Signed-off-by: Jason Etheridge <jason@esilibrary.com>
+
+15 0 Open-ILS/src/templates/staff/admin/actor/org_unit/index.tt2
+0 0 Open-ILS/src/templates/staff/admin/actor/org_unit/t_addresses_tab.tt2
+0 0 Open-ILS/src/templates/staff/admin/actor/org_unit/t_hours_tab.tt2
+51 0 Open-ILS/src/templates/staff/admin/actor/org_unit/t_index.tt2
+46 0 Open-ILS/src/templates/staff/admin/actor/org_unit/t_main_tab.tt2
+7 0 Open-ILS/src/templates/staff/css/admin.css.tt2
+87 0 Open-ILS/web/js/ui/default/staff/admin/actor/org_unit/app.js
+ create mode 100644 Open-ILS/src/templates/staff/admin/actor/org_unit/index.tt2
+ create mode 100644 Open-ILS/src/templates/staff/admin/actor/org_unit/t_addresses_tab.tt2
+ create mode 100644 Open-ILS/src/templates/staff/admin/actor/org_unit/t_hours_tab.tt2
+ create mode 100644 Open-ILS/src/templates/staff/admin/actor/org_unit/t_index.tt2
+ create mode 100644 Open-ILS/src/templates/staff/admin/actor/org_unit/t_main_tab.tt2
+ create mode 100644 Open-ILS/web/js/ui/default/staff/admin/actor/org_unit/app.js
+
+commit 4e93a8bd0d240a10ec545c927ca92864efba95e9
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Fri Jun 10 18:21:31 2016 -0400
+
+ webstaff: add admin interface for MARC tag tables
+
+ This is a simple interface using eg-edit-fm-record to start;
+ more work will be required to better deal with the semantics
+ for overriding tag definitions at various levels of the OU
+ hierarchy.
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+53 0 Open-ILS/src/templates/staff/admin/server/config/marc_field.tt2
+2 1 Open-ILS/src/templates/staff/admin/server/t_splash.tt2
+88 0 Open-ILS/web/js/ui/default/staff/admin/server/config/marc_field.js
+ create mode 100644 Open-ILS/src/templates/staff/admin/server/config/marc_field.tt2
+ create mode 100644 Open-ILS/web/js/ui/default/staff/admin/server/config/marc_field.js
+
+commit 3bf01639f186522674cd6d1f347b713f0d5766e8
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Fri Jun 10 18:19:17 2016 -0400
+
+ webstaff: a couple strings for a generic record deletion dialog
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+2 0 Open-ILS/src/templates/staff/base_js.tt2
+
+commit eabda938c992ae2269ec793eefd2ec0980f100ed
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Fri Jun 10 18:14:20 2016 -0400
+
+ webstaff: new directive: egEditFmRecord
+
+ This implements a generic IDL record editor widget:
+
+ <eg-edit-fm-record
+ idl-class = "xyz"
+ mode = "update"
+ record-id = "223"
+ hidden-fields = "bar,baz"
+ readonly-fields = "quux"
+ required-fields = "foo"
+ is-required-override = "bundle_of_custom_functions"
+ on-save = "on_save_handler"
+ on-cancel = "on_cancel"
+ ></eg-edit-fm-record>
+
+ The mode can be either "create" or "update"; if it is "create",
+ then it is not necessary or desired to pass a record-id.
+
+ Currently eg-edit-fm-record expects to be invoked from
+ inside a uibModal.
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+62 0 Open-ILS/src/templates/staff/share/t_fm_record_editor.tt2
+187 0 Open-ILS/web/js/ui/default/staff/services/fm_record_editor.js
+ create mode 100644 Open-ILS/src/templates/staff/share/t_fm_record_editor.tt2
+ create mode 100644 Open-ILS/web/js/ui/default/staff/services/fm_record_editor.js
+
+commit d271b796cebc71e916e85249c15c2484444a390b
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Fri Jun 10 12:15:18 2016 -0400
+
+ IDL improvements for classes releated to MARC tag tables
+
+ In the course of building the admin interface for the
+ MARC tag tables, some deficiencies in the IDL were
+ run across. This patch fixes them.
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+15 15 Open-ILS/examples/fm_IDL.xml
+
+commit 2a8148341428dc0fc1c4947a148e5d996bc6db6b
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Fri May 13 11:51:42 2016 -0400
+
+ webstaff: fix typo in field name
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+1 1 Open-ILS/examples/fm_IDL.xml
+
+commit bface48e0fff0512d46dee412bc46e8454521c5a
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Wed May 25 13:14:44 2016 -0400
+
+ LP#1585369: Angular broke my copy editor!
+
+ It seems Angular 1.5 is either less flexible or less forgiving in its
+ ng-repeat implementation, and does not like an orderBy filter on object
+ iterators. Removing that, and the track by clause, allows the holdings
+ editor to render properly.
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1 1 Open-ILS/src/templates/staff/cat/volcopy/t_edit.tt2
+1 1 Open-ILS/web/js/ui/default/staff/cat/volcopy/app.js
+
+commit 28f7159c31279217d01258eb85d662fad2785680
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Tue May 17 22:09:34 2016 -0400
+
+ webstaff: circ audio alerts
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+19 1 Open-ILS/web/js/ui/default/staff/circ/services/circ.js
+4 0 Open-ILS/web/js/ui/default/staff/circ/services/holds.js
+1 0 Open-ILS/web/js/ui/default/staff/circ/services/transits.js
+
+commit 676fdff4e78bcf33eb4f8c488d8995fcf9f75f65
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Mon May 16 23:16:34 2016 -0400
+
+ webstaff: audio disable and testing options
+
+ For workstation admin UI.
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+24 0 Open-ILS/src/templates/staff/admin/workstation/t_splash.tt2
+17 0 Open-ILS/web/js/ui/default/staff/admin/workstation/app.js
+
+commit d02c84fce8a3e99ce7be5357277b5958d8b04183
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Sun May 15 12:51:24 2016 -0400
+
+ webstaff: egAudio HTML5 audio service
+
+ egCore.audio.play('audio.event.dot.path');
+
+ Service to look up audio URL's by key name. Supports fall-thru behavior
+ where 'foo.bar.baz' will fall-thru to 'foo.bar' and 'foo' depending on
+ whether an audio file is avaialable.
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+1 0 Open-ILS/src/templates/staff/base_js.tt2
+- - Open-ILS/web/audio/notifications/error.wav
+- - Open-ILS/web/audio/notifications/info.wav
+- - Open-ILS/web/audio/notifications/success.wav
+- - Open-ILS/web/audio/notifications/warning.wav
+1 0 Open-ILS/web/js/ui/default/staff/Gruntfile.js
+78 0 Open-ILS/web/js/ui/default/staff/services/audio.js
+5 2 Open-ILS/web/js/ui/default/staff/services/coresvc.js
+2 2 Open-ILS/web/js/ui/default/staff/test/karma.conf.js
+ create mode 100644 Open-ILS/web/audio/notifications/error.wav
+ create mode 100644 Open-ILS/web/audio/notifications/info.wav
+ create mode 100644 Open-ILS/web/audio/notifications/success.wav
+ create mode 100644 Open-ILS/web/audio/notifications/warning.wav
+ create mode 100644 Open-ILS/web/js/ui/default/staff/services/audio.js
+
+commit eb53b50cf844ba7bfe3bf5f069cd6a9d80be868e
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Thu May 12 12:27:11 2016 -0400
+
+ LP#1581126: webstaff: make egDateInput respect format.date OUS
+
+ This patch makes the egDateInput directive fetch the
+ date format from the format.date library setting. The
+ directive also now accepts a dateFormat attribute for cases
+ where there is a reason to override the library setting.
+
+ If no format is set via library setting or in how the
+ directive is invoked, the format defaults to "mediumDate",
+ e.g., "May 2, 1999".
+
+ To test:
+
+ [1] Open the webstaff patron registration form. Verify that
+ date widgets display the date in the format that
+ corresponds to the value of the format.date library setting
+ for the current work station, or (if the library setting
+ is not set, "Month day, year".
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+1 1 Open-ILS/src/templates/staff/share/t_datetime.tt2
+12 3 Open-ILS/web/js/ui/default/staff/services/ui.js
+
+commit cea022c407e4193dcf3fed6b9ca81edfe04c3038
+Author: Jason Etheridge <jason@esilibrary.com>
+Date: Thu May 12 11:51:09 2016 -0400
+
+ Add images for angular-tree-control to bower
+
+ Signed-off-by: Jason Etheridge <jason@esilibrary.com>
+
+21 0 Open-ILS/web/js/ui/default/staff/Gruntfile.js
+
+commit f20039da9caa3e43bf626b65b667516e4383b0d5
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Wed May 11 16:31:33 2016 -0400
+
+ webstaff: tweak legacy OU editor
+
+ This adds a CSS hack so that the right-hand pane of
+ the legacy OU editor is displayed when embedded in
+ the web staff client.
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+7 0 Open-ILS/web/conify/global/actor/org_unit.html
+
+commit cce69273995f6f6668e5f5a0c52cafd4ed20f54d
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Wed May 11 16:30:34 2016 -0400
+
+ webstaff: tweak permission group editor
+
+ This adds a couple hackish formating tweaks so that
+ the permission group editor works when embedded
+ in the web staff client.
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+9 1 Open-ILS/web/conify/global/permission/grp_tree.html
+
+commit 7292174f182bba027362946c0a4a47d3ba2534da
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Wed May 11 13:17:55 2016 -0400
+
+ webstaff: add server administration page
+
+ This patch adds a landing page for Server Administration and
+ code to embed all of the admin pages available under Serer
+ Administration in the XUL staff client.
+
+ TODO:
+
+ * fix the permission groups editor so that it works
+ when embedded in the web staff client
+ * refactor admin/local/app.js and admin/server/app.js to
+ unify some of the copy and pasting
+ * replace the embedded legacy OU editor with a new
+ angular one
+ * fixes some CSS issues that make text hard to read in
+ a few places
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+15 0 Open-ILS/src/templates/staff/admin/server/index.tt2
+78 0 Open-ILS/src/templates/staff/admin/server/t_splash.tt2
+6 0 Open-ILS/src/templates/staff/navbar.tt2
+80 0 Open-ILS/web/js/ui/default/staff/admin/server/app.js
+ create mode 100644 Open-ILS/src/templates/staff/admin/server/index.tt2
+ create mode 100644 Open-ILS/src/templates/staff/admin/server/t_splash.tt2
+ create mode 100644 Open-ILS/web/js/ui/default/staff/admin/server/app.js
+
+commit 84df55949e502b16c724fdfdcc8dcafa59dedd28
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Wed May 4 15:04:23 2016 -0400
+
+ webstaff: work log: various improvements
+
+ * Don't use $location.path() to generate a URL for when opening
+ a new window, as that can cause the parent window to reset
+ itself.
+ * Fix the refresh button
+ * Add support for paging through worklog entries
+ * Don't prematurely resolve the promise that is
+ feeding rows to the grid
+ * Ensure that entries are displayed in timestamp order
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+54 50 Open-ILS/web/js/ui/default/staff/admin/workstation/log.js
+
+commit 51fe14771d2f117f0f980047f53a64772f2c2ba1
+Author: Jason Etheridge <jason@esilibrary.com>
+Date: Fri Dec 4 11:06:56 2015 -0500
+
+ webstaff: egWorkLog service and Work Log UI
+
+ under Administration -> Local Administration
+
+ The original XUL feature starts here: 29d1b357eef061bb3698e4ce0506eb93b63421be
+
+ Make sure egCore from the calling interface is pulling in these org unit
+ settings:
+
+ ui.admin.work_log.max_entries
+ ui.admin.patron_log.max_entries
+
+ Signed-off-by: Jason Etheridge <jason@esilibrary.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+11 7 Open-ILS/src/templates/opac/parts/place_hold_result.tt2
+17 0 Open-ILS/src/templates/staff/admin/workstation/log.tt2
+59 0 Open-ILS/src/templates/staff/admin/workstation/t_log.tt2
+13 0 Open-ILS/src/templates/staff/base_js.tt2
+1 0 Open-ILS/src/templates/staff/css/style.css.tt2
+162 0 Open-ILS/web/js/ui/default/staff/admin/workstation/log.js
+20 2 Open-ILS/web/js/ui/default/staff/circ/patron/bills.js
+10 4 Open-ILS/web/js/ui/default/staff/circ/patron/holds.js
+23 5 Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js
+23 7 Open-ILS/web/js/ui/default/staff/circ/services/circ.js
+1 0 Open-ILS/web/js/ui/default/staff/services/eframe.js
+116 0 Open-ILS/web/js/ui/default/staff/services/ui.js
+ create mode 100644 Open-ILS/src/templates/staff/admin/workstation/log.tt2
+ create mode 100644 Open-ILS/src/templates/staff/admin/workstation/t_log.tt2
+ create mode 100644 Open-ILS/web/js/ui/default/staff/admin/workstation/log.js
+
+commit 4e1a8f8245d649e8574b0357f5e79f92414bba3b
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Thu May 5 16:35:25 2016 -0400
+
+ webstaff: transit list: improve styling of form
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+18 7 Open-ILS/src/templates/staff/circ/transits/t_list.tt2
+
+commit 7482a039798fb9f71a64562b4a94d05be4db0ff8
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Wed May 4 15:01:50 2016 -0400
+
+ webstaff: transit list: don't reset form
+
+ $location.path(foo) is a setter, and should not
+ be used to calculate a URL for opening a new window
+ unless you also want to refresh the source page.
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+5 6 Open-ILS/web/js/ui/default/staff/circ/transits/list.js
+
+commit bc5aebd7b20b53b24fa2c5c7eb066d7d21cb3689
+Author: Jason Etheridge <jason@esilibrary.com>
+Date: Thu Oct 1 07:23:44 2015 -0400
+
+ webstaff: Transit List
+
+ under Administration -> Local Administration
+
+ Signed-off-by: Jason Etheridge <jason@esilibrary.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+32 0 Open-ILS/src/templates/staff/circ/share/t_abort_transit_dialog.tt2
+18 0 Open-ILS/src/templates/staff/circ/transits/list.tt2
+50 0 Open-ILS/src/templates/staff/circ/transits/t_list.tt2
+68 0 Open-ILS/web/js/ui/default/staff/circ/services/transits.js
+154 0 Open-ILS/web/js/ui/default/staff/circ/transits/list.js
+ create mode 100644 Open-ILS/src/templates/staff/circ/share/t_abort_transit_dialog.tt2
+ create mode 100644 Open-ILS/src/templates/staff/circ/transits/list.tt2
+ create mode 100644 Open-ILS/src/templates/staff/circ/transits/t_list.tt2
+ create mode 100644 Open-ILS/web/js/ui/default/staff/circ/services/transits.js
+ create mode 100644 Open-ILS/web/js/ui/default/staff/circ/transits/list.js
+
+commit f3931174b5257fa1574b298c3608839bdcddaf12
+Author: Jason Etheridge <jason@esilibrary.com>
+Date: Tue Jan 5 11:23:36 2016 -0500
+
+ webstaff: links to Surveys, Transit List, Work Log
+
+ Under Administration -> Local Administration
+
+ Links to the existing Surveys interface; following commits implement
+ the new Transit List and Work Log interfaces.
+
+ Signed-off-by: Jason Etheridge <jason@esilibrary.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+3 0 Open-ILS/src/templates/staff/admin/local/t_splash.tt2
+
+commit dffd94b2e673c87faae1e5e49153d0f05bf35d6f
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Fri Aug 12 14:15:29 2016 -0400
+
+ LP#1587639: stamp schema upgrade
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+1 1 Open-ILS/src/sql/Pg/002.schema.config.sql
+124 0 Open-ILS/src/sql/Pg/upgrade/0989.schema.authority-vandeley-edit-date.sql
+0 124 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.authority-vandeley-edit-date.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0989.schema.authority-vandeley-edit-date.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.authority-vandeley-edit-date.sql
+
+commit 744c0e74493d09dff1a4f7e7a1cfb6d9597cf3fc
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Thu Aug 4 14:00:17 2016 -0400
+
+ LP#1587639 Avoid double-update of editor/edit_date
+
+ Look for an editor first, and if not found just use the existing values.
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+33 32 Open-ILS/src/sql/Pg/012.schema.vandelay.sql
+33 32 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.authority-vandeley-edit-date.sql
+
+commit ada5bc49fb90f34c18bb3551c83d27ca0bb89626
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Wed Jun 1 11:55:27 2016 -0400
+
+ LP#1587639 Vand. authority updates release notes
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+6 0 docs/RELEASE_NOTES_NEXT/Cataloging/auth_bib_update.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/auth_bib_update.adoc
+
+commit 720cb4391ec0149632fbaf9687edf58a4a1d1142
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Wed Jun 1 11:51:00 2016 -0400
+
+ LP#1587639 Vand. authority updates PGTAP
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+73 0 Open-ILS/src/sql/Pg/t/vandelay-auth-import.sql
+ create mode 100644 Open-ILS/src/sql/Pg/t/vandelay-auth-import.sql
+
+commit 43f06ef45bde83713b4b2700692dcc5606fb2a91
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Wed Jun 1 10:40:45 2016 -0400
+
+ LP#1587639 Vandelay authority update editor/edit_date
+
+ Update the editor and edit_date of authority records when modified by
+ Vandelay merge/overlay.
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+9 9 Open-ILS/src/perlmods/lib/OpenILS/Application/Vandelay.pm
+48 8 Open-ILS/src/sql/Pg/012.schema.vandelay.sql
+123 0 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.authority-vandeley-edit-date.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.authority-vandeley-edit-date.sql
+
+commit 5317ba59cace4fd62365fc084addac6a3315fcd0
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Tue Aug 9 14:55:30 2016 -0400
+
+ Stamping upgrade for bib_source-in-901
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1 1 Open-ILS/src/sql/Pg/002.schema.config.sql
+122 0 Open-ILS/src/sql/Pg/upgrade/0988.schema.bib_source_in_901.sql
+0 122 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.bib_source_in_901.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0988.schema.bib_source_in_901.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.bib_source_in_901.sql
+
+commit 8db4cb64bb4741713edc7a364adcd9d0f865ba7d
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Wed Aug 26 17:59:37 2015 +0000
+
+ LP#1037553: bibliographic record source now copied to 901$s
+
+ If a bibliographic record has a source set, the name of that source
+ is now copied to the 901$s whenever the record is created or updated.
+ This allows the source to be used for record matching and MARC
+ field queries.
+
+ To test:
+
+ [1] Create or import a bibliographic record and ensure that its
+ source is set to a non-null value.
+ [2] Inspect the record in MARC format view and verify that its
+ 901 field now has a subfield $s containing the name of the
+ source.
+ [3] Use pg_prove to run the pgTAP test added by this patch
+ and verify that the test passes.
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+12 0 Open-ILS/src/sql/Pg/002.functions.config.sql
+21 0 Open-ILS/src/sql/Pg/t/bib_901_field.pg
+122 0 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.bib_source_in_901.sql
+6 0 docs/RELEASE_NOTES_NEXT/Cataloging/bib_source_in_901s.txt
+ create mode 100644 Open-ILS/src/sql/Pg/t/bib_901_field.pg
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.bib_source_in_901.sql
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/bib_source_in_901s.txt
+
+commit 983e8f9cf1bbc69fd8a134b987cdc87e4fc8e406
+Author: Jason Stephenson <jstephenson@mvlc.org>
+Date: Thu Oct 8 09:39:34 2015 -0400
+
+ LP 1503867: Use ws_ou in open-ils.circ.copy_transit.receive.
+
+ After putting NCIPServer into production, we discovered that a staff
+ user cannot receive a transit destined for their work org. unit if
+ the actor.usr.home_ou is not the same as their current work_ou.
+ This occurred because transit_receive in OpenILS::Application::
+ Circ::Transit uses the requestor's home_ou and not the ws_ou.
+
+ If you want to trigger this bug, write a little script to receive
+ transits, then login with a staff account at a location other than
+ their home_ou and try to receive a transit destined for the work_ou.
+ It will fail.
+
+ This small commit replaces home_ou in two places with ws_ou in order
+ to make the above work.
+
+ NOTE: This bug affects an API call not used in Evergreen except in
+ one test script. It used in two ILL add-ons for Evergreen: issa and
+ NCIPServer. Receiving transits by checking copies in via the staff
+ client, the typical workflow, is not affected by this bug or its fix.
+
+ Signed-off-by: Jason Stephenson <jstephenson@mvlc.org>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+2 2 Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Transit.pm
+
+commit 31563d8f54fd65d318635375b3b07520bf7bfc31
+Author: Liam Whalen <liam.whalen@bc.libraries.coop>
+Date: Thu Sep 24 15:00:17 2015 -0700
+
+ LP#1499537 Fixed kpac.xml caching problem
+
+ KPAC config files must be cached per config path in order to support
+ cases where more than one KPAC interface has been configured in different
+ vhosts or locations.
+
+ Signed-off-by: Liam Whalen <liam.whalen@bc.libraries.coop>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+13 12 Open-ILS/src/perlmods/lib/OpenILS/WWW/EGKPacLoader.pm
+
+commit 5a5834d993e2ad7b4e9fdce9e839b956414a9ab3
+Author: Michele Morgan <mmorgan@noblenet.org>
+Date: Thu Jun 2 12:44:02 2016 -0400
+
+ LP#1588450 asset.copy.cost Field Missing from Client Interfaces
+
+ This patch adds the asset.copy.cost cost field, with the label 'Acquisition
+ Cost' to the following:
+
+ XUL client:
+
+ - Item status list view column picker
+ - Item status alternate view
+ - Copy editor
+
+ Web client:
+
+ - Item status alternate view
+ - Copy editor label change
+
+ Signed-off-by: Michele Morgan <mmorgan@noblenet.org>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+18 20 Open-ILS/src/templates/staff/cat/item/t_summary_pane.tt2
+1 1 Open-ILS/src/templates/staff/cat/volcopy/t_attr_edit.tt2
+1 1 Open-ILS/src/templates/staff/cat/volcopy/t_defaults.tt2
+1 0 Open-ILS/web/opac/locale/en-US/lang.dtd
+8 0 Open-ILS/xul/staff_client/server/cat/copy_editor.js
+6 0 Open-ILS/xul/staff_client/server/circ/alternate_copy_summary.js
+16 15 Open-ILS/xul/staff_client/server/circ/alternate_copy_summary.xul
+16 0 Open-ILS/xul/staff_client/server/circ/util.js
+1 0 Open-ILS/xul/staff_client/server/locale/en-US/cat.properties
+1 0 Open-ILS/xul/staff_client/server/locale/en-US/common.properties
+
+commit 4c92d095da106a4c2a54bf26e392d5ad57938f4d
+Author: Kathy Lussier <klussier@masslnc.org>
+Date: Tue Apr 26 11:47:27 2016 -0400
+
+ LP#1575177 Add text informing users they cannot add survey questions
+
+ Survey questions cannot be added or modified once a survey has started, so
+ let's add some warning text in the interface letting them know why they can't
+ perform these actions.
+
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1 0 Open-ILS/web/js/dojo/openils/conify/nls/conify.js
+6 1 Open-ILS/web/js/ui/default/conify/global/action/survey/edit.js
+
+commit abefaa0dffe415bca9669de7a884ce22d6a9c2a3
+Author: Kathy Lussier <klussier@masslnc.org>
+Date: Tue Jul 19 14:02:12 2016 -0400
+
+ LP#1604515: Remove Advanced Hold Options link when part holds are expected
+
+ This branch removes the Advanced Hold Options link from the Place Hold
+ screen in cases where all copies on the bib record contain parts. If a user
+ attempts to place a metarecord hold and all other copies in the group also
+ contain parts, the hold will fail. By removing the link, we are removing one
+ potential point of failure for the user.
+
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1 1 Open-ILS/src/templates/opac/parts/place_hold.tt2
+9 0 docs/RELEASE_NOTES_NEXT/OPAC/remove_advanced_hold_options_for_parts.adoc
+ create mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/remove_advanced_hold_options_for_parts.adoc
+
+commit 2ba2c3bf0c3fe3bcccd242fa435d589fe0847bf3
+Author: blake <blake@mobiusconsortium.org>
+Date: Mon Apr 18 16:25:46 2016 -0500
+
+ LP1534283 SIP prevents renewal when user has any blocking standing penalties
+
+ This code dives into each penalty to investigate weather or not the patron
+ can renew based on the block list column. Before, SIP would block renewals with
+ the presence of penalty 1 or 2 regardless.
+
+ Signed-off-by: blake <blake@mobiusconsortium.org>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+38 4 Open-ILS/src/perlmods/lib/OpenILS/SIP/Patron.pm
+
+commit e51f6070f186e9f5504c3e1da5a93e7627738599
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Tue Aug 9 12:46:07 2016 -0400
+
+ Stamping upgrade for payment limits.
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1 1 Open-ILS/src/sql/Pg/002.schema.config.sql
+33 0 Open-ILS/src/sql/Pg/upgrade/0987.data.lp1183964_payment_limit.sql
+0 33 Open-ILS/src/sql/Pg/upgrade/XXXX_lp1183964_payment_limit.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0987.data.lp1183964_payment_limit.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX_lp1183964_payment_limit.sql
+
+commit ad10cde090791e02cb106e36a310581bfaafface
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Tue Aug 9 12:41:54 2016 -0400
+
+ Stamping upgrade for accent-ignoring patron search
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1 1 Open-ILS/src/sql/Pg/002.schema.config.sql
+43 0 Open-ILS/src/sql/Pg/upgrade/0986.schema.patron_unaccent.sql
+0 43 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.patron_unaccent.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0986.schema.patron_unaccent.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.patron_unaccent.sql
+
+commit 10aaac3955bd6baaa68f502c1ef851fce093b183
+Author: Jason Stephenson <jstephenson@mvlcstaff.org>
+Date: Thu Mar 17 17:47:52 2016 -0400
+
+ LP 1501781: Make patron name search diacritic/space insensitive.
+
+ Add pgtap tests for the new org unit setting, the new indexes, and to
+ test the evergreen.unaccent_and_squash() functionality. Many of the
+ latter tests are based on the tests for evergreen.lowercase().
+
+ Signed-off-by: Jason Stephenson <jason@sigio.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+61 0 Open-ILS/src/sql/Pg/t/lp1501781-unaccent_and_squash.pg
+ create mode 100644 Open-ILS/src/sql/Pg/t/lp1501781-unaccent_and_squash.pg
+
+commit 42d5c82b1ca74ca4aa0581b930ecf0b22772fefe
+Author: Jason Stephenson <jason@sigio.com>
+Date: Thu Mar 17 08:01:54 2016 -0400
+
+ LP 1501781: Make patron name search diacritic/space insensitive.
+
+ This commit adds the necessary code to storage actor publisher to use
+ the new evergreen.unaccent_and_squash db function when doing a patron
+ name search.
+
+ It is based on code originally by Dan Pearl, but then modified to
+ remove a dependency on a new Perl module by calling the db function on
+ the search input as well.
+
+ Signed-off-by: Jason Stephenson <jason@sigio.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+36 4 Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/actor.pm
+
+commit 85a470ef7144265ee0a2618fafffeac8bb36b65d
+Author: Dan Pearl <dpearl@cwmars.org>
+Date: Thu Oct 1 09:49:17 2015 -0400
+
+ LP#1501781 - Make patron name search diacritic/space insensitive.
+
+ Diacritical marks may exist in the patron record, as they should, but
+ this makes patron name search difficult for librarians who may be
+ unfamiliar with all the special characters used and also how to elicit
+ them from a keyboard. To ease this, accented characters will be
+ converted into their 'plain' analogs for comparison purposes.
+
+ So, for example, if the patron's last name is Chávez, typing "Chavez"
+ in the Last Name box in Patron Search will match it.
+
+ Spaces in a name (like "De la Croix") will be squashed out so that
+ name would be matched by "Delacroix" or "De la Croix" or variants.
+
+ The librarian can enter the accented characters or not.
+
+ Signed-off-by: Dan Pearl <dpearl@cwmars.org>
+ Signed-off-by: Jason Stephenson <jason@sigio.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+8 0 Open-ILS/src/sql/Pg/000.functions.general.sql
+3 0 Open-ILS/src/sql/Pg/005.schema.actors.sql
+20 0 Open-ILS/src/sql/Pg/950.data.seed-values.sql
+1 0 Open-ILS/src/sql/Pg/create_database_extensions.sql
+43 0 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.patron_unaccent.sql
+20 0 docs/RELEASE_NOTES_NEXT/Client/accent_insensitive_patron_search
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.patron_unaccent.sql
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Client/accent_insensitive_patron_search
+
+commit 9bdfdf9a870dceb5baa92ddde6575b9a34a624fb
+Author: Jason Boyer <jboyer@library.in.gov>
+Date: Fri May 13 12:51:07 2016 -0400
+
+ LP1183964: Payment Limit Options
+
+ Add support for 2 new OU settings, a payment warning
+ amount (try to pay more than this and you're required
+ to confirm it) and a hard limit where no payment larger
+ will be accepted. Support is also added to both the XUL
+ client and webstaff client.
+
+ Signed-off-by: Jason Boyer <jboyer@library.in.gov>
+ Signed-off-by: Jeanette Lundgren <jlundgren@cwmars.org>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+20 0 Open-ILS/src/sql/Pg/950.data.seed-values.sql
+33 0 Open-ILS/src/sql/Pg/upgrade/XXXX_lp1183964_payment_limit.sql
+3 0 Open-ILS/src/templates/staff/circ/patron/index.tt2
+45 3 Open-ILS/web/js/ui/default/staff/circ/patron/bills.js
+3 0 Open-ILS/xul/staff_client/server/locale/en-US/patron.properties
+39 2 Open-ILS/xul/staff_client/server/patron/bill2.js
+16 0 docs/RELEASE_NOTES_NEXT/Circulation/limit_payment_amounts_accepted.txt
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX_lp1183964_payment_limit.sql
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/limit_payment_amounts_accepted.txt
+
+commit 4b5b791fffef5420e6d142964dfefdb647051e22
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Tue Aug 9 12:04:35 2016 -0400
+
+ Stamping upgrade for reingest speedup
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+1 1 Open-ILS/src/sql/Pg/002.schema.config.sql
+231 0 Open-ILS/src/sql/Pg/upgrade/0985.schema.speed_record_attr_ingest.sql
+0 231 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.speed_record_attr_ingest.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0985.schema.speed_record_attr_ingest.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.speed_record_attr_ingest.sql
+
+commit 982472f1110b5874757d57c421e121c0a5962f61
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Fri Jul 29 11:40:46 2016 -0400
+
+ LP#1588543: schema update script
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+231 0 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.speed_record_attr_ingest.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.speed_record_attr_ingest.sql
+
+commit f668201078a11fe06d9bb8e1c658648e7ed2be60
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Fri Jul 29 11:34:06 2016 -0400
+
+ LP#1588543: tests for verifying correct generated of record attributes
+
+ This patch adds tests to verify that the expected
+ set of record attributes are generated when a bib record
+ is ingested. The tests serve a couple purposes:
+
+ - verifying that changes to the record attribute ingest
+ stored procedure don't have unexpected side-effects
+ - validating record attribute definitions in the seed data
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+211 0 Open-ILS/src/sql/Pg/t/lp1588543_marc_record_attributes.pg
+ create mode 100644 Open-ILS/src/sql/Pg/t/lp1588543_marc_record_attributes.pg
+
+commit 6cc1d1e0911f4dd4a92d17a9b60025888b080bff
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Fri Jul 29 11:24:07 2016 -0400
+
+ LP#1588543: further speed up record attribute ingest
+
+ Following a suggestion from Dan Wells, this patch adds
+ an index on config.coded_value_map(ctype). My testing shows
+ that the index by itself can halve the time required to
+ fully ingest a new record; in conjunction with the
+ change in the previous patch, full reingest time is
+ reduced by about 60%.
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+2 0 Open-ILS/src/sql/Pg/002.schema.config.sql
+
+commit cf3bd149e53585676a517d38093f2470dbcfaaeb
+Author: Dan Wells <dbw2@calvin.edu>
+Date: Wed Jun 1 14:36:29 2016 -0400
+
+ LP#1588543: Speed up record attribute ingest
+
+ A huge number of rows (700+) have been added to
+ config.record_attr_definition in recent versions of Evergreen. However,
+ these rows do not actually define any indexing at all, but are used for
+ other purposes. The reingest process currently churns over all of these
+ rows to ultimately do nothing.
+
+ This commit limits the group of attributes considered at ingest to only
+ those which might index something. Testing indicates a substantial
+ speed boost to typical use of metabib.reingest_record_attributes()
+ (over 2x speedup).
+
+ Signed-off-by: Dan Wells <dbw2@calvin.edu>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+
+10 1 Open-ILS/src/sql/Pg/030.schema.metabib.sql
+
+commit d5ce5929495c31eeac6bfdc3df6bd3e275a3ed0d
+Author: Kathy Lussier <klussier@masslnc.org>
+Date: Fri Jul 29 17:51:14 2016 -0400
+
+ LP#1549505: Stamping upgrade scripts 0983-84 for stat pop ratings
+
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+
+1 1 Open-ILS/src/sql/Pg/002.schema.config.sql
+1005 0 Open-ILS/src/sql/Pg/upgrade/0983.schema.statistical-ratings.sql
+606 0 Open-ILS/src/sql/Pg/upgrade/0984.function.qp_search.sql
+0 1003 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.statisitcal-ratings.sql
+0 604 Open-ILS/src/sql/Pg/upgrade/YYYY.function.qp_search.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0983.schema.statistical-ratings.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0984.function.qp_search.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.statisitcal-ratings.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/YYYY.function.qp_search.sql
+
+commit ac561d3b347e4f7393000a6b76ea1071927d9d4e
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Thu Jul 28 12:19:15 2016 -0400
+
+ LP#1549505: update $modal to $uibModal
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+
+6 6 Open-ILS/web/js/ui/default/staff/admin/local/rating/badge.js
+
+commit 940270761e1ef9c4ea51c8ad9229e3c9bd8d45a2
+Author: Kathy Lussier <klussier@masslnc.org>
+Date: Thu Jul 21 12:02:38 2016 -0400
+
+ LP#1549505: Decrease value of Max popularity importance multiplier
+
+ My testing found that a setting between 1.1 and 1.2 resulted in fairly good
+ results when using the popularity-adjusted relevance sort. Adjusting the value
+ in the seed data to 1.1 since it will be a better starting point for libraries.
+
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+
+1 1 Open-ILS/src/sql/Pg/950.data.seed-values.sql
+1 1 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.statisitcal-ratings.sql
+
+commit cf614499238ad958f34f91ec0107d482ac124d30
+Author: Kathy Lussier <klussier@masslnc.org>
+Date: Thu Jul 21 11:52:24 2016 -0400
+
+ LP#1549505: Remove stray semicolon from PgTap test
+
+ The semicolon was causing failures in the test.
+
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+
+1 1 Open-ILS/src/sql/Pg/t/regress/lp1549505_statistical_popularity_infrastructure.pg
+
+commit ae3bb32ede6e7569b935a92ed5bc7fc1cb0564cf
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Thu May 26 17:51:49 2016 -0400
+
+ LP#1549505: Query literal interpolation casts incorrectly
+
+ We need to be sure that all query values are of the same type in the same
+ columns because PLPGSQL functions are compiled and cached. In this case,
+ the core query of the in-db search cannot have its shape change. This
+ commit assures that browse and search uses of the SP provide core queries
+ that match on their SELECT lists. Of particular importance is the type
+ of the "rel" output column, which was variously float8 or numeric, depending
+ on whether the search contained any terms (a "search") or not (a browse
+ link).
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+
+4 4 Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm
+4 4 Open-ILS/src/sql/Pg/030.schema.metabib.sql
+4 4 Open-ILS/src/sql/Pg/upgrade/YYYY.function.qp_search.sql
+
+commit 3d5b37a1072bfd177bf484d02e717dae57a62427
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Wed May 25 12:53:24 2016 -0400
+
+ LP#1549505: fix staged browse
+
+ This patch ensures that the core query passed to
+ query_parser_fts by staged browse contains dummy
+ badges and popularity columns (and thus, doesn't break);
+ note that browse itself cares nothing about popularity.
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+
+2 0 Open-ILS/src/sql/Pg/030.schema.metabib.sql
+208 0 Open-ILS/src/sql/Pg/upgrade/YYYY.function.qp_search.sql
+
+commit df0d763642e5841baaac36d09b1fa9df525b2b67
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Fri May 6 11:29:39 2016 -0400
+
+ LP#1549505: update baseline database schema
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+
+2 0 Open-ILS/src/sql/Pg/090.schema.action.sql
+905 0 Open-ILS/src/sql/Pg/220.schema.rating.sql
+9 1 Open-ILS/src/sql/Pg/300.schema.staged_search.sql
+0 2 Open-ILS/src/sql/Pg/950.data.seed-values.sql
+73 19 Open-ILS/src/sql/Pg/reporter-schema.sql
+2 0 Open-ILS/src/sql/Pg/sql_file_manifest
+ create mode 100644 Open-ILS/src/sql/Pg/220.schema.rating.sql
+
+commit 36ed838b1bc73b4bb5957aa7a3da29fc94f2563f
+Author: Jason Stephenson <jstephenson@mvlcstaff.org>
+Date: Fri Apr 15 09:36:51 2016 -0400
+
+ LP 1549505: Fix syntax error in OpenILS/WWW/EGCatLoader/Record.pm
+
+ Typo/error apparently introduced on line 72 in commit eeee27c.
+
+ Signed-off-by: Jason Stephenson <jstephenson@mvlcstaff.org>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+
+1 1 Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Record.pm
+
+commit 6fd72121637701f4dfc50e2cd3b2896c49197c5c
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Tue Apr 5 16:26:41 2016 -0400
+
+ LP#1549505: Release notes for statistically generated record ratings (popularity)
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+
+98 0 docs/RELEASE_NOTES_NEXT/OPAC/popularity-rating.txt
+ create mode 100644 docs/RELEASE_NOTES_NEXT/OPAC/popularity-rating.txt
+
+commit 4f48f276d052a6211be625d3b87d8077a789999c
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Tue Apr 5 12:10:53 2016 -0400
+
+ LP#1549505: PGTap test to show the infrastructure is working
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+
+33 0 Open-ILS/src/sql/Pg/t/regress/lp1549505_statistical_popularity_infrastructure.pg
+ create mode 100644 Open-ILS/src/sql/Pg/t/regress/lp1549505_statistical_popularity_infrastructure.pg
+
+commit 1fd8103bf33430fe0b4b5ae8d2b2b051802ac473
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Fri Mar 11 13:27:03 2016 -0500
+
+ LP#1549505: add flag to tweak popularity-adjusted relevance
+
+ This adds a new global_flag, search.max_popularity_importance_multiplier,
+ to control the factor by which popularity affects Popularity Adjusted
+ Relevance ranking.
+
+ The value should be a decimal number, typically between 1.0 and 2.0:
+
+ * 1.0 be would be equivalent to not adjusting relevance for popularity
+ at all.
+ * 1.1 would mean that the multiplier would range from 1 (for zero
+ popularity) to 1.1 (for maximum popularity), for a maximum boost of
+ 10% of the base relevance value of the record.
+
+ What's happening in the code:
+
+ Scale the 0-5 effect of popularity badges by providing a multiplier
+ for the badge average based on the overall maximum multiplier. Two
+ examples, comparing the effect to the default $max_mult value of 2.0,
+ which causes a $adjusted_scale value of 0.2:
+
+ * Given the default $max_mult of 2.0, the value of
+ $adjusted_scale will be 0.2 [($max_mult - 1.0) / 5.0].
+ For a record whose average badge score is the maximum
+ of 5.0, that would make the relevance multiplier be
+ 2.0:
+ 1.0 + (5.0 [average score] * 0.2 [ $adjusted_scale ],
+ This would have the effect of doubling the effective
+ relevance of highly popular items.
+
+ * Given a $max_mult of 1.1, the value of $adjusted_scale
+ will be 0.02, meaning that the average badge value will be
+ multiplied by 0.02 rather than 0.2, then added to 1.0 and
+ used as a multiplier against the base relevance. Thus a
+ change of at most 10% to the base relevance for a record
+ with a 5.0 average badge score. This will allow records
+ that are naturally very relevant to avoid being pushed
+ below badge-heavy records.
+
+ * Given a $max_mult of 3.0, the value of $adjusted_scale
+ will be 0.4, meaning that the average badge value will be
+ multiplied by 0.4 rather than 0.2, then added to 1.0 and
+ used as a multiplier against the base relevance. Thus a
+ change of as much as 200% to (or three times the size of)
+ the base relevance for a record with a 5.0 average badge
+ score. This in turn will cause badges to outweigh
+ relevance to a very large degree.
+
+ The maximum badge multiplier can be set to a value less than
+ 1.0; this would have the effect of making less popular items
+ show up higher in the results. While this is not a likely
+ option for production use, it could be useful for identifying
+ interesting long-tail hits, particularly in a database
+ where enough badges are configured so that very few records
+ have an average badge score of zero.
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+
+62 1 Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm
+13 0 Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/metabib.pm
+12 0 Open-ILS/src/sql/Pg/950.data.seed-values.sql
+12 0 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.statisitcal-ratings.sql
+
+commit d4d2f42e8674f93284d2932e171bf9a4f9cc8cf4
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Wed Feb 24 17:19:14 2016 -0500
+
+ LP#1549505: add admin interface to manage badges
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+
+1 1 Open-ILS/examples/fm_IDL.xml
+60 0 Open-ILS/src/templates/staff/admin/local/rating/badge.tt2
+42 0 Open-ILS/src/templates/staff/admin/local/rating/edit_badge.tt2
+1 0 Open-ILS/src/templates/staff/admin/local/t_splash.tt2
+3 0 Open-ILS/src/templates/staff/css/style.css.tt2
+189 0 Open-ILS/web/js/ui/default/staff/admin/local/rating/badge.js
+ create mode 100644 Open-ILS/src/templates/staff/admin/local/rating/badge.tt2
+ create mode 100644 Open-ILS/src/templates/staff/admin/local/rating/edit_badge.tt2
+ create mode 100644 Open-ILS/web/js/ui/default/staff/admin/local/rating/badge.js
+
+commit 701d069268f75620e145ea73a2e21aec7ec5db42
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Thu Feb 4 17:19:03 2016 -0500
+
+ LP#1549505: Add ability to set default sorter via global flag
+
+ In addition, support for sorting by ascending popularity remains
+ in the back end, however, since if one's configured badges such
+ that almost every record has a badge score, that sort order could
+ be useful for examining the long tail of the collection.
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+
+5 0 Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm
+14 0 Open-ILS/src/sql/Pg/950.data.seed-values.sql
+7 0 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.statisitcal-ratings.sql
+5 1 Open-ILS/src/templates/opac/parts/advanced/search.tt2
+12 0 Open-ILS/src/templates/opac/parts/filtersort.tt2
+6 1 Open-ILS/src/templates/opac/parts/searchbar.tt2
+
+commit b6dd839f6c292849017cdc8a2f0ff590facd70cc
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Wed Feb 3 15:46:52 2016 -0500
+
+ LP#1549505: Provide a cron-able script to perform badge recalculation
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+
+27 0 Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/biblio.pm
+60 0 Open-ILS/src/support-scripts/badge_score_generator.pl
+ create mode 100755 Open-ILS/src/support-scripts/badge_score_generator.pl
+
+commit 8180b60d040d6b1025de21bbd587839076037493
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Fri Jan 22 17:13:25 2016 -0500
+
+ LP#1549505: Teach QP and its caller stack how to use badges
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+
+2 2 Open-ILS/src/perlmods/lib/OpenILS/Application/Search/Biblio.pm
+54 7 Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/QueryParser.pm
+59 1 Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/metabib.pm
+15 0 Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Record.pm
+7 5 Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Search.pm
+396 0 Open-ILS/src/sql/Pg/upgrade/YYYY.function.qp_search.sql
+10 0 Open-ILS/src/templates/opac/parts/record/summary.tt2
+7 2 Open-ILS/src/templates/opac/parts/result/table.tt2
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/YYYY.function.qp_search.sql
+
+commit 1dd8d953b01ccedc5e42162d53471f132156e77a
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Thu Jan 7 22:00:20 2016 -0500
+
+ LP#1549505: schema and IDL for statistical poularity ratings
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+
+92 0 Open-ILS/examples/fm_IDL.xml
+984 0 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.statisitcal-ratings.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.statisitcal-ratings.sql
+
+commit 357aabae410bbe25160947acd52693841d690e92
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Thu May 12 15:58:49 2016 -0400
+
+ LP#1581196: webstaff: fix dirty form detection in patron editor
+
+ This patch fixes a problem wherein the patron editor
+ form would think that it had been modified by the
+ user immediately after initialization.
+
+ To test
+ -------
+ [1] Load the patron editor, then refresh the page. Note that
+ you are warned that there is unsaved input.
+ [2] As above, but hit the save button. Note that after saving,
+ you still get a warning that there is unsaved input.
+ [3] Apply the page, then repeat tests 1 and 2. This time, you
+ shouldn't get inappropriate unsaved data warnings.
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+0 2 Open-ILS/src/templates/staff/circ/patron/t_edit.tt2
+6 0 Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js
+
+commit 50eb643d555b8307e02a312d8e09919dd003b2d3
+Author: Ben Shum <ben@evergreener.net>
+Date: Tue Jul 5 01:14:38 2016 -0400
+
+ LP#1568046: Stamping upgrade script for eliminating connectby from functions
+
+ Signed-off-by: Ben Shum <ben@evergreener.net>
+
+1 1 Open-ILS/src/sql/Pg/002.schema.config.sql
+256 0 Open-ILS/src/sql/Pg/upgrade/0982.function.perm_functions_without_connectby.sql
+0 256 Open-ILS/src/sql/Pg/upgrade/XXXX.function.perm_functions_without_connectby.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0982.function.perm_functions_without_connectby.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.function.perm_functions_without_connectby.sql
+
+commit 499d69d64e7c7b660ee1dffc250f8f9552df8daa
+Author: Jason Stephenson <jason@sigio.com>
+Date: Fri Jul 1 13:13:16 2016 -0400
+
+ LP#1568046: Replace last two uses of connectby with other function calls.
+
+ Modify permission functions permission.usr_has_perm_at_nd and
+ permission.usr_has_perm_at_all_nd to no longer require the connectby
+ function from the tablefunc extension. The connectby functionality is
+ replaced by existing database functions to retrieve org. unit
+ descendants.
+
+ This change removes the need to load the tablefunc extension, so it is
+ dropped from the create scripts. The upgrade script does not remove
+ the extension as sites may be using connectby or other functions from
+ the extension.
+
+ Signed-off-by: Jason Stephenson <jason@sigio.com>
+ Signed-off-by: Ben Shum <ben@evergreener.net>
+
+5 28 Open-ILS/src/sql/Pg/006.schema.permissions.sql
+0 2 Open-ILS/src/sql/Pg/create_database_contribs.sql
+0 1 Open-ILS/src/sql/Pg/create_database_extensions.sql
+256 0 Open-ILS/src/sql/Pg/upgrade/XXXX.function.perm_functions_without_connectby.sql
+15 0 docs/RELEASE_NOTES_NEXT/Administration/lp1568046-tablefunc-extension-removed.adoc
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.function.perm_functions_without_connectby.sql
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Administration/lp1568046-tablefunc-extension-removed.adoc
+
+commit 1463f3597487048127cee5b19ba79bb3bec5a878
+Author: Ben Shum <ben@evergreener.net>
+Date: Wed Jun 8 07:41:30 2016 -0400
+
+ LP#1554714: Set angular 1.5.5 as minimum, not exact version
+
+ By adding the ~ in front of the angular version specified, we say
+ make this the minimum version to look for. This bypasses the issue
+ for when new releases of the 1.5.x angular series is released, such
+ as 1.5.6, which is the current new version as of this patch.
+
+ Signed-off-by: Ben Shum <ben@evergreener.net>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+1 1 Open-ILS/web/js/ui/default/staff/bower.json
+
+commit a6d3bdea207394fafc8caf92dcd18843410fcb2e
+Author: Kathy Lussier <klussier@masslnc.org>
+Date: Fri Jun 10 11:51:41 2016 -0400
+
+ LP#1526858: Stamping upgrade script for faster alhr query
+
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+
+1 1 Open-ILS/src/sql/Pg/002.schema.config.sql
+8 0 Open-ILS/src/sql/Pg/upgrade/0981.schema.indexes_for_alhr_queries.sql
+0 8 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.indexes_for_alhr_queries.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0981.schema.indexes_for_alhr_queries.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.indexes_for_alhr_queries.sql
+
+commit ae4ccf75a047719ef3b8809349bde93398121cb1
+Author: Kathy Lussier <klussier@masslnc.org>
+Date: Wed May 25 11:29:22 2016 -0400
+
+ Docs: Adding 2.10.4 Point Release Notes
+
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+
+37 2 docs/RELEASE_NOTES_2_10.adoc
+
+commit 8ab630642cf7331a3cbb3d216f376ff837e7ed52
+Author: Kathy Lussier <klussier@masslnc.org>
+Date: Mon May 23 19:17:36 2016 -0400
+
+ LP#1447746: Fix lp957466_update_date_and_source regression test
+
+ The new code introduced through LP1447746 adding an update_bib_source flag to
+ Vandelay merge profiles broke a test that was verifying the bib source and
+ edit fields were updated in Vandelay uploads.
+
+ This patch fixes the test and also adds a new test to ensure the flag works as
+ expected when set to both true and false. It also renames the test since the
+ it's now testing the newer code rather than the previous expected behavior.
+
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+ Signed-off-by: Ben Shum <ben@evergreener.net>
+
+137 0 Open-ILS/src/sql/Pg/t/regress/lp1447746_update_date_and_source.pg
+0 80 Open-ILS/src/sql/Pg/t/regress/lp957466_update_date_and_source.pg
+ create mode 100644 Open-ILS/src/sql/Pg/t/regress/lp1447746_update_date_and_source.pg
+ delete mode 100644 Open-ILS/src/sql/Pg/t/regress/lp957466_update_date_and_source.pg
+
+commit 2f024d424fefe801aafaf9f9b2debab0c6b74483
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Thu May 19 14:28:11 2016 -0400
+
+ LP#1554714 Add explicit phantomjs-prebuilt dependency
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Ben Shum <ben@evergreener.net>
+ Signed-off-by: Jason Stephenson <jstephenson@mvlcstaff.org>
+
+1 0 Open-ILS/web/js/ui/default/staff/package.json
+
+commit 3e614940ad2fbdb6ec88e96b580ca7437e044410
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Thu May 19 16:25:12 2016 -0400
+
+ LP#1554714 Ang. 2.5 hotkeys plugin update
+
+ As with other dependencies, the hotkeys package name changed since the
+ last update. It's now cfp-angular-hotkeys
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Ben Shum <ben@evergreener.net>
+ Signed-off-by: Jason Stephenson <jstephenson@mvlcstaff.org>
+
+2 2 Open-ILS/web/js/ui/default/staff/bower.json
+
+commit 670a9115b9aaad5570f1f7143d630f0c985537e6
+Author: Kathy Lussier <klussier@masslnc.org>
+Date: Thu May 12 16:49:11 2016 -0400
+
+ LP#1447746 Stamping upgrade script for update-bib-source flag in Vandelay
+
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+
+1 1 Open-ILS/src/sql/Pg/002.schema.config.sql
+74 0 Open-ILS/src/sql/Pg/upgrade/0980.schema.merge.overlay_control.sql
+0 74 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.merge_overlay_control.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0980.schema.merge.overlay_control.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.merge_overlay_control.sql
+
+commit 651020ea6ceb732bc4ac743075bf0080c10ae39f
+Author: Dan Pearl <dpearl@cwmars.org>
+Date: Thu Feb 4 12:46:46 2016 -0500
+
+ LP#1447746: Do not update bib source on match-only merge
+
+ This adds a flag to control the updating of the bib source on a vandelay operation.
+
+ Signed-off-by: Dan Pearl <dpearl@cwmars.org>
+ Signed-off-by: Kathy Lussier <klussier@masslnc.org>
+
+1 0 Open-ILS/examples/fm_IDL.xml
+24 18 Open-ILS/src/sql/Pg/012.schema.vandelay.sql
+4 4 Open-ILS/src/sql/Pg/950.data.seed-values.sql
+14 0 Open-ILS/src/sql/Pg/t/lp1447746_import_flag.pg
+74 0 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.merge_overlay_control.sql
+1 1 Open-ILS/src/templates/vandelay/inc/profiles.tt2
+15 0 docs/RELEASE_NOTES_NEXT/Cataloging/marc_bib_update.adoc
+ create mode 100644 Open-ILS/src/sql/Pg/t/lp1447746_import_flag.pg
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.merge_overlay_control.sql
+ create mode 100644 docs/RELEASE_NOTES_NEXT/Cataloging/marc_bib_update.adoc
+
+commit 0f0f6c13effb05c0fb88a5485b615b57d0acc9f6
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Mon May 9 17:03:20 2016 -0400
+
+ release notes for 2.10.3
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+29 1 docs/RELEASE_NOTES_2_10.adoc
+
+commit 2cf65ef923145aade9a6ced615dfd29d4d6216b3
+Author: Ben Shum <ben@evergreener.net>
+Date: Wed May 4 13:22:28 2016 -0400
+
+ LP#1551084: Add 16.04 version notes in server_upgrade doc
+
+ Signed-off-by: Ben Shum <ben@evergreener.net>
+ Signed-off-by: Jason Stephenson <jason@sigio.com>
+
+2 1 docs/installation/server_upgrade.txt
+
+commit ae4505cb7ae130906d8801b6ec726e052357eed9
+Author: Ben Shum <ben@evergreener.net>
+Date: Tue Apr 19 10:36:39 2016 -0400
+
+ LP#1551084: Fixup typo for ubuntu-xenial-developer
+
+ Jason spotted a typo. Can probably squash this in later.
+
+ Signed-off-by: Ben Shum <ben@evergreener.net>
+ Signed-off-by: Jason Stephenson <jason@sigio.com>
+
+1 1 Open-ILS/src/extras/Makefile.install
+
+commit f811b197ab5381883961f38f1cf2a3e2d47f2e05
+Author: Ben Shum <ben@evergreener.net>
+Date: Mon Feb 29 01:30:29 2016 -0500
+
+ LP#1551084: Update README to include references for 'ubuntu-xenial'
+
+ Signed-off-by: Ben Shum <ben@evergreener.net>
+ Signed-off-by: Jason Stephenson <jason@sigio.com>
+
+11 10 docs/installation/server_installation.txt
+
+commit 0605c1eb6d22a616773e6fba27a10e936a2c5d35
+Author: Ben Shum <ben@evergreener.net>
+Date: Mon Feb 29 01:20:34 2016 -0500
+
+ LP#1551084: Start new Makefile target for 'ubuntu-xenial'
+
+ For Ubuntu 16.04, let's start a new Makefile target for 'ubuntu-xenial'
+
+ For major changes, the packaged version of PostgreSQL that ships with
+ Ubuntu 16.04 is PostgreSQL 9.5.
+
+ Also, during the configure step, the build process looks for libpcre3-dev,
+ so we add that as an additional prerequisite now.
+
+ Signed-off-by: Ben Shum <ben@evergreener.net>
+ Signed-off-by: Jason Stephenson <jason@sigio.com>
+
+11 1 Open-ILS/src/extras/Makefile.install
+156 0 Open-ILS/src/extras/install/Makefile.ubuntu-xenial
+ create mode 100644 Open-ILS/src/extras/install/Makefile.ubuntu-xenial
+
+commit 233e14df23361ef2e14e086be57d584ecb3eaca4
+Author: Ben Shum <ben@evergreener.net>
+Date: Mon Feb 29 01:14:38 2016 -0500
+
+ LP#1551084: Symlink for 000.english.pg95.fts-config.sql
+
+ We need this so that the eg_db_config script can make the Evergreen
+ database with PostgreSQL 9.5 systems.
+
+ Signed-off-by: Ben Shum <ben@evergreener.net>
+ Signed-off-by: Jason Stephenson <jason@sigio.com>
+
+1 0 Open-ILS/src/sql/Pg/000.english.pg95.fts-config.sql
+ create mode 120000 Open-ILS/src/sql/Pg/000.english.pg95.fts-config.sql
+
+commit 463f5358841f1ec668290ad598dc0e83b9e8fc90
+Author: Ben Shum <ben@evergreener.net>
+Date: Wed May 4 12:59:01 2016 -0400
+
+ LP#1568046: Stamping upgrade script for changes to permission.grp_ancestors
+
+ Signed-off-by: Ben Shum <ben@evergreener.net>
+
+1 1 Open-ILS/src/sql/Pg/002.schema.config.sql
+62 0 Open-ILS/src/sql/Pg/upgrade/0979.function.grp-tree-functions-via-cte.sql
+0 60 Open-ILS/src/sql/Pg/upgrade/XXXX.function.grp-tree-functions-via-cte.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/0979.function.grp-tree-functions-via-cte.sql
+ delete mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.function.grp-tree-functions-via-cte.sql
+
+commit 5a4a6518b5ba10ab3b14bc0bd9530d47096fb29c
+Author: Jason Stephenson <jstephenson@mvlcstaff.org>
+Date: Fri Apr 8 15:30:32 2016 -0400
+
+ LP#1568046: Fix some mistakes in previous commit.
+
+ Looks like a few thinkos crept in from it being dashed off in a hurry.
+
+ Signed-off-by: Jason Stephenson <jstephenson@mvlcstaff.org>
+ Signed-off-by: Ben Shum <ben@evergreener.net>
+
+8 8 Open-ILS/src/sql/Pg/006.schema.permissions.sql
+8 8 Open-ILS/src/sql/Pg/upgrade/XXXX.function.grp-tree-functions-via-cte.sql
+
+commit 452c4de9ed109717b216154fccd031aeb6e02007
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Fri Apr 8 14:49:10 2016 -0400
+
+ LP#1568046: Use CTE instead of connectby for group tree queries
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+ Signed-off-by: Jason Stephenson <jstephenson@mvlcstaff.org>
+ Signed-off-by: Ben Shum <ben@evergreener.net>
+
+48 11 Open-ILS/src/sql/Pg/006.schema.permissions.sql
+60 0 Open-ILS/src/sql/Pg/upgrade/XXXX.function.grp-tree-functions-via-cte.sql
+ create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.function.grp-tree-functions-via-cte.sql
+
+commit e6f79f6abe4ae4943c29cdf1c823f8e3d1f21c37
+Author: Jason Stephenson <jstephenson@mvlcstaff.org>
+Date: Fri Apr 29 07:48:44 2016 -0400
+
+ Add entries to .mailmap.
+
+ Signed-off-by: Jason Stephenson <jstephenson@mvlcstaff.org>
+
+3 0 .mailmap
+
+commit 2026b4bb6716d8c2ce34f21fbc007294d52e3e5e
+Author: Jane Sandberg <sandbej@linnbenton.edu>
+Date: Tue Mar 15 11:59:44 2016 -0700
+
+ LP1494346: Docs syntax error
+
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+2 2 docs/cataloging/physical_char_wizard.txt
+
+commit b51c2799600c2e154591e41b657a61c306bcd35b
+Author: Jane Sandberg <sandbej@linnbenton.edu>
+Date: Tue Mar 15 11:36:01 2016 -0700
+
+ Adding more information about authorities+Vandelay
+
+ Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
+
+6 1 docs/cataloging/authorities.txt
+
+commit 8c1035bbd5821cd5b183a0aff895f48d6829bd80
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Wed Apr 20 11:20:36 2016 -0400
+
+ LP#1554714: update to latest Collapse attribute
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+1 1 Open-ILS/src/templates/staff/cat/share/t_marcedit.tt2
+
+commit a07656a4f6fda9c50d6b8acc0e4774506bc659bf
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Wed Apr 20 11:11:47 2016 -0400
+
+ LP#1554714: final $modal => $uibModal
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+22 22 Open-ILS/web/js/ui/default/staff/cat/item/app.js
+
+commit 87debaaadab41bb05d7a494f7ff1316452c70a48
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Wed Apr 20 11:07:43 2016 -0400
+
+ LP#1554714: more drop-down fixes
+
+ Should be the last of them.
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+3 3 Open-ILS/src/templates/staff/cat/bucket/copy/t_bucket_selector.tt2
+3 3 Open-ILS/src/templates/staff/cat/bucket/record/t_bucket_selector.tt2
+3 3 Open-ILS/src/templates/staff/cat/catalog/t_catalog.tt2
+3 3 Open-ILS/src/templates/staff/cat/item/index.tt2
+6 6 Open-ILS/src/templates/staff/cat/share/t_physchar_wizard.tt2
+
+commit c70a1988ed2be80559d1f79b420d60180afeb4f5
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Wed Apr 20 11:03:06 2016 -0400
+
+ LP#1554714: specify resolution to make angular-animate happy
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+3 0 Open-ILS/web/js/ui/default/staff/bower.json
+
+commit f64cb46b636d175fb5d2ea9ec5420ef7d29160b7
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Wed Apr 20 10:50:27 2016 -0400
+
+ LP#1554714: fix up more drop-down menus
+
+ This patch intentionally doesn't change templates
+ under cat/; that will come later.
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+3 3 Open-ILS/src/templates/staff/admin/local/circ/age_to_lost.tt2
+3 3 Open-ILS/src/templates/staff/admin/workstation/t_print_config.tt2
+3 3 Open-ILS/src/templates/staff/circ/checkin/t_checkin.tt2
+3 3 Open-ILS/src/templates/staff/circ/in_house_use/index.tt2
+3 3 Open-ILS/src/templates/staff/circ/patron/index.tt2
+3 3 Open-ILS/src/templates/staff/circ/patron/t_checkout.tt2
+12 12 Open-ILS/src/templates/staff/circ/patron/t_edit.tt2
+3 3 Open-ILS/src/templates/staff/circ/patron/t_patron_groups_dialog.tt2
+3 3 Open-ILS/src/templates/staff/circ/patron/t_search.tt2
+15 15 Open-ILS/src/templates/staff/share/t_autogrid.tt2
+
+commit 0705bc6051840c6b8783b52ea8246b0790eb79fb
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Wed Apr 20 10:19:40 2016 -0400
+
+ LP#1554714: (indirectly) bump up PhantomJS version
+
+ It turns out that PhantomJS 2 or later is required for
+ angular-mocks to succesfully inject dependencies; this patch
+ updates karma-phantomjs-launcher to a version that will
+ bring in a recent-enough version of PhantomJS.
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+1 1 Open-ILS/web/js/ui/default/staff/package.json
+
+commit d7c5cd3dcf5abca7b7c2bc46ccf808bcfd135419
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Thu Apr 14 10:36:13 2016 -0400
+
+ LP#1554714 Ang 1.5 org unit dropdown repair
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+3 3 Open-ILS/web/js/ui/default/staff/services/ui.js
+
+commit e0c30a7bd6d05fe9b3e263095838739d5d8af8c0
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Thu Apr 14 10:19:24 2016 -0400
+
+ LP#1554714 ng-date-input -> eg-date-input typo
+
+ We're using eg-date-input, not ng-date-input.
+
+ Thanks to Mike Rylander for pointing this out.
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+1 1 Open-ILS/src/templates/staff/circ/share/t_hold_dates.tt2
+
+commit 0d31cec39723e90643f09d69a278a4e17350c5a9
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Thu Mar 17 10:26:42 2016 -0400
+
+ LP#1554714 Ang. 1.5 navbar menu repairs
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+21 29 Open-ILS/src/templates/staff/navbar.tt2
+
+commit 10f15b04854296c78b35224af1784cced716916a
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Wed Mar 16 18:10:12 2016 -0400
+
+ LP#1554714 Ang 1.5 requires service to return an object
+
+ Return a {} from the dummy patronSvc service used by the standalone
+ patron editor. Ang 1.5 requires services to return non-null.
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+1 1 Open-ILS/web/js/ui/default/staff/circ/patron/register.js
+
+commit f9b0b5a7fd0424a5c63cfa545749134d8d91b538
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Wed Mar 16 18:09:51 2016 -0400
+
+ LP#1554714 eg-date-input relays ng-blur
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+3 1 Open-ILS/src/templates/staff/share/t_datetime.tt2
+1 0 Open-ILS/web/js/ui/default/staff/services/ui.js
+
+commit 2c20d1ce06dd7636e0fae03f1da9faefd494e830
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Thu Mar 10 13:08:00 2016 -0500
+
+ LP#1554714 Migrate eg-date-input to ui-datepicker-popup
+
+ Also add support for uib-timepicker as an option secondary component of
+ the input.
+
+ Refactor existing use of eg-date-input to use <eg-date-input/>-style
+ declaration to better differentiate between a normal <input> and the
+ more complete/stylized date input div.
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+1 0 Open-ILS/src/templates/staff/base_js.tt2
+1 2 Open-ILS/src/templates/staff/circ/checkin/t_checkin.tt2
+22 11 Open-ILS/src/templates/staff/circ/patron/t_bill_history.tt2
+1 2 Open-ILS/src/templates/staff/circ/patron/t_checkout.tt2
+8 10 Open-ILS/src/templates/staff/circ/patron/t_edit.tt2
+3 3 Open-ILS/src/templates/staff/circ/patron/t_edit_due_date_dialog.tt2
+12 7 Open-ILS/src/templates/staff/circ/patron/t_messages.tt2
+1 2 Open-ILS/src/templates/staff/circ/patron/t_renew_with_date_dialog.tt2
+1 1 Open-ILS/src/templates/staff/circ/renew/t_renew.tt2
+1 2 Open-ILS/src/templates/staff/circ/share/t_backdate_dialog.tt2
+11 7 Open-ILS/src/templates/staff/circ/share/t_hold_dates.tt2
+3 2 Open-ILS/src/templates/staff/circ/share/t_mark_claims_returned_dialog.tt2
+38 0 Open-ILS/src/templates/staff/share/t_datetime.tt2
+20 35 Open-ILS/web/js/ui/default/staff/services/ui.js
+ create mode 100644 Open-ILS/src/templates/staff/share/t_datetime.tt2
+
+commit 9643e60d45a84a8562b8228b3d1d14ac0a93a25e
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Wed Mar 9 14:00:27 2016 -0500
+
+ LP#1554714 Patron reg DoB via datepicker
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+4 1 Open-ILS/src/templates/staff/circ/patron/t_edit.tt2
+
+commit 636812ad7cba1f3aca1a5038485c4d4a91736844
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Wed Mar 9 14:01:31 2016 -0500
+
+ LP#1554714 Patron reg DoB parse month bug repair
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+1 1 Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js
+
+commit 34f53d9225556ec4553e5ddc4c5ed6fd09bd7b72
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Wed Mar 9 08:38:41 2016 -0500
+
+ LP#1554714 Patron reg 1.5 controller consolidation
+
+ Angular 1.4+ requires that each controller be instantiated via the
+ module.controller() function. No more global functions. The patron
+ reg. controller, shared by 2 different modules, was defined as a global
+ function. Resolve this by hanging it off the core module (when loaded).
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+7 8 Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js
+0 1 Open-ILS/web/js/ui/default/staff/circ/patron/register.js
+
+commit 31dc20a3bdc4e0debe69ff41be8bed1a2ab8d410
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Tue Mar 8 16:12:48 2016 -0500
+
+ LP#1554714 angular-bootstrap 1.4 uibModal migration
+
+ angular-bootstrap's $modal module is now known as $uibModal. Ditto
+ $uibModalInstance.
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+25 25 Open-ILS/web/js/ui/default/staff/cat/bucket/copy/app.js
+36 36 Open-ILS/web/js/ui/default/staff/cat/bucket/record/app.js
+37 37 Open-ILS/web/js/ui/default/staff/cat/catalog/app.js
+6 6 Open-ILS/web/js/ui/default/staff/cat/services/holdings.js
+19 19 Open-ILS/web/js/ui/default/staff/cat/services/marcedit.js
+7 7 Open-ILS/web/js/ui/default/staff/cat/volcopy/app.js
+22 22 Open-ILS/web/js/ui/default/staff/cat/z3950/app.js
+16 16 Open-ILS/web/js/ui/default/staff/circ/patron/app.js
+2 4 Open-ILS/web/js/ui/default/staff/circ/patron/bills.js
+2 2 Open-ILS/web/js/ui/default/staff/circ/patron/checkout.js
+12 12 Open-ILS/web/js/ui/default/staff/circ/patron/items_out.js
+13 15 Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js
+7 7 Open-ILS/web/js/ui/default/staff/circ/services/billing.js
+62 62 Open-ILS/web/js/ui/default/staff/circ/services/circ.js
+44 44 Open-ILS/web/js/ui/default/staff/circ/services/holds.js
+20 20 Open-ILS/web/js/ui/default/staff/services/ui.js
+
+commit 43e7bc4fb44f46fc6374fb626e01004fcdf2d950
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Tue Mar 8 16:01:15 2016 -0500
+
+ LP#1554714 Browser client dependency updates note
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+20 0 Open-ILS/web/js/ui/default/staff/README.install
+
+commit 2b67c0ddf140b1667a3f0eff73af839740bd8302
+Author: Bill Erickson <berickxx@gmail.com>
+Date: Tue Mar 8 15:58:33 2016 -0500
+
+ LP#1554714 Angular 1.5 + deps bower.json updates
+
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+9 11 Open-ILS/web/js/ui/default/staff/bower.json
+
+commit 4db8e49cf355eb03f353041bc3679dab935bd9f4
+Author: Jason Stephenson <jason@sigio.com>
+Date: Thu Apr 21 23:29:42 2016 -0400
+
+ LP#1573372: Opt-in test broken because it uses bail-out.
+
+ Use skip instead!
+
+ Signed-off-by: Jason Stephenson <jason@sigio.com>
+ Signed-off-by: Ben Shum <ben@evergreener.net>
+
+115 116 Open-ILS/src/perlmods/live_t/15-lp1533329-opt-in.t
+
+commit 9ed71b6bb17b9c15b700b48999d9014168deff63
+Author: Jason Stephenson <jason@sigio.com>
+Date: Thu Apr 21 23:00:09 2016 -0400
+
+ LP#1573364: Use a timezone in the future backdate checkin test.
+
+ Signed-off-by: Jason Stephenson <jason@sigio.com>
+ Signed-off-by: Ben Shum <ben@evergreener.net>
+
+1 1 Open-ILS/src/perlmods/live_t/11-lp1481036-future-backdate.t
+
+commit ffd11aefdca6c119ab2bba456ef1f2fa778e2ee3
+Author: Jason Stephenson <jason@sigio.com>
+Date: Sat Mar 26 20:16:34 2016 -0400
+
+ LP 1562426: Renumber Perl live_t tests.
+
+ We had some overlap in numbers at the beginning of test file names.
+ The OCD in me think this should be straightened out. This branch
+ renumbers the duplicates starting with 10-.
+
+ Signed-off-by: Jason Stephenson <jason@sigio.com>
+ Signed-off-by: Ben Shum <ben@evergreener.net>
+
+0 36 Open-ILS/src/perlmods/live_t/10-lp1481036-future-backdate.t
+0 38 Open-ILS/src/perlmods/live_t/10-lp1484989_dont_close_fined_xacts.t
+0 43 Open-ILS/src/perlmods/live_t/11-lp1240119-safe-token-activity.t
+36 0 Open-ILS/src/perlmods/live_t/11-lp1481036-future-backdate.t
+38 0 Open-ILS/src/perlmods/live_t/12-lp1484989_dont_close_fined_xacts.t
+0 252 Open-ILS/src/perlmods/live_t/12-lp1499123_csp_ignore_proximity.t
+0 174 Open-ILS/src/perlmods/live_t/12-lp1533329-opt-in.t
+0 88 Open-ILS/src/perlmods/live_t/13-acq-invoicing.t
+43 0 Open-ILS/src/perlmods/live_t/13-lp1240119-safe-token-activity.t
+252 0 Open-ILS/src/perlmods/live_t/14-lp1499123_csp_ignore_proximity.t
+174 0 Open-ILS/src/perlmods/live_t/15-lp1533329-opt-in.t
+88 0 Open-ILS/src/perlmods/live_t/16-acq-invoicing.t
+ delete mode 100644 Open-ILS/src/perlmods/live_t/10-lp1481036-future-backdate.t
+ delete mode 100644 Open-ILS/src/perlmods/live_t/10-lp1484989_dont_close_fined_xacts.t
+ delete mode 100644 Open-ILS/src/perlmods/live_t/11-lp1240119-safe-token-activity.t
+ create mode 100644 Open-ILS/src/perlmods/live_t/11-lp1481036-future-backdate.t
+ create mode 100644 Open-ILS/src/perlmods/live_t/12-lp1484989_dont_close_fined_xacts.t
+ delete mode 100644 Open-ILS/src/perlmods/live_t/12-lp1499123_csp_ignore_proximity.t
+ delete mode 100644 Open-ILS/src/perlmods/live_t/12-lp1533329-opt-in.t
+ delete mode 100644 Open-ILS/src/perlmods/live_t/13-acq-invoicing.t
+ create mode 100644 Open-ILS/src/perlmods/live_t/13-lp1240119-safe-token-activity.t
+ create mode 100644 Open-ILS/src/perlmods/live_t/14-lp1499123_csp_ignore_proximity.t
+ create mode 100644 Open-ILS/src/perlmods/live_t/15-lp1533329-opt-in.t
+ create mode 100644 Open-ILS/src/perlmods/live_t/16-acq-invoicing.t
+
+commit 7212b5074df1cda1af1aef2ec6a7aa600c3c6c04
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Thu Mar 31 16:50:51 2016 -0400
+
+ LP#1570091: webstaff: fix typo
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+1 1 Open-ILS/src/templates/staff/cat/catalog/t_holdings.tt2
+
+commit 5435c0ec37d218ffeb59a5bc84b31d9a2f644af5
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Thu Mar 31 16:47:02 2016 -0400
+
+ LP#1570091: webstaff: fix transfer Volumes to Previously Marked Library
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+1 1 Open-ILS/src/templates/staff/cat/catalog/t_holdings.tt2
+6 2 Open-ILS/web/js/ui/default/staff/cat/catalog/app.js
+
+commit 15fa6be7eba1ed9f8968f99f890e8db0a517fd6c
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Wed Mar 30 22:13:43 2016 -0400
+
+ LP#1570091: webstaff: isolate the scope of eg-status-bar
+
+ The messages array was fighting with ngToast's
+ messages array... and winning.
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+2 1 Open-ILS/web/js/ui/default/staff/services/statusbar.js
+
+commit 66d120bdd8f10ac907a5654f4bf5f18a1d325d82
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Wed Mar 30 17:25:06 2016 -0400
+
+ LP#1570091: webstaff: make use of ngToast for holdings action notifications
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+14 0 Open-ILS/src/templates/staff/cat/catalog/index.tt2
+20 3 Open-ILS/web/js/ui/default/staff/cat/catalog/app.js
+
+commit 05a95958d49e6b9fdbd2d817e8261d9e1a57bb58
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Wed Mar 30 17:24:32 2016 -0400
+
+ LP#1570091: webstaff: fix deps for ngToast, and put it in place gloablly
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+1 0 Open-ILS/src/templates/staff/base.tt2
+2 0 Open-ILS/src/templates/staff/base_js.tt2
+6 0 Open-ILS/web/js/ui/default/staff/Gruntfile.js
+2 1 Open-ILS/web/js/ui/default/staff/bower.json
+
+commit c309391a11a21db0b55444ddc35c4bdefbc5138f
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Wed Mar 30 13:32:23 2016 -0400
+
+ LP#1570091: webstaff: add tree control and a simple toaster for notifications
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+4 0 Open-ILS/src/templates/staff/base.tt2
+2 0 Open-ILS/src/templates/staff/base_js.tt2
+14 2 Open-ILS/web/js/ui/default/staff/Gruntfile.js
+3 1 Open-ILS/web/js/ui/default/staff/bower.json
+
+commit b7e42d60141bdf73d104017e6ead3509d73088a9
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Fri Mar 25 16:30:02 2016 -0400
+
+ LP#1570091: webstaff: always check for duplciate barcodes
+
+ ... and disallow saving if critical data is missing
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+4 4 Open-ILS/src/templates/staff/cat/volcopy/t_edit.tt2
+1 1 Open-ILS/src/templates/staff/share/t_autogrid.tt2
+31 10 Open-ILS/web/js/ui/default/staff/cat/volcopy/app.js
+
+commit 5001213edf127746fdcc9307c5bde5ea18c82da8
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Fri Mar 25 13:52:54 2016 -0400
+
+ LP#1539084: webstaff: sort column picker entries by class path and column labels
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+ Conflicts:
+ Open-ILS/web/js/ui/default/staff/services/grid.js
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+26 12 Open-ILS/web/js/ui/default/staff/services/grid.js
+
+commit 3a1efa015770a67b5726d922611c5d8f91560414
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Fri Mar 4 12:34:27 2016 -0500
+
+ LP#1570091: webstaff: make the vandelay page taller
+
+ ... to support extra-large queue inspection interfaces
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+1 1 Open-ILS/web/js/ui/default/staff/services/eframe.js
+
+commit fc007e72a960d93bac7ed514a9bc4f1b8d525240
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Fri Mar 4 12:14:07 2016 -0500
+
+ LP#1570091: webstaff: Add Cancel Transit action to item status
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+9 7 Open-ILS/src/templates/staff/cat/item/t_list.tt2
+9 0 Open-ILS/web/js/ui/default/staff/cat/item/app.js
+
+commit 3b311dfb1d6742880d17b479cf28552165e35d06
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Thu Mar 3 14:12:37 2016 -0500
+
+ LP#1570091: webstaff: indicate warning/error conditions in volcopy editor
+
+ Indicate when the user has an empty barcode, duplicate barcode,
+ or empty call number label.
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+3 0 Open-ILS/src/templates/staff/cat/volcopy/t_edit.tt2
+38 2 Open-ILS/web/js/ui/default/staff/cat/volcopy/app.js
+
+commit 84e988e9684f4a445a820afcb5f8933bb7796f5f
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Thu Mar 3 12:13:08 2016 -0500
+
+ LP#1570091: webstaff: adding item status actions
+
+ - add items to bucket
+ - request items
+ - Link as Conjoined to Previously Marked Bib Record
+ - Delete Copies
+ - Check In Copies
+ - Renew Copies
+ - Show Triggered Events
+ - Show Item Holds
+ - Show Record Holds
+ - Mark Item As Damaged
+ - Mark Item as Missing
+ - Add Copies
+ - Add Volumes and Copies
+ - Edit Volumes
+ - Edit Copies
+ - Edit Volumes and Copies
+ - Replace Barcodes
+ - Transfer Items to Previously Marked Library
+ - Transfer Items to Previously Marked Volume
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+20 0 Open-ILS/src/templates/staff/cat/item/index.tt2
+44 0 Open-ILS/src/templates/staff/cat/item/t_list.tt2
+567 3 Open-ILS/web/js/ui/default/staff/cat/item/app.js
+
+commit 1f0af17da634454c59ca62af07db95db212fcbe5
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Wed Feb 24 11:32:50 2016 -0500
+
+ LP#1570091: webstaff: fix handling of default copy status
+
+ The status must be an int, so we cast it when coming from an YAOUS
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+3 2 Open-ILS/web/js/ui/default/staff/cat/volcopy/app.js
+
+commit 4d4807e49c3f2f18f7ec1340182193a5c50deab3
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Wed Feb 24 11:02:42 2016 -0500
+
+ LP#1570091: Show (index / hit count) in the Back To Results button
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+ Conflicts:
+ Open-ILS/src/templates/opac/parts/record/navigation.tt2
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+5 0 Open-ILS/src/templates/opac/parts/record/navigation.tt2
+1 1 Open-ILS/src/templates/staff/cat/catalog/t_catalog.tt2
+19 0 Open-ILS/web/js/ui/default/staff/cat/catalog/app.js
+
+commit 275d24ece6f3d722c9c8f682ab0f79566590e603
+Author: Mike Rylander <mrylander@gmail.com>
+Date: Wed Feb 24 09:54:29 2016 -0500
+
+ LP#1570091: webstaff: tweak display of fixed fields in MARC editor
+
+ - Add border to FF boxes
+ - align Source mnewmonic for the day that the seed data exists
+
+ Signed-off-by: Mike Rylander <mrylander@gmail.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+ Signed-off-by: Bill Erickson <berickxx@gmail.com>
+
+1 2 Open-ILS/src/templates/staff/cat/share/t_marcedit.tt2
+4 0 Open-ILS/src/templates/staff/css/cat.css.tt2
+2 0 Open-ILS/web/js/ui/default/staff/cat/services/marcedit.js
+
+commit 24da1cc22d4dd029b2d888d0380854ac6209ad59
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Mon Mar 21 09:44:01 2016 -0400
+
+ clear slate of RELEASE_NOTES_NEXT entries
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+0 6 docs/RELEASE_NOTES_NEXT/Acquisitions/add_cancel_reason_85.adoc
+0 6 docs/RELEASE_NOTES_NEXT/Circulation/selfcheck_printing_fines.adoc
+0 5 docs/RELEASE_NOTES_NEXT/Circulation/selfcheck_printing_holds.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Acquisitions/add_cancel_reason_85.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/selfcheck_printing_fines.adoc
+ delete mode 100644 docs/RELEASE_NOTES_NEXT/Circulation/selfcheck_printing_holds.adoc
+
+commit 3559cd95e1bdc4012c05919e586e3b78eb23d8c8
+Author: Galen Charlton <gmc@esilibrary.com>
+Date: Thu Mar 17 17:25:14 2016 -0400
+
+ forward-port 2.10.0 release notes
+
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+1136 0 docs/RELEASE_NOTES_2_10.adoc
+ create mode 100644 docs/RELEASE_NOTES_2_10.adoc
+
+commit 0c131c677fdd4db27f70b3f50e28b6525d888468
+Author: Terran McCanna <tmccanna@georgialibraries.org>
+Date: Mon Feb 29 17:45:43 2016 -0500
+
+ LP#1551451 Hide OPAC footer when viewed inside staff client
+
+ This patch hides the contents of opac/parts/footer.tt2 if being
+ viewed in a 'staff' context.
+
+ To test, view same OPAC pages through browser and through Staff Client.
+
+ Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
+ Signed-off-by: Erica Rohlfs <erohfls@esilibrary.com>
+ Signed-off-by: Galen Charlton <gmc@esilibrary.com>
+
+2 0 Open-ILS/src/templates/opac/parts/footer.tt2
--- /dev/null
+--Upgrade Script for 2.10.7 to 2.11.0
+\set eg_version '''2.11.0'''
+BEGIN;
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('2.11.0', :eg_version);
+
+SELECT evergreen.upgrade_deps_block_check('0979', :eg_version);
+
+-- Replace connectby from the tablefunc extension with CTEs
+
+
+CREATE OR REPLACE FUNCTION permission.grp_ancestors( INT ) RETURNS SETOF permission.grp_tree AS $$
+ WITH RECURSIVE grp_ancestors_distance(id, distance) AS (
+ SELECT $1, 0
+ UNION
+ SELECT ou.parent, ouad.distance+1
+ FROM permission.grp_tree ou JOIN grp_ancestors_distance ouad ON (ou.id = ouad.id)
+ WHERE ou.parent IS NOT NULL
+ )
+ SELECT ou.* FROM permission.grp_tree ou JOIN grp_ancestors_distance ouad USING (id) ORDER BY ouad.distance DESC;
+$$ LANGUAGE SQL ROWS 1;
+
+-- Add a utility function to find descendant groups.
+
+CREATE OR REPLACE FUNCTION permission.grp_descendants( INT ) RETURNS SETOF permission.grp_tree AS $$
+ WITH RECURSIVE descendant_depth AS (
+ SELECT gr.id,
+ gr.parent
+ FROM permission.grp_tree gr
+ WHERE gr.id = $1
+ UNION ALL
+ SELECT gr.id,
+ gr.parent
+ FROM permission.grp_tree gr
+ JOIN descendant_depth dd ON (dd.id = gr.parent)
+ ) SELECT gr.* FROM permission.grp_tree gr JOIN descendant_depth USING (id);
+$$ LANGUAGE SQL ROWS 1;
+
+-- Add utility functions to work with permission groups as general tree-ish sets.
+
+CREATE OR REPLACE FUNCTION permission.grp_tree_full_path ( INT ) RETURNS SETOF permission.grp_tree AS $$
+ SELECT *
+ FROM permission.grp_ancestors($1)
+ UNION
+ SELECT *
+ FROM permission.grp_descendants($1);
+$$ LANGUAGE SQL STABLE ROWS 1;
+
+CREATE OR REPLACE FUNCTION permission.grp_tree_combined_ancestors ( INT, INT ) RETURNS SETOF permission.grp_tree AS $$
+ SELECT *
+ FROM permission.grp_ancestors($1)
+ UNION
+ SELECT *
+ FROM permission.grp_ancestors($2);
+$$ LANGUAGE SQL STABLE ROWS 1;
+
+CREATE OR REPLACE FUNCTION permission.grp_tree_common_ancestors ( INT, INT ) RETURNS SETOF permission.grp_tree AS $$
+ SELECT *
+ FROM permission.grp_ancestors($1)
+ INTERSECT
+ SELECT *
+ FROM permission.grp_ancestors($2);
+$$ LANGUAGE SQL STABLE ROWS 1;
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0980', :eg_version);
+
+ALTER TABLE vandelay.merge_profile ADD COLUMN update_bib_source BOOLEAN NOT NULL DEFAULT false;
+UPDATE vandelay.merge_profile SET update_bib_source = true WHERE id=2;
+
+CREATE OR REPLACE FUNCTION vandelay.overlay_bib_record ( import_id BIGINT, eg_id BIGINT, merge_profile_id INT ) RETURNS BOOL AS $$
+DECLARE
+ editor_string TEXT;
+ editor_id INT;
+ v_marc TEXT;
+ v_bib_source INT;
+ update_fields TEXT[];
+ update_query TEXT;
+ update_bib BOOL;
+BEGIN
+
+ SELECT q.marc, q.bib_source INTO v_marc, v_bib_source
+ FROM vandelay.queued_bib_record q
+ JOIN vandelay.bib_match m ON (m.queued_record = q.id AND q.id = import_id)
+ LIMIT 1;
+
+ IF v_marc IS NULL THEN
+ -- RAISE NOTICE 'no marc for vandelay or bib record';
+ RETURN FALSE;
+ END IF;
+
+ IF vandelay.template_overlay_bib_record( v_marc, eg_id, merge_profile_id) THEN
+ UPDATE vandelay.queued_bib_record
+ SET imported_as = eg_id,
+ import_time = NOW()
+ WHERE id = import_id;
+
+ SELECT q.update_bib_source INTO update_bib FROM vandelay.merge_profile q where q.id = merge_profile_id;
+
+ IF update_bib THEN
+ editor_string := (oils_xpath('//*[@tag="905"]/*[@code="u"]/text()',v_marc))[1];
+
+ IF editor_string IS NOT NULL AND editor_string <> '' THEN
+ SELECT usr INTO editor_id FROM actor.card WHERE barcode = editor_string;
+
+ IF editor_id IS NULL THEN
+ SELECT id INTO editor_id FROM actor.usr WHERE usrname = editor_string;
+ END IF;
+
+ IF editor_id IS NOT NULL THEN
+ --only update the edit date if we have a valid editor
+ update_fields := ARRAY_APPEND(update_fields, 'editor = ' || editor_id || ', edit_date = NOW()');
+ END IF;
+ END IF;
+
+ IF v_bib_source IS NOT NULL THEN
+ update_fields := ARRAY_APPEND(update_fields, 'source = ' || v_bib_source);
+ END IF;
+
+ IF ARRAY_LENGTH(update_fields, 1) > 0 THEN
+ update_query := 'UPDATE biblio.record_entry SET ' || ARRAY_TO_STRING(update_fields, ',') || ' WHERE id = ' || eg_id || ';';
+ --RAISE NOTICE 'query: %', update_query;
+ EXECUTE update_query;
+ END IF;
+ END IF;
+
+ RETURN TRUE;
+ END IF;
+
+ -- RAISE NOTICE 'update of biblio.record_entry failed';
+
+ RETURN FALSE;
+
+END;
+$$ LANGUAGE PLPGSQL;
+
+
+SELECT evergreen.upgrade_deps_block_check('0982', :eg_version);
+
+CREATE OR REPLACE FUNCTION permission.usr_has_perm_at_nd(
+ user_id IN INTEGER,
+ perm_code IN TEXT
+)
+RETURNS SETOF INTEGER AS $$
+--
+-- Return a set of all the org units for which a given user has a given
+-- permission, granted directly (not through inheritance from a parent
+-- org unit).
+--
+-- The permissions apply to a minimum depth of the org unit hierarchy,
+-- for the org unit(s) to which the user is assigned. (They also apply
+-- to the subordinates of those org units, but we don't report the
+-- subordinates here.)
+--
+-- For purposes of this function, the permission.usr_work_ou_map table
+-- defines which users belong to which org units. I.e. we ignore the
+-- home_ou column of actor.usr.
+--
+-- The result set may contain duplicates, which should be eliminated
+-- by a DISTINCT clause.
+--
+DECLARE
+ b_super BOOLEAN;
+ n_perm INTEGER;
+ n_min_depth INTEGER;
+ n_work_ou INTEGER;
+ n_curr_ou INTEGER;
+ n_depth INTEGER;
+ n_curr_depth INTEGER;
+BEGIN
+ --
+ -- Check for superuser
+ --
+ SELECT INTO b_super
+ super_user
+ FROM
+ actor.usr
+ WHERE
+ id = user_id;
+ --
+ IF NOT FOUND THEN
+ return; -- No user? No permissions.
+ ELSIF b_super THEN
+ --
+ -- Super user has all permissions everywhere
+ --
+ FOR n_work_ou IN
+ SELECT
+ id
+ FROM
+ actor.org_unit
+ WHERE
+ parent_ou IS NULL
+ LOOP
+ RETURN NEXT n_work_ou;
+ END LOOP;
+ RETURN;
+ END IF;
+ --
+ -- Translate the permission name
+ -- to a numeric permission id
+ --
+ SELECT INTO n_perm
+ id
+ FROM
+ permission.perm_list
+ WHERE
+ code = perm_code;
+ --
+ IF NOT FOUND THEN
+ RETURN; -- No such permission
+ END IF;
+ --
+ -- Find the highest-level org unit (i.e. the minimum depth)
+ -- to which the permission is applied for this user
+ --
+ -- This query is modified from the one in permission.usr_perms().
+ --
+ SELECT INTO n_min_depth
+ min( depth )
+ FROM (
+ SELECT depth
+ FROM permission.usr_perm_map upm
+ WHERE upm.usr = user_id
+ AND (upm.perm = n_perm OR upm.perm = -1)
+ UNION
+ SELECT gpm.depth
+ FROM permission.grp_perm_map gpm
+ WHERE (gpm.perm = n_perm OR gpm.perm = -1)
+ AND gpm.grp IN (
+ SELECT (permission.grp_ancestors(
+ (SELECT profile FROM actor.usr WHERE id = user_id)
+ )).id
+ )
+ UNION
+ SELECT p.depth
+ FROM permission.grp_perm_map p
+ WHERE (p.perm = n_perm OR p.perm = -1)
+ AND p.grp IN (
+ SELECT (permission.grp_ancestors(m.grp)).id
+ FROM permission.usr_grp_map m
+ WHERE m.usr = user_id
+ )
+ ) AS x;
+ --
+ IF NOT FOUND THEN
+ RETURN; -- No such permission for this user
+ END IF;
+ --
+ -- Identify the org units to which the user is assigned. Note that
+ -- we pay no attention to the home_ou column in actor.usr.
+ --
+ FOR n_work_ou IN
+ SELECT
+ work_ou
+ FROM
+ permission.usr_work_ou_map
+ WHERE
+ usr = user_id
+ LOOP -- For each org unit to which the user is assigned
+ --
+ -- Determine the level of the org unit by a lookup in actor.org_unit_type.
+ -- We take it on faith that this depth agrees with the actual hierarchy
+ -- defined in actor.org_unit.
+ --
+ SELECT INTO n_depth
+ type.depth
+ FROM
+ actor.org_unit_type type
+ INNER JOIN actor.org_unit ou
+ ON ( ou.ou_type = type.id )
+ WHERE
+ ou.id = n_work_ou;
+ --
+ IF NOT FOUND THEN
+ CONTINUE; -- Maybe raise exception?
+ END IF;
+ --
+ -- Compare the depth of the work org unit to the
+ -- minimum depth, and branch accordingly
+ --
+ IF n_depth = n_min_depth THEN
+ --
+ -- The org unit is at the right depth, so return it.
+ --
+ RETURN NEXT n_work_ou;
+ ELSIF n_depth > n_min_depth THEN
+ --
+ -- Traverse the org unit tree toward the root,
+ -- until you reach the minimum depth determined above
+ --
+ n_curr_depth := n_depth;
+ n_curr_ou := n_work_ou;
+ WHILE n_curr_depth > n_min_depth LOOP
+ SELECT INTO n_curr_ou
+ parent_ou
+ FROM
+ actor.org_unit
+ WHERE
+ id = n_curr_ou;
+ --
+ IF FOUND THEN
+ n_curr_depth := n_curr_depth - 1;
+ ELSE
+ --
+ -- This can happen only if the hierarchy defined in
+ -- actor.org_unit is corrupted, or out of sync with
+ -- the depths defined in actor.org_unit_type.
+ -- Maybe we should raise an exception here, instead
+ -- of silently ignoring the problem.
+ --
+ n_curr_ou = NULL;
+ EXIT;
+ END IF;
+ END LOOP;
+ --
+ IF n_curr_ou IS NOT NULL THEN
+ RETURN NEXT n_curr_ou;
+ END IF;
+ ELSE
+ --
+ -- The permission applies only at a depth greater than the work org unit.
+ -- Use connectby() to find all dependent org units at the specified depth.
+ --
+ FOR n_curr_ou IN
+ SELECT id
+ FROM actor.org_unit_descendants_distance(n_work_ou)
+ WHERE
+ distance = n_min_depth - n_depth
+ LOOP
+ RETURN NEXT n_curr_ou;
+ END LOOP;
+ END IF;
+ --
+ END LOOP;
+ --
+ RETURN;
+ --
+END;
+$$ LANGUAGE 'plpgsql' ROWS 1;
+
+
+CREATE OR REPLACE FUNCTION permission.usr_has_perm_at_all_nd(
+ user_id IN INTEGER,
+ perm_code IN TEXT
+)
+RETURNS SETOF INTEGER AS $$
+--
+-- Return a set of all the org units for which a given user has a given
+-- permission, granted either directly or through inheritance from a parent
+-- org unit.
+--
+-- The permissions apply to a minimum depth of the org unit hierarchy, and
+-- to the subordinates of those org units, for the org unit(s) to which the
+-- user is assigned.
+--
+-- For purposes of this function, the permission.usr_work_ou_map table
+-- assigns users to org units. I.e. we ignore the home_ou column of actor.usr.
+--
+-- The result set may contain duplicates, which should be eliminated
+-- by a DISTINCT clause.
+--
+DECLARE
+ n_head_ou INTEGER;
+ n_child_ou INTEGER;
+BEGIN
+ FOR n_head_ou IN
+ SELECT DISTINCT * FROM permission.usr_has_perm_at_nd( user_id, perm_code )
+ LOOP
+ --
+ -- The permission applies only at a depth greater than the work org unit.
+ --
+ FOR n_child_ou IN
+ SELECT id
+ FROM actor.org_unit_descendants(n_head_ou)
+ LOOP
+ RETURN NEXT n_child_ou;
+ END LOOP;
+ END LOOP;
+ --
+ RETURN;
+ --
+END;
+$$ LANGUAGE 'plpgsql' ROWS 1;
+
+
+\qecho The tablefunc database extension is no longer necessary for Evergreen.
+\qecho Unless you use some of its functions in your own scripts, you may
+\qecho want to run the following command in the database to drop it:
+\qecho DROP EXTENSION tablefunc;
+
+
+SELECT evergreen.upgrade_deps_block_check('0983', :eg_version);
+
+-- Create these so that the queries in the UDFs will validate
+CREATE TEMP TABLE precalc_filter_bib_list (
+ id BIGINT
+) ON COMMIT DROP;
+
+CREATE TEMP TABLE precalc_bib_filter_bib_list (
+ id BIGINT
+) ON COMMIT DROP;
+
+CREATE TEMP TABLE precalc_src_filter_bib_list (
+ id BIGINT
+) ON COMMIT DROP;
+
+CREATE TEMP TABLE precalc_copy_filter_bib_list (
+ id BIGINT,
+ copy BIGINT
+) ON COMMIT DROP;
+
+CREATE TEMP TABLE precalc_circ_mod_filter_bib_list (
+ id BIGINT,
+ copy BIGINT
+) ON COMMIT DROP;
+
+CREATE TEMP TABLE precalc_location_filter_bib_list (
+ id BIGINT,
+ copy BIGINT
+) ON COMMIT DROP;
+
+CREATE TEMP TABLE precalc_attr_filter_bib_list (
+ id BIGINT
+) ON COMMIT DROP;
+
+CREATE TEMP TABLE precalc_bibs_by_copy_list (
+ id BIGINT
+) ON COMMIT DROP;
+
+CREATE TEMP TABLE precalc_bibs_by_uri_list (
+ id BIGINT
+) ON COMMIT DROP;
+
+CREATE TEMP TABLE precalc_bibs_by_copy_or_uri_list (
+ id BIGINT
+) ON COMMIT DROP;
+
+CREATE TEMP TABLE precalc_bib_list (
+ id BIGINT
+) ON COMMIT DROP;
+
+-- rhrr needs to be a real table, so it can be fast. To that end, we use
+-- a materialized view updated via a trigger.
+
+DROP VIEW reporter.hold_request_record;
+
+CREATE TABLE reporter.hold_request_record AS
+SELECT id,
+ target,
+ hold_type,
+ CASE
+ WHEN hold_type = 'T'
+ THEN target
+ WHEN hold_type = 'I'
+ THEN (SELECT ssub.record_entry FROM serial.subscription ssub JOIN serial.issuance si ON (si.subscription = ssub.id) WHERE si.id = ahr.target)
+ WHEN hold_type = 'V'
+ THEN (SELECT cn.record FROM asset.call_number cn WHERE cn.id = ahr.target)
+ WHEN hold_type IN ('C','R','F')
+ THEN (SELECT cn.record FROM asset.call_number cn JOIN asset.copy cp ON (cn.id = cp.call_number) WHERE cp.id = ahr.target)
+ WHEN hold_type = 'M'
+ THEN (SELECT mr.master_record FROM metabib.metarecord mr WHERE mr.id = ahr.target)
+ WHEN hold_type = 'P'
+ THEN (SELECT bmp.record FROM biblio.monograph_part bmp WHERE bmp.id = ahr.target)
+ END AS bib_record
+ FROM action.hold_request ahr;
+
+CREATE UNIQUE INDEX reporter_hold_request_record_pkey_idx ON reporter.hold_request_record (id);
+CREATE INDEX reporter_hold_request_record_bib_record_idx ON reporter.hold_request_record (bib_record);
+
+ALTER TABLE reporter.hold_request_record ADD PRIMARY KEY USING INDEX reporter_hold_request_record_pkey_idx;
+
+CREATE FUNCTION reporter.hold_request_record_mapper () RETURNS TRIGGER AS $$
+BEGIN
+ IF TG_OP = 'INSERT' THEN
+ INSERT INTO reporter.hold_request_record (id, target, hold_type, bib_record)
+ SELECT NEW.id,
+ NEW.target,
+ NEW.hold_type,
+ CASE
+ WHEN NEW.hold_type = 'T'
+ THEN NEW.target
+ WHEN NEW.hold_type = 'I'
+ THEN (SELECT ssub.record_entry FROM serial.subscription ssub JOIN serial.issuance si ON (si.subscription = ssub.id) WHERE si.id = NEW.target)
+ WHEN NEW.hold_type = 'V'
+ THEN (SELECT cn.record FROM asset.call_number cn WHERE cn.id = NEW.target)
+ WHEN NEW.hold_type IN ('C','R','F')
+ THEN (SELECT cn.record FROM asset.call_number cn JOIN asset.copy cp ON (cn.id = cp.call_number) WHERE cp.id = NEW.target)
+ WHEN NEW.hold_type = 'M'
+ THEN (SELECT mr.master_record FROM metabib.metarecord mr WHERE mr.id = NEW.target)
+ WHEN NEW.hold_type = 'P'
+ THEN (SELECT bmp.record FROM biblio.monograph_part bmp WHERE bmp.id = NEW.target)
+ END AS bib_record;
+ ELSIF TG_OP = 'UPDATE' AND (OLD.target <> NEW.target OR OLD.hold_type <> NEW.hold_type) THEN
+ UPDATE reporter.hold_request_record
+ SET target = NEW.target,
+ hold_type = NEW.hold_type,
+ bib_record = CASE
+ WHEN NEW.hold_type = 'T'
+ THEN NEW.target
+ WHEN NEW.hold_type = 'I'
+ THEN (SELECT ssub.record_entry FROM serial.subscription ssub JOIN serial.issuance si ON (si.subscription = ssub.id) WHERE si.id = NEW.target)
+ WHEN NEW.hold_type = 'V'
+ THEN (SELECT cn.record FROM asset.call_number cn WHERE cn.id = NEW.target)
+ WHEN NEW.hold_type IN ('C','R','F')
+ THEN (SELECT cn.record FROM asset.call_number cn JOIN asset.copy cp ON (cn.id = cp.call_number) WHERE cp.id = NEW.target)
+ WHEN NEW.hold_type = 'M'
+ THEN (SELECT mr.master_record FROM metabib.metarecord mr WHERE mr.id = NEW.target)
+ WHEN NEW.hold_type = 'P'
+ THEN (SELECT bmp.record FROM biblio.monograph_part bmp WHERE bmp.id = NEW.target)
+ END;
+ END IF;
+ RETURN NEW;
+END;
+$$ LANGUAGE PLPGSQL;
+
+CREATE TRIGGER reporter_hold_request_record_trigger AFTER INSERT OR UPDATE ON action.hold_request
+ FOR EACH ROW EXECUTE PROCEDURE reporter.hold_request_record_mapper();
+
+CREATE SCHEMA rating;
+
+INSERT INTO config.global_flag (name, label, value, enabled) VALUES (
+ 'opac.default_sort',
+ 'OPAC Default Sort (titlesort, authorsort, pubdate, popularity, poprel, or empty for relevance)',
+ '',
+ TRUE
+);
+
+INSERT INTO config.global_flag (name, label, value, enabled) VALUES (
+ 'search.max_popularity_importance_multiplier',
+ oils_i18n_gettext(
+ 'search.max_popularity_importance_multiplier',
+ 'Maximum popularity importance multiplier for popularity-adjusted relevance searches (decimal value between 1.0 and 2.0)',
+ 'cgf',
+ 'label'
+ ),
+ '1.1',
+ TRUE
+);
+
+CREATE TABLE rating.popularity_parameter (
+ id INT PRIMARY KEY,
+ name TEXT NOT NULL UNIQUE, -- i18n
+ description TEXT,
+ func TEXT,
+ require_horizon BOOL NOT NULL DEFAULT FALSE,
+ require_importance BOOL NOT NULL DEFAULT FALSE,
+ require_percentile BOOL NOT NULL DEFAULT FALSE
+);
+
+INSERT INTO rating.popularity_parameter (id,name,func,require_horizon,require_importance,require_percentile) VALUES
+ (1,'Holds Filled Over Time','rating.holds_filled_over_time',TRUE,FALSE,TRUE),
+ (2,'Holds Requested Over Time','rating.holds_placed_over_time',TRUE,FALSE,TRUE),
+ (3,'Current Hold Count','rating.current_hold_count',FALSE,FALSE,TRUE),
+ (4,'Circulations Over Time','rating.circs_over_time',TRUE,FALSE,TRUE),
+ (5,'Current Circulation Count','rating.current_circ_count',FALSE,FALSE,TRUE),
+ (6,'Out/Total Ratio','rating.checked_out_total_ratio',FALSE,FALSE,TRUE),
+ (7,'Holds/Total Ratio','rating.holds_total_ratio',FALSE,FALSE,TRUE),
+ (8,'Holds/Holdable Ratio','rating.holds_holdable_ratio',FALSE,FALSE,TRUE),
+ (9,'Percent of Time Circulating','rating.percent_time_circulating',FALSE,FALSE,TRUE),
+ (10,'Bibliographic Record Age (days, newer is better)','rating.bib_record_age',FALSE,FALSE,TRUE),
+ (11,'Publication Age (days, newer is better)','rating.bib_pub_age',FALSE,FALSE,TRUE),
+ (12,'On-line Bib has attributes','rating.generic_fixed_rating_by_uri',FALSE,FALSE,FALSE),
+ (13,'Bib has attributes and copies','rating.generic_fixed_rating_by_copy',FALSE,FALSE,FALSE),
+ (14,'Bib has attributes and copies or URIs','rating.generic_fixed_rating_by_copy_or_uri',FALSE,FALSE,FALSE),
+ (15,'Bib has attributes','rating.generic_fixed_rating_global',FALSE,FALSE,FALSE);
+
+CREATE TABLE rating.badge (
+ id SERIAL PRIMARY KEY,
+ name TEXT NOT NULL,
+ description TEXT,
+ scope INT NOT NULL REFERENCES actor.org_unit (id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+ weight INT NOT NULL DEFAULT 1,
+ horizon_age INTERVAL,
+ importance_age INTERVAL,
+ importance_interval INTERVAL NOT NULL DEFAULT '1 day',
+ importance_scale NUMERIC CHECK (importance_scale IS NULL OR importance_scale > 0.0),
+ recalc_interval INTERVAL NOT NULL DEFAULT '1 month',
+ attr_filter TEXT,
+ src_filter INT REFERENCES config.bib_source (id) ON UPDATE CASCADE ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
+ circ_mod_filter TEXT REFERENCES config.circ_modifier (code) ON UPDATE CASCADE ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
+ loc_grp_filter INT REFERENCES asset.copy_location_group (id) ON UPDATE CASCADE ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
+ popularity_parameter INT NOT NULL REFERENCES rating.popularity_parameter (id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+ fixed_rating INT CHECK (fixed_rating IS NULL OR fixed_rating BETWEEN -5 AND 5),
+ percentile NUMERIC CHECK (percentile IS NULL OR (percentile >= 50.0 AND percentile < 100.0)),
+ discard INT NOT NULL DEFAULT 0,
+ last_calc TIMESTAMPTZ,
+ CONSTRAINT unique_name_scope UNIQUE (name,scope)
+);
+
+CREATE TABLE rating.record_badge_score (
+ id BIGSERIAL PRIMARY KEY,
+ record BIGINT NOT NULL REFERENCES biblio.record_entry (id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+ badge INT NOT NULL REFERENCES rating.badge (id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+ score INT NOT NULL CHECK (score BETWEEN -5 AND 5),
+ CONSTRAINT unique_record_badge UNIQUE (record,badge)
+);
+CREATE INDEX record_badge_score_badge_idx ON rating.record_badge_score (badge);
+CREATE INDEX record_badge_score_record_idx ON rating.record_badge_score (record);
+
+CREATE OR REPLACE VIEW rating.badge_with_orgs AS
+ WITH org_scope AS (
+ SELECT id,
+ array_agg(tree) AS orgs
+ FROM (SELECT id,
+ (actor.org_unit_descendants(id)).id AS tree
+ FROM actor.org_unit
+ ) x
+ GROUP BY 1
+ )
+ SELECT b.*,
+ s.orgs
+ FROM rating.badge b
+ JOIN org_scope s ON (b.scope = s.id);
+
+CREATE OR REPLACE FUNCTION rating.precalc_src_filter(src INT)
+ RETURNS INT AS $f$
+DECLARE
+ cnt INT := 0;
+BEGIN
+
+ SET LOCAL client_min_messages = error;
+ DROP TABLE IF EXISTS precalc_src_filter_bib_list;
+ IF src IS NOT NULL THEN
+ CREATE TEMP TABLE precalc_src_filter_bib_list ON COMMIT DROP AS
+ SELECT id FROM biblio.record_entry
+ WHERE source = src AND NOT deleted;
+ ELSE
+ CREATE TEMP TABLE precalc_src_filter_bib_list ON COMMIT DROP AS
+ SELECT id FROM biblio.record_entry
+ WHERE id > 0 AND NOT deleted;
+ END IF;
+
+ SELECT count(*) INTO cnt FROM precalc_src_filter_bib_list;
+ RETURN cnt;
+END;
+$f$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION rating.precalc_circ_mod_filter(cm TEXT)
+ RETURNS INT AS $f$
+DECLARE
+ cnt INT := 0;
+BEGIN
+
+ SET LOCAL client_min_messages = error;
+ DROP TABLE IF EXISTS precalc_circ_mod_filter_bib_list;
+ IF cm IS NOT NULL THEN
+ CREATE TEMP TABLE precalc_circ_mod_filter_bib_list ON COMMIT DROP AS
+ SELECT cn.record AS id,
+ cp.id AS copy
+ FROM asset.call_number cn
+ JOIN asset.copy cp ON (cn.id = cp.call_number)
+ WHERE cp.circ_modifier = cm
+ AND NOT cp.deleted;
+ ELSE
+ CREATE TEMP TABLE precalc_circ_mod_filter_bib_list ON COMMIT DROP AS
+ SELECT cn.record AS id,
+ cp.id AS copy
+ FROM asset.call_number cn
+ JOIN asset.copy cp ON (cn.id = cp.call_number)
+ WHERE NOT cp.deleted;
+ END IF;
+
+ SELECT count(*) INTO cnt FROM precalc_circ_mod_filter_bib_list;
+ RETURN cnt;
+END;
+$f$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION rating.precalc_location_filter(loc INT)
+ RETURNS INT AS $f$
+DECLARE
+ cnt INT := 0;
+BEGIN
+
+ SET LOCAL client_min_messages = error;
+ DROP TABLE IF EXISTS precalc_location_filter_bib_list;
+ IF loc IS NOT NULL THEN
+ CREATE TEMP TABLE precalc_location_filter_bib_list ON COMMIT DROP AS
+ SELECT cn.record AS id,
+ cp.id AS copy
+ FROM asset.call_number cn
+ JOIN asset.copy cp ON (cn.id = cp.call_number)
+ JOIN asset.copy_location_group_map lg ON (cp.location = lg.location)
+ WHERE lg.lgroup = loc
+ AND NOT cp.deleted;
+ ELSE
+ CREATE TEMP TABLE precalc_location_filter_bib_list ON COMMIT DROP AS
+ SELECT cn.record AS id,
+ cp.id AS copy
+ FROM asset.call_number cn
+ JOIN asset.copy cp ON (cn.id = cp.call_number)
+ WHERE NOT cp.deleted;
+ END IF;
+
+ SELECT count(*) INTO cnt FROM precalc_location_filter_bib_list;
+ RETURN cnt;
+END;
+$f$ LANGUAGE PLPGSQL;
+
+-- all or limited...
+CREATE OR REPLACE FUNCTION rating.precalc_attr_filter(attr_filter TEXT)
+ RETURNS INT AS $f$
+DECLARE
+ cnt INT := 0;
+ afilter TEXT;
+BEGIN
+
+ SET LOCAL client_min_messages = error;
+ DROP TABLE IF EXISTS precalc_attr_filter_bib_list;
+ IF attr_filter IS NOT NULL THEN
+ afilter := metabib.compile_composite_attr(attr_filter);
+ CREATE TEMP TABLE precalc_attr_filter_bib_list ON COMMIT DROP AS
+ SELECT source AS id FROM metabib.record_attr_vector_list
+ WHERE vlist @@ metabib.compile_composite_attr(attr_filter);
+ ELSE
+ CREATE TEMP TABLE precalc_attr_filter_bib_list ON COMMIT DROP AS
+ SELECT source AS id FROM metabib.record_attr_vector_list;
+ END IF;
+
+ SELECT count(*) INTO cnt FROM precalc_attr_filter_bib_list;
+ RETURN cnt;
+END;
+$f$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION rating.precalc_bibs_by_copy(badge_id INT)
+ RETURNS INT AS $f$
+DECLARE
+ cnt INT := 0;
+ badge_row rating.badge_with_orgs%ROWTYPE;
+ base TEXT;
+ whr TEXT;
+BEGIN
+
+ SELECT * INTO badge_row FROM rating.badge_with_orgs WHERE id = badge_id;
+
+ SET LOCAL client_min_messages = error;
+ DROP TABLE IF EXISTS precalc_bibs_by_copy_list;
+ CREATE TEMP TABLE precalc_bibs_by_copy_list ON COMMIT DROP AS
+ SELECT DISTINCT cn.record AS id
+ FROM asset.call_number cn
+ JOIN asset.copy cp ON (cp.call_number = cn.id AND NOT cp.deleted)
+ JOIN precalc_copy_filter_bib_list f ON (cp.id = f.copy)
+ WHERE cn.owning_lib = ANY (badge_row.orgs)
+ AND NOT cn.deleted;
+
+ SELECT count(*) INTO cnt FROM precalc_bibs_by_copy_list;
+ RETURN cnt;
+END;
+$f$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION rating.precalc_bibs_by_uri(badge_id INT)
+ RETURNS INT AS $f$
+DECLARE
+ cnt INT := 0;
+ badge_row rating.badge_with_orgs%ROWTYPE;
+BEGIN
+
+ SELECT * INTO badge_row FROM rating.badge_with_orgs WHERE id = badge_id;
+
+ SET LOCAL client_min_messages = error;
+ DROP TABLE IF EXISTS precalc_bibs_by_uri_list;
+ CREATE TEMP TABLE precalc_bibs_by_uri_list ON COMMIT DROP AS
+ SELECT DISTINCT record AS id
+ FROM asset.call_number cn
+ JOIN asset.uri_call_number_map urim ON (urim.call_number = cn.id)
+ JOIN asset.uri uri ON (urim.uri = uri.id AND uri.active)
+ WHERE cn.owning_lib = ANY (badge_row.orgs)
+ AND cn.label = '##URI##'
+ AND NOT cn.deleted;
+
+ SELECT count(*) INTO cnt FROM precalc_bibs_by_uri_list;
+ RETURN cnt;
+END;
+$f$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION rating.precalc_bibs_by_copy_or_uri(badge_id INT)
+ RETURNS INT AS $f$
+DECLARE
+ cnt INT := 0;
+BEGIN
+
+ PERFORM rating.precalc_bibs_by_copy(badge_id);
+ PERFORM rating.precalc_bibs_by_uri(badge_id);
+
+ SET LOCAL client_min_messages = error;
+ DROP TABLE IF EXISTS precalc_bibs_by_copy_or_uri_list;
+ CREATE TEMP TABLE precalc_bibs_by_copy_or_uri_list ON COMMIT DROP AS
+ SELECT id FROM precalc_bibs_by_copy_list
+ UNION
+ SELECT id FROM precalc_bibs_by_uri_list;
+
+ SELECT count(*) INTO cnt FROM precalc_bibs_by_copy_or_uri_list;
+ RETURN cnt;
+END;
+$f$ LANGUAGE PLPGSQL;
+
+
+CREATE OR REPLACE FUNCTION rating.recalculate_badge_score ( badge_id INT, setup_only BOOL DEFAULT FALSE ) RETURNS VOID AS $f$
+DECLARE
+ badge_row rating.badge%ROWTYPE;
+ param rating.popularity_parameter%ROWTYPE;
+BEGIN
+ SET LOCAL client_min_messages = error;
+
+ -- Find what we're doing
+ SELECT * INTO badge_row FROM rating.badge WHERE id = badge_id;
+ SELECT * INTO param FROM rating.popularity_parameter WHERE id = badge_row.popularity_parameter;
+
+ -- Calculate the filtered bib set, or all bibs if none
+ PERFORM rating.precalc_attr_filter(badge_row.attr_filter);
+ PERFORM rating.precalc_src_filter(badge_row.src_filter);
+ PERFORM rating.precalc_circ_mod_filter(badge_row.circ_mod_filter);
+ PERFORM rating.precalc_location_filter(badge_row.loc_grp_filter);
+
+ -- Bring the bib-level filter lists together
+ DROP TABLE IF EXISTS precalc_bib_filter_bib_list;
+ CREATE TEMP TABLE precalc_bib_filter_bib_list ON COMMIT DROP AS
+ SELECT id FROM precalc_attr_filter_bib_list
+ INTERSECT
+ SELECT id FROM precalc_src_filter_bib_list;
+
+ -- Bring the copy-level filter lists together. We're keeping this for bib_by_copy filtering later.
+ DROP TABLE IF EXISTS precalc_copy_filter_bib_list;
+ CREATE TEMP TABLE precalc_copy_filter_bib_list ON COMMIT DROP AS
+ SELECT id, copy FROM precalc_circ_mod_filter_bib_list
+ INTERSECT
+ SELECT id, copy FROM precalc_location_filter_bib_list;
+
+ -- Bring the collapsed filter lists together
+ DROP TABLE IF EXISTS precalc_filter_bib_list;
+ CREATE TEMP TABLE precalc_filter_bib_list ON COMMIT DROP AS
+ SELECT id FROM precalc_bib_filter_bib_list
+ INTERSECT
+ SELECT id FROM precalc_copy_filter_bib_list;
+
+ CREATE INDEX precalc_filter_bib_list_idx
+ ON precalc_filter_bib_list (id);
+
+ IF setup_only THEN
+ RETURN;
+ END IF;
+
+ -- If it's a fixed-rating badge, just do it ...
+ IF badge_row.fixed_rating IS NOT NULL THEN
+ DELETE FROM rating.record_badge_score WHERE badge = badge_id;
+ EXECUTE $e$
+ INSERT INTO rating.record_badge_score (record, badge, score)
+ SELECT record, $1, $2 FROM $e$ || param.func || $e$($1)$e$
+ USING badge_id, badge_row.fixed_rating;
+
+ UPDATE rating.badge SET last_calc = NOW() WHERE id = badge_id;
+
+ RETURN;
+ END IF;
+ -- else, calculate!
+
+ -- Make a session-local scratchpad for calculating scores
+ CREATE TEMP TABLE record_score_scratchpad (
+ bib BIGINT,
+ value NUMERIC
+ ) ON COMMIT DROP;
+
+ -- Gather raw values
+ EXECUTE $e$
+ INSERT INTO record_score_scratchpad (bib, value)
+ SELECT * FROM $e$ || param.func || $e$($1)$e$
+ USING badge_id;
+
+ IF badge_row.discard > 0 OR badge_row.percentile IS NOT NULL THEN
+ -- To speed up discard-common
+ CREATE INDEX record_score_scratchpad_score_idx ON record_score_scratchpad (value);
+ ANALYZE record_score_scratchpad;
+ END IF;
+
+ IF badge_row.discard > 0 THEN -- Remove common low values (trim the long tail)
+ DELETE FROM record_score_scratchpad WHERE value IN (
+ SELECT DISTINCT value FROM record_score_scratchpad ORDER BY value LIMIT badge_row.discard
+ );
+ END IF;
+
+ IF badge_row.percentile IS NOT NULL THEN -- Cut population down to exceptional records
+ DELETE FROM record_score_scratchpad WHERE value <= (
+ SELECT value FROM (
+ SELECT value,
+ CUME_DIST() OVER (ORDER BY value) AS p
+ FROM record_score_scratchpad
+ ) x WHERE p < badge_row.percentile / 100.0 ORDER BY p DESC LIMIT 1
+ );
+ END IF;
+
+
+ -- And, finally, push new data in
+ DELETE FROM rating.record_badge_score WHERE badge = badge_id;
+ INSERT INTO rating.record_badge_score (badge, record, score)
+ SELECT badge_id,
+ bib,
+ GREATEST(ROUND((CUME_DIST() OVER (ORDER BY value)) * 5), 1) AS value
+ FROM record_score_scratchpad;
+
+ DROP TABLE record_score_scratchpad;
+
+ -- Now, finally-finally, mark the badge as recalculated
+ UPDATE rating.badge SET last_calc = NOW() WHERE id = badge_id;
+
+ RETURN;
+END;
+$f$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION rating.holds_filled_over_time(badge_id INT)
+ RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+DECLARE
+ badge rating.badge_with_orgs%ROWTYPE;
+ iage INT := 1;
+ iint INT := NULL;
+ iscale NUMERIC := NULL;
+BEGIN
+
+ SELECT * INTO badge FROM rating.badge_with_orgs WHERE id = badge_id;
+
+ IF badge.horizon_age IS NULL THEN
+ RAISE EXCEPTION 'Badge "%" with id % requires a horizon age but has none.',
+ badge.name,
+ badge.id;
+ END IF;
+
+ PERFORM rating.precalc_bibs_by_copy(badge_id);
+
+ SET LOCAL client_min_messages = error;
+ DROP TABLE IF EXISTS precalc_bib_list;
+ CREATE TEMP TABLE precalc_bib_list ON COMMIT DROP AS
+ SELECT id FROM precalc_filter_bib_list
+ INTERSECT
+ SELECT id FROM precalc_bibs_by_copy_list;
+
+ iint := EXTRACT(EPOCH FROM badge.importance_interval);
+ IF badge.importance_age IS NOT NULL THEN
+ iage := (EXTRACT(EPOCH FROM badge.importance_age) / iint)::INT;
+ END IF;
+
+ -- if iscale is smaller than 1, scaling slope will be shallow ... BEWARE!
+ iscale := COALESCE(badge.importance_scale, 1.0);
+
+ RETURN QUERY
+ SELECT bib,
+ SUM( holds * GREATEST( iscale * (iage - hage), 1.0 ))
+ FROM (
+ SELECT f.id AS bib,
+ (1 + EXTRACT(EPOCH FROM AGE(h.fulfillment_time)) / iint)::INT AS hage,
+ COUNT(h.id)::INT AS holds
+ FROM action.hold_request h
+ JOIN reporter.hold_request_record rhrr ON (rhrr.id = h.id)
+ JOIN precalc_bib_list f ON (f.id = rhrr.bib_record)
+ WHERE h.fulfillment_time >= NOW() - badge.horizon_age
+ AND h.request_lib = ANY (badge.orgs)
+ GROUP BY 1, 2
+ ) x
+ GROUP BY 1;
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+CREATE OR REPLACE FUNCTION rating.holds_placed_over_time(badge_id INT)
+ RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+DECLARE
+ badge rating.badge_with_orgs%ROWTYPE;
+ iage INT := 1;
+ iint INT := NULL;
+ iscale NUMERIC := NULL;
+BEGIN
+
+ SELECT * INTO badge FROM rating.badge_with_orgs WHERE id = badge_id;
+
+ IF badge.horizon_age IS NULL THEN
+ RAISE EXCEPTION 'Badge "%" with id % requires a horizon age but has none.',
+ badge.name,
+ badge.id;
+ END IF;
+
+ PERFORM rating.precalc_bibs_by_copy(badge_id);
+
+ SET LOCAL client_min_messages = error;
+ DROP TABLE IF EXISTS precalc_bib_list;
+ CREATE TEMP TABLE precalc_bib_list ON COMMIT DROP AS
+ SELECT id FROM precalc_filter_bib_list
+ INTERSECT
+ SELECT id FROM precalc_bibs_by_copy_list;
+
+ iint := EXTRACT(EPOCH FROM badge.importance_interval);
+ IF badge.importance_age IS NOT NULL THEN
+ iage := (EXTRACT(EPOCH FROM badge.importance_age) / iint)::INT;
+ END IF;
+
+ -- if iscale is smaller than 1, scaling slope will be shallow ... BEWARE!
+ iscale := COALESCE(badge.importance_scale, 1.0);
+
+ RETURN QUERY
+ SELECT bib,
+ SUM( holds * GREATEST( iscale * (iage - hage), 1.0 ))
+ FROM (
+ SELECT f.id AS bib,
+ (1 + EXTRACT(EPOCH FROM AGE(h.request_time)) / iint)::INT AS hage,
+ COUNT(h.id)::INT AS holds
+ FROM action.hold_request h
+ JOIN reporter.hold_request_record rhrr ON (rhrr.id = h.id)
+ JOIN precalc_bib_list f ON (f.id = rhrr.bib_record)
+ WHERE h.request_time >= NOW() - badge.horizon_age
+ AND h.request_lib = ANY (badge.orgs)
+ GROUP BY 1, 2
+ ) x
+ GROUP BY 1;
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+CREATE OR REPLACE FUNCTION rating.current_hold_count(badge_id INT)
+ RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+DECLARE
+ badge rating.badge_with_orgs%ROWTYPE;
+BEGIN
+
+ SELECT * INTO badge FROM rating.badge_with_orgs WHERE id = badge_id;
+
+ PERFORM rating.precalc_bibs_by_copy(badge_id);
+
+ DELETE FROM precalc_copy_filter_bib_list WHERE id NOT IN (
+ SELECT id FROM precalc_filter_bib_list
+ INTERSECT
+ SELECT id FROM precalc_bibs_by_copy_list
+ );
+
+ ANALYZE precalc_copy_filter_bib_list;
+
+ RETURN QUERY
+ SELECT rhrr.bib_record AS bib,
+ COUNT(DISTINCT h.id)::NUMERIC AS holds
+ FROM action.hold_request h
+ JOIN reporter.hold_request_record rhrr ON (rhrr.id = h.id)
+ JOIN action.hold_copy_map m ON (m.hold = h.id)
+ JOIN precalc_copy_filter_bib_list cf ON (rhrr.bib_record = cf.id AND m.target_copy = cf.copy)
+ WHERE h.fulfillment_time IS NULL
+ AND h.request_lib = ANY (badge.orgs)
+ GROUP BY 1;
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+CREATE OR REPLACE FUNCTION rating.circs_over_time(badge_id INT)
+ RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+DECLARE
+ badge rating.badge_with_orgs%ROWTYPE;
+ iage INT := 1;
+ iint INT := NULL;
+ iscale NUMERIC := NULL;
+BEGIN
+
+ SELECT * INTO badge FROM rating.badge_with_orgs WHERE id = badge_id;
+
+ IF badge.horizon_age IS NULL THEN
+ RAISE EXCEPTION 'Badge "%" with id % requires a horizon age but has none.',
+ badge.name,
+ badge.id;
+ END IF;
+
+ PERFORM rating.precalc_bibs_by_copy(badge_id);
+
+ DELETE FROM precalc_copy_filter_bib_list WHERE id NOT IN (
+ SELECT id FROM precalc_filter_bib_list
+ INTERSECT
+ SELECT id FROM precalc_bibs_by_copy_list
+ );
+
+ ANALYZE precalc_copy_filter_bib_list;
+
+ iint := EXTRACT(EPOCH FROM badge.importance_interval);
+ IF badge.importance_age IS NOT NULL THEN
+ iage := (EXTRACT(EPOCH FROM badge.importance_age) / iint)::INT;
+ END IF;
+
+ -- if iscale is smaller than 1, scaling slope will be shallow ... BEWARE!
+ iscale := COALESCE(badge.importance_scale, 1.0);
+
+ RETURN QUERY
+ SELECT bib,
+ SUM( circs * GREATEST( iscale * (iage - cage), 1.0 ))
+ FROM (
+ SELECT cn.record AS bib,
+ (1 + EXTRACT(EPOCH FROM AGE(c.xact_start)) / iint)::INT AS cage,
+ COUNT(c.id)::INT AS circs
+ FROM action.circulation c
+ JOIN precalc_copy_filter_bib_list cf ON (c.target_copy = cf.copy)
+ JOIN asset.copy cp ON (cp.id = c.target_copy)
+ JOIN asset.call_number cn ON (cn.id = cp.call_number)
+ WHERE c.xact_start >= NOW() - badge.horizon_age
+ AND cn.owning_lib = ANY (badge.orgs)
+ AND c.phone_renewal IS FALSE -- we don't count renewals
+ AND c.desk_renewal IS FALSE
+ AND c.opac_renewal IS FALSE
+ GROUP BY 1, 2
+ ) x
+ GROUP BY 1;
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+CREATE OR REPLACE FUNCTION rating.current_circ_count(badge_id INT)
+ RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+DECLARE
+ badge rating.badge_with_orgs%ROWTYPE;
+BEGIN
+
+ SELECT * INTO badge FROM rating.badge_with_orgs WHERE id = badge_id;
+
+ PERFORM rating.precalc_bibs_by_copy(badge_id);
+
+ DELETE FROM precalc_copy_filter_bib_list WHERE id NOT IN (
+ SELECT id FROM precalc_filter_bib_list
+ INTERSECT
+ SELECT id FROM precalc_bibs_by_copy_list
+ );
+
+ ANALYZE precalc_copy_filter_bib_list;
+
+ RETURN QUERY
+ SELECT cn.record AS bib,
+ COUNT(c.id)::NUMERIC AS circs
+ FROM action.circulation c
+ JOIN precalc_copy_filter_bib_list cf ON (c.target_copy = cf.copy)
+ JOIN asset.copy cp ON (cp.id = c.target_copy)
+ JOIN asset.call_number cn ON (cn.id = cp.call_number)
+ WHERE c.checkin_time IS NULL
+ AND cn.owning_lib = ANY (badge.orgs)
+ GROUP BY 1;
+
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+CREATE OR REPLACE FUNCTION rating.checked_out_total_ratio(badge_id INT)
+ RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+DECLARE
+ badge rating.badge_with_orgs%ROWTYPE;
+BEGIN
+
+ SELECT * INTO badge FROM rating.badge_with_orgs WHERE id = badge_id;
+
+ PERFORM rating.precalc_bibs_by_copy(badge_id);
+
+ DELETE FROM precalc_copy_filter_bib_list WHERE id NOT IN (
+ SELECT id FROM precalc_filter_bib_list
+ INTERSECT
+ SELECT id FROM precalc_bibs_by_copy_list
+ );
+
+ ANALYZE precalc_copy_filter_bib_list;
+
+ RETURN QUERY
+ SELECT bib,
+ SUM(checked_out)::NUMERIC / SUM(total)::NUMERIC
+ FROM (SELECT cn.record AS bib,
+ (cp.status = 1)::INT AS checked_out,
+ 1 AS total
+ FROM asset.copy cp
+ JOIN precalc_copy_filter_bib_list c ON (cp.id = c.copy)
+ JOIN asset.call_number cn ON (cn.id = cp.call_number)
+ WHERE cn.owning_lib = ANY (badge.orgs)
+ ) x
+ GROUP BY 1;
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+CREATE OR REPLACE FUNCTION rating.holds_total_ratio(badge_id INT)
+ RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+DECLARE
+ badge rating.badge_with_orgs%ROWTYPE;
+BEGIN
+
+ SELECT * INTO badge FROM rating.badge_with_orgs WHERE id = badge_id;
+
+ PERFORM rating.precalc_bibs_by_copy(badge_id);
+
+ DELETE FROM precalc_copy_filter_bib_list WHERE id NOT IN (
+ SELECT id FROM precalc_filter_bib_list
+ INTERSECT
+ SELECT id FROM precalc_bibs_by_copy_list
+ );
+
+ ANALYZE precalc_copy_filter_bib_list;
+
+ RETURN QUERY
+ SELECT cn.record AS bib,
+ COUNT(DISTINCT m.hold)::NUMERIC / COUNT(DISTINCT cp.id)::NUMERIC
+ FROM asset.copy cp
+ JOIN precalc_copy_filter_bib_list c ON (cp.id = c.copy)
+ JOIN asset.call_number cn ON (cn.id = cp.call_number)
+ JOIN action.hold_copy_map m ON (m.target_copy = cp.id)
+ WHERE cn.owning_lib = ANY (badge.orgs)
+ GROUP BY 1;
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+CREATE OR REPLACE FUNCTION rating.holds_holdable_ratio(badge_id INT)
+ RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+DECLARE
+ badge rating.badge_with_orgs%ROWTYPE;
+BEGIN
+
+ SELECT * INTO badge FROM rating.badge_with_orgs WHERE id = badge_id;
+
+ PERFORM rating.precalc_bibs_by_copy(badge_id);
+
+ DELETE FROM precalc_copy_filter_bib_list WHERE id NOT IN (
+ SELECT id FROM precalc_filter_bib_list
+ INTERSECT
+ SELECT id FROM precalc_bibs_by_copy_list
+ );
+
+ ANALYZE precalc_copy_filter_bib_list;
+
+ RETURN QUERY
+ SELECT cn.record AS bib,
+ COUNT(DISTINCT m.hold)::NUMERIC / COUNT(DISTINCT cp.id)::NUMERIC
+ FROM asset.copy cp
+ JOIN precalc_copy_filter_bib_list c ON (cp.id = c.copy)
+ JOIN asset.copy_location cl ON (cl.id = cp.location)
+ JOIN config.copy_status cs ON (cs.id = cp.status)
+ JOIN asset.call_number cn ON (cn.id = cp.call_number)
+ JOIN action.hold_copy_map m ON (m.target_copy = cp.id)
+ WHERE cn.owning_lib = ANY (badge.orgs)
+ AND cp.holdable IS TRUE
+ AND cl.holdable IS TRUE
+ AND cs.holdable IS TRUE
+ GROUP BY 1;
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+CREATE OR REPLACE FUNCTION rating.bib_record_age(badge_id INT)
+ RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+DECLARE
+ badge rating.badge_with_orgs%ROWTYPE;
+BEGIN
+
+ SELECT * INTO badge FROM rating.badge_with_orgs WHERE id = badge_id;
+
+ PERFORM rating.precalc_bibs_by_copy_or_uri(badge_id);
+
+ SET LOCAL client_min_messages = error;
+ DROP TABLE IF EXISTS precalc_bib_list;
+ CREATE TEMP TABLE precalc_bib_list ON COMMIT DROP AS
+ SELECT id FROM precalc_filter_bib_list
+ INTERSECT
+ SELECT id FROM precalc_bibs_by_copy_or_uri_list;
+
+ RETURN QUERY
+ SELECT b.id,
+ 1.0 / EXTRACT(EPOCH FROM AGE(b.create_date))::NUMERIC + 1.0
+ FROM precalc_bib_list pop
+ JOIN biblio.record_entry b ON (b.id = pop.id);
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+CREATE OR REPLACE FUNCTION rating.bib_pub_age(badge_id INT)
+ RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+DECLARE
+ badge rating.badge_with_orgs%ROWTYPE;
+BEGIN
+
+ SELECT * INTO badge FROM rating.badge_with_orgs WHERE id = badge_id;
+
+ PERFORM rating.precalc_bibs_by_copy_or_uri(badge_id);
+
+ SET LOCAL client_min_messages = error;
+ DROP TABLE IF EXISTS precalc_bib_list;
+ CREATE TEMP TABLE precalc_bib_list ON COMMIT DROP AS
+ SELECT id FROM precalc_filter_bib_list
+ INTERSECT
+ SELECT id FROM precalc_bibs_by_copy_or_uri_list;
+
+ RETURN QUERY
+ SELECT pop.id AS bib,
+ s.value::NUMERIC
+ FROM precalc_bib_list pop
+ JOIN metabib.record_sorter s ON (
+ s.source = pop.id
+ AND s.attr = 'pubdate'
+ AND s.value ~ '^\d+$'
+ )
+ WHERE s.value::INT <= EXTRACT(YEAR FROM NOW())::INT;
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+CREATE OR REPLACE FUNCTION rating.percent_time_circulating(badge_id INT)
+ RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+DECLARE
+ badge rating.badge_with_orgs%ROWTYPE;
+BEGIN
+
+ SELECT * INTO badge FROM rating.badge_with_orgs WHERE id = badge_id;
+
+ PERFORM rating.precalc_bibs_by_copy(badge_id);
+
+ DELETE FROM precalc_copy_filter_bib_list WHERE id NOT IN (
+ SELECT id FROM precalc_filter_bib_list
+ INTERSECT
+ SELECT id FROM precalc_bibs_by_copy_list
+ );
+
+ ANALYZE precalc_copy_filter_bib_list;
+
+ RETURN QUERY
+ SELECT bib,
+ SUM(COALESCE(circ_time,0))::NUMERIC / SUM(age)::NUMERIC
+ FROM (SELECT cn.record AS bib,
+ cp.id,
+ EXTRACT( EPOCH FROM AGE(cp.active_date) ) + 1 AS age,
+ SUM( -- time copy spent circulating
+ EXTRACT(
+ EPOCH FROM
+ AGE(
+ COALESCE(circ.checkin_time, circ.stop_fines_time, NOW()),
+ circ.xact_start
+ )
+ )
+ )::NUMERIC AS circ_time
+ FROM asset.copy cp
+ JOIN precalc_copy_filter_bib_list c ON (cp.id = c.copy)
+ JOIN asset.call_number cn ON (cn.id = cp.call_number)
+ LEFT JOIN action.all_circulation circ ON (
+ circ.target_copy = cp.id
+ AND stop_fines NOT IN (
+ 'LOST',
+ 'LONGOVERDUE',
+ 'CLAIMSRETURNED',
+ 'LONGOVERDUE'
+ )
+ AND NOT (
+ checkin_time IS NULL AND
+ stop_fines = 'MAXFINES'
+ )
+ )
+ WHERE cn.owning_lib = ANY (badge.orgs)
+ AND cp.active_date IS NOT NULL
+ -- Next line requires that copies with no circs (circ.id IS NULL) also not be deleted
+ AND ((circ.id IS NULL AND NOT cp.deleted) OR circ.id IS NOT NULL)
+ GROUP BY 1,2,3
+ ) x
+ GROUP BY 1;
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+CREATE OR REPLACE FUNCTION rating.generic_fixed_rating_by_copy(badge_id INT)
+ RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+BEGIN
+ PERFORM rating.precalc_bibs_by_copy(badge_id);
+ RETURN QUERY
+ SELECT id, 1.0 FROM precalc_filter_bib_list
+ INTERSECT
+ SELECT id, 1.0 FROM precalc_bibs_by_copy_list;
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+CREATE OR REPLACE FUNCTION rating.generic_fixed_rating_by_uri(badge_id INT)
+ RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+BEGIN
+ PERFORM rating.precalc_bibs_by_uri(badge_id);
+ RETURN QUERY
+ SELECT id, 1.0 FROM precalc_bib_filter_bib_list
+ INTERSECT
+ SELECT id, 1.0 FROM precalc_bibs_by_uri_list;
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+CREATE OR REPLACE FUNCTION rating.generic_fixed_rating_by_copy_or_uri(badge_id INT)
+ RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+BEGIN
+ PERFORM rating.precalc_bibs_by_copy_or_uri(badge_id);
+ RETURN QUERY
+ (SELECT id, 1.0 FROM precalc_filter_bib_list
+ INTERSECT
+ SELECT id, 1.0 FROM precalc_bibs_by_copy_list)
+ UNION
+ (SELECT id, 1.0 FROM precalc_bib_filter_bib_list
+ INTERSECT
+ SELECT id, 1.0 FROM precalc_bibs_by_uri_list);
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+CREATE OR REPLACE FUNCTION rating.generic_fixed_rating_global(badge_id INT)
+ RETURNS TABLE (record BIGINT, value NUMERIC) AS $f$
+BEGIN
+ RETURN QUERY
+ SELECT id, 1.0 FROM precalc_bib_filter_bib_list;
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+CREATE INDEX hold_fulfillment_time_idx ON action.hold_request (fulfillment_time) WHERE fulfillment_time IS NOT NULL;
+CREATE INDEX hold_request_time_idx ON action.hold_request (request_time);
+
+
+/*
+ * Copyright (C) 2016 Equinox Software, Inc.
+ * Mike Rylander <miker@esilibrary.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0984', :eg_version);
+
+ALTER TYPE search.search_result ADD ATTRIBUTE badges TEXT, ADD ATTRIBUTE popularity NUMERIC;
+
+CREATE OR REPLACE FUNCTION search.query_parser_fts (
+
+ param_search_ou INT,
+ param_depth INT,
+ param_query TEXT,
+ param_statuses INT[],
+ param_locations INT[],
+ param_offset INT,
+ param_check INT,
+ param_limit INT,
+ metarecord BOOL,
+ staff BOOL,
+ deleted_search BOOL,
+ param_pref_ou INT DEFAULT NULL
+) RETURNS SETOF search.search_result AS $func$
+DECLARE
+
+ current_res search.search_result%ROWTYPE;
+ search_org_list INT[];
+ luri_org_list INT[];
+ tmp_int_list INT[];
+
+ check_limit INT;
+ core_limit INT;
+ core_offset INT;
+ tmp_int INT;
+
+ core_result RECORD;
+ core_cursor REFCURSOR;
+ core_rel_query TEXT;
+
+ total_count INT := 0;
+ check_count INT := 0;
+ deleted_count INT := 0;
+ visible_count INT := 0;
+ excluded_count INT := 0;
+
+ luri_as_copy BOOL;
+BEGIN
+
+ check_limit := COALESCE( param_check, 1000 );
+ core_limit := COALESCE( param_limit, 25000 );
+ core_offset := COALESCE( param_offset, 0 );
+
+ SELECT COALESCE( enabled, FALSE ) INTO luri_as_copy FROM config.global_flag WHERE name = 'opac.located_uri.act_as_copy';
+
+ -- core_skip_chk := COALESCE( param_skip_chk, 1 );
+
+ IF param_search_ou > 0 THEN
+ IF param_depth IS NOT NULL THEN
+ SELECT ARRAY_AGG(distinct id) INTO search_org_list FROM actor.org_unit_descendants( param_search_ou, param_depth );
+ ELSE
+ SELECT ARRAY_AGG(distinct id) INTO search_org_list FROM actor.org_unit_descendants( param_search_ou );
+ END IF;
+
+ IF luri_as_copy THEN
+ SELECT ARRAY_AGG(distinct id) INTO luri_org_list FROM actor.org_unit_full_path( param_search_ou );
+ ELSE
+ SELECT ARRAY_AGG(distinct id) INTO luri_org_list FROM actor.org_unit_ancestors( param_search_ou );
+ END IF;
+
+ ELSIF param_search_ou < 0 THEN
+ SELECT ARRAY_AGG(distinct org_unit) INTO search_org_list FROM actor.org_lasso_map WHERE lasso = -param_search_ou;
+
+ FOR tmp_int IN SELECT * FROM UNNEST(search_org_list) LOOP
+
+ IF luri_as_copy THEN
+ SELECT ARRAY_AGG(distinct id) INTO tmp_int_list FROM actor.org_unit_full_path( tmp_int );
+ ELSE
+ SELECT ARRAY_AGG(distinct id) INTO tmp_int_list FROM actor.org_unit_ancestors( tmp_int );
+ END IF;
+
+ luri_org_list := luri_org_list || tmp_int_list;
+ END LOOP;
+
+ SELECT ARRAY_AGG(DISTINCT x.id) INTO luri_org_list FROM UNNEST(luri_org_list) x(id);
+
+ ELSIF param_search_ou = 0 THEN
+ -- reserved for user lassos (ou_buckets/type='lasso') with ID passed in depth ... hack? sure.
+ END IF;
+
+ IF param_pref_ou IS NOT NULL THEN
+ IF luri_as_copy THEN
+ SELECT ARRAY_AGG(distinct id) INTO tmp_int_list FROM actor.org_unit_full_path( param_pref_ou );
+ ELSE
+ SELECT ARRAY_AGG(distinct id) INTO tmp_int_list FROM actor.org_unit_ancestors( param_pref_ou );
+ END IF;
+
+ luri_org_list := luri_org_list || tmp_int_list;
+ END IF;
+
+ OPEN core_cursor FOR EXECUTE param_query;
+
+ LOOP
+
+ FETCH core_cursor INTO core_result;
+ EXIT WHEN NOT FOUND;
+ EXIT WHEN total_count >= core_limit;
+
+ total_count := total_count + 1;
+
+ CONTINUE WHEN total_count NOT BETWEEN core_offset + 1 AND check_limit + core_offset;
+
+ check_count := check_count + 1;
+
+ IF NOT deleted_search THEN
+
+ PERFORM 1 FROM biblio.record_entry b WHERE NOT b.deleted AND b.id IN ( SELECT * FROM unnest( core_result.records ) );
+ IF NOT FOUND THEN
+ -- RAISE NOTICE ' % were all deleted ... ', core_result.records;
+ deleted_count := deleted_count + 1;
+ CONTINUE;
+ END IF;
+
+ PERFORM 1
+ FROM biblio.record_entry b
+ JOIN config.bib_source s ON (b.source = s.id)
+ WHERE s.transcendant
+ AND b.id IN ( SELECT * FROM unnest( core_result.records ) );
+
+ IF FOUND THEN
+ -- RAISE NOTICE ' % were all transcendant ... ', core_result.records;
+ visible_count := visible_count + 1;
+
+ current_res.id = core_result.id;
+ current_res.rel = core_result.rel;
+ current_res.badges = core_result.badges;
+ current_res.popularity = core_result.popularity;
+
+ tmp_int := 1;
+ IF metarecord THEN
+ SELECT COUNT(DISTINCT s.source) INTO tmp_int FROM metabib.metarecord_source_map s WHERE s.metarecord = core_result.id;
+ END IF;
+
+ IF tmp_int = 1 THEN
+ current_res.record = core_result.records[1];
+ ELSE
+ current_res.record = NULL;
+ END IF;
+
+ RETURN NEXT current_res;
+
+ CONTINUE;
+ END IF;
+
+ PERFORM 1
+ FROM asset.call_number cn
+ JOIN asset.uri_call_number_map map ON (map.call_number = cn.id)
+ JOIN asset.uri uri ON (map.uri = uri.id)
+ WHERE NOT cn.deleted
+ AND cn.label = '##URI##'
+ AND uri.active
+ AND ( param_locations IS NULL OR array_upper(param_locations, 1) IS NULL )
+ AND cn.record IN ( SELECT * FROM unnest( core_result.records ) )
+ AND cn.owning_lib IN ( SELECT * FROM unnest( luri_org_list ) )
+ LIMIT 1;
+
+ IF FOUND THEN
+ -- RAISE NOTICE ' % have at least one URI ... ', core_result.records;
+ visible_count := visible_count + 1;
+
+ current_res.id = core_result.id;
+ current_res.rel = core_result.rel;
+ current_res.badges = core_result.badges;
+ current_res.popularity = core_result.popularity;
+
+ tmp_int := 1;
+ IF metarecord THEN
+ SELECT COUNT(DISTINCT s.source) INTO tmp_int FROM metabib.metarecord_source_map s WHERE s.metarecord = core_result.id;
+ END IF;
+
+ IF tmp_int = 1 THEN
+ current_res.record = core_result.records[1];
+ ELSE
+ current_res.record = NULL;
+ END IF;
+
+ RETURN NEXT current_res;
+
+ CONTINUE;
+ END IF;
+
+ IF param_statuses IS NOT NULL AND array_upper(param_statuses, 1) > 0 THEN
+
+ PERFORM 1
+ FROM asset.call_number cn
+ JOIN asset.copy cp ON (cp.call_number = cn.id)
+ WHERE NOT cn.deleted
+ AND NOT cp.deleted
+ AND cp.status IN ( SELECT * FROM unnest( param_statuses ) )
+ AND cn.record IN ( SELECT * FROM unnest( core_result.records ) )
+ AND cp.circ_lib IN ( SELECT * FROM unnest( search_org_list ) )
+ LIMIT 1;
+
+ IF NOT FOUND THEN
+ PERFORM 1
+ FROM biblio.peer_bib_copy_map pr
+ JOIN asset.copy cp ON (cp.id = pr.target_copy)
+ WHERE NOT cp.deleted
+ AND cp.status IN ( SELECT * FROM unnest( param_statuses ) )
+ AND pr.peer_record IN ( SELECT * FROM unnest( core_result.records ) )
+ AND cp.circ_lib IN ( SELECT * FROM unnest( search_org_list ) )
+ LIMIT 1;
+
+ IF NOT FOUND THEN
+ -- RAISE NOTICE ' % and multi-home linked records were all status-excluded ... ', core_result.records;
+ excluded_count := excluded_count + 1;
+ CONTINUE;
+ END IF;
+ END IF;
+
+ END IF;
+
+ IF param_locations IS NOT NULL AND array_upper(param_locations, 1) > 0 THEN
+
+ PERFORM 1
+ FROM asset.call_number cn
+ JOIN asset.copy cp ON (cp.call_number = cn.id)
+ WHERE NOT cn.deleted
+ AND NOT cp.deleted
+ AND cp.location IN ( SELECT * FROM unnest( param_locations ) )
+ AND cn.record IN ( SELECT * FROM unnest( core_result.records ) )
+ AND cp.circ_lib IN ( SELECT * FROM unnest( search_org_list ) )
+ LIMIT 1;
+
+ IF NOT FOUND THEN
+ PERFORM 1
+ FROM biblio.peer_bib_copy_map pr
+ JOIN asset.copy cp ON (cp.id = pr.target_copy)
+ WHERE NOT cp.deleted
+ AND cp.location IN ( SELECT * FROM unnest( param_locations ) )
+ AND pr.peer_record IN ( SELECT * FROM unnest( core_result.records ) )
+ AND cp.circ_lib IN ( SELECT * FROM unnest( search_org_list ) )
+ LIMIT 1;
+
+ IF NOT FOUND THEN
+ -- RAISE NOTICE ' % and multi-home linked records were all copy_location-excluded ... ', core_result.records;
+ excluded_count := excluded_count + 1;
+ CONTINUE;
+ END IF;
+ END IF;
+
+ END IF;
+
+ IF staff IS NULL OR NOT staff THEN
+
+ PERFORM 1
+ FROM asset.opac_visible_copies
+ WHERE circ_lib IN ( SELECT * FROM unnest( search_org_list ) )
+ AND record IN ( SELECT * FROM unnest( core_result.records ) )
+ LIMIT 1;
+
+ IF NOT FOUND THEN
+ PERFORM 1
+ FROM biblio.peer_bib_copy_map pr
+ JOIN asset.opac_visible_copies cp ON (cp.copy_id = pr.target_copy)
+ WHERE cp.circ_lib IN ( SELECT * FROM unnest( search_org_list ) )
+ AND pr.peer_record IN ( SELECT * FROM unnest( core_result.records ) )
+ LIMIT 1;
+
+ IF NOT FOUND THEN
+
+ -- RAISE NOTICE ' % and multi-home linked records were all visibility-excluded ... ', core_result.records;
+ excluded_count := excluded_count + 1;
+ CONTINUE;
+ END IF;
+ END IF;
+
+ ELSE
+
+ PERFORM 1
+ FROM asset.call_number cn
+ JOIN asset.copy cp ON (cp.call_number = cn.id)
+ WHERE NOT cn.deleted
+ AND NOT cp.deleted
+ AND cp.circ_lib IN ( SELECT * FROM unnest( search_org_list ) )
+ AND cn.record IN ( SELECT * FROM unnest( core_result.records ) )
+ LIMIT 1;
+
+ IF NOT FOUND THEN
+
+ PERFORM 1
+ FROM biblio.peer_bib_copy_map pr
+ JOIN asset.copy cp ON (cp.id = pr.target_copy)
+ WHERE NOT cp.deleted
+ AND cp.circ_lib IN ( SELECT * FROM unnest( search_org_list ) )
+ AND pr.peer_record IN ( SELECT * FROM unnest( core_result.records ) )
+ LIMIT 1;
+
+ IF NOT FOUND THEN
+
+ PERFORM 1
+ FROM asset.call_number cn
+ JOIN asset.copy cp ON (cp.call_number = cn.id)
+ WHERE cn.record IN ( SELECT * FROM unnest( core_result.records ) )
+ AND NOT cp.deleted
+ LIMIT 1;
+
+ IF NOT FOUND THEN
+ -- Recheck Located URI visibility in the case of no "foreign" copies
+ PERFORM 1
+ FROM asset.call_number cn
+ JOIN asset.uri_call_number_map map ON (map.call_number = cn.id)
+ JOIN asset.uri uri ON (map.uri = uri.id)
+ WHERE NOT cn.deleted
+ AND cn.label = '##URI##'
+ AND uri.active
+ AND cn.record IN ( SELECT * FROM unnest( core_result.records ) )
+ AND cn.owning_lib NOT IN ( SELECT * FROM unnest( luri_org_list ) )
+ LIMIT 1;
+
+ IF FOUND THEN
+ -- RAISE NOTICE ' % were excluded for foreign located URIs... ', core_result.records;
+ excluded_count := excluded_count + 1;
+ CONTINUE;
+ END IF;
+ ELSE
+ -- RAISE NOTICE ' % and multi-home linked records were all visibility-excluded ... ', core_result.records;
+ excluded_count := excluded_count + 1;
+ CONTINUE;
+ END IF;
+ END IF;
+
+ END IF;
+
+ END IF;
+
+ END IF;
+
+ visible_count := visible_count + 1;
+
+ current_res.id = core_result.id;
+ current_res.rel = core_result.rel;
+ current_res.badges = core_result.badges;
+ current_res.popularity = core_result.popularity;
+
+ tmp_int := 1;
+ IF metarecord THEN
+ SELECT COUNT(DISTINCT s.source) INTO tmp_int FROM metabib.metarecord_source_map s WHERE s.metarecord = core_result.id;
+ END IF;
+
+ IF tmp_int = 1 THEN
+ current_res.record = core_result.records[1];
+ ELSE
+ current_res.record = NULL;
+ END IF;
+
+ RETURN NEXT current_res;
+
+ IF visible_count % 1000 = 0 THEN
+ -- RAISE NOTICE ' % visible so far ... ', visible_count;
+ END IF;
+
+ END LOOP;
+
+ current_res.id = NULL;
+ current_res.rel = NULL;
+ current_res.record = NULL;
+ current_res.badges = NULL;
+ current_res.popularity = NULL;
+ current_res.total = total_count;
+ current_res.checked = check_count;
+ current_res.deleted = deleted_count;
+ current_res.visible = visible_count;
+ current_res.excluded = excluded_count;
+
+ CLOSE core_cursor;
+
+ RETURN NEXT current_res;
+
+END;
+$func$ LANGUAGE PLPGSQL;
+
+CREATE OR REPLACE FUNCTION metabib.staged_browse(
+ query TEXT,
+ fields INT[],
+ context_org INT,
+ context_locations INT[],
+ staff BOOL,
+ browse_superpage_size INT,
+ count_up_from_zero BOOL, -- if false, count down from -1
+ result_limit INT,
+ next_pivot_pos INT
+) RETURNS SETOF metabib.flat_browse_entry_appearance AS $p$
+DECLARE
+ curs REFCURSOR;
+ rec RECORD;
+ qpfts_query TEXT;
+ aqpfts_query TEXT;
+ afields INT[];
+ bfields INT[];
+ result_row metabib.flat_browse_entry_appearance%ROWTYPE;
+ results_skipped INT := 0;
+ row_counter INT := 0;
+ row_number INT;
+ slice_start INT;
+ slice_end INT;
+ full_end INT;
+ all_records BIGINT[];
+ all_brecords BIGINT[];
+ all_arecords BIGINT[];
+ superpage_of_records BIGINT[];
+ superpage_size INT;
+BEGIN
+ IF count_up_from_zero THEN
+ row_number := 0;
+ ELSE
+ row_number := -1;
+ END IF;
+
+ OPEN curs FOR EXECUTE query;
+
+ LOOP
+ FETCH curs INTO rec;
+ IF NOT FOUND THEN
+ IF result_row.pivot_point IS NOT NULL THEN
+ RETURN NEXT result_row;
+ END IF;
+ RETURN;
+ END IF;
+
+
+ -- Gather aggregate data based on the MBE row we're looking at now, authority axis
+ SELECT INTO all_arecords, result_row.sees, afields
+ ARRAY_AGG(DISTINCT abl.bib), -- bibs to check for visibility
+ STRING_AGG(DISTINCT aal.source::TEXT, $$,$$), -- authority record ids
+ ARRAY_AGG(DISTINCT map.metabib_field) -- authority-tag-linked CMF rows
+
+ FROM metabib.browse_entry_simple_heading_map mbeshm
+ JOIN authority.simple_heading ash ON ( mbeshm.simple_heading = ash.id )
+ JOIN authority.authority_linking aal ON ( ash.record = aal.source )
+ JOIN authority.bib_linking abl ON ( aal.target = abl.authority )
+ JOIN authority.control_set_auth_field_metabib_field_map_refs map ON (
+ ash.atag = map.authority_field
+ AND map.metabib_field = ANY(fields)
+ )
+ WHERE mbeshm.entry = rec.id;
+
+
+ -- Gather aggregate data based on the MBE row we're looking at now, bib axis
+ SELECT INTO all_brecords, result_row.authorities, bfields
+ ARRAY_AGG(DISTINCT source),
+ STRING_AGG(DISTINCT authority::TEXT, $$,$$),
+ ARRAY_AGG(DISTINCT def)
+ FROM metabib.browse_entry_def_map
+ WHERE entry = rec.id
+ AND def = ANY(fields);
+
+ SELECT INTO result_row.fields STRING_AGG(DISTINCT x::TEXT, $$,$$) FROM UNNEST(afields || bfields) x;
+
+ result_row.sources := 0;
+ result_row.asources := 0;
+
+ -- Bib-linked vis checking
+ IF ARRAY_UPPER(all_brecords,1) IS NOT NULL THEN
+
+ full_end := ARRAY_LENGTH(all_brecords, 1);
+ superpage_size := COALESCE(browse_superpage_size, full_end);
+ slice_start := 1;
+ slice_end := superpage_size;
+
+ WHILE result_row.sources = 0 AND slice_start <= full_end LOOP
+ superpage_of_records := all_brecords[slice_start:slice_end];
+ qpfts_query :=
+ 'SELECT NULL::BIGINT AS id, ARRAY[r] AS records, ' ||
+ 'NULL AS badges, NULL::NUMERIC AS popularity, ' ||
+ '1::NUMERIC AS rel FROM (SELECT UNNEST(' ||
+ quote_literal(superpage_of_records) || '::BIGINT[]) AS r) rr';
+
+ -- We use search.query_parser_fts() for visibility testing.
+ -- We're calling it once per browse-superpage worth of records
+ -- out of the set of records related to a given mbe, until we've
+ -- either exhausted that set of records or found at least 1
+ -- visible record.
+
+ SELECT INTO result_row.sources visible
+ FROM search.query_parser_fts(
+ context_org, NULL, qpfts_query, NULL,
+ context_locations, 0, NULL, NULL, FALSE, staff, FALSE
+ ) qpfts
+ WHERE qpfts.rel IS NULL;
+
+ slice_start := slice_start + superpage_size;
+ slice_end := slice_end + superpage_size;
+ END LOOP;
+
+ -- Accurate? Well, probably.
+ result_row.accurate := browse_superpage_size IS NULL OR
+ browse_superpage_size >= full_end;
+
+ END IF;
+
+ -- Authority-linked vis checking
+ IF ARRAY_UPPER(all_arecords,1) IS NOT NULL THEN
+
+ full_end := ARRAY_LENGTH(all_arecords, 1);
+ superpage_size := COALESCE(browse_superpage_size, full_end);
+ slice_start := 1;
+ slice_end := superpage_size;
+
+ WHILE result_row.asources = 0 AND slice_start <= full_end LOOP
+ superpage_of_records := all_arecords[slice_start:slice_end];
+ qpfts_query :=
+ 'SELECT NULL::BIGINT AS id, ARRAY[r] AS records, ' ||
+ 'NULL AS badges, NULL::NUMERIC AS popularity, ' ||
+ '1::NUMERIC AS rel FROM (SELECT UNNEST(' ||
+ quote_literal(superpage_of_records) || '::BIGINT[]) AS r) rr';
+
+ -- We use search.query_parser_fts() for visibility testing.
+ -- We're calling it once per browse-superpage worth of records
+ -- out of the set of records related to a given mbe, via
+ -- authority until we've either exhausted that set of records
+ -- or found at least 1 visible record.
+
+ SELECT INTO result_row.asources visible
+ FROM search.query_parser_fts(
+ context_org, NULL, qpfts_query, NULL,
+ context_locations, 0, NULL, NULL, FALSE, staff, FALSE
+ ) qpfts
+ WHERE qpfts.rel IS NULL;
+
+ slice_start := slice_start + superpage_size;
+ slice_end := slice_end + superpage_size;
+ END LOOP;
+
+
+ -- Accurate? Well, probably.
+ result_row.aaccurate := browse_superpage_size IS NULL OR
+ browse_superpage_size >= full_end;
+
+ END IF;
+
+ IF result_row.sources > 0 OR result_row.asources > 0 THEN
+
+ -- The function that calls this function needs row_number in order
+ -- to correctly order results from two different runs of this
+ -- functions.
+ result_row.row_number := row_number;
+
+ -- Now, if row_counter is still less than limit, return a row. If
+ -- not, but it is less than next_pivot_pos, continue on without
+ -- returning actual result rows until we find
+ -- that next pivot, and return it.
+
+ IF row_counter < result_limit THEN
+ result_row.browse_entry := rec.id;
+ result_row.value := rec.value;
+
+ RETURN NEXT result_row;
+ ELSE
+ result_row.browse_entry := NULL;
+ result_row.authorities := NULL;
+ result_row.fields := NULL;
+ result_row.value := NULL;
+ result_row.sources := NULL;
+ result_row.sees := NULL;
+ result_row.accurate := NULL;
+ result_row.aaccurate := NULL;
+ result_row.pivot_point := rec.id;
+
+ IF row_counter >= next_pivot_pos THEN
+ RETURN NEXT result_row;
+ RETURN;
+ END IF;
+ END IF;
+
+ IF count_up_from_zero THEN
+ row_number := row_number + 1;
+ ELSE
+ row_number := row_number - 1;
+ END IF;
+
+ -- row_counter is different from row_number.
+ -- It simply counts up from zero so that we know when
+ -- we've reached our limit.
+ row_counter := row_counter + 1;
+ END IF;
+ END LOOP;
+END;
+$p$ LANGUAGE PLPGSQL;
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0985', :eg_version);
+
+CREATE OR REPLACE FUNCTION metabib.reingest_record_attributes (rid BIGINT, pattr_list TEXT[] DEFAULT NULL, prmarc TEXT DEFAULT NULL, rdeleted BOOL DEFAULT TRUE) RETURNS VOID AS $func$
+DECLARE
+ transformed_xml TEXT;
+ rmarc TEXT := prmarc;
+ tmp_val TEXT;
+ prev_xfrm TEXT;
+ normalizer RECORD;
+ xfrm config.xml_transform%ROWTYPE;
+ attr_vector INT[] := '{}'::INT[];
+ attr_vector_tmp INT[];
+ attr_list TEXT[] := pattr_list;
+ attr_value TEXT[];
+ norm_attr_value TEXT[];
+ tmp_xml TEXT;
+ attr_def config.record_attr_definition%ROWTYPE;
+ ccvm_row config.coded_value_map%ROWTYPE;
+BEGIN
+
+ IF attr_list IS NULL OR rdeleted THEN -- need to do the full dance on INSERT or undelete
+ SELECT ARRAY_AGG(name) INTO attr_list FROM config.record_attr_definition
+ WHERE (
+ tag IS NOT NULL OR
+ fixed_field IS NOT NULL OR
+ xpath IS NOT NULL OR
+ phys_char_sf IS NOT NULL OR
+ composite
+ ) AND (
+ filter OR sorter
+ );
+ END IF;
+
+ IF rmarc IS NULL THEN
+ SELECT marc INTO rmarc FROM biblio.record_entry WHERE id = rid;
+ END IF;
+
+ FOR attr_def IN SELECT * FROM config.record_attr_definition WHERE NOT composite AND name = ANY( attr_list ) ORDER BY format LOOP
+
+ attr_value := '{}'::TEXT[];
+ norm_attr_value := '{}'::TEXT[];
+ attr_vector_tmp := '{}'::INT[];
+
+ SELECT * INTO ccvm_row FROM config.coded_value_map c WHERE c.ctype = attr_def.name LIMIT 1;
+
+ -- tag+sf attrs only support SVF
+ IF attr_def.tag IS NOT NULL THEN -- tag (and optional subfield list) selection
+ SELECT ARRAY[ARRAY_TO_STRING(ARRAY_AGG(value), COALESCE(attr_def.joiner,' '))] INTO attr_value
+ FROM (SELECT * FROM metabib.full_rec ORDER BY tag, subfield) AS x
+ WHERE record = rid
+ AND tag LIKE attr_def.tag
+ AND CASE
+ WHEN attr_def.sf_list IS NOT NULL
+ THEN POSITION(subfield IN attr_def.sf_list) > 0
+ ELSE TRUE
+ END
+ GROUP BY tag
+ ORDER BY tag
+ LIMIT 1;
+
+ ELSIF attr_def.fixed_field IS NOT NULL THEN -- a named fixed field, see config.marc21_ff_pos_map.fixed_field
+ attr_value := vandelay.marc21_extract_fixed_field_list(rmarc, attr_def.fixed_field);
+
+ IF NOT attr_def.multi THEN
+ attr_value := ARRAY[attr_value[1]];
+ END IF;
+
+ ELSIF attr_def.xpath IS NOT NULL THEN -- and xpath expression
+
+ SELECT INTO xfrm * FROM config.xml_transform WHERE name = attr_def.format;
+
+ -- See if we can skip the XSLT ... it's expensive
+ IF prev_xfrm IS NULL OR prev_xfrm <> xfrm.name THEN
+ -- Can't skip the transform
+ IF xfrm.xslt <> '---' THEN
+ transformed_xml := oils_xslt_process(rmarc,xfrm.xslt);
+ ELSE
+ transformed_xml := rmarc;
+ END IF;
+
+ prev_xfrm := xfrm.name;
+ END IF;
+
+ IF xfrm.name IS NULL THEN
+ -- just grab the marcxml (empty) transform
+ SELECT INTO xfrm * FROM config.xml_transform WHERE xslt = '---' LIMIT 1;
+ prev_xfrm := xfrm.name;
+ END IF;
+
+ FOR tmp_xml IN SELECT UNNEST(oils_xpath(attr_def.xpath, transformed_xml, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]])) LOOP
+ tmp_val := oils_xpath_string(
+ '//*',
+ tmp_xml,
+ COALESCE(attr_def.joiner,' '),
+ ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]]
+ );
+ IF tmp_val IS NOT NULL AND BTRIM(tmp_val) <> '' THEN
+ attr_value := attr_value || tmp_val;
+ EXIT WHEN NOT attr_def.multi;
+ END IF;
+ END LOOP;
+
+ ELSIF attr_def.phys_char_sf IS NOT NULL THEN -- a named Physical Characteristic, see config.marc21_physical_characteristic_*_map
+ SELECT ARRAY_AGG(m.value) INTO attr_value
+ FROM vandelay.marc21_physical_characteristics(rmarc) v
+ LEFT JOIN config.marc21_physical_characteristic_value_map m ON (m.id = v.value)
+ WHERE v.subfield = attr_def.phys_char_sf AND (m.value IS NOT NULL AND BTRIM(m.value) <> '')
+ AND ( ccvm_row.id IS NULL OR ( ccvm_row.id IS NOT NULL AND v.id IS NOT NULL) );
+
+ IF NOT attr_def.multi THEN
+ attr_value := ARRAY[attr_value[1]];
+ END IF;
+
+ END IF;
+
+ -- apply index normalizers to attr_value
+ FOR tmp_val IN SELECT value FROM UNNEST(attr_value) x(value) LOOP
+ FOR normalizer IN
+ SELECT n.func AS func,
+ n.param_count AS param_count,
+ m.params AS params
+ FROM config.index_normalizer n
+ JOIN config.record_attr_index_norm_map m ON (m.norm = n.id)
+ WHERE attr = attr_def.name
+ ORDER BY m.pos LOOP
+ EXECUTE 'SELECT ' || normalizer.func || '(' ||
+ COALESCE( quote_literal( tmp_val ), 'NULL' ) ||
+ CASE
+ WHEN normalizer.param_count > 0
+ THEN ',' || REPLACE(REPLACE(BTRIM(normalizer.params,'[]'),E'\'',E'\\\''),E'"',E'\'')
+ ELSE ''
+ END ||
+ ')' INTO tmp_val;
+
+ END LOOP;
+ IF tmp_val IS NOT NULL AND tmp_val <> '' THEN
+ -- note that a string that contains only blanks
+ -- is a valid value for some attributes
+ norm_attr_value := norm_attr_value || tmp_val;
+ END IF;
+ END LOOP;
+
+ IF attr_def.filter THEN
+ -- Create unknown uncontrolled values and find the IDs of the values
+ IF ccvm_row.id IS NULL THEN
+ FOR tmp_val IN SELECT value FROM UNNEST(norm_attr_value) x(value) LOOP
+ IF tmp_val IS NOT NULL AND BTRIM(tmp_val) <> '' THEN
+ BEGIN -- use subtransaction to isolate unique constraint violations
+ INSERT INTO metabib.uncontrolled_record_attr_value ( attr, value ) VALUES ( attr_def.name, tmp_val );
+ EXCEPTION WHEN unique_violation THEN END;
+ END IF;
+ END LOOP;
+
+ SELECT ARRAY_AGG(id) INTO attr_vector_tmp FROM metabib.uncontrolled_record_attr_value WHERE attr = attr_def.name AND value = ANY( norm_attr_value );
+ ELSE
+ SELECT ARRAY_AGG(id) INTO attr_vector_tmp FROM config.coded_value_map WHERE ctype = attr_def.name AND code = ANY( norm_attr_value );
+ END IF;
+
+ -- Add the new value to the vector
+ attr_vector := attr_vector || attr_vector_tmp;
+ END IF;
+
+ IF attr_def.sorter THEN
+ DELETE FROM metabib.record_sorter WHERE source = rid AND attr = attr_def.name;
+ IF norm_attr_value[1] IS NOT NULL THEN
+ INSERT INTO metabib.record_sorter (source, attr, value) VALUES (rid, attr_def.name, norm_attr_value[1]);
+ END IF;
+ END IF;
+
+ END LOOP;
+
+/* We may need to rewrite the vlist to contain
+ the intersection of new values for requested
+ attrs and old values for ignored attrs. To
+ do this, we take the old attr vlist and
+ subtract any values that are valid for the
+ requested attrs, and then add back the new
+ set of attr values. */
+
+ IF ARRAY_LENGTH(pattr_list, 1) > 0 THEN
+ SELECT vlist INTO attr_vector_tmp FROM metabib.record_attr_vector_list WHERE source = rid;
+ SELECT attr_vector_tmp - ARRAY_AGG(id::INT) INTO attr_vector_tmp FROM metabib.full_attr_id_map WHERE attr = ANY (pattr_list);
+ attr_vector := attr_vector || attr_vector_tmp;
+ END IF;
+
+ -- On to composite attributes, now that the record attrs have been pulled. Processed in name order, so later composite
+ -- attributes can depend on earlier ones.
+ PERFORM metabib.compile_composite_attr_cache_init();
+ FOR attr_def IN SELECT * FROM config.record_attr_definition WHERE composite AND name = ANY( attr_list ) ORDER BY name LOOP
+
+ FOR ccvm_row IN SELECT * FROM config.coded_value_map c WHERE c.ctype = attr_def.name ORDER BY value LOOP
+
+ tmp_val := metabib.compile_composite_attr( ccvm_row.id );
+ CONTINUE WHEN tmp_val IS NULL OR tmp_val = ''; -- nothing to do
+
+ IF attr_def.filter THEN
+ IF attr_vector @@ tmp_val::query_int THEN
+ attr_vector = attr_vector + intset(ccvm_row.id);
+ EXIT WHEN NOT attr_def.multi;
+ END IF;
+ END IF;
+
+ IF attr_def.sorter THEN
+ IF attr_vector @@ tmp_val THEN
+ DELETE FROM metabib.record_sorter WHERE source = rid AND attr = attr_def.name;
+ INSERT INTO metabib.record_sorter (source, attr, value) VALUES (rid, attr_def.name, ccvm_row.code);
+ END IF;
+ END IF;
+
+ END LOOP;
+
+ END LOOP;
+
+ IF ARRAY_LENGTH(attr_vector, 1) > 0 THEN
+ IF rdeleted THEN -- initial insert OR revivication
+ DELETE FROM metabib.record_attr_vector_list WHERE source = rid;
+ INSERT INTO metabib.record_attr_vector_list (source, vlist) VALUES (rid, attr_vector);
+ ELSE
+ UPDATE metabib.record_attr_vector_list SET vlist = attr_vector WHERE source = rid;
+ END IF;
+ END IF;
+
+END;
+
+$func$ LANGUAGE PLPGSQL;
+
+CREATE INDEX config_coded_value_map_ctype_idx ON config.coded_value_map (ctype);
+
+
+SELECT evergreen.upgrade_deps_block_check('0986', :eg_version);
+
+CREATE EXTENSION IF NOT EXISTS unaccent SCHEMA public;
+
+CREATE OR REPLACE FUNCTION evergreen.unaccent_and_squash ( IN arg text) RETURNS text
+ IMMUTABLE STRICT AS $$
+ BEGIN
+ RETURN evergreen.lowercase(unaccent(regexp_replace(arg, '\s','','g')));
+ END;
+$$ LANGUAGE PLPGSQL;
+
+-- The unaccented indices for patron name fields
+CREATE INDEX actor_usr_first_given_name_unaccent_idx ON actor.usr (evergreen.unaccent_and_squash(first_given_name));
+CREATE INDEX actor_usr_second_given_name_unaccent_idx ON actor.usr (evergreen.unaccent_and_squash(second_given_name));
+CREATE INDEX actor_usr_family_name_unaccent_idx ON actor.usr (evergreen.unaccent_and_squash(family_name));
+
+-- DB setting to control behavior; true by default
+INSERT INTO config.org_unit_setting_type
+( name, grp, label, description, datatype )
+VALUES
+('circ.patron_search.diacritic_insensitive',
+ 'circ',
+ oils_i18n_gettext('circ.patron_search.diacritic_insensitive',
+ 'Patron search diacritic insensitive',
+ 'coust', 'label'),
+ oils_i18n_gettext('circ.patron_search.diacritic_insensitive',
+ 'Match patron last, first, and middle names irrespective of usage of diacritical marks or spaces. (e.g., Ines will match Inés; de la Cruz will match Delacruz)',
+ 'coust', 'description'),
+ 'bool');
+
+INSERT INTO actor.org_unit_setting (
+ org_unit, name, value
+) VALUES (
+ (SELECT id FROM actor.org_unit WHERE parent_ou IS NULL),
+ 'circ.patron_search.diacritic_insensitive',
+ 'true'
+);
+
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0987', :eg_version);
+
+INSERT INTO config.org_unit_setting_type ( name, grp, label, description, datatype )
+ VALUES (
+ 'ui.circ.billing.amount_limit', 'gui',
+ oils_i18n_gettext(
+ 'ui.circ.billing.amount_limit',
+ 'Maximum payment amount allowed.',
+ 'coust', 'label'),
+ oils_i18n_gettext(
+ 'ui.circ.billing.amount_limit',
+ 'The payment amount in the Patron Bills interface may not exceed the value of this setting.',
+ 'coust', 'description'),
+ 'currency'
+ );
+
+INSERT INTO config.org_unit_setting_type ( name, grp, label, description, datatype )
+ VALUES (
+ 'ui.circ.billing.amount_warn', 'gui',
+ oils_i18n_gettext(
+ 'ui.circ.billing.amount_warn',
+ 'Payment amount threshold for Are You Sure? dialog.',
+ 'coust', 'label'),
+ oils_i18n_gettext(
+ 'ui.circ.billing.amount_warn',
+ 'In the Patron Bills interface, a payment attempt will warn if the amount exceeds the value of this setting.',
+ 'coust', 'description'),
+ 'currency'
+ );
+
+
+SELECT evergreen.upgrade_deps_block_check('0988', :eg_version);
+
+CREATE OR REPLACE FUNCTION evergreen.maintain_901 () RETURNS TRIGGER AS $func$
+use strict;
+use MARC::Record;
+use MARC::File::XML (BinaryEncoding => 'UTF-8');
+use MARC::Charset;
+use Encode;
+use Unicode::Normalize;
+
+MARC::Charset->assume_unicode(1);
+
+my $schema = $_TD->{table_schema};
+my $marc = MARC::Record->new_from_xml($_TD->{new}{marc});
+
+my @old901s = $marc->field('901');
+$marc->delete_fields(@old901s);
+
+if ($schema eq 'biblio') {
+ my $tcn_value = $_TD->{new}{tcn_value};
+
+ # Set TCN value to record ID?
+ my $id_as_tcn = spi_exec_query("
+ SELECT enabled
+ FROM config.global_flag
+ WHERE name = 'cat.bib.use_id_for_tcn'
+ ");
+ if (($id_as_tcn->{processed}) && $id_as_tcn->{rows}[0]->{enabled} eq 't') {
+ $tcn_value = $_TD->{new}{id};
+ $_TD->{new}{tcn_value} = $tcn_value;
+ }
+
+ my $new_901 = MARC::Field->new("901", " ", " ",
+ "a" => $tcn_value,
+ "b" => $_TD->{new}{tcn_source},
+ "c" => $_TD->{new}{id},
+ "t" => $schema
+ );
+
+ if ($_TD->{new}{owner}) {
+ $new_901->add_subfields("o" => $_TD->{new}{owner});
+ }
+
+ if ($_TD->{new}{share_depth}) {
+ $new_901->add_subfields("d" => $_TD->{new}{share_depth});
+ }
+
+ if ($_TD->{new}{source}) {
+ my $plan = spi_prepare('
+ SELECT source
+ FROM config.bib_source
+ WHERE id = $1
+ ', 'INTEGER');
+ my $source_name =
+ spi_exec_prepared($plan, {limit => 1}, $_TD->{new}{source})->{rows}[0]{source};
+ spi_freeplan($plan);
+ $new_901->add_subfields("s" => $source_name) if $source_name;
+ }
+
+ $marc->append_fields($new_901);
+} elsif ($schema eq 'authority') {
+ my $new_901 = MARC::Field->new("901", " ", " ",
+ "c" => $_TD->{new}{id},
+ "t" => $schema,
+ );
+ $marc->append_fields($new_901);
+} elsif ($schema eq 'serial') {
+ my $new_901 = MARC::Field->new("901", " ", " ",
+ "c" => $_TD->{new}{id},
+ "t" => $schema,
+ "o" => $_TD->{new}{owning_lib},
+ );
+
+ if ($_TD->{new}{record}) {
+ $new_901->add_subfields("r" => $_TD->{new}{record});
+ }
+
+ $marc->append_fields($new_901);
+} else {
+ my $new_901 = MARC::Field->new("901", " ", " ",
+ "c" => $_TD->{new}{id},
+ "t" => $schema,
+ );
+ $marc->append_fields($new_901);
+}
+
+my $xml = $marc->as_xml_record();
+$xml =~ s/\n//sgo;
+$xml =~ s/^<\?xml.+\?\s*>//go;
+$xml =~ s/>\s+</></go;
+$xml =~ s/\p{Cc}//go;
+
+# Embed a version of OpenILS::Application::AppUtils->entityize()
+# to avoid having to set PERL5LIB for PostgreSQL as well
+
+$xml = NFC($xml);
+
+# Convert raw ampersands to entities
+$xml =~ s/&(?!\S+;)/&/gso;
+
+# Convert Unicode characters to entities
+$xml =~ s/([\x{0080}-\x{fffd}])/sprintf('&#x%X;',ord($1))/sgoe;
+
+$xml =~ s/[\x00-\x1f]//go;
+$_TD->{new}{marc} = $xml;
+
+return "MODIFY";
+$func$ LANGUAGE PLPERLU;
+
+
+SELECT evergreen.upgrade_deps_block_check('0989', :eg_version); -- berick/miker/gmcharlt
+
+CREATE OR REPLACE FUNCTION vandelay.overlay_authority_record ( import_id BIGINT, eg_id BIGINT, merge_profile_id INT ) RETURNS BOOL AS $$
+DECLARE
+ merge_profile vandelay.merge_profile%ROWTYPE;
+ dyn_profile vandelay.compile_profile%ROWTYPE;
+ editor_string TEXT;
+ new_editor INT;
+ new_edit_date TIMESTAMPTZ;
+ source_marc TEXT;
+ target_marc TEXT;
+ eg_marc_row authority.record_entry%ROWTYPE;
+ eg_marc TEXT;
+ v_marc TEXT;
+ replace_rule TEXT;
+ match_count INT;
+ update_query TEXT;
+BEGIN
+
+ SELECT * INTO eg_marc_row
+ FROM authority.record_entry b
+ JOIN vandelay.authority_match m ON (m.eg_record = b.id AND m.queued_record = import_id)
+ LIMIT 1;
+
+ SELECT q.marc INTO v_marc
+ FROM vandelay.queued_record q
+ JOIN vandelay.authority_match m ON (m.queued_record = q.id AND q.id = import_id)
+ LIMIT 1;
+
+ eg_marc := eg_marc_row.marc;
+
+ IF eg_marc IS NULL OR v_marc IS NULL THEN
+ -- RAISE NOTICE 'no marc for vandelay or authority record';
+ RETURN FALSE;
+ END IF;
+
+ -- Extract the editor string before any modification to the vandelay
+ -- MARC occur.
+ editor_string :=
+ (oils_xpath('//*[@tag="905"]/*[@code="u"]/text()',v_marc))[1];
+
+ -- If an editor value can be found, update the authority record
+ -- editor and edit_date values.
+ IF editor_string IS NOT NULL AND editor_string <> '' THEN
+
+ -- Vandelay.pm sets the value to 'usrname' when needed.
+ SELECT id INTO new_editor
+ FROM actor.usr WHERE usrname = editor_string;
+
+ IF new_editor IS NULL THEN
+ SELECT usr INTO new_editor
+ FROM actor.card WHERE barcode = editor_string;
+ END IF;
+
+ IF new_editor IS NOT NULL THEN
+ new_edit_date := NOW();
+ ELSE -- No valid editor, use current values
+ new_editor = eg_marc_row.editor;
+ new_edit_date = eg_marc_row.edit_date;
+ END IF;
+ ELSE
+ new_editor = eg_marc_row.editor;
+ new_edit_date = eg_marc_row.edit_date;
+ END IF;
+
+ dyn_profile := vandelay.compile_profile( v_marc );
+
+ IF merge_profile_id IS NOT NULL THEN
+ SELECT * INTO merge_profile FROM vandelay.merge_profile WHERE id = merge_profile_id;
+ IF FOUND THEN
+ dyn_profile.add_rule := BTRIM( dyn_profile.add_rule || ',' || COALESCE(merge_profile.add_spec,''), ',');
+ dyn_profile.strip_rule := BTRIM( dyn_profile.strip_rule || ',' || COALESCE(merge_profile.strip_spec,''), ',');
+ dyn_profile.replace_rule := BTRIM( dyn_profile.replace_rule || ',' || COALESCE(merge_profile.replace_spec,''), ',');
+ dyn_profile.preserve_rule := BTRIM( dyn_profile.preserve_rule || ',' || COALESCE(merge_profile.preserve_spec,''), ',');
+ END IF;
+ END IF;
+
+ IF dyn_profile.replace_rule <> '' AND dyn_profile.preserve_rule <> '' THEN
+ -- RAISE NOTICE 'both replace [%] and preserve [%] specified', dyn_profile.replace_rule, dyn_profile.preserve_rule;
+ RETURN FALSE;
+ END IF;
+
+ IF dyn_profile.replace_rule = '' AND dyn_profile.preserve_rule = '' AND dyn_profile.add_rule = '' AND dyn_profile.strip_rule = '' THEN
+ --Since we have nothing to do, just return a NOOP "we did it"
+ RETURN TRUE;
+ ELSIF dyn_profile.replace_rule <> '' THEN
+ source_marc = v_marc;
+ target_marc = eg_marc;
+ replace_rule = dyn_profile.replace_rule;
+ ELSE
+ source_marc = eg_marc;
+ target_marc = v_marc;
+ replace_rule = dyn_profile.preserve_rule;
+ END IF;
+
+ UPDATE authority.record_entry
+ SET marc = vandelay.merge_record_xml( target_marc, source_marc, dyn_profile.add_rule, replace_rule, dyn_profile.strip_rule ),
+ editor = new_editor,
+ edit_date = new_edit_date
+ WHERE id = eg_id;
+
+ IF NOT FOUND THEN
+ -- Import/merge failed. Nothing left to do.
+ RETURN FALSE;
+ END IF;
+
+ -- Authority record successfully merged / imported.
+
+ -- Update the vandelay record to show the successful import.
+ UPDATE vandelay.queued_authority_record
+ SET imported_as = eg_id,
+ import_time = NOW()
+ WHERE id = import_id;
+
+ RETURN TRUE;
+
+END;
+$$ LANGUAGE PLPGSQL;
+
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0990', :eg_version);
+
+CREATE OR REPLACE FUNCTION rating.copy_count(badge_id INT)
+ RETURNS TABLE (record INT, value NUMERIC) AS $f$
+DECLARE
+ badge rating.badge_with_orgs%ROWTYPE;
+BEGIN
+
+ SELECT * INTO badge FROM rating.badge_with_orgs WHERE id = badge_id;
+
+ PERFORM rating.precalc_bibs_by_copy(badge_id);
+
+ DELETE FROM precalc_copy_filter_bib_list WHERE id NOT IN (
+ SELECT id FROM precalc_filter_bib_list
+ INTERSECT
+ SELECT id FROM precalc_bibs_by_copy_list
+ );
+ ANALYZE precalc_copy_filter_bib_list;
+
+ RETURN QUERY
+ SELECT f.id::INT AS bib,
+ COUNT(f.copy)::NUMERIC
+ FROM precalc_copy_filter_bib_list f
+ JOIN asset.copy cp ON (f.copy = cp.id)
+ JOIN asset.call_number cn ON (cn.id = cp.call_number)
+ WHERE cn.owning_lib = ANY (badge.orgs) GROUP BY 1;
+
+END;
+$f$ LANGUAGE PLPGSQL STRICT;
+
+INSERT INTO rating.popularity_parameter (id, name, func, require_percentile) VALUES (16, 'Copy Count', 'rating.copy_count', TRUE);
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0991', :eg_version);
+
+CREATE OR REPLACE FUNCTION evergreen.ranked_volumes(
+ bibid BIGINT[],
+ ouid INT,
+ depth INT DEFAULT NULL,
+ slimit HSTORE DEFAULT NULL,
+ soffset HSTORE DEFAULT NULL,
+ pref_lib INT DEFAULT NULL,
+ includes TEXT[] DEFAULT NULL::TEXT[]
+) RETURNS TABLE(id BIGINT, name TEXT, label_sortkey TEXT, rank BIGINT) AS $$
+ WITH RECURSIVE ou_depth AS (
+ SELECT COALESCE(
+ $3,
+ (
+ SELECT depth
+ FROM actor.org_unit_type aout
+ INNER JOIN actor.org_unit ou ON ou_type = aout.id
+ WHERE ou.id = $2
+ )
+ ) AS depth
+ ), descendant_depth AS (
+ SELECT ou.id,
+ ou.parent_ou,
+ out.depth
+ FROM actor.org_unit ou
+ JOIN actor.org_unit_type out ON (out.id = ou.ou_type)
+ JOIN anscestor_depth ad ON (ad.id = ou.id),
+ ou_depth
+ WHERE ad.depth = ou_depth.depth
+ UNION ALL
+ SELECT ou.id,
+ ou.parent_ou,
+ out.depth
+ FROM actor.org_unit ou
+ JOIN actor.org_unit_type out ON (out.id = ou.ou_type)
+ JOIN descendant_depth ot ON (ot.id = ou.parent_ou)
+ ), anscestor_depth AS (
+ SELECT ou.id,
+ ou.parent_ou,
+ out.depth
+ FROM actor.org_unit ou
+ JOIN actor.org_unit_type out ON (out.id = ou.ou_type)
+ WHERE ou.id = $2
+ UNION ALL
+ SELECT ou.id,
+ ou.parent_ou,
+ out.depth
+ FROM actor.org_unit ou
+ JOIN actor.org_unit_type out ON (out.id = ou.ou_type)
+ JOIN anscestor_depth ot ON (ot.parent_ou = ou.id)
+ ), descendants as (
+ SELECT ou.* FROM actor.org_unit ou JOIN descendant_depth USING (id)
+ )
+
+ SELECT ua.id, ua.name, ua.label_sortkey, MIN(ua.rank) AS rank FROM (
+ SELECT acn.id, owning_lib.name, acn.label_sortkey,
+ evergreen.rank_cp(acp),
+ RANK() OVER w
+ FROM asset.call_number acn
+ JOIN asset.copy acp ON (acn.id = acp.call_number)
+ JOIN descendants AS aou ON (acp.circ_lib = aou.id)
+ JOIN actor.org_unit AS owning_lib ON (acn.owning_lib = owning_lib.id)
+ WHERE acn.record = ANY ($1)
+ AND acn.deleted IS FALSE
+ AND acp.deleted IS FALSE
+ AND CASE WHEN ('exclude_invisible_acn' = ANY($7)) THEN
+ EXISTS (
+ SELECT 1
+ FROM asset.opac_visible_copies
+ WHERE copy_id = acp.id AND record = acn.record
+ ) ELSE TRUE END
+ GROUP BY acn.id, evergreen.rank_cp(acp), owning_lib.name, acn.label_sortkey, aou.id
+ WINDOW w AS (
+ ORDER BY
+ COALESCE(
+ CASE WHEN aou.id = $2 THEN -20000 END,
+ CASE WHEN aou.id = $6 THEN -10000 END,
+ (SELECT distance - 5000
+ FROM actor.org_unit_descendants_distance($6) as x
+ WHERE x.id = aou.id AND $6 IN (
+ SELECT q.id FROM actor.org_unit_descendants($2) as q)),
+ (SELECT e.distance FROM actor.org_unit_descendants_distance($2) as e WHERE e.id = aou.id),
+ 1000
+ ),
+ evergreen.rank_cp(acp)
+ )
+ ) AS ua
+ GROUP BY ua.id, ua.name, ua.label_sortkey
+ ORDER BY rank, ua.name, ua.label_sortkey
+ LIMIT ($4 -> 'acn')::INT
+ OFFSET ($5 -> 'acn')::INT;
+$$ LANGUAGE SQL STABLE ROWS 10;
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0992', :eg_version);
+
+ALTER TABLE config.copy_status
+ ADD COLUMN is_available BOOL NOT NULL DEFAULT FALSE;
+
+UPDATE config.copy_status SET is_available = TRUE
+ WHERE id IN (0, 7); -- available, reshelving.
+
+CREATE OR REPLACE FUNCTION action.item_user_circ_test( circ_ou INT, match_item BIGINT, match_user INT, renewal BOOL ) RETURNS SETOF action.circ_matrix_test_result AS $func$
+DECLARE
+ user_object actor.usr%ROWTYPE;
+ standing_penalty config.standing_penalty%ROWTYPE;
+ item_object asset.copy%ROWTYPE;
+ item_status_object config.copy_status%ROWTYPE;
+ item_location_object asset.copy_location%ROWTYPE;
+ result action.circ_matrix_test_result;
+ circ_test action.found_circ_matrix_matchpoint;
+ circ_matchpoint config.circ_matrix_matchpoint%ROWTYPE;
+ circ_limit_set config.circ_limit_set%ROWTYPE;
+ hold_ratio action.hold_stats%ROWTYPE;
+ penalty_type TEXT;
+ items_out INT;
+ context_org_list INT[];
+ done BOOL := FALSE;
+BEGIN
+ -- Assume success unless we hit a failure condition
+ result.success := TRUE;
+
+ -- Need user info to look up matchpoints
+ SELECT INTO user_object * FROM actor.usr WHERE id = match_user AND NOT deleted;
+
+ -- (Insta)Fail if we couldn't find the user
+ IF user_object.id IS NULL THEN
+ result.fail_part := 'no_user';
+ result.success := FALSE;
+ done := TRUE;
+ RETURN NEXT result;
+ RETURN;
+ END IF;
+
+ -- Need item info to look up matchpoints
+ SELECT INTO item_object * FROM asset.copy WHERE id = match_item AND NOT deleted;
+
+ -- (Insta)Fail if we couldn't find the item
+ IF item_object.id IS NULL THEN
+ result.fail_part := 'no_item';
+ result.success := FALSE;
+ done := TRUE;
+ RETURN NEXT result;
+ RETURN;
+ END IF;
+
+ SELECT INTO circ_test * FROM action.find_circ_matrix_matchpoint(circ_ou, item_object, user_object, renewal);
+
+ circ_matchpoint := circ_test.matchpoint;
+ result.matchpoint := circ_matchpoint.id;
+ result.circulate := circ_matchpoint.circulate;
+ result.duration_rule := circ_matchpoint.duration_rule;
+ result.recurring_fine_rule := circ_matchpoint.recurring_fine_rule;
+ result.max_fine_rule := circ_matchpoint.max_fine_rule;
+ result.hard_due_date := circ_matchpoint.hard_due_date;
+ result.renewals := circ_matchpoint.renewals;
+ result.grace_period := circ_matchpoint.grace_period;
+ result.buildrows := circ_test.buildrows;
+
+ -- (Insta)Fail if we couldn't find a matchpoint
+ IF circ_test.success = false THEN
+ result.fail_part := 'no_matchpoint';
+ result.success := FALSE;
+ done := TRUE;
+ RETURN NEXT result;
+ RETURN;
+ END IF;
+
+ -- All failures before this point are non-recoverable
+ -- Below this point are possibly overridable failures
+
+ -- Fail if the user is barred
+ IF user_object.barred IS TRUE THEN
+ result.fail_part := 'actor.usr.barred';
+ result.success := FALSE;
+ done := TRUE;
+ RETURN NEXT result;
+ END IF;
+
+ -- Fail if the item can't circulate
+ IF item_object.circulate IS FALSE THEN
+ result.fail_part := 'asset.copy.circulate';
+ result.success := FALSE;
+ done := TRUE;
+ RETURN NEXT result;
+ END IF;
+
+ -- Fail if the item isn't in a circulateable status on a non-renewal
+ IF NOT renewal AND item_object.status <> 8 AND item_object.status NOT IN (
+ (SELECT id FROM config.copy_status WHERE is_available) ) THEN
+ result.fail_part := 'asset.copy.status';
+ result.success := FALSE;
+ done := TRUE;
+ RETURN NEXT result;
+ -- Alternately, fail if the item isn't checked out on a renewal
+ ELSIF renewal AND item_object.status <> 1 THEN
+ result.fail_part := 'asset.copy.status';
+ result.success := FALSE;
+ done := TRUE;
+ RETURN NEXT result;
+ END IF;
+
+ -- Fail if the item can't circulate because of the shelving location
+ SELECT INTO item_location_object * FROM asset.copy_location WHERE id = item_object.location;
+ IF item_location_object.circulate IS FALSE THEN
+ result.fail_part := 'asset.copy_location.circulate';
+ result.success := FALSE;
+ done := TRUE;
+ RETURN NEXT result;
+ END IF;
+
+ -- Use Circ OU for penalties and such
+ SELECT INTO context_org_list ARRAY_AGG(id) FROM actor.org_unit_full_path( circ_ou );
+
+ IF renewal THEN
+ penalty_type = '%RENEW%';
+ ELSE
+ penalty_type = '%CIRC%';
+ END IF;
+
+ FOR standing_penalty IN
+ SELECT DISTINCT csp.*
+ FROM actor.usr_standing_penalty usp
+ JOIN config.standing_penalty csp ON (csp.id = usp.standing_penalty)
+ WHERE usr = match_user
+ AND usp.org_unit IN ( SELECT * FROM unnest(context_org_list) )
+ AND (usp.stop_date IS NULL or usp.stop_date > NOW())
+ AND csp.block_list LIKE penalty_type LOOP
+
+ result.fail_part := standing_penalty.name;
+ result.success := FALSE;
+ done := TRUE;
+ RETURN NEXT result;
+ END LOOP;
+
+ -- Fail if the test is set to hard non-circulating
+ IF circ_matchpoint.circulate IS FALSE THEN
+ result.fail_part := 'config.circ_matrix_test.circulate';
+ result.success := FALSE;
+ done := TRUE;
+ RETURN NEXT result;
+ END IF;
+
+ -- Fail if the total copy-hold ratio is too low
+ IF circ_matchpoint.total_copy_hold_ratio IS NOT NULL THEN
+ SELECT INTO hold_ratio * FROM action.copy_related_hold_stats(match_item);
+ IF hold_ratio.total_copy_ratio IS NOT NULL AND hold_ratio.total_copy_ratio < circ_matchpoint.total_copy_hold_ratio THEN
+ result.fail_part := 'config.circ_matrix_test.total_copy_hold_ratio';
+ result.success := FALSE;
+ done := TRUE;
+ RETURN NEXT result;
+ END IF;
+ END IF;
+
+ -- Fail if the available copy-hold ratio is too low
+ IF circ_matchpoint.available_copy_hold_ratio IS NOT NULL THEN
+ IF hold_ratio.hold_count IS NULL THEN
+ SELECT INTO hold_ratio * FROM action.copy_related_hold_stats(match_item);
+ END IF;
+ IF hold_ratio.available_copy_ratio IS NOT NULL AND hold_ratio.available_copy_ratio < circ_matchpoint.available_copy_hold_ratio THEN
+ result.fail_part := 'config.circ_matrix_test.available_copy_hold_ratio';
+ result.success := FALSE;
+ done := TRUE;
+ RETURN NEXT result;
+ END IF;
+ END IF;
+
+ -- Fail if the user has too many items out by defined limit sets
+ FOR circ_limit_set IN SELECT ccls.* FROM config.circ_limit_set ccls
+ JOIN config.circ_matrix_limit_set_map ccmlsm ON ccmlsm.limit_set = ccls.id
+ WHERE ccmlsm.active AND ( ccmlsm.matchpoint = circ_matchpoint.id OR
+ ( ccmlsm.matchpoint IN (SELECT * FROM unnest(result.buildrows)) AND ccmlsm.fallthrough )
+ ) LOOP
+ IF circ_limit_set.items_out > 0 AND NOT renewal THEN
+ SELECT INTO context_org_list ARRAY_AGG(aou.id)
+ FROM actor.org_unit_full_path( circ_ou ) aou
+ JOIN actor.org_unit_type aout ON aou.ou_type = aout.id
+ WHERE aout.depth >= circ_limit_set.depth;
+ IF circ_limit_set.global THEN
+ WITH RECURSIVE descendant_depth AS (
+ SELECT ou.id,
+ ou.parent_ou
+ FROM actor.org_unit ou
+ WHERE ou.id IN (SELECT * FROM unnest(context_org_list))
+ UNION
+ SELECT ou.id,
+ ou.parent_ou
+ FROM actor.org_unit ou
+ JOIN descendant_depth ot ON (ot.id = ou.parent_ou)
+ ) SELECT INTO context_org_list ARRAY_AGG(ou.id) FROM actor.org_unit ou JOIN descendant_depth USING (id);
+ END IF;
+ SELECT INTO items_out COUNT(DISTINCT circ.id)
+ FROM action.circulation circ
+ JOIN asset.copy copy ON (copy.id = circ.target_copy)
+ LEFT JOIN action.circulation_limit_group_map aclgm ON (circ.id = aclgm.circ)
+ WHERE circ.usr = match_user
+ AND circ.circ_lib IN (SELECT * FROM unnest(context_org_list))
+ AND circ.checkin_time IS NULL
+ AND (circ.stop_fines IN ('MAXFINES','LONGOVERDUE') OR circ.stop_fines IS NULL)
+ AND (copy.circ_modifier IN (SELECT circ_mod FROM config.circ_limit_set_circ_mod_map WHERE limit_set = circ_limit_set.id)
+ OR copy.location IN (SELECT copy_loc FROM config.circ_limit_set_copy_loc_map WHERE limit_set = circ_limit_set.id)
+ OR aclgm.limit_group IN (SELECT limit_group FROM config.circ_limit_set_group_map WHERE limit_set = circ_limit_set.id)
+ );
+ IF items_out >= circ_limit_set.items_out THEN
+ result.fail_part := 'config.circ_matrix_circ_mod_test';
+ result.success := FALSE;
+ done := TRUE;
+ RETURN NEXT result;
+ END IF;
+ END IF;
+ SELECT INTO result.limit_groups result.limit_groups || ARRAY_AGG(limit_group) FROM config.circ_limit_set_group_map WHERE limit_set = circ_limit_set.id AND NOT check_only;
+ END LOOP;
+
+ -- If we passed everything, return the successful matchpoint
+ IF NOT done THEN
+ RETURN NEXT result;
+ END IF;
+
+ RETURN;
+END;
+$func$ LANGUAGE plpgsql;
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0993', :eg_version);
+
+ALTER TABLE config.usr_activity_type
+ ALTER COLUMN transient SET DEFAULT TRUE;
+
+-- Utility function for removing all activity entries by activity type,
+-- except for the most recent entry per user. This is primarily useful
+-- when cleaning up rows prior to setting the transient flag on an
+-- activity type to true. It allows for immediate cleanup of data (e.g.
+-- for patron privacy) and lets admins control when the data is deleted,
+-- which could be useful for huge activity tables.
+
+CREATE OR REPLACE FUNCTION
+ actor.purge_usr_activity_by_type(act_type INTEGER)
+ RETURNS VOID AS $$
+DECLARE
+ cur_usr INTEGER;
+BEGIN
+ FOR cur_usr IN SELECT DISTINCT(usr)
+ FROM actor.usr_activity WHERE etype = act_type LOOP
+ DELETE FROM actor.usr_activity WHERE id IN (
+ SELECT id
+ FROM actor.usr_activity
+ WHERE usr = cur_usr AND etype = act_type
+ ORDER BY event_time DESC OFFSET 1
+ );
+
+ END LOOP;
+END $$ LANGUAGE PLPGSQL;
+
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0994', :eg_version);
+
+CREATE OR REPLACE FUNCTION authority.propagate_changes
+ (aid BIGINT, bid BIGINT) RETURNS BIGINT AS $func$
+DECLARE
+ bib_rec biblio.record_entry%ROWTYPE;
+ new_marc TEXT;
+BEGIN
+
+ SELECT INTO bib_rec * FROM biblio.record_entry WHERE id = bid;
+
+ new_marc := vandelay.merge_record_xml(
+ bib_rec.marc, authority.generate_overlay_template(aid));
+
+ IF new_marc = bib_rec.marc THEN
+ -- Authority record change had no impact on this bib record.
+ -- Nothing left to do.
+ RETURN aid;
+ END IF;
+
+ PERFORM 1 FROM config.global_flag
+ WHERE name = 'ingest.disable_authority_auto_update_bib_meta'
+ AND enabled;
+
+ IF NOT FOUND THEN
+ -- update the bib record editor and edit_date
+ bib_rec.editor := (
+ SELECT editor FROM authority.record_entry WHERE id = aid);
+ bib_rec.edit_date = NOW();
+ END IF;
+
+ UPDATE biblio.record_entry SET
+ marc = new_marc,
+ editor = bib_rec.editor,
+ edit_date = bib_rec.edit_date
+ WHERE id = bid;
+
+ RETURN aid;
+
+END;
+$func$ LANGUAGE PLPGSQL;
+
+
+-- DATA
+-- Disabled by default
+INSERT INTO config.global_flag (name, enabled, label) VALUES (
+ 'ingest.disable_authority_auto_update_bib_meta', FALSE,
+ oils_i18n_gettext(
+ 'ingest.disable_authority_auto_update_bib_meta',
+ 'Authority Automation: Disable automatic authority updates ' ||
+ 'from modifying bib record editor and edit_date',
+ 'cgf',
+ 'label'
+ )
+);
+
+
+CREATE OR REPLACE FUNCTION authority.indexing_ingest_or_delete () RETURNS TRIGGER AS $func$
+DECLARE
+ ashs authority.simple_heading%ROWTYPE;
+ mbe_row metabib.browse_entry%ROWTYPE;
+ mbe_id BIGINT;
+ ash_id BIGINT;
+BEGIN
+
+ IF NEW.deleted IS TRUE THEN -- If this authority is deleted
+ DELETE FROM authority.bib_linking WHERE authority = NEW.id; -- Avoid updating fields in bibs that are no longer visible
+ DELETE FROM authority.full_rec WHERE record = NEW.id; -- Avoid validating fields against deleted authority records
+ DELETE FROM authority.simple_heading WHERE record = NEW.id;
+ -- Should remove matching $0 from controlled fields at the same time?
+
+ -- XXX What do we about the actual linking subfields present in
+ -- authority records that target this one when this happens?
+ DELETE FROM authority.authority_linking
+ WHERE source = NEW.id OR target = NEW.id;
+
+ RETURN NEW; -- and we're done
+ END IF;
+
+ IF TG_OP = 'UPDATE' THEN -- re-ingest?
+ PERFORM * FROM config.internal_flag WHERE name = 'ingest.reingest.force_on_same_marc' AND enabled;
+
+ IF NOT FOUND AND OLD.marc = NEW.marc THEN -- don't do anything if the MARC didn't change
+ RETURN NEW;
+ END IF;
+
+ -- Unless there's a setting stopping us, propagate these updates to any linked bib records when the heading changes
+ PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_auto_update' AND enabled;
+
+ IF NOT FOUND AND NEW.heading <> OLD.heading THEN
+ PERFORM authority.propagate_changes(NEW.id);
+ END IF;
+
+ DELETE FROM authority.simple_heading WHERE record = NEW.id;
+ DELETE FROM authority.authority_linking WHERE source = NEW.id;
+ END IF;
+
+ INSERT INTO authority.authority_linking (source, target, field)
+ SELECT source, target, field FROM authority.calculate_authority_linking(
+ NEW.id, NEW.control_set, NEW.marc::XML
+ );
+
+ FOR ashs IN SELECT * FROM authority.simple_heading_set(NEW.marc) LOOP
+
+ INSERT INTO authority.simple_heading (record,atag,value,sort_value,thesaurus)
+ VALUES (ashs.record, ashs.atag, ashs.value, ashs.sort_value, ashs.thesaurus);
+ ash_id := CURRVAL('authority.simple_heading_id_seq'::REGCLASS);
+
+ SELECT INTO mbe_row * FROM metabib.browse_entry
+ WHERE value = ashs.value AND sort_value = ashs.sort_value;
+
+ IF FOUND THEN
+ mbe_id := mbe_row.id;
+ ELSE
+ INSERT INTO metabib.browse_entry
+ ( value, sort_value ) VALUES
+ ( ashs.value, ashs.sort_value );
+
+ mbe_id := CURRVAL('metabib.browse_entry_id_seq'::REGCLASS);
+ END IF;
+
+ INSERT INTO metabib.browse_entry_simple_heading_map (entry,simple_heading) VALUES (mbe_id,ash_id);
+
+ END LOOP;
+
+ -- Flatten and insert the afr data
+ PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_full_rec' AND enabled;
+ IF NOT FOUND THEN
+ PERFORM authority.reingest_authority_full_rec(NEW.id);
+ PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_rec_descriptor' AND enabled;
+ IF NOT FOUND THEN
+ PERFORM authority.reingest_authority_rec_descriptor(NEW.id);
+ END IF;
+ END IF;
+
+ RETURN NEW;
+END;
+$func$ LANGUAGE PLPGSQL;
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0995', :eg_version);
+
+INSERT INTO rating.badge (name, description, scope, weight, horizon_age, importance_age, importance_interval, importance_scale, recalc_interval, popularity_parameter, percentile)
+ VALUES('Top Holds Over Last 5 Years', 'The top 97th percentile for holds requested over the past five years on all materials. More weight is given to holds requested over the last year, with importance decreasing for every year after that.', 1, 3, '5 years', '5 years', '1 year', 2, '1 day', 2, 97);
+
+
+SELECT evergreen.upgrade_deps_block_check('0996', :eg_version);
+
+INSERT INTO config.usr_setting_type (
+ name,
+ opac_visible,
+ label,
+ description,
+ datatype
+) VALUES (
+ 'circ.send_email_checkout_receipts',
+ TRUE,
+ oils_i18n_gettext('circ.send_email_checkout_receipts', 'Email checkout receipts by default?', 'cust', 'label'),
+ oils_i18n_gettext('circ.send_email_checkout_receipts', 'Email checkout receipts by default?', 'cust', 'description'),
+ 'bool'
+);
+
+INSERT INTO action_trigger.hook (key, core_type, description, passive)
+VALUES (
+ 'circ.checkout.batch_notify',
+ 'circ',
+ oils_i18n_gettext(
+ 'circ.checkout.batch_notify',
+ 'Notification of a group of circs',
+ 'ath',
+ 'description'
+ ),
+ FALSE
+);
+
+INSERT INTO action_trigger.hook (key, core_type, description, passive)
+VALUES (
+ 'circ.checkout.batch_notify.session',
+ 'circ',
+ oils_i18n_gettext(
+ 'circ.checkout.batch_notify.session',
+ 'Notification of a group of circs at the end of a checkout session',
+ 'ath',
+ 'description'
+ ),
+ FALSE
+);
+
+INSERT INTO action_trigger.event_definition (
+ active,
+ owner,
+ name,
+ hook,
+ validator,
+ reactor,
+ usr_field,
+ opt_in_setting,
+ group_field,
+ template
+) VALUES (
+ TRUE,
+ 1,
+ 'Email Checkout Receipt',
+ 'circ.checkout.batch_notify.session',
+ 'NOOP_True',
+ 'SendEmail',
+ 'usr',
+ 'circ.send_email_checkout_receipts',
+ 'usr',
+ $$[%- USE date -%]
+[%- user = target.0.usr -%]
+To: [%- params.recipient_email || user.email %]
+From: [%- helpers.get_org_setting(target.0.circ_lib.id, 'org.bounced_emails') || params.sender_email || default_sender %]
+Subject: Checkout Receipt
+Auto-Submitted: auto-generated
+
+You checked out the following items:
+
+[% FOR circ IN target %]
+ [%- copy_details = helpers.get_copy_bib_basics(circ.target_copy.id) -%]
+ Title: [% copy_details.title %]
+ Author: [% copy_details.author %]
+ Call Number: [% circ.target_copy.call_number.label %]
+ Barcode: [% circ.target_copy.barcode %]
+ Due: [% date.format(helpers.format_date(circ.due_date), '%Y-%m-%d') %]
+ Library: [% circ.circ_lib.name %]
+
+[% END %]
+$$);
+
+INSERT INTO action_trigger.environment (
+ event_def,
+ path
+) VALUES (
+ currval('action_trigger.event_definition_id_seq'),
+ 'target_copy.call_number'
+), (
+ currval('action_trigger.event_definition_id_seq'),
+ 'target_copy.location'
+), (
+ currval('action_trigger.event_definition_id_seq'),
+ 'usr'
+), (
+ currval('action_trigger.event_definition_id_seq'),
+ 'circ_lib'
+);
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0997', :eg_version);
+
+INSERT INTO config.copy_status (id, name, holdable, opac_visible) VALUES (18,oils_i18n_gettext(18, 'Canceled Transit', 'ccs', 'name'), 't', 't');
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0998', :eg_version);
+
+DROP VIEW IF EXISTS action.all_circulation;
+CREATE VIEW action.all_circulation AS
+ SELECT aged_circulation.id, aged_circulation.usr_post_code,
+ aged_circulation.usr_home_ou, aged_circulation.usr_profile,
+ aged_circulation.usr_birth_year, aged_circulation.copy_call_number,
+ aged_circulation.copy_location, aged_circulation.copy_owning_lib,
+ aged_circulation.copy_circ_lib, aged_circulation.copy_bib_record,
+ aged_circulation.xact_start, aged_circulation.xact_finish,
+ aged_circulation.target_copy, aged_circulation.circ_lib,
+ aged_circulation.circ_staff, aged_circulation.checkin_staff,
+ aged_circulation.checkin_lib, aged_circulation.renewal_remaining,
+ aged_circulation.grace_period, aged_circulation.due_date,
+ aged_circulation.stop_fines_time, aged_circulation.checkin_time,
+ aged_circulation.create_time, aged_circulation.duration,
+ aged_circulation.fine_interval, aged_circulation.recurring_fine,
+ aged_circulation.max_fine, aged_circulation.phone_renewal,
+ aged_circulation.desk_renewal, aged_circulation.opac_renewal,
+ aged_circulation.duration_rule,
+ aged_circulation.recurring_fine_rule,
+ aged_circulation.max_fine_rule, aged_circulation.stop_fines,
+ aged_circulation.workstation, aged_circulation.checkin_workstation,
+ aged_circulation.checkin_scan_time, aged_circulation.parent_circ,
+ NULL AS usr
+ FROM action.aged_circulation
+UNION ALL
+ SELECT DISTINCT circ.id,
+ COALESCE(a.post_code, b.post_code) AS usr_post_code,
+ p.home_ou AS usr_home_ou, p.profile AS usr_profile,
+ date_part('year'::text, p.dob)::integer AS usr_birth_year,
+ cp.call_number AS copy_call_number, circ.copy_location,
+ cn.owning_lib AS copy_owning_lib, cp.circ_lib AS copy_circ_lib,
+ cn.record AS copy_bib_record, circ.xact_start, circ.xact_finish,
+ circ.target_copy, circ.circ_lib, circ.circ_staff,
+ circ.checkin_staff, circ.checkin_lib, circ.renewal_remaining,
+ circ.grace_period, circ.due_date, circ.stop_fines_time,
+ circ.checkin_time, circ.create_time, circ.duration,
+ circ.fine_interval, circ.recurring_fine, circ.max_fine,
+ circ.phone_renewal, circ.desk_renewal, circ.opac_renewal,
+ circ.duration_rule, circ.recurring_fine_rule, circ.max_fine_rule,
+ circ.stop_fines, circ.workstation, circ.checkin_workstation,
+ circ.checkin_scan_time, circ.parent_circ, circ.usr
+ FROM action.circulation circ
+ JOIN asset.copy cp ON circ.target_copy = cp.id
+JOIN asset.call_number cn ON cp.call_number = cn.id
+JOIN actor.usr p ON circ.usr = p.id
+LEFT JOIN actor.usr_address a ON p.mailing_address = a.id
+LEFT JOIN actor.usr_address b ON p.billing_address = b.id;
+
+
+CREATE OR REPLACE FUNCTION action.all_circ_chain (ctx_circ_id INTEGER)
+ RETURNS SETOF action.all_circulation AS $$
+DECLARE
+ tmp_circ action.all_circulation%ROWTYPE;
+ circ_0 action.all_circulation%ROWTYPE;
+BEGIN
+
+ SELECT INTO tmp_circ * FROM action.all_circulation WHERE id = ctx_circ_id;
+
+ IF tmp_circ IS NULL THEN
+ RETURN NEXT tmp_circ;
+ END IF;
+ circ_0 := tmp_circ;
+
+ -- find the front of the chain
+ WHILE TRUE LOOP
+ SELECT INTO tmp_circ * FROM action.all_circulation
+ WHERE id = tmp_circ.parent_circ;
+ IF tmp_circ IS NULL THEN
+ EXIT;
+ END IF;
+ circ_0 := tmp_circ;
+ END LOOP;
+
+ -- now send the circs to the caller, oldest to newest
+ tmp_circ := circ_0;
+ WHILE TRUE LOOP
+ IF tmp_circ IS NULL THEN
+ EXIT;
+ END IF;
+ RETURN NEXT tmp_circ;
+ SELECT INTO tmp_circ * FROM action.all_circulation
+ WHERE parent_circ = tmp_circ.id;
+ END LOOP;
+
+END;
+$$ LANGUAGE 'plpgsql';
+
+CREATE OR REPLACE FUNCTION action.summarize_all_circ_chain
+ (ctx_circ_id INTEGER) RETURNS action.circ_chain_summary AS $$
+
+DECLARE
+
+ -- first circ in the chain
+ circ_0 action.all_circulation%ROWTYPE;
+
+ -- last circ in the chain
+ circ_n action.all_circulation%ROWTYPE;
+
+ -- circ chain under construction
+ chain action.circ_chain_summary;
+ tmp_circ action.all_circulation%ROWTYPE;
+
+BEGIN
+
+ chain.num_circs := 0;
+ FOR tmp_circ IN SELECT * FROM action.all_circ_chain(ctx_circ_id) LOOP
+
+ IF chain.num_circs = 0 THEN
+ circ_0 := tmp_circ;
+ END IF;
+
+ chain.num_circs := chain.num_circs + 1;
+ circ_n := tmp_circ;
+ END LOOP;
+
+ chain.start_time := circ_0.xact_start;
+ chain.last_stop_fines := circ_n.stop_fines;
+ chain.last_stop_fines_time := circ_n.stop_fines_time;
+ chain.last_checkin_time := circ_n.checkin_time;
+ chain.last_checkin_scan_time := circ_n.checkin_scan_time;
+ SELECT INTO chain.checkout_workstation name FROM actor.workstation WHERE id = circ_0.workstation;
+ SELECT INTO chain.last_checkin_workstation name FROM actor.workstation WHERE id = circ_n.checkin_workstation;
+
+ IF chain.num_circs > 1 THEN
+ chain.last_renewal_time := circ_n.xact_start;
+ SELECT INTO chain.last_renewal_workstation name FROM actor.workstation WHERE id = circ_n.workstation;
+ END IF;
+
+ RETURN chain;
+
+END;
+$$ LANGUAGE 'plpgsql';
+
+
+
+
+SELECT evergreen.upgrade_deps_block_check('0999', :eg_version);
+
+CREATE TABLE staging.setting_stage (
+ row_id BIGSERIAL PRIMARY KEY,
+ row_date TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
+ usrname TEXT NOT NULL,
+ setting TEXT NOT NULL,
+ value TEXT NOT NULL,
+ complete BOOL DEFAULT FALSE
+);
+
+-- Add Spanish to config.i18n_locale table
+
+
+SELECT evergreen.upgrade_deps_block_check('1000', :eg_version);
+
+INSERT INTO config.i18n_locale (code,marc_code,name,description)
+ VALUES ('es-ES', 'spa', oils_i18n_gettext('es-ES', 'Spanish', 'i18n_l', 'name'),
+ oils_i18n_gettext('es-ES', 'Spanish', 'i18n_l', 'description'));
+
+COMMIT;
+
+\qecho
+\qecho
+\qecho Now running an update to set the 901$s for bibliographic
+\qecho records that have a source set. This may take a while.
+\qecho
+\qecho The update can be cancelled now and run later
+\qecho using the following SQL statement:
+\qecho
+\qecho UPDATE biblio.record_entry SET id = id WHERE source IS NOT NULL;
+\qecho
+UPDATE biblio.record_entry SET id = id WHERE source IS NOT NULL;