Bug 11491: add option to supply field names in reports web service output
authorMark Tompsett <mtompset@hotmail.com>
Tue, 7 Jan 2014 19:39:46 +0000 (14:39 -0500)
committerGalen Charlton <gmc@esilibrary.com>
Fri, 31 Jan 2014 20:22:34 +0000 (20:22 +0000)
The staff and public catalog reports web services (/svc/report) return
JSON output, in particular an array contain an array for each row
of the report output.

This patch adds a URL parameter, annotated, which when supplied and
set to a value that evaluates to Perl true, will cause the output
to be emited as a JSON array of hashes, where each hash represents
a row of report output and the hash keys are the column names
or labels set in the report definition.

This patch also moves code around to make diffs between svc/report and
opac/svc/report smaller.

The suggestion to return an array of hashes was made by Chris Cormack.

TEST PLAN
---------
 1) Log into staff client
 2) Reports
 3) Used save reports
 4) Click the Action button on any report
     WITHOUT PARAMETERS.
    -- with parameters blows up in master and this.
 5) Click Edit
 6) Make the report public
 7) Update the SQL
 8) Note the ID number of the report
 9) Note the ID number of a non-public report
10) Make up a crazy ID number for a non-existant report
11) In a new tab (with the appropriate edits)
     https://OPAC/cgi-bin/koha/svc/report?id=# from step 8
    -- JSON data has arrays of field values.
     https://OPAC/cgi-bin/koha/svc/report?id=# from step 8&annotated=1
    -- JSON data has arrays of field values.
     https://OPAC/cgi-bin/koha/svc/report?id=# from step 9
    -- Software error: Sorry this report is not public
     https://OPAC/cgi-bin/koha/svc/report?id=# from step 9&annotated=1
    -- Software error: Sorry this report is not public
     https://OPAC/cgi-bin/koha/svc/report?id=# from step 10
    -- Software error: Sorry this report is not public
     https://OPAC/cgi-bin/koha/svc/report?id=# from step 10&annotated=1
    -- Software error: Sorry this report is not public
     https://STAFF/cgi-bin/koha/svc/report?id=# from step 8
    -- JSON data has arrays of field values.
     https://STAFF/cgi-bin/koha/svc/report?id=# from step 8&annotated=1
    -- JSON data has arrays of field values.
     https://STAFF/cgi-bin/koha/svc/report?id=# from step 9
    -- JSON data has arrays of field values.
     https://STAFF/cgi-bin/koha/svc/report?id=# from step 9&annotated=1
    -- JSON data has arrays of field values.
     https://STAFF/cgi-bin/koha/svc/report?id=# from step 10
    -- Software error: hash- or arrayref expected (not a simple scalar, use allow_nonref to allow this) at /usr/share/perl5/JSON.pm line 154.
     https://STAFF/cgi-bin/koha/svc/report?id=# from step 10&annotated=1
    -- Software error: hash- or arrayref expected (not a simple scalar, use allow_nonref to allow this) at /usr/share/perl5/JSON.pm line 154.

12) Apply the patch
13) ~/qa-test-tools/koha-qa.pl -v 2 -c 2
    -- There should be no problems. All OK.

14) In a new tab (with the appropriate edits)
     https://OPAC/cgi-bin/koha/svc/report?id=# from step 8
    -- JSON data has arrays of field values.
     https://OPAC/cgi-bin/koha/svc/report?id=# from step 8&annotated=1
    -- JSON data has arrays of hashes with field names as keys
     https://OPAC/cgi-bin/koha/svc/report?id=# from step 9
    -- Software error: Sorry this report is not public
     https://OPAC/cgi-bin/koha/svc/report?id=# from step 9&annotated=1
    -- Software error: Sorry this report is not public
     https://OPAC/cgi-bin/koha/svc/report?id=# from step 10
    -- Software error: There is no such report.
     https://OPAC/cgi-bin/koha/svc/report?id=# from step 10&annotated=1
    -- Software error: There is no such report.
     https://STAFF/cgi-bin/koha/svc/report?id=# from step 8
    -- JSON data has arrays of field values.
     https://STAFF/cgi-bin/koha/svc/report?id=# from step 8&annotated=1
    -- JSON data has arrays of hashes with field names as keys
     https://STAFF/cgi-bin/koha/svc/report?id=# from step 9
    -- JSON data has arrays of field values.
     https://STAFF/cgi-bin/koha/svc/report?id=# from step 9&annotated=1
    -- JSON data has arrays of hashes with field names as keys
     https://STAFF/cgi-bin/koha/svc/report?id=# from step 10
    -- Software error: There is no such report.
     https://STAFF/cgi-bin/koha/svc/report?id=# from step 10&annotated=1
    -- Software error: There is no such report.

Signed-off-by: Holger Meißner <h.meissner.82@web.de>
Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Galen Charlton <gmc@esilibrary.com>
opac/svc/report
svc/report

index 38cbd42..f6cd6b9 100755 (executable)
@@ -30,10 +30,12 @@ use Koha::Cache;
 my $query  = CGI->new();
 my $report_id = $query->param('id');
 my $report_name = $query->param('name');
+my $report_annotation = $query->param('annotated');
 
 my $report_rec = get_saved_report( $report_name ? { 'name' => $report_name } : { 'id' => $report_id } );
-die "Sorry this report is not public\n" unless $report_rec->{public};
+if (!$report_rec) { die "There is no such report.\n"; }
 
+die "Sorry this report is not public\n" unless $report_rec->{public};
 
 my $cache_active = Koha::Cache->is_cache_active;
 my ($cache_key, $cache, $json_text);
@@ -48,7 +50,13 @@ unless ($json_text) {
     my $limit  = C4::Context->preference("SvcMaxReportRows") || 10;
     my ( $sth, $errors ) = execute_query( $report_rec->{savedsql}, $offset, $limit );
     if ($sth) {
-        my $lines     = $sth->fetchall_arrayref;
+        my $lines;
+        if ($report_annotation) {
+            $lines = $sth->fetchall_arrayref({});
+        }
+        else {
+            $lines = $sth->fetchall_arrayref;
+        }
         $json_text = to_json($lines);
 
         if ($cache_active) {
index 654ef15..41ea125 100755 (executable)
@@ -32,6 +32,10 @@ use Koha::Cache;
 my $query  = CGI->new();
 my $report_id = $query->param('id');
 my $report_name = $query->param('name');
+my $report_annotation = $query->param('annotated');
+
+my $report_rec = get_saved_report( $report_name ? { 'name' => $report_name } : { 'id' => $report_id } );
+if (!$report_rec) { die "There is no such report.\n"; }
 
 my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
     {
@@ -52,12 +56,17 @@ if ($cache_active) {
 }
 
 unless ($json_text) {
-    my $report_rec = get_saved_report($report_name ? { 'name' => $report_name } : { 'id' => $report_id });
     my $offset = 0;
     my $limit  = C4::Context->preference("SvcMaxReportRows") || 10;
     my ( $sth, $errors ) = execute_query( $report_rec->{savedsql}, $offset, $limit );
     if ($sth) {
-        my $lines     = $sth->fetchall_arrayref;
+        my $lines;
+        if ($report_annotation) {
+            $lines = $sth->fetchall_arrayref({});
+        }
+        else {
+            $lines = $sth->fetchall_arrayref;
+        }
         $json_text = to_json($lines);
 
         if ($cache_active) {