diff --git a/docs/upgrades/packages-7.5.40-7.6.10/merged.wgpkg b/docs/upgrades/packages-7.5.40-7.6.10/merged.wgpkg new file mode 100644 index 000000000..38291af26 Binary files /dev/null and b/docs/upgrades/packages-7.5.40-7.6.10/merged.wgpkg differ diff --git a/docs/upgrades/upgrade_7.5.24-7.6.0.pl b/docs/upgrades/upgrade_7.5.24-7.6.0.pl index 67c6ccfb1..403174ddb 100644 --- a/docs/upgrades/upgrade_7.5.24-7.6.0.pl +++ b/docs/upgrades/upgrade_7.5.24-7.6.0.pl @@ -23,6 +23,7 @@ use WebGUI::Session; use WebGUI::Storage; use WebGUI::Asset; use WebGUI::Asset::Sku::Product; +use WebGUI::Utility qw(isIn); my $toVersion = '7.6.0'; diff --git a/docs/upgrades/upgrade_7.5.40-7.6.10.pl b/docs/upgrades/upgrade_7.5.40-7.6.10.pl new file mode 100644 index 000000000..7ae0c9e64 --- /dev/null +++ b/docs/upgrades/upgrade_7.5.40-7.6.10.pl @@ -0,0 +1,1870 @@ +#!/usr/bin/env perl + +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2008 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +our ($webguiRoot); + +BEGIN { + $webguiRoot = "../.."; + unshift (@INC, $webguiRoot."/lib"); +} + +use strict; +use Getopt::Long; +use JSON; +use WebGUI::Asset::File::GalleryFile; +use WebGUI::Asset::Sku::Product; +use WebGUI::Asset::Template; +use WebGUI::Asset::Wobject::Collaboration; +use WebGUI::Asset::Wobject::GalleryAlbum; +use WebGUI::Asset::Wobject::Survey::ResponseJSON; +use WebGUI::Asset::Wobject::Survey::SurveyJSON; +use WebGUI::Asset::Wobject::Survey; +use WebGUI::Asset; +use WebGUI::ProfileField; +use WebGUI::Session; +use WebGUI::Shop::Pay; +use WebGUI::Shop::PayDriver; +use WebGUI::Storage; +use WebGUI::Utility qw(isIn); + +my $toVersion = '7.6.10'; +my $quiet; # this line required + + +my $session = start(); # this line required + +addUrlToAssetHistory ( $session ); ##This sub MUST GO FIRST +removeDoNothingOnDelete( $session ); +fixIsPublicOnTemplates ( $session ); +addSortOrderToFolder( $session ); +addLoginTimeStats( $session ); +addCSPostReceivedTemplate ( $session ); +redirectChoice ($session); +badgePriceDates ($session); +addIsDefaultTemplates( $session ); +addAdHocMailGroups( $session ); +makeAdminConsolePluggable( $session ); +migrateAssetsToNewConfigFormat($session); +deleteAdminBarTemplates($session); +repairBrokenProductSkus($session); +removeUnusedTemplates($session); +addExportExtensionsToConfigFile($session); +addThingyColumns( $session ); +addCommentsAspect( $session ); +addCommentsAspectToWiki( $session ); +addAssetDiscoveryService( $session ); +repairManageWorkflows($session); +addPreTextToThingyFields($session); +updateAddressBook($session); +changeDefaultPaginationInSearch($session); +upgradeToYui26($session); +addUsersOnlineMacro($session); +addProfileExtrasField($session); +addWorkflowToDataform( $session ); +installDataTableAsset( $session ); +installAjaxI18N( $session ); +installSiteIndex( $session ); +createLastUpdatedField($session); +createFieldShowOnline($session); +upgradeSyndicatedContentTemplates($session); +removeCaseInsensitiveConfig($session); +addVersionTagMode($session); +migrateSurvey($session); +addPosMode($session); +fixFriendsGroups( $session ); +upgradeAccount( $session ); +addExtendedProfilePrivileges( $session ); +addStorageUrlMacro( $session ); +addRecurringSubscriptionSwitch( $session ); +upgradeMatrix( $session ); +fixAccountMisspellings( $session ); +removeTemplateHeadBlock( $session ); +updateMatrixListingScores( $session ); +removeSqlForm( $session ); +addMatrixEditListingTemplate( $session ); +reFixAccountMisspellings($session); +addRichEditorInboxSetting( $session ); +alterSurveyJSONFields($session); + +finish($session); # this line required + + +#---------------------------------------------------------------------------- +# Describe what our function does +#sub exampleFunction { +# my $session = shift; +# print "\tWe're doing some stuff here that you should know about... " unless $quiet; +# # and here's our code +# print "DONE!\n" unless $quiet; +#} + +#Change the Survey and Survey_response tables' json fields to longText instead of longBlob to get back non-binary text +#---------------------------------------------------------------------------- +sub alterSurveyJSONFields{ + my $session = shift; + $session->db->write("alter table Survey modify surveyJSON longText"); + $session->db->write("alter table Survey_response modify responseJSON longText"); +} + +#---------------------------------------------------------------------------- +# Add ability to select which rich editor for messages between users +sub addRichEditorInboxSetting { + my $session = shift; + print "\tAdding rich editor selection to Inbox... " unless $quiet; + + $session->setting->add("inboxRichEditId","PBrichedit000000000001"); + + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +#Describe what our function does +sub reFixAccountMisspellings { + my $session = shift; + my $setting = $session->setting; + print "\tFix misspellings in Account settings... " unless $quiet; + # and here's our code + $setting->add("profileViewTemplateId", $setting->get('profileViewTempalteId') ); + $setting->add("profileErrorTemplateId", $setting->get('profileErrorTempalteId') ); + $setting->add("inboxLayoutTemplateId", $setting->get('inboxLayoutTempalteId') ); + $setting->add("friendsLayoutTemplateId", $setting->get('friendsLayoutTempalteId')); + $setting->remove("profileViewTempalteId"); + $setting->remove("profileErrorTempalteId"); + $setting->remove("inboxLayoutTempalteId"); + $setting->remove("friendsLayoutTempalteId"); + print "DONE!\n" unless $quiet; +} + +# Add editListingTemplate property to Matrix +sub addMatrixEditListingTemplate { + my $session = shift; + print "\tAdd editListingTemplate property to Matrix... " unless $quiet; + $session->db->write("alter table Matrix add editListingTemplateId char(22)"); + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- + +sub removeSqlForm { + my $session = shift; + print "\tOptionally removing Web Services Client...\n" unless $quiet; + my $db = $session->db; + unless ($db->quickScalar("select count(*) from asset where className='WebGUI::Asset::Wobject::WSClient'")) { + print "\t\tNot using it, so we're uninstalling it.\n" unless $quiet; + $session->config->delete("assets/WebGUI::Asset::Wobject::WSClient"); + my @ids = $db->buildArray("select distinct assetId from template where namespace = 'WSClient'"); + push @ids, qw(5YAbuwiVFUx-z8hcOAnsdQ); + foreach my $id (@ids) { + my $asset = WebGUI::Asset->newByDynamicClass($session, $id); + if (defined $asset) { + $asset->purge; + } + } + $db->write("drop table WSClient"); + } + else { + print "\t\tThis site uses Web Services Client, so we won't uninstall it.\n" unless $quiet; + } +} + +#---------------------------------------------------------------------------- + +sub updateMatrixListingScores { + my $session = shift; + print "\tUpdating score for every MatrixListing asset... " unless $quiet; + my $matrixListings = WebGUI::Asset->getRoot($session)->getLineage(['descendants'], + { + statesToInclude => ['published','trash','clipboard','clipboard-limbo','trash-limbo'], + statusToInclude => ['pending','approved','deleted','archived'], + includeOnlyClasses => ['WebGUI::Asset::MatrixListing'], + returnObjects => 1, + }); + + for my $matrixListing (@{$matrixListings}) + { + next unless defined $matrixListing; + my $score = $session->db->quickScalar("select sum(value) from MatrixListing_attribute + left join Matrix_attribute using(attributeId) + where matrixListingId = ? and fieldType = 'MatrixCompare'", + [$matrixListing->getId]); + $matrixListing->update({score => $score}); + } + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- + +sub removeTemplateHeadBlock { + my $session = shift; + print "\tMerging Template head blocks into the Extra Head Tags field... " unless $quiet; + my $sth = $session->db->prepare('select assetId, revisionDate, headBlock from template'); + $sth->execute(); + TMPL: while (my $templateData = $sth->hashRef) { + my $template = WebGUI::Asset->new($session, + $templateData->{assetId}, 'WebGUI::Asset::Template', + $templateData->{revisionDate}, + ); + next TMPL unless defined $template; + if ($template->get('namespace') eq 'style') { + $template->update({ + extraHeadTags => '', + }); + } + else { + $template->update({ + extraHeadTags => $template->getExtraHeadTags . $templateData->{headBlock}, + }); + } + } + $session->db->write('ALTER TABLE template DROP COLUMN headBlock'); + # and here's our code + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +#Describe what our function does +sub fixAccountMisspellings { + my $session = shift; + my $setting = $session->setting; + print "\tFix misspellings in Account settings... " unless $quiet; + # and here's our code + $setting->add("profileViewTemplateId", $setting->get('profileViewTempalteId') ); + $setting->add("profileErrorTemplateId", $setting->get('profileErrorTempalteId') ); + $setting->add("inboxLayoutTemplateId", $setting->get('inboxLayoutTempalteId') ); + $setting->add("friendsLayoutTemplateId", $setting->get('friendsLayoutTempalteId')); + $setting->remove("profileViewTemplateId"); + $setting->remove("profileErrorTemplateId"); + $setting->remove("inboxLayoutTemplateId"); + $setting->remove("friendsLayoutTemplateId"); + print "DONE!\n" unless $quiet; +} + +sub upgradeMatrix { + my $session = shift; + print "\tUpgrading matrix assets... \n" unless $quiet; + my $db = $session->db; + $db->write("alter table Matrix drop column groupToRate, drop column groupToAdd, drop column privilegedGroup, + drop column ratingTimeout, drop column ratingTimeoutPrivileged, drop column ratingDetailTemplateId, + drop column visitorCacheTimeout"); + $db->write("alter table Matrix add column defaultSort char(22) not null default 'score', + add column compareColorNo char(22) default '#ffaaaa', + add column compareColorLimited char(22) not null default '#ffffaa', + add column compareColorCostsExtra char(22) not null default '#ffffaa', + add column compareColorFreeAddOn char(22) not null default '#ffffaa', + add column compareColorYes char(22) not null default '#aaffaa', + add column submissionApprovalWorkflowId char(22) not null, + add column ratingsDuration int(11) not null default 7776000"); + $db->write("create table MatrixListing ( + assetId char(22) binary not null, + revisionDate bigint not null, + screenshots char(22), + description text, + version char(255), + views int(11), + compares int(11), + clicks int(11), + viewsLastIp char(255), + comparesLastIp char(255), + clicksLastIp char(255), + lastUpdated int(11), + maintainer char(22), + manufacturerName char(255), + manufacturerURL char(255), + productURL char(255), + score int(11), + primary key (assetId, revisionDate) + )"); + $db->write("create table MatrixListing_attribute ( + matrixId char(22) not null, + matrixListingId char(22) not null, + attributeId char(22) not null, + value char(255), + primary key (matrixId, matrixListingId, attributeId) + )"); + $db->write("alter table Matrix_rating rename MatrixListing_rating"); + $db->write("alter table Matrix_ratingSummary rename MatrixListing_ratingSummary"); + $db->write("alter table Matrix_field rename Matrix_attribute"); + $db->write("alter table Matrix_attribute drop column label"); + $db->write("alter table Matrix_attribute add column options text"); + $db->write("alter table Matrix_attribute change fieldType fieldType char(255) not null default 'MatrixCompare'"); + $db->write("alter table Matrix_attribute change fieldId attributeId char(22) not null"); + $db->write("update Matrix_attribute set fieldType = 'MatrixCompare' where fieldType = 'GoodBad'"); + $db->write("update Matrix_attribute set fieldType = 'Combo' where fieldType != 'MatrixCompare'"); + $db->write("update Matrix_listingData set value = 0 where value = 'No'"); + $db->write("update Matrix_listingData set value = 1 where value = 'Limited'"); + $db->write("update Matrix_listingData set value = 2 where value = 'Costs Extra'"); + $db->write("update Matrix_listingData set value = 3 where value = 'Free Add On'"); + $db->write("update Matrix_listingData set value = 4 where value = 'Yes'"); + + # get existing Matrix wobjects + my $matrices = WebGUI::Asset->getRoot($session)->getLineage(['descendants'], + { + statesToInclude => ['published','trash','clipboard','clipboard-limbo','trash-limbo'], + statusToInclude => ['pending','approved','deleted','archived'], + includeOnlyClasses => ['WebGUI::Asset::Wobject::Matrix'], + returnObjects => 1, + }); + + for my $matrix (@{$matrices}) + { + next unless defined $matrix; + # If the asset is in the trash, ignore the migration, we're just going + # to purge it. + if ($matrix->get("state") =~ m/trash/) { + $matrix->purge; + next; + } + + # get listings for each Matrix + my @listings = @{ $db->buildArrayRefOfHashRefs("select * from Matrix_listing where assetId =?",[$matrix->getId]) }; + foreach my $listing (@listings){ + # add MatrixListing asset for each listing + print "Migrating listing: ".$listing->{productName}."\n" unless $quiet;; + $listing->{className} = 'WebGUI::Asset::MatrixListing'; + $listing->{assetId} = 'new'; + $listing->{title} = $listing->{productName}; + $listing->{version} = $listing->{versionNumber}; + $listing->{screenshots} = $listing->{storageId}; + $listing->{productURL} = $listing->{productUrl}; + $listing->{manufacturerURL} = $listing->{manufacturerUrl}; + my $newMatrixListing = $matrix->addChild($listing,undef,undef,{skipAutoCommitWorkflows=>1}); + # get listingData for each listing + my $listingData = $db->buildArrayRefOfHashRefs("select * from Matrix_listingData where listingId =?",[$listing->{listingId}]); + # add listing attribute for each listing field + foreach my $attribute (@{$listingData}){ + $db->write("insert into MatrixListing_attribute (matrixId, matrixListingId, attributeId, value) values + (?,?,?,?)",[$matrix->getId,$newMatrixListing->getId,$attribute->{fieldId},$attribute->{value}]); + } + # update listingIds to MatrixListingIds in MatrixListing_rating/Summary tables + $db->write("update MatrixListing_rating set listingId = ? where listingId =?", + [$newMatrixListing->getId,$listing->{listingId}]); + $db->write("update MatrixListing_ratingSummary set listingId = ? where listingId =?", + [$newMatrixListing->getId,$listing->{listingId}]); + # migrate comments + if($listing->{forumId}){ + my $forum = WebGUI::Asset::Wobject::Collaboration->new($session, $listing->{forumId}); + my @comments = @{ $forum->getLineage(['descendants'], { + includeOnlyClasses => ["WebGUI::Asset::Post", "WebGUI::Asset::Post::Thread"], + returnObjects => 1, + }) }; + foreach my $comment (@comments){ + # add comment + my $content = $comment->get('content'); + $content =~ s/^

//; + $content =~ s/<\/p>//; + my $ownerUser = WebGUI::User->new($session,$comment->get('ownerUserId')); + $newMatrixListing->addComment($content,0,$ownerUser); + } + } + } + } + $db->write("drop table Matrix_listing"); + $db->write("drop table Matrix_listingData"); + print "\tDONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub addExtendedProfilePrivileges { + my $session = shift; + + print qq{\tExtending User Profile Privileges..} if !$quiet; + + my $userProfDesc = $session->db->buildHashRef('describe userProfileData'); + if(grep { $_ =~ /^wg_privacySettings/ } keys %{$userProfDesc}) { + $session->db->write("alter table userProfileData drop column wg_privacySettings"); + } + $session->db->write("alter table userProfileData add wg_privacySettings longtext"); + + my $fields = WebGUI::ProfileField->getFields($session); + + my $users = $session->db->buildArrayRef("select userId from users"); + foreach my $userId (@{$users}) { + my $hash = {}; + foreach my $field (@{$fields}) { + if($field->getId eq "publicEmail") { + my $u = WebGUI::User->new($session,$userId); + $hash->{$field->getId} = $u->profileField("publicEmail") ? "all" : "none"; + next; + } + $hash->{$field->getId} = $field->isViewable ? "all" : "none"; + } + my $json = JSON->new->encode($hash); + $session->db->write("update userProfileData set wg_privacySettings=? where userId=?",[$json,$userId]); + } + + #Delete the public email field + my $publicEmail = WebGUI::ProfileField->new($session,"publicEmail"); + if(defined $publicEmail) { + $publicEmail->delete; + } + + print qq{Finished\n} if !$quiet; +} + + +#---------------------------------------------------------------------------- +sub addPosMode { + my $session = shift; + + print qq{\tAdding Point of Sale mode to the Shop...} if !$quiet; + + my $db = $session->db(); + my $setting = $session->setting(); + + $setting->add("groupIdCashier","3"); + $db->write(q{ALTER TABLE cart drop column couponId}); + $db->write(q{ALTER TABLE cart add column posUserId char(22) binary}); + $db->write(q{ALTER TABLE transaction add column cashierUserId char(22) binary}); + $db->write(q{update transaction set cashierUserId=userId}); + $db->write(q{ALTER TABLE addressBook add column defaultAddressId char(22) binary}); + + print qq{Finished\n} if !$quiet; +} + +#---------------------------------------------------------------------------- +sub addStorageUrlMacro { + my $session = shift; + print qq{\tAdding StorageUrl Macro... } if !$quiet; + $session->config->addToHash( "macros", "StorageUrl" => "StorageUrl" ); + print qq{Done!\n} if !$quiet; +} + +#---------------------------------------------------------------------------- +# This method add support for versionTagMode +# +sub addVersionTagMode { + my $session = shift; + + print qq{\tAdding support for versionTagMode...} if !$quiet; + + my $db = $session->db(); + my $setting = $session->setting(); + + + $db->write(q{ALTER TABLE `assetVersionTag` ADD `isSiteWide` BOOL NOT NULL DEFAULT '0'}); + + ##Use the API... + my $newField = WebGUI::ProfileField->create( + $session, + 'versionTagMode', + { + label => 'WebGUI::International::get("version tag mode","WebGUI");', + visible => 1, + required => 0, + protected => 1, + editable => 1, + forceImageOnly => 0, + requiredForPasswordRecovery => 0, + fieldType => 'selectBox', + possibleValues => q| +{ + inherited => WebGUI::International::get("versionTagMode inherited"), + multiPerUser => WebGUI::International::get("versionTagMode multiPerUser"), + singlePerUser => WebGUI::International::get("versionTagMode singlePerUser"), + siteWide => WebGUI::International::get("versionTagMode siteWide"), + autoCommit => WebGUI::International::get("versionTagMode autoCommit"), +} +|, + dataDefault => 'inherited', + } + ); + $newField->setCategory(4); + $setting->add('versionTagMode', ''); + + # Keep autoRequestCommit if enabled + my $versionTagMode = q{multiPerUser}; + if ($setting->get('autoRequestCommit')) { + $versionTagMode = q{autoCommit}; + } + $setting->set('versionTagMode', $versionTagMode); + + $setting->remove('autoRequestCommit'); + + print qq{Finished\n} if !$quiet; + + return; +} #addVersionTagMode + + +#---------------------------------------------------------------------------- +# This method migrates the the old survey system and existing surveys to the new survey system +# +# +sub migrateSurvey{ + my $session = shift; + print "\tMigrating surveys to new survey system..." unless $quiet; + + _moveOldSurveyTables($session); + _addSurveyTables($session); + + + my $surveys = $session->db->buildArrayRefOfHashRefs( + "SELECT * FROM Survey_old s + where s.revisionDate = (select max(s1.revisionDate) from Survey_old s1 where s1.assetId = s.assetId)" + ); + + for my $survey(@$surveys){ + + #move over survey + $session->db->write("insert into Survey + values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", + [ + $$survey{groupToTakeSurvey},$$survey{groupToViewReports},$$survey{groupToViewReports},'PBtmpl0000000000000064','PBtmpl0000000000000063',$$survey{maxResponsesPerUser}, + $$survey{gradebookTemplateId},$$survey{assetId},'PBtmpl0000000000000061',$$survey{revisionDate},'GRUNFctldUgop-qRLuo_DA','AjhlNO3wZvN5k4i4qioWcg', + 'wAc4azJViVTpo-2NYOXWvg', '1oBRscNIcFOI-pETrCOspA','d8jMMMRddSQ7twP4l1ZSIw','CxMpE_UPauZA3p8jdrOABw','','{}',0,0,0 + ] + ); + + my $sjson = WebGUI::Asset::Wobject::Survey::SurveyJSON->new(); + #move over sections + my $sql = "select * from Survey_section_old where Survey_id = '$$survey{Survey_id}' order by sequenceNumber"; + my $sections = $session->db->buildArrayRefOfHashRefs($sql); + my $sId = 0; + my %sMap; + for my $section(@$sections){ + my $random = $$section{questionOrder} eq 'random' ? 1 : 0; + $sMap{$$section{Survey_sectionId}} = $sId; + $sjson->update([$sId++], + { + 'text','','title',$$section{sectionName},'variable',$$section{Survey_sectionId}, + 'questionsPerPage',$$survey{questionsPerPage},'randomizeQuestions',$random + } + ); + } + + #move over questions + $sql = "select * from Survey_question_old where Survey_id = '$$survey{Survey_id}' order by sequenceNumber"; + my $questions = $session->db->buildArrayRefOfHashRefs($sql); + my $qId = 0; + my %qMap = ('radioList','Multiple Choice','text','Text','HTMLArea','Text','textArea','Text'); + my %qS; + my $lastSection = $$questions[0]->{Survey_sectionid}; + for my $question(@$questions){ + if($lastSection ne $$question{Survey_sectionId}){ + $qId = 0; + } + $qMap{$$question{Survey_questionId}} = $qId; + $qS{$$question{Survey_questionId}} = $$question{Survey_sectionId}; + $sjson->update([$sMap{$$question{Survey_sectionId}},$qId++], + { + 'text',$$question{question},'variable',$$question{Survey_questionId},'allowComment',$$question{allowComment}, + 'randomizeAnswers',$$question{randomizeAnswers},'questionType',$qMap{$$question{answerFieldType}} + } + ); + $lastSection = $$question{Survey_sectionId}; + } + + #move over answers + $sql = "select * from Survey_answer_old where Survey_id = '$$survey{Survey_id}' order by sequenceNumber"; + my $answers = $session->db->buildArrayRefOfHashRefs($sql); + my $aId = 0; + my %aMap; + my $lastQuestion = $$answers[0]->{Survey_questionId}; + for my $answer(@$answers){ + if($lastQuestion ne $$answer{Survey_questionId}){ + $aId = 0; + } + $aMap{$$survey{Survey_answerId}} = $aId; + $sjson->update([$sMap{$qS{$$answer{Survey_questionId}}},$qMap{$$answer{Survey_questionId}},$aId++], + { + 'text',$$answer{answer},'goto',$$answer{Survey_questionId},'recordedAnswer',$$answer{answer}, + 'isCorrect',$$answer{isCorrect},'NEED TO MAP QUESTION TYPES' + } + ); + $lastQuestion = $$answer{Survey_questionId}; + } + + my $date = $session->db->quickScalar('select max(revisionDate) from Survey where assetId = ?',[$$survey{assetId}]); + $session->db->write('update Survey set surveyJSON = ? where assetId = ? and revisionDate = ?',[$sjson->freeze,$$survey{assetId},$date]); + + my $rjson = WebGUI::Asset::Wobject::Survey::ResponseJSON->new(undef,undef,$sjson); + $rjson->createSurveyOrder(); + #move over responses + $sql = "select * from Survey_response_old where Survey_id = '$$survey{Survey_id}'"; + my $responses = $session->db->buildArrayRefOfHashRefs($sql); + for my $response(@$responses){ + $session->db->write('insert into Survey_response values(?,?,?,?,?,?,?,?,?,?)', + [ + $$survey{assetId},$$response{Survey_responseId},$$response{userId},$$response{userName},$$response{ipAddress},$$response{startDate},$$response{endDate}, + $$response{isComplete},undef,'{}' + ] + ); + #$sql = "select * from Survey_questionResponse_old where Survey_responseId = '$$response{Survey_responseId}'"; + #my $qresponses = $session->db->buildArrayRefOfHashRefs($sql); + #for my $qresponse(@$qresponses){ + #} + } + } + + print "Finished\n" unless $quiet; +} + + +sub _moveOldSurveyTables{ + my $session = shift; + eval{ + $session->db->write("alter table Survey rename to Survey_old"); + $session->db->write("alter table Survey_answer rename to Survey_answer_old"); + $session->db->write("alter table Survey_question rename to Survey_question_old"); + $session->db->write("alter table Survey_section rename to Survey_section_old"); + $session->db->write("alter table Survey_response rename to Survey_response_old"); + $session->db->write("alter table Survey_questionResponse rename to Survey_questionResponse_old"); + }; +} + +sub _addSurveyTables{ + my $session = shift; + $session->db->write("DROP TABLE IF EXISTS `Survey`"); + $session->db->write(" +CREATE TABLE `Survey` ( + `groupToTakeSurvey` char(22) character set utf8 collate utf8_bin NOT NULL default '2', + `groupToEditSurvey` char(22) character set utf8 collate utf8_bin NOT NULL default '3', + `groupToViewReports` char(22) character set utf8 collate utf8_bin NOT NULL default '3', + `responseTemplateId` char(22) character set utf8 collate utf8_bin NOT NULL, + `overviewTemplateId` char(22) character set utf8 collate utf8_bin NOT NULL, + `maxResponsesPerUser` int(11) NOT NULL default '1', + `gradebookTemplateId` char(22) character set utf8 collate utf8_bin NOT NULL, + `assetId` char(22) character set utf8 collate utf8_bin NOT NULL, + `templateId` char(22) character set utf8 collate utf8_bin NOT NULL, + `revisionDate` bigint(20) NOT NULL default '0', + `surveyEditTemplateId` char(22) default NULL, + `answerEditTemplateId` char(22) default NULL, + `questionEditTemplateId` char(22) default NULL, + `sectionEditTemplateId` char(22) default NULL, + `surveyTakeTemplateId` char(22) default NULL, + `surveyQuestionsId` char(22) default NULL, + `exitURL` varchar(512) default NULL, + `surveyJSON` longblob, + `timeLimit` mediumint(8) unsigned NOT NULL, + `showProgress` tinyint(3) unsigned NOT NULL default '0', + `showTimeLimit` tinyint(3) unsigned NOT NULL default '0', + PRIMARY KEY (`assetId`,`revisionDate`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +"); + $session->db->write("DROP TABLE IF EXISTS `Survey_response`"); + $session->db->write(" +CREATE TABLE `Survey_response` ( + `assetId` char(22) character set utf8 collate utf8_bin NOT NULL, + `Survey_responseId` char(22) character set utf8 collate utf8_bin NOT NULL, + `userId` char(22) default NULL, + `username` char(255) default NULL, + `ipAddress` char(15) default NULL, + `startDate` bigint(20) NOT NULL default '0', + `endDate` bigint(20) NOT NULL default '0', + `isComplete` int(11) NOT NULL default '0', + `anonId` varchar(255) default NULL, + `responseJSON` longblob, + PRIMARY KEY (`Survey_responseId`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + "); + $session->db->write("DROP TABLE IF EXISTS `Survey_tempReport`"); + $session->db->write(" +CREATE TABLE `Survey_tempReport` ( + `assetId` char(22) NOT NULL, + `Survey_responseId` char(22) NOT NULL, + `order` smallint(5) unsigned NOT NULL, + `sectionNumber` smallint(5) unsigned NOT NULL, + `sectionName` varchar(512) default NULL, + `questionNumber` smallint(5) unsigned NOT NULL, + `questionName` varchar(512) default NULL, + `questionComment` mediumtext, + `answerNumber` smallint(5) unsigned default NULL, + `answerValue` mediumtext, + `answerComment` mediumtext, + `entryDate` bigint(20) unsigned NOT NULL COMMENT 'UTC Unix Time', + `isCorrect` tinyint(3) unsigned default NULL, + `value` int(11) default NULL, + `fileStoreageId` char(22) default NULL COMMENT 'Not implemented yet', + PRIMARY KEY (`assetId`,`Survey_responseId`,`order`), + KEY `assetId` (`assetId`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + "); +} + +#---------------------------------------------------------------------------- +sub fixFriendsGroups { + my $session = shift; + my $users = $session->db->buildArrayRef("select userId from users where friendsGroup is not null && friendsGroup != ''"); + foreach my $userId (@{$users}) { + #purge the admin group + WebGUI::User->new($session,$userId)->friends->deleteGroups([3]); + } +} + +#---------------------------------------------------------------------------- +sub addRecurringSubscriptionSwitch { + my $session = shift; + + print "\tAdding a recurring/nonrecurring switch to subscriptions... " unless $quiet; + + $session->db->write('alter table Subscription add column recurringSubscription tinyint(1) not null default 1'); + + print "Done!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub upgradeAccount { + my $session = shift; + my $config = $session->config; + my $setting = $session->setting; + + print "\tUpgrading WebGUI Account System... " unless $quiet; + #Add account properties to config file + $session->config->delete("account"); #Delete account if it exists + $session->config->set("account",[ + { + identifier => "profile", + title => "^International(title,Account_Profile);", + className => "WebGUI::Account::Profile" + }, + { + identifier => "inbox", + title => "^International(title,Account_Inbox);", + className => "WebGUI::Account::Inbox" + }, + { + identifier => "friends", + title => "^International(title,Account_Friends);", + className => "WebGUI::Account::Friends" + }, + { + identifier => "contributions", + title => "^International(title,Account_Contributions);", + className => "WebGUI::Account::Contributions" + }, + { + identifier => "shop", + title => "^International(title,Account_Shop);", + className => "WebGUI::Account::Shop" + }, + { + identifier => "user", + title => "^International(title,Account_User);", + className => "WebGUI::Account::User" + }, + ]); + $session->config->set("profileModuleIdentifier","profile"); + #Add the content handler to the config file if it's not there + my $oldHandlers = $session->config->get( "contentHandlers" ); + unless (isIn("WebGUI::Content::Account",@{$oldHandlers})) { + my @newHandlers; + for my $handler ( @{ $oldHandlers } ) { + if ( $handler eq "WebGUI::Content::Operation" ) { + push @newHandlers, "WebGUI::Content::Account"; + } + push @newHandlers, $handler; + } + $session->config->set( "contentHandlers", \@newHandlers ); + } + + #Add new macros to the config file + $session->config->addToHash("macros","BackToSite","BackToSite"); + $session->config->addToHash("macros","If","If"); + $session->config->addToHash("macros","DeactivateAccount","DeactivateAccount"); + + + #Add the settings for the profile module + $setting->add("profileStyleTemplateId",""); #Use the userStyle by default + $setting->add("profileLayoutTemplateId","FJbUTvZ2nUTn65LpW6gjsA"); + $setting->add("profileEditTemplateId","75CmQgpcCSkdsL-oawdn3Q"); + $setting->add("profileViewTempalteId","2CS-BErrjMmESOtGT90qOg"); + $setting->add("profileErrorTempalteId","MBmWlA_YEA2I6D29OMGtRg"); + + #Add the settings for the inbox module + $setting->add("inboxStyleTemplateId",""); #Use the userStyle by default + $setting->add("inboxLayoutTempalteId","gfZOwaTWYjbSoVaQtHBBEw"); + $setting->add("inboxViewTemplateId","c8xrwVuu5QE0XtF9DiVzLw"); + $setting->add("inboxViewMessageTemplateId","0n4HtbXaWa_XJHkFjetnLQ"); + $setting->add("inboxSendMessageTemplateId","6uQEULvXFgCYlRWnYzZsuA"); + $setting->add("inboxErrorTemplateId","ErEzulFiEKDkaCDVmxUavw"); + $setting->add("inboxMessageConfirmationTemplateId","DUoxlTBXhVS-Zl3CFDpt9g"); + #Invitations + $setting->add("inboxManageInvitationsTemplateId","1Q4Je3hKCJzeo0ZBB5YB8g"); + $setting->add("inboxViewInvitationTemplateId","VBkY05f-E3WJS50WpdKd1Q"); + $setting->add("inboxInvitationConfirmTemplateId","5A8Hd9zXvByTDy4x-H28qw"); + #Inbox Invitations + $setting->add("inboxInviteUserEnabled",$session->setting->get("userInvitationsEnabled")); + $setting->add("inboxInviteUserRestrictSubject","0"); + $setting->add("inboxInviteUserSubject","^International(invite subject,Account_Inbox,^u;);"); + $setting->add("inboxInviteUserRestrictMessage","0"); + $setting->add("inboxInviteUserMessage","^International(invite message,Account_Inbox);"); + $setting->add("inboxInviteUserMessageTemplateId","XgcsoDrbC0duVla7N7JAdw"); + $setting->add("inboxInviteUserTemplateId","cR0UFm7I1qUI2Wbpj--08Q"); + $setting->add("inboxInviteUserConfirmTemplateId","SVIhz68689hwUGgcDM-gWw"); + + #Add the settings for the friends module + $setting->add("friendsStyleTemplateId",""); #Use the userStyle by default + $setting->add("friendsLayoutTempalteId","zrNpGbT3odfIkg6nFSUy8Q"); + $setting->add("friendsViewTemplateId","1Yn_zE_dSiNuaBGNLPbxtw"); + $setting->add("friendsEditTemplateId","AZFU33p0jpPJ-E6qLSWZng"); + $setting->add("friendsSendRequestTemplateId","AGJBGviWGAwjnwziiPjvDg"); + $setting->add("friendsErrorTemplateId","7Ijdd8SW32lVgg2H8R-Aqw"); + $setting->add("friendsConfirmTemplateId","K8F0j_cq_jgo8dvWY_26Ag"); + $setting->add("friendsRemoveConfirmTemplateId","G5V6neXIDiFXN05oL-U3AQ"); + + #Add the settings for the user module + $setting->add("userAccountStyleTemplateId",""); #Use the userStyle by default + $setting->add("userAccountLayoutTemplateId","9ThW278DWLV0-Svf68ljFQ"); + + #Add the settings for the shop module + $setting->add("shopStyleTemplateId",""); #Use the userStyle by default + $setting->add("shopLayoutTemplateId","aUDsJ-vB9RgP-AYvPOy8FQ"); + + #Add the settings for the contributions module + $setting->add("contribStyleTemplateId",""); #Use the userStyle by default + $setting->add("contribLayoutTemplateId","b4n3VyUIsAHyIvT-W-jziA"); + $setting->add("contribViewTemplateId","1IzRpX0tgW7iuCfaU2Kk0A"); + + + #Add inbox changes + $session->db->write(q{ + create table inbox_messageState ( + messageId char(22) binary not null, + userId char(22) binary not null, + isRead tinyint(4) not null default 0, + repliedTo tinyint(4) not null default 0, + deleted tinyint(4) not null default 0, + primary key (messageId, userId) + ) + }); + + #Update the inbox + my $sth = $session->db->read("select messageId, groupId, userId, status from inbox"); + while(my ($messageId,$groupId,$userId,$status) = $sth->array) { + my $repliedTo = $status eq "replied"; + my $isRead = ($status ne "unread" && $status ne "pending")?1:0; + my $deleted = 0; + + if($status eq "deleted") { + #Purge deleted messages + $session->db->write("delete from inbox where messageId=?",[$messageId]); + next; + } + + if($groupId) { + my $g = WebGUI::Group->new($session,$groupId); + my $users = $g->getAllUsers; + foreach my $userId (@{$users}) { + $session->db->write( + q{ REPLACE INTO inbox_messageState (messageId,userId,isRead,repliedTo,deleted) VALUES (?,?,?,?,?) }, + [$messageId,$userId,$isRead,$repliedTo,$deleted] + ); + } + } + + if($userId) { + $session->db->write( + q{ REPLACE INTO inbox_messageState (messageId,userId,isRead,repliedTo,deleted) VALUES (?,?,?,?,?) }, + [$messageId,$userId,$isRead,$repliedTo,$deleted] + ); + } + + if($status ne "completed" && $status ne "pending") { + $session->db->write( + q{ UPDATE inbox SET status='active' WHERE messageId=? }, + [$messageId] + ); + } + } + + #Add the profile field changes + $session->db->write(q{alter table userProfileCategory add column shortLabel char(255) default NULL after label}); + $session->db->write(q{update userProfileCategory set shortLabel='WebGUI::International::get("misc info short","WebGUI");' where profileCategoryId='1'}); + $session->db->write(q{update userProfileCategory set shortLabel='WebGUI::International::get("contact info short","WebGUI");' where profileCategoryId='2'}); + $session->db->write(q{update userProfileCategory set shortLabel='WebGUI::International::get("personal info short","WebGUI");' where profileCategoryId='3'}); + $session->db->write(q{update userProfileCategory set shortLabel='WebGUI::International::get("preferences short","WebGUI");' where profileCategoryId='4'}); + $session->db->write(q{update userProfileCategory set shortLabel='WebGUI::International::get("home info short","WebGUI");' where profileCategoryId='5'}); + $session->db->write(q{update userProfileCategory set shortLabel='WebGUI::International::get("work info short","WebGUI");' where profileCategoryId='6'}); + $session->db->write(q{update userProfileCategory set shortLabel='WebGUI::International::get("demographic info short","WebGUI");' where profileCategoryId='7'}); + + $session->db->write(q{alter table userProfileData modify publicProfile char(10) default 'none'}); + $session->db->write(q{update userProfileData set publicProfile='none' where publicProfile='0' || publicProfile is NULL || publicProfile=''}); + $session->db->write(q{update userProfileData set publicProfile='all' where publicProfile='1'}); + $session->db->write(q{REPLACE INTO `userProfileField` VALUES ('publicProfile','WebGUI::International::get(861)',1,0,'RadioList','{ all=>WebGUI::International::get(\'public label\',\'Account_Profile\'), friends=>WebGUI::International::get(\'friends only label\',\'Account_Profile\'), none=>WebGUI::International::get(\'private label\',\'Account_Profile\')}','[\"none\"]',8,'4',1,1,0,0,0,'')}); + + #Clean up old templates and settings + my $oldsettings = { + editUserProfileTemplate => 'Operation/Profile/Edit', + viewUserProfileTemplate => 'Operation/Profile/View', + manageFriendsTemplateId => 'friends/manage', + sendPrivateMessageTemplateId => 'Inbox/SendPrivateMessage', + viewInboxTemplateId => 'Inbox', + viewInboxMessageTemplateId => 'Inbox/Message', + userInvitationsEmailTemplateId => 'userInvite/Email', + userInvitationsEnabled => 'userInvite', + userInvitationsEmailExists => '', + }; + + foreach my $setting (keys %{$oldsettings}) { + #Remove the setting + $session->setting->remove($setting); + #$session->db->write("delete from settings where name=?",[$setting]); + #Remove all the templates with the related namespace + next if ($oldsettings->{$setting} eq ""); + my $assets = $session->db->buildArrayRef("select distinct assetId from template where namespace=?",[$oldsettings->{$setting}]); + #Purge the template + foreach my $assetId (@{$assets}) { + WebGUI::Asset->newByDynamicClass($session,$assetId)->purge; + } + } + + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# removes the caseInsensitiveOS flag from the config file, as it isn't used anymore +sub removeCaseInsensitiveConfig { + my $session = shift; + print "\tRemoving caseInsensitiveOS flag from config..." unless $quiet; + $session->config->delete('caseInsensitiveOS'); + $session->db->write('DROP TABLE storageTranslation'); + print " Done.\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub createLastUpdatedField { + my $session = shift; + print "\tAdding last updated field to all assets... " unless $quiet; + my $db = $session->db; + $db->write("alter table assetData add column lastModified bigint"); + $db->write("update assetData set lastModified=revisionDate"); + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub upgradeSyndicatedContentTemplates { + my $session = shift; + print "\tUpgrading syndicated content assets... " unless $quiet; + my $db = $session->db; + my $templates = $db->read("select distinct assetId from template where namespace='SyndicatedContent'"); + while (my ($id) = $templates->array) { + my $asset = WebGUI::Asset::Template->new($session, $id); + if (defined $asset) { + if ($asset->getId eq "DPUROtmpl0000000000001") { # this one no longer applies + $asset->trash; + next; + } + my $template = $asset->get('template'); + $template =~ s{channel.title}{channel_title}xmsi; + $template =~ s{channel.description}{channel_description}xmsi; + $template =~ s{channel.link}{channel_link}xmsi; + $template =~ s{site_link}{channel_link}xmsi; + $template =~ s{site_title}{channel_title}xmsi; + $template =~ s{descriptionFull}{description}xmsi; + $template =~ s{rss.url.0.9}{rss_url}xmsi; + $template =~ s{rss.url}{rss_url}xmsi; + $template =~ s{rss.url.0.91}{rss_url}xmsi; + $template =~ s{rss.url.1.0}{rdf_url}xmsi; + $template =~ s{rss.url.2.0}{rss_url}xmsi; + $asset->addRevision({template=>$template}); + } + } + $db->write("update SyndicatedContent set templateId='PBtmpl0000000000000065' where templateId='DPUROtmpl0000000000001'"); + $db->write("alter table SyndicatedContent drop column displayMode"); + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub createFieldShowOnline { + my $session = shift; + print "\tCreating an additional profile field 'showOnline' for the UsersOnline macro... " unless $quiet; + + # Define field properties + my $properties = { + label => q!WebGUI::International::get('Show when online?','WebGUI')!, + visible => 1, + required => 0, + protected => 1, # The UsersOnline macro requires this field for working properly. + editable => 1, + fieldType => 'YesNo', + dataDefault => 0 # Users are not shown by default. + }; + # Create field in category "preferences" + my $field = WebGUI::ProfileField->create($session, 'showOnline', $properties, 4); + + # Check for failure + if ($field == undef) { + print "Creation of the field 'showOnline' failed, possibly because it does already exist. Note that this may cause the UsersOnline macro not to work properly.\n"; + } + else { + print "DONE!\n" unless $quiet; + } + + return; +} + +#---------------------------------------------------------------------------- +# installDataTableAsset +# Install the asset by creating the DB table and adding it to the config file +sub installDataTableAsset { + my $session = shift; + print "\tInstalling the DataTable asset... " unless $quiet; + + $session->db->write( <<'ENDSQL' ); + CREATE TABLE DataTable ( + assetId VARCHAR(22) BINARY NOT NULL, + revisionDate BIGINT NOT NULL, + data LONGTEXT, + templateId VARCHAR(22) BINARY, + PRIMARY KEY ( assetId, revisionDate ) + ) +ENDSQL + + my $assets = $session->config->get( "assets" ); + $assets->{ "WebGUI::Asset::Wobject::DataTable" } = { category => "basic" }; + $session->config->set( "assets", $assets ); + + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# installDataTableAsset +# Install the content handler by adding it to the config file +sub installAjaxI18N { + my $session = shift; + print "\tInstalling the AjaxI18N content handler... " unless $quiet; + + my @newHandlers; + my $oldHandlers = $session->config->get( "contentHandlers" ); + for my $handler ( @{ $oldHandlers } ) { + if ( $handler eq "WebGUI::Content::Operation" ) { + push @newHandlers, "WebGUI::Content::AjaxI18N"; + } + elsif ( $handler eq "WebGUI::Content::AjaxI18N" ) { + next; + } + push @newHandlers, $handler; + } + $session->config->set( "contentHandlers", \@newHandlers ); + + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# installSiteIndex +# Install the content handler by adding it to the config file +sub installSiteIndex { + my $session = shift; + print "\tInstalling the SiteIndex content handler... " unless $quiet; + + my $oldHandlers = $session->config->get( "contentHandlers" ); + my @newHandlers; + for my $handler ( @{ $oldHandlers } ) { + if ( $handler eq "WebGUI::Content::Asset" ) { + push @newHandlers, "WebGUI::Content::SiteIndex"; + } + push @newHandlers, $handler; + } + $session->config->set( "contentHandlers", \@newHandlers ); + + print "DONE!\n" unless $quiet; +} + + +#---------------------------------------------------------------------------- +sub upgradeToYui26 { + my $session = shift; + print "\tUpgrading to YUI 2.6... " unless $quiet; + $session->db->write("update template set template=replace(template, 'resize-beta.js', 'resize-min.js'), headBlock=replace(headBlock, 'resize-beta.js', 'resize-min.js')"); + $session->db->write("update template set template=replace(template, 'resize-beta-min.js', 'resize-min.js'), headBlock=replace(headBlock, 'resize-beta-min.js', 'resize-min.js')"); + $session->db->write("update template set template=replace(template, 'datasource-beta.js', 'datasource-min.js'), headBlock=replace(headBlock, 'datasource-beta.js', 'datasource-min.js')"); + $session->db->write("update template set template=replace(template, 'datasource-beta-min.js', 'datasource-min.js'), headBlock=replace(headBlock, 'datasource-beta-min.js', 'datasource-min.js')"); + $session->db->write("update template set template=replace(template, 'datatable-beta.js', 'datatable-min.js'), headBlock=replace(headBlock, 'datatable-beta.js', 'datatable-min.js')"); + $session->db->write("update template set template=replace(template, 'datatable-beta-min.js', 'datatable-min.js'), headBlock=replace(headBlock, 'datatable-beta-min.js', 'datatable-min.js')"); + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub changeDefaultPaginationInSearch { + my $session = shift; + print "\tAllow content managers to change the default pagination in the search asset... " unless $quiet; + $session->db->write("ALTER TABLE `search` ADD COLUMN `paginateAfter` INTEGER NOT NULL DEFAULT 25"); + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub addUsersOnlineMacro { + my $session = shift; + print "\tMaking the UsersOnline macro available... " unless $quiet; + $session->config->addToHash("macros","UsersOnline","UsersOnline"); + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub updateAddressBook { + my $session = shift; + print "\tAdding organization and email to address book... " unless $quiet; + my $db = $session->db; + $db->write("alter table address add column organization char(255)"); + $db->write("alter table address add column email char(255)"); + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub repairManageWorkflows { + my $session = shift; + print "\tCorrecting the Manage Workflow link in configuration file... " unless $quiet; + # and here's our code + my $ac = $session->config->get('adminConsole'); + if (exists $ac->{'workflow'}) { + $ac->{'workflow'}->{'url'} = "^PageUrl(\"\",op=manageWorkflows);"; + $session->config->set('adminConsole', $ac); + } + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub addPreTextToThingyFields { + my $session = shift; + print "\tAdding a pre-text property to Thingy fields... " unless $quiet; + $session->db->write('ALTER TABLE `Thingy_fields` ADD pretext varchar(255)'); + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub addProfileExtrasField { + my $session = shift; + print "\tAdding the Extras field for profile fields... " unless $quiet; + my $db = $session->db; + $db->write('alter table userProfileField add extras text default NULL'); + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Add the workflow property to DataForm +sub addWorkflowToDataform { + my $session = shift; + print "\tAdding Workflow to DataForm... " unless $quiet; + + my $sth = $session->db->read('DESCRIBE `DataForm`'); + while (my ($col) = $sth->array) { + if ( $col eq 'workflowIdAddEntry' ) { + print "Already done, skipping.\n" unless $quiet; + return; + } + } + + $session->db->write( "ALTER TABLE DataForm ADD COLUMN workflowIdAddEntry CHAR(22) BINARY" ); + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub addAssetDiscoveryService { + my $session = shift; + print "\tAdding asset discovery service..." unless $quiet; + my @handlers; + foreach my $handler (@{$session->config->get("contentHandlers")}) { + if ($handler eq "WebGUI::Content::Operation") { + push @handlers, 'WebGUI::Content::AssetDiscovery'; + } + push @handlers, $handler; + } + print "Done.\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub addCommentsAspectToWiki { + my $session = shift; + print "\tAdding comments aspect to wiki..." unless $quiet; + my $db = $session->db; + my $pages = $db->read("select assetId,revisionDate from WikiPage"); + while (my ($id, $rev) = $pages->array) { + $db->write("insert into assetAspectComments (assetId, revisionDate, comments, averageCommentRating) values (?,?,'[]',0)",[$id,$rev]); + } + print "Done.\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub addCommentsAspect { + my $session = shift; + print "\tAdding comments asset aspect..." unless $quiet; + $session->db->write("create table assetAspectComments ( + assetId char(22) binary not null, + revisionDate bigint not null, + comments mediumtext, + averageCommentRating int, + primary key (assetId, revisionDate) + )"); + print "Done.\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# make sure each config file has the extensions to export as-is. however, if +# this system received a backport, leave the field as is. +sub addExportExtensionsToConfigFile { + my $session = shift; + print "\tAdding binary export extensions to config file... " unless $quiet; + # skip if the field has been defined already by backporting + unless ( defined $session->config->get('exportBinaryExtensions') ) { + # otherwise, set the field + $session->config->set('exportBinaryExtensions', + [ qw/.html .htm .txt .pdf .jpg .css .gif .png .doc .xls .xml .rss .bmp + .mp3 .js .fla .flv .swf .pl .php .php3 .php4 .php5 .ppt .docx .zip .tar + .rar .gz .bz2/ ] ); + } + + print "Done.\n" unless $quiet; +} + +sub addThingyColumns { + my $session = shift; + print "\tAdding exportMetaData and maxEntriesPerUser columns to Thingy_things table... " unless $quiet; + $session->db->write('ALTER TABLE `Thingy_things` ADD exportMetaData int(11)'); + $session->db->write('ALTER TABLE `Thingy_things` ADD maxEntriesPerUser int(11)'); + print "Done.\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub removeUnusedTemplates { + my $session = shift; + print "\tDeleting old unused templates... " unless $quiet; + foreach my $id (qw(PBtmpl0000000000000046 e-WvgcKROPCoHwiiHLktCg PBtmpl0000000000000034 AFdXZZmGnSKalNSobQMB5w)) { + my $asset = WebGUI::Asset->new($session, $id); + if (defined $asset && $asset->getChildCount == 0) { + $asset->purge; + } + } + print "Done.\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub deleteAdminBarTemplates { + my $session = shift; + print "\tDeleting AdminBar templates... " unless $quiet; + foreach my $id (qw(PBtmpl0000000000000090 Ov2ssJHwp_1eEWKlDyUKmg)) { + my $asset = WebGUI::Asset->newByDynamicClass($session, $id); + if (defined $asset) { + $asset->trash; + } + } + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub repairBrokenProductSkus { + my $session = shift; + print "\tRepairing broken Products that were imported... " unless $quiet; + my $getAProduct = WebGUI::Asset::Sku::Product->getIsa($session); + while (my $product = $getAProduct->()) { + COLLATERAL: foreach my $collateral (@{ $product->getAllCollateral('variantsJSON') }) { + next COLLATERAL unless exists $collateral->{sku}; + $collateral->{varSku} = $collateral->{sku}; + delete $collateral->{sku}; + $product->setCollateral('variantsJSON', 'variantId', $collateral->{variantId}, $collateral); + } + } + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub migrateAssetsToNewConfigFormat { + my $session = shift; + print "\tRestructuring asset configuration... " unless $quiet; + my $config = $session->config; + + # devs doing multiple upgrades + # the list has already been updated by a previous run + my $assetList = $config->get("assets"); + unless (ref $assetList eq "ARRAY") { + warn "ERROR: Looks like you've already run this upgrade.\n"; + return undef; + } + + # add categories + $config->set('assetCategories', { + basic => { + title => "^International(basic,Macro_AdminBar);", + uiLevel => 1, + }, + intranet => { + title => "^International(intranet,Macro_AdminBar);", + uiLevel => 5, + }, + shop => { + title => "^International(shop,Shop);", + uiLevel => 5, + }, + utilities => { + title => "^International(utilities,Macro_AdminBar);", + uiLevel => 9, + }, + community => { + title => "^International(community,Macro_AdminBar);", + uiLevel => 5, + }, + }); + + # deal with the old asset list + my $assetContainers = $config->get("assetContainers"); + $assetContainers = [] unless (ref $assetContainers eq "ARRAY"); + my $utilityAssets = $config->get("utilityAssets"); + $utilityAssets = [] unless (ref $utilityAssets eq "ARRAY"); + my @oldAssetList = (@$assetList, @$utilityAssets, @$assetContainers); + my %assets = ( + 'WebGUI::Asset::Wobject::Collaboration::Newsletter' => { + category => "community", + } + ); + foreach my $class (@oldAssetList) { + my %properties; + if (isIn($class, qw( + WebGUI::Asset::Wobject::Article + WebGUI::Asset::Wobject::Layout + WebGUI::Asset::Wobject::Folder + WebGUI::Asset::Wobject::Calendar + WebGUI::Asset::Wobject::Poll + WebGUI::Asset::Wobject::Search + WebGUI::Asset::FilePile + WebGUI::Asset::Snippet + WebGUI::Asset::Wobject::DataForm + ))) { + $properties{category} = 'basic'; + } + elsif (isIn($class, qw( + WebGUI::Asset::Wobject::Collaboration::Newsletter + WebGUI::Asset::Wobject::WikiMaster + WebGUI::Asset::Wobject::Collaboration + WebGUI::Asset::Wobject::Survey + WebGUI::Asset::Wobject::Gallery + WebGUI::Asset::Wobject::MessageBoard + WebGUI::Asset::Wobject::Matrix + ))) { + $properties{category} = 'community'; + } + elsif (isIn($class, qw( + WebGUI::Asset::Wobject::StockData + WebGUI::Asset::Wobject::Dashboard + WebGUI::Asset::Wobject::InOutBoard + WebGUI::Asset::Wobject::MultiSearch + WebGUI::Asset::Wobject::ProjectManager + WebGUI::Asset::Wobject::TimeTracking + WebGUI::Asset::Wobject::UserList + WebGUI::Asset::Wobject::WeatherData + WebGUI::Asset::Wobject::Thingy + ))) { + $properties{category} = 'intranet'; + } + elsif (isIn($class, qw( + WebGUI::Asset::Wobject::Bazaar + WebGUI::Asset::Wobject::EventManagementSystem + WebGUI::Asset::Wobject::Shelf + WebGUI::Asset::Sku::Product + WebGUI::Asset::Sku::FlatDiscount + WebGUI::Asset::Sku::Donation + WebGUI::Asset::Sku::Subscription + ))) { + $properties{category} = 'shop'; + } + elsif (isIn($class, qw( + WebGUI::Asset::Wobject::WSClient + WebGUI::Asset::Wobject::SQLReport + WebGUI::Asset::Wobject::SyndicatedContent + WebGUI::Asset::Redirect + WebGUI::Asset::Template + WebGUI::Asset::Wobject::Navigation + WebGUI::Asset::File + WebGUI::Asset::Wobject::HttpProxy + WebGUI::Asset::File::Image + WebGUI::Asset::File::ZipArchive + WebGUI::Asset::RichEdit + ))) { + $properties{category} = 'utilities'; + } + else { + # other assets listed but not in the core + $properties{category} = 'utilities'; + } + $assets{$class} = \%properties; + } + + # deal with containers + foreach my $class (@$assetContainers) { + $assets{$class}{isContainer} = 1; + } + + # deal with custom add privileges + my $addGroups = $config->get("assetAddPrivilege"); + if (ref $addGroups eq "HASH") { + foreach my $class (keys %{$addGroups}) { + $assets{$class}{addGroup} = $addGroups->{$class}; + } + } + + # deal with custom ui levels + my $uiLevels = $config->get("assetUiLevel"); + if (ref $uiLevels eq "HASH") { + foreach my $class (keys %{$addGroups}) { + $assets{$class}{uiLevel} = $uiLevels->{$class}; + } + } + + # deal with custom field ui levels + foreach my $class (keys %assets) { + my $directive =~ s/::/_/g; + $directive .= '_uiLevel'; + my $value = $config->get($directive); + if (ref $value eq "HASH") { + foreach my $field (keys %{$value}) { + $assets{$class}{fields}{$field}{uiLevel} = $value->{$field}; + } + $config->delete($directive); + } + } + + # write the file + $config->delete('assetContainers'); + $config->delete('utilityAssets'); + $config->delete("assetUiLevel"); + $config->delete("assetAddPrivilege"); + $config->set("assets",\%assets); + + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub makeAdminConsolePluggable { + my $session = shift; + print "\tMaking admin console pluggable... " unless $quiet; + $session->config->set("adminConsole",{ + "spectre" => { + title => "^International(spectre,Spectre);", + icon => "spectre.gif", + url => "^PageUrl(\"\",op=spectreStatus);", + uiLevel => 9, + groupSetting => "groupIdAdminSpectre" + }, + "assets" => { + title => "^International(assets,Asset);", + icon => "assets.gif", + url => "^PageUrl(\"\",op=assetManager);", + uiLevel => 5, + group => "12" + }, + "versions" => { + title => "^International(version tags,VersionTag);", + icon => "versionTags.gif", + url => "^PageUrl(\"\",op=manageVersions);", + uiLevel => 7, + groupSetting => "groupIdAdminVersionTag" + }, + "workflow" => { + title => "^International(topicName,Workflow);", + icon => "workflow.gif", + url => "^PageUrl(\"\",manageWorkflows);", + uiLevel => 7, + groupSetting => "groupIdAdminWorkflow" + }, + "adSpace" => { + title => "^International(topicName,AdSpace);", + icon => "advertising.gif", + url => "^PageUrl(\"\",op=manageAdSpaces);", + uiLevel => 5, + groupSetting => "groupIdAdminAdSpace" + }, + "cron" => { + title => "^International(topicName,Workflow_Cron);", + icon => "cron.gif", + url => "^PageUrl(\"\",op=manageCron);", + uiLevel => 9, + groupSetting => "groupIdAdminCron" + }, + "users" => { + title => "^International(149,WebGUI);", + icon => "users.gif", + url => "^PageUrl(\"\",op=listUsers);", + uiLevel => 5, + groupSetting => "groupIdAdminUser" + }, + "clipboard" => { + title => "^International(948,WebGUI);", + icon => "clipboard.gif", + url => "^PageUrl(\"\",func=manageClipboard);", + uiLevel => 5, + group => "12" + }, + "trash" => { + title => "^International(trash,WebGUI);", + icon => "trash.gif", + url => "^PageUrl(\"\",func=manageTrash);", + uiLevel => 5, + group => "12" + }, + "databases" => { + title => "^International(databases,WebGUI);", + icon => "databases.gif", + url => "^PageUrl(\"\",op=listDatabaseLinks);", + uiLevel => 9, + groupSetting => "groupIdAdminDatabaseLink" + }, + "ldapconnections" => { + title => "^International(ldapconnections,AuthLDAP);", + icon => "ldap.gif", + url => "^PageUrl(\"\",op=listLDAPLinks);", + uiLevel => 9, + groupSetting => "groupIdAdminLDAPLink" + }, + "groups" => { + title => "^International(89,WebGUI);", + icon => "groups.gif", + url => "^PageUrl(\"\",op=listGroups);", + uiLevel => 5, + groupSetting => "groupIdAdminGroup" + }, + "settings" => { + title => "^International(settings,WebGUI);", + icon => "settings.gif", + url => "^PageUrl(\"\",op=editSettings);", + uiLevel => 5, + group => "3" + }, + "help" => { + title => "^International(help,WebGUI);", + icon => "help.gif", + url => "^PageUrl(\"\",op=viewHelpIndex);", + uiLevel => 1, + groupSetting => "groupIdAdminHelp" + }, + "statistics" => { + title => "^International(437,WebGUI);", + icon => "statistics.gif", + url => "^PageUrl(\"\",op=viewStatistics);", + uiLevel => 1, + groupSetting => "groupIdAdminStatistics" + }, + "contentProfiling" => { + title => "^International(content profiling,Asset);", + icon => "contentProfiling.gif", + url => "^PageUrl(\"\",func=manageMetaData);", + uiLevel => 5, + group => "4" + }, + "contentFilters" => { + title => "^International(content filters,WebGUI);", + icon => "contentFilters.gif", + url => "^PageUrl(\"\",op=listReplacements);", + uiLevel => 3, + groupSetting => "groupIdAdminReplacements" + }, + "userProfiling" => { + title => "^International(user profiling,WebGUIProfile);", + icon => "userProfiling.gif", + url => "^PageUrl(\"\",op=editProfileSettings);", + uiLevel => 5, + groupSetting => "groupIdAdminProfileSettings" + }, + "loginHistory" => { + title => "^International(426,WebGUI);", + icon => "loginHistory.gif", + url => "^PageUrl(\"\",op=viewLoginHistory);", + uiLevel => 5, + groupSetting => "groupIdAdminLoginHistory" + }, + "inbox" => { + title => "^International(159,WebGUI);", + icon => "inbox.gif", + url => "^PageUrl(\"\",op=viewInbox);", + uiLevel => 1, + group => "2" + }, + "activeSessions" => { + title => "^International(425,WebGUI);", + icon => "activeSessions.gif", + url => "^PageUrl(\"\",op=viewActiveSessions);", + uiLevel => 5, + groupSetting => "groupIdAdminActiveSessions" + }, + "shop" => { + title => "^International(shop,Shop);", + icon => "shop.gif", + url => "^PageUrl(\"\",shop=admin);", + uiLevel => 5, + groupSetting => 'groupIdAdminCommerce' + }, + "cache" => { + title => "^International(manage cache,WebGUI);", + icon => "cache.gif", + url => "^PageUrl(\"\",op=manageCache);", + uiLevel => 5, + groupSetting => "groupIdAdminCache" + }, + "graphics" => { + title => "^International(manage graphics,Graphics);", + icon => "graphics.gif", + url => "^PageUrl(\"\",op=listGraphicsOptions);", + uiLevel => 5, + groupSetting => "groupIdAdminGraphics" + }, + }); + print "DONE!\n" unless $quiet; +} + + +#---------------------------------------------------------------------------- +# Add the "isDefault" flag and set it for the right templates +sub addIsDefaultTemplates { + my $session = shift; + print "\tAdding warning when editing default templates... " unless $quiet; + $session->db->write( "ALTER TABLE template ADD COLUMN isDefault INT(1) DEFAULT 0" ); + print "DONE!\n" unless $quiet; +} + +sub setDefaultTemplates { + my $session = shift; + print "\tUpdating default templates to show warning... " unless $quiet; + my $defaultTemplates =[ + '-ANLpoTEP-n4POAdRxCzRw','05FpjceLYhq4csF1Kww1KQ','0X4Q3tBWUb_thsVbsYz9xQ', + '2gtFt7c0qAFNU3BG_uvNvg','2rC4ErZ3c77OJzJm7O5s3w','3womoo7Teyy2YKFa25-MZg', + '63ix2-hU0FchXGIWkG3tow','6X-7Twabn5KKO_AbgK3PEw','7JCTAiu1U_bT9ldr655Blw', + 'BMybD3cEnmXVk2wQ_qEsRQ','CalendarDay00000000001','CalendarEvent000000001', + 'CalendarEventEdit00001','CalendarMonth000000001','CalendarPrintDay000001', + 'CalendarPrintEvent0001','CalendarPrintMonth0001','CalendarPrintWeek00001', + 'CalendarSearch00000001','CalendarWeek0000000001','DPUROtmpl0000000000001', + 'DashboardViewTmpl00001','EBlxJpZQ9o-8VBOaGQbChA','GNvjCFQWjY2AF2uf0aCM8Q', + 'IOB0000000000000000001','IOB0000000000000000002','KAMdiUdJykjN02CPHpyZOw', + 'MultiSearchTmpl0000001','OOyMH33plAy6oCj_QWrxtg','OkphOEdaSGTXnFGhK4GT5A', + 'OxJWQgnGsgyGohP2L3zJPQ','PBnav00000000000bullet','PBnav00000000indentnav', + 'PBnav000000style01lvl2','PBtmpl0000000000000001','PBtmpl0000000000000002', + 'PBtmpl0000000000000004','PBtmpl0000000000000005','PBtmpl0000000000000006', + 'PBtmpl0000000000000010','PBtmpl0000000000000011','PBtmpl0000000000000012', + 'PBtmpl0000000000000013','PBtmpl0000000000000014','PBtmpl0000000000000020', + 'PBtmpl0000000000000021','PBtmpl0000000000000024','PBtmpl0000000000000026', + 'PBtmpl0000000000000027','PBtmpl0000000000000029','PBtmpl0000000000000031', + 'PBtmpl0000000000000032','PBtmpl0000000000000033','PBtmpl0000000000000036', + 'PBtmpl0000000000000037','PBtmpl0000000000000038','PBtmpl0000000000000039', + 'PBtmpl0000000000000040','PBtmpl0000000000000041','PBtmpl0000000000000042', + 'PBtmpl0000000000000043','PBtmpl0000000000000044','PBtmpl0000000000000045', + 'PBtmpl0000000000000047','PBtmpl0000000000000048','PBtmpl0000000000000051', + 'PBtmpl0000000000000053','PBtmpl0000000000000054', + 'PBtmpl0000000000000055','PBtmpl0000000000000056','PBtmpl0000000000000057', + 'PBtmpl0000000000000059','PBtmpl0000000000000060','PBtmpl0000000000000061', + 'PBtmpl0000000000000062','PBtmpl0000000000000063','PBtmpl0000000000000064', + 'PBtmpl0000000000000065','PBtmpl0000000000000066','PBtmpl0000000000000067', + 'PBtmpl0000000000000068','PBtmpl0000000000000077', + 'PBtmpl0000000000000078','PBtmpl0000000000000079','PBtmpl0000000000000080', + 'PBtmpl0000000000000081','PBtmpl0000000000000082','PBtmpl0000000000000083', + 'PBtmpl0000000000000084','PBtmpl0000000000000085','PBtmpl0000000000000088', + 'PBtmpl0000000000000090','PBtmpl0000000000000091','PBtmpl0000000000000092', + 'PBtmpl0000000000000093','PBtmpl0000000000000094','PBtmpl0000000000000097', + 'PBtmpl0000000000000098','PBtmpl0000000000000099', + 'PBtmpl0000000000000101','PBtmpl0000000000000103','PBtmpl0000000000000104', + 'PBtmpl0000000000000107','PBtmpl0000000000000108','PBtmpl0000000000000109', + 'PBtmpl0000000000000111','PBtmpl0000000000000112','PBtmpl0000000000000113', + 'PBtmpl0000000000000114','PBtmpl0000000000000115','PBtmpl0000000000000116', + 'PBtmpl0000000000000117','PBtmpl0000000000000118','PBtmpl0000000000000121', + 'PBtmpl0000000000000122','PBtmpl0000000000000123','PBtmpl0000000000000124', + 'PBtmpl0000000000000125','PBtmpl0000000000000128','PBtmpl0000000000000129', + 'PBtmpl0000000000000130','PBtmpl0000000000000131','PBtmpl0000000000000132', + 'PBtmpl0000000000000133','PBtmpl0000000000000134','PBtmpl0000000000000135', + 'PBtmpl0000000000000136','PBtmpl0000000000000137','PBtmpl0000000000000140', + 'PBtmpl0000000000000141','PBtmpl0000000000000142','PBtmpl0000000000000200', + 'PBtmpl0000000000000207', + 'PBtmpl0000000000000208','PBtmpl0000000000000209','PBtmpl0000000000000210', + 'PBtmpl000000000table54','PBtmpl00000000table094','PBtmpl00000000table109', + 'PBtmpl00000000table118','PBtmpl00000000table125','PBtmpl00000000table131', + 'PBtmpl00000000table135','PBtmplBlankStyle000001','PBtmplHelp000000000001', + 'ProjectManagerTMPL0001','ProjectManagerTMPL0002','ProjectManagerTMPL0003', + 'ProjectManagerTMPL0004','ProjectManagerTMPL0005','ProjectManagerTMPL0006', + 'PsFn7dJt4wMwBa8hiE3hOA','SQLReportDownload00001','StockDataTMPL000000001', + 'StockDataTMPL000000002','TEId5V-jEvUULsZA0wuRuA','ThingyTmpl000000000001', + 'ThingyTmpl000000000002','ThingyTmpl000000000003','ThingyTmpl000000000004', + 'TimeTrackingTMPL000001','TimeTrackingTMPL000002','TimeTrackingTMPL000003', + 'UTNFeV7B_aSCRmmaFCq4Vw','UserListTmpl0000000001','UserListTmpl0000000002', + 'UserListTmpl0000000003','WVtmpl0000000000000001','WeatherDataTmpl0000001', + 'WikiFrontTmpl000000001','WikiKeyword00000000001','WikiMPTmpl000000000001', + 'WikiPHTmpl000000000001','WikiPageEditTmpl000001','WikiPageTmpl0000000001', + 'WikiRCTmpl000000000001','WikiSearchTmpl00000001','XNd7a_g_cTvJVYrVHcx2Mw', + 'ZipArchiveTMPL00000001','aIpCmr9Hi__vgdZnDTz1jw','azCqD0IjdQSlM3ar29k5Sg', + 'bPz1yk6Y9uwMDMBcmMsSCg','eqb9sWjFEVq0yHunGV8IGw','g8W53Pd71uHB9pxaXhWf_A', + 'ilu5BrM-VGaOsec9Lm7M6Q','jME5BEDYVDlBZ8jIQA9-jQ','kj3b-X3i6zRKnhLb4ZiCLw', + 'm3IbBavqzuKDd2PGGhKPlA','mM3bjP_iG9sv5nQb4S17tQ','managefriends_________', + 'matrixtmpl000000000001','matrixtmpl000000000002','matrixtmpl000000000003', + 'matrixtmpl000000000004','matrixtmpl000000000005','nFen0xjkZn8WkpM93C9ceQ', + 'newsletter000000000001','newslettercs0000000001','newslettersubscrip0001', + 'pbtmpl0000000000000220','pbtmpl0000000000000221','q5O62aH4pjUXsrQR3Pq4lw', + 'stevecoolmenu000000001','stevenav00000000000001','stevestyle000000000001', + 'stevestyle000000000002','stevestyle000000000003','uRL9qtk7Rb0YRJ41LmHOJw', + 'vrKXEtluIhbmAS9xmPukDA','yBwydfooiLvhEFawJb0VTQ','zcX-wIUct0S_np14xxOA-A' + ]; + + for my $assetId ( @{ $defaultTemplates } ) { + my $asset = WebGUI::Asset::Template->new( $session, $assetId ); + if ( !$asset ) { + print "\n\t\tCouldn't instanciate default asset '$assetId', skipping..."; + next; + } + else { + $asset->update( { isDefault => 1 } ); + } + } + + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub badgePriceDates { + my $session = shift; + print "\tAllowing badges to have multiple prices set by date." unless $quiet; + my $db = $session->db; + $db->write("alter table EMSBadge add column earlyBirdPrice float not null default 0.0"); + $db->write("alter table EMSBadge add column earlyBirdPriceEndDate bigint"); + $db->write("alter table EMSBadge add column preRegistrationPrice float not null default 0.0"); + $db->write("alter table EMSBadge add column preRegistrationPriceEndDate bigint"); + print "Done.\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub fixIsPublicOnTemplates { + my $session = shift; + print "\tFixing 'is public' on templates" unless $quiet; + $session->db->write('UPDATE `assetIndex` SET `isPublic` = 0 WHERE assetId IN (SELECT assetId FROM asset WHERE className IN ("WebGUI::Asset::RichEdit", "WebGUI::Asset::Snippet", "WebGUI::Asset::Template") )'); + print "Done.\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub addCSPostReceivedTemplate { + my $session = shift; + print "\tAdding Post Received Template ID field for CS..." unless $quiet; + $session->db->write("ALTER TABLE Collaboration ADD COLUMN postReceivedTemplateId VARCHAR(22) DEFAULT 'default-post-received';"); + print "Done.\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub addUrlToAssetHistory { + my $session = shift; + print "\tAdding URL column to assetHistory" unless $quiet; + $session->db->write('ALTER TABLE assetHistory ADD COLUMN url VARCHAR(255)'); + print "Done.\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub addSortOrderToFolder { + my $session = shift; + print "\tAdding Sort Order to Folder... " unless $quiet; + $session->db->write( 'alter table Folder add column sortOrder ENUM("ASC","DESC") DEFAULT "ASC"' ); + print "Done.\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub addLoginTimeStats { + my $session = shift; + print "\tAdding login time statistics... " unless $quiet; + $session->db->write( "alter table userLoginLog add column sessionId varchar(22)" ); + $session->db->write( "alter table userLoginLog add column lastPageViewed int(11)" ); + print "Done.\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub removeDoNothingOnDelete { + my $session = shift; + print "\tRemoving 'Do Nothing On Delete workflow if not customized... " unless $quiet; + my $workflow = WebGUI::Workflow->new($session, 'DPWwf20061030000000001'); + if ($workflow) { + my $activities = $workflow->getActivities; + if (@$activities == 0) { + # safe to delete. + for my $setting (qw(trashWorkflow purgeWorkflow changeUrlWorkflow)) { + my $setValue = $session->setting->get($setting); + if ($setValue eq 'DPWwf20061030000000001') { + $session->setting->set($setting, undef); + } + } + $workflow->delete; + } + } + print "Done.\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub redirectChoice { + my $session = shift; + print "\tGiving a user choice about which type of redirect they'd like to perform... " unless $quiet; + $session->db->write("alter table redirect add column redirectType int not null default 302"); + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub addAdHocMailGroups { + my $session = shift; + print "\tAdding AdHocMailGroups to Groups.. " unless $quiet; + $session->db->write("alter table groups add column isAdHocMailGroup tinyint(4) not null default 0"); + print "DONE!\n" unless $quiet; +} + +# -------------- DO NOT EDIT BELOW THIS LINE -------------------------------- + +#---------------------------------------------------------------------------- +# Add a package to the import node +sub addPackage { + my $session = shift; + my $file = shift; + + # Make a storage location for the package + my $storage = WebGUI::Storage->createTemp( $session ); + $storage->addFileFromFilesystem( $file ); + + # Import the package into the import node + my $package = WebGUI::Asset->getImportNode($session)->importPackage( $storage ); + + # Make the package not a package anymore + $package->update({ isPackage => 0 }); + + # Set the default flag for templates added + my $assetIds + = $package->getLineage( ['self','descendants'], { + includeOnlyClasses => [ 'WebGUI::Asset::Template' ], + } ); + for my $assetId ( @{ $assetIds } ) { + my $asset = WebGUI::Asset->newByDynamicClass( $session, $assetId ); + if ( !$asset ) { + print "Couldn't instantiate asset with ID '$assetId'. Please check package '$file' for corruption.\n"; + next; + } + $asset->update( { isDefault => 1 } ); + } + + return; +} + +#------------------------------------------------- +sub start { + my $configFile; + $|=1; #disable output buffering + GetOptions( + 'configFile=s'=>\$configFile, + 'quiet'=>\$quiet + ); + my $session = WebGUI::Session->open($webguiRoot,$configFile); + $session->user({userId=>3}); + my $versionTag = WebGUI::VersionTag->getWorking($session); + $versionTag->set({name=>"Upgrade to ".$toVersion}); + return $session; +} + +#------------------------------------------------- +sub finish { + my $session = shift; + updateTemplates($session); + setDefaultTemplates( $session ); + my $versionTag = WebGUI::VersionTag->getWorking($session); + $versionTag->commit; + $session->db->write("insert into webguiVersion values (".$session->db->quote($toVersion).",'upgrade',".$session->datetime->time().")"); + $session->close(); +} + +#------------------------------------------------- +sub updateTemplates { + my $session = shift; + return undef unless (-d "packages-".$toVersion); + print "\tUpdating packages.\n" unless ($quiet); + addPackage( $session, 'packages-7.5.40-7.6.10/merged.wgpkg' ); +} + diff --git a/docs/upgrades/upgrade_7.6.3-7.6.4.pl b/docs/upgrades/upgrade_7.6.3-7.6.4.pl index 529d4575e..7cbc9da42 100644 --- a/docs/upgrades/upgrade_7.6.3-7.6.4.pl +++ b/docs/upgrades/upgrade_7.6.3-7.6.4.pl @@ -27,6 +27,7 @@ use WebGUI::Asset::Wobject::Survey; use WebGUI::Asset::Wobject::Survey::SurveyJSON; use WebGUI::Asset::Wobject::Survey::ResponseJSON; use WebGUI::ProfileField; +use WebGUI::Utility qw(isIn); use JSON; my $toVersion = '7.6.4';