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.

Also file description is moved into the yaml
file.

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'.
   No differences should be found.

Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
This commit is contained in:
Bernardo Gonzalez Kriegel 2019-11-28 19:06:35 -03:00 committed by Martin Renvoize
parent 0706922221
commit 3edee6db6f
No known key found for this signature in database
GPG Key ID: 422B469130441A0F
4 changed files with 331 additions and 102 deletions

View File

@ -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 DBI;
use Koha;
@ -144,12 +145,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) );
@ -221,16 +222,22 @@ 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;
map {
my $name = substr( $_, 0, -4 );
open my $fh , "<:encoding(UTF-8)", "$dir/$requirelevel/$name.txt";
my $line = <$fh>;
$line = Encode::encode('UTF-8', $line) unless ( Encode::is_utf8($line) );
my @lines = split /\n/, $line;
my ( $name, $ext ) = split /\./, $_;
my @lines;
if ( $ext =~ /yml/ ) {
my $yaml = LoadFile("$dir/$requirelevel/$name\.$ext");
@lines = @{ $yaml->{'description'} };
} else {
open my $fh, "<:encoding(UTF-8)", "$dir/$requirelevel/$name.txt";
my $line = <$fh>;
$line = Encode::encode('UTF-8', $line) unless ( Encode::is_utf8($line) );
@lines = split /\n/, $line;
}
my $mandatory = ($requirelevel =~ /(mandatory|requi|oblig|necess)/i);
push @frameworklist,
{
@ -438,7 +445,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
@ -458,12 +465,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 {
my $yaml = LoadFile( $filename ); # Load YAML
for my $table ( @{ $yaml->{'tables'} } ) {
my $table_name = ( keys %$table )[0]; # table name
my @rows = @{ $table->{$table_name}->{rows} }; #
my @columns = ( sort keys %{$rows[0]} ); # column names
my $fields = join ",", @columns; # idem, joined
my $placeholders = join ",", map { "?" } @columns; # '?,..,?' string
my $query = "INSERT INTO $table_name ( $fields ) VALUES ( $placeholders )";
my $sth = $dbh->prepare($query);
foreach my $row ( @rows ) {
my @values = map { $row->{$_} } @columns;
$sth->execute( @values );
}
}
};
}
};
# errors thrown while loading installer data should be logged
if( $dup_stderr ) {

View File

@ -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');

View File

@ -1 +0,0 @@
Some basic default authorised values for library locations, item lost status, etc. You can change these at any time after installation.

View File

@ -0,0 +1,289 @@
---
#
# 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.
#
description:
- "Some basic default authorised values for library locations, item lost status, etc."
- "You can change these at any time after installation."
tables:
- authorised_values:
translatable: [ lib ]
rows:
# Reasons for acceptance or rejection of suggestions in acquisitions
- category: "SUGGEST"
authorised_value: "BSELL"
lib: "Bestseller"
- category: "SUGGEST"
authorised_value: "SCD"
lib: "Shelf Copy Damaged"
- category: "SUGGEST"
authorised_value: "LCL"
lib: "Library Copy Lost"
- category: "SUGGEST"
authorised_value: "AVILL"
lib: "Available via ILL"
- authorised_values:
translatable: [ lib, lib_opac ]
rows:
# 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"
- authorised_values :
translatable: [ lib ]
rows:
# availability statuses
- category: "LOST"
authorised_value: "2"
lib: "Long Overdue (Lost)"
- category: "LOST"
authorised_value: "1"
lib: "Lost"
- category: "LOST"
authorised_value: "3"
lib : "Lost and Paid For"
- category: "LOST"
authorised_value: "4"
lib : "Missing"
# damaged status of an item
- category: "DAMAGED"
authorised_value: "1"
lib: "Damaged"
# location qualification for an item,departments are linked by default to items.location
- category: "LOC"
authorised_value: "FIC"
lib: "Fiction"
- category: "LOC"
authorised_value: "CHILD"
lib: "Children's Area"
- category: "LOC"
authorised_value: "DISPLAY"
lib: "On Display"
- category: "LOC"
authorised_value: "NEW"
lib: "New Materials Shelf"
- category: "LOC"
authorised_value: "STAFF"
lib: "Staff Office"
- category: "LOC"
authorised_value: "GEN"
lib: "General Stacks"
- category: "LOC"
authorised_value: "AV"
lib: "Audio Visual"
- category: "LOC"
authorised_value: "REF"
lib: "Reference"
- category: "LOC"
authorised_value: "CART"
lib: "Book Cart"
- category: "LOC"
authorised_value: "PROC"
lib: "Processing Center"
# collection codes for an item
- category: "CCODE"
authorised_value: "FIC"
lib: "Fiction"
- category: "CCODE"
authorised_value: "REF"
lib: "Reference"
- category: "CCODE"
authorised_value: "NFIC"
lib: "Non-fiction"
# withdrawn status of an item,linked to items.withdrawn
- category: "WITHDRAWN"
authorised_value: "1"
lib: "Withdrawn"
# loanability status of an item,linked to items.notforloan
- category: "NOT_LOAN"
authorised_value: "-1"
lib: "Ordered"
- category: "NOT_LOAN"
authorised_value: "1"
lib: "Not For Loan"
- category: "NOT_LOAN"
authorised_value: "2"
lib: "Staff Collection"
# restricted status of an item,linked to items.restricted
- category: "RESTRICTED"
authorised_value: "1"
lib: "Restricted Access"
# custom borrower notes
- category: "BOR_NOTES"
authorised_value: "ADDR"
lib: "Address Notes"
- authorised_values:
translatable: [ lib, lib_opac ]
rows:
# 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"
- authorised_values:
translatable: [ lib ]
rows:
# Report groups
- category: "REPORT_GROUP"
authorised_value: "CIRC"
lib: "Circulation"
- category: "REPORT_GROUP"
authorised_value: "CAT"
lib: "Catalog"
- category: "REPORT_GROUP"
authorised_value: "PAT"
lib: "Patrons"
- category: "REPORT_GROUP"
authorised_value: "ACQ"
lib: "Acquisitions"
- category: "REPORT_GROUP"
authorised_value: "ACC"
lib: "Accounts"
- category: "REPORT_GROUP"
authorised_value: "SER"
lib: "Serials"
# SIP2 media types
- category: "SIP_MEDIA_TYPE"
authorised_value: "000"
lib: "Other"
- category: "SIP_MEDIA_TYPE"
authorised_value: "001"
lib: "Book"
- category: "SIP_MEDIA_TYPE"
authorised_value: "002"
lib: "Magazine"
- category: "SIP_MEDIA_TYPE"
authorised_value: "003"
lib: "Bound journal"
- category: "SIP_MEDIA_TYPE"
authorised_value: "004"
lib: "Audio tape"
- category: "SIP_MEDIA_TYPE"
authorised_value: "005"
lib: "Video tape"
- category: "SIP_MEDIA_TYPE"
authorised_value: "006"
lib: "CD/CDROM"
- category: "SIP_MEDIA_TYPE"
authorised_value: "007"
lib: "Diskette"
- category: "SIP_MEDIA_TYPE"
authorised_value: "008"
lib: "Book with diskette"
- category: "SIP_MEDIA_TYPE"
authorised_value: "009"
lib: "Book with CD"
- category: "SIP_MEDIA_TYPE"
authorised_value: "010"
lib: "Book with audio tape"
# order cancellation reasons
- category: "ORDER_CANCELLATION_REASON"
authorised_value: 0
lib: "No reason provided"
- category: "ORDER_CANCELLATION_REASON"
authorised_value: 1
lib: "Out of stock"
- category: "ORDER_CANCELLATION_REASON"
authorised_value: 2
lib: "Restocking"
# return claims
- category: "RETURN_CLAIM_RESOLUTION"
authorised_value: "RET_BY_PATRON"
lib: "Returned by patron"
- category: "RETURN_CLAIM_RESOLUTION"
authorised_value: "FOUND_IN_LIB"
lib: "Found in library"