[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