[Koha-patches] [PATCH] Bug 3756 Difference between original and local sysprefs
Frédéric Demians
f.demians at tamil.fr
Tue Jul 13 20:49:25 CEST 2010
Amend Chris N. patch in order to display local sysprefs as the
difference between DB sysprefs and .pref files sysprefs.
As a side effect, local sysprefs editor displays also deprecated
sysprefs which is a feature from my point of view. For example,
GranularPermissions is displayed as a local syspref because it has been
removed recently from admin.pref but hasn't been yet removed from DB
(could be done later with a DB update).
---
admin/systempreferences.pl | 90 +++++++++++++++++++++++++++++++++++++++++--
1 files changed, 85 insertions(+), 5 deletions(-)
diff --git a/admin/systempreferences.pl b/admin/systempreferences.pl
index 9191ecf..24d83d9 100755
--- a/admin/systempreferences.pl
+++ b/admin/systempreferences.pl
@@ -52,6 +52,8 @@ use C4::Languages qw(getTranslatedLanguages);
use C4::ClassSource;
use C4::Log;
use C4::Output;
+use YAML::Syck qw( Dump LoadFile );
+
# use Smart::Comments;
@@ -458,12 +460,14 @@ sub StringSearch {
ORDER BY VARIABLE" );
$sth->execute( "%$searchstring%", "%$searchstring%" );
} else {
- my $strsth = "Select variable,value,explanation,type,options from systempreferences where variable not in (";
- foreach my $syspref ( keys %tabsysprefs ) {
- $strsth .= $dbh->quote($syspref) . ",";
+ my $strsth = "Select variable,value,explanation,type,options from systempreferences where variable in (";
+ my $first = 1;
+ for my $name ( get_local_prefs() ) {
+ $strsth .= ',' unless $first;
+ $strsth .= "'$name'";
+ $first = 0;
}
- $strsth =~ s/,$/) /;
- $strsth .= " order by variable";
+ $strsth .= ") order by variable";
$sth = $dbh->prepare($strsth);
$sth->execute();
}
@@ -810,3 +814,79 @@ if ( $op eq 'add_form' ) {
$template->param( tab => $tab, );
} #---- END $OP eq DEFAULT
output_html_with_http_headers $input, $cookie, $template->output;
+
+
+# Return an array containing all preferences defined in current Koha instance
+# .pref files.
+
+sub get_prefs_from_files {
+ my $context = C4::Context->new();
+ my $path_pref_en = $context->config('intrahtdocs') .
+ '/prog/en/modules/admin/preferences';
+ # Get all .pref file names
+ opendir ( my $fh, $path_pref_en );
+ my @pref_files = grep { /.pref/ } readdir($fh);
+ close $fh;
+
+ my @names = ();
+ my $append = sub {
+ my $prefs = shift;
+ for my $pref ( @$prefs ) {
+ for my $element ( @$pref ) {
+ if ( ref( $element) eq 'HASH' ) {
+ my $name = $element->{pref};
+ next unless $name;
+ push @names, $name;
+ last;
+ }
+ }
+ }
+ };
+ for my $file (@pref_files) {
+ my $pref = LoadFile( "$path_pref_en/$file" );
+ for my $tab ( keys %$pref ) {
+ my $content = $pref->{$tab};
+ if ( ref($content) eq 'ARRAY' ) {
+ $append->($content);
+ next;
+ }
+ for my $section ( keys %$content ) {
+ my $syspref = $content->{$section};
+ $append->($syspref);
+ }
+ }
+ }
+ return @names;
+}
+
+
+# Return an array containg all preferences defined in DB
+
+sub get_prefs_from_db {
+ my $dbh = C4::Context->dbh;
+ my $sth = $dbh->prepare("SELECT variable FROM systempreferences");
+ $sth->execute;
+ my @names = ();
+ while ( (my $name) = $sth->fetchrow_array ) {
+ push @names, $name if $name;
+ }
+ return @names;
+}
+
+
+# Return an array containing all local preferences: those which are defined in
+# DB and not defined in Koha .pref files.
+
+sub get_local_prefs {
+ my @prefs_file = get_prefs_from_files();
+ my @prefs_db = get_prefs_from_db();
+
+ my %prefs_file = map { $_ => 1 } @prefs_file;
+ my @names = ();
+ foreach my $name (@prefs_db) {
+ push @names, $name unless $prefs_file{$name};
+ }
+
+ return @names;
+}
+
--
1.7.1
More information about the Koha-patches
mailing list