Bug 23681: (QA follow-up) Proper handling of default option
authorMartin Renvoize <martin.renvoize@ptfs-europe.com>
Wed, 4 May 2022 11:36:17 +0000 (12:36 +0100)
committerTomas Cohen Arazi <tomascohen@theke.io>
Thu, 25 Aug 2022 11:41:06 +0000 (08:41 -0300)
This patch removes the 'can_be_added_manually' flag. Only non-system
restriction types can be added manually, so we exclude is_system instead
of having two flags. (And we set the 'Manual' that's added at install
time to default but not system).

We then add proper handling for setting the default manual restriction
type in the management page and set the dropdown list to use that value
by default.

Signed-off-by: Katrin Fischer <katrin.fischer@bsz-bw.de>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
Koha/RestrictionType.pm
admin/restrictions.pl
installer/data/mysql/atomicupdate/bug_23681.pl [changed mode: 0644->0755]
installer/data/mysql/en/mandatory/patron_restrictions.yml
installer/data/mysql/kohastructure.sql
koha-tmpl/intranet-tmpl/prog/en/includes/borrower_debarments.inc
koha-tmpl/intranet-tmpl/prog/en/modules/admin/restrictions.tt
t/db_dependent/RestrictionType.t
t/db_dependent/RestrictionTypes.t

index 4d43f20..d6f6690 100644 (file)
@@ -42,7 +42,7 @@ sub delete {
     my ( $self ) = @_;
 
     # Find out what the default is
-    my $default = Koha::RestrictionTypes->find({ default_value => 1 })->code;
+    my $default = Koha::RestrictionTypes->find({ is_default => 1 })->code;
     # Ensure we're not trying to delete a is_system type (this includes
     # the default type)
     return 0 if $self->is_system == 1;
@@ -63,6 +63,28 @@ sub delete {
     return 0;
 }
 
+=head3 make_default
+
+Set the current restriction type as the default for manual restrictions
+
+=cut
+
+sub make_default {
+    my ( $self ) = @_;
+
+    $self->_result->result_source->schema->txn_do(
+        sub {
+            my $types =
+              Koha::RestrictionTypes->search( { code => { '!=' => $self->code } } );
+            $types->update( { is_default => 0 } );
+            $self->set( { is_default => 1 } );
+            $self->SUPER::store;
+        }
+    );
+
+    return $self;
+}
+
 =head2 Internal methods
 
 =head3 type
index b41fd3f..6344e6a 100755 (executable)
@@ -53,7 +53,6 @@ if ( $op eq 'add_form') {
 } elsif ( $op eq 'add_validate' ) {
 
     my $display_text = $input->param('display_text');
-    my $can_be_added_manually = $input->param('can_be_added_manually') || 0;
     my $is_a_modif = $input->param("is_a_modif");
 
     if ($is_a_modif) {
@@ -68,9 +67,6 @@ if ( $op eq 'add_form') {
         } else {
             my $restriction = Koha::RestrictionTypes->find($code);
             $restriction->display_text($display_text);
-            unless ($restriction->is_system) {
-                $restriction->can_be_added_manually($can_be_added_manually);
-            }
             $restriction->store;
         }
     } else {
@@ -83,13 +79,16 @@ if ( $op eq 'add_form') {
         } else {
             my $restriction = Koha::RestrictionType->new({
                 code => $code,
-                display_text => $display_text,
-                can_be_added_manually => $can_be_added_manually
+                display_text => $display_text
             });
             $restriction->store;
         }
     }
     $op = 'list';
+} elsif ( $op eq 'make_default' ) {
+    my $restriction = Koha::RestrictionTypes->find($code);
+    $restriction->make_default;
+    $op = 'list';
 } elsif ( $op eq 'delete_confirm' ) {
     $template->param(
         restriction => scalar Koha::RestrictionTypes->find($code)
old mode 100644 (file)
new mode 100755 (executable)
index 375f5a1..422de18
@@ -12,18 +12,17 @@ return {
                 code varchar(50) NOT NULL PRIMARY KEY,
                 display_text text NOT NULL,
                 is_system tinyint(1) NOT NULL DEFAULT 0,
-                default_value tinyint(1) NOT NULL DEFAULT 0,
-                can_be_added_manually tinyint(1) NOT NULL DEFAULT 0
+                is_default tinyint(1) NOT NULL DEFAULT 0
             ) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
         });
         say $out "Added debarment_types table";
 
         $dbh->do(q{
-            INSERT IGNORE INTO debarment_types (code, display_text, is_system, default_value, can_be_added_manually) VALUES
-            ('MANUAL', 'Manual', 1, 1, 0),
-            ('OVERDUES', 'Overdues', 1, 0, 0),
-            ('SUSPENSION', 'Suspension', 1, 0, 0),
-            ('DISCHARGE', 'Discharge', 1, 0, 0);
+            INSERT IGNORE INTO debarment_types (code, display_text, is_system, is_default) VALUES
+            ('MANUAL', 'Manual', 0, 1),
+            ('OVERDUES', 'Overdues', 1, 0),
+            ('SUSPENSION', 'Suspension', 1, 0),
+            ('DISCHARGE', 'Discharge', 1, 0);
         });
         say $out "Added system debarment_types";
 
index 2621650..6348034 100644 (file)
@@ -27,24 +27,20 @@ tables:
       rows:
         - code: "MANUAL"
           display_text: "Manual"
-          is_system: 1
-          default: 1
-          can_be_added_manually: 0
+          is_system: 0
+          is_default: 1
 
         - code: "OVERDUES"
           display_text: "Overdues"
           is_system: 1
-          default: 0
-          can_be_added_manually: 0
+          is_default: 0
 
         - code: "SUSPENSION"
           display_text: "Suspension"
           is_system: 1
-          default: 0
-          can_be_added_manually: 0
+          is_default: 0
 
         - code: "DISCHARGE"
           display_text: "Discharge"
           is_system: 1
-          default: 0
-          can_be_added_manually: 0
+          is_default: 0
index d906d61..b19d86b 100644 (file)
@@ -2086,8 +2086,7 @@ CREATE TABLE debarment_types (
     code varchar(50) NOT NULL PRIMARY KEY,
     display_text text NOT NULL,
     is_system tinyint(1) NOT NULL DEFAULT 0,
-    default_value tinyint(1) NOT NULL DEFAULT 0,
-    can_be_added_manually tinyint(1) NOT NULL DEFAULT 0
+    is_default tinyint(1) NOT NULL DEFAULT 0
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
 --
index e5ff963..c70073d 100644 (file)
                         <label for="debarred_type">Type:</label>
                         <select name="debarred_type">
                             [% FOREACH code IN restriction_types.keys %]
-                                [% IF restriction_types.$code.can_be_added_manually %]
-                                    <option value="[% code | html %]">[% PROCESS restriction_type_description restriction=restriction_types.$code %]</option>
+                                [% IF !restriction_types.$code.is_system %]
+                                   [% IF restriction_types.$code.is_default %]
+                                   <option value="[% code | html %]" selected>[% PROCESS restriction_type_description restriction=restriction_types.$code %]</option>
+                                   [% ELSE %]
+                                   <option value="[% code | html %]">[% PROCESS restriction_type_description restriction=restriction_types.$code %]</option>
+                                   [% END %]
                                 [% END %]
                             [% END %]
                         </select>
index 4b9767e..a8dd141 100644 (file)
                         <input type="text" value="[% restriction.display_text | html %]" name="display_text" id="display_text" size="50" maxlength="50" class="required" required="required" />
                         <span class="required">Required</span>
                     </li>
-                    <li>
-                        <label for="can_be_added_manually">Can be manually added?</label>
-                        [% IF restriction && restriction.is_system %]
-                            [% IF restriction.can_be_added_manually %]Yes[% ELSE %]No[% END %]
-                        [% ELSIF restriction.can_be_added_manually %]
-                            <input type="checkbox" name="can_be_added_manually" id="can_be_added_manually" checked="checked" value="1" />
-                        [% ELSE %]
-                            <input type="checkbox" name="can_be_added_manually" id="can_be_added_manually" value="1" />
-                        [% END %]
-                    </li>
                 [% ELSE %]
                     <li>
                         <label for="code" class="required">Code: </label>
                         <input type="text" name="display_text" id="display_text" size="50" maxlength="50" class="required" required="required" />
                         <span class="required">Required</span>
                     </li>
-                    <li>
-                        <label for="can_be_added_manually">Can be manually added?</label>
-                        [% IF restriction && restriction.is_system %]
-                            [% IF restriction.can_be_added_manually %]Yes[% ELSE %]No[% END %]
-                        [% ELSIF restriction.can_be_added_manually %]
-                            <input type="checkbox" name="can_be_added_manually" id="can_be_added_manually" checked="checked" value="1" />
-                        [% ELSE %]
-                            <input type="checkbox" name="can_be_added_manually" id="can_be_added_manually" value="1" />
-                        [% END %]
-                    </li>
                 [% END %]
             </ol>
         </fieldset>
                 <tr>
                     <th scope="col">Code</th>
                     <th scope="col">Label</th>
-                    <th scope="col">Manual</th>
                     <th scope="col">Default</th>
                     <th scope="col">Actions</th>
                 </tr>
                             [% PROCESS restriction_type_description %]
                         </td>
                         <td>
-                            [% IF restriction.can_be_added_manually %]Yes[% END %]
-                        </td>
-                        <td>
-                            [% IF restriction.default_value %]Yes[% END %]
+                            [% IF restriction.is_default %]Yes[% END %]
                         </td>
                         <td class="actions">
                             <a class="btn btn-default btn-xs" href="/cgi-bin/koha/admin/restrictions.pl?op=add_form&amp;code=[% restriction.code | uri %]"><i class="fa fa-pencil"></i> Edit</a>
-                            [% IF !restriction.is_system %]
+                            [% IF !restriction.is_system && !restriction.is_default %]
                                 <a class="btn btn-default btn-xs" href="/cgi-bin/koha/admin/restrictions.pl?op=delete_confirm&amp;code=[% restriction.code | uri %]"><i class="fa fa-trash"></i> Delete</a>
                             [% END %]
+                            [% IF !restriction.is_system && !restriction.is_default %]
+                                <a class="btn btn-default btn-xs" href="/cgi-bin/koha/admin/restrictions.pl?op=make_default&amp;code=[% restriction.code | uri %]"><i class="fa fa-archive"></i> Make default</a>
+                            [% END %]
                         </td>
                     </tr>
                 [% END %]
index aea33a5..0e74c96 100755 (executable)
@@ -10,51 +10,55 @@ use Test::More tests => 3;
 
 my $schema = Koha::Database->new->schema;
 $schema->storage->txn_begin;
-my $dbh = C4::Context->dbh;
+my $dbh     = C4::Context->dbh;
 my $builder = t::lib::TestBuilder->new;
 
 use_ok('Koha::RestrictionType');
 use_ok('Koha::RestrictionTypes');
 
 $dbh->do(q|DELETE FROM borrower_debarments|);
-Koha::RestrictionTypes->search->delete;
+$dbh->do(q|DELETE FROM debarment_types|);
 
-$builder->build({
-    source => 'DebarmentType',
-    value  => {
-        code         => 'ONE',
-        display_text => 'One',
-        readonly     => 1,
-        is_system    => 0
+$builder->build(
+    {
+        source => 'DebarmentType',
+        value  => {
+            code         => 'ONE',
+            display_text => 'One',
+            is_system    => 1,
+            is_default   => 0
+        }
     }
-});
-$builder->build({
-    source => 'DebarmentType',
-    value  => {
-        code         => 'TWO',
-        display_text => 'Two',
-        readonly     => 1,
-        is_system    => 1
+);
+$builder->build(
+    {
+        source => 'DebarmentType',
+        value  => {
+            code         => 'TWO',
+            display_text => 'Two',
+            is_system    => 1,
+            is_default   => 1
+        }
     }
-});
+);
 
 # keyed_on_code
-my $keyed = Koha::RestrictionTypes->keyed_on_code;
+my $keyed     = Koha::RestrictionTypes->keyed_on_code;
 my $expecting = {
     ONE => {
         code         => 'ONE',
         display_text => 'One',
-        readonly     => 1,
-        is_system    => 0
+        is_system    => 1,
+        is_default   => 0
     },
     TWO => {
         code         => 'TWO',
         display_text => 'Two',
-        readonly     => 1,
-        is_system    => 1
+        is_system    => 1,
+        is_default   => 1
     }
 };
 
-is_deeply($keyed, $expecting, 'keyed_on_code returns correctly');
+is_deeply( $keyed, $expecting, 'keyed_on_code returns correctly' );
 
 $schema->storage->txn_rollback;
index 2c8b051..1b9f4e1 100755 (executable)
@@ -10,7 +10,7 @@ use Test::More tests => 6;
 
 my $schema = Koha::Database->new->schema;
 $schema->storage->txn_begin;
-my $dbh = C4::Context->dbh;
+my $dbh     = C4::Context->dbh;
 my $builder = t::lib::TestBuilder->new;
 
 use_ok('Koha::RestrictionType');
@@ -19,91 +19,102 @@ use_ok('Koha::RestrictionTypes');
 $dbh->do(q|DELETE FROM borrower_debarments|);
 $dbh->do(q|DELETE FROM debarment_types|);
 
-$builder->build({
-    source => 'DebarmentType',
-    value  => {
-        code         => 'ONE',
-        display_text => 'One',
-        is_system     => 1,
-        default_value    => 0,
-        can_be_added_manually => 0
+$builder->build(
+    {
+        source => 'DebarmentType',
+        value  => {
+            code         => 'ONE',
+            display_text => 'One',
+            is_system    => 1,
+            is_default   => 0,
+        }
     }
-});
-$builder->build({
-    source => 'DebarmentType',
-    value  => {
-        code         => 'TWO',
-        display_text => 'Two',
-        is_system     => 1,
-        default_value    => 1,
-        can_be_added_manually => 0
+);
+$builder->build(
+    {
+        source => 'DebarmentType',
+        value  => {
+            code         => 'TWO',
+            display_text => 'Two',
+            is_system    => 1,
+            is_default   => 1,
+        }
     }
-});
-$builder->build({
-    source => 'DebarmentType',
-    value  => {
-        code         => 'THREE',
-        display_text => 'Three',
-        is_system     => 1,
-        default_value    => 0,
-        can_be_added_manually => 0
+);
+$builder->build(
+    {
+        source => 'DebarmentType',
+        value  => {
+            code         => 'THREE',
+            display_text => 'Three',
+            is_system    => 1,
+            is_default   => 0,
+        }
     }
-});
-$builder->build({
-    source => 'DebarmentType',
-    value  => {
-        code         => 'FOUR',
-        display_text => 'Four',
-        is_system     => 0,
-        default_value    => 0,
-        can_be_added_manually => 0
+);
+$builder->build(
+    {
+        source => 'DebarmentType',
+        value  => {
+            code         => 'FOUR',
+            display_text => 'Four',
+            is_system    => 0,
+            is_default   => 0,
+        }
     }
-});
-$builder->build({
-    source => 'DebarmentType',
-    value  => {
-        code         => 'FIVE',
-        display_text => 'Five',
-        is_system     => 0,
-        default_value    => 0,
-        can_be_added_manually => 0
+);
+$builder->build(
+    {
+        source => 'DebarmentType',
+        value  => {
+            code         => 'FIVE',
+            display_text => 'Five',
+            is_system    => 0,
+            is_default   => 0,
+        }
     }
-});
+);
 
 # Can we create RestrictionTypes
-my $created = Koha::RestrictionTypes->find({ code => 'ONE' });
-ok( $created->display_text eq 'One', 'Restrictions created');
+my $created = Koha::RestrictionTypes->find( { code => 'ONE' } );
+ok( $created->display_text eq 'One', 'Restrictions created' );
 
 # Can we delete RestrictionTypes, when appropriate
-my $deleted = Koha::RestrictionTypes->find({ code => 'FOUR' })->delete;
-ok( $deleted, 'Restriction deleted');
-my $not_deleted = Koha::RestrictionTypes->find({ code => 'TWO' })->delete;
-ok( !$not_deleted, 'Read only restriction not deleted');
+my $deleted = Koha::RestrictionTypes->find( { code => 'FOUR' } )->delete;
+ok( $deleted, 'Restriction deleted' );
+my $not_deleted = Koha::RestrictionTypes->find( { code => 'TWO' } )->delete;
+ok( !$not_deleted, 'Read only restriction not deleted' );
 
 # Add a patron with a debarment
-my $library = $builder->build({ source => 'Branch' });
+my $library = $builder->build( { source => 'Branch' } );
 
-my $patron_category = $builder->build({ source => 'Category' });
-my $borrowernumber = Koha::Patron->new({
-    firstname =>  'my firstname',
-    surname => 'my surname',
-    categorycode => $patron_category->{categorycode},
-    branchcode => $library->{branchcode},
-})->store->borrowernumber;
+my $patron_category = $builder->build( { source => 'Category' } );
+my $borrowernumber  = Koha::Patron->new(
+    {
+        firstname    => 'my firstname',
+        surname      => 'my surname',
+        categorycode => $patron_category->{categorycode},
+        branchcode   => $library->{branchcode},
+    }
+)->store->borrowernumber;
 
-Koha::Patron::Debarments::AddDebarment({
-    borrowernumber => $borrowernumber,
-    expiration => '9999-06-10',
-    type => 'FIVE',
-    comment => 'Test 1',
-});
+Koha::Patron::Debarments::AddDebarment(
+    {
+        borrowernumber => $borrowernumber,
+        expiration     => '9999-06-10',
+        type           => 'FIVE',
+        comment        => 'Test 1',
+    }
+);
 
 # Now delete a code and check debarments using that code switch to
 # using the default
-my $to_delete = Koha::RestrictionTypes->find({ code => 'FIVE' })->delete;
-my $debarments = Koha::Patron::Debarments::GetDebarments({
-    borrowernumber => $borrowernumber
-});
+my $to_delete  = Koha::RestrictionTypes->find( { code => 'FIVE' } )->delete;
+my $debarments = Koha::Patron::Debarments::GetDebarments(
+    {
+        borrowernumber => $borrowernumber
+    }
+);
 is( $debarments->[0]->{type}, 'TWO', 'Debarments update with restrictions' );
 
 $schema->storage->txn_rollback;