]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Container.pm
TPac: Add paging to My Lists
[working/Evergreen.git] / Open-ILS / src / perlmods / lib / OpenILS / WWW / EGCatLoader / Container.pm
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';
9
10 # Retrieve the users cached records AKA 'My List'
11 # Returns an empty list if there are no cached records
12 sub fetch_mylist {
13     my ($self, $with_marc_xml) = @_;
14
15     my $list = [];
16     my $cache_key = $self->cgi->cookie((ref $self)->COOKIE_ANON_CACHE);
17
18     if($cache_key) {
19
20         $list = $U->simplereq(
21             'open-ils.actor',
22             'open-ils.actor.anon_cache.get_value', 
23             $cache_key, (ref $self)->ANON_CACHE_MYLIST);
24
25         if(!$list) {
26             $cache_key = undef;
27             $list = [];
28         }
29     }
30
31     my $marc_xml;
32     if ($with_marc_xml) {
33         $marc_xml = $self->fetch_marc_xml_by_id($list);
34     }
35
36     # Leverage QueryParser to sort the items by values of config.metabib_fields
37     # from the items' marc records.
38     if (@$list) {
39         my ($sorter, $modifier) = $self->_get_bookbag_sort_params("anonsort");
40         my $query = $self->_prepare_anonlist_sorting_query($list, $sorter, $modifier);
41         my $args = {
42             "limit" => 1000,
43             "offset" => 0
44         };
45         $list = $U->bib_record_list_via_search($query, $args) or
46             return Apache2::Const::HTTP_INTERNAL_SERVER_ERROR;
47     }
48
49     return ($cache_key, $list, $marc_xml);
50 }
51
52
53 # Adds a record (by id) to My List, creating a new anon cache + list if necessary.
54 sub load_mylist_add {
55     my $self = shift;
56     my $rec_id = $self->cgi->param('record');
57
58     my ($cache_key, $list) = $self->fetch_mylist;
59     push(@$list, $rec_id);
60
61     $cache_key = $U->simplereq(
62         'open-ils.actor',
63         'open-ils.actor.anon_cache.set_value', 
64         $cache_key, (ref $self)->ANON_CACHE_MYLIST, $list);
65
66     return $self->mylist_action_redirect($cache_key);
67 }
68
69 sub load_mylist_delete {
70     my $self = shift;
71     my $rec_id = $self->cgi->param('record');
72
73     my ($cache_key, $list) = $self->fetch_mylist;
74     $list = [ grep { $_ ne $rec_id } @$list ];
75
76     $cache_key = $U->simplereq(
77         'open-ils.actor',
78         'open-ils.actor.anon_cache.set_value', 
79         $cache_key, (ref $self)->ANON_CACHE_MYLIST, $list);
80
81     return $self->mylist_action_redirect($cache_key);
82 }
83
84 sub load_mylist_move {
85     my $self = shift;
86     my @rec_ids = $self->cgi->param('record');
87     my $action = $self->cgi->param('action') || '';
88
89     return $self->load_myopac_bookbag_update('place_hold', undef, @rec_ids)
90         if $action eq 'place_hold';
91
92     my ($cache_key, $list) = $self->fetch_mylist;
93     return $self->mylist_action_redirect unless $cache_key;
94
95     my @keep;
96     foreach my $id (@$list) { push(@keep, $id) unless grep { $id eq $_ } @rec_ids; }
97
98     $cache_key = $U->simplereq(
99         'open-ils.actor',
100         'open-ils.actor.anon_cache.set_value', 
101         $cache_key, (ref $self)->ANON_CACHE_MYLIST, \@keep
102     );
103
104     if ($self->ctx->{user} and $action =~ /^\d+$/) {
105         # in this case, action becomes list_id
106         $self->load_myopac_bookbag_update('add_rec', $self->cgi->param('action'));
107         # XXX TODO: test for failure of above
108     }
109
110     return $self->mylist_action_redirect($cache_key);
111 }
112
113 sub load_cache_clear {
114     my $self = shift;
115     $self->clear_anon_cache;
116     return $self->mylist_action_redirect;
117 }
118
119 # Wipes the entire anonymous cache, including My List
120 sub clear_anon_cache {
121     my $self = shift;
122     my $field = shift;
123
124     my $cache_key = $self->cgi->cookie((ref $self)->COOKIE_ANON_CACHE) or return;
125
126     $U->simplereq(
127         'open-ils.actor',
128         'open-ils.actor.anon_cache.delete_session', $cache_key)
129         if $cache_key;
130
131 }
132
133 # Called after an anon-cache / My List action occurs.  Redirect
134 # to the redirect_url (cgi param) or referrer or home.
135 sub mylist_action_redirect {
136     my $self = shift;
137     my $cache_key = shift;
138
139     my $url;
140     if( my $anchor = $self->cgi->param('anchor') ) {
141         # on the results page, we want to redirect 
142         # back to record that was affected
143         $url = $self->ctx->{referer};
144         $url =~ s/#.*|$/#$anchor/;
145     } 
146
147     return $self->generic_redirect(
148         $url,
149         $self->cgi->cookie(
150             -name => (ref $self)->COOKIE_ANON_CACHE,
151             -path => '/',
152             -value => ($cache_key) ? $cache_key : '',
153             -expires => ($cache_key) ? undef : '-1h'
154         )
155     );
156 }
157
158 sub load_mylist {
159     my ($self) = shift;
160     (undef, $self->ctx->{mylist}, $self->ctx->{mylist_marc_xml}) =
161         $self->fetch_mylist(1);
162
163     return Apache2::Const::OK;
164 }
165
166 1;