From: Dan Pearl Date: Tue, 20 Oct 2015 21:05:07 +0000 (-0400) Subject: LP#1312699 - Add feature to allow user to edit their checkout history. X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=refs%2Fheads%2Fuser%2Fdpearl%2Fhistory_edit_1312699_A;p=working%2FEvergreen.git LP#1312699 - Add feature to allow user to edit their checkout history. In the checkout history page, a new column and action selector is provided to allow the paton to indicate items they would just as soon not want to see again in the history list for whatever reason. NOTE: This is not a PURGE function; it simply suppresses display of items in the history list (and exported history files). Internally, the circulations are kept by Evergreen for several reasons which are not affected by this functionality. Signed-off-by: Dan Pearl --- diff --git a/Open-ILS/examples/fm_IDL.xml b/Open-ILS/examples/fm_IDL.xml index 37aab837d2..7fa20721c4 100644 --- a/Open-ILS/examples/fm_IDL.xml +++ b/Open-ILS/examples/fm_IDL.xml @@ -4081,6 +4081,7 @@ SELECT usr, + diff --git a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Account.pm b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Account.pm index 30e07561c0..154028bf4d 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Account.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Account.pm @@ -1522,6 +1522,10 @@ sub load_myopac_circ_history { my $ctx = $self->ctx; my $limit = $self->cgi->param('limit') || 15; my $offset = $self->cgi->param('offset') || 0; + my $action = $self->cgi->param('action') || ''; + + my $circ_handle_result; + $circ_handle_result = $self->handle_circ_update($action) if $action; $ctx->{circ_history_limit} = $limit; $ctx->{circ_history_offset} = $offset; @@ -1557,7 +1561,35 @@ sub load_myopac_circ_history { } $ctx->{circs} = $self->fetch_user_circs(1, [map { $_->{id} } @$circ_ids]); - return Apache2::Const::OK; + return defined($circ_handle_result) ? $circ_handle_result : Apache2::Const::OK; +} + +sub handle_circ_update { + my $self = shift; + my $action = shift; + my $circ_ids = shift; + my $e = $self->editor; + my $url; + + my @circ_ids = ($circ_ids) ? @$circ_ids : $self->cgi->param('circ_id'); # for non-_all actions + + my $cstore_ses = OpenSRF::AppSession->create('open-ils.cstore'); + $cstore_ses->connect(); + $cstore_ses->request('open-ils.cstore.transaction.begin')->gather(1); + + if($action =~ /delete/) { + for my $circ_id (@circ_ids) { + my $circ = $cstore_ses->request( + 'open-ils.cstore.direct.action.circulation.retrieve', $circ_id)->gather(1); + $circ->hide_from_usr_history(1); + my $resp = $cstore_ses->request( + 'open-ils.cstore.direct.action.circulation.update', $circ)->gather(1); + } + } + + $cstore_ses->request('open-ils.cstore.transaction.commit')->gather(1); + $cstore_ses->disconnect(); + return undef; } # TODO: action.usr_visible_holds does not return cancelled holds. Should it? diff --git a/Open-ILS/src/sql/Pg/090.schema.action.sql b/Open-ILS/src/sql/Pg/090.schema.action.sql index ca1e7f3894..e2a907593e 100644 --- a/Open-ILS/src/sql/Pg/090.schema.action.sql +++ b/Open-ILS/src/sql/Pg/090.schema.action.sql @@ -147,7 +147,8 @@ CREATE TABLE action.circulation ( ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED, copy_location INT NOT NULL DEFAULT 1 REFERENCES asset.copy_location (id) DEFERRABLE INITIALLY DEFERRED, - checkin_scan_time TIMESTAMP WITH TIME ZONE + checkin_scan_time TIMESTAMP WITH TIME ZONE, + hide_from_usr_history BOOL NOT NULL DEFAULT FALSE ) INHERITS (money.billable_xact); ALTER TABLE action.circulation ADD PRIMARY KEY (id); ALTER TABLE action.circulation @@ -880,7 +881,8 @@ END; $$ LANGUAGE 'plpgsql'; -- Return the list of circ chain heads in xact_start order that the user has chosen to "retain" -CREATE OR REPLACE FUNCTION action.usr_visible_circs (usr_id INT) RETURNS SETOF action.circulation AS $func$ +CREATE OR REPLACE FUNCTION action.usr_visible_circs (usr_id INT) RETURNS SETOF action.circulation +AS $func$ DECLARE c action.circulation%ROWTYPE; view_age INTERVAL; @@ -911,6 +913,7 @@ BEGIN WHERE usr = usr_id AND parent_circ IS NULL AND xact_start > NOW() - view_age + AND NOT hide_from_usr_history ORDER BY xact_start DESC LOOP RETURN NEXT c; @@ -1148,7 +1151,7 @@ BEGIN END LOOP; RETURN purged_holds; END; -$func$ LANGUAGE plpgsql; +$func$ LANGUAGE 'plpgsql'; CREATE OR REPLACE FUNCTION action.apply_fieldset( fieldset_id IN INT, -- id from action.fieldset @@ -1259,7 +1262,7 @@ BEGIN -- RETURN msg; END; -$$ LANGUAGE plpgsql; +$$ LANGUAGE 'plpgsql'; COMMENT ON FUNCTION action.apply_fieldset( INT, TEXT, TEXT, TEXT ) IS $$ Applies a specified fieldset, using a supplied table name and primary diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.editable_usr_circ_history.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.editable_usr_circ_history.sql new file mode 100644 index 0000000000..b966900031 --- /dev/null +++ b/Open-ILS/src/sql/Pg/upgrade/XXXX.editable_usr_circ_history.sql @@ -0,0 +1,48 @@ +BEGIN; + +ALTER TABLE action.circulation + ADD COLUMN hide_from_usr_history boolean not null default false; + +CREATE OR REPLACE FUNCTION action.usr_visible_circs(usr_id integer) RETURNS SETOF action.circulation +AS $function$ +DECLARE + c action.circulation%ROWTYPE; + view_age INTERVAL; + usr_view_age actor.usr_setting%ROWTYPE; + usr_view_start actor.usr_setting%ROWTYPE; +BEGIN + SELECT * INTO usr_view_age FROM actor.usr_setting WHERE usr = usr_id AND name = 'history.circ.retention_age'; + SELECT * INTO usr_view_start FROM actor.usr_setting WHERE usr = usr_id AND name = 'history.circ.retention_start'; + + IF usr_view_age.value IS NOT NULL AND usr_view_start.value IS NOT NULL THEN + -- User opted in and supplied a retention age + IF oils_json_to_text(usr_view_age.value)::INTERVAL > AGE(NOW(), oils_json_to_text(usr_view_start.value)::TIMESTAMPTZ) THEN + view_age := AGE(NOW(), oils_json_to_text(usr_view_start.value)::TIMESTAMPTZ); + ELSE + view_age := oils_json_to_text(usr_view_age.value)::INTERVAL; + END IF; + ELSIF usr_view_start.value IS NOT NULL THEN + -- User opted in + view_age := AGE(NOW(), oils_json_to_text(usr_view_start.value)::TIMESTAMPTZ); + ELSE + -- User did not opt in + RETURN; + END IF; + + FOR c IN + SELECT * + FROM action.circulation + WHERE usr = usr_id + AND parent_circ IS NULL + AND xact_start > NOW() - view_age + AND NOT hide_from_usr_history + ORDER BY xact_start DESC + LOOP + RETURN NEXT c; + END LOOP; + + RETURN; +END; +$function$ LANGUAGE plpgsql; + +COMMIT; diff --git a/Open-ILS/src/templates/opac/myopac/circ_history.tt2 b/Open-ILS/src/templates/opac/myopac/circ_history.tt2 index 5339b25551..e686b8038f 100644 --- a/Open-ILS/src/templates/opac/myopac/circ_history.tt2 +++ b/Open-ILS/src/templates/opac/myopac/circ_history.tt2 @@ -58,11 +58,37 @@
[% l('There are no items in your circulation history.') %]
[% ELSE %] +
+ + + + + + +
+ + + +
+ @@ -136,6 +162,9 @@ FOR circ IN circ_items; %] + + [% END %] diff --git a/docs/RELEASE_NOTES_NEXT/OPAC/edit_circ_history b/docs/RELEASE_NOTES_NEXT/OPAC/edit_circ_history new file mode 100644 index 0000000000..ea4c60cd93 --- /dev/null +++ b/docs/RELEASE_NOTES_NEXT/OPAC/edit_circ_history @@ -0,0 +1,10 @@ +Editable Borrowing History +^^^^^^^^^^^^^^^^^^^^^^^^^^ +You can delete titles that you do not wish to appear in your Check Out History. + + * In "My Account", click on the "Items Checked Out" tab, then the "Check Out History" sub-tab. + * Check off the items you wish to conceal. + * Click the Go button next to the "Delete Selected Titles" drop-down box. + * Click OK in the pop-up to confirm your deletion. Choose carefully, as there is no "undo". + +Deleted titles will also not appear in the downloaded CSV file.
+ + [% sort_head("sort_title", l("Title")) %] [% sort_head("author", l("Author")) %] [% sort_head("checkout", l("Checkout Date")) %]
+ + [% circ.circ.target_copy.barcode | html %] [% circ.circ.target_copy.call_number.label | html %]