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

(-)a/cataloguing/value_builder/marc21_field_083a_authorities.pl (-1 / +221 lines)
Line 0 Link Here
0
- 
1
#!/usr/bin/perl
2
3
# This file is part of Koha.
4
#
5
# Copyright (C) 2025 Dataly Tech
6
#
7
# Koha is free software; you can redistribute it and/or modify it
8
# under the terms of the GNU General Public License as published by
9
# the Free Software Foundation; either version 3 of the License, or
10
# (at your option) any later version.
11
#
12
# Koha is distributed in the hope that it will be useful, but
13
# WITHOUT ANY WARRANTY; without even the implied warranty of
14
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
# GNU General Public License for more details.
16
#
17
# You should have received a copy of the GNU General Public License
18
# along with Koha; if not, see <http://www.gnu.org/licenses>.
19
20
use Modern::Perl;
21
22
use C4::Auth    qw( check_cookie_auth get_template_and_user );
23
use C4::Context qw( preference );
24
use C4::Output  qw( output_html_with_http_headers );
25
26
use Koha::Caches;
27
use Koha::ExternalContent::OCLC;
28
29
use CGI  qw( -utf8 );
30
use JSON qw( from_json to_json );
31
use LWP::UserAgent;
32
33
use YAML;
34
35
my $input = CGI->new;
36
my ($auth_status) =
37
    check_cookie_auth( $input->cookie('CGISESSID'), { catalogue => 1 } );
38
if ( $auth_status ne "ok" ) {
39
    print $input->header( -type => 'text/plain', -status => '403 Forbidden' );
40
    exit 0;
41
}
42
43
my $builder = sub {
44
    my ($params) = @_;
45
46
    my $function_name = $params->{id};
47
48
    my $ddcregex = '^((T([1-6])--([0-9]+)))$|^([0-9]{3})$|^(([0-9]{3})\.([0-9]+))$';
49
50
    my $res = "
51
<script>
52
    function Click$function_name(event) {
53
        event.preventDefault();
54
55
        const ddcregex = /$ddcregex/;
56
57
        const subfield_a = document.getElementById(event.data.id);
58
        const subfield_b = subfield_a.closest(\".sortable_subfield\").querySelector(\"li[id^=subfield083b] input[id^=tag_083_subfield_b_]\");
59
        const subfield_c = subfield_a.closest(\".sortable_subfield\").querySelector(\"li[id^=subfield083c] input[id^=tag_083_subfield_c_]\");
60
        const subfield_1 = subfield_a.closest(\".sortable_subfield\").querySelector(\"li[id^=subfield0831] input[id^=tag_083_subfield_1_]\");
61
62
        subfield_c.style.transition = \"background-color 1000ms linear\";
63
        subfield_1.style.transition = \"background-color 1000ms linear\";
64
65
        if ( ! subfield_a.value ) {
66
            updateContent( subfield_1, \"No DDC number provided\" );
67
            return 1;
68
        } else if ( ! ddcregex.test(subfield_a.value) ) {
69
            updateContent( subfield_1, \"Invalid DDC number provided in subfield \$a\" );
70
            return 1;
71
        } else if ( subfield_b.value && ! ddcregex.test(subfield_b.value) ) {
72
            updateContent( subfield_1, \"Invalid DDC number provided in subfield \$b\" );
73
            return 1;
74
        }
75
76
        if ( subfield_a.value && subfield_b.value ) {
77
            // It's a DDC range, separate the two numbers with a hyphen
78
            ddc_request = subfield_a.value + '-' + subfield_b.value;
79
        } else if ( subfield_a.value && ! subfield_b.value ) {
80
            ddc_request = subfield_a.value;
81
        }
82
83
        const url = \"../cataloguing/plugin_launcher.pl?plugin_name=marc21_field_083a_authorities.pl&ddc=\" + ddc_request;
84
        var request = \$.get(url);
85
86
        request.done( function(response) {
87
            const failregex = />Access denied/;
88
            if ( failregex.test(response) ) {
89
                updateContent( subfield_1, \"Access denied, you need at least the \\\"catalogue\\\" and \\\"editauthorities\\\" user permissions\" );
90
                return 1;
91
            } else {
92
                const json = JSON.parse(response)[0];
93
                if ( json.info ) {
94
                    updateContent( subfield_1, json.info );
95
                    return 1;
96
                } else {
97
                    updateContent( subfield_1, json.ld_url );
98
                    updateContent( subfield_c, json.ld_descr );
99
                }
100
            }
101
            return 0;
102
        });
103
    }
104
105
    // Credit to: https://stackoverflow.com/a/62468495
106
    function updateContent( element, content ) {
107
        // update content
108
        element.value = content;
109
        // change the background color (will trigger the CSS configured transition)
110
        element.style.backgroundColor = \"yellow\";
111
        // change the background color back (with a delay equal to transition length)
112
        setTimeout(() => { element.style.backgroundColor = \"white\"; }, 2000);
113
    }
114
</script>
115
";
116
    return $res;
117
};
118
119
my $launcher = sub {
120
    my ($params)   = @_;
121
    my $input      = $params->{cgi};
122
    my $ddc_number = $input->param('ddc');
123
124
    my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
125
        {
126
            template_name => "cataloguing/value_builder/ajax.tt",
127
            query         => $input,
128
            type          => "intranet",
129
            flagsrequired => { editauthorities => 1 },
130
        }
131
    );
132
133
    my @ret;
134
    my $msg;
135
    my $info     = undef;
136
    my $enabled  = C4::Context->preference('OCLCDeweyLinkedDataAPI') ? 1 : 0;
137
    my $language = C4::Context->preference('OCLCDeweyLinkedDataLanguage');
138
139
    if ( not $enabled ) {
140
        $info = 'Please enable the OCLCDeweyLinkedDataAPI System Preference in order to use this Framework Plugin';
141
    }
142
143
    my $access_token;
144
    if ( not $info ) {
145
146
        my $scope = 'deweyLinkedData';
147
148
        ( $access_token, $msg ) = Koha::ExternalContent::OCLC->get_access_token(
149
            {
150
                scope => $scope,
151
            }
152
        );
153
        if ( not $access_token ) {
154
            $info = "Cannot obtain API token ($msg)";
155
        }
156
157
    }
158
159
    # Trim leading 'T' (uppercase 't') from DDC number (or range) before looking it up
160
    my $ddc_lookup = $ddc_number =~ s/^T//r;
161
162
    my $ddc_uri;
163
    if ( not $info ) {
164
165
        ( $ddc_uri, $msg ) = Koha::ExternalContent::OCLC->get_ddc_uri(
166
            {
167
                access_token => $access_token,
168
                ddc_number   => $ddc_lookup
169
            }
170
        );
171
        if ( not $ddc_uri and $msg eq 'Unauthorized' ) {
172
            $info = 'The API access token has expired';
173
        } elsif ( $ddc_uri eq '' ) {
174
            $info = "No Dewey Linked Data URI found for DDC '$ddc_number'";
175
        }
176
    }
177
178
    my $ddc_url;
179
    if ( not $info ) {
180
181
        ( $ddc_url, $msg ) = Koha::ExternalContent::OCLC->get_ddc_url(
182
            {
183
                access_token => $access_token,
184
                ddc_number   => $ddc_lookup
185
            }
186
        );
187
        if ( not $ddc_url and $msg eq 'Unauthorized' ) {
188
            $info = 'The API access token has expired';
189
        } elsif ( $ddc_url eq '' ) {
190
            $info = "No Dewey Linked Data URL found for DDC '$ddc_number'";
191
        }
192
193
    }
194
195
    my $ddc_descr;
196
    if ( not $info ) {
197
198
        ( $ddc_descr, $msg ) = Koha::ExternalContent::OCLC->get_ddc_description(
199
            {
200
                access_token => $access_token,
201
                ddc_uri      => $ddc_uri,
202
                language     => $language,
203
            }
204
        );
205
        if ( not $ddc_descr and $msg eq 'Unauthorized' ) {
206
            $info = 'The API access token has expired';
207
        } elsif ( not defined $ddc_descr ) {
208
            $info = "No Dewey Linked Data Description found for DDC URI '$ddc_uri'";
209
        }
210
211
    }
212
213
    push @ret, {
214
        info     => $info,
215
        ld_url   => $ddc_url,
216
        ld_descr => $ddc_descr,
217
    };
218
    output_html_with_http_headers $input, $cookie, to_json( \@ret, { utf8 => 1 } ), 'json';
219
};
220
221
return { builder => $builder, launcher => $launcher };

Return to bug 40310