1 package OpenILS::WWW::EGCatLoader;
2 use strict; use warnings;
3 use Apache2::Const -compile => qw(OK DECLINED FORBIDDEN HTTP_INTERNAL_SERVER_ERROR REDIRECT HTTP_BAD_REQUEST);
4 use OpenSRF::Utils::Logger qw/$logger/;
5 use OpenILS::Utils::CStoreEditor qw/:funcs/;
6 use OpenILS::Utils::Fieldmapper;
7 use OpenILS::Application::AppUtils;
8 my $U = 'OpenILS::Application::AppUtils';
10 # Retrieve the users cached records AKA 'My List'
11 # Returns an empty list if there are no cached records
13 my ($self, $with_marc_xml) = @_;
16 my $cache_key = $self->cgi->cookie((ref $self)->COOKIE_ANON_CACHE);
20 $list = $U->simplereq(
22 'open-ils.actor.anon_cache.get_value',
23 $cache_key, (ref $self)->ANON_CACHE_MYLIST);
32 no warnings qw/numeric/;
33 $list = [map { int $_ } @$list];
34 $list = [grep { $_ > 0} @$list];
41 # capture pref_ou for callnumber filter/display
42 $ctx->{pref_ou} = $self->_get_pref_lib() || $ctx->{search_ou};
44 # search for local callnumbers for display
45 my $focus_ou = $ctx->{physical_loc} || $ctx->{pref_ou};
47 my (undef, @recs) = $self->get_records_and_facets(
49 flesh => '{mra,holdings_xml,acp,exclude_invisible_acn}',
51 site => $ctx->{get_aou}->($focus_ou)->shortname,
52 pref_lib => $ctx->{pref_ou}
56 # make it look like the caller is expecting
57 $marc_xml = { map {$_->{id} => $_->{marc_xml}} @recs };
60 # Leverage QueryParser to sort the items by values of config.metabib_fields
61 # from the items' marc records.
63 my ($sorter, $modifier) = $self->_get_bookbag_sort_params("anonsort");
64 my $query = $self->_prepare_anonlist_sorting_query($list, $sorter, $modifier);
69 $list = $U->bib_record_list_via_search($query, $args) or
70 return Apache2::Const::HTTP_INTERNAL_SERVER_ERROR;
73 return ($cache_key, $list, $marc_xml);
77 # Adds a record (by id) to My List, creating a new anon cache + list if necessary.
80 my $rec_id = $self->cgi->param('record');
82 my ($cache_key, $list) = $self->fetch_mylist;
83 push(@$list, $rec_id);
85 $cache_key = $U->simplereq(
87 'open-ils.actor.anon_cache.set_value',
88 $cache_key, (ref $self)->ANON_CACHE_MYLIST, $list);
90 # Check if we need to warn patron about adding to a "temporary"
92 if ($self->check_for_temp_list_warning) {
93 return $self->mylist_warning_redirect($cache_key);
96 return $self->mylist_action_redirect($cache_key);
99 sub load_mylist_delete {
101 my $rec_id = $self->cgi->param('record');
103 my ($cache_key, $list) = $self->fetch_mylist;
104 $list = [ grep { $_ ne $rec_id } @$list ];
106 $cache_key = $U->simplereq(
108 'open-ils.actor.anon_cache.set_value',
109 $cache_key, (ref $self)->ANON_CACHE_MYLIST, $list);
111 return $self->mylist_action_redirect($cache_key);
114 sub load_mylist_move {
116 my @rec_ids = $self->cgi->param('record');
117 my $action = $self->cgi->param('action') || '';
119 return $self->load_myopac_bookbag_update('place_hold', undef, @rec_ids)
120 if $action eq 'place_hold';
122 my ($cache_key, $list) = $self->fetch_mylist;
123 return $self->mylist_action_redirect unless $cache_key;
126 foreach my $id (@$list) { push(@keep, $id) unless grep { $id eq $_ } @rec_ids; }
128 $cache_key = $U->simplereq(
130 'open-ils.actor.anon_cache.set_value',
131 $cache_key, (ref $self)->ANON_CACHE_MYLIST, \@keep
134 if ($self->ctx->{user} and $action =~ /^\d+$/) {
135 # in this case, action becomes list_id
136 $self->load_myopac_bookbag_update('add_rec', $self->cgi->param('action'));
137 # XXX TODO: test for failure of above
140 return $self->mylist_action_redirect($cache_key);
143 sub load_cache_clear {
145 $self->clear_anon_cache;
146 return $self->mylist_action_redirect;
149 # Wipes the entire anonymous cache, including My List
150 sub clear_anon_cache {
154 my $cache_key = $self->cgi->cookie((ref $self)->COOKIE_ANON_CACHE) or return;
158 'open-ils.actor.anon_cache.delete_session', $cache_key)
163 # Called after an anon-cache / My List action occurs. Redirect
164 # to the redirect_url (cgi param) or referrer or home.
165 sub mylist_action_redirect {
167 my $cache_key = shift;
170 if( my $anchor = $self->cgi->param('anchor') ) {
171 # on the results page, we want to redirect
172 # back to record that was affected
173 $url = $self->ctx->{referer};
174 $url =~ s/#.*|$/#$anchor/;
177 return $self->generic_redirect(
180 -name => (ref $self)->COOKIE_ANON_CACHE,
182 -value => ($cache_key) ? $cache_key : '',
183 -expires => ($cache_key) ? undef : '-1h'
188 # called after an anon-cache / my list addition when we are configured
189 # to show a warning to the user.
191 sub mylist_warning_redirect {
193 my $cache_key = shift;
195 my $base_url = sprintf(
196 "%s://%s%s/temp_warn",
198 $self->ctx->{hostname},
199 $self->ctx->{opac_root}
202 my $redirect = $self->ctx->{referer};
203 if (my $anchor = $self->cgi->param('anchor')) {
204 $redirect =~ s/#.*|$/#$anchor/;
207 $base_url .= '?redirect_to=' . uri_escape_utf8($redirect);
209 return $self->generic_redirect(
212 -name => (ref $self)->COOKIE_ANON_CACHE,
214 -value => ($cache_key) ? $cache_key : '',
215 -expires => ($cache_key) ? undef : '-1h'
222 (undef, $self->ctx->{mylist}, $self->ctx->{mylist_marc_xml}) =
223 $self->fetch_mylist(1);
225 return Apache2::Const::OK;
228 sub load_temp_warn_post {
230 my $url = $self->cgi->param('redirect_to');
231 return $self->generic_redirect(
234 -name => 'no_temp_list_warn',
236 -value => ($self->cgi->param('no_temp_list_warn')) ? '1' : '',
237 -expires => ($self->cgi->param('no_temp_list_warn')) ? undef : '-1h'
244 $self->ctx->{'redirect_to'} = $self->cgi->param('redirect_to');
245 return Apache2::Const::OK;