1 package OpenILS::WWW::EGKPacLoader;
2 use base 'OpenILS::WWW::EGCatLoader';
3 use strict; use warnings;
5 use Apache2::Const -compile => qw(OK HTTP_BAD_REQUEST);
6 use OpenSRF::Utils::Logger qw/$logger/;
7 use OpenILS::Application::AppUtils;
8 use OpenILS::Utils::CStoreEditor qw/:funcs/;
9 my $U = 'OpenILS::Application::AppUtils';
12 # -----------------------------------------------------------------------------
13 # Override our parent's load() sub so we can do kpac-specific path routing.
14 # -----------------------------------------------------------------------------
18 $self->init_ro_object_cache;
20 my $stat = $self->load_common;
21 return $stat unless $stat == Apache2::Const::OK;
23 $self->load_kpac_config;
25 my $path = $self->apache->path_info;
26 ($self->ctx->{page} = $path) =~ s#.*/(.*)#$1#g;
28 return $self->load_simple("home") if $path =~ m|kpac/home|;
29 return $self->load_simple("category") if $path =~ m|kpac/category|;
30 return $self->load_kpac_rresults if $path =~ m|kpac/results|;
31 return $self->load_record(no_search => 1) if $path =~ m|kpac/record|;
32 return $self->load_library if $path =~ m|kpac/library|;
34 # ----------------------------------------------------------------
35 # Everything below here requires SSL
36 # ----------------------------------------------------------------
37 return $self->redirect_ssl unless $self->cgi->https;
39 #logic added to resolve path-matching conflict
40 if ($path =~ m|kpac/getit_results|) {
41 return $self->load_getit_results;
42 } elsif ($path =~ m|kpac/getit|) {
43 return $self->load_getit;
46 # ----------------------------------------------------------------
47 # Everything below here requires authentication
48 # ----------------------------------------------------------------
49 return $self->redirect_auth unless $self->editor->requestor;
53 return Apache2::Const::OK;
56 sub load_kpac_rresults {
59 # The redirect-to-record-details-on-single-hit logic
60 # leverages the opac_root to determine the record detail
61 # page. Replace it temporarily for our purposes.
62 my $tpac_root = $self->ctx->{opac_root};
63 $self->ctx->{opac_root} = $self->ctx->{kpac_root};
65 my $stat = $self->load_rresults;
66 $self->ctx->{opac_root} = $tpac_root;
74 my $rec_id = $ctx->{page_args}->[0];
75 my $bbag_id = $self->cgi->param('bookbag');
76 my $action = $self->cgi->param('action') || '';
78 # first load the record
79 my $stat = $self->load_record(no_search => 1);
80 return $stat unless $stat == Apache2::Const::OK;
82 $self->ctx->{page} = 'getit'; # repair the page
84 return $self->save_item_to_bookbag($rec_id, $bbag_id) if $action eq 'save';
85 return $self->login_and_place_hold($rec_id) if $action eq 'hold';
87 # if the user is logged in, fetch his bookbags
89 $ctx->{bookbags} = $self->editor->search_container_biblio_record_entry_bucket([
90 { owner => $ctx->{user}->id,
93 { order_by => {cbreb => 'name'},
94 limit => $self->cgi->param('bbag_limit') || 100
99 # If user is logged in, get default hold pickup and notification info
101 my $set_map = $self->ctx->{user_setting_map};
102 if ($$set_map{'opac.default_pickup_location'}) {
103 $ctx->{default_pickup_lib} = $$set_map{'opac.default_pickup_location'};
105 if ($$set_map{'opac.default_phone'}) {
106 $ctx->{default_phone} = $$set_map{'opac.default_phone'};
108 if ($$set_map{'opac.hold_notify'}) {
109 $ctx->{notify_method} = $$set_map{'opac.hold_notify'};
113 $self->ctx->{page} = 'getit'; # repair the page
114 return Apache2::Const::OK;
117 sub login_and_place_hold {
120 my $ctx = $self->ctx;
121 my $username = $self->cgi->param('username');
122 my $password = $self->cgi->param('password');
123 my $pickup_lib = $self->cgi->param('pickup_lib');
125 return Apache2::Const::HTTP_BAD_REQUEST
126 unless $pickup_lib =~ /^\d+$/;
128 #If a pickup library hasn't been selected, reload page
129 if ($pickup_lib == '0') {
130 return $self->load_login;
133 my $new_uri = $self->apache->unparsed_uri;
134 my $sep = ($new_uri =~ /\?/) ? '&' : '?';
137 # First, log the user in and return to
138 $self->apache->log->info("kpac: logging in $username");
140 # TODO: let user know username/password is required..
141 return Apache2::Const::OK unless $username and $password;
143 $new_uri .= "${sep}pickup_lib=$pickup_lib&action=hold";
144 $self->cgi->param('redirect_to', $new_uri);
145 return $self->load_login;
149 $self->apache->log->info("kpac: placing hold for $bre_id");
151 $new_uri =~ s/getit/getit_results/g;
152 $self->cgi->param('hold_target', $bre_id);
153 $self->cgi->param('hold_type', 'T');
154 $self->cgi->param('part', ''); # needed even if unused
156 my $stat = $self->load_place_hold;
158 $self->apache->log->info("kpac: place hold returned $stat");
160 return $stat unless $stat == Apache2::Const::OK;
162 my $hdata = $ctx->{hold_data}->[0]; # only 1 hold placed
163 if (my $hold_id = $hdata ? $hdata->{hold_success} : undef) {
165 $self->apache->log->info("kpac: place hold succeeded");
166 $new_uri .= "${sep}hold=$hold_id";
169 $self->apache->log->info("kpac: place hold failed : " . $ctx->{hold_failed_event});
170 $new_uri .= "${sep}hold_failed=1";
174 $self->apache->log->info("kpac: place hold redirecting to: $new_uri");
175 return $self->generic_redirect($new_uri);
178 sub save_item_to_bookbag {
181 my $bookbag_id = shift;
184 # save to existing bookbag
185 $self->cgi->param('record', $rec_id);
186 my $stat = $self->load_myopac_bookbag_update('add_rec', $bookbag_id);
187 # TODO: check for failure
188 (my $new_uri = $self->apache->unparsed_uri) =~ s/getit/getit_results/g;
189 $new_uri .= ($new_uri =~ /\?/) ? "&list=$bookbag_id" : "?list=$bookbag_id";
190 return $self->generic_redirect($new_uri);
193 # save to anonymous list
195 # set some params assumed to exist for load_mylist_add
196 $self->cgi->param('record', $rec_id);
197 (my $new_uri = $self->apache->unparsed_uri) =~ s/getit/getit_results/g;
198 $new_uri .= ($new_uri =~ /\?/) ? '&list=anon' : '?list=anon';
199 $self->cgi->param('redirect_to', $new_uri);
201 return $self->load_mylist_add;
204 return Apache2::Const::HTTP_BAD_REQUEST;
208 sub load_getit_results {
210 my $ctx = $self->ctx;
211 my $e = $self->editor;
212 my $list = $self->cgi->param('list');
213 my $hold_id = $self->cgi->param('hold');
214 my $rec_id = $ctx->{page_args}->[0];
216 my (undef, @rec_data) = $self->get_records_and_facets([$rec_id], undef,
217 {flesh => '{mra,holdings_xml,acp,exclude_invisible_acn}'});
218 $ctx->{bre_id} = $rec_data[0]->{id};
219 $ctx->{marc_xml} = $rec_data[0]->{marc_xml};
222 if ($list eq 'anon') {
223 $ctx->{added_to_anon} = 1;
225 $ctx->{added_to_list} = $e->retrieve_container_biblio_record_entry_bucket($list);
229 $ctx->{hold} = $e->retrieve_action_hold_request($hold_id);
233 return Apache2::Const::OK;
236 sub load_kpac_config {
238 my $ctx = $self->ctx;
241 my $path = $self->apache->dir_config('KPacConfigFile');
244 $self->apache->log->error("KPacConfigFile required!");
248 $kpac_config = XMLin(
251 ForceArray => ['layout', 'page', 'cell'],
256 my $ou = $ctx->{physical_loc} || $self->_get_search_lib;
259 # Search up the org tree to find the nearest config for the context org unit
260 while (my $org = $ctx->{get_aou}->($ou)) {
261 ($layout) = grep {$_->{owner} eq $org->id} @{$kpac_config->{layout}};
263 $ou = $org->parent_ou;
266 $ctx->{kpac_layout} = $layout;
267 $ctx->{kpac_config} = $kpac_config;
268 $ctx->{kpac_root} = $ctx->{base_path} . "/kpac";
269 $ctx->{home_page} = $ctx->{proto} . '://' . $ctx->{hostname} . $ctx->{kpac_root} . "/home";
270 $ctx->{global_search_filter} = $kpac_config->{global_filter};