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

(-)a/Koha/Patron.pm (+15 lines)
Lines 1908-1913 sub queue_notice { Link Here
1908
    return \%return;
1908
    return \%return;
1909
}
1909
}
1910
1910
1911
=head3 can_patron_change_staff_only_lists
1912
1913
$patron->can_patron_change_staff_only_lists;
1914
1915
Return 1 if a patron has 'Superlibrarian' or 'Catalogue' permission.
1916
Otherwise, return 0.
1917
1918
=cut
1919
1920
sub can_patron_change_staff_only_lists {
1921
    my ( $self, $params ) = @_;
1922
    return 1 if C4::Auth::haspermission( $self->userid, { 'catalogue' => 1 });
1923
    return 0;
1924
}
1925
1911
=head2 Internal methods
1926
=head2 Internal methods
1912
1927
1913
=head3 _type
1928
=head3 _type
(-)a/Koha/Virtualshelf.pm (-4 / +6 lines)
Lines 63-68 sub store { Link Here
63
        unless defined $self->allow_change_from_owner;
63
        unless defined $self->allow_change_from_owner;
64
    $self->allow_change_from_others( 0 )
64
    $self->allow_change_from_others( 0 )
65
        unless defined $self->allow_change_from_others;
65
        unless defined $self->allow_change_from_others;
66
    $self->allow_change_from_staff( 0 )
67
        unless defined $self->allow_change_from_staff;
66
68
67
    $self->created_on( dt_from_string )
69
    $self->created_on( dt_from_string )
68
        unless defined $self->created_on;
70
        unless defined $self->created_on;
Lines 184-190 sub add_biblio { Link Here
184
    return if $already_exists;
186
    return if $already_exists;
185
187
186
    # Check permissions
188
    # Check permissions
187
    return unless ( $self->owner == $borrowernumber && $self->allow_change_from_owner ) || $self->allow_change_from_others;
189
    return unless ( $self->owner == $borrowernumber && $self->allow_change_from_owner ) || ( $self->allow_change_from_staff && Koha::Patrons->find( $borrowernumber )->can_patron_change_staff_only_lists ) || $self->allow_change_from_others;
188
190
189
    my $content = Koha::Virtualshelfcontent->new(
191
    my $content = Koha::Virtualshelfcontent->new(
190
        {
192
        {
Lines 207-212 sub remove_biblios { Link Here
207
209
208
    my $number_removed = 0;
210
    my $number_removed = 0;
209
    if( ( $self->owner == $borrowernumber && $self->allow_change_from_owner )
211
    if( ( $self->owner == $borrowernumber && $self->allow_change_from_owner )
212
      || ( $self->allow_change_from_staff && Koha::Patrons->find( $borrowernumber )->can_patron_change_staff_only_lists )
210
      || $self->allow_change_from_others ) {
213
      || $self->allow_change_from_others ) {
211
        $number_removed += $self->get_contents->search({
214
        $number_removed += $self->get_contents->search({
212
            biblionumber => $biblionumbers,
215
            biblionumber => $biblionumbers,
Lines 235-241 sub can_be_deleted { Link Here
235
238
236
    my $patron = Koha::Patrons->find( $borrowernumber );
239
    my $patron = Koha::Patrons->find( $borrowernumber );
237
240
238
    return 1 if $self->is_public and C4::Auth::haspermission( $patron->userid, { lists => 'delete_public_lists' } );
241
    return 1 if $self->is_public and haspermission( $patron->userid, { lists => 'delete_public_lists' } );
239
242
240
    return 0;
243
    return 0;
241
}
244
}
Lines 252-258 sub can_biblios_be_added { Link Here
252
255
253
    return 1
256
    return 1
254
      if $borrowernumber
257
      if $borrowernumber
255
      and ( ( $self->owner == $borrowernumber && $self->allow_change_from_owner ) or $self->allow_change_from_others );
258
      and ( ( $self->owner == $borrowernumber && $self->allow_change_from_owner ) or ( $self->allow_change_from_staff && Koha::Patrons->find( $borrowernumber )->can_patron_change_staff_only_lists ) or $self->allow_change_from_others );
256
    return 0;
259
    return 0;
257
}
260
}
258
261
Lines 266-269 sub _type { Link Here
266
    return 'Virtualshelve';
269
    return 'Virtualshelve';
267
}
270
}
268
271
269
1;
(-)a/Koha/Virtualshelves.pm (-10 / +26 lines)
Lines 22-27 use Koha::Database; Link Here
22
22
23
use Koha::Virtualshelf;
23
use Koha::Virtualshelf;
24
24
25
use C4::Auth;
26
25
use base qw(Koha::Objects);
27
use base qw(Koha::Objects);
26
28
27
=head1 NAME
29
=head1 NAME
Lines 87-102 sub get_some_shelves { Link Here
87
89
88
    my @conditions;
90
    my @conditions;
89
    if ( $add_allowed ) {
91
    if ( $add_allowed ) {
90
        push @conditions, {
92
        if ( Koha::Patrons->find( $borrowernumber )->can_patron_change_staff_only_lists ) {
91
            -or =>
93
            push @conditions, {
92
            [
94
                -or =>
93
                {
95
                [
94
                    "me.owner" => $borrowernumber,
96
                    {
95
                    "me.allow_change_from_owner" => 1,
97
                        "me.owner" => $borrowernumber,
96
                },
98
                        "me.allow_change_from_owner" => 1,
97
                "me.allow_change_from_others" => 1,
99
                    },
98
            ]
100
                    "me.allow_change_from_others" => 1,
99
        };
101
                    "me.allow_change_from_staff"  => 1
102
                ]
103
            };
104
        } else {
105
            push @conditions, {
106
                -or =>
107
                [
108
                    {
109
                        "me.owner" => $borrowernumber,
110
                        "me.allow_change_from_owner" => 1,
111
                    },
112
                    "me.allow_change_from_others" => 1,
113
                ]
114
            };
115
        }
100
    }
116
    }
101
    if ( $category == 1 ) {
117
    if ( $category == 1 ) {
102
        push @conditions, {
118
        push @conditions, {
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/virtualshelves/shelves.tt (-2 / +16 lines)
Lines 35-42 Link Here
35
35
36
            [% IF shelf.allow_change_from_others %]<option value="2" selected="selected">Anyone seeing this list</option>[% ELSE %]<option value="2">Anyone seeing this list</option>[% END %]
36
            [% IF shelf.allow_change_from_others %]<option value="2" selected="selected">Anyone seeing this list</option>[% ELSE %]<option value="2">Anyone seeing this list</option>[% END %]
37
37
38
            [% IF shelf.allow_change_from_staff %]<option value="3" selected="selected">Staff only</option>[% ELSE %]<option value="3">Staff only</option>[% END %]
39
38
        </select>
40
        </select>
39
        &emsp; <span id="anyone_remark" style="display:none;color:red;">The Anyone permission has no actual effect while this list is strictly private.</span>
41
        &emsp; <span id="anyone_remark" style="display:none;color:red;">The Anyone permission has no actual effect while this list is strictly private.</span>
42
        &emsp; <span id="staff_remark" style="display:none;color:red;">The Staff only permission has no actual effect while this list is strictly private.</span>
40
    </li>
43
    </li>
41
[% END %]
44
[% END %]
42
</head>
45
</head>
Lines 809-824 Link Here
809
812
810
            if( perms < 2 ) {
813
            if( perms < 2 ) {
811
                $("#anyone_remark").hide();
814
                $("#anyone_remark").hide();
815
                $("#staff_remark").hide();
812
            } else if( category==1 ) {
816
            } else if( category==1 ) {
813
                // If we move to Private (without shares), show Anyone remark
817
                // If we move to Private (without shares), show either:
818
                // Anyone remark if Anyone can change the list
819
                // Or Staff remark is Staff only can change the list
814
                // Note: the number of shares is not tested real-time
820
                // Note: the number of shares is not tested real-time
815
                [% IF !shelf.is_shared %]
821
                [% IF !shelf.is_shared %]
816
                    $("#anyone_remark").show();
822
                    if( perms== 2) {
823
                        $("#anyone_remark").show();
824
                        $("#staff_remark").hide();
825
                    } else if ( perms==3 ) {
826
                        $("#anyone_remark").hide();
827
                        $("#staff_remark").show();
828
                    }
817
                [% ELSE %]
829
                [% ELSE %]
818
                    $("#anyone_remark").hide();
830
                    $("#anyone_remark").hide();
831
                    $("#staff_remark").hide();
819
                [% END %]
832
                [% END %]
820
            } else { // category==2
833
            } else { // category==2
821
                $("#anyone_remark").hide();
834
                $("#anyone_remark").hide();
835
                $("#staff_remark").hide();
822
            }
836
            }
823
        }
837
        }
824
        [% IF op == 'view' %]
838
        [% IF op == 'view' %]
(-)a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-shelves.tt (-2 / +16 lines)
Lines 51-58 Link Here
51
51
52
            [% IF shelf.allow_change_from_others %]<option value="2" selected="selected">Anyone seeing this list</option>[% ELSE %]<option value="2">Anyone seeing this list</option>[% END %]
52
            [% IF shelf.allow_change_from_others %]<option value="2" selected="selected">Anyone seeing this list</option>[% ELSE %]<option value="2">Anyone seeing this list</option>[% END %]
53
53
54
            [% IF staffuser == 1 %][% IF shelf.allow_change_from_staff %]<option value="3" selected="selected">Staff only</option>[% ELSE %]<option value="3">Staff only</option>[% END %][% END %]
55
54
        </select>
56
        </select>
55
        &emsp; <span id="anyone_remark" style="display:none;color:red;">The "Anyone" permission has no actual effect while this list is strictly private.</span>
57
        &emsp; <span id="anyone_remark" style="display:none;color:red;">The "Anyone" permission has no actual effect while this list is strictly private.</span>
58
        &emsp; <span id="staff_remark" style="display:none;color:red;">The "Staff only" permission has no actual effect while this list is strictly private.</span>
56
    </li>
59
    </li>
57
[% END %]
60
[% END %]
58
61
Lines 1045-1060 function AdjustRemark() { Link Here
1045
1048
1046
    if( perms < 2 ) {
1049
    if( perms < 2 ) {
1047
        $("#anyone_remark").hide();
1050
        $("#anyone_remark").hide();
1051
        $("#staff_remark").hide();
1048
    } else if( category==1 ) {
1052
    } else if( category==1 ) {
1049
        // If we move to Private (without shares), show Anyone remark
1053
        // If we move to Private (without shares), show one of the following:
1054
        // Anyone remark, if anyone can change the list
1055
        // Staff remark, if only Staff can change the list
1050
        // Note: the number of shares is not tested real-time
1056
        // Note: the number of shares is not tested real-time
1051
        [% IF !shelf.is_shared %]
1057
        [% IF !shelf.is_shared %]
1052
            $("#anyone_remark").show();
1058
            if ( perms==2 ) {
1059
                $("#anyone_remark").show();
1060
                $("#staff_remark").hide();
1061
            } else if ( perms==3 ) {
1062
                $("#anyone_remark").hide();
1063
                $("#staff_remark").show();
1064
            }
1053
        [% ELSE %]
1065
        [% ELSE %]
1054
            $("#anyone_remark").hide();
1066
            $("#anyone_remark").hide();
1067
            $("#staff_remark").hide();
1055
        [% END %]
1068
        [% END %]
1056
    } else { // category==2
1069
    } else { // category==2
1057
        $("#anyone_remark").hide();
1070
        $("#anyone_remark").hide();
1071
        $("#staff_remark").hide();
1058
    }
1072
    }
1059
}
1073
}
1060
</script>
1074
</script>
(-)a/opac/opac-addbybiblionumber.pl (-11 / +44 lines)
Lines 117-134 if ($newvirtualshelf) { Link Here
117
            },
117
            },
118
            { join => 'virtualshelfshares', }
118
            { join => 'virtualshelfshares', }
119
        );
119
        );
120
        my $public_shelves = Koha::Virtualshelves->search(
120
        my $public_shelves;
121
            {   category => 2,
121
        if ( $loggedinuser ) {
122
                -or      => [
122
            if ( Koha::Patrons->find( $loggedinuser )->can_patron_change_staff_only_lists ) {
123
                    -and => {
123
                $public_shelves = Koha::Virtualshelves->search(
124
                        allow_change_from_owner => 1,
124
                    {   category => 2,
125
                        owner     => $loggedinuser,
125
                        -or      => [
126
                            -and => {
127
                                allow_change_from_owner => 1,
128
                                owner     => $loggedinuser,
129
                            },
130
                            allow_change_from_others => 1,
131
                            allow_change_from_staff  => 1
132
                        ],
126
                    },
133
                    },
127
                    allow_change_from_others => 1,
134
                    { order_by => 'shelfname' }
128
                ],
135
                );
129
            },
136
            } else {
130
            { order_by => 'shelfname' }
137
                $public_shelves = Koha::Virtualshelves->search(
131
        );
138
                    {   category => 2,
139
                        -or      => [
140
                            -and => {
141
                                allow_change_from_owner => 1,
142
                                owner => $loggedinuser,
143
                            },
144
                            allow_change_from_others => 1,
145
                        ],
146
                    },
147
                    {order_by => 'shelfname' }
148
                );
149
            }
150
        } else {
151
            $public_shelves = Koha::Virtualshelves->search(
152
                {   category => 2,
153
                    -or      => [
154
                        -and => {
155
                            allow_change_from_owner => 1,
156
                            owner => $loggedinuser,
157
                        },
158
                        allow_change_from_others => 1,
159
                    ],
160
                },
161
                {order_by => 'shelfname' }
162
            );
163
        }
164
132
        $template->param(
165
        $template->param(
133
            private_shelves                => $private_shelves,
166
            private_shelves                => $private_shelves,
134
            private_shelves_shared_with_me => $shelves_shared_with_me,
167
            private_shelves_shared_with_me => $shelves_shared_with_me,
(-)a/opac/opac-shelves.pl (-1 / +5 lines)
Lines 45-50 use Koha::Virtualshelves; Link Here
45
use Koha::RecordProcessor;
45
use Koha::RecordProcessor;
46
46
47
use constant ANYONE => 2;
47
use constant ANYONE => 2;
48
use constant STAFF => 3;
48
49
49
my $query = CGI->new;
50
my $query = CGI->new;
50
51
Lines 116-121 if ( $op eq 'add_form' ) { Link Here
116
                    category           => $category,
117
                    category           => $category,
117
                    allow_change_from_owner => $allow_changes_from > 0,
118
                    allow_change_from_owner => $allow_changes_from > 0,
118
                    allow_change_from_others => $allow_changes_from == ANYONE,
119
                    allow_change_from_others => $allow_changes_from == ANYONE,
120
                    allow_change_from_staff => $allow_changes_from == STAFF,
119
                    owner              => scalar $loggedinuser,
121
                    owner              => scalar $loggedinuser,
120
                }
122
                }
121
            );
123
            );
Lines 147-152 if ( $op eq 'add_form' ) { Link Here
147
            my $allow_changes_from = $query->param('allow_changes_from');
149
            my $allow_changes_from = $query->param('allow_changes_from');
148
            $shelf->allow_change_from_owner( $allow_changes_from > 0 );
150
            $shelf->allow_change_from_owner( $allow_changes_from > 0 );
149
            $shelf->allow_change_from_others( $allow_changes_from == ANYONE );
151
            $shelf->allow_change_from_others( $allow_changes_from == ANYONE );
152
            $shelf->allow_change_from_staff( $allow_changes_from == STAFF );
150
            $shelf->category( $category );
153
            $shelf->category( $category );
151
            eval { $shelf->store };
154
            eval { $shelf->store };
152
155
Lines 439-445 if ( $op eq 'list' ) { Link Here
439
        ),
442
        ),
440
    );
443
    );
441
}
444
}
442
445
my $staffuser = Koha::Patrons->find( $loggedinuser )->can_patron_change_staff_only_lists if $loggedinuser;
443
$template->param(
446
$template->param(
444
    op       => $op,
447
    op       => $op,
445
    referer  => $referer,
448
    referer  => $referer,
Lines 448-453 $template->param( Link Here
448
    category => $category,
451
    category => $category,
449
    print    => scalar $query->param('print') || 0,
452
    print    => scalar $query->param('print') || 0,
450
    listsview => 1,
453
    listsview => 1,
454
    staffuser => $staffuser,
451
);
455
);
452
456
453
my $content_type = $query->param('rss')? 'rss' : 'html';
457
my $content_type = $query->param('rss')? 'rss' : 'html';
(-)a/t/db_dependent/Koha/Patron.t (-1 / +31 lines)
Lines 19-25 Link Here
19
19
20
use Modern::Perl;
20
use Modern::Perl;
21
21
22
use Test::More tests => 10;
22
use Test::More tests => 11;
23
use Test::Exception;
23
use Test::Exception;
24
use Test::Warn;
24
use Test::Warn;
25
25
Lines 845-848 subtest 'article_requests() tests' => sub { Link Here
845
    is( $article_requests->count, 4, '4 article requests' );
845
    is( $article_requests->count, 4, '4 article requests' );
846
846
847
    $schema->storage->txn_rollback;
847
    $schema->storage->txn_rollback;
848
849
};
850
851
subtest 'can_patron_change_staff_only_lists() tests' => sub {
852
853
    plan tests => 3;
854
855
    $schema->storage->txn_begin;
856
857
    # make a user with no special permissions
858
    my $patron = $builder->build_object(
859
        {
860
            class => 'Koha::Patrons',
861
            value => {
862
                flags => undef
863
            }
864
        }
865
    );
866
    is( $patron->can_patron_change_staff_only_lists(), 0, 'Patron without permissions cannot change staff only lists');
867
868
    # make it a 'Catalogue' permission
869
    $patron->set({ flags => 4 })->store->discard_changes;
870
    is( $patron->can_patron_change_staff_only_lists(), 1, 'Catalogue patron can change staff only lists');
871
872
873
    # make it a superlibrarian
874
    $patron->set({ flags => 1 })->store->discard_changes;
875
    is( $patron->can_patron_change_staff_only_lists(), 1, 'Superlibrarian patron can change staff only lists');
876
877
    $schema->storage->txn_rollback;
848
};
878
};
(-)a/t/db_dependent/Virtualshelves.t (-18 / +73 lines)
Lines 22-28 my $dbh = C4::Context->dbh; Link Here
22
teardown();
22
teardown();
23
23
24
subtest 'CRUD' => sub {
24
subtest 'CRUD' => sub {
25
    plan tests => 13;
25
    plan tests => 14;
26
    my $patron = $builder->build({
26
    my $patron = $builder->build({
27
        source => 'Borrower',
27
        source => 'Borrower',
28
    });
28
    });
Lines 44-49 subtest 'CRUD' => sub { Link Here
44
    is( $number_of_shelves, 1, '1 shelf should have been inserted' );
44
    is( $number_of_shelves, 1, '1 shelf should have been inserted' );
45
    is( $shelf->allow_change_from_owner, 1, 'The default value for allow_change_from_owner should be 1' );
45
    is( $shelf->allow_change_from_owner, 1, 'The default value for allow_change_from_owner should be 1' );
46
    is( $shelf->allow_change_from_others, 0, 'The default value for allow_change_from_others should be 0' );
46
    is( $shelf->allow_change_from_others, 0, 'The default value for allow_change_from_others should be 0' );
47
    is ( $shelf->allow_change_from_staff, 0, 'The default value for allow_change_from_staff should be 0');
47
    is( t::lib::Dates::compare( $shelf->created_on, dt_from_string), 0, 'The creation time should have been set to today' );
48
    is( t::lib::Dates::compare( $shelf->created_on, dt_from_string), 0, 'The creation time should have been set to today' );
48
49
49
    # Test if creation date will not be overwritten by store
50
    # Test if creation date will not be overwritten by store
Lines 171-179 subtest 'Sharing' => sub { Link Here
171
172
172
subtest 'Shelf content' => sub {
173
subtest 'Shelf content' => sub {
173
174
174
    plan tests => 18;
175
    plan tests => 21;
175
    my $patron1 = $builder->build( { source => 'Borrower', } );
176
    my $patron1 = $builder->build( { source => 'Borrower', } );
176
    my $patron2 = $builder->build( { source => 'Borrower', } );
177
    my $patron2 = $builder->build( { source => 'Borrower', } );
178
    my $patron3 = $builder->build( { source => 'Borrower', value => {flags => 1} });
177
    my $biblio1 = $builder->build_sample_biblio;
179
    my $biblio1 = $builder->build_sample_biblio;
178
    my $biblio2 = $builder->build_sample_biblio;
180
    my $biblio2 = $builder->build_sample_biblio;
179
    my $biblio3 = $builder->build_sample_biblio;
181
    my $biblio3 = $builder->build_sample_biblio;
Lines 247-264 subtest 'Shelf content' => sub { Link Here
247
    $number_of_contents = Koha::Virtualshelfcontents->search->count;
249
    $number_of_contents = Koha::Virtualshelfcontents->search->count;
248
    is( $number_of_contents, 3, 'Back to three entries' );
250
    is( $number_of_contents, 3, 'Back to three entries' );
249
251
252
    # allow_change_from_staff == 1 and allow_change_from_others == 0
253
    $shelf->allow_change_from_staff( 1 );
254
    $shelf->allow_change_from_others( 0 );
255
    $content4 = $shelf->add_biblio( $biblio3->biblionumber, $patron3->{borrowernumber} );
256
    $number_of_contents = Koha::Virtualshelfcontents->search->count;
257
    is( $number_of_contents, 4, 'The biblio should have been added to the shelf by patron 2');
258
    $number_of_deleted_biblios = $shelf->remove_biblios( { biblionumbers => [ $biblio3->biblionumber ], borrowernumber => $patron3->{borrowernumber} } );
259
    is( $number_of_deleted_biblios, 1, 'Biblio 3 deleted by patron 2' );
260
    $number_of_contents = Koha::Virtualshelfcontents->search->count;
261
    is( $number_of_contents, 3, 'Back to three entries' );
262
250
    teardown();
263
    teardown();
251
};
264
};
252
265
253
subtest 'Shelf permissions' => sub {
266
subtest 'Shelf permissions' => sub {
254
267
255
    plan tests => 40;
268
    plan tests => 70;
256
    my $patron1 = $builder->build( { source => 'Borrower', value => { flags => '2096766' } } ); # 2096766 is everything checked but not superlibrarian
269
    my $patron1 = $builder->build( { source => 'Borrower', value => { flags => '2096766' } } ); # 2096766 is everything checked but not superlibrarian
257
    my $patron2 = $builder->build( { source => 'Borrower', value => { flags => '1048190' } } ); # 1048190 is everything checked but not superlibrarian and delete_public_lists
270
    my $patron2 = $builder->build( { source => 'Borrower', value => { flags => '1048190' } } ); # 1048190 is everything checked but not superlibrarian and delete_public_lists
271
    my $patron3 = $builder->build( { source => 'Borrower', value => { flags => '0' } } ); # this is a patron with no special permissions
258
    my $biblio1 = $builder->build_sample_biblio;
272
    my $biblio1 = $builder->build_sample_biblio;
259
    my $biblio2 = $builder->build_sample_biblio;
273
    my $biblio2 = $builder->build_sample_biblio;
260
    my $biblio3 = $builder->build_sample_biblio;
274
    my $biblio3 = $builder->build_sample_biblio;
261
    my $biblio4 = $builder->build_sample_biblio;
275
    my $biblio4 = $builder->build_sample_biblio;
276
    my $biblio5 = $builder->build_sample_biblio;
262
277
263
    my $public_shelf = Koha::Virtualshelf->new(
278
    my $public_shelf = Koha::Virtualshelf->new(
264
        {   shelfname    => "my first shelf",
279
        {   shelfname    => "my first shelf",
Lines 266-307 subtest 'Shelf permissions' => sub { Link Here
266
            category     => 2,
281
            category     => 2,
267
            allow_change_from_owner => 0,
282
            allow_change_from_owner => 0,
268
            allow_change_from_others => 0,
283
            allow_change_from_others => 0,
284
            allow_change_from_staff => 0,
269
        }
285
        }
270
    )->store;
286
    )->store;
271
287
272
    is( $public_shelf->can_be_viewed( $patron1->{borrowernumber} ), 1, 'The owner should be able to view his public list' );
288
    is( $public_shelf->can_be_viewed( $patron1->{borrowernumber} ), 1, 'The owner should be able to view his public list' );
273
    is( $public_shelf->can_be_viewed( $patron2->{borrowernumber} ), 1, 'Public list should be viewed by someone else' );
289
    is( $public_shelf->can_be_viewed( $patron2->{borrowernumber} ), 1, 'Public list should be viewed by another staff member');
290
    is( $public_shelf->can_be_viewed( $patron3->{borrowernumber} ), 1, 'Public list should be viewed by someone with no special permissions' );
274
291
275
    is( $public_shelf->can_be_deleted( $patron1->{borrowernumber} ), 1, 'The owner should be able to delete his list' );
292
    is( $public_shelf->can_be_deleted( $patron1->{borrowernumber} ), 1, 'The owner should be able to delete his list' );
276
    is( $public_shelf->can_be_deleted( $patron2->{borrowernumber} ), 0, 'Public list should not be deleted by someone else' );
293
    is( $public_shelf->can_be_deleted( $patron2->{borrowernumber} ), 0, 'Public list should not be deleted by another staff member' );
294
    is( $public_shelf->can_be_deleted( $patron3->{borrowernumber} ), 0, 'Public list should not be deleted by someone with no special permissions' );
277
295
278
    is( $public_shelf->can_be_managed( $patron1->{borrowernumber} ), 1, 'The owner should be able to manage his list' );
296
    is( $public_shelf->can_be_managed( $patron1->{borrowernumber} ), 1, 'The owner should be able to manage his list' );
279
    is( $public_shelf->can_be_managed( $patron2->{borrowernumber} ), 0, 'Public list should not be managed by someone else' );
297
    is( $public_shelf->can_be_managed( $patron2->{borrowernumber} ), 0, 'Public list should not be managed by another staff member' );
298
    is( $public_shelf->can_be_managed( $patron3->{borrowernumber} ), 0, 'Public list should not be managed by someone with no special permissions' );
280
299
281
    is( $public_shelf->can_biblios_be_added( $patron1->{borrowernumber} ), 0, 'The owner should not be able to add biblios to their list' );
300
    is( $public_shelf->can_biblios_be_added( $patron1->{borrowernumber} ), 0, 'The owner should not be able to add biblios to their list' );
282
    is( $public_shelf->can_biblios_be_added( $patron2->{borrowernumber} ), 0, 'Public list should not be modified (add) by someone else' );
301
    is( $public_shelf->can_biblios_be_added( $patron2->{borrowernumber} ), 0, 'Public list should not be modified (add) by another staff member' );
302
    is( $public_shelf->can_biblios_be_added( $patron3->{borrowernumber} ), 0, 'Public list should not be modified (add) by someone with no special permissions' );
283
303
284
    is( $public_shelf->can_biblios_be_removed( $patron1->{borrowernumber} ), 0, 'The owner should not be able to remove biblios to their list' );
304
    is( $public_shelf->can_biblios_be_removed( $patron1->{borrowernumber} ), 0, 'The owner should not be able to remove biblios to their list' );
285
    is( $public_shelf->can_biblios_be_removed( $patron2->{borrowernumber} ), 0, 'Public list should not be modified (remove) by someone else' );
305
    is( $public_shelf->can_biblios_be_removed( $patron2->{borrowernumber} ), 0, 'Public list should not be modified (remove) by another staff member' );
306
    is ( $public_shelf->can_biblios_be_removed( $patron3->{borrowernumber} ), 0, 'Public list should not be modified (removed) by someone with no special permissions' );
286
307
287
308
288
    $public_shelf->allow_change_from_owner(1);
309
    $public_shelf->allow_change_from_owner(1);
289
    $public_shelf->store;
310
    $public_shelf->store;
290
311
291
    is( $public_shelf->can_be_viewed( $patron1->{borrowernumber} ), 1, 'The owner should be able to view his public list' );
312
    is( $public_shelf->can_be_viewed( $patron1->{borrowernumber} ), 1, 'The owner should be able to view his public list' );
292
    is( $public_shelf->can_be_viewed( $patron2->{borrowernumber} ), 1, 'Public list should be viewed by someone else' );
313
    is( $public_shelf->can_be_viewed( $patron2->{borrowernumber} ), 1, 'Public list should be viewed by staff member' );
314
    is( $public_shelf->can_be_viewed( $patron3->{borrowernumber} ), 1, 'Public list should be viewed by someone with no special permissions' );
293
315
294
    is( $public_shelf->can_be_deleted( $patron1->{borrowernumber} ), 1, 'The owner should be able to delete his list' );
316
    is( $public_shelf->can_be_deleted( $patron1->{borrowernumber} ), 1, 'The owner should be able to delete his list' );
295
    is( $public_shelf->can_be_deleted( $patron2->{borrowernumber} ), 0, 'Public list should not be deleted by someone else' );
317
    is( $public_shelf->can_be_deleted( $patron2->{borrowernumber} ), 0, 'Public list should not be deleted by another staff member' );
318
    is( $public_shelf->can_be_deleted( $patron3->{borrowernumber} ), 0, 'Public list should not be deleted by someone with no special permissions' );
296
319
297
    is( $public_shelf->can_be_managed( $patron1->{borrowernumber} ), 1, 'The owner should be able to manage his list' );
320
    is( $public_shelf->can_be_managed( $patron1->{borrowernumber} ), 1, 'The owner should be able to manage his list' );
298
    is( $public_shelf->can_be_managed( $patron2->{borrowernumber} ), 0, 'Public list should not be managed by someone else' );
321
    is( $public_shelf->can_be_managed( $patron2->{borrowernumber} ), 0, 'Public list should not be managed by another staff member' );
322
    is( $public_shelf->can_be_managed( $patron3->{borrowernumber} ), 0, 'Public list should not be managed by someone with no special permissions' );
299
323
300
    is( $public_shelf->can_biblios_be_added( $patron1->{borrowernumber} ), 1, 'The owner should be able to add biblios to his list' );
324
    is( $public_shelf->can_biblios_be_added( $patron1->{borrowernumber} ), 1, 'The owner should be able to add biblios to his list' );
301
    is( $public_shelf->can_biblios_be_added( $patron2->{borrowernumber} ), 0, 'Public list should not be modified (add) by someone else' );
325
    is( $public_shelf->can_biblios_be_added( $patron2->{borrowernumber} ), 0, 'Public list should not be modified (add) by another staff member' );
326
    is( $public_shelf->can_biblios_be_added( $patron3->{borrowerbumber} ), 0, 'Public list should not be modified (add) by someone with no special permissions' );
302
327
303
    is( $public_shelf->can_biblios_be_removed( $patron1->{borrowernumber} ), 1, 'The owner should be able to remove biblios to his list' );
328
    is( $public_shelf->can_biblios_be_removed( $patron1->{borrowernumber} ), 1, 'The owner should be able to remove biblios to his list' );
304
    is( $public_shelf->can_biblios_be_removed( $patron2->{borrowernumber} ), 0, 'Public list should not be modified (remove) by someone else' );
329
    is( $public_shelf->can_biblios_be_removed( $patron2->{borrowernumber} ), 0, 'Public list should not be modified (remove) by another staff member' );
330
    is( $public_shelf->can_biblios_be_removed( $patron3->{borroernumber} ), 0, 'Public list should not be modified (remove) by someone with no special permissions' );
305
331
306
332
307
    my $private_shelf = Koha::Virtualshelf->new(
333
    my $private_shelf = Koha::Virtualshelf->new(
Lines 310-333 subtest 'Shelf permissions' => sub { Link Here
310
            category     => 1,
336
            category     => 1,
311
            allow_change_from_owner => 0,
337
            allow_change_from_owner => 0,
312
            allow_change_from_others => 0,
338
            allow_change_from_others => 0,
339
            allow_change_from_staff => 0,
313
        }
340
        }
314
    )->store;
341
    )->store;
315
342
316
    is( $private_shelf->can_be_viewed( $patron1->{borrowernumber} ), 1, 'The owner should be able to view his list' );
343
    is( $private_shelf->can_be_viewed( $patron1->{borrowernumber} ), 1, 'The owner should be able to view his list' );
317
    is( $private_shelf->can_be_viewed( $patron2->{borrowernumber} ), 0, 'Private list should not be viewed by someone else' );
344
    is( $private_shelf->can_be_viewed( $patron2->{borrowernumber} ), 0, 'Private list should not be viewed by another staff member' );
345
    is( $private_shelf->can_be_viewed( $patron3->{borrowernumber} ), 0, 'Private list should not be viewed by someone with no special permissions' );
318
346
319
    is( $private_shelf->can_be_deleted( $patron1->{borrowernumber} ), 1, 'The owner should be able to delete his list' );
347
    is( $private_shelf->can_be_deleted( $patron1->{borrowernumber} ), 1, 'The owner should be able to delete his list' );
320
    is( $private_shelf->can_be_deleted( $patron2->{borrowernumber} ), 0, 'Private list should not be deleted by someone else' );
348
    is( $private_shelf->can_be_deleted( $patron2->{borrowernumber} ), 0, 'Private list should not be deleted by another staff member' );
349
    is( $private_shelf->can_be_deleted( $patron3->{borrowernumber} ), 0, 'Private list should not be deleted by someone with no special permissions' );
321
350
322
    is( $private_shelf->can_be_managed( $patron1->{borrowernumber} ), 1, 'The owner should be able to manage his list' );
351
    is( $private_shelf->can_be_managed( $patron1->{borrowernumber} ), 1, 'The owner should be able to manage his list' );
323
    is( $private_shelf->can_be_managed( $patron2->{borrowernumber} ), 0, 'Private list should not be managed by someone else' );
352
    is( $private_shelf->can_be_managed( $patron2->{borrowernumber} ), 0, 'Private list should not be managed by another staff member' );
353
    is( $private_shelf->can_be_managed( $patron3->{borrowernumber} ), 0, 'Private list should not be managed by someone with no special permissions' );
324
354
325
    is( $private_shelf->can_biblios_be_added( $patron1->{borrowernumber} ), 0, 'The owner should not be able to add biblios to their list' );
355
    is( $private_shelf->can_biblios_be_added( $patron1->{borrowernumber} ), 0, 'The owner should not be able to add biblios to their list' );
326
    is( $private_shelf->can_biblios_be_added( $patron2->{borrowernumber} ), 0, 'Private list should not be modified (add) by someone else' );
356
    is( $private_shelf->can_biblios_be_added( $patron2->{borrowernumber} ), 0, 'Private list should not be modified (add) by another staff member' );
357
    is( $private_shelf->can_biblios_be_added( $patron3->{borrowernumber} ), 0, 'Private list should not be modified (add) by someone with no special permissions' );
327
358
328
    is( $private_shelf->can_biblios_be_removed( $patron1->{borrowernumber} ), 0, 'The owner should not be able to remove biblios to their list' );
359
    is( $private_shelf->can_biblios_be_removed( $patron1->{borrowernumber} ), 0, 'The owner should not be able to remove biblios to their list' );
329
    is( $private_shelf->can_biblios_be_removed( $patron2->{borrowernumber} ), 0, 'Private list should not be modified (remove) by someone else' );
360
    is( $private_shelf->can_biblios_be_removed( $patron2->{borrowernumber} ), 0, 'Private list should not be modified (remove) by another staff member' );
361
    is( $private_shelf->can_biblios_be_removed( $patron3->{borrowernumber} ), 0, 'Private list should not be modified (remove) by someone with no special permissions' );
362
363
    $private_shelf->allow_change_from_owner(1);
364
    $private_shelf->allow_change_from_staff(1);
365
    $private_shelf->allow_change_from_others(0);
366
    $private_shelf->store;
367
    is( $private_shelf->can_be_viewed( $patron1->{borrowernumber} ), 1, 'The owner should be able to view his list' );
368
    is( $private_shelf->can_be_viewed( $patron2->{borrowernumber} ), 0, 'Private list should not be viewed by another staff member' );
369
    is( $private_shelf->can_be_viewed( $patron3->{borrowernumber} ), 0, 'Private list should not be viewed by someone with no special permissions' );
370
371
    is( $private_shelf->can_be_deleted( $patron1->{borrowernumber} ), 1, 'The owner should be able to delete his list' );
372
    is( $private_shelf->can_be_deleted( $patron2->{borrowernumber} ), 0, 'Private list should not be deleted by another staff member' );
373
    is( $private_shelf->can_be_deleted( $patron3->{borrowernumber} ), 0, 'Private list should not be deleted by someone with no special permissions' );
330
374
375
    is( $private_shelf->can_be_managed( $patron1->{borrowernumber} ), 1, 'The owner should be able to manage his list' );
376
    is( $private_shelf->can_be_managed( $patron2->{borrowernumber} ), 0, 'Private list should not be managed by another staff member' );
377
    is( $private_shelf->can_be_managed( $patron3->{borrowernumber} ), 0, 'Private list should not be managed by someone with no special permissions' );
378
379
    is( $private_shelf->can_biblios_be_added( $patron1->{borrowernumber} ), 1, 'The owner should be able to add biblios to his list' );
380
    is( $private_shelf->can_biblios_be_added( $patron2->{borrowernumber} ), 1, 'Private list could be modified (add) by another staff member # individual check done later' );
381
    is( $private_shelf->can_biblios_be_added( $patron3->{borrowernumber} ), 0, 'Private list could be modified (add) by someone with no special permissions' );
382
383
    is( $private_shelf->can_biblios_be_removed( $patron1->{borrowernumber} ), 1, 'The owner should be able to remove biblios to his list' );
384
    is( $private_shelf->can_biblios_be_removed( $patron2->{borrowernumber} ), 1, 'Private list could be modified (remove) by another staff member # individual check done later' );
385
    is( $private_shelf->can_biblios_be_removed( $patron3->{borrowernumber} ), 0, 'Private list could be modified (remove) by someone with no special permissions' );
331
386
332
    $private_shelf->allow_change_from_owner(1);
387
    $private_shelf->allow_change_from_owner(1);
333
    $private_shelf->allow_change_from_others(1);
388
    $private_shelf->allow_change_from_others(1);
(-)a/virtualshelves/shelves.pl (-1 / +3 lines)
Lines 41-46 use Koha::Patrons; Link Here
41
use Koha::Virtualshelves;
41
use Koha::Virtualshelves;
42
42
43
use constant ANYONE => 2;
43
use constant ANYONE => 2;
44
use constant STAFF  => 3;
44
45
45
my $query = CGI->new;
46
my $query = CGI->new;
46
47
Lines 84-89 if ( $op eq 'add_form' ) { Link Here
84
                category           => scalar $query->param('category'),
85
                category           => scalar $query->param('category'),
85
                allow_change_from_owner => $allow_changes_from > 0,
86
                allow_change_from_owner => $allow_changes_from > 0,
86
                allow_change_from_others => $allow_changes_from == ANYONE,
87
                allow_change_from_others => $allow_changes_from == ANYONE,
88
                allow_change_from_staff => $allow_changes_from == STAFF,
87
                owner              => scalar $query->param('owner'),
89
                owner              => scalar $query->param('owner'),
88
            }
90
            }
89
        );
91
        );
Lines 113-118 if ( $op eq 'add_form' ) { Link Here
113
            my $allow_changes_from = $query->param('allow_changes_from');
115
            my $allow_changes_from = $query->param('allow_changes_from');
114
            $shelf->allow_change_from_owner( $allow_changes_from > 0 );
116
            $shelf->allow_change_from_owner( $allow_changes_from > 0 );
115
            $shelf->allow_change_from_others( $allow_changes_from == ANYONE );
117
            $shelf->allow_change_from_others( $allow_changes_from == ANYONE );
118
            $shelf->allow_change_from_staff( $allow_changes_from == STAFF );
116
            $shelf->category( scalar $query->param('category') );
119
            $shelf->category( scalar $query->param('category') );
117
            eval { $shelf->store };
120
            eval { $shelf->store };
118
121
119
- 

Return to bug 26346