Bugzilla – Attachment 151658 Details for
Bug 28130
Show list of serial email alerts a patron subscribed to in patron account in OPAC
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 28130: Manage a patron's subscription alerts
Bug-28130-Manage-a-patrons-subscription-alerts.patch (text/plain), 13.22 KB, created by
Biblibre Sandboxes
on 2023-05-25 05:55:07 UTC
(
hide
)
Description:
Bug 28130: Manage a patron's subscription alerts
Filename:
MIME Type:
Creator:
Biblibre Sandboxes
Created:
2023-05-25 05:55:07 UTC
Size:
13.22 KB
patch
obsolete
>From 38e027036d180d8724f130aca249631d83f10e5d Mon Sep 17 00:00:00 2001 >From: Aleisha Amohia <aleishaamohia@hotmail.com> >Date: Tue, 23 May 2023 05:09:10 +0000 >Subject: [PATCH] Bug 28130: Manage a patron's subscription alerts >MIME-Version: 1.0 >Content-Type: text/plain; charset=UTF-8 >Content-Transfer-Encoding: 8bit > >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> >--- > Koha/Patron.pm | 18 +++ > .../prog/en/includes/circ-menu.inc | 3 + > .../en/modules/members/alert-subscriptions.tt | 115 ++++++++++++++++++ > members/alert-subscriptions.pl | 56 +++++++++ > t/db_dependent/Koha/Patron.t | 23 +++- > 5 files changed, 214 insertions(+), 1 deletion(-) > create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/members/alert-subscriptions.tt > create mode 100755 members/alert-subscriptions.pl > >diff --git a/Koha/Patron.pm b/Koha/Patron.pm >index 2a8eecf9f6..e2eab4643a 100644 >--- a/Koha/Patron.pm >+++ b/Koha/Patron.pm >@@ -2490,6 +2490,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 >diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/circ-menu.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/circ-menu.inc >index 9f78956dd3..7c2997413d 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/includes/circ-menu.inc >+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/circ-menu.inc >@@ -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 %] >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/members/alert-subscriptions.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/members/alert-subscriptions.tt >new file mode 100644 >index 0000000000..d087835b5e >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/members/alert-subscriptions.tt >@@ -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 %] › Patrons › 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' %] >diff --git a/members/alert-subscriptions.pl b/members/alert-subscriptions.pl >new file mode 100755 >index 0000000000..82fc894e27 >--- /dev/null >+++ b/members/alert-subscriptions.pl >@@ -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; >diff --git a/t/db_dependent/Koha/Patron.t b/t/db_dependent/Koha/Patron.t >index 5d05a16efd..80f3b663d8 100755 >--- a/t/db_dependent/Koha/Patron.t >+++ b/t/db_dependent/Koha/Patron.t >@@ -19,7 +19,7 @@ > > use Modern::Perl; > >-use Test::More tests => 24; >+use Test::More tests => 25; > use Test::Exception; > use Test::Warn; > >@@ -1498,3 +1498,24 @@ subtest 'update privacy tests' => sub { > is( $old_checkout->borrowernumber, $anon_patron->id, "Checkout is successfully anonymized"); > is( $patron->privacy(), 2, "Patron privacy is successfully updated"); > }; >+ >+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; >+}; >-- >2.30.2
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 28130
:
151550
|
151619
|
151656
|
151657
|
151658
|
151659
|
151814
|
151815
|
153779
|
153780
|
153781
|
153782