Marcel de Rooy
f953cc26e6
[1] The preference was sent to HEA. We can now send both AuthorityMergeMode as well as AuthorityMergeLimit. [2] A comment in authorities/merge.pl is removed. Note that a subsequent patch will modify and test the cron job. [3] Script misc/batchRebuildItemsTables.pl temporarily enabled dontmerge. This is equivalent to setting the mergelimit to zero. The function defnonull is no longer needed. (If the pref was NULL, we restore that value. Sub merge won't mind.) Test plan: [1] Run t/db_dependent/UsageStats.t [2] Run misc/batchRebuildItemsTables.pl -t This just ensures you it still compiles; the changes speak for itself. [3] Now git grep on dontmerge. You should only find hits in atomicupdate and misc/translator/po. Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl> Signed-off-by: Marc Véron <veron@veron.ch> Signed-off-by: Jacek Ablewicz <abl@biblos.pk.edu.pl> Signed-off-by: Julian Maurice <julian.maurice@biblibre.com> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
392 lines
10 KiB
Perl
392 lines
10 KiB
Perl
package C4::UsageStats;
|
|
|
|
# This file is part of Koha.
|
|
#
|
|
# 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.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with Koha; if not, see <http://www.gnu.org/licenses>.
|
|
|
|
use Modern::Perl;
|
|
use C4::Context;
|
|
use POSIX qw(strftime);
|
|
use LWP::UserAgent;
|
|
use JSON;
|
|
|
|
use Koha::Libraries;
|
|
|
|
=head1 NAME
|
|
|
|
C4::UsageStats
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
This package contains what is needed to report Koha statistics to hea
|
|
hea.koha-community.org is the server that centralize Koha setups informations
|
|
Koha libraries are encouraged to provide informations about their collections,
|
|
their structure,...
|
|
|
|
=head2 NeedUpdate
|
|
|
|
$needUpdateYN = C4::UsageStats::NeedUpdate;
|
|
|
|
Returns Y (1) if the last update is more than 1 month old
|
|
This way, even if the cronjob is run every minute, the webservice will be called
|
|
only once a month !
|
|
|
|
=cut
|
|
|
|
sub NeedUpdate {
|
|
my $lastupdated = C4::Context->preference('UsageStatsLastUpdateTime') || 0;
|
|
my $now = strftime( "%s", localtime );
|
|
|
|
# Need to launch cron.
|
|
return 1 if $now - $lastupdated >= 2592000;
|
|
|
|
# Data don't need to be updated
|
|
return 0;
|
|
}
|
|
|
|
sub BuildReport {
|
|
my $report;
|
|
my @libraries;
|
|
if( C4::Context->preference('UsageStatsLibrariesInfo') ) {
|
|
my $libraries = Koha::Libraries->search;
|
|
while ( my $library = $libraries->next ) {
|
|
push @libraries, { name => $library->branchname, url => $library->branchurl, country => $library->branchcountry, geolocation => $library->geolocation, };
|
|
}
|
|
}
|
|
$report = {
|
|
installation => {
|
|
koha_id => C4::Context->preference('UsageStatsID') || 0,
|
|
name => C4::Context->preference('UsageStatsLibraryName') || q||,
|
|
url => C4::Context->preference('UsageStatsLibraryUrl') || q||,
|
|
type => C4::Context->preference('UsageStatsLibraryType') || q||,
|
|
country => C4::Context->preference('UsageStatsCountry') || q||,
|
|
geolocation => C4::Context->preference('UsageStatsGeolocation') || q||,
|
|
},
|
|
libraries => \@libraries,
|
|
};
|
|
|
|
# Get database volumetry.
|
|
foreach (
|
|
qw/biblio items auth_header old_issues old_reserves borrowers aqorders subscription/
|
|
)
|
|
{
|
|
$report->{volumetry}{$_} = _count($_);
|
|
}
|
|
|
|
# Get systempreferences.
|
|
foreach (
|
|
qw/
|
|
AcqCreateItem
|
|
AcqWarnOnDuplicateInvoice
|
|
AcqViewBaskets
|
|
BasketConfirmations
|
|
OrderPdfFormat
|
|
casAuthentication
|
|
casLogout
|
|
AllowPKIAuth
|
|
DebugLevel
|
|
delimiter
|
|
noItemTypeImages
|
|
virtualshelves
|
|
AutoLocation
|
|
IndependentBranches
|
|
SessionStorage
|
|
Persona
|
|
AuthDisplayHierarchy
|
|
AutoCreateAuthorities
|
|
BiblioAddsAuthorities
|
|
AuthorityMergeLimit
|
|
AuthorityMergeMode
|
|
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
|
|
AllowItemsOnHoldCheckoutSCO
|
|
AllowNotForLoanOverride
|
|
AllowRenewalLimitOverride
|
|
AllowReturnToBranch
|
|
AllowTooManyOverride
|
|
AutomaticItemReturn
|
|
AutoRemoveOverduesRestrictions
|
|
CircControl
|
|
HomeOrHoldingBranch
|
|
InProcessingToShelvingCart
|
|
IssueLostItem
|
|
IssuingInProcess
|
|
ManInvInNoissuesCharge
|
|
OverduesBlockCirc
|
|
RenewalPeriodBase
|
|
RenewalSendNotice
|
|
RentalsInNoissuesCharge
|
|
ReturnBeforeExpiry
|
|
ReturnToShelvingCart
|
|
TransfersMaxDaysWarning
|
|
UseBranchTransferLimits
|
|
useDaysMode
|
|
UseTransportCostMatrix
|
|
UseCourseReserves
|
|
finesCalendar
|
|
FinesIncludeGracePeriod
|
|
finesMode
|
|
RefundLostOnReturnControl
|
|
WhenLostChargeReplacementFee
|
|
WhenLostForgiveFine
|
|
AllowHoldDateInFuture
|
|
AllowHoldPolicyOverride
|
|
AllowHoldsOnDamagedItems
|
|
AllowHoldsOnPatronsPossessions
|
|
AutoResumeSuspendedHolds
|
|
canreservefromotherbranches
|
|
decreaseLoanHighHolds
|
|
DisplayMultiPlaceHold
|
|
emailLibrarianWhenHoldIsPlaced
|
|
ExpireReservesMaxPickUpDelay
|
|
OPACAllowHoldDateInFuture
|
|
OPACAllowUserToChooseBranch
|
|
ReservesControlBranch
|
|
ReservesNeedReturns
|
|
SuspendHoldsIntranet
|
|
SuspendHoldsOpac
|
|
TransferWhenCancelAllWaitingHolds
|
|
AllowAllMessageDeletion
|
|
AllowOfflineCirculation
|
|
CircAutocompl
|
|
CircAutoPrintQuickSlip
|
|
DisplayClearScreenButton
|
|
FilterBeforeOverdueReport
|
|
FineNotifyAtCheckin
|
|
itemBarcodeFallbackSearch
|
|
itemBarcodeInputFilter
|
|
previousIssuesDefaultSortOrder
|
|
RecordLocalUseOnReturn
|
|
AudioAlerts
|
|
SpecifyDueDate
|
|
todaysIssuesDefaultSortOrder
|
|
UpdateTotalIssuesOnCirc
|
|
UseTablesortForCirc
|
|
WaitingNotifyAtCheckin
|
|
AllowSelfCheckReturns
|
|
AutoSelfCheckAllowed
|
|
FRBRizeEditions
|
|
OPACFRBRizeEditions
|
|
AmazonCoverImages
|
|
OPACAmazonCoverImages
|
|
Babeltheque
|
|
BakerTaylorEnabled
|
|
GoogleJackets
|
|
HTML5MediaEnabled
|
|
IDreamBooksReadometer
|
|
IDreamBooksResults
|
|
IDreamBooksReviews
|
|
LibraryThingForLibrariesEnabled
|
|
LocalCoverImages
|
|
OPACLocalCoverImages
|
|
NovelistSelectEnabled
|
|
XISBN
|
|
OpenLibraryCovers
|
|
OpenLibrarySearch
|
|
UseKohaPlugins
|
|
SyndeticsEnabled
|
|
TagsEnabled
|
|
CalendarFirstDayOfWeek
|
|
opaclanguagesdisplay
|
|
AuthoritiesLog
|
|
BorrowersLog
|
|
CataloguingLog
|
|
FinesLog
|
|
IssueLog
|
|
LetterLog
|
|
ReturnLog
|
|
SubscriptionLog
|
|
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
|
|
OpacRenewalAllowed
|
|
OpacRenewalBranch
|
|
OPACViewOthersSuggestions
|
|
SearchMyLibraryFirst
|
|
AnonSuggestions
|
|
EnableOpacSearchHistory
|
|
OPACPrivacy
|
|
opacreadinghistory
|
|
TrackClicks
|
|
PatronSelfRegistration
|
|
OPACShelfBrowser
|
|
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
|
|
template
|
|
yuipath
|
|
HidePatronName
|
|
intranetbookbag
|
|
StaffDetailItemSelection
|
|
viewISBD
|
|
viewLabeledMARC
|
|
viewMARC
|
|
ILS-DI
|
|
OAI-PMH
|
|
version
|
|
/
|
|
)
|
|
{
|
|
$report->{systempreferences}{$_} = C4::Context->preference($_);
|
|
}
|
|
return $report;
|
|
}
|
|
|
|
=head2 ReportToCommunity
|
|
|
|
ReportToCommunity;
|
|
|
|
Send to hea.koha-community.org database informations
|
|
|
|
=cut
|
|
|
|
sub ReportToCommunity {
|
|
my $data = shift;
|
|
my $json = encode_json($data);
|
|
|
|
my $url = "https://hea.koha-community.org/upload.pl";
|
|
my $ua = LWP::UserAgent->new;
|
|
my $res = $ua->post(
|
|
$url,
|
|
'Content-type' => 'application/json;charset=utf-8',
|
|
Content => $json,
|
|
);
|
|
my $content = decode_json( $res->decoded_content );
|
|
if ( $content->{koha_id} ) {
|
|
C4::Context->set_preference( 'UsageStatsID', $content->{koha_id} );
|
|
}
|
|
if ( $content->{id} ) {
|
|
C4::Context->set_preference( 'UsageStatsPublicID', $content->{id} );
|
|
}
|
|
}
|
|
|
|
=head2 _count
|
|
|
|
$data = _count($table);
|
|
|
|
Count the number of records in $table tables
|
|
|
|
=cut
|
|
|
|
sub _count {
|
|
my $table = shift;
|
|
|
|
my $dbh = C4::Context->dbh;
|
|
my $sth = $dbh->prepare("SELECT count(*) from $table");
|
|
$sth->execute;
|
|
return $sth->fetchrow_array;
|
|
}
|
|
|
|
1;
|