Bug 13757: (followup) Staff interface changes
This patch adds proper extended attributes display and handling on the patron modifications moderation page (members-update.pl). It also adds changes checking to the opac-memberentry.pl page so it only saves a modification request if there are changes (it only checked regular fields and not the extended ones). Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Signed-off-by: Nick Clemens <nick@bywatersolutions.com> Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
This commit is contained in:
parent
bfa3f41032
commit
925e664f42
4 changed files with 55 additions and 23 deletions
|
@ -62,10 +62,17 @@
|
||||||
[% CASE 'altcontactcountry' %]<span>Alternate contact: Country</span>
|
[% CASE 'altcontactcountry' %]<span>Alternate contact: Country</span>
|
||||||
[% CASE 'altcontactphone' %]<span>Alternate contact: Phone</span>
|
[% CASE 'altcontactphone' %]<span>Alternate contact: Phone</span>
|
||||||
[% CASE 'smsalertnumber' %]<span>SMS alert number</span>
|
[% CASE 'smsalertnumber' %]<span>SMS alert number</span>
|
||||||
|
[% CASE 'extended_attributes' %]<span>Additional attributes and identifiers</span>
|
||||||
[% CASE %][% field %]
|
[% CASE %][% field %]
|
||||||
[% END %]
|
[% END %]
|
||||||
[% END %]
|
[% END %]
|
||||||
|
|
||||||
|
[% BLOCK display_extended_attributes %]
|
||||||
|
[% FOREACH attr IN attributes %]
|
||||||
|
<span>[% attr.code %]: [% IF pending %][% attr.value %][% ELSE %][% attr.attribute %][% END %]</span><br/>
|
||||||
|
[% END %]
|
||||||
|
[% END %]
|
||||||
|
|
||||||
<div id="breadcrumbs"><a href="/cgi-bin/koha/mainpage.pl">Home</a> › <a href="/cgi-bin/koha/members/members-home.pl">Patrons</a> › Update patron records</div>
|
<div id="breadcrumbs"><a href="/cgi-bin/koha/mainpage.pl">Home</a> › <a href="/cgi-bin/koha/members/members-home.pl">Patrons</a> › Update patron records</div>
|
||||||
|
|
||||||
<div id="doc2" class="yui-t7">
|
<div id="doc2" class="yui-t7">
|
||||||
|
@ -111,6 +118,9 @@
|
||||||
[% ELSIF key == 'branchcode' %]
|
[% ELSIF key == 'branchcode' %]
|
||||||
<td>[% Branches.GetName( borrowers.$borrowernumber.$key ) %]</td>
|
<td>[% Branches.GetName( borrowers.$borrowernumber.$key ) %]</td>
|
||||||
<td>[% Branches.GetName( pm.$key ) %]</td>
|
<td>[% Branches.GetName( pm.$key ) %]</td>
|
||||||
|
[% ELSIF ( key == 'extended_attributes' ) %]
|
||||||
|
<td>[% PROCESS display_extended_attributes attributes=borrowers.$borrowernumber.$key %]</td>
|
||||||
|
<td>[% PROCESS display_extended_attributes attributes=pm.$key pending=1 %]</td>
|
||||||
[% ELSE %]
|
[% ELSE %]
|
||||||
<td>[% borrowers.$borrowernumber.$key %]</td>
|
<td>[% borrowers.$borrowernumber.$key %]</td>
|
||||||
<td>[% pm.$key %]</td>
|
<td>[% pm.$key %]</td>
|
||||||
|
|
|
@ -911,8 +911,8 @@
|
||||||
[% IF ( pa.type.authorised_value_category ) %]
|
[% IF ( pa.type.authorised_value_category ) %]
|
||||||
<select id="[% form_id %]" name="patron_attribute_value">
|
<select id="[% form_id %]" name="patron_attribute_value">
|
||||||
<option value=""></option>
|
<option value=""></option>
|
||||||
[% FOREACH auth_val IN AuthorisedValues.Get( pa.type.authorised_value_category, pa_value.value || '', 1 ) %]
|
[% FOREACH auth_val IN AuthorisedValues.Get( pa.type.authorised_value_category, 1 ) %]
|
||||||
[% IF ( auth_val.selected ) %]
|
[% IF ( auth_val.authorised_value == pa_value.value ) %]
|
||||||
<option value="[% auth_val.authorised_value %]" selected="selected">
|
<option value="[% auth_val.authorised_value %]" selected="selected">
|
||||||
[%# Yes, lib; GetAuthorisedValues takes care of intelligently setting this from lib_opac %]
|
[%# Yes, lib; GetAuthorisedValues takes care of intelligently setting this from lib_opac %]
|
||||||
[% auth_val.lib %]
|
[% auth_val.lib %]
|
||||||
|
@ -931,22 +931,12 @@
|
||||||
[% IF ( pa.type.repeatable ) %]
|
[% IF ( pa.type.repeatable ) %]
|
||||||
<a href="#" class="clone-attribute">New</a>
|
<a href="#" class="clone-attribute">New</a>
|
||||||
[% END %]
|
[% END %]
|
||||||
[% IF ( pa.type.password_allowed ) %]
|
|
||||||
</li><li><label for="[% form_id %]_password">Password:</label>
|
|
||||||
<input type="password" maxlength="64" value="[% pa_value.password %]" id="[% form_id %]_password" name="patron_attribute_password" />
|
|
||||||
[% ELSE %]
|
|
||||||
[%# To keep the form inputs lined up in the POST %]
|
|
||||||
<input type="hidden" name="patron_attribute_password" value="" />
|
|
||||||
[% END %]
|
|
||||||
[% ELSE %]
|
[% ELSE %]
|
||||||
[% IF ( pa.type.authorised_value_category ) %]
|
[% IF ( pa.type.authorised_value_category ) %]
|
||||||
[% AuthorisedValues.GetByCode( pa.type.authorised_value, pa_value.value, 1 ) %]
|
[% AuthorisedValues.GetByCode( pa.type.authorised_value, pa_value.value, 1 ) %]
|
||||||
[% ELSE %]
|
[% ELSE %]
|
||||||
[% pa_value.value | html_line_break %]
|
[% pa_value.value | html_line_break %]
|
||||||
[% END %]
|
[% END %]
|
||||||
[% IF ( pa_value.password ) %]
|
|
||||||
(Password: *******)
|
|
||||||
[% END %]
|
|
||||||
[% END %]
|
[% END %]
|
||||||
</li>
|
</li>
|
||||||
[% END %]
|
[% END %]
|
||||||
|
|
|
@ -16,14 +16,16 @@
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with Koha; if not, see <http://www.gnu.org/licenses>.
|
# along with Koha; if not, see <http://www.gnu.org/licenses>.
|
||||||
|
|
||||||
use strict;
|
use Modern::Perl;
|
||||||
use warnings;
|
|
||||||
|
|
||||||
use CGI qw ( -utf8 );
|
use CGI qw ( -utf8 );
|
||||||
|
|
||||||
use C4::Auth;
|
use C4::Auth;
|
||||||
use C4::Output;
|
use C4::Output;
|
||||||
use C4::Context;
|
use C4::Context;
|
||||||
use C4::Members;
|
use C4::Members;
|
||||||
|
use C4::Members::Attributes qw( GetBorrowerAttributes );
|
||||||
|
use Koha::Patron::Attributes;
|
||||||
use Koha::Patron::Modifications;
|
use Koha::Patron::Modifications;
|
||||||
|
|
||||||
my $query = new CGI;
|
my $query = new CGI;
|
||||||
|
@ -51,14 +53,19 @@ my $pending_modifications =
|
||||||
|
|
||||||
my $borrowers;
|
my $borrowers;
|
||||||
foreach my $pm (@$pending_modifications) {
|
foreach my $pm (@$pending_modifications) {
|
||||||
$borrowers->{ $pm->{'borrowernumber'} } =
|
$borrowers->{ $pm->{borrowernumber} }
|
||||||
GetMember( borrowernumber => $pm->{'borrowernumber'} );
|
= GetMember( borrowernumber => $pm->{borrowernumber} );
|
||||||
|
my $patron_attributes = Koha::Patron::Attributes->search(
|
||||||
|
{ borrowernumber => $pm->{borrowernumber} } );
|
||||||
|
$borrowers->{ $pm->{'borrowernumber'} }->{extended_attributes}
|
||||||
|
= $patron_attributes;
|
||||||
}
|
}
|
||||||
|
|
||||||
$template->param(
|
$template->param(
|
||||||
PendingModifications => $pending_modifications,
|
PendingModifications => $pending_modifications,
|
||||||
borrowers => $borrowers,
|
borrowers => $borrowers
|
||||||
);
|
);
|
||||||
|
|
||||||
output_html_with_http_headers $query, $cookie, $template->output;
|
output_html_with_http_headers $query, $cookie, $template->output;
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
|
@ -21,12 +21,13 @@ use CGI qw ( -utf8 );
|
||||||
use Digest::MD5 qw( md5_base64 md5_hex );
|
use Digest::MD5 qw( md5_base64 md5_hex );
|
||||||
use Encode qw( encode );
|
use Encode qw( encode );
|
||||||
use JSON;
|
use JSON;
|
||||||
use List::MoreUtils qw( each_array uniq );
|
use List::MoreUtils qw( any each_array uniq );
|
||||||
use String::Random qw( random_string );
|
use String::Random qw( random_string );
|
||||||
|
|
||||||
use C4::Auth;
|
use C4::Auth;
|
||||||
use C4::Output;
|
use C4::Output;
|
||||||
use C4::Members;
|
use C4::Members;
|
||||||
|
use C4::Members::Attributes qw( GetBorrowerAttributes );
|
||||||
use C4::Form::MessagingPreferences;
|
use C4::Form::MessagingPreferences;
|
||||||
use Koha::Patrons;
|
use Koha::Patrons;
|
||||||
use Koha::Patron::Modification;
|
use Koha::Patron::Modification;
|
||||||
|
@ -251,7 +252,9 @@ elsif ( $action eq 'update' ) {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
my %borrower_changes = DelUnchangedFields( $borrowernumber, %borrower );
|
my %borrower_changes = DelUnchangedFields( $borrowernumber, %borrower );
|
||||||
if (%borrower_changes) {
|
my $extended_attributes_changes = ExtendedAttributesMatch( $borrowernumber, $attributes );
|
||||||
|
|
||||||
|
if ( %borrower_changes || $extended_attributes_changes ) {
|
||||||
( $template, $borrowernumber, $cookie ) = get_template_and_user(
|
( $template, $borrowernumber, $cookie ) = get_template_and_user(
|
||||||
{
|
{
|
||||||
template_name => "opac-memberentry-update-submitted.tt",
|
template_name => "opac-memberentry-update-submitted.tt",
|
||||||
|
@ -283,6 +286,7 @@ elsif ( $action eq 'update' ) {
|
||||||
action => 'edit',
|
action => 'edit',
|
||||||
nochanges => 1,
|
nochanges => 1,
|
||||||
borrower => GetMember( borrowernumber => $borrowernumber ),
|
borrower => GetMember( borrowernumber => $borrowernumber ),
|
||||||
|
patron_attribute_classes => GeneratePatronAttributesForm( undef, $attributes ),
|
||||||
csrf_token => Koha::Token->new->generate_csrf({
|
csrf_token => Koha::Token->new->generate_csrf({
|
||||||
id => Encode::encode( 'UTF-8', $borrower->{userid} ),
|
id => Encode::encode( 'UTF-8', $borrower->{userid} ),
|
||||||
secret => md5_base64( Encode::encode( 'UTF-8', C4::Context->config('pass') ) ),
|
secret => md5_base64( Encode::encode( 'UTF-8', C4::Context->config('pass') ) ),
|
||||||
|
@ -468,6 +472,28 @@ sub DelEmptyFields {
|
||||||
return %borrower;
|
return %borrower;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub ExtendedAttributesMatch {
|
||||||
|
my ( $borrowernumber, $entered_attributes ) = @_;
|
||||||
|
|
||||||
|
my @patron_attributes_arr = GetBorrowerAttributes( $borrowernumber, 1 );
|
||||||
|
my $patron_attributes = $patron_attributes_arr[0];
|
||||||
|
|
||||||
|
if ( scalar @{$entered_attributes} != scalar @{$patron_attributes} ) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach my $attr ( @{$patron_attributes} ) {
|
||||||
|
next if any {
|
||||||
|
$_->{code} eq $attr->{code} and $_->{value} eq $attr->{value};
|
||||||
|
}
|
||||||
|
@{$entered_attributes};
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
sub GeneratePatronAttributesForm {
|
sub GeneratePatronAttributesForm {
|
||||||
my ( $borrowernumber, $entered_attributes ) = @_;
|
my ( $borrowernumber, $entered_attributes ) = @_;
|
||||||
|
|
||||||
|
@ -538,9 +564,8 @@ sub ParsePatronAttributes {
|
||||||
|
|
||||||
my @codes = $cgi->multi_param('patron_attribute_code');
|
my @codes = $cgi->multi_param('patron_attribute_code');
|
||||||
my @values = $cgi->multi_param('patron_attribute_value');
|
my @values = $cgi->multi_param('patron_attribute_value');
|
||||||
my @passwords = $cgi->multi_param('patron_attribute_password');
|
|
||||||
|
|
||||||
my $ea = each_array( @codes, @values, @passwords );
|
my $ea = each_array( @codes, @values );
|
||||||
my @attributes;
|
my @attributes;
|
||||||
my %dups = ();
|
my %dups = ();
|
||||||
|
|
||||||
|
@ -549,7 +574,7 @@ sub ParsePatronAttributes {
|
||||||
next if exists $dups{$code}->{$value};
|
next if exists $dups{$code}->{$value};
|
||||||
$dups{$code}->{$value} = 1;
|
$dups{$code}->{$value} = 1;
|
||||||
|
|
||||||
push @attributes, { code => $code, value => $value, password => $password };
|
push @attributes, { code => $code, value => $value };
|
||||||
}
|
}
|
||||||
|
|
||||||
return \@attributes;
|
return \@attributes;
|
||||||
|
|
Loading…
Reference in a new issue