View | Details | Raw Unified | Return to bug 20956
Collapse All | Expand All

(-)a/Koha/Patron.pm (-1 / +58 lines)
Lines 27-33 use Try::Tiny; Link Here
27
use DateTime ();
27
use DateTime ();
28
use C4::Log  qw( logaction );
28
use C4::Log  qw( logaction );
29
29
30
use C4::Auth qw( checkpw_hash );
30
use C4::Auth qw( checkpw_hash get_user_subpermissions );
31
use C4::Context;
31
use C4::Context;
32
use C4::Letters qw( GetPreparedLetter EnqueueLetter SendQueuedMessages );
32
use C4::Letters qw( GetPreparedLetter EnqueueLetter SendQueuedMessages );
33
use C4::Log     qw( logaction );
33
use C4::Log     qw( logaction );
Lines 3434-3439 sub is_anonymous { Link Here
3434
    return ( $anonymous_patron && $self->borrowernumber eq $anonymous_patron ) ? 1 : 0;
3434
    return ( $anonymous_patron && $self->borrowernumber eq $anonymous_patron ) ? 1 : 0;
3435
}
3435
}
3436
3436
3437
=head3 get_permissions
3438
3439
my $flags = $patron->get_permissons
3440
3441
Returns a structure such as:
3442
{
3443
  "permissions": 1,
3444
  "borrowers": 1,
3445
  "circulate": {
3446
    "manage_curbside_pickups": 1,
3447
    "overdues_report": 1,
3448
    "override_renewals": 1,
3449
    "manage_restrictions": 1,
3450
    "manage_checkout_notes": 1,
3451
    "manage_bookings": 1
3452
  },
3453
  "catalogue": 1,
3454
  "reserveforothers": {
3455
    "place_holds": 1,
3456
    "modify_holds_priority": 1
3457
  }
3458
}
3459
where a 1 indicates full permissions and a hash indicates
3460
partial permissions with the given permissions as hash keys
3461
3462
=cut
3463
3464
sub permissions {
3465
    my ($self) = @_;
3466
3467
    my $dbh = C4::Context->dbh;
3468
    my $sth = $dbh->prepare("SELECT bit, flag FROM userflags ORDER BY bit");
3469
    $sth->execute();
3470
    my $userflags = { map { $_->[0] => $_->[1] } @{ $sth->fetchall_arrayref() } };
3471
3472
    my $flags = $self->flags // 0;
3473
3474
    my $active_flags = {};
3475
3476
    foreach my $bit ( keys %$userflags ) {
3477
        if ( $flags & ( 1 << $bit ) ) {
3478
            my $flag = $userflags->{$bit};
3479
            $active_flags->{$flag} = 1;
3480
        }
3481
    }
3482
3483
    my $user_perms = get_user_subpermissions( $self->userid );
3484
3485
    for my $module ( keys %$user_perms ) {
3486
        for my $code ( keys %{ $user_perms->{$module} } ) {
3487
            $active_flags->{$module}->{$code} = 1;
3488
        }
3489
    }
3490
3491
    return $active_flags;
3492
}
3493
3437
=head2 Internal methods
3494
=head2 Internal methods
3438
3495
3439
=head3 _type
3496
=head3 _type
(-)a/members/member-flags.pl (-42 / +7 lines)
Lines 70-88 if ( $op eq 'cud-newflags' ) { Link Here
70
70
71
    # construct flags
71
    # construct flags
72
    my $module_flags = 0;
72
    my $module_flags = 0;
73
    my $sth          = $dbh->prepare("SELECT bit,flag,flagdesc FROM userflags ORDER BY bit");
73
    my $sth          = $dbh->prepare("SELECT bit,flag FROM userflags ORDER BY bit");
74
    $sth->execute();
74
    $sth->execute();
75
    my %userflags;
75
    while ( my ( $bit, $flag ) = $sth->fetchrow_array ) {
76
    while ( my ( $bit, $flag, $flagdesc ) = $sth->fetchrow_array ) {
77
        if ( exists $all_module_perms{$flag} ) {
76
        if ( exists $all_module_perms{$flag} ) {
78
            $module_flags += 2**$bit;
77
            $module_flags += 2**$bit;
79
        }
78
        }
80
        $userflags{$bit} = [ $flag, $flagdesc ];
81
    }
79
    }
82
80
81
    my $permissions_before = $patron->permissions();
82
83
    $sth = $dbh->prepare("UPDATE borrowers SET flags=? WHERE borrowernumber=?");
83
    $sth = $dbh->prepare("UPDATE borrowers SET flags=? WHERE borrowernumber=?");
84
    my $old_flags          = $patron->flags // 0;
84
    my $old_flags = $patron->flags // 0;
85
    my %permissions_before = get_permissions( \%userflags, $old_flags );
86
    if ( ( $old_flags == 1 || $module_flags == 1 )
85
    if ( ( $old_flags == 1 || $module_flags == 1 )
87
        && $old_flags != $module_flags )
86
        && $old_flags != $module_flags )
88
    {
87
    {
Lines 109-116 if ( $op eq 'cud-newflags' ) { Link Here
109
        }
108
        }
110
    }
109
    }
111
110
112
    my %permissions_after = get_permissions( \%userflags, $module_flags );
111
    my $permissions_after = $patron->get_from_storage->permissions();
113
    logaction( 'MEMBERS', 'MODIFY', $member, \%permissions_after, undef, \%permissions_before );
112
    logaction( 'MEMBERS', 'MODIFY', $member, $permissions_after, undef, $permissions_before );
114
    print $input->redirect("/cgi-bin/koha/members/moremember.pl?borrowernumber=$member");
113
    print $input->redirect("/cgi-bin/koha/members/moremember.pl?borrowernumber=$member");
115
} else {
114
} else {
116
115
Lines 204-241 if ( $op eq 'cud-newflags' ) { Link Here
204
    );
203
    );
205
204
206
    output_html_with_http_headers $input, $cookie, $template->output;
205
    output_html_with_http_headers $input, $cookie, $template->output;
207
208
}
209
210
sub get_permissions {
211
    my ( $userflags, $old_flags ) = @_;
212
213
    my %active_flag = decode_flags( $userflags, $old_flags );
214
    my $user_perms  = get_user_subpermissions( $bor->{'userid'} );
215
    my %permissions;
216
    my $dbh = C4::Context->dbh();
217
    my $sth = $dbh->prepare("SELECT code, description FROM permissions");
218
    $sth->execute();
219
220
    while ( my ( $code, $desc ) = $sth->fetchrow_array ) {
221
        $permissions{$code} = $desc;
222
    }
223
    for my $module ( keys %$user_perms ) {
224
        for my $code ( keys %{ $user_perms->{$module} } ) {
225
            $active_flag{$code} = $permissions{$code};
226
        }
227
    }
228
    return %active_flag;
229
}
230
231
sub decode_flags {
232
    my ( $userflags, $flags ) = @_;
233
    my %active_flags;
234
    foreach my $bit ( keys %$userflags ) {
235
        if ( $flags & ( 2**$bit ) ) {
236
            my ( $flag, $desc ) = @{ $userflags->{$bit} };
237
            $active_flags{$flag} = $desc;
238
        }
239
    }
240
    return %active_flags;
241
}
206
}
(-)a/t/db_dependent/Koha/Patron.t (-2 / +23 lines)
Lines 19-25 Link Here
19
19
20
use Modern::Perl;
20
use Modern::Perl;
21
21
22
use Test::More tests => 42;
22
use Test::More tests => 43;
23
use Test::NoWarnings;
23
use Test::NoWarnings;
24
use Test::Exception;
24
use Test::Exception;
25
use Test::Warn;
25
use Test::Warn;
Lines 806-811 subtest 'is_superlibrarian() tests' => sub { Link Here
806
    $schema->storage->txn_rollback;
806
    $schema->storage->txn_rollback;
807
};
807
};
808
808
809
subtest 'is_superlibrarian() tests' => sub {
810
811
    plan tests => 2;
812
813
    $schema->storage->txn_begin;
814
815
    my $patron = $builder->build_object(
816
        {
817
            class => 'Koha::Patrons',
818
819
            value => { flags => 4 }
820
        }
821
    );
822
823
    my %permissions = $patron->permissions;
824
825
    is( scalar keys %permissions, 1, "Patron has one module permission" );
826
    is( $permissions{catalogue},  1, "Patron has catalogue permission" );
827
828
    $schema->storage->txn_rollback;
829
};
830
809
subtest 'extended_attributes' => sub {
831
subtest 'extended_attributes' => sub {
810
832
811
    plan tests => 16;
833
    plan tests => 16;
812
- 

Return to bug 20956