[3/40] Work on C4::Labels::Profile module and tests
authorChris Nighswonger <cnighswonger@foundations.edu>
Wed, 1 Jul 2009 04:00:22 +0000 (00:00 -0400)
committerChris Nighswonger <cnighswonger@foundations.edu>
Tue, 1 Sep 2009 19:47:52 +0000 (15:47 -0400)
C4/Labels/Profile.pm [new file with mode: 0644]
t/db_dependent/t_Profile.t [new file with mode: 0644]

diff --git a/C4/Labels/Profile.pm b/C4/Labels/Profile.pm
new file mode 100644 (file)
index 0000000..157ba0f
--- /dev/null
@@ -0,0 +1,328 @@
+package C4::Labels::Profile;
+
+# Copyright 2009 Foundations Bible College.
+#
+# 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., 59 Temple Place,
+# Suite 330, Boston, MA  02111-1307 USA
+
+use strict;
+use warnings;
+use Sys::Syslog qw(syslog);
+use Data::Dumper;
+
+use C4::Context;
+use C4::Debug;
+
+BEGIN {
+    use version; our $VERSION = qv('1.0.0_1');
+}
+
+my $unit_values = {
+    POINT       => 1,
+    INCH        => 72,
+    MM          => 2.83464567,
+    CM          => 28.3464567,
+};
+
+sub _check_params {
+    my $given_params = {};
+    my $exit_code = 0;
+    my @valid_profile_params = (
+        'printer_name',
+        'tmpl_id',
+        'paper_bin',
+        'offset_horz',
+        'offset_vert',
+        'creep_horz',
+        'creep_vert',
+        'unit',
+    );
+    if (scalar(@_) >1) {
+        $given_params = {@_};
+        foreach my $key (keys %{$given_params}) {
+            if (!(grep m/$key/, @valid_profile_params)) {
+                syslog("LOG_ERR", "C4::Labels::Profile : Unrecognized parameter type of \"%s\".", $key);
+                $exit_code = 1;
+            }
+        }
+    }
+    else {
+        if (!(grep m/$_/, @valid_profile_params)) {
+            syslog("LOG_ERR", "C4::Labels::Profile : Unrecognized parameter type of \"%s\".", $_);
+            $exit_code = 1;
+        }
+    }
+    return $exit_code;
+}
+
+sub _conv_points {
+    my $self = shift;
+    $self->{offset_horz}        = $self->{offset_horz} * $unit_values->{$self->{unit}};
+    $self->{offset_vert}        = $self->{offset_vert} * $unit_values->{$self->{unit}};
+    $self->{creep_horz}         = $self->{creep_horz} * $unit_values->{$self->{unit}};
+    $self->{creep_vert}         = $self->{creep_vert} * $unit_values->{$self->{unit}};
+    return $self;
+}
+
+=head1 NAME
+
+C4::Labels::Profile - A class for creating and manipulating profile objects in Koha
+
+=cut
+
+=head1 METHODS
+
+=head2 C4::Labels::Profile->new()
+
+    Invoking the I<new> method constructs a new profile object containing the default values for a template.
+
+    example:
+        my $profile = Profile->new(); # Creates and returns a new profile object
+
+    B<NOTE:> This profile is I<not> written to the database untill $profile->save() is invoked. You have been warned!
+
+=cut
+
+sub new {
+    my $invocant = shift;
+    if (_check_params(@_) eq 1) {
+        return 1;
+    }
+    my $type = ref($invocant) || $invocant;
+    my $self = {
+        printer_name    => '',
+        tmpl_id         => '',
+        paper_bin       => '',
+        offset_horz     => 0,
+        offset_vert     => 0,
+        creep_horz      => 0,
+        creep_vert      => 0,
+        unit            => 'POINT',
+        @_,
+    };
+    bless ($self, $type);
+    return $self;
+}
+
+=head2 C4::Labels::Profile->retrieve(profile_id => profile_id, convert => 1)
+
+    Invoking the I<retrieve> method constructs a new profile object containing the current values for profile_id. The method returns
+    a new object upon success and 1 upon failure. Errors are logged to the syslog. One further option maybe accessed. See the examples
+    below for further description.
+
+    examples:
+
+        my $profile = C4::Labels::Profile->retrieve(profile_id => 1); # Retrieves profile record 1 and returns an object containing the record
+
+        my $profile = C4::Labels::Profile->retrieve(profile_id => 1, convert => 1); # Retrieves profile record 1, converts the units to points,
+        and returns an object containing the record
+
+=cut
+
+sub retrieve {
+    my $invocant = shift;
+    my %opts = @_;
+    my $type = ref($invocant) || $invocant;
+    my $query = "SELECT * FROM printers_profile WHERE prof_id = ?";  
+    my $sth = C4::Context->dbh->prepare($query);
+    $sth->execute($opts{profile_id});
+    if ($sth->err) {
+        syslog("LOG_ERR", "Database returned the following error: %s", $sth->errstr);
+        return 1;
+    }
+    my $self = $sth->fetchrow_hashref;
+    $self = _conv_points($self) if ($opts{convert} && $opts{convert} == 1);
+    bless ($self, $type);
+    return $self;
+}
+
+=head2 C4::Labels::Profile->delete(prof_id => profile_id) |  $profile->delete()
+
+    Invoking the delete method attempts to delete the profile from the database. The method returns 0 upon success
+    and 1 upon failure. Errors are logged to the syslog.
+
+    examples:
+        my $exitstat = $profile->delete(); # to delete the record behind the $profile object
+        my $exitstat = C4::Labels::Profile->delete(prof_id => 1); # to delete profile record 1
+
+=cut
+
+sub delete {
+    my $self = shift;
+    if (!$self->{'prof_id'}) {   # If there is no profile prof_id then we cannot delete it
+        syslog("LOG_ERR", "Cannot delete profile as it has not been saved.");
+        return 1;
+    }
+    my $query = "DELETE FROM printers_profile WHERE prof_id = ?";  
+    my $sth = C4::Context->dbh->prepare($query);
+    $sth->execute($self->{'prof_id'});
+    return 0;
+}
+
+=head2 $profile->save()
+
+    Invoking the I<save> method attempts to insert the profile into the database if the profile is new and
+    update the existing profile record if the profile exists. The method returns the new record prof_id upon
+    success and -1 upon failure (This avoids conflicting with a record prof_id of 1). Errors are logged to the syslog.
+
+    example:
+        my $exitstat = $profile->save(); # to save the record behind the $profile object
+
+=cut
+
+sub save {
+    my $self = shift;
+    if ($self->{'prof_id'}) {        # if we have an prof_id, the record exists and needs UPDATE
+        my @params;
+        my $query = "UPDATE printers_profile SET ";
+        foreach my $key (keys %{$self}) {
+            next if $key eq 'prof_id';
+            push (@params, $self->{$key});
+            $query .= "$key=?, ";
+        }
+        $query = substr($query, 0, (length($query)-2));
+        push (@params, $self->{'prof_id'});
+        $query .= " WHERE prof_id=?;";
+        warn "DEBUG: Updating: $query\n" if $debug;
+        my $sth = C4::Context->dbh->prepare($query);
+        $sth->execute(@params);
+        if ($sth->err) {
+            syslog("LOG_ERR", "C4::Labels::Profile : Database returned the following error: %s", $sth->errstr);
+            return -1;
+        }
+        return $self->{'prof_id'};
+    }
+    else {                      # otherwise create a new record
+        my @params;
+        my $query = "INSERT INTO printers_profile (";
+        foreach my $key (keys %{$self}) {
+            push (@params, $self->{$key});
+            $query .= "$key, ";
+        }
+        $query = substr($query, 0, (length($query)-2));
+        $query .= ") VALUES (";
+        for (my $i=1; $i<=(scalar keys %$self); $i++) {
+            $query .= "?,";
+        }
+        $query = substr($query, 0, (length($query)-1));
+        $query .= ");";
+        warn "DEBUG: Saving: $query\n" if $debug;
+        my $sth = C4::Context->dbh->prepare($query);
+        $sth->execute(@params);
+        if ($sth->err) {
+            syslog("LOG_ERR", "C4::Labels::Profile : Database returned the following error: %s", $sth->errstr);
+            return -1;
+        }
+        my $sth1 = C4::Context->dbh->prepare("SELECT MAX(prof_id) FROM printers_profile;");
+        $sth1->execute();
+        my $tmpl_id = $sth1->fetchrow_array;
+        return $tmpl_id;
+    }
+}
+
+=head2 $profile->get_attr(attr)
+
+    Invoking the I<get_attr> method will return the value of the requested attribute or 1 on errors.
+
+    example:
+        my $value = $profile->get_attr(attr);
+
+=cut
+
+sub get_attr {
+    my $self = shift;
+    if (_check_params(@_) eq 1) {
+        return 1;
+    }
+    my ($attr) = @_;
+    if (exists($self->{$attr})) {
+        return $self->{$attr};
+    }
+    else {
+        syslog("LOG_ERR", "C4::Labels::Profile : %s is currently undefined.", $attr);
+        return 1;
+    }
+}
+
+=head2 $profile->set_attr(attr => value)
+
+    Invoking the I<set_attr> method will set the value of the supplied attribute to the supplied value.
+
+    example:
+        $profile->set_attr(attr => value);
+
+=cut
+
+sub set_attr {
+    my $self = shift;
+    if (_check_params(@_) eq 1) {
+        return 1;
+    }
+    my ($attr, $value) = @_;
+    $self->{$attr} = $value;
+    return 0;
+}
+
+
+1;
+__END__
+
+=head1 AUTHOR
+
+Chris Nighswonger <cnighswonger AT foundations DOT edu>
+
+=cut
+
+
+=head1
+drawbox( ($left_margin), ($top_margin), ($page_width-(2*$left_margin)), ($page_height-(2*$top_margin)) ); # FIXME: Breakout code to print alignment page for printer profile setup
+
+ead2 draw_boundaries
+
+ sub draw_boundaries ($llx_spine, $llx_circ1, $llx_circ2,
+                $lly, $spine_width, $label_height, $circ_width)  
+
+This sub draws boundary lines where the label outlines are, to aid in printer testing, and debugging.
+
+=cut
+
+#       FIXME: Template use for profile adjustment...
+#sub draw_boundaries {
+#
+#    my (
+#        $llx_spine, $llx_circ1,  $llx_circ2, $lly,
+#        $spine_width, $label_height, $circ_width
+#    ) = @_;
+#
+#    my $lly_initial = ( ( 792 - 36 ) - 90 );
+#    $lly            = $lly_initial; # FIXME - why are we ignoring the y_pos parameter by redefining it?
+#    my $i             = 1;
+#
+#    for ( $i = 1 ; $i <= 8 ; $i++ ) {
+#
+#        _draw_box( $llx_spine, $lly, ($spine_width), ($label_height) );
+#
+#   #warn "OLD BOXES  x=$llx_spine, y=$lly, w=$spine_width, h=$label_height";
+#        _draw_box( $llx_circ1, $lly, ($circ_width), ($label_height) );
+#        _draw_box( $llx_circ2, $lly, ($circ_width), ($label_height) );
+#
+#        $lly = ( $lly - $label_height );
+#
+#    }
+#}
+
+
+
+=cut
diff --git a/t/db_dependent/t_Profile.t b/t/db_dependent/t_Profile.t
new file mode 100644 (file)
index 0000000..7e8f202
--- /dev/null
@@ -0,0 +1,112 @@
+#!/usr/bin/perl
+#
+# Copyright 2007 Foundations Bible College.
+#
+# 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., 59 Temple Place,
+# Suite 330, Boston, MA  02111-1307 USA
+
+use strict;
+use warnings;
+
+use Test::More tests => 28;
+use C4::Context;
+use Data::Dumper;
+
+BEGIN {
+    use_ok('C4::Labels::Profile');
+}
+
+my $default_profile = {
+    printer_name    => 'Circulation Desk',
+    tmpl_id         => '',
+    paper_bin       => 'bypass',
+    offset_horz     => 0,
+    offset_vert     => 0,
+    creep_horz      => 0,
+    creep_vert      => 0,
+    unit            => 'POINT',
+};
+
+my $err = 0;
+
+diag "Testing new template object creation.";
+ok(my $profile = C4::Labels::Profile->new(printer_name => 'Circulation Desk',paper_bin => 'bypass'), "Object created");
+is_deeply($profile, $default_profile, "Object verified");
+
+diag "Testing get_attr method.";
+foreach my $key (keys %{$default_profile}) {
+    ok($default_profile->{$key} eq $profile->get_attr($key), "Got $key attribute.");
+}
+
+diag "Testing set_attr method.";
+my $new_attr = {
+    printer_name    => 'Cataloging Desk',
+    tmpl_id         => '1',
+    paper_bin       => 'tray 1',
+    offset_horz     => 0.3,
+    offset_vert     => 0.85,
+    creep_horz      => 0.156,
+    creep_vert      => 0.67,
+    unit            => 'INCH',
+};
+
+foreach my $key (keys %{$new_attr}) {
+    $err = $profile->set_attr($key, $new_attr->{$key});
+    ok(($new_attr->{$key} eq $profile->get_attr($key)) && ($err lt 1), "$key attribute is now set to " . $new_attr->{$key});
+}
+
+diag "Testing save method by saving a new record.";
+
+my $sav_results = $profile->save();
+ok($sav_results ne -1, "Record number $sav_results  saved.") || diag "Error encountered during save. See syslog for details.";
+
+my $saved_profile;
+if ($sav_results ne -1) {
+    diag "Testing get method.";
+    $new_attr->{'prof_id'} = $sav_results;
+    $saved_profile = C4::Labels::Profile->retrieve($sav_results);
+    is_deeply($saved_profile, $new_attr, "Get method verified.");
+}
+
+diag "Testing conv_points method.";
+
+$saved_profile->conv_points();
+my $expect_conv = {
+    offset_horz => 21.6,
+    offset_vert => 61.2,
+    creep_horz  => 11.232,
+    creep_vert  => 48.24,
+};
+
+foreach my $key (keys %{$expect_conv}) {
+    ok($expect_conv->{$key} eq $saved_profile->get_attr($key), "$key converted correctly.") || diag "Expected " . $expect_conv->{$key} . " but got " . $saved_profile->get_attr($key) . ".";
+}
+
+
+diag "Testing save method by updating a record.";
+
+$err = 0; # Reset error code
+$err = $saved_profile->set_attr(unit => 'CM');
+my $upd_results = $saved_profile->save();
+ok(($upd_results ne -1) && ($err lt 1), "Record number $upd_results updated.") || diag "Error encountered during update. See syslog for details.";
+my $updated_profile = C4::Labels::Profile->retrieve($sav_results);
+is_deeply($updated_profile, $saved_profile, "Update verified.");
+
+#diag "Testing conv_points method.";
+
+diag "Testing delete method.";
+
+my $del_results = $updated_profile->delete();
+ok($del_results eq 0, "Profile deleted.") || diag "Incorrect or non-existent record id. See syslog for details.";