From 86f2121390b304e4bf77538afacc024670363738 Mon Sep 17 00:00:00 2001 From: Thomas Berezansky Date: Tue, 3 May 2011 12:23:44 -0400 Subject: [PATCH] SIP Export of Patron Stat Cats Add support for the SIP Server to obtain patron stat information for export. Signed-off-by: Thomas Berezansky --- Open-ILS/examples/fm_IDL.xml | 16 +++++++ .../lib/OpenILS/Application/Circ/StatCat.pm | 18 ++++++++ .../lib/OpenILS/Application/Storage/CDBI/actor.pm | 10 ++++- .../OpenILS/Application/Storage/Driver/Pg/dbi.pm | 5 +++ .../OpenILS/Application/Storage/Publisher/actor.pm | 26 +++++++++++ Open-ILS/src/perlmods/lib/OpenILS/SIP/Patron.pm | 18 ++++++++ Open-ILS/src/sql/Pg/005.schema.actors.sql | 12 ++++++ Open-ILS/src/sql/Pg/upgrade/XXXX.sip_statcat.sql | 20 +++++++++ Open-ILS/web/opac/locale/en-US/lang.dtd | 6 +++ .../staff_client/server/admin/stat_cat_editor.js | 50 +++++++++++++++++++++- .../server/admin/stat_cat_editor.xhtml | 26 ++++++++++- 11 files changed, 204 insertions(+), 3 deletions(-) create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.sip_statcat.sql diff --git a/Open-ILS/examples/fm_IDL.xml b/Open-ILS/examples/fm_IDL.xml index 724e8f55a0..7f60a272a4 100644 --- a/Open-ILS/examples/fm_IDL.xml +++ b/Open-ILS/examples/fm_IDL.xml @@ -4366,6 +4366,19 @@ SELECT usr, + + + + + + + + + + + + + @@ -4374,9 +4387,12 @@ SELECT usr, + + + diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/StatCat.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/StatCat.pm index 8ca8325755..628e2c577a 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/StatCat.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/StatCat.pm @@ -88,6 +88,24 @@ sub retrieve_stat_cats { return [ sort { $a->name cmp $b->name } @$cats ]; } +__PACKAGE__->register_method ( + method => "retrieve_stat_cat_sip_fields", + api_name => "open-ils.circ.stat_cat.actor.sip_fields.retrieve.all"); + +sub retrieve_stat_cat_sip_fields { + my( $self, $client, $user_session ) = @_; + + my $method = 'open-ils.storage.actor.stat_cat_sip_fields.retrieve.all.atomic'; + + my($user_obj, $evt) = $apputils->checkses($user_session); + return $evt if $evt; + + my $fields = $apputils->simple_scalar_request( + "open-ils.storage", $method ); + + return $fields; +} + __PACKAGE__->register_method( method => "retrieve_ranged_intersect_stat_cats", diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/actor.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/actor.pm index 392febe999..28484a71ed 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/actor.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/actor.pm @@ -118,7 +118,15 @@ use base qw/actor/; __PACKAGE__->table( 'actor_stat_cat' ); __PACKAGE__->columns( Primary => qw/id/ ); -__PACKAGE__->columns( Essential => qw/owner name opac_visible usr_summary/ ); +__PACKAGE__->columns( Essential => qw/owner name opac_visible usr_summary sip_field sip_format/ ); + +#------------------------------------------------------------------------------- +package actor::stat_cat_sip_fields; +use base qw/actor/; + +__PACKAGE__->table( 'actor_stat_cat_sip_fields' ); +__PACKAGE__->columns( Primary => qw/field/ ); +__PACKAGE__->columns( Essential => qw/name/ ); #------------------------------------------------------------------------------- package actor::stat_cat_entry; diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/dbi.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/dbi.pm index 5c6990ff22..448d1f070d 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/dbi.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/dbi.pm @@ -510,7 +510,12 @@ actor::stat_cat->table( 'actor.stat_cat' ); actor::stat_cat->sequence( 'actor.stat_cat_id_seq' ); + + #--------------------------------------------------------------------- + package actor::stat_cat_sip_fields; + actor::stat_cat_sip_fields->table( 'actor.stat_cat_sip_fields' ); + #--------------------------------------------------------------------- package actor::stat_cat_entry; diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/actor.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/actor.pm index cd3d4b5d14..c7ff055d89 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/actor.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/actor.pm @@ -1043,5 +1043,31 @@ __PACKAGE__->register_method( method => 'ranged_actor_stat_cat_entry', ); +sub actor_stat_cat_sip_fields { + my $self = shift; + my $client = shift; + my $s_table = actor::stat_cat_sip_fields->table; + + my $select = <<" SQL"; + SELECT field, name + FROM $s_table + SQL + + my $sth = actor::stat_cat_sip_fields->db_Main->prepare_cached($select); + $sth->execute(); + + for my $scsf ( map { actor::stat_cat_sip_fields->construct($_) } $sth->fetchall_hash ) { + $client->respond( $scsf->to_fieldmapper ); + } + + return undef; +} + +__PACKAGE__->register_method( + api_name => 'open-ils.storage.actor.stat_cat_sip_fields.retrieve.all', + api_level => 1, + stream => 1, + method => 'actor_stat_cat_sip_fields', +); 1; diff --git a/Open-ILS/src/perlmods/lib/OpenILS/SIP/Patron.pm b/Open-ILS/src/perlmods/lib/OpenILS/SIP/Patron.pm index c628820a2d..1d814e620d 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/SIP/Patron.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/SIP/Patron.pm @@ -66,6 +66,10 @@ sub new { "billing_address", "mailing_address", 'profile', + "stat_cat_entries", + ], + actscecm => [ + "stat_cat", ], } }; @@ -721,5 +725,19 @@ sub inet_privileges { return $name; } +sub extra_fields { + my( $self ) = @_; + my $extra_fields = {}; + my $u = $self->{user}; + foreach my $stat_cat_entry (@{$u->stat_cat_entries}) { + my $stat_cat = $stat_cat_entry->stat_cat; + next unless ($stat_cat->sip_field); + $extra_fields->{ $stat_cat->sip_field } = [] unless (defined $extra_fields->{$stat_cat->sip_field}); + my $value = $stat_cat_entry->stat_cat_entry; + $value = sprintf($stat_cat->sip_format, $value) if (defined $stat_cat->sip_format); + push(@{$extra_fields->{ $stat_cat->sip_field}}, $value); + } + return $extra_fields; +} 1; diff --git a/Open-ILS/src/sql/Pg/005.schema.actors.sql b/Open-ILS/src/sql/Pg/005.schema.actors.sql index f87ffa097e..20059bcde9 100644 --- a/Open-ILS/src/sql/Pg/005.schema.actors.sql +++ b/Open-ILS/src/sql/Pg/005.schema.actors.sql @@ -145,6 +145,16 @@ $$; CREATE INDEX actor_usr_setting_usr_idx ON actor.usr_setting (usr); +CREATE TABLE actor.stat_cat_sip_fields ( + field CHAR(2) PRIMARY KEY, + name TEXT NOT NULL +); +COMMENT ON TABLE actor.stat_cat_sip_fields IS $$ +Actor Statistical Category SIP Fields + +Contains the list of valid SIP Field identifiers for +Statistical Categories. +$$; CREATE TABLE actor.stat_cat ( id SERIAL PRIMARY KEY, @@ -152,6 +162,8 @@ CREATE TABLE actor.stat_cat ( name TEXT NOT NULL, opac_visible BOOL NOT NULL DEFAULT FALSE, usr_summary BOOL NOT NULL DEFAULT FALSE, + sip_field CHAR(2) REFERENCES actor.stat_cat_sip_fields(field) ON UPDATE CASCADE ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED, + sip_format TEXT, CONSTRAINT sc_once_per_owner UNIQUE (owner,name) ); COMMENT ON TABLE actor.stat_cat IS $$ diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.sip_statcat.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.sip_statcat.sql new file mode 100644 index 0000000000..fc6174b560 --- /dev/null +++ b/Open-ILS/src/sql/Pg/upgrade/XXXX.sip_statcat.sql @@ -0,0 +1,20 @@ +BEGIN; + +INSERT INTO config.upgrade_log (version) VALUES ('XXXX'); + +CREATE TABLE actor.stat_cat_sip_fields ( + field CHAR(2) PRIMARY KEY, + name TEXT NOT NULL +); +COMMENT ON TABLE actor.stat_cat_sip_fields IS $$ +Actor Statistical Category SIP Fields + +Contains the list of valid SIP Field identifiers for +Statistical Categories. +$$; + +ALTER TABLE actor.stat_cat + ADD COLUMN sip_field CHAR(2) REFERENCES actor.stat_cat_sip_fields(field) ON UPDATE CASCADE ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED, + ADD COLUMN sip_format TEXT; + +COMMIT; diff --git a/Open-ILS/web/opac/locale/en-US/lang.dtd b/Open-ILS/web/opac/locale/en-US/lang.dtd index 920db0d532..8b42c302d5 100644 --- a/Open-ILS/web/opac/locale/en-US/lang.dtd +++ b/Open-ILS/web/opac/locale/en-US/lang.dtd @@ -2146,6 +2146,12 @@ + + + + + + diff --git a/Open-ILS/xul/staff_client/server/admin/stat_cat_editor.js b/Open-ILS/xul/staff_client/server/admin/stat_cat_editor.js index 55bad5853c..661f42addb 100644 --- a/Open-ILS/xul/staff_client/server/admin/stat_cat_editor.js +++ b/Open-ILS/xul/staff_client/server/admin/stat_cat_editor.js @@ -1,4 +1,5 @@ var SC_FETCH_ALL = 'open-ils.circ:open-ils.circ.stat_cat.TYPE.retrieve.all'; +var SC_FETCH_SF = 'open-ils.circ:open-ils.circ.stat_cat.actor.sip_fields.retrieve.all'; var SC_CREATE = 'open-ils.circ:open-ils.circ.stat_cat.TYPE.create'; var SC_UPDATE = 'open-ils.circ:open-ils.circ.stat_cat.TYPE.update'; var SC_DELETE = 'open-ils.circ:open-ils.circ.stat_cat.TYPE.delete'; @@ -77,6 +78,23 @@ function scEditorInit() { if(!session) throw "User session is not defined"; user = fetchUser(session); $('sc_type_selector').onchange = scBuildNew; + try { + var sipfieldselect1 = $('sc_sip_field'); + var sipfieldselect2 = $n($('sc_edit_row'), 'sc_edit_sip_field'); + var req = new Request( SC_FETCH_SF, session ); + req.send(true); + var result = req.result(); + for(var f in result) { + var option1 = document.createElement('option'); + option1.value = result[f].field(); + option1.appendChild(text(result[f].name() + ' (' + result[f].field() + ')')); + var option2 = option1.cloneNode(true); + sipfieldselect1.appendChild(option1); + sipfieldselect2.appendChild(option2); + } + } catch (E) { alert(js2JSON(E));} + + setTimeout( function() { fetchHighestWorkPermOrgs( @@ -106,7 +124,6 @@ function scShow(type) { } function _scShow(type) { - currentlyVisible = type; if( type == ASSET ) { @@ -142,10 +159,14 @@ function scDraw( type, cats ) { if(type == ACTOR) { unHideMe($('sc_usr_summary_label')); + unHideMe($('sc_sip_field_label')); + unHideMe($('sc_sip_format_label')); hideMe($('sc_required_label')); } else { unHideMe($('sc_required_label')); hideMe($('sc_usr_summary_label')); + hideMe($('sc_sip_field_label')); + hideMe($('sc_sip_format_label')); } scCounter = 0; @@ -177,6 +198,15 @@ function scInsertCat( tbody, cat, type ) { else unHideMe($n(row, 'sc_usr_summary')); + if(cat.sip_field().length != 2) + unHideMe($n(row, 'sc_sip_field_none')); + else { + $n(row, 'sc_sip_field_value').appendChild( text( cat.sip_field() ) ); + unHideMe($n(row, 'sc_sip_field_value')); + } + + $n(row, 'sc_sip_format_td').appendChild( text( cat.sip_format() ) ); + hideMe($n(row, 'sc_required_td')); } else { if(isTrue(cat.required())) @@ -185,6 +215,8 @@ function scInsertCat( tbody, cat, type ) { unHideMe($n(row, 'sc_required')); hideMe($n(row, 'sc_usr_summary_td')); + hideMe($n(row, 'sc_sip_field_td')); + hideMe($n(row, 'sc_sip_format_td')); } tbody.appendChild(row); @@ -285,10 +317,12 @@ function scBuildNew() { hideMe($('required_td2')); unHideMe($('usr_summary_td1')); unHideMe($('usr_summary_td2')); + unHideMe($('sip_tr')); break; case ASSET: hideMe($('usr_summary_td1')); hideMe($('usr_summary_td2')); + hideMe($('sip_tr')); unHideMe($('required_td1')); unHideMe($('required_td2')); break; @@ -323,6 +357,10 @@ function scNew() { if( type == ACTOR ) { cat = new actsc(); cat.usr_summary( usr_summary ); + var field = getSelectorVal($('sc_sip_field')); + if(field.length == 2) cat.sip_field(field); + else cat.sip_field(null); + cat.sip_format($('sc_sip_format').value); } if( type == ASSET ) { cat = new asc(); @@ -359,12 +397,18 @@ function scEdit( tbody, type, cat ) { if(type == ACTOR) { var cb = $n(row, 'sc_edit_usr_summary'); cb.checked = isTrue(cat.usr_summary()); + setSelector($n(row, 'sc_edit_sip_field'), cat.sip_field()); + $n(row, 'sc_edit_sip_format').value = cat.sip_format(); hideMe($n(row, 'sc_edit_required_td')); unHideMe($n(row, 'sc_edit_usr_summary_td')); + unHideMe($n(row, 'sc_edit_sip_field_td')); + unHideMe($n(row, 'sc_edit_sip_format_td')); } else { var cb = $n(row, 'sc_edit_required'); cb.checked = isTrue(cat.required()); hideMe($n(row, 'sc_edit_usr_summary_td')); + hideMe($n(row, 'sc_edit_sip_field_td')); + hideMe($n(row, 'sc_edit_sip_format_td')); unHideMe($n(row, 'sc_edit_required_td')); } @@ -425,11 +469,15 @@ function scEditGo( type, cat, row, selector ) { var usr_summary = $n(row, 'sc_edit_usr_summary').checked; var required = $n(row, 'sc_edit_required').checked; + var sip_field = getSelectorVal( $n(row, 'sc_edit_sip_field') ); cat.name( name ); cat.owner( newlib ); cat.entries(null); cat.opac_visible(0); + if(sip_field.length == 2) cat.sip_field( sip_field ); + else cat.sip_field(null); + cat.sip_format($n(row, 'sc_edit_sip_format').value); if( visible ) cat.opac_visible(1); switch(type) { case ACTOR: diff --git a/Open-ILS/xul/staff_client/server/admin/stat_cat_editor.xhtml b/Open-ILS/xul/staff_client/server/admin/stat_cat_editor.xhtml index b468a97c93..4be121d60f 100644 --- a/Open-ILS/xul/staff_client/server/admin/stat_cat_editor.xhtml +++ b/Open-ILS/xul/staff_client/server/admin/stat_cat_editor.xhtml @@ -96,7 +96,16 @@ &staff.server.admin.stat_cat.off; - + + + &staff.server.admin.stat_cat.sip_field; + + + + &staff.server.admin.stat_cat.sip_format; + @@ -147,6 +156,8 @@ &staff.server.admin.stat_cat.opac_visibility.label; &staff.server.admin.stat_cat.required.label; &staff.server.admin.stat_cat.usr_summary.label; + &staff.server.admin.stat_cat.sip_field.label; + &staff.server.admin.stat_cat.sip_format.label; &staff.server.admin.stat_cat.entries.label; &staff.server.admin.stat_cat.add_entry; &staff.server.admin.stat_cat.edit; @@ -170,6 +181,11 @@ &staff.server.admin.stat_cat.on; &staff.server.admin.stat_cat.off; + + &staff.server.admin.stat_cat.sip_field.none.label; + + + + + + + + + -- 2.11.0