From 25cdc8f71f70d478c9cb2246251ad3b2ec33c764 Mon Sep 17 00:00:00 2001 From: Bernardo Gonzalez Kriegel Date: Thu, 28 Nov 2019 19:06:35 -0300 Subject: [PATCH] Bug 13897: Use YAML files for installer data This patch modifies C4/Installer.pm to add support for loading YAML files into database. As an example of the functionality, optional auth_val.sql file is replaced by auth_val.yml The rationale behind this feature is to enable the translation of the data that is loaded into the database. That will be addressed in another bug. But taking into account that goal, translatable values are declared in the YAML files, to ease identification by translate script. To test: 0) Do a clean install with all optional data, then dump authorised_values table, reserve. 1) Apply the patch 2) Do a clean install in English (marc21/unimarc) 3) On optional data check for description of auth_val "Some basic default authorised values for ..." 4) Select all optional data 5) Finish installation 6) Dump again authorised_values table and compare with that of point '0'. Expected differences: most rows now have 'lib_opac' field with the same value as 'lib' --- C4/Installer.pm | 41 +++- installer/data/mysql/en/optional/auth_val.sql | 86 ------- installer/data/mysql/en/optional/auth_val.yml | 325 ++++++++++++++++++++++++++ 3 files changed, 356 insertions(+), 96 deletions(-) delete mode 100644 installer/data/mysql/en/optional/auth_val.sql create mode 100644 installer/data/mysql/en/optional/auth_val.yml diff --git a/C4/Installer.pm b/C4/Installer.pm index 0a6fca8..5bf0851 100644 --- a/C4/Installer.pm +++ b/C4/Installer.pm @@ -21,6 +21,7 @@ use Modern::Perl; use Encode qw( encode is_utf8 ); use DBIx::RunSQL; +use YAML::Syck qw( LoadFile ); use C4::Context; use C4::Installer::PerlModules; use DBI; @@ -145,12 +146,12 @@ sub marc_framework_sql_list { foreach my $requirelevel (@listdir) { opendir( MYDIR, "$dir/$requirelevel" ); - my @listname = grep { !/^\./ && -f "$dir/$requirelevel/$_" && $_ =~ m/\.sql$/ } readdir(MYDIR); + my @listname = grep { !/^\./ && -f "$dir/$requirelevel/$_" && $_ =~ m/\.(sql|yml)$/ } readdir(MYDIR); closedir MYDIR; my %cell; my @frameworklist; map { - my $name = substr( $_, 0, -4 ); + my $name = substr( $_, 0, -4 ); # FIXME: restricted to 3 letter extension open my $fh, "<:encoding(UTF-8)", "$dir/$requirelevel/$name.txt"; my $line = <$fh>; $line = Encode::encode('UTF-8', $line) unless ( Encode::is_utf8($line) ); @@ -222,7 +223,7 @@ sub sample_data_sql_list { foreach my $requirelevel (@listdir) { opendir( MYDIR, "$dir/$requirelevel" ); - my @listname = grep { !/^\./ && -f "$dir/$requirelevel/$_" && $_ =~ m/\.sql$/ } readdir(MYDIR); + my @listname = grep { !/^\./ && -f "$dir/$requirelevel/$_" && $_ =~ m/\.(sql|yml)$/ } readdir(MYDIR); closedir MYDIR; my %cell; my @frameworklist; @@ -439,7 +440,7 @@ sub set_version_syspref { my $error = $installer->load_sql($filename); -Runs a the specified SQL file using a sql loader DBIx::RunSQL +Runs the specified input file using a sql loader DBIx::RunSQL, or a yaml loader Returns any strings sent to STDERR # FIXME This should be improved: sometimes the caller and load_sql warn the same @@ -459,12 +460,32 @@ sub load_sql { local *STDERR; open STDERR, ">>", \$dup_stderr; - eval { - DBIx::RunSQL->run_sql_file( - dbh => $dbh, - sql => $filename, - ); - }; + if ( $filename =~ /sql$/ ) { # SQL files + eval { + DBIx::RunSQL->run_sql_file( + dbh => $dbh, + sql => $filename, + ); + }; + } + else { # YAML files + eval { + # Note: Only one table per file, multiple table inserts require multiple files + # with proper names to ensure ordered insert + my $yaml = LoadFile( $filename ); # Load YAML + my $table = ( keys %$yaml )[0]; # table name + my @rows = @{ $yaml->{$table}->{rows} }; # + my @columns = ( sort keys %{$rows[0]} ); # column names + my $fields = join ",", @columns; # idem, joined + my $placeholders = join ",", map "?",(1..$#columns+1); # '?,..,?' string + my $query = "INSERT INTO $table ( $fields ) VALUES ( $placeholders )"; + my $loadyaml = $dbh->prepare($query); + foreach my $row ( @rows ) { + my @values = map { $row->{$_} } @columns; + $loadyaml->execute( @values ); + } + }; + } }; # errors thrown while loading installer data should be logged if( $dup_stderr ) { diff --git a/installer/data/mysql/en/optional/auth_val.sql b/installer/data/mysql/en/optional/auth_val.sql deleted file mode 100644 index 8d4821a..0000000 --- a/installer/data/mysql/en/optional/auth_val.sql +++ /dev/null @@ -1,86 +0,0 @@ --- Reasons for acceptance or rejection of suggestions in acquisitions -INSERT INTO authorised_values (category, authorised_value, lib) VALUES ('SUGGEST','BSELL','Bestseller'); -INSERT INTO authorised_values (category, authorised_value, lib) VALUES ('SUGGEST','SCD','Shelf Copy Damaged'); -INSERT INTO authorised_values (category, authorised_value, lib) VALUES ('SUGGEST','LCL','Library Copy Lost'); -INSERT INTO authorised_values (category, authorised_value, lib) VALUES ('SUGGEST','AVILL','Available via ILL'); - --- Desired formats for requesting new materials -INSERT INTO authorised_values (category, authorised_value, lib, lib_opac) VALUES ('SUGGEST_FORMAT', 'BOOK', 'Book', 'Book'); -INSERT INTO authorised_values (category, authorised_value, lib, lib_opac) VALUES ('SUGGEST_FORMAT', 'LP', 'Large print', 'Large print'); -INSERT INTO authorised_values (category, authorised_value, lib, lib_opac) VALUES ('SUGGEST_FORMAT', 'EBOOK', 'EBook', 'Ebook'); -INSERT INTO authorised_values (category, authorised_value, lib, lib_opac) VALUES ('SUGGEST_FORMAT', 'AUDIOBOOK', 'Audiobook', 'Audiobook'); -INSERT INTO authorised_values (category, authorised_value, lib, lib_opac) VALUES ('SUGGEST_FORMAT', 'DVD', 'DVD', 'DVD'); - --- availability statuses -INSERT INTO `authorised_values` (category, authorised_value, lib) VALUES ('LOST','2','Long Overdue (Lost)'); -INSERT INTO `authorised_values` (category, authorised_value, lib) VALUES ('LOST','1','Lost'); -INSERT INTO `authorised_values` (category, authorised_value, lib ) VALUES ('LOST','3','Lost and Paid For'); -INSERT INTO `authorised_values` (category, authorised_value, lib )VALUES ('LOST','4','Missing'); - --- damaged status of an item -INSERT INTO `authorised_values` (category, authorised_value, lib) VALUES ('DAMAGED','1','Damaged'); - --- location qualification for an item, departments are linked by default to items.location -INSERT INTO `authorised_values` (category, authorised_value, lib) VALUES ('LOC','FIC','Fiction'); -INSERT INTO `authorised_values` (category, authorised_value, lib) VALUES ('LOC','CHILD','Children\'s Area'); -INSERT INTO `authorised_values` (category, authorised_value, lib) VALUES ('LOC','DISPLAY','On Display'); -INSERT INTO `authorised_values` (category, authorised_value, lib) VALUES ('LOC','NEW','New Materials Shelf'); -INSERT INTO `authorised_values` (category, authorised_value, lib) VALUES ('LOC','STAFF','Staff Office'); -INSERT INTO `authorised_values` (category, authorised_value, lib) VALUES ('LOC','GEN','General Stacks'); -INSERT INTO `authorised_values` (category, authorised_value, lib) VALUES ('LOC','AV','Audio Visual'); -INSERT INTO `authorised_values` (category, authorised_value, lib) VALUES ('LOC','REF','Reference'); -INSERT INTO `authorised_values` (category, authorised_value, lib) VALUES ('LOC','CART','Book Cart'); -INSERT INTO `authorised_values` (category, authorised_value, lib) VALUES ('LOC','PROC','Processing Center'); - --- collection codes for an item -INSERT INTO `authorised_values` (category, authorised_value, lib) VALUES ('CCODE','FIC','Fiction'); -INSERT INTO `authorised_values` (category, authorised_value, lib) VALUES ('CCODE','REF','Reference'); -INSERT INTO `authorised_values` (category, authorised_value, lib) VALUES ('CCODE','NFIC','Non-fiction'); - --- withdrawn status of an item, linked to items.withdrawn -INSERT INTO `authorised_values` (category, authorised_value, lib) VALUES ('WITHDRAWN','1','Withdrawn'); - --- loanability status of an item, linked to items.notforloan -INSERT INTO `authorised_values` (category, authorised_value, lib) VALUES ('NOT_LOAN','-1','Ordered'); -INSERT INTO `authorised_values` (category, authorised_value, lib) VALUES ('NOT_LOAN','1','Not For Loan'); -INSERT INTO `authorised_values` (category, authorised_value, lib) VALUES ('NOT_LOAN','2','Staff Collection'); - --- restricted status of an item, linked to items.restricted -INSERT INTO `authorised_values` (category, authorised_value, lib) VALUES ('RESTRICTED','1','Restricted Access'); - --- custom borrower notes -INSERT INTO `authorised_values` (category, authorised_value, lib) VALUES ('BOR_NOTES','ADDR','Address Notes'); - --- OPAC Suggestions reasons -INSERT INTO authorised_values (category,authorised_value,lib,lib_opac) VALUES ('OPAC_SUG','damaged','The copy on the shelf is damaged','The copy on the shelf is damaged'); -INSERT INTO authorised_values (category,authorised_value,lib,lib_opac) VALUES ('OPAC_SUG','bestseller','Upcoming title by popular author','Upcoming title by popular author'); - --- Report groups -INSERT INTO authorised_values (category, authorised_value, lib) VALUES ('REPORT_GROUP', 'CIRC', 'Circulation'); -INSERT INTO authorised_values (category, authorised_value, lib) VALUES ('REPORT_GROUP', 'CAT', 'Catalog'); -INSERT INTO authorised_values (category, authorised_value, lib) VALUES ('REPORT_GROUP', 'PAT', 'Patrons'); -INSERT INTO authorised_values (category, authorised_value, lib) VALUES ('REPORT_GROUP', 'ACQ', 'Acquisitions'); -INSERT INTO authorised_values (category, authorised_value, lib) VALUES ('REPORT_GROUP', 'ACC', 'Accounts'); -INSERT INTO authorised_values (category, authorised_value, lib) VALUES ('REPORT_GROUP', 'SER', 'Serials'); - --- SIP2 media types -INSERT INTO authorised_values (category, authorised_value, lib) VALUES ('SIP_MEDIA_TYPE', '000', 'Other'); -INSERT INTO authorised_values (category, authorised_value, lib) VALUES ('SIP_MEDIA_TYPE', '001', 'Book'); -INSERT INTO authorised_values (category, authorised_value, lib) VALUES ('SIP_MEDIA_TYPE', '002', 'Magazine'); -INSERT INTO authorised_values (category, authorised_value, lib) VALUES ('SIP_MEDIA_TYPE', '003', 'Bound journal'); -INSERT INTO authorised_values (category, authorised_value, lib) VALUES ('SIP_MEDIA_TYPE', '004', 'Audio tape'); -INSERT INTO authorised_values (category, authorised_value, lib) VALUES ('SIP_MEDIA_TYPE', '005', 'Video tape'); -INSERT INTO authorised_values (category, authorised_value, lib) VALUES ('SIP_MEDIA_TYPE', '006', 'CD/CDROM'); -INSERT INTO authorised_values (category, authorised_value, lib) VALUES ('SIP_MEDIA_TYPE', '007', 'Diskette'); -INSERT INTO authorised_values (category, authorised_value, lib) VALUES ('SIP_MEDIA_TYPE', '008', 'Book with diskette'); -INSERT INTO authorised_values (category, authorised_value, lib) VALUES ('SIP_MEDIA_TYPE', '009', 'Book with CD'); -INSERT INTO authorised_values (category, authorised_value, lib) VALUES ('SIP_MEDIA_TYPE', '010', 'Book with audio tape'); - --- order cancellation reasons -INSERT INTO authorised_values (category, authorised_value, lib) VALUES ('ORDER_CANCELLATION_REASON', 0, 'No reason provided'); -INSERT INTO authorised_values (category, authorised_value, lib) VALUES ('ORDER_CANCELLATION_REASON', 1, 'Out of stock'); -INSERT INTO authorised_values (category, authorised_value, lib) VALUES ('ORDER_CANCELLATION_REASON', 2, 'Restocking'); - --- return claims -INSERT INTO authorised_values (category, authorised_value, lib) VALUES ('RETURN_CLAIM_RESOLUTION', 'RET_BY_PATRON', 'Returned by patron'); -INSERT INTO authorised_values (category, authorised_value, lib) VALUES ('RETURN_CLAIM_RESOLUTION', 'FOUND_IN_LIB', 'Found in library'); diff --git a/installer/data/mysql/en/optional/auth_val.yml b/installer/data/mysql/en/optional/auth_val.yml new file mode 100644 index 0000000..6961aff --- /dev/null +++ b/installer/data/mysql/en/optional/auth_val.yml @@ -0,0 +1,325 @@ +--- +# +# Some basic default authorised values for library locations, item lost status, etc. +# You can change these at any time after installation. +# +# Copyright 2019 Koha Development Team +# +# This file is part of Koha. +# +# Koha 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. +# +# Koha 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. +# +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# + +authorised_values: + translatable: { lib: 1, lib_opac: 1 } + rows: + # Reasons for acceptance or rejection of suggestions in acquisitions + - category: "SUGGEST" + authorised_value: "BSELL" + lib: "Bestseller" + lib_opac: "Bestseller" + + - category: "SUGGEST" + authorised_value: "SCD" + lib: "Shelf Copy Damaged" + lib_opac: "Shelf Copy Damaged" + + - category: "SUGGEST" + authorised_value: "LCL" + lib: "Library Copy Lost" + lib_opac: "Library Copy Lost" + + - category: "SUGGEST" + authorised_value: "AVILL" + lib: "Available via ILL" + lib_opac: "Available via ILL" + + # Desired formats for requesting new materials + - category: "SUGGEST_FORMAT" + authorised_value: "BOOK" + lib: "Book" + lib_opac: "Book" + + - category: "SUGGEST_FORMAT" + authorised_value: "LP" + lib: "Large print" + lib_opac: "Large print" + + - category: "SUGGEST_FORMAT" + authorised_value: "EBOOK" + lib: "EBook" + lib_opac: "Ebook" + + - category: "SUGGEST_FORMAT" + authorised_value: "AUDIOBOOK" + lib: "Audiobook" + lib_opac: "Audiobook" + + - category: "SUGGEST_FORMAT" + authorised_value: "DVD" + lib: "DVD" + lib_opac: "DVD" + + # availability statuses + - category: "LOST" + authorised_value: "2" + lib: "Long Overdue (Lost)" + lib_opac: "Long Overdue (Lost)" + + - category: "LOST" + authorised_value: "1" + lib: "Lost" + lib_opac: "Lost" + + - category: "LOST" + authorised_value: "3" + lib: "Lost and Paid For" + lib_opac: "Lost and Paid For" + + - category: "LOST" + authorised_value: "4" + lib: "Missing" + lib_opac: "Missing" + + # damaged status of an item + - category: "DAMAGED" + authorised_value: "1" + lib: "Damaged" + lib_opac: "Damaged" + + # location qualification for an item, departments are linked by default to items.location + - category: "LOC" + authorised_value: "FIC" + lib: "Fiction" + lib_opac: "Fiction" + + - category: "LOC" + authorised_value: "CHILD" + lib: "Children\'s Area" + lib_opac: "Children\'s Area" + + - category: "LOC" + authorised_value: "DISPLAY" + lib: "On Display" + lib_opac: "On Display" + + - category: "LOC" + authorised_value: "NEW" + lib: "New Materials Shelf" + lib_opac: "New Materials Shelf" + + - category: "LOC" + authorised_value: "STAFF" + lib: "Staff Office" + lib_opac: "Staff Office" + + - category: "LOC" + authorised_value: "GEN" + lib: "General Stacks" + lib_opac: "General Stacks" + + - category: "LOC" + authorised_value: "AV" + lib: "Audio Visual" + lib_opac: "Audio Visual" + + - category: "LOC" + authorised_value: "REF" + lib: "Reference" + lib_opac: "Reference" + + - category: "LOC" + authorised_value: "CART" + lib: "Book Cart" + lib_opac: "Book Cart" + + - category: "LOC" + authorised_value: "PROC" + lib: "Processing Center" + lib_opac: "Processing Center" + + # collection codes for an item + - category: "CCODE" + authorised_value: "FIC" + lib: "Fiction" + lib_opac: "Fiction" + + - category: "CCODE" + authorised_value: "REF" + lib: "Reference" + lib_opac: "Reference" + + - category: "CCODE" + authorised_value: "NFIC" + lib: "Non-fiction" + lib_opac: "Non-fiction" + + # withdrawn status of an item, linked to items.withdrawn + - category: "WITHDRAWN" + authorised_value: "1" + lib: "Withdrawn" + lib_opac: "Withdrawn" + + # loanability status of an item, linked to items.notforloan + - category: "NOT_LOAN" + authorised_value: "-1" + lib: "Ordered" + lib_opac: "Ordered" + + - category: "NOT_LOAN" + authorised_value: "1" + lib: "Not For Loan" + lib_opac: "Not For Loan" + + - category: "NOT_LOAN" + authorised_value: "2" + lib: "Staff Collection" + lib_opac: "Staff Collection" + + # restricted status of an item, linked to items.restricted + - category: "RESTRICTED" + authorised_value: "1" + lib: "Restricted Access" + lib_opac: "Restricted Access" + + # custom borrower notes + - category: "BOR_NOTES" + authorised_value: "ADDR" + lib: "Address Notes" + lib_opac: "Address Notes" + + # OPAC Suggestions reasons + - category: "OPAC_SUG" + authorised_value: "damaged" + lib: "The copy on the shelf is damaged" + lib_opac: "The copy on the shelf is damaged" + + - category: "OPAC_SUG" + authorised_value: "bestseller" + lib: "Upcoming title by popular author" + lib_opac: "Upcoming title by popular author" + + # Report groups + - category: "REPORT_GROUP" + authorised_value: "CIRC" + lib: "Circulation" + lib_opac: "Circulation" + + - category: "REPORT_GROUP" + authorised_value: "CAT" + lib: "Catalog" + lib_opac: "Catalog" + + - category: "REPORT_GROUP" + authorised_value: "PAT" + lib: "Patrons" + lib_opac: "Patrons" + + - category: "REPORT_GROUP" + authorised_value: "ACQ" + lib: "Acquisitions" + lib_opac: "Acquisitions" + + - category: "REPORT_GROUP" + authorised_value: "ACC" + lib: "Accounts" + lib_opac: "Accounts" + + - category: "REPORT_GROUP" + authorised_value: "SER" + lib: "Serials" + lib_opac: "Serials" + + # SIP2 media types + - category: "SIP_MEDIA_TYPE" + authorised_value: "000" + lib: "Other" + lib_opac: "Other" + + - category: "SIP_MEDIA_TYPE" + authorised_value: "001" + lib: "Book" + lib_opac: "Book" + + - category: "SIP_MEDIA_TYPE" + authorised_value: "002" + lib: "Magazine" + lib_opac: "Magazine" + + - category: "SIP_MEDIA_TYPE" + authorised_value: "003" + lib: "Bound journal" + lib_opac: "Bound journal" + + - category: "SIP_MEDIA_TYPE" + authorised_value: "004" + lib: "Audio tape" + lib_opac: "Audio tape" + + - category: "SIP_MEDIA_TYPE" + authorised_value: "005" + lib: "Video tape" + lib_opac: "Video tape" + + - category: "SIP_MEDIA_TYPE" + authorised_value: "006" + lib: "CD/CDROM" + lib_opac: "CD/CDROM" + + - category: "SIP_MEDIA_TYPE" + authorised_value: "007" + lib: "Diskette" + lib_opac: "Diskette" + + - category: "SIP_MEDIA_TYPE" + authorised_value: "008" + lib: "Book with diskette" + lib_opac: "Book with diskette" + + - category: "SIP_MEDIA_TYPE" + authorised_value: "009" + lib: "Book with CD" + lib_opac: "Book with CD" + + - category: "SIP_MEDIA_TYPE" + authorised_value: "010" + lib: "Book with audio tape" + lib_opac: "Book with audio tape" + + # order cancellation reasons + - category: "ORDER_CANCELLATION_REASON" + authorised_value: "0" + lib: "No reason provided" + lib_opac: "No reason provided" + + - category: "ORDER_CANCELLATION_REASON" + authorised_value: "1" + lib: "Out of stock" + lib_opac: "Out of stock" + + - category: "ORDER_CANCELLATION_REASON" + authorised_value: "2" + lib: "Restocking" + lib_opac: "Restocking" + + # return claims + - category: "RETURN_CLAIM_RESOLUTION" + authorised_value: "RET_BY_PATRON" + lib: "Returned by patron" + lib_opac: "Returned by patron" + + - category: "RETURN_CLAIM_RESOLUTION" + authorised_value: "FOUND_IN_LIB" + lib: "Found in library" + lib_opac: "Found in library" -- 2.7.4