@@ -, +, @@ --- C4/UsageStats.pm | 610 ++++++++++----------- .../prog/en/modules/admin/preferences/admin.pref | 21 +- misc/cronjobs/share_usage_with_koha_community.pl | 98 ++++ 3 files changed, 397 insertions(+), 332 deletions(-) create mode 100644 misc/cronjobs/share_usage_with_koha_community.pl --- a/C4/UsageStats.pm +++ a/C4/UsageStats.pm @@ -1,25 +1,23 @@ package UsageStats; -# Copyright 2000-2003 Katipo Communications -# Copyright 2010 BibLibre -# Parts Copyright 2010 Catalyst IT -# # This file is part of Koha. # -# Koha is free software; you can redistribute it and/or modify it under the -# terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. +# Copyright 2014 BibLibre +# +# Koha is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. # -# Koha is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR -# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# Koha is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. # -# You should have received a copy of the GNU General Public License along -# with Koha; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . -use strict; +use Modern::Perl; use C4::Context; use POSIX qw(strftime); use LWP::UserAgent; @@ -35,13 +33,6 @@ hea.koha-community.org is the server that centralize Koha setups informations Koha libraries are encouraged to provide informations about their collections, their structure,... -This package is normally only called by a cronjob, like -0 3 1 * * export KOHA_CONF=/home/koha/etc/koha-conf.xml; export PERL5LIB=/home/koha/src; perl /home/koha/src/C4/UsageStats.pm - -IMPORTANT : please do NOT run the cron on the 1st, but on another day. The idea is to avoid all -Koha libraries sending their data at the same time ! So choose any day between 1 and 28 ! - - =head2 NeedUpdate $needUpdateYN = C4::UsageStats::NeedUpdate; @@ -59,42 +50,15 @@ sub NeedUpdate { # Need to launch cron. return 1 if $now - $lastupdated >= 2592000; - # Cron no need to be launched. + # Data don't need to be updated return 0; } -=head2 LaunchCron - - LaunchCron(); - -Compute results and send them to the centralized server - -=cut - -sub LaunchCron { - if (!C4::Context->preference('UsageStatsShare')) { - die ("UsageStats is not configured"); - } - if (NeedUpdate) { - C4::Context->set_preference('UsageStatsLastUpdateTime', strftime("%s", localtime)); - my $data = BuildReport(); - ReportToCommunity($data); - } -} - -=head2 Builreport - - BuildReport(); - -retrieve some database volumety and systempreferences that will be sent to hea server - -=cut - sub BuildReport { my $report = { - 'library' => { - 'name' => C4::Context->preference('UsageStatsLibraryName'), - 'id' => C4::Context->preference('UsageStatsID') || 0, + library => { + name => C4::Context->preference('UsageStatsLibraryName') || q||, + id => C4::Context->preference('UsageStatsID') || 0, }, }; @@ -104,257 +68,262 @@ sub BuildReport { } # Get systempreferences. - foreach (qw/ AcqCreateItem - AcqWarnOnDuplicateInvoice - AcqViewBaskets - BasketConfirmations - OrderPdfFormat - casAuthentication - casLogout - AllowPkiAuth - DebugLevel - delimiter - noItemTypeImages - virtualshelves - AutoLocation - IndependentBranches - SessionStorage - Persona - AuthDisplayHierarchy - AutoCreateAuthorities - BiblioAddsAuthorities - dontmerge - UseAuthoritiesForTracings - CatalogModuleRelink - hide_marc - IntranetBiblioDefaultView - LabelMARCView - OpacSuppression - SeparateHoldings - UseControlNumber - advancedMARCeditor - DefaultClassificationSource - EasyAnalyticalRecords - autoBarcode - item-level_itypes - marcflavour - PrefillItem - z3950NormalizeAuthor - SpineLabelAutoPrint - SpineLabelShowPrintOnBibDetails - BlockReturnOfWithdrawnItems - CalculateFinesOnReturn - AgeRestrictionOverride - AllFinesNeedOverride - AllowFineOverride - AllowItemsOnHoldCheckout - AllowNotForLoanOverride - AllowRenewalLimitOverride - AllowReturnToBranch - AllowTooManyOverride - AutomaticItemReturn - AutoRemoveOverduesRestrictions - CircControl - HomeOrHoldingBranch - HomeOrHoldingBranchReturn - InProcessingToShelvingCart - IssueLostItem - IssuingInProcess - ManInvInNoissuesCharge - OverduesBlockCirc - RenewalPeriodBase - RenewalSendNotice - RentalsInNoissuesCharge - ReturnBeforeExpiry - ReturnToShelvingCart - TransfersMaxDaysWarning - UseBranchTransferLimits - useDaysMode - UseTransportCostMatrix - UseCourseReserves - finesCalendar - FinesIncludeGracePeriod - finesMode - RefundLostItemFeeOnReturn - WhenLostChargeReplacementFee - WhenLostForgiveFine - AllowHoldDateInFuture - AllowHoldPolicyOverride - AllowHoldsOnDamagedItems - AllowHoldsOnPatronsPossessions - AllowOnShelfHolds - AutoResumeSuspendedHolds - canreservefromotherbranches - decreaseLoanHighHolds - DisplayMultiPlaceHold - emailLibrarianWhenHoldIsPlaced - ExpireReservesMaxPickUpDelay - OPACAllowHoldDateInFuture - OPACAllowUserToChooseBranch - ReservesControlBranch - ReservesNeedReturns - SuspendHoldsIntranet - SuspendHoldsOpac - TransferWhenCancelAllWaitingHolds - AllowAllMessageDeletion - AllowOfflineCirculation - CircAutocompl - CircAutoPrintQuickSlip - DisplayClearScreenButton - FilterBeforeOverdueReport - FineNotifyAtCheckin - itemBarcodeFallbackSearch - itemBarcodeInputFilter - previousIssuesDefaultSortOrder - RecordLocalUseOnReturn - soundon - SpecifyDueDate - todaysIssuesDefaultSortOrder - UpdateTotalIssuesOnCirc - UseTablesortForCirc - WaitingNotifyAtCheckin - AllowSelfCheckReturns - AutoSelfCheckAllowed - FRBRizeEditions - OPACFRBRizeEditions - AmazonCoverImages - OPACAmazonCoverImages - Babeltheque - BakerTaylorEnabled - GoogleJackets - HTML5MediaEnabled - IDreamBooksReadometer - IDreamBooksResults - IDreamBooksReviews - LibraryThingForLibrariesEnabled - LocalCoverImages - OPACLocalCoverImages - NovelistSelectEnabled - XISBN - OpenLibraryCovers - UseKohaPlugins - SyndeticsEnabled - TagsEnabled - CalendarFirstDayOfWeek - opaclanguagesdisplay - AuthoritiesLog - BorrowersLog - CataloguingLog - FinesLog - IssueLog - LetterLog - ReturnLog - SubscriptionLog - AuthorisedValueImages - BiblioDefaultView - COinSinOPACResults - DisplayOPACiconsXSLT - hidelostitems - HighlightOwnItemsOnOPAC - OpacAddMastheadLibraryPulldown - OPACDisplay856uAsImage - OpacHighlightedWords - OpacKohaUrl - OpacMaintenance - OpacPublic - OpacSeparateHoldings - OPACShowBarcode - OPACShowCheckoutName - OpacShowFiltersPulldownMobile - OPACShowHoldQueueDetails - OpacShowLibrariesPulldownMobile - OpacShowRecentComments - OPACShowUnusedAuthorities - OpacStarRatings - opacthemes - OPACURLOpenInNewWindow - OpacAuthorities - opacbookbag - OpacBrowser - OpacBrowseResults - OpacCloud - OPACFinesTab - OpacHoldNotes - OpacItemLocation - OpacPasswordChange - OPACPatronDetails - OPACpatronimages - OPACPopupAuthorsSearch - OpacTopissue - opacuserlogin - QuoteOfTheDay - RequestOnOpac - reviewson - ShowReviewer - ShowReviewerPhoto - SocialNetworks - suggestion - AllowPurchaseSuggestionBranchChoice - OpacAllowPublicListCreation - OpacAllowSharingPrivateLists - OPACItemHolds - OpacRenewalAllowed - OpacRenewalBranch - OPACViewOthersSuggestions - SearchMyLibraryFirst - singleBranchMode - AnonSuggestions - EnableOpacSearchHistory - OPACPrivacy - opacreadinghistory - TrackClicks - PatronSelfRegistration - OPACShelfBrowser - AddPatronLists - AutoEmailOpacUser - AutoEmailPrimaryAddress - autoMemberNum - BorrowerRenewalPeriodBase - checkdigit - EnableBorrowerFiles - EnhancedMessagingPreferences - ExtendedPatronAttributes - intranetreadinghistory - memberofinstitution - patronimages - TalkingTechItivaPhoneNotification - uppercasesurnames - IncludeSeeFromInSearches - OpacGroupResults - QueryAutoTruncate - QueryFuzzy - QueryStemming - QueryWeightFields - TraceCompleteSubfields - TraceSubjectSubdivisions - UseICU - UseQueryParser - defaultSortField - displayFacetCount - OPACdefaultSortField - OPACItemsResultsDisplay - expandedSearchOption - IntranetNumbersPreferPhrase - OPACNumbersPreferPhrase - opacSerialDefaultTab - RenewSerialAddsSuggestion - RoutingListAddReserves - RoutingSerials - SubscriptionHistory - Display856uAsImage - DisplayIconsXSLT - StaffAuthorisedValueImages - template - yuipath - HidePatronName - intranetbookbag - StaffDetailItemSelection - viewISBD - viewLabeledMARC - viewMARC - ILS-DI - OAI-PMH - version/) { + foreach ( + qw/ + AcqCreateItem + AcqWarnOnDuplicateInvoice + AcqViewBaskets + BasketConfirmations + OrderPdfFormat + casAuthentication + casLogout + AllowPkiAuth + DebugLevel + delimiter + noItemTypeImages + virtualshelves + AutoLocation + IndependentBranches + SessionStorage + Persona + AuthDisplayHierarchy + AutoCreateAuthorities + BiblioAddsAuthorities + dontmerge + UseAuthoritiesForTracings + CatalogModuleRelink + hide_marc + IntranetBiblioDefaultView + LabelMARCView + OpacSuppression + SeparateHoldings + UseControlNumber + advancedMARCeditor + DefaultClassificationSource + EasyAnalyticalRecords + autoBarcode + item-level_itypes + marcflavour + PrefillItem + z3950NormalizeAuthor + SpineLabelAutoPrint + SpineLabelShowPrintOnBibDetails + BlockReturnOfWithdrawnItems + CalculateFinesOnReturn + AgeRestrictionOverride + AllFinesNeedOverride + AllowFineOverride + AllowItemsOnHoldCheckout + AllowNotForLoanOverride + AllowRenewalLimitOverride + AllowReturnToBranch + AllowTooManyOverride + AutomaticItemReturn + AutoRemoveOverduesRestrictions + CircControl + HomeOrHoldingBranch + HomeOrHoldingBranchReturn + InProcessingToShelvingCart + IssueLostItem + IssuingInProcess + ManInvInNoissuesCharge + OverduesBlockCirc + RenewalPeriodBase + RenewalSendNotice + RentalsInNoissuesCharge + ReturnBeforeExpiry + ReturnToShelvingCart + TransfersMaxDaysWarning + UseBranchTransferLimits + useDaysMode + UseTransportCostMatrix + UseCourseReserves + finesCalendar + FinesIncludeGracePeriod + finesMode + RefundLostItemFeeOnReturn + WhenLostChargeReplacementFee + WhenLostForgiveFine + AllowHoldDateInFuture + AllowHoldPolicyOverride + AllowHoldsOnDamagedItems + AllowHoldsOnPatronsPossessions + AllowOnShelfHolds + AutoResumeSuspendedHolds + canreservefromotherbranches + decreaseLoanHighHolds + DisplayMultiPlaceHold + emailLibrarianWhenHoldIsPlaced + ExpireReservesMaxPickUpDelay + OPACAllowHoldDateInFuture + OPACAllowUserToChooseBranch + ReservesControlBranch + ReservesNeedReturns + SuspendHoldsIntranet + SuspendHoldsOpac + TransferWhenCancelAllWaitingHolds + AllowAllMessageDeletion + AllowOfflineCirculation + CircAutocompl + CircAutoPrintQuickSlip + DisplayClearScreenButton + FilterBeforeOverdueReport + FineNotifyAtCheckin + itemBarcodeFallbackSearch + itemBarcodeInputFilter + previousIssuesDefaultSortOrder + RecordLocalUseOnReturn + soundon + SpecifyDueDate + todaysIssuesDefaultSortOrder + UpdateTotalIssuesOnCirc + UseTablesortForCirc + WaitingNotifyAtCheckin + AllowSelfCheckReturns + AutoSelfCheckAllowed + FRBRizeEditions + OPACFRBRizeEditions + AmazonCoverImages + OPACAmazonCoverImages + Babeltheque + BakerTaylorEnabled + GoogleJackets + HTML5MediaEnabled + IDreamBooksReadometer + IDreamBooksResults + IDreamBooksReviews + LibraryThingForLibrariesEnabled + LocalCoverImages + OPACLocalCoverImages + NovelistSelectEnabled + XISBN + OpenLibraryCovers + UseKohaPlugins + SyndeticsEnabled + TagsEnabled + CalendarFirstDayOfWeek + opaclanguagesdisplay + AuthoritiesLog + BorrowersLog + CataloguingLog + FinesLog + IssueLog + LetterLog + ReturnLog + SubscriptionLog + AuthorisedValueImages + BiblioDefaultView + COinSinOPACResults + DisplayOPACiconsXSLT + hidelostitems + HighlightOwnItemsOnOPAC + OpacAddMastheadLibraryPulldown + OPACDisplay856uAsImage + OpacHighlightedWords + OpacKohaUrl + OpacMaintenance + OpacPublic + OpacSeparateHoldings + OPACShowBarcode + OPACShowCheckoutName + OpacShowFiltersPulldownMobile + OPACShowHoldQueueDetails + OpacShowLibrariesPulldownMobile + OpacShowRecentComments + OPACShowUnusedAuthorities + OpacStarRatings + opacthemes + OPACURLOpenInNewWindow + OpacAuthorities + opacbookbag + OpacBrowser + OpacBrowseResults + OpacCloud + OPACFinesTab + OpacHoldNotes + OpacItemLocation + OpacPasswordChange + OPACPatronDetails + OPACpatronimages + OPACPopupAuthorsSearch + OpacTopissue + opacuserlogin + QuoteOfTheDay + RequestOnOpac + reviewson + ShowReviewer + ShowReviewerPhoto + SocialNetworks + suggestion + AllowPurchaseSuggestionBranchChoice + OpacAllowPublicListCreation + OpacAllowSharingPrivateLists + OPACItemHolds + OpacRenewalAllowed + OpacRenewalBranch + OPACViewOthersSuggestions + SearchMyLibraryFirst + singleBranchMode + AnonSuggestions + EnableOpacSearchHistory + OPACPrivacy + opacreadinghistory + TrackClicks + PatronSelfRegistration + OPACShelfBrowser + AddPatronLists + AutoEmailOpacUser + AutoEmailPrimaryAddress + autoMemberNum + BorrowerRenewalPeriodBase + checkdigit + EnableBorrowerFiles + EnhancedMessagingPreferences + ExtendedPatronAttributes + intranetreadinghistory + memberofinstitution + patronimages + TalkingTechItivaPhoneNotification + uppercasesurnames + IncludeSeeFromInSearches + OpacGroupResults + QueryAutoTruncate + QueryFuzzy + QueryStemming + QueryWeightFields + TraceCompleteSubfields + TraceSubjectSubdivisions + UseICU + UseQueryParser + defaultSortField + displayFacetCount + OPACdefaultSortField + OPACItemsResultsDisplay + expandedSearchOption + IntranetNumbersPreferPhrase + OPACNumbersPreferPhrase + opacSerialDefaultTab + RenewSerialAddsSuggestion + RoutingListAddReserves + RoutingSerials + SubscriptionHistory + Display856uAsImage + DisplayIconsXSLT + StaffAuthorisedValueImages + template + yuipath + HidePatronName + intranetbookbag + StaffDetailItemSelection + viewISBD + viewLabeledMARC + viewMARC + ILS-DI + OAI-PMH + version + / + ) + { $report->{systempreferences}{$_} = C4::Context->preference($_); } return $report; @@ -369,16 +338,18 @@ Send to hea.koha-community.org database informations =cut sub ReportToCommunity { - my $data = shift; - my $json = uri_encode(to_json($data), 1); - - my $ua = LWP::UserAgent->new; - my $req = HTTP::Request->new(POST => "http://hea.koha-community.org/upload.pl"); - $req->content_type('application/x-www-form-urlencoded'); - $req->content("data=$json"); - my $res = $ua->request($req); - my $content = from_json($res->decoded_content); - C4::Context->set_preference('UsageStatsID', $content->{library}{library_id}); + my $data = shift; + my $json = uri_encode( to_json($data), 1 ); + + my $ua = LWP::UserAgent->new; + my $req = + HTTP::Request->new( POST => "http://hea.koha-community.org/upload.pl" ); + $req->content_type('application/x-www-form-urlencoded'); + $req->content("data=$json"); + my $res = $ua->request($req); + my $content = from_json( $res->decoded_content ); + C4::Context->set_preference( 'UsageStatsID', + $content->{library}{library_id} ); } =head2 _count @@ -390,13 +361,12 @@ Count the number of records in $table tables =cut sub _count { - my $table = shift; + my $table = shift; - my $dbh = C4::Context->dbh; - my $sth = $dbh->prepare("SELECT count(*) from $table"); - $sth->execute; - return $sth->fetchrow_array; + my $dbh = C4::Context->dbh; + my $sth = $dbh->prepare("SELECT count(*) from $table"); + $sth->execute; + return $sth->fetchrow_array; } -&LaunchCron; 1; --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/admin.pref +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/admin.pref @@ -115,18 +115,15 @@ Administration: - is the search engine used. Usage Stats: - - - pref: UsageStatsLastUpdateTime - default: 0 - - stores the last time when cron were launch - - - - pref: UsageStatsID - default: - - - - - pref: UsageStatsShare - default: - - + default: 0 + choices: + yes: Share + no: "Don't share" + - data volumetry with Koha community. You can see the data on the Hea Koha community website. - + - The library name - pref: UsageStatsLibraryName - default: - - + - will be shown on Hea Koha community website. + - If this name is empty, you will sent data anonymously + - Note that this value has no effect if UsageStatsShare system preference is set to "Don't share" --- a/misc/cronjobs/share_usage_with_koha_community.pl +++ a/misc/cronjobs/share_usage_with_koha_community.pl @@ -0,0 +1,98 @@ +#!/usr/bin/perl + +use Modern::Perl; + +use Pod::Usage; +use Getopt::Long; + +use C4::Context; +use C4::UsageStats; + + +my ( $help, $verbose ); +GetOptions( + 'h|help' => \$help, + 'v|verbose' => \$verbose, +) || pod2usage(1); + +if ($help) { + pod2usage(1); +} + +unless( C4::Context->preference('UsageStatsShare') ) { + pod2usage (q|The UsageStats system preference is not set. If your library wants to share their usage statistics with the Koha community, you have to switch on this system preference|); + exit 1; +} + +my $need_update = C4::UsageStats::NeedUpdate(); + +if ( $need_update ) { + say "Data need to be updated" if $verbose; + my $report = C4::UsageStats::BuildReport(); + C4::UsageStats::ReportToCommunity($report); + C4::Context->set_preference('UsageStatsLastUpdateTime', strftime("%s", localtime)); +} elsif( $verbose ) { + say "Data don't need to be updated"; +} + +=head1 NAME + +share_usage_with_koha_community.pl - Share your library's usage with the Koha community + +=head1 SYNOPSIS + +share_usage_with_koha_community.pl [-h|--help] [-v|--verbose] + +If the UsageStatsShare system preference is set, you can launch this script to share your usage with the Koha community. + +Collecting Koha usage statistics will help developpers to know how Koha is used across the world. + +This script will sent the volumetry for the biblio and authority records, issues, reserves, orders and subscription. + +Only the total number is retrieved. In no case private data will be shared! + +In order to know which parts of Koha modules are used, this script will collect some system preference values. + +If you want to tell us who you are, you can fill the UsageStatsLibraryName system preference with your library name. + +All these data will be analysed on the http://hea.koha-community.org Koha community website. + +IMPORTANT : please do NOT run the cron on the 1st, but on another day. The idea is to avoid all +Koha libraries sending their data at the same time ! So choose any day between 1 and 28 ! + +=head1 OPTIONS + +=over + +=item B<-h|--help> + +Print a brief help message + +=item B<-v|--verbose> + +Verbose mode. + +=back + +=head1 AUTHOR + +Alex Arnaud + +Jonathan Druart + +=head1 COPYRIGHT + +Copyright 2014 BibLibre + +=head1 LICENSE + +This file is part of Koha. + +Koha is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software +Foundation; either version 3 of the License, or (at your option) any later version. + +You should have received a copy of the GNU General Public License along +with Koha; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +=cut --