]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/perlmods/lib/OpenILS/Application/Actor/Carousel.pm
LP1832897: Belt-and-suspenders for making sure max_items is set
[working/Evergreen.git] / Open-ILS / src / perlmods / lib / OpenILS / Application / Actor / Carousel.pm
1 package OpenILS::Application::Actor::Carousel;
2 use base 'OpenILS::Application';
3 use strict; use warnings;
4 use OpenILS::Application::AppUtils;
5 use OpenILS::Perm;
6 use Data::Dumper;
7 use OpenSRF::EX qw(:try);
8 use OpenILS::Utils::Fieldmapper;
9 use OpenILS::Utils::CStoreEditor qw/:funcs/;
10 use OpenSRF::Utils::SettingsClient;
11 use OpenSRF::Utils::Cache;
12 use Digest::MD5 qw(md5_hex);
13 use OpenSRF::Utils::JSON;
14
15 my $apputils = "OpenILS::Application::AppUtils";
16 my $U = $apputils;
17 my $logger = "OpenSRF::Utils::Logger";
18
19 sub initialize { return 1; }
20
21 __PACKAGE__->register_method(
22     method  => "retrieve_carousels_at_org",
23     api_name    => "open-ils.actor.carousel.retrieve_by_org",
24     authoritative => 1,
25     notes        => <<"    NOTES");
26         Retrieves the IDs and override names of all carousels visible
27         at the specified org unit sorted by their sequence number at
28         that library
29         PARAMS(OrgId)
30     NOTES
31
32 sub retrieve_carousels_at_org {
33     my($self, $client, $org_id) = @_;
34     my $e = new_editor();
35
36     my $carousels = $e->json_query({
37         select => { ccou => ['carousel','override_name','seq'] },
38         distinct => 'true',
39         from => { ccou => 'cc' } ,
40         where => {
41             '+ccou' => { org_unit => $org_id },
42             '+cc'   => { active => 't' }
43         },
44         order_by => {
45             'ccou' => ['seq']
46         }
47     });
48
49     return $carousels;
50 }
51
52 __PACKAGE__->register_method(
53     method  => "retrieve_manual_carousels_for_staff",
54     api_name    => "open-ils.actor.carousel.retrieve_manual_by_staff",
55     authoritative => 1,
56     notes        => <<"    NOTES");
57         Retrieves the IDs, buckets, and names of all manually-maintained
58         carousels visible at any of the staff members working
59         locations.
60         PARAMS(authtoken)
61     NOTES
62
63 sub retrieve_manual_carousels_for_staff {
64     my($self, $client, $auth) = @_;
65     my $e = new_editor(authtoken => $auth);
66     return $e->die_event unless $e->checkauth;
67
68     my $orgs = [];
69     if ($e->requestor->super_user eq 't') {
70         # super users can act/see at all OUs
71         my $ous = $e->json_query({
72             select => { aou => ['id'] },
73             from => 'aou'
74         });
75         $orgs = [ map { $_->{id} } @$ous ];
76     } else {
77         my $ous = $e->json_query({
78             select => { puwoum => ['work_ou'] },
79             from => 'puwoum',
80             where => {
81                 '+puwoum' => { usr => $e->requestor->id }
82             }
83         });
84         $orgs = [ map { $_->{work_ou} } @$ous ];
85     }
86
87     my $carousels = $e->json_query({
88         select => { cc => ['id','name','bucket'] },
89         distinct => 'true',
90         from => { cc => 'ccou' },
91         where => {
92             '+ccou' => { org_unit => $orgs },
93             '+cc'   => { type => 1, active => 't' }, # FIXME
94         },
95         order_by => {
96             'cc' => ['name']
97         }
98     });
99
100     return $carousels;
101 }
102
103 __PACKAGE__->register_method(
104     method  => "refresh_carousel",
105     api_name    => "open-ils.actor.carousel.refresh",
106     authoritative => 1,
107     notes        => <<"    NOTES");
108         Refreshes the specified carousel
109         PARAMS(authtoken, carousel_id)
110     NOTES
111
112 sub refresh_carousel {
113     my ($self, $client, $auth, $carousel_id) = @_;
114
115     my $e = new_editor(authtoken => $auth);
116     return $e->event unless $e->checkauth;
117     return $e->event unless $e->allowed('REFRESH_CAROUSEL');
118
119     my $carousel;
120     $carousel = $e->retrieve_container_carousel($carousel_id) or return $e->event;
121
122     return $e->event unless $e->allowed('REFRESH_CAROUSEL', $carousel->owner, $carousel);
123
124     my $ctype;
125     $ctype = $e->retrieve_config_carousel_type($carousel->type) or return $e->event;
126     return new OpenILS::Event('CANNOT_REFRESH_MANUAL_CAROUSEL') unless $ctype->automatic eq 't';
127
128     my $orgs = [];
129     my $locs = [];
130     if (defined($carousel->owning_lib_filter)) {
131         my $ou_filter = $carousel->owning_lib_filter;
132         $ou_filter =~ s/[{}]//g;
133         @$orgs = split /,/, $ou_filter;
134     }
135     if (defined($carousel->copy_location_filter)) {
136         my $loc_filter = $carousel->copy_location_filter;
137         $loc_filter =~ s/[{}]//g;
138         @$locs = split /,/, $loc_filter;
139     }
140
141     my $num_updated = $U->simplereq(
142         'open-ils.storage',
143         'open-ils.storage.container.refresh_from_carousel',
144         $carousel->bucket,
145         $carousel->type,
146         $carousel->age_filter,
147         $orgs,
148         $locs,
149         $carousel->max_items,
150     );
151
152     $carousel->last_refresh_time('now');
153     $e->xact_begin;
154     $e->update_container_carousel($carousel) or return $e->event;
155     $e->xact_commit or return $e->event;
156
157     return $num_updated;
158 }
159
160 __PACKAGE__->register_method(
161     method  => "add_carousel_from_bucket",
162     api_name    => "open-ils.actor.carousel.create.from_bucket",
163     authoritative => 1,
164     notes        => <<"    NOTES");
165         Creates new carousel and its container by copying the
166         contents of an existing bucket.
167         PARAMS(authtoken, carousel_name, bucket_id)
168     NOTES
169
170 sub add_carousel_from_bucket {
171     my ($self, $client, $auth, $carousel_name, $bucket_id) = @_;
172
173     my $e = new_editor(authtoken => $auth);
174     return $e->event unless $e->checkauth;
175     return $e->event unless $e->allowed('ADMIN_CAROUSEL');
176
177     $e->xact_begin;
178
179     # gather old entries to get a count and set max_items appropriately
180     my $entries = $e->search_container_biblio_record_entry_bucket_item({ bucket => $bucket_id });
181
182     my $carousel = Fieldmapper::container::carousel->new;
183     $carousel->name($carousel_name);
184     $carousel->type(1); # manual
185     $carousel->owner($e->requestor->ws_ou);
186     $carousel->creator($e->requestor->id);
187     $carousel->editor($e->requestor->id);
188     $carousel->max_items(scalar(@$entries));
189     $e->create_container_carousel($carousel) or return $e->event;
190
191     # and the bucket
192     my $bucket = Fieldmapper::container::biblio_record_entry_bucket->new;
193     $bucket->owner($e->requestor->id);
194     $bucket->name('System-created bucket for carousel ' . $carousel->id . ' copied from bucket ' . $bucket_id);
195     $bucket->btype('carousel');
196     $bucket->pub('t');
197     $bucket->owning_lib($e->requestor->ws_ou);
198     $e->create_container_biblio_record_entry_bucket($bucket) or return $e->event;
199
200     # link it to the container;
201     $carousel = $e->retrieve_container_carousel($carousel->id) or return $e->event;
202     $carousel->bucket($bucket->id);
203     $e->update_container_carousel($carousel) or return $e->event;
204
205     # and fill it
206     foreach my $entry (@$entries) {
207         $entry->clear_id;
208         $entry->bucket($bucket->id);
209         $entry->create_time('now');
210         $e->create_container_biblio_record_entry_bucket_item($entry) or return $e->event;
211     }
212
213     $e->xact_commit or return $e->event;
214
215     return $carousel->id;
216 }
217
218 1;