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

(-)a/C4/VirtualShelves.pm (-71 / +1 lines)
Lines 41-47 BEGIN { Link Here
41
    @ISA    = qw(Exporter);
41
    @ISA    = qw(Exporter);
42
    @EXPORT = qw(
42
    @EXPORT = qw(
43
            &GetShelves &GetShelfContents
43
            &GetShelves &GetShelfContents
44
            &AddToShelf &AddShelf
44
            &AddToShelf
45
            &ModShelf
45
            &ModShelf
46
            &ShelfPossibleAction
46
            &ShelfPossibleAction
47
            &DelFromShelf &DelShelf
47
            &DelFromShelf &DelShelf
Lines 272-319 sub GetShelfContents { Link Here
272
    # or newer, for your version of DBI.
272
    # or newer, for your version of DBI.
273
}
273
}
274
274
275
=head2 AddShelf
276
277
  $shelfnumber = &AddShelf($hashref, $owner);
278
279
Creates a new virtual shelf. Params passed in a hash like ModShelf.
280
281
Returns a code to know what's happen.
282
    * -1 : if this virtualshelves already exists.
283
    * $shelfnumber : if success.
284
285
=cut
286
287
sub AddShelf {
288
    my ($hashref, $owner)= @_;
289
    my $dbh = C4::Context->dbh;
290
291
    #initialize missing hash values to silence warnings
292
    foreach('shelfname','category', 'sortfield', 'allow_add', 'allow_delete_own', 'allow_delete_other' ) {
293
        $hashref->{$_}= undef unless exists $hashref->{$_};
294
    }
295
296
    return -1 unless _CheckShelfName($hashref->{shelfname}, $hashref->{category}, $owner, 0);
297
298
    my $query = q|INSERT INTO virtualshelves
299
        (shelfname,owner,category,sortfield,allow_add,allow_delete_own,allow_delete_other, created_on)
300
        VALUES (?,?,?,?,?,?,?, NOW())
301
    |;
302
303
    my $sth = $dbh->prepare($query);
304
    $sth->execute(
305
        $hashref->{shelfname},
306
        $owner,
307
        $hashref->{category},
308
        $hashref->{sortfield},
309
        $hashref->{allow_add}//0,
310
        $hashref->{allow_delete_own}//1,
311
        $hashref->{allow_delete_other}//0 );
312
    return if $sth->err;
313
    my $shelfnumber = $dbh->{'mysql_insertid'};
314
    return $shelfnumber;
315
}
316
317
=head2 AddToShelf
275
=head2 AddToShelf
318
276
319
  &AddToShelf($biblionumber, $shelfnumber, $borrower);
277
  &AddToShelf($biblionumber, $shelfnumber, $borrower);
Lines 758-791 sub GetShelfCount { Link Here
758
    return $total;
716
    return $total;
759
}
717
}
760
718
761
# internal subs
762
sub _CheckShelfName {
763
    my ($name, $cat, $owner, $number)= @_;
764
765
    my $dbh = C4::Context->dbh;
766
    my @pars;
767
    my $query = qq(
768
        SELECT DISTINCT shelfnumber
769
        FROM   virtualshelves
770
        LEFT JOIN virtualshelfshares sh USING (shelfnumber)
771
        WHERE  shelfname=? AND shelfnumber<>?);
772
    if($cat==1 && defined($owner)) {
773
        $query.= ' AND (sh.borrowernumber=? OR owner=?) AND category=1';
774
        @pars=($name, $number, $owner, $owner);
775
    }
776
    elsif($cat==1 && !defined($owner)) { #owner is null (exceptional)
777
        $query.= ' AND owner IS NULL AND category=1';
778
        @pars=($name, $number);
779
    }
780
    else { #public list
781
        $query.= ' AND category=2';
782
        @pars=($name, $number);
783
    }
784
    my $sth = $dbh->prepare($query);
785
    $sth->execute(@pars);
786
    return $sth->rows>0? 0: 1;
787
}
788
789
1;
719
1;
790
720
791
__END__
721
__END__
(-)a/C4/VirtualShelves/Page.pm (-17 / +29 lines)
Lines 53-58 BEGIN { Link Here
53
    $debug   = $ENV{DEBUG} || 0;
53
    $debug   = $ENV{DEBUG} || 0;
54
}
54
}
55
55
56
my @messages;
56
our %pages = (
57
our %pages = (
57
    intranet => { redirect => '/cgi-bin/koha/virtualshelves/shelves.pl', },
58
    intranet => { redirect => '/cgi-bin/koha/virtualshelves/shelves.pl', },
58
    opac     => { redirect => '/cgi-bin/koha/opac-shelves.pl', },
59
    opac     => { redirect => '/cgi-bin/koha/opac-shelves.pl', },
Lines 341-370 sub shelfpage { Link Here
341
        if ( $query->param('shelves') ) {
342
        if ( $query->param('shelves') ) {
342
            my $stay = 1;
343
            my $stay = 1;
343
344
344
        #Add a shelf
345
            #Add a shelf
345
            if ( my $newshelf = $query->param('addshelf') ) {
346
            my $shelfname = $query->param('addshelf');
347
348
            if ( $shelfname ) {
346
349
347
                # note: a user can always add a new shelf (except database administrator account)
350
                # note: a user can always add a new shelf (except database administrator account)
348
                my $shelfnumber = AddShelf( {
351
                my $shelf = eval {
349
                    shelfname => $newshelf,
352
                    Koha::Virtualshelf->new(
350
                    sortfield => $query->param('sortfield'),
353
                        {
351
                    category => $query->param('category'),
354
                            shelfname          => $shelfname,
352
                    allow_add => $query->param('allow_add'),
355
                            sortfield          => $query->param('sortfield'),
353
                    allow_delete_own => $query->param('allow_delete_own'),
356
                            category           => $query->param('category'),
354
                    allow_delete_other => $query->param('allow_delete_other'),
357
                            allow_add          => $query->param('allow_add'),
355
                    },
358
                            allow_delete_own   => $query->param('allow_delete_own'),
356
                    $query->param('owner') );
359
                            allow_delete_other => $query->param('allow_delete_other'),
357
                $stay = 1;
360
                            owner              => $query->param('owner'),
358
                if( !$shelfnumber ) {
361
                        }
359
                    push @paramsloop, { addshelf_failed => 1 };
362
                    )->store;
360
                } elsif ( $shelfnumber == -1 ) {    #shelf already exists.
363
                };
364
                if ( $@ ) {
361
                    $showadd = 1;
365
                    $showadd = 1;
362
                    push @paramsloop, { already => $newshelf };
366
                    push @messages, { type => 'error', code => ref($@) };
363
                    $template->param( shelfnumber => $shelfnumber );
367
                } elsif ( not $shelf ) {
368
                    $showadd = 1;
369
                    push @messages, { type => 'error', 'error_on_insert' };
364
                } else {
370
                } else {
365
                    print $query->redirect( $pages{$type}->{redirect} . "?viewshelf=$shelfnumber" );
371
                    print $query->redirect( $pages{$type}->{redirect} . "?viewshelf=$shelfnumber" );
366
                    exit;
372
                    exit;
367
                }
373
                }
374
375
                $template->param(
376
                    shelfname => $shelfname,
377
                );
378
                $stay = 1;
368
            }
379
            }
369
380
370
        #Deleting a shelf (asking for confirmation if it has entries)
381
        #Deleting a shelf (asking for confirmation if it has entries)
Lines 503-508 sub shelfpage { Link Here
503
            barshelvesloop => $barshelves,
514
            barshelvesloop => $barshelves,
504
            pubshelves     => $total->{pubtotal},
515
            pubshelves     => $total->{pubtotal},
505
            pubshelvesloop => $pubshelves,
516
            pubshelvesloop => $pubshelves,
517
            messages       => \@messages,
506
    );
518
    );
507
519
508
    output_html_with_http_headers $query, $cookie, $template->output;
520
    output_html_with_http_headers $query, $cookie, $template->output;
(-)a/Koha/Virtualshelf.pm (+56 lines)
Lines 20-25 use Modern::Perl; Link Here
20
use Carp;
20
use Carp;
21
21
22
use Koha::Database;
22
use Koha::Database;
23
use Koha::DateUtils qw( dt_from_string );
24
use Koha::Exception::DuplicateObject;
23
25
24
use base qw(Koha::Object);
26
use base qw(Koha::Object);
25
27
Lines 37-42 Koha::Virtualshelf - Koha Virtualshelf Object class Link Here
37
39
38
=cut
40
=cut
39
41
42
our $PRIVATE = 1;
43
our $PUBLIC = 2;
44
45
sub store {
46
    my ( $self ) = @_;
47
48
    unless ( $self->is_shelfname_valid ) {
49
        Koha::Exceptions::Virtualshelves::DuplicateObject->throw;
50
    }
51
52
    $self->allow_add( 0 )
53
        unless defined $self->allow_add;
54
    $self->allow_delete_own( 1 )
55
        unless defined $self->allow_delete_own;
56
    $self->allow_delete_other( 0 )
57
        unless defined $self->allow_delete_other;
58
59
    $self->created_on( dt_from_string );
60
61
    return $self->SUPER::store( $self );
62
}
63
64
sub is_shelfname_valid {
65
    my ( $self ) = @_;
66
67
    my $conditions = {
68
        shelfname => $self->shelfname,
69
        ( $self->shelfnumber ? ( "me.shelfnumber" => { '!=', $self->shelfnumber } ) : () ),
70
    };
71
72
    if ( $self->category == $PRIVATE and defined $self->owner ) {
73
        $conditions->{-or} = {
74
            "virtualshelfshares.borrowernumber" => $self->owner,
75
            "me.owner" => $self->owner,
76
        };
77
        $conditions->{category} = $PRIVATE;
78
    }
79
    elsif ( $self->category == $PRIVATE and not defined $self->owner ) {
80
        $conditions->{owner} = undef;
81
        $conditions->{category} = $PRIVATE;
82
    }
83
    else {
84
        $conditions->{category} = $PUBLIC;
85
    }
86
87
    my $count = Koha::Virtualshelves->search(
88
        $conditions,
89
        {
90
            join => 'virtualshelfshares',
91
        }
92
    )->count;
93
    return $count ? 0 : 1;
94
}
95
40
sub type {
96
sub type {
41
    return 'Virtualshelve';
97
    return 'Virtualshelve';
42
}
98
}
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/virtualshelves/shelves.tt (-2 / +24 lines)
Lines 309-320 function placeHold () { Link Here
309
309
310
   <div class="yui-g">[% INCLUDE 'virtualshelves-toolbar.inc' %]
310
   <div class="yui-g">[% INCLUDE 'virtualshelves-toolbar.inc' %]
311
   </div>
311
   </div>
312
313
[% FOR m IN messages %]
314
    <div class="dialog [% m.type %]">
315
        [% SWITCH m.code %]
316
        [% CASE 'error_on_update' %]
317
            An error occurred when updating this list. Perhaps the value already exists.
318
        [% CASE 'error_on_insert' %]
319
            An error occurred when inserting this list. Perhaps the name already exists.
320
        [% CASE 'error_on_delete' %]
321
            An error occurred when deleteing this list. Check the logs.
322
        [% CASE 'success_on_update' %]
323
            List updated with success.
324
        [% CASE 'success_on_insert' %]
325
            List inserted with success.
326
        [% CASE 'success_on_delete' %]
327
            List deleted with success.
328
        [% CASE 'Koha::Exception::DuplicateObject' %]
329
            An error occurred when inserting this list. The name already [% shelfname %] exists.
330
        [% CASE %]
331
            [% m.code %]
332
        [% END %]
333
    </div>
334
[% END %]
335
312
[% IF ( paramsloop ) %]
336
[% IF ( paramsloop ) %]
313
[% FOREACH paramsloo IN paramsloop %]
337
[% FOREACH paramsloo IN paramsloop %]
314
<div class="yui-ge">
338
<div class="yui-ge">
315
    <div class="yui-u first">
339
    <div class="yui-u first">
316
        [% IF ( paramsloo.already ) %]<div class="dialog alert">A List named [% paramsloo.already %] already exists!</div>[% END %]
317
        [% IF ( paramsloo.addshelf_failed ) %]<div class="dialog alert">List could not be created. [% IF loggedinuser==0 %](Do not use the database administrator account.)[% END %]</div>[% END %]
318
		[% IF ( paramsloo.status ) %]<div class="dialog alert">[% paramsloo.string %]</div>[% END %]
340
		[% IF ( paramsloo.status ) %]<div class="dialog alert">[% paramsloo.string %]</div>[% END %]
319
		[% IF ( paramsloo.nobarcode ) %]<div class="dialog alert">ERROR: No barcode given.</div>[% END %] 
341
		[% IF ( paramsloo.nobarcode ) %]<div class="dialog alert">ERROR: No barcode given.</div>[% END %] 
320
        [% IF ( paramsloo.noshelfnumber ) %]<div class="dialog alert">ERROR: No list number given.</div>[% END %]
342
        [% IF ( paramsloo.noshelfnumber ) %]<div class="dialog alert">ERROR: No list number given.</div>[% END %]
(-)a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-shelves.tt (-4 / +2 lines)
Lines 109-116 Link Here
109
109
110
                    [% IF ( paramsloop ) %]
110
                    [% IF ( paramsloop ) %]
111
                        [% FOREACH paramsloo IN paramsloop %]
111
                        [% FOREACH paramsloo IN paramsloop %]
112
                            [% IF ( paramsloo.already ) %]<div class="alert">A list named <b>[% paramsloo.already %]</b> already exists!</div>[% END %]
113
                            [% IF ( paramsloo.addshelf_failed ) %]<div class="dialog alert">List could not be created. [% IF loggedinuser==0 %](Do not use the database administrator account.)[% END %]</div>[% END %]
114
                            [% IF ( paramsloo.status ) %]<div class="alert">[% paramsloo.string %]</div>[% END %]
112
                            [% IF ( paramsloo.status ) %]<div class="alert">[% paramsloo.string %]</div>[% END %]
115
                            [% IF ( paramsloo.nobarcode ) %]<div class="alert">ERROR: No barcode given.</div>[% END %]
113
                            [% IF ( paramsloo.nobarcode ) %]<div class="alert">ERROR: No barcode given.</div>[% END %]
116
                            [% IF ( paramsloo.noshelfnumber ) %]<div class="alert">ERROR: No shelfnumber given.</div>[% END %]
114
                            [% IF ( paramsloo.noshelfnumber ) %]<div class="alert">ERROR: No shelfnumber given.</div>[% END %]
Lines 768-775 Link Here
768
                                    <ol>
766
                                    <ol>
769
                                        <li>
767
                                        <li>
770
                                            <label class="required" for="addshelf">List name:</label>
768
                                            <label class="required" for="addshelf">List name:</label>
771
                                            [% IF ( already ) %]
769
                                            [% IF shelfname %]
772
                                              <input id="addshelf" type="text" name="addshelf" value="[% already %]" maxlength="255" class="input-fluid" />
770
                                              <input id="addshelf" type="text" name="addshelf" value="[% shelfname %]" maxlength="255" class="input-fluid" />
773
                                            [% ELSE %]
771
                                            [% ELSE %]
774
                                              <input id="addshelf" type="text" name="addshelf" maxlength="255" class="input-fluid" />
772
                                              <input id="addshelf" type="text" name="addshelf" maxlength="255" class="input-fluid" />
775
                                            [% END %]
773
                                            [% END %]
(-)a/opac/opac-addbybiblionumber.pl (-7 / +10 lines)
Lines 1-9 Link Here
1
#!/usr/bin/perl
1
#!/usr/bin/perl
2
2
3
#script to provide virtualshelf management
3
#script to provide virtualshelf management
4
# WARNING: This file uses 4-character tabs!
5
#
6
# $Header$
7
#
4
#
8
# Copyright 2000-2002 Katipo Communications
5
# Copyright 2000-2002 Katipo Communications
9
#
6
#
Lines 90-99 sub AddBibliosToShelf { Link Here
90
87
91
sub HandleNewVirtualShelf {
88
sub HandleNewVirtualShelf {
92
    if($authorized= ShelfPossibleAction($loggedinuser, undef, $category==1? 'new_private': 'new_public')) {
89
    if($authorized= ShelfPossibleAction($loggedinuser, undef, $category==1? 'new_private': 'new_public')) {
93
    $shelfnumber = AddShelf( {
90
    my $shelf = eval {
94
            shelfname => $newvirtualshelf,
91
        Koha::Virtualshelf->new(
95
            category => $category }, $loggedinuser);
92
            {
96
    if($shelfnumber == -1) {
93
                shelfname => $newvirtualshelf,
94
                category => $category,
95
                owner => $loggedinuser,
96
            }
97
        );
98
    };
99
    if ( $@ or not $shelf ) {
97
        $authorized=0;
100
        $authorized=0;
98
        $errcode=1;
101
        $errcode=1;
99
        return;
102
        return;
(-)a/t/db_dependent/Utils/Datatables_Virtualshelves.t (-65 / +75 lines)
Lines 26-31 use C4::Members; Link Here
26
26
27
use C4::VirtualShelves;
27
use C4::VirtualShelves;
28
28
29
use Koha::Virtualshelf;
30
use Koha::Virtualshelves;
31
29
use_ok( "C4::Utils::DataTables::VirtualShelves" );
32
use_ok( "C4::Utils::DataTables::VirtualShelves" );
30
33
31
my $dbh = C4::Context->dbh;
34
my $dbh = C4::Context->dbh;
Lines 83-171 $john_doe{borrowernumber} = AddMember( %john_doe ); Link Here
83
$jane_doe{borrowernumber} = AddMember( %jane_doe );
86
$jane_doe{borrowernumber} = AddMember( %jane_doe );
84
$john_smith{borrowernumber} = AddMember( %john_smith );
87
$john_smith{borrowernumber} = AddMember( %john_smith );
85
88
86
my $shelf1 = {
89
my $shelf1 = Koha::Virtualshelf->new(
87
    shelfname => 'my first private list (empty)',
90
    {
88
    category => 1, # private
91
        shelfname => 'my first private list (empty)',
89
    sortfield => 'author',
92
        category  => 1, # private
90
};
93
        sortfield => 'author',
91
$shelf1->{shelfnumber} = C4::VirtualShelves::AddShelf( $shelf1, $john_doe{borrowernumber} );
94
        owner     => $john_doe{borrowernumber},
92
95
    }
93
my $shelf2 = {
96
)->store;
94
    shelfname => 'my second private list',
97
95
    category => 1, # private
98
my $shelf2 = Koha::Virtualshelf->new(
96
    sortfield => 'title',
99
    {
97
};
100
        shelfname => 'my second private list',
98
$shelf2->{shelfnumber} = C4::VirtualShelves::AddShelf( $shelf2, $john_doe{borrowernumber} );
101
        category  => 1, # private
102
        sortfield => 'title',
103
        owner     => $john_doe{borrowernumber},
104
    }
105
)->store;
99
my $biblionumber1 = _add_biblio('title 1');
106
my $biblionumber1 = _add_biblio('title 1');
100
my $biblionumber2 = _add_biblio('title 2');
107
my $biblionumber2 = _add_biblio('title 2');
101
my $biblionumber3 = _add_biblio('title 3');
108
my $biblionumber3 = _add_biblio('title 3');
102
my $biblionumber4 = _add_biblio('title 4');
109
my $biblionumber4 = _add_biblio('title 4');
103
my $biblionumber5 = _add_biblio('title 5');
110
my $biblionumber5 = _add_biblio('title 5');
104
C4::VirtualShelves::AddToShelf( $biblionumber1, $shelf2->{shelfnumber}, $john_doe{borrowernumber} );
111
C4::VirtualShelves::AddToShelf( $biblionumber1, $shelf2->shelfnumber, $john_doe{borrowernumber} );
105
C4::VirtualShelves::AddToShelf( $biblionumber2, $shelf2->{shelfnumber}, $john_doe{borrowernumber} );
112
C4::VirtualShelves::AddToShelf( $biblionumber2, $shelf2->shelfnumber, $john_doe{borrowernumber} );
106
C4::VirtualShelves::AddToShelf( $biblionumber3, $shelf2->{shelfnumber}, $john_doe{borrowernumber} );
113
C4::VirtualShelves::AddToShelf( $biblionumber3, $shelf2->shelfnumber, $john_doe{borrowernumber} );
107
C4::VirtualShelves::AddToShelf( $biblionumber4, $shelf2->{shelfnumber}, $john_doe{borrowernumber} );
114
C4::VirtualShelves::AddToShelf( $biblionumber4, $shelf2->shelfnumber, $john_doe{borrowernumber} );
108
C4::VirtualShelves::AddToShelf( $biblionumber5, $shelf2->{shelfnumber}, $john_doe{borrowernumber} );
115
C4::VirtualShelves::AddToShelf( $biblionumber5, $shelf2->shelfnumber, $john_doe{borrowernumber} );
109
116
110
my $shelf3 = {
117
my $shelf3 = Koha::Virtualshelf->new(
111
    shelfname => 'The first public list',
118
    {
112
    category => 2, # public
119
        shelfname => 'The first public list',
113
    sortfield => 'author',
120
        category  => 2, # public
114
};
121
        sortfield => 'author',
115
$shelf3->{shelfnumber} = C4::VirtualShelves::AddShelf( $shelf3, $jane_doe{borrowernumber} );
122
        owner     => $jane_doe{borrowernumber},
123
    }
124
)->store;
116
my $biblionumber6 = _add_biblio('title 6');
125
my $biblionumber6 = _add_biblio('title 6');
117
my $biblionumber7 = _add_biblio('title 7');
126
my $biblionumber7 = _add_biblio('title 7');
118
my $biblionumber8 = _add_biblio('title 8');
127
my $biblionumber8 = _add_biblio('title 8');
119
C4::VirtualShelves::AddToShelf( $biblionumber6, $shelf3->{shelfnumber}, $jane_doe{borrowernumber} );
128
C4::VirtualShelves::AddToShelf( $biblionumber6, $shelf3->shelfnumber, $jane_doe{borrowernumber} );
120
C4::VirtualShelves::AddToShelf( $biblionumber7, $shelf3->{shelfnumber}, $jane_doe{borrowernumber} );
129
C4::VirtualShelves::AddToShelf( $biblionumber7, $shelf3->shelfnumber, $jane_doe{borrowernumber} );
121
C4::VirtualShelves::AddToShelf( $biblionumber8, $shelf3->{shelfnumber}, $jane_doe{borrowernumber} );
130
C4::VirtualShelves::AddToShelf( $biblionumber8, $shelf3->shelfnumber, $jane_doe{borrowernumber} );
122
131
123
my $shelf4 = {
132
my $shelf4 = Koha::Virtualshelf->new(
124
    shelfname => 'my second public list',
133
    {
125
    category => 2, # public
134
        shelfname => 'my second public list',
126
    sortfield => 'title',
135
        category  => 2, # public
127
};
136
        sortfield => 'title',
128
$shelf4->{shelfnumber}  = C4::VirtualShelves::AddShelf( $shelf4, $jane_doe{borrowernumber} );
137
        owner     => $jane_doe{borrowernumber},
138
    }
139
)->store;
129
my $biblionumber9  = _add_biblio('title 9');
140
my $biblionumber9  = _add_biblio('title 9');
130
my $biblionumber10 = _add_biblio('title 10');
141
my $biblionumber10 = _add_biblio('title 10');
131
my $biblionumber11 = _add_biblio('title 11');
142
my $biblionumber11 = _add_biblio('title 11');
132
my $biblionumber12 = _add_biblio('title 12');
143
my $biblionumber12 = _add_biblio('title 12');
133
C4::VirtualShelves::AddToShelf( $biblionumber9,  $shelf4->{shelfnumber}, $jane_doe{borrowernumber} );
144
C4::VirtualShelves::AddToShelf( $biblionumber9,  $shelf4->shelfnumber, $jane_doe{borrowernumber} );
134
C4::VirtualShelves::AddToShelf( $biblionumber10, $shelf4->{shelfnumber}, $jane_doe{borrowernumber} );
145
C4::VirtualShelves::AddToShelf( $biblionumber10, $shelf4->shelfnumber, $jane_doe{borrowernumber} );
135
C4::VirtualShelves::AddToShelf( $biblionumber11, $shelf4->{shelfnumber}, $jane_doe{borrowernumber} );
146
C4::VirtualShelves::AddToShelf( $biblionumber11, $shelf4->shelfnumber, $jane_doe{borrowernumber} );
136
C4::VirtualShelves::AddToShelf( $biblionumber12, $shelf4->{shelfnumber}, $jane_doe{borrowernumber} );
147
C4::VirtualShelves::AddToShelf( $biblionumber12, $shelf4->shelfnumber, $jane_doe{borrowernumber} );
137
148
138
my $shelf5 = {
149
my $shelf5 = Koha::Virtualshelf->new(
139
    shelfname => 'my third private list',
150
    {
140
    category => 1, # private
151
        shelfname => 'my third private list',
141
    sortfield => 'title',
152
        category  => 1, # private
142
};
153
        sortfield => 'title',
143
$shelf5->{shelfnumber} = C4::VirtualShelves::AddShelf( $shelf5, $jane_doe{borrowernumber} );
154
        owner     => $jane_doe{borrowernumber},
155
    }
156
)->store;
144
my $biblionumber13 = _add_biblio('title 13');
157
my $biblionumber13 = _add_biblio('title 13');
145
my $biblionumber14 = _add_biblio('title 14');
158
my $biblionumber14 = _add_biblio('title 14');
146
my $biblionumber15 = _add_biblio('title 15');
159
my $biblionumber15 = _add_biblio('title 15');
147
my $biblionumber16 = _add_biblio('title 16');
160
my $biblionumber16 = _add_biblio('title 16');
148
my $biblionumber17 = _add_biblio('title 17');
161
my $biblionumber17 = _add_biblio('title 17');
149
my $biblionumber18 = _add_biblio('title 18');
162
my $biblionumber18 = _add_biblio('title 18');
150
C4::VirtualShelves::AddToShelf( $biblionumber13, $shelf5->{shelfnumber}, $jane_doe{borrowernumber} );
163
C4::VirtualShelves::AddToShelf( $biblionumber13, $shelf5->shelfnumber, $jane_doe{borrowernumber} );
151
C4::VirtualShelves::AddToShelf( $biblionumber14, $shelf5->{shelfnumber}, $jane_doe{borrowernumber} );
164
C4::VirtualShelves::AddToShelf( $biblionumber14, $shelf5->shelfnumber, $jane_doe{borrowernumber} );
152
C4::VirtualShelves::AddToShelf( $biblionumber15, $shelf5->{shelfnumber}, $jane_doe{borrowernumber} );
165
C4::VirtualShelves::AddToShelf( $biblionumber15, $shelf5->shelfnumber, $jane_doe{borrowernumber} );
153
C4::VirtualShelves::AddToShelf( $biblionumber16, $shelf5->{shelfnumber}, $jane_doe{borrowernumber} );
166
C4::VirtualShelves::AddToShelf( $biblionumber16, $shelf5->shelfnumber, $jane_doe{borrowernumber} );
154
C4::VirtualShelves::AddToShelf( $biblionumber17, $shelf5->{shelfnumber}, $jane_doe{borrowernumber} );
167
C4::VirtualShelves::AddToShelf( $biblionumber17, $shelf5->shelfnumber, $jane_doe{borrowernumber} );
155
C4::VirtualShelves::AddToShelf( $biblionumber18, $shelf5->{shelfnumber}, $jane_doe{borrowernumber} );
168
C4::VirtualShelves::AddToShelf( $biblionumber18, $shelf5->shelfnumber, $jane_doe{borrowernumber} );
156
169
157
C4::VirtualShelves::AddShelf( { shelfname => 'another public list 6', category => 2}, $john_smith{borrowernumber} );
170
for my $i ( 6 .. 15 ) {
158
C4::VirtualShelves::AddShelf( { shelfname => 'another public list 7', category => 2}, $john_smith{borrowernumber} );
171
    Koha::Virtualshelf->new(
159
C4::VirtualShelves::AddShelf( { shelfname => 'another public list 8', category => 2}, $john_smith{borrowernumber} );
172
        {
160
C4::VirtualShelves::AddShelf( { shelfname => 'another public list 9', category => 2}, $john_smith{borrowernumber} );
173
            shelfname => "another public list $i",
161
C4::VirtualShelves::AddShelf( { shelfname => 'another public list 10', category => 2}, $john_smith{borrowernumber} );
174
            category  => 2,
162
C4::VirtualShelves::AddShelf( { shelfname => 'another public list 11', category => 2}, $john_smith{borrowernumber} );
175
            owner     => $john_smith{borrowernumber},
163
C4::VirtualShelves::AddShelf( { shelfname => 'another public list 12', category => 2}, $john_smith{borrowernumber} );
176
        }
164
C4::VirtualShelves::AddShelf( { shelfname => 'another public list 13', category => 2}, $john_smith{borrowernumber} );
177
    )->store;
165
C4::VirtualShelves::AddShelf( { shelfname => 'another public list 14', category => 2}, $john_smith{borrowernumber} );
178
}
166
C4::VirtualShelves::AddShelf( { shelfname => 'another public list 15', category => 2}, $john_smith{borrowernumber} );
167
168
169
179
170
# Set common datatables params
180
# Set common datatables params
171
my %dt_params = (
181
my %dt_params = (
(-)a/t/db_dependent/VirtualShelves.t (-82 / +26 lines)
Lines 5-11 Link Here
5
# Larger modifications by Jonathan Druart and Marcel de Rooy
5
# Larger modifications by Jonathan Druart and Marcel de Rooy
6
6
7
use Modern::Perl;
7
use Modern::Perl;
8
use Test::More tests => 96;
8
use Test::More tests => 56;
9
use MARC::Record;
9
use MARC::Record;
10
10
11
use C4::Biblio qw( AddBiblio DelBiblio );
11
use C4::Biblio qw( AddBiblio DelBiblio );
Lines 47-111 foreach(0..9) { Link Here
47
47
48
use_ok('C4::VirtualShelves');
48
use_ok('C4::VirtualShelves');
49
49
50
#-----------------------TEST AddShelf function------------------------#
50
#-----------------------TEST Virtualshelf constructor------------------------#
51
# usage : $shelfnumber = &AddShelf( $shelfname, $owner, $category);
52
51
53
# creating shelves (could be <10 when names are not unique)
52
# creating shelves (could be <10 when names are not unique)
54
my @shelves;
53
my @shelves;
55
for my $i (0..9){
54
for my $i (0..9){
56
    my $name= randomname();
55
    my $name= randomname();
57
    my $catg= int(rand(2))+1;
56
    my $catg= int(rand(2))+1;
58
    my $ShelfNumber= AddShelf(
57
    my $shelf = eval {
59
        {
58
        Koha::Virtualshelf->new(
60
            shelfname => $name,
59
            {
61
            category  => $catg,
60
                shelfname => $name,
62
        },
61
                category  => $catg,
63
        $borrowernumbers[$i]);
62
                owner     =>$borrowernumbers[$i],
64
63
            }
65
    if($ShelfNumber>-1) {
64
        )->store;
66
        ok($ShelfNumber > -1, "created shelf");   # Shelf creation successful;
65
    };
67
    }
66
    if ( $@ or not $shelf ) {
68
    else {
67
        my $valid_name = Koha::Virtualshelf->new(
69
        my $t= C4::VirtualShelves::_CheckShelfName(
68
            {
70
            $name, $catg, $borrowernumbers[$i], 0);
69
                shelfname => $name,
71
        is($t, 0, "Name clash expected on shelf creation");
70
                category  => $catg,
71
                owner     =>$borrowernumbers[$i],
72
            }
73
        )->is_shelfname_valid;
74
        is( $valid_name, 0, 'If the insert has failed, it should be caused by an invalid shelfname (or maybe not?)' );
75
    } else {
76
        ok($shelf->shelfnumber > -1, "The shelf $i should have been inserted");
72
    }
77
    }
73
    push @shelves, {
78
    push @shelves, {
74
        number => $ShelfNumber,
79
        number => $shelf->shelfnumber,
75
        name   => $name,
80
        name   => $shelf->shelfname,
76
        catg   => $catg,
81
        catg   => $shelf->category,
77
        owner  => $borrowernumbers[$i],
82
        owner  => $borrowernumbers[$i],
78
    }; #also push the errors
83
    };
79
}
80
81
# try to create shelves with duplicate names
82
for my $i (0..9){
83
    if($shelves[$i]->{number}<0) {
84
        ok(1, 'skip duplicate test for earlier name clash');
85
        next;
86
    }
87
    my $shelf = Koha::Virtualshelves->find( $shelves[$i]->{number} );
88
89
    # A shelf name is not per se unique!
90
    if( $shelf->category == 2 ) { #public list: try to create with same name
91
        my $badNumShelf= AddShelf( {
92
            shelfname=> $shelves[$i]->{name},
93
            category => 2
94
        }, $borrowernumbers[$i]);
95
        is($badNumShelf, -1, 'do not create public lists with duplicate names');
96
            #AddShelf returns -1 if name already exist.
97
        DelShelf($badNumShelf) if $badNumShelf>-1; #delete if went wrong..
98
    }
99
    else { #private list, try to add another one for SAME user (owner)
100
        my $badNumShelf= defined($shelf->owner)? AddShelf(
101
            {
102
                shelfname=> $shelves[$i]->{name},
103
                category => 1,
104
            },
105
            $shelf->owner): -1;
106
        is($badNumShelf, -1, 'do not create private lists with duplicate name for same user');
107
        DelShelf($badNumShelf) if $badNumShelf>-1; #delete if went wrong..
108
    }
109
}
84
}
110
85
111
#-----------TEST AddToShelf & GetShelfContents &  DelFromShelf functions--------------#
86
#-----------TEST AddToShelf & GetShelfContents &  DelFromShelf functions--------------#
Lines 147-183 for my $i (0..9){ Link Here
147
    $used{$key}++;
122
    $used{$key}++;
148
}
123
}
149
124
150
#-----------------------TEST ModShelf & Koha::Virtualshelves->find functions/methods------------------------#
151
# usage : ModShelf($shelfnumber, $shelfname, $owner, $category )
152
153
for my $i (0..9){
154
    my $rand = int(rand(9));
155
    my $numA = $shelves[$rand]->{number};
156
    if($numA<0) {
157
        ok(1, 'Skip ModShelf test for shelf -1');
158
        ok(1, 'Skip ModShelf test for shelf -1');
159
        ok(1, 'Skip ModShelf test for shelf -1');
160
        next;
161
    }
162
    my $newname= randomname();
163
    my $shelf = {
164
        shelfname => $newname,
165
        category =>  3-$shelves[$rand]->{catg}, # tric: 1->2 and 2->1
166
    };
167
    #check name change (with category change)
168
    if(C4::VirtualShelves::_CheckShelfName($newname,$shelf->{category},
169
            $shelves[$rand]->{owner}, $numA)) {
170
        ModShelf($numA,$shelf);
171
        my $shelf_b = Koha::Virtualshelves->find( $numA );
172
        is($numA, $shelf_b->shelfnumber, 'modified shelf');
173
        is($shelf->{shelfname}, $shelf_b->shelfname,     '... and name change took');
174
        is($shelf->{category}, $shelf_b->category, '... and category change took');
175
    }
176
    else {
177
        ok(1, "No ModShelf for $newname") for 1..3;
178
    }
179
}
180
181
#----------------------- TEST AddShare ----------------------------------------#
125
#----------------------- TEST AddShare ----------------------------------------#
182
126
183
#first count the number of shares in the table
127
#first count the number of shares in the table
(-)a/t/db_dependent/Virtualshelves.t (+75 lines)
Line 0 Link Here
1
#!/usr/bin/perl
2
3
use Modern::Perl;
4
use Test::More tests => 1;
5
6
use C4::Context;
7
use Koha::DateUtils;
8
use Koha::Virtualshelf;
9
use Koha::Virtualshelves;
10
11
use t::lib::TestBuilder;
12
13
my $dbh = C4::Context->dbh;
14
$dbh->{AutoCommit} = 0;
15
16
$dbh->do(q|DELETE FROM virtualshelves|);
17
18
my $builder = t::lib::TestBuilder->new;
19
20
subtest 'CRUD' => sub {
21
    plan tests => 11;
22
    my $patron = $builder->build({
23
        source => 'Borrower',
24
    });
25
26
    my $number_of_shelves = Koha::Virtualshelves->search->count;
27
28
    is( $number_of_shelves, 0, 'No shelves should exist' );
29
30
    my $shelf = Koha::Virtualshelf->new({
31
            shelfname => "my first shelf",
32
            owner => $patron->{borrowernumber},
33
            category => 1,
34
        }
35
    )->store;
36
37
    is( ref( $shelf ), 'Koha::Virtualshelf', 'The constructor should return a valid object' );
38
39
    $number_of_shelves = Koha::Virtualshelves->search->count;
40
    is( $number_of_shelves, 1, '1 shelf should have been inserted' );
41
    is( $shelf->allow_add, 0, 'The default value for allow_add should be 1' );
42
    is( $shelf->allow_delete_own, 1, 'The default value for allow_delete_own should be 0' );
43
    is( $shelf->allow_delete_other, 0, 'The default value for allow_delete_other should be 0' );
44
    is( output_pref($shelf->created_on), output_pref(dt_from_string), 'The creation time should have been set to today' );
45
46
    my $retrieved_shelf = Koha::Virtualshelves->find( $shelf->shelfnumber );
47
48
    is( $retrieved_shelf->shelfname, $shelf->shelfname, 'Find should correctly return the shelfname' );
49
50
    # Insert with the same name
51
    eval {
52
        $shelf = Koha::Virtualshelf->new({
53
                shelfname => "my first shelf",
54
                owner => $patron->{borrowernumber},
55
                category => 1,
56
            }
57
        )->store;
58
    };
59
    is( ref($@), 'Koha::Exception::DuplicateObject' );
60
    $number_of_shelves = Koha::Virtualshelves->search->count;
61
    is( $number_of_shelves, 1, 'To be sure the number of shelves is still 1' );
62
63
    my $another_patron = $builder->build({
64
        source => 'Borrower',
65
    });
66
67
    $shelf = Koha::Virtualshelf->new({
68
            shelfname => "my first shelf",
69
            owner => $another_patron->{borrowernumber},
70
            category => 1,
71
        }
72
    )->store;
73
    $number_of_shelves = Koha::Virtualshelves->search->count;
74
    is( $number_of_shelves, 2, 'Another patron should be able to create a shelf with an existing shelfname');
75
};
(-)a/virtualshelves/addbybiblionumber.pl (-8 / +14 lines)
Lines 132-146 sub AddBibliosToShelf { Link Here
132
}
132
}
133
133
134
sub HandleNewVirtualShelf {
134
sub HandleNewVirtualShelf {
135
    $shelfnumber = AddShelf( {
135
    my $shelf = eval {
136
        shelfname => $newvirtualshelf,
136
        Koha::Virtualshelf->new(
137
        sortfield => $sortfield,
137
            {
138
        category => $category }, $loggedinuser);
138
                shelfname => $newvirtualshelf,
139
    if($shelfnumber == -1) {
139
                category => $category,
140
        $authorized=0;
140
                sortfield => $sortfield,
141
        $errcode=1; #add failed
141
                owner => $loggedinuser,
142
            }
143
        );
144
    };
145
    if ( $@ or not $shelf ) {
146
        $authorized = 0;
147
        $errcode    = 1;
142
        return;
148
        return;
143
    }
149
    }
150
144
    AddBibliosToShelf($shelfnumber, @biblionumber);
151
    AddBibliosToShelf($shelfnumber, @biblionumber);
145
    #Reload the page where you came from
152
    #Reload the page where you came from
146
    print $query->header;
153
    print $query->header;
147
- 

Return to bug 14544