diff --git a/docs/upgrades/packages-7.8.24-7.9.11/merged.wgpkg b/docs/upgrades/packages-7.8.24-7.9.11/merged.wgpkg new file mode 100644 index 000000000..0810da6eb Binary files /dev/null and b/docs/upgrades/packages-7.8.24-7.9.11/merged.wgpkg differ diff --git a/docs/upgrades/upgrade_7.8.24-7.9.11.pl b/docs/upgrades/upgrade_7.8.24-7.9.11.pl new file mode 100644 index 000000000..7238d8809 --- /dev/null +++ b/docs/upgrades/upgrade_7.8.24-7.9.11.pl @@ -0,0 +1,501 @@ +#!/usr/bin/env perl + +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2009 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 WebGUI::Session; +use WebGUI::Storage; +use WebGUI::Asset; +use WebGUI::Utility; + + +my $toVersion = "7.9.11"; # make this match what version you're going to +my $quiet; # this line required + + +my $session = start(); # this line required + +# upgrade functions go here +##7.9.1-.2 +addSortItemsSCColumn($session); +addExtensionWorkflow($session); + +##7.9.2-.3 +reindexSiteForDefaultSynopsis( $session ); +addTopLevelWikiKeywords( $session ); + +##7.9.3-.4 +addWikiSubKeywords($session); +addSynopsistoEachWikiPage($session); +dropVisitorAddressBooks($session); +alterCartTable($session); +alterAddressBookTable($session); +addWizardHandler( $session ); +addTemplateExampleImage( $session ); +addPayDriverTemplates( $session ); + +##7.9.4-.5 +modifySortItems( $session ); +addRejectNoticeSetting($session); +installNewCSUnsubscribeTemplate($session); + +##7.9.5-.6 +addIndexForInbox($session); + +##7.9.7-.8 +addTwitterAuth( $session ); + +##7.9.8-.9 +migrateAttachmentsToJson( $session ); + +##7.9.9-.10 +alterStoryArchiveTable($session); + +##7.9.10-.11 +alterStoryTopicTable($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; +#} + + +#---------------------------------------------------------------------------- +sub addExtensionWorkflow { + print "\tAdding calendar event extension to weekly maintenence..." + unless $quiet; + my $workflow = WebGUI::Workflow->new($session, 'pbworkflow000000000002'); + my $activity = $workflow->addActivity('WebGUI::Workflow::Activity::ExtendCalendarRecurrences'); + $activity->set(title => 'Extend Calendar Recurrences'); + $activity->set(description => 'Create events for live recurrences up to two years from the current date'); + print "Done\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub addSortItemsSCColumn { + my $session = shift; + print "\tAdding sort items switch to Syndicated Content... " unless $quiet; + + my $sth = $session->db->read('DESCRIBE `SyndicatedContent`'); + while (my ($col) = $sth->array) { + if ($col eq 'sortItems') { + print "Skipped.\n" unless $quiet; + return; + } + } + $session->db->write('ALTER TABLE SyndicatedContent ADD COLUMN sortItems BOOL DEFAULT 1'); + + print "Done.\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub addTopLevelWikiKeywords { + my $session = shift; + print "\tAdding top level keywords page to WikiMaster... " unless $quiet; + + my $sth = $session->db->read('DESCRIBE `WikiMaster`'); + while (my ($col) = $sth->array) { + if ($col eq 'topLevelKeywords') { + print "Skipped.\n" unless $quiet; + return; + } + } + $session->db->write('ALTER TABLE WikiMaster ADD COLUMN topLevelKeywords LONGTEXT'); + + print "Done.\n" unless $quiet; +} + + +#---------------------------------------------------------------------------- +# Reindex the site to clear out default synopsis +sub reindexSiteForDefaultSynopsis { + my $session = shift; + print "\tRe-indexing site to clear out default synopses... " unless $quiet; + + my $rs = $session->db->read("select assetId, className from asset where state='published'"); + my @searchableAssetIds; + while (my ($id, $class) = $rs->array) { + my $asset = WebGUI::Asset->new($session,$id,$class); + if (defined $asset && $asset->get("state") eq "published" && ($asset->get("status") eq "approved" || $asset->get("status") eq "archived")) { + $asset->indexContent; + push (@searchableAssetIds, $id); + } + } + + # delete indexes of assets that are no longer searchable + my $list = $session->db->quoteAndJoin(\@searchableAssetIds) if scalar(@searchableAssetIds); + $session->db->write("delete from assetIndex where assetId not in (".$list.")") if $list; + + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Add example images to templates +sub addTemplateExampleImage { + my $session = shift; + print "\tAdding example image field to template... " unless $quiet; + + $session->db->write( q{ + ALTER TABLE template ADD storageIdExample CHAR(22) + } ); + + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- + +sub addWizardHandler { + my ( $sesssion ) = @_; + print "\tAdding WebGUI::Wizard... " unless $quiet; + + if ( !grep { $_ eq 'WebGUI::Content::Wizard' } @{$session->config->get('contentHandlers')} ) { + # Find the place of Operation and add before + my @handlers = (); + for my $handler ( @{$session->config->get('contentHandlers')} ) { + if ( $handler eq 'WebGUI::Content::Operation' ) { + push @handlers, 'WebGUI::Content::Wizard'; + } + push @handlers, $handler; + } + $session->config->set('contentHandlers',\@handlers); + } + + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub addWikiSubKeywords { + my $session = shift; + print "\tAdd the WikiMaster sub-keywords table... " unless $quiet; + # and here's our code + $session->db->write(<getIsa($session); + PAGE: while (1) { + my $page = eval {$pager->()}; + next PAGE if Exception::Class->caught(); + last PAGE unless $page; + my ($synopsis) = $page->getSynopsisAndContent(undef, $page->get('content')); + $page->update({synopsis => $synopsis}); + } + # and here's our code + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub dropVisitorAddressBooks { + my $session = shift; + print "\tDrop AddressBooks owned by Visitor... " unless $quiet; + my $sth = $session->db->read(q|SELECT addressBookId FROM addressBook where userId='1'|); + BOOK: while (my ($addressBookId) = $sth->array) { + my $book = eval { WebGUI::Shop::AddressBook->new($session, $addressBookId); }; + next BOOK if Exception::Class->caught(); + $book->delete; + } + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub alterAddressBookTable { + my $session = shift; + print "\tDrop sessionId from the Address Book database table... " unless $quiet; + # and here's our code + $session->db->write("ALTER TABLE addressBook DROP COLUMN sessionId"); + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub alterCartTable { + my $session = shift; + print "\tAdd billing address column to the Cart table... " unless $quiet; + # and here's our code + $session->db->write("ALTER TABLE cart ADD COLUMN billingAddressId CHAR(22)"); + $session->db->write("ALTER TABLE cart ADD COLUMN gatewayId CHAR(22)"); + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub addPayDriverTemplates { + my $session = shift; + print "\tAdd templates to the Payment Drivers that need them... " unless $quiet; + # and here's our code + my $pay = WebGUI::Shop::Pay->new($session); + my @gateways = @{ $pay->getPaymentGateways }; + GATEWAY: foreach my $gateway (@gateways) { + next GATEWAY unless $gateway; + my $properties = $gateway->get; + if ($gateway->isa('WebGUI::Shop::PayDriver::Cash')) { + $properties->{summaryTemplateId} = '30h5rHxzE_Q0CyI3Gg7EJw'; + } + elsif ($gateway->isa('WebGUI::Shop::PayDriver::ITransact')) { + ##Nothing to do. This template was only changed, not added. + } + elsif ($gateway->isa('WebGUI::Shop::PayDriver::Ogone')) { + $properties->{summaryTemplateId} = 'jysVZeUR0Bx2NfrKs5sulg'; + } + elsif ($gateway->isa('WebGUI::Shop::PayDriver::PayPal::PayPalStd')) { + $properties->{summaryTemplateId} = '300AozDaeveAjB_KN0ljlQ'; + } + elsif ($gateway->isa('WebGUI::Shop::PayDriver::PayPal::ExpressCheckout')) { + $properties->{summaryTemplateId} = 'GqnZPB0gLoZmqQzYFaq7bg'; + } + else { + die "Unknown payment driver type found. Unable to automatically upgrade.\n"; + } + $gateway->update($properties); + } + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Changes sortItems to a SelectBox +sub modifySortItems { + my $session = shift; + print "\tUpdating SyndicatedContent...\n" unless $quiet; + + require WebGUI::Form::SelectBox; + + print "\t\tModifying table...\n" unless $quiet; + my $type = WebGUI::Form::SelectBox->getDatabaseFieldType; + $session->db->write("ALTER TABLE SyndicatedContent MODIFY sortItems $type"); + + print "\t\tConverting old values..." unless $quiet; + $session->db->write(q{ + UPDATE SyndicatedContent + SET sortItems = 'none' + WHERE sortItems <> '1' + }); + $session->db->write(q{ + UPDATE SyndicatedContent + SET sortItems = 'pubDate_des' + WHERE sortItems = '1' + }); + + # and here's our code + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Adds setting which allows users to set whether or not to send reject notices +sub addRejectNoticeSetting { + my $session = shift; + print "\tAdding reject notice setting... " unless $quiet; + $session->setting->add('sendRejectNotice',1); + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +sub installNewCSUnsubscribeTemplate { + my $session = shift; + print "\tAdding new unsubscribe template to the CS... " unless $quiet; + $session->db->write(q|ALTER TABLE Collaboration ADD COLUMN unsubscribeTemplateId CHAR(22) NOT NULL|); + $session->db->write(q|UPDATE Collaboration set unsubscribeTemplateId='default_CS_unsubscribe'|); + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Add keys and indicies to groupGroupings to help speed up group queries +sub addIndexForInbox { + my $session = shift; + print "\tAdding index to inbox_messageState... " unless $quiet; + my $sth = $session->db->read('show create table inbox_messageState'); + my ($field,$stmt) = $sth->array; + $sth->finish; + unless ($stmt =~ m/KEY `userId_deleted_isRead`/i) { + $session->db->write("alter table inbox_messageState add index userId_deleted_isRead (userId,deleted,isRead)"); + } + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Add twitter auth and macro +sub addTwitterAuth { + my $session = shift; + print "\tAdding twitter auth method... " unless $quiet; + + $session->config->addToArray( 'authMethods', 'Twitter' ); + $session->config->addToHash( 'macros', "TwitterLogin" => "TwitterLogin" ); + $session->setting->set( 'twitterEnabled', 0 ); + $session->setting->set( 'twitterTemplateIdChooseUsername', 'mfHGkp6t9gdclmzN33OEnw' ); + + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Move Template attachments to JSON collateral +sub migrateAttachmentsToJson { + my $session = shift; + print "\tMoving template attachments to JSON... " unless $quiet; + # and here's our code + $session->db->write( + "ALTER TABLE template ADD attachmentsJson LONGTEXT" + ); + + my $attach; # hashref (template) of hashrefs (revisionDate) + # of arrayrefs (attachments) of hashrefs (attachment) + my $sth = $session->db->read( "SELECT * FROM template_attachments" ); + while ( my $row = $sth->hashRef ) { + push @{ $attach->{ $row->{templateId} }{ $row->{revisionDate} } }, { + url => $row->{url}, + type => $row->{type}, + }; + } + + for my $templateId ( keys %{ $attach } ) { + for my $revisionDate ( keys %{ $attach->{$templateId} } ) { + my $data = $attach->{$templateId}{$revisionDate}; + my $asset = WebGUI::Asset->newByDynamicClass( $session, $templateId, $revisionDate ); + $asset->update({ attachmentsJson => JSON->new->encode( $data ) }); + } + } + + $session->db->write( + "DROP TABLE template_attachments" + ); + + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Describe what our function does +sub alterStoryArchiveTable { + my $session = shift; + print "\tAdd story sort order column to the StoryAcrhive table... " unless $quiet; + + my $sth = $session->db->read('DESCRIBE `StoryArchive`'); + while (my ($col) = $sth->array) { + if ($col eq 'storySortOrder') { + print "Skipped.\n" unless $quiet; + return; + } + } + + $session->db->write("ALTER TABLE StoryArchive ADD COLUMN storySortOrder CHAR(22)"); + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Describe what our function does +sub alterStoryTopicTable { + my $session = shift; + print "\tAdd story sort order column to the StoryTopic table... " unless $quiet; + + my $sth = $session->db->read('DESCRIBE `StoryTopic`'); + while (my ($col) = $sth->array) { + if ($col eq 'storySortOrder') { + print "Skipped.\n" unless $quiet; + return; + } + } + + $session->db->write("ALTER TABLE StoryTopic ADD COLUMN storySortOrder CHAR(22)"); + $session->db->write("UPDATE StoryTopic SET storySortOrder = 'Chronologically' WHERE storySortOrder IS NULL"); + 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 = eval { + my $node = WebGUI::Asset->getImportNode($session); + $node->importPackage( $storage, { + overwriteLatest => 1, + clearPackageFlag => 1, + setDefaultTemplate => 1, + } ); + }; + + if ($package eq 'corrupt') { + die "Corrupt package found in $file. Stopping upgrade.\n"; + } + if ($@ || !defined $package) { + die "Error during package import on $file: $@\nStopping upgrade\n."; + } + + 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); + upgradeToYUI28( $session ); + my $versionTag = WebGUI::VersionTag->getWorking($session); + $versionTag->commit; + $session->db->write("insert into webguiVersion values (".$session->db->quote($toVersion).",'upgrade',".time().")"); + $session->close(); +} + +#------------------------------------------------- +sub updateTemplates { + my $session = shift; + print "\tUpdating packages.\n" unless ($quiet); + addPackage( $session, 'packages-7.8.24-7.9.11/merged.wgpkg' ); +} + +#vim:ft=perl