Bug 28130: Manage a patron's subscription alerts

This enhancement adds an 'Alert subscriptions' page to a patron account to easily view or cancel email alerts the patron has subscribed to.

To test:

1. Go to Cataloging. Create a biblio.
2. Go to Tools -> Notices & slips. Create a notice under the "Serials (new issue)" module, if you don't already have one.
3. Go to Serials. Create a subscription. Link the biblio you just created. Add info like the callnumber, location, library. Choose your notice under Patron notification. Fill out the remaining details and save your subscription.
4. Open this record in the OPAC. Under the Subscriptions tab, click the button to "Subscribe to email notification on new issues"
5. Go back to the staff interface. Go to your patron account.
6. Notice there is a new "Alert subscriptions" tab in the left sidebar menu. The number in brackets should say 1, for the subscription you just enabled email alerts.
7. Click into the page. Confirm your subscription shows in the table.
8. Click the button to unsubscribe. A confirmation should pop up. Confirm you can cancel the unsubscribe action. Then confirm you can unsubscribe using this button.
9. Confirm tests pass t/db_dependent/Koha/Patron.t

Sponsored-by: Bibliotheksservice-Zentrum Baden-Wuerttemberg
Signed-off-by: Christian Stelzenmüller <christian.stelzenmueller@bsz-bw.de>
Signed-off-by: Sam Lau <samalau@gmail.com>
Signed-off-by: Nick Clemens <nick@bywatersolutions.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
This commit is contained in:
Aleisha Amohia 2023-05-23 05:09:10 +00:00 committed by Tomas Cohen Arazi
parent ba298ebdf9
commit 84e5c570db
Signed by: tomascohen
GPG key ID: 0A272EA1B2F3C15F
5 changed files with 214 additions and 1 deletions

View file

@ -2699,6 +2699,24 @@ sub get_savings {
)->next->get_column('total_savings') // 0;
}
=head3 alert_subscriptions
my $subscriptions = $patron->alert_subscriptions;
Return a Koha::Subscriptions object containing subscriptions for which the patron has subscribed to email alerts.
=cut
sub alert_subscriptions {
my ( $self ) = @_;
my $schema = Koha::Database->new->schema;
my @alerts = $schema->resultset('Alert')->search({ borrowernumber => $self->borrowernumber });
my @subscription_ids = map { $_->externalid } @alerts;
return Koha::Subscriptions->search({ subscriptionid => \@subscription_ids });
}
=head2 Internal methods
=head3 _type

View file

@ -185,6 +185,9 @@
[% IF Koha.Preference('UseRecalls') && CAN_user_recalls %]
[% IF recallsview %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/members/recallshistory.pl?borrowernumber=[% patron.borrowernumber | uri %]">Recalls history</a></li>
[% END %]
[% IF ( CAN_user_serials && patron.alert_subscriptions.count ) %]
[% IF alertsview %]<li class="active">[% ELSE %]<li>[% END %]<a href="/cgi-bin/koha/members/alert-subscriptions.pl?borrowernumber=[% patron.borrowernumber | uri %]">Alert subscriptions ([% patron.alert_subscriptions.count | html %])</a></li>
[% END %]
</ul></div>
[% IF patronimages && CAN_user_tools_batch_upload_patron_images %]

View file

@ -0,0 +1,115 @@
[% USE raw %]
[% USE Asset %]
[% USE AuthorisedValues %]
[% USE Branches %]
[% SET footerjs = 1 %]
[% INCLUDE 'doc-head-open.inc' %]
<title>Alert subscriptions for [% INCLUDE 'patron-title.inc' no_html = 1 %] &rsaquo; Patrons &rsaquo; Koha</title>
[% INCLUDE 'doc-head-close.inc' %]
</head>
<body id="pat_alert_subscriptions" class="pat">
[% WRAPPER 'header.inc' %]
[% INCLUDE 'patron-search-header.inc' %]
[% END %]
[% WRAPPER 'sub-header.inc' %]
[% WRAPPER breadcrumbs %]
[% WRAPPER breadcrumb_item %]
<a href="/cgi-bin/koha/members/members-home.pl">Patrons</a>
[% END %]
[% WRAPPER breadcrumb_item %]
<a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% patron.borrowernumber | uri %]">[% INCLUDE 'patron-title.inc' %]</a>
[% END %]
[% WRAPPER breadcrumb_item bc_active= 1 %]
<span>Alert subscriptions</span>
[% END %]
[% END #/ WRAPPER breadcrumbs %]
[% END #/ WRAPPER sub-header.inc %]
<div class="main container-fluid">
<div class="row">
<div class="col-sm-10 col-sm-push-2">
<main>
[% INCLUDE 'members-toolbar.inc' %]
<h1>Alert subscriptions</h1>
[% IF patron.alert_subscriptions.count %]
<div class="page-section">
<table id="subscriptions">
<thead>
<tr>
<th>ISSN</th>
<th>Title</th>
<th>Library</th>
<th>Location</th>
<th>Call number</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
[% FOREACH sub IN patron.alert_subscriptions %]
<tr>
<td>
[% IF sub.biblio.biblioitem.issn %][% sub.biblio.biblioitem.issn | html %][% END %]
</td>
<td>
<a href="/cgi-bin/koha/serials/subscription-detail.pl?subscriptionid=[% sub.subscriptionid | uri %]" class="button" title="subscription detail">[% sub.biblio.title | html %] [% sub.biblio.subtitle | html %]</a>
</td>
<td>
[% IF ( sub.branchcode ) %][% Branches.GetName( sub.branchcode ) | html %][% END %]
</td>
<td>
[% IF ( sub.location ) %][% AuthorisedValues.GetDescriptionByKohaField( kohafield => 'items.location', authorised_value => sub.location ) | html %][% END %]
</td>
<td>
[% IF ( sub.callnumber ) %][% sub.callnumber | html %][% END %]
</td>
<td class="actions">
<form action="/cgi-bin/koha/members/alert-subscriptions.pl" method="post" class="unsubscribe" data-title="[% sub.biblio.title | html %] [% sub.biblio.subtitle | html %]"data-patron="[% INCLUDE 'patron-title.inc' no_html = 1 %]">
<input type="hidden" name="subscription_id" value="[% sub.subscriptionid | html %]">
<input type="hidden" name="borrowernumber" value="[% patron.borrowernumber | html %]">
<button type="submit" class="btn btn-default btn-sm"><i class="fa fa-times"></i> Unsubscribe from email alerts</button>
</form>
</td>
</tr>
[% END %]
</tbody>
</table>
</div> <!-- /.page-section -->
[% ELSE %]
<div class="dialog message">
<p>This patron has not subscribed to email alerts for any subscriptions.</p>
</div>
[% END %]
</main>
</div> <!-- /.col-sm-10.col-sm-push-2 -->
<div class="col-sm-2 col-sm-pull-10">
<aside>
[% INCLUDE 'circ-menu.inc' %]
</aside>
</div> <!-- /.col-sm-2.col-sm-pull-10 -->
</div> <!-- /.row -->
[% MACRO jsinclude BLOCK %]
[% INCLUDE 'str/members-menu.inc' %]
[% Asset.js("js/members-menu.js") | $raw %]
[% INCLUDE 'datatables.inc' %]
<script>
$(document).ready(function() {
$("#subscriptions").dataTable($.extend(true, {}, dataTablesDefaults, {
}));
$(".unsubscribe").submit(function(){
var patron = $(this).data('patron');
var title = $(this).data('title');
return confirmDelete(__("Are you sure you want to unsubscribe %s from email alerts for %s?").format(patron, title));
});
});
</script>
[% END %]
[% INCLUDE 'intranet-bottom.inc' %]

56
members/alert-subscriptions.pl Executable file
View file

@ -0,0 +1,56 @@
#!/usr/bin/perl
# This file is part of Koha.
#
# Copyright 2023 Aleisha Amohia <aleisha@catalyst.net.nz>
#
# Koha is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# Koha is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Koha; if not, see <http://www.gnu.org/licenses>.
use Modern::Perl;
use CGI qw ( -utf8 );
use C4::Auth qw( get_template_and_user );
use C4::Context;
use C4::Output qw( output_and_exit_if_error output_and_exit output_html_with_http_headers );
use Koha::Patrons;
my $input = CGI->new;
my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
{ template_name => "members/alert-subscriptions.tt",
query => $input,
type => "intranet",
flagsrequired => { serials => '*' },
}
);
my $borrowernumber = $input->param('borrowernumber');
my $logged_in_user = Koha::Patrons->find( $loggedinuser );
my $patron = Koha::Patrons->find( $borrowernumber );
output_and_exit_if_error( $input, $cookie, $template, { module => 'members', logged_in_user => $logged_in_user, current_patron => $patron } );
my $subscription_id = $input->param('subscription_id');
if ( $subscription_id ) {
my $subscription = Koha::Subscriptions->find( $subscription_id );
$subscription->remove_subscriber( $patron );
print $input->redirect("/cgi-bin/koha/members/alert-subscriptions.pl?borrowernumber=".$borrowernumber);
}
$template->param(
patron => $patron,
alertsview => 1,
);
output_html_with_http_headers $input, $cookie, $template->output;

View file

@ -19,7 +19,7 @@
use Modern::Perl;
use Test::More tests => 27;
use Test::More tests => 28;
use Test::Exception;
use Test::Warn;
@ -1929,3 +1929,24 @@ subtest 'update privacy tests' => sub {
$schema->storage->txn_rollback;
};
subtest 'alert_subscriptions tests' => sub {
plan tests => 3;
my $patron = $builder->build_object({ class => 'Koha::Patrons' });
my $subscription1 = $builder->build_object({ class => 'Koha::Subscriptions' });
$subscription1->add_subscriber( $patron );
my $subscription2 = $builder->build_object({ class => 'Koha::Subscriptions' });
$subscription2->add_subscriber( $patron );
my @subscriptions = $patron->alert_subscriptions->as_list;
is( @subscriptions, 2, "Number of patron's subscribed alerts successfully fetched" );
is( $subscriptions[0]->subscriptionid, $subscription1->subscriptionid, "First subscribed alert is correct" );
is( $subscriptions[1]->subscriptionid, $subscription2->subscriptionid, "Second subscribed alert is correct" );
$patron->discard_changes;
};