Replaced CLI gallery import system with a better one.

This commit is contained in:
JT Smith 2008-06-29 02:01:40 +00:00
parent d902c7ec79
commit aa9f0e8396
10 changed files with 464 additions and 1073 deletions

View file

@ -2,6 +2,7 @@
- fixed: Colorpicker window would not open (Martin Kamerbeek / Oqapi)
- fixed: Reverted change to RichEdit that caused IE6 to stop working
- fixed: Subscription: Price not displaying
- Replaced CLI gallery import system with a better one.
- fixed: Flat Discount Coupon: Add to Cart button seems broken
- fixed: Deleting unProtected user profile fields

View file

@ -20,7 +20,7 @@ use Getopt::Long;
use WebGUI::Session;
use WebGUI::Storage;
use WebGUI::Asset;
use File::Path;
my $toVersion = '7.5.15';
my $quiet; # this line required
@ -28,19 +28,21 @@ my $quiet; # this line required
my $session = start(); # this line required
# upgrade functions go here
removeOldGalleryImport($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 removeOldGalleryImport {
my $session = shift;
print "\tRemoving old gallery import mechanism... " unless $quiet;
unlink "../../sbin/migrateCollabToGallery.pl";
unlink "../../sbin/migrateFolderToGallery.pl";
rmtree "../../lib/WebGUI/Utility";
rmtree "../../t/Utility/Gallery";
print "DONE!\n" unless $quiet;
}
# -------------- DO NOT EDIT BELOW THIS LINE --------------------------------

View file

@ -1,7 +1,5 @@
package WebGUI::Asset::Wobject::Gallery;
$VERSION = "1.0.0";
#-------------------------------------------------------------------
# WebGUI is Copyright 2001-2008 Plain Black Corporation.
#-------------------------------------------------------------------

View file

@ -1,7 +1,5 @@
package WebGUI::Asset::Wobject::GalleryAlbum;
$VERSION = "1.0.0";
#-------------------------------------------------------------------
# WebGUI is Copyright 2001-2008 Plain Black Corporation.
#-------------------------------------------------------------------

View file

@ -1,289 +0,0 @@
package WebGUI::Utility::Gallery;
=head1 LEGAL
-------------------------------------------------------------------
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
-------------------------------------------------------------------
=cut
use strict;
use Carp qw( carp croak );
use File::Find;
use Scalar::Util qw( blessed );
use WebGUI::Asset::Wobject::Collaboration;
use WebGUI::Asset::Wobject::Gallery;
use WebGUI::Asset::Post::Thread;
use WebGUI::Storage::Image;
=head1 NAME
WebGUI::Utility::Gallery -- Utility functions for working
with Gallery assets.
=head1 DESCRIPTION
This module provides utility functions to work with Gallery assets from
utility scripts.
This module is B<NOT> to be used by the Gallery asset itself!
=head1 SYNOPSIS
use WebGUI::Utility::Gallery;
my $utility = "WebGUI::Utility::Gallery" # <- not as cumbersome
# Add albums from a collaboration system's threads
my $gallery = WebGUI::Asset::Wobject::Gallery->new( ... );
my $collab = WebGUI::Asset::Wobject::Collaboration->new( ... );
$utility->addAlbumFromCollaboration( $gallery, $collab );
# Add a single album from a collaboration system thread
my $thread = WebGUI::Asset::Post::Thread->new( ... );
$utility->addAlbumFromThread( $gallery, $thread );
# Add a single album from a Folder asset
my $folder = WebGUI::Asset::Wobject::Folder->new( ... );
$utility->addAlbumFromFolder( $gallery, $folder );
# Add a single album from a filesystem branch
$utility->addAlbumFromFilesystem( $gallery, "/Users/Doug/Photos" );
# Add a single album for every folder in a filesystem branch
$utility->addAlbumFromFilesystem(
$gallery, "/Users/Doug/Photos",
{
multiple => 1,
}
);
=head1 METHODS
These methods are available from this class:
=cut
#----------------------------------------------------------------------------
=head2 addAlbumFromCollaboration ( gallery, collab )
Add an album or albums to the gallery from the given Collaboration System.
C<gallery> is an instanciated Gallery asset. C<collab> is an instanciated
Collaboration System asset.
Will add one album for every thread in the Collaboration System. Will call
C<addAlbumFromThread> to do its dirty work.
=cut
sub addAlbumFromCollaboration {
my $class = shift;
my $gallery = shift;
my $collab = shift;
croak "First argument must be Gallery asset"
unless blessed $gallery && $gallery->isa('WebGUI::Asset::Wobject::Gallery');
croak "Second argument must be Collaboration System asset"
unless blessed $collab && $collab->isa('WebGUI::Asset::Wobject::Collaboration');
my $threads
= $collab->getLineage(['descendants'], {
returnObjects => 1,
includeOnlyClasses => ['WebGUI::Asset::Post::Thread'],
statesToInclude => ['published'],
statusToInclude => ['approved', 'archived', 'pending'],
});
for my $thread ( @$threads ) {
$class->addAlbumFromThread( $gallery, $thread );
}
return undef;
}
#----------------------------------------------------------------------------
=head2 addAlbumFromFilesystem ( gallery, root [, options] )
Add an album to the gallery from the file system. C<gallery> is an
instanciated Gallery asset. C<root> is a location on the file system.
C<options> is a hash reference of options with the following keys:
multiple - Create multiple albums, one for each folder.
=cut
sub addAlbumFromFilesystem {
my $class = shift;
my $gallery = shift;
my $root = shift;
my $options = shift;
# TODO!!!
return undef;
}
#----------------------------------------------------------------------------
=head2 addAlbumFromFolder ( gallery, folder )
Add an album from a Folder asset filled with File assets. C<gallery> is an
instance of a Gallery asset. C<folder> is an instance of a Folder asset.
=cut
sub addAlbumFromFolder {
my $class = shift;
my $gallery = shift;
my $folder = shift;
croak "First argument must be Gallery asset"
unless blessed $gallery && $gallery->isa('WebGUI::Asset::Wobject::Gallery');
croak "Second argument must be Folder asset"
unless blessed $folder && $folder->isa('WebGUI::Asset::Wobject::Folder');
my $session = $gallery->session;
my $addOptions = { skipAutoCommitWorkflows => 1 };
# Create the new album
my $album = $gallery->addChild({
className => 'WebGUI::Asset::Wobject::GalleryAlbum',
description => $folder->get('description'),
menuTitle => $folder->get('menuTitle'),
createdBy => $folder->get('createdBy'),
creationDate => $folder->get('creationDate'),
ownerUserId => $folder->get('ownerUserId'),
synopsis => $folder->get('synopsis'),
title => $folder->get('title'),
url => $session->url->urlize( $gallery->get('url') . "/" . $folder->get('title') ),
}, undef, $folder->get('revisionDate'), $addOptions );
my $fileIds
= $folder->getLineage( ['children'], {
joinClass => 'WebGUI::Asset::File',
} );
for my $fileId ( @{ $fileIds } ) {
my $oldFile = WebGUI::Asset->newByDynamicClass( $session, $fileId );
my $oldStorage = $oldFile->getStorageLocation;
my $className = $gallery->getAssetClassForFile( $oldStorage->getPath( $oldFile->get('filename') ) );
if ( !$className ) {
warn "Skipping " . $oldFile->get('filename') . " Gallery doesn't handle this file type";
next;
}
my $newFile = $album->addChild({
className => $className,
createdBy => $oldFile->get('createdBy'),
creationDate => $oldFile->get('creationDate'),
menuTitle => $oldFile->get('menuTitle'),
ownerUserId => $oldFile->get('ownerUserId'),
synopsis => $oldFile->get('synopsis'),
title => $oldFile->get('title'),
url => $session->url->urlize( $album->get('url') . "/" . $oldFile->get('menuTitle') ),
}, undef, $oldFile->get('revisionDate'), $addOptions );
$newFile->setFile( $oldStorage->getPath( $oldFile->get('filename') ) );
}
return undef;
}
#----------------------------------------------------------------------------
=head2 addAlbumFromThread ( gallery, thread )
Add an album to the gallery from the given Collaboration System thread.
C<gallery> is an instanciated Gallery asset. C<thread> is an instanciated
Thread asset.
=cut
sub addAlbumFromThread {
my $class = shift;
my $gallery = shift;
my $thread = shift;
croak "First argument must be Gallery asset"
unless blessed $gallery && $gallery->isa('WebGUI::Asset::Wobject::Gallery');
croak "Second argument must be Thread asset"
unless blessed $thread && $thread->isa('WebGUI::Asset::Post::Thread');
my $session = $gallery->session;
my $addOptions = { skipAutoCommitWorkflows => 1 };
# Create the new album
my $album = $gallery->addChild({
className => 'WebGUI::Asset::Wobject::GalleryAlbum',
description => $thread->get('content'),
menuTitle => $thread->get('menuTitle'),
createdBy => $thread->get('createdBy'),
creationDate => $thread->get('creationDate'),
ownerUserId => $thread->get('ownerUserId'),
synopsis => $thread->get('synopsis'),
title => $thread->get('title'),
url => $session->url->urlize( $gallery->get('url') . "/" . $thread->get('title') ),
userDefined1 => $thread->get('userDefined1'),
userDefined2 => $thread->get('userDefined2'),
userDefined3 => $thread->get('userDefined3'),
userDefined4 => $thread->get('userDefined4'),
userDefined5 => $thread->get('userDefined5'),
}, undef, $thread->get('revisionDate'), $addOptions );
for my $post ( @{ $thread->getPosts } ) {
if ( my $storageId = $post->get('storageId') ) {
# Use WebGUI::Storage::Image to avoid thumbnails if there
my $storage = WebGUI::Storage::Image->get( $session, $storageId );
for my $filename ( @{$storage->getFiles} ) {
my $className = $gallery->getAssetClassForFile( $filename );
if ( !$className ) {
warn "Skipping $filename because Gallery doesn't handle this file type";
next;
}
# Get rid of that file extention
my ($title) = $filename =~ m{(.*)\.[^.]*$};
# Don't repeat the thread
my $synopsis
= $post->get('content') ne $thread->get('content')
? $post->get('content')
: undef
;
my $file = $album->addChild({
className => $className,
createdBy => $post->get('createdBy'),
creationDate => $post->get('creationDate'),
menuTitle => $title,
ownerUserId => $post->get('ownerUserId'),
synopsis => $synopsis,
title => $title,
url => $session->url->urlize( $album->get('url') . "/" . $title ),
userDefined1 => $post->get('userDefined1'),
userDefined2 => $post->get('userDefined2'),
userDefined3 => $post->get('userDefined3'),
userDefined4 => $post->get('userDefined4'),
userDefined5 => $post->get('userDefined5'),
}, undef, $post->get('revisionDate'), $addOptions );
$file->setFile( $storage->getPath( $filename ) );
}
}
}
return undef;
}
1;

452
sbin/galleryImport.pl Normal file
View file

@ -0,0 +1,452 @@
# -------------------------------------------------------------------
# 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
# -------------------------------------------------------------------
$|=1;
use lib '../lib';
use strict;
use Carp qw( carp croak );
use File::Find;
use Getopt::Long;
use Pod::Usage;
use Scalar::Util qw( blessed );
use WebGUI::Asset::Wobject::Collaboration;
use WebGUI::Asset::Wobject::GalleryAlbum;
use WebGUI::Asset::Wobject::Gallery;
use WebGUI::Asset::Wobject::Folder;
use WebGUI::Asset::Post::Thread;
use WebGUI::Storage::Image;
# custom flags
my ($fromAssetId, $fromPath, $fromAssetUrl, $toId, $toUrl) = undef;
# init
my $session = start();
# load gallery
my $gallery = undef;
if (defined $toId) {
$gallery = WebGUI::Asset::Wobject::Gallery->new($session, $toId);
}
else {
$gallery = WebGUI::Asset::Wobject::Gallery->newByUrl($session, $toUrl);
}
if ( $gallery && $gallery->isa('WebGUI::Asset::Wobject::Gallery') ) {
# import from
if (defined $fromPath) {
if (-d $fromPath) {
addAlbumFromFilesystem($gallery,$fromPath);
}
else {
pod2usage("$0: You must specify a valid directory to import from.");
}
}
else {
my $fromAsset = undef;
if (defined $fromAssetId) {
$fromAsset = WebGUI::Asset->newByDynamicClass($session, $fromAssetId);
}
else {
$fromAsset = WebGUI::Asset->newByUrl($session, $fromAssetUrl);
}
if ($fromAsset && $fromAsset->isa("WebGUI::Asset::Wobject::Folder")) {
addAlbumFromFolder($gallery, $fromAsset);
}
elsif ($fromAsset && $fromAsset->isa("WebGUI::Asset::Wobject::Collaboration")) {
addAlbumFromCollaboration($gallery, $fromAsset);
}
elsif ($fromAsset && $fromAsset->isa("WebGUI::Asset::Post::Thread")) {
addAlbumFromThread($gallery, $fromAsset);
}
else {
pod2usage("$0: You must specify a valid asset to import from.");
}
}
}
else {
pod2usage("$0: You must specify a gallery asset to import into.");
}
# cleanup
finish($session);
#----------------------------------------------------------------------------
# addAlbumFromCollaboration ( gallery, collab )
#
# Add an album or albums to the gallery from the given Collaboration System.
# gallery is an instanciated Gallery asset. collab is an instanciated
# Collaboration System asset.
#
# Will add one album for every thread in the Collaboration System. Will call
# addAlbumFromThread to do its dirty work.
sub addAlbumFromCollaboration {
my $gallery = shift;
my $collab = shift;
croak "First argument must be Gallery asset"
unless blessed $gallery && $gallery->isa('WebGUI::Asset::Wobject::Gallery');
croak "Second argument must be Collaboration System asset"
unless blessed $collab && $collab->isa('WebGUI::Asset::Wobject::Collaboration');
my $threads
= $collab->getLineage(['descendants'], {
returnObjects => 1,
includeOnlyClasses => ['WebGUI::Asset::Post::Thread'],
statesToInclude => ['published'],
statusToInclude => ['approved', 'archived', 'pending'],
});
for my $thread ( @$threads ) {
addAlbumFromThread( $gallery, $thread );
}
return undef;
}
#----------------------------------------------------------------------------
# addAlbumFromFilesystem ( gallery, root )
#
# Add an album to the gallery from the file system. gallery is an
# instanciated Gallery asset. root is a location on the file system.
sub addAlbumFromFilesystem {
my $gallery = shift;
my $root = shift;
croak "First argument must be Gallery asset"
unless blessed $gallery && $gallery->isa('WebGUI::Asset::Wobject::Gallery');
croak "Second argument must be a path to a folder on the filesystem"
unless -d $root;
# define the import process
my $recurseFilesystem = sub {
if (-d $File::Find::name) {
# find photos
print "Searching ".$File::Find::name." for photos.\n";
my @photos = ();
if (opendir my $folder, $File::Find::name) {
my @files = readdir $folder;
closedir $folder;
foreach my $file (@files) {
unless (-d $File::Find::name."/".$file) {
if ($file =~ m/\.(jpg|gif|png|jpeg)$/i) {
push(@photos, $file);
}
}
}
}
# import if we found anything
if (scalar(@photos)) {
# get album name
my $albumName = $File::Find::name;
$albumName =~ s{.*\/([A-Za-z0-9\.-_\s]+)$}{$1};
# create album
print "Creating album $albumName\n";
my $addOptions = { skipAutoCommitWorkflows => 1 };
my $album = $gallery->addChild({
className => 'WebGUI::Asset::Wobject::GalleryAlbum',
menuTitle => $albumName,
title => $albumName,
url => $gallery->get('url') . "/" . $albumName,
}, undef, undef, $addOptions );
# do the import
print "\tImporting ".scalar(@photos)." files from ".$File::Find::name." into album called ".$albumName.".\n";
foreach my $filename (@photos) {
print "\t\t".$filename."\n";
my $className = $gallery->getAssetClassForFile( $filename );
if ( !$className ) {
warn "Skipping $filename because Gallery doesn't handle this file type";
next;
}
my ($title) = $filename =~ m{(.*)\.[^.]*$};
my $asset = $album->addChild({
className => $className,
menuTitle => $title,
title => $title,
url => $album->get('url') . "/" . $title,
}, undef, undef, $addOptions );
$asset->setFile( $File::Find::name."/".$filename );
}
}
}
};
# run the search and import process
File::Find::find({wanted=>$recurseFilesystem,no_chdir=>1} , $root);
return undef;
}
#----------------------------------------------------------------------------
# addAlbumFromFolder ( gallery, folder )
#
# Add an album from a Folder asset filled with File assets. gallery is an
# instance of a Gallery asset. folder is an instance of a Folder asset.
sub addAlbumFromFolder {
my $gallery = shift;
my $folder = shift;
croak "First argument must be Gallery asset"
unless blessed $gallery && $gallery->isa('WebGUI::Asset::Wobject::Gallery');
croak "Second argument must be Folder asset"
unless blessed $folder && $folder->isa('WebGUI::Asset::Wobject::Folder');
my $session = $gallery->session;
my $addOptions = { skipAutoCommitWorkflows => 1 };
# Create the new album
my $album = $gallery->addChild({
className => 'WebGUI::Asset::Wobject::GalleryAlbum',
description => $folder->get('description'),
menuTitle => $folder->get('menuTitle'),
createdBy => $folder->get('createdBy'),
creationDate => $folder->get('creationDate'),
ownerUserId => $folder->get('ownerUserId'),
synopsis => $folder->get('synopsis'),
title => $folder->get('title'),
url => $gallery->get('url') . "/" . $folder->get('title'),
}, undef, $folder->get('revisionDate'), $addOptions );
my $fileIds
= $folder->getLineage( ['children'], {
joinClass => 'WebGUI::Asset::File',
} );
for my $fileId ( @{ $fileIds } ) {
my $oldFile = WebGUI::Asset->newByDynamicClass( $session, $fileId );
my $oldStorage = $oldFile->getStorageLocation;
my $className = $gallery->getAssetClassForFile( $oldStorage->getPath( $oldFile->get('filename') ) );
if ( !$className ) {
warn "Skipping " . $oldFile->get('filename') . " Gallery doesn't handle this file type";
next;
}
my $newFile = $album->addChild({
className => $className,
createdBy => $oldFile->get('createdBy'),
creationDate => $oldFile->get('creationDate'),
menuTitle => $oldFile->get('menuTitle'),
ownerUserId => $oldFile->get('ownerUserId'),
synopsis => $oldFile->get('synopsis'),
title => $oldFile->get('title'),
url => $album->get('url') . "/" . $oldFile->get('menuTitle'),
}, undef, $oldFile->get('revisionDate'), $addOptions );
$newFile->setFile( $oldStorage->getPath( $oldFile->get('filename') ) );
}
return undef;
}
#----------------------------------------------------------------------------
# addAlbumFromThread ( gallery, thread )
#
# Add an album to the gallery from the given Collaboration System thread.
# gallery is an instanciated Gallery asset. thread is an instanciated
# Thread asset.
sub addAlbumFromThread {
my $gallery = shift;
my $thread = shift;
croak "First argument must be Gallery asset"
unless blessed $gallery && $gallery->isa('WebGUI::Asset::Wobject::Gallery');
croak "Second argument must be Thread asset"
unless blessed $thread && $thread->isa('WebGUI::Asset::Post::Thread');
my $session = $gallery->session;
my $addOptions = { skipAutoCommitWorkflows => 1 };
# Create the new album
my $album = $gallery->addChild({
className => 'WebGUI::Asset::Wobject::GalleryAlbum',
description => $thread->get('content'),
menuTitle => $thread->get('menuTitle'),
createdBy => $thread->get('createdBy'),
creationDate => $thread->get('creationDate'),
ownerUserId => $thread->get('ownerUserId'),
synopsis => $thread->get('synopsis'),
title => $thread->get('title'),
url => $gallery->get('url') . "/" . $thread->get('title'),
userDefined1 => $thread->get('userDefined1'),
userDefined2 => $thread->get('userDefined2'),
userDefined3 => $thread->get('userDefined3'),
userDefined4 => $thread->get('userDefined4'),
userDefined5 => $thread->get('userDefined5'),
}, undef, $thread->get('revisionDate'), $addOptions );
for my $post ( @{ $thread->getPosts } ) {
if ( my $storageId = $post->get('storageId') ) {
# Use WebGUI::Storage::Image to avoid thumbnails if there
my $storage = WebGUI::Storage::Image->get( $session, $storageId );
for my $filename ( @{$storage->getFiles} ) {
my $className = $gallery->getAssetClassForFile( $filename );
if ( !$className ) {
warn "Skipping $filename because Gallery doesn't handle this file type";
next;
}
# Get rid of that file extention
my ($title) = $filename =~ m{(.*)\.[^.]*$};
# Don't repeat the thread
my $synopsis
= $post->get('content') ne $thread->get('content')
? $post->get('content')
: undef
;
my $file = $album->addChild({
className => $className,
createdBy => $post->get('createdBy'),
creationDate => $post->get('creationDate'),
menuTitle => $title,
ownerUserId => $post->get('ownerUserId'),
synopsis => $synopsis,
title => $title,
url => $album->get('url') . "/" . $title,
userDefined1 => $post->get('userDefined1'),
userDefined2 => $post->get('userDefined2'),
userDefined3 => $post->get('userDefined3'),
userDefined4 => $post->get('userDefined4'),
userDefined5 => $post->get('userDefined5'),
}, undef, $post->get('revisionDate'), $addOptions );
$file->setFile( $storage->getPath( $filename ) );
}
}
}
return undef;
}
#----------------------------------------------------------------------------
sub finish {
my $session = shift;
my $versionTag = WebGUI::VersionTag->getWorking($session);
$versionTag->commit;
$session->var->end;
$session->close;
}
#----------------------------------------------------------------------------
sub start {
$| = 1; #disable output buffering
my ($configFile, $help);
GetOptions(
'configFile=s' => \$configFile,
'help' => \$help,
'toUrl=s' => \$toUrl,
'fromAssetUrl=s' => \$fromAssetUrl,
'toId=s' => \$toId,
'fromAssetId=s' => \$fromAssetId,
'fromPath=s' => \$fromPath,
);
# Show usage
if ($help) {
pod2usage( verbose => 2);
}
unless ($configFile) {
pod2usage("$0: Must specify a --configFile");
}
my $session = WebGUI::Session->open("..",$configFile);
$session->user({userId=>3});
my $versionTag = WebGUI::VersionTag->getWorking($session);
$versionTag->set({name => 'Import Albums into Gallery'});
return $session;
}
__END__
=head1 NAME
galleryImport.pl - Import media into a Gallery asset from various sources.
=head1 SYNOPSIS
perl galleryImport.pl --configFile=www.example.com.conf --fromAssetId=XXXXXXXXXXXXXXXXXXXXXX --toId=XXXXXXXXXXXXXXXXXXXXXX
perl galleryImport.pl --help
=head1 DESCRIPTION
This WebGUI utility script imports files from the filesystem, and other assets
into a Gallery asset. It automatically generates thumbnails and metadata just
as if the files were uploaded through the user interface.
Files with JPG, JPEG, GIF, and PNG extensions are supported.
The thumbnails are created using L<Image::Magick> for image transformations.
Exactly one --from* and exactly one --to* parameter are required.
=over
=item B<--configFile filename>
Specify the config file name of the site you wish to perform this import on.
=item B<--fromAssetId assetId>
Specify the asset id of an asset to import the files from. The asset type is
automatically discerned.
The supported asset types are Collaboration System, Thread, and Folder.
=item B<--fromAssetUrl url>
Specify the URL of an asset to import the files from. The asset type is
automatically discerned. The B<url> is the Asset URL parameter, not a fully
qualified URL.
The supported asset types are Collaboration System, Thread, and Folder.
=item B<--fromPath path>
Specify the absolute B<path> to a folder containing folders images and other
folders with images. The folder name is used to create an album name, and the
files contained in the folder are added as photos in the folder.
=item B<--help>
Shows this documentation, then exits.
=item B<--toId assetId>
Specify the B<assetId> of the Gallery to create albums in.
=item B<--toUrl url>
Specify the B<url> of the Gallery to create albums in. The URL is the asset
URL parameter of the Gallery, and not the fully qualified URL.
=back
=head1 AUTHOR
Copyright 2001-2008 Plain Black Corporation.
=cut

View file

@ -1,159 +0,0 @@
#-------------------------------------------------------------------
# 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 Pod::Usage;
use WebGUI::Utility::Gallery;
use WebGUI::Session;
my $session = start();
my $collab = getCollaborationFromArgs();
my $gallery = getGalleryFromArgs();
WebGUI::Utility::Gallery->addAlbumFromCollaboration( $gallery, $collab );
finish($session);
#----------------------------------------------------------------------------
# getCollaborationFromArgs
# Gets the collaboration system from the arguments. The argument can be
# either an assetId or an absolute URL
sub getCollaborationFromArgs {
my $asset;
my $arg = $ARGV[0];
if ( $arg =~ m{^/} ) {
$asset = WebGUI::Asset->newByUrl( $session, $arg );
}
else {
$asset = WebGUI::Asset->newByDynamicClass( $session, $arg );
}
unless ( $asset && $asset->isa('WebGUI::Asset::Wobject::Collaboration') ) {
pod2usage("$0: First argument must be a Collaboration asset");
}
return $asset;
}
#----------------------------------------------------------------------------
# getGalleryFromArgs
# Gets the Gallery from the arguments. The argument can be either an assetId
# or an absolute URL
sub getGalleryFromArgs {
my $asset;
my $arg = $ARGV[1];
if ( $arg =~ m{^/} ) {
$asset = WebGUI::Asset->newByUrl( $session, $arg );
}
else {
$asset = WebGUI::Asset->newByDynamicClass( $session, $arg );
}
unless ( $asset && $asset->isa('WebGUI::Asset::Wobject::Gallery') ) {
pod2usage("$0: Second argument must be a Gallery asset");
}
return $asset;
}
#----------------------------------------------------------------------------
sub start {
$| = 1; #disable output buffering
my ($configFile, $help);
GetOptions(
'configFile=s' => \$configFile,
'help' => \$help,
);
# Show usage
if ($help) {
pod2usage( verbose => 2);
}
unless ($configFile) {
pod2usage("$0: Must specify a --configFile");
}
my $session = WebGUI::Session->open($webguiRoot,$configFile);
$session->user({userId=>3});
my $versionTag = WebGUI::VersionTag->getWorking($session);
$versionTag->set({name => 'Migrate Collaboration to Gallery'});
return $session;
}
#----------------------------------------------------------------------------
sub finish {
my $session = shift;
my $versionTag = WebGUI::VersionTag->getWorking($session);
$versionTag->commit;
$session->var->end;
$session->close;
}
__END__
=head1 NAME
migrateCollabToGallery -- Migrate a collaboration system into a Gallery
=head1 SYNOPSIS
migrateCollabToGallery --configFile config.conf collab gallery
migrateCollabToGallery --help
=head1 DESCRIPTION
This WebGUI utility script migrates a collaboration system's threads
into gallery albums. It uses B<WebGUI::Utility::Gallery> for its major
features.
=over
=item B<--configFile config.conf>
The WebGUI config file to use. Only the file name needs to be specified,
since it will be looked up inside WebGUI's configuration directory.
This parameter is required.
=item B<collab>
A WebGUI's Collaboration System URL or Asset ID. If an URL is given,
it must be an absolute URL beginning with a slash.
=item B<gallery>
A WebGUI's Gallery URL or Asset ID. If an URL is given, it must be
an absolute URL beginning with a slash.
=item B<--help>
Shows this documentation, then exits.
=back
=head1 AUTHOR
Copyright 2001-2008 Plain Black Corporation.
=cut

View file

@ -1,153 +0,0 @@
#-------------------------------------------------------------------
# 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 Pod::Usage;
use WebGUI::Utility::Gallery;
use WebGUI::Session;
my $session = start();
my $folder = getFolderFromArgs();
my $gallery = getGalleryFromArgs();
WebGUI::Utility::Gallery->addAlbumFromFolder( $gallery, $folder );
finish($session);
#----------------------------------------------------------------------------
# getFolderFromArgs
# Gets the folder from the arguments. The argument can be
# either an assetId or an absolute URL
sub getFolderFromArgs {
my $asset;
my $arg = $ARGV[0];
if ( $arg =~ m{^/} ) {
$asset = WebGUI::Asset->newByUrl( $session, $arg );
}
else {
$asset = WebGUI::Asset->newByDynamicClass( $session, $arg );
}
unless ( $asset && $asset->isa('WebGUI::Asset::Wobject::Folder') ) {
pod2usage("$0: First argument must be a Folder asset");
}
return $asset;
}
#----------------------------------------------------------------------------
# getGalleryFromArgs
# Gets the Gallery from the arguments. The argument can be either an assetId
# or an absolute URL
sub getGalleryFromArgs {
my $asset;
my $arg = $ARGV[1];
if ( $arg =~ m{^/} ) {
$asset = WebGUI::Asset->newByUrl( $session, $arg );
}
else {
$asset = WebGUI::Asset->newByDynamicClass( $session, $arg );
}
unless ( $asset && $asset->isa('WebGUI::Asset::Wobject::Gallery') ) {
pod2usage("$0: Second argument must be a Gallery asset");
}
return $asset;
}
#----------------------------------------------------------------------------
sub start {
$| = 1; #disable output buffering
my ($configFile, $help);
GetOptions(
'configFile=s' => \$configFile,
'help' => \$help,
);
# Show usage
if ($help) {
pod2usage(1);
}
unless ($configFile) {
pod2usage("$0: Must specify a --configFile");
}
my $session = WebGUI::Session->open($webguiRoot,$configFile);
$session->user({userId=>3});
my $versionTag = WebGUI::VersionTag->getWorking($session);
$versionTag->set({name => 'Migrate Folder to Gallery'});
return $session;
}
#----------------------------------------------------------------------------
sub finish {
my $session = shift;
my $versionTag = WebGUI::VersionTag->getWorking($session);
$versionTag->commit;
$session->var->end;
$session->close;
}
=head1 NAME
migrateFolderToGallery.pl -- Migrate a Folder into a Gallery
=head1 SYNOPSIS
migrateFolderToGallery.pl --configFile=<config> <folder> <gallery>
=head1 ARGUMENTS
=over
=item folder
A Folder URL or asset ID. The URL must be an absolute URL, and
so must begin with a "/".
=item gallery
A Gallery URL or asset ID. The URL must be an absolute URL, and so much begin
with a "/".
=back
=head1 OPTIONS
=over
=item configFile
The WebGUI config file to use.
=back
=head1 DESCRIPTION
This script migrates a Folder into a gallery album. It
uses B<WebGUI::Utility::Gallery> for its major features.

View file

@ -1,275 +0,0 @@
# $vim:syntax=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
#------------------------------------------------------------------
# Test the addAlbum* methods from the Gallery::Utility class
#
#
use strict;
use FindBin;
use lib "$FindBin::Bin/../../lib";
use Test::More;
use Test::Deep;
use WebGUI::Test;
use WebGUI::Asset;
use WebGUI::Session;
#----------------------------------------------------------------------------
# Init
my $session = WebGUI::Test->session;
my $node = WebGUI::Asset->getImportNode( $session );
# Add arguments to avoid autocommit workflows
my @addArgs = ( undef, undef, { skipAutoCommitWorkflows => 1 } );
my @versionTags;
push @versionTags, WebGUI::VersionTag->getWorking( $session );
# Generate a Gallery to import into
my $gallery;
my $album;
# Generate a collaboration system to import
my $collab
= $node->addChild({
className => 'WebGUI::Asset::Wobject::Collaboration',
});
my @threads;
for (0..2) {
push @threads, $collab->addChild({
className => 'WebGUI::Asset::Post::Thread',
content => "content$_",
menuTitle => "menuTitle$_",
ownerUserId => "3$_",
synopsis => "synopsis$_",
title => "title$_",
userDefined1 => "$_", # This is important. Used to detect which File is from which Thread
userDefined2 => "userDefined2$_",
userDefined3 => "userDefined3$_",
userDefined4 => "userDefined4$_",
userDefined5 => "userDefined5$_",
}, @addArgs);
$threads[-1]->getStorageLocation->addFileFromFilesystem(
WebGUI::Test->getTestCollateralPath('lamp.jpg')
);
}
# Add a post to one of the threads, with an image
my @posts;
push @{$posts[0]}, $threads[0]->addChild({
className => 'WebGUI::Asset::Post',
content => "content00",
menuTitle => "menuTitle00",
synopsis => "synopsis00",
title => "title00",
userDefined1 => "00", # This is important. Used to detect which File is from which Post
userDefined2 => "userDefined200",
userDefined3 => "userDefined300",
userDefined4 => "userDefined400",
userDefined5 => "userDefined500",
}, @addArgs);
$posts[0][0]->getStorageLocation->addFileFromFilesystem(
WebGUI::Test->getTestCollateralPath('lamp.jpg')
);
$versionTags[-1]->commit;
# Thread fields mapped to album fields that should be migrated
my %threadFields = (
content => "description",
createdBy => 'createdBy',
creationDate => 'creationDate',
menuTitle => "menuTitle",
ownerUserId => "ownerUserId",
synopsis => "synopsis",
title => "title",
userDefined1 => "userDefined1",
userDefined2 => "userDefined2",
userDefined3 => "userDefined3",
userDefined4 => "userDefined4",
userDefined5 => "userDefined5",
);
# Post fields mapped to photo fields that should be migrated
my %postFields = (
createdBy => 'createdBy',
creationDate => 'creationDate',
ownerUserId => "ownerUserId",
userDefined1 => "userDefined1",
userDefined2 => "userDefined2",
userDefined3 => "userDefined3",
userDefined4 => "userDefined4",
userDefined5 => "userDefined5",
);
#----------------------------------------------------------------------------
# Tests
# addAlbumFromThread adds 7 tests for $thread[0] and @{$posts[0]}
my $threadPostTests = 7 * ( 1 + scalar @{ $posts[0] } );
# addAlbumFromThread adds 1 test for each field in %threadFields
my $threadFieldTests = 1 * scalar keys %threadFields;
# addAlbumFromThread adds 1 test for each field in %postFields
my $postFieldTests = 1 * ( scalar keys %postFields )
* ( 1 + scalar @{ $posts[0] } );
plan tests => 10
+ $threadPostTests
+ $threadFieldTests
+ $postFieldTests
;
#----------------------------------------------------------------------------
# Test use
my $utility = 'WebGUI::Utility::Gallery';
use_ok($utility);
#----------------------------------------------------------------------------
# Test addAlbumFromThread
$gallery = $node->addChild({ className => 'WebGUI::Asset::Wobject::Gallery' });
ok(
!eval{ $utility->addAlbumFromThread( "", $threads[0] ); 1},
"addAlbumFromThread croaks if first argument is not a Gallery asset",
);
ok(
!eval{ $utility->addAlbumFromThread( $gallery, "" ); 1},
"addAlbumFromThread croaks if second argument is not a Thread asset",
);
push @versionTags, WebGUI::VersionTag->getWorking( $session );
$utility->addAlbumFromThread( $gallery, $threads[0] );
$versionTags[-1]->commit;
is(
scalar @{ $gallery->getAlbumIds }, 1,
"addAlbumFromThread creates a new album",
);
$album = WebGUI::Asset->newByDynamicClass( $session, $gallery->getAlbumIds->[0] );
use Data::Dumper;
diag( Dumper $gallery->getAlbumIds );
is(
$album->get('revisionDate'), $threads[0]->get('revisionDate'),
"addAlbumFromThread creates album with same revisionDate as thread",
);
my $galleryUrl = $gallery->get('url');
like(
$album->get('url'), qr/^$galleryUrl/,
"addAlbumFromThread creates album with url that begins with gallery's url",
);
# 1 test for each field in %threadFields
for my $oldField ( sort keys %threadFields ) {
is( $album->get( $threadFields{ $oldField } ), $threads[0]->get( $oldField ),
"addAlbumFromThread migrates Thread $oldField to GalleryAlbum $threadFields{$oldField}",
);
}
is(
scalar @{ $album->getFileIds }, 2,
"addAlbumFromThread adds one file for each attachment to the thread or posts of the thread",
);
# 7 tests for each post/file + postFields tests
my $albumUrl = $album->get('url');
for my $fileId ( @{$album->getFileIds} ) {
my $file = WebGUI::Asset->newByDynamicClass( $session, $fileId );
# Find which Thread or Post this file corresponds to
my ( $post, $isThread );
if ( length $file->get('userDefined1') == 1 ) {
# Is a thread, get it
$post = $threads[ $file->get('userDefined1') ];
$isThread = 1;
}
else {
my @index = split //, $file->get('userDefined1');
$post = $posts[ $index[0] ][ $index[1] ];
$isThread = 0;
}
for my $oldField ( sort keys %postFields ) {
is ( $file->get( $postFields{ $oldField } ), $post->get( $oldField ),
"addAlbumFromThread migrates Post $oldField to File $postFields{$oldField}",
);
}
# File synopsis should be Post content If and only if Post content is not the same
# as the Thread content
if ( $isThread ) {
is ( $file->get('synopsis'), undef,
"Files do not get the Thread's content"
);
}
else {
is ( $file->get('synopsis'), $post->get('content'),
"Files get content when they're from posts other than the Thread",
);
}
like(
$file->get('url'), qr/^$albumUrl/,
"addAlbumFromThread add files with urls that begin with GalleryAlbum url",
);
isa_ok( $file->getStorageLocation, 'WebGUI::Storage', 'Storage location exists' );
ok( $file->get('filename'), '"filename" property was set' );
cmp_deeply(
$file->getStorageLocation->getFiles, superbagof($file->get('filename')),
"Storage location contains the filename"
);
# Test that title and menuTitle do not contain file extention
my ($title) = $file->get('filename') =~ m{(.*)\.[^.]*$};
is( $file->get('title'), $title,
"Title doesn't contain the file extention"
);
is( $file->get('menuTitle'), $title,
"Menu title doesn't contain the file extention"
);
}
#----------------------------------------------------------------------------
# Test addAlbumFromCollaboration
$gallery = $node->addChild({ className => 'WebGUI::Asset::Wobject::Gallery' });
ok(
!eval{ $utility->addAlbumFromCollaboration( "", $collab ); 1},
"addAlbumFromCollaboration croaks if first argument is not a Gallery asset",
);
ok(
!eval{ $utility->addAlbumFromCollaboration( $gallery, "" ); 1},
"addAlbumFromCollaboration croaks if second argument is not a Collaboration asset",
);
push @versionTags, WebGUI::VersionTag->getWorking( $session );
$utility->addAlbumFromCollaboration( $gallery, $collab );
$versionTags[-1]->commit;
is(
scalar @{ $gallery->getAlbumIds }, scalar @threads,
"addAlbumFromCollaboration creates one album per thread",
);
#----------------------------------------------------------------------------
# Cleanup
END {
for my $tag ( @versionTags ) {
$tag->rollback;
}
}

View file

@ -1,184 +0,0 @@
# $vim:syntax=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
#------------------------------------------------------------------
# Test the addAlbum* methods from the Gallery::Utility class
#
#
use strict;
use FindBin;
use lib "$FindBin::Bin/../../lib";
use Test::More;
use Test::Deep;
use WebGUI::Test;
use WebGUI::Asset;
use WebGUI::Session;
#----------------------------------------------------------------------------
# Init
my $session = WebGUI::Test->session;
my $node = WebGUI::Asset->getImportNode( $session );
# Add arguments to avoid autocommit workflows
my @addArgs = ( undef, undef, { skipAutoCommitWorkflows => 1 } );
my @versionTags;
push @versionTags, WebGUI::VersionTag->getWorking( $session );
# Generate a Gallery to import into
my $gallery;
my $album;
# Generate a folder to import
my $folder
= $node->addChild({
className => 'WebGUI::Asset::Wobject::Folder',
});
my @files;
for (0..2) {
push @files, $folder->addChild({
className => 'WebGUI::Asset::File::Image',
menuTitle => "menuTitle$_",
ownerUserId => "3$_",
synopsis => "synopsis$_",
title => "title$_", # This is important. Used to detect which GalleryFile is from which File
filename => 'lamp.jpg',
}, @addArgs);
$files[-1]->getStorageLocation->addFileFromFilesystem(
WebGUI::Test->getTestCollateralPath('lamp.jpg')
);
}
$versionTags[-1]->commit;
# File to GalleryFile field mappings. Should be mostly the same
my %fileField = (
title => "title",
menuTitle => "menuTitle",
synopsis => "synopsis",
ownerUserId => "ownerUserId",
filename => "filename",
);
# Folder to GalleryAlbum field mappings.
my %folderField = (
title => "title",
menuTitle => "menuTitle",
description => "description",
createdBy => 'createdBy',
creationDate => 'creationDate',
ownerUserId => 'ownerUserId',
synopsis => 'synopsis',
);
#----------------------------------------------------------------------------
# Tests
# 1 test for each file + file field tests
my $fileTests = scalar @files * ( 3 + scalar keys %fileField );
# 1 test for each item in folderField
my $folderTests = scalar keys %folderField;
plan tests => 10
+ $fileTests
+ $folderTests
;
#----------------------------------------------------------------------------
# Test use
my $utility = 'WebGUI::Utility::Gallery';
use_ok($utility);
#----------------------------------------------------------------------------
# Test addAlbumFromFolder
$gallery = $node->addChild({ className => 'WebGUI::Asset::Wobject::Gallery' });
ok(
!eval{ $utility->addAlbumFromFolder( "", $folder ); 1},
"addAlbumFromFolder croaks if first argument is not a Gallery asset",
);
ok(
!eval{ $utility->addAlbumFromFolder( $gallery, "" ); 1},
"addAlbumFromFolder croaks if second argument is not a Folder asset",
);
push @versionTags, WebGUI::VersionTag->getWorking( $session );
$utility->addAlbumFromFolder( $gallery, $folder );
$versionTags[-1]->commit;
is(
scalar @{ $gallery->getAlbumIds }, 1,
"addAlbumFromFolder creates a new album",
);
$album = WebGUI::Asset->newByDynamicClass( $session, $gallery->getAlbumIds->[0] );
is(
$album->get('revisionDate'), $folder->get('revisionDate'),
"addAlbumFromFolder creates album with same revisionDate as folder",
);
my $galleryUrl = $gallery->get('url');
like(
$album->get('url'), qr/^$galleryUrl/,
"addAlbumFromFolder creates album with url that begins with gallery's url",
);
# 1 test for each field in %folderField
for my $oldField ( sort keys %folderField ) {
is( $album->get( $folderField{ $oldField } ), $folder->get( $oldField ),
"addAlbumFromFolder migrates Folder $oldField to GalleryAlbum $folderField{$oldField}",
);
}
is(
scalar @{ $album->getFileIds }, $folder->getChildCount,
"addAlbumFromFolder adds one file for each File in the Folder",
);
# 4 tests for each file + fileField tests
my $albumUrl = $album->get('url');
for my $fileId ( @{$album->getFileIds} ) {
my $newFile = WebGUI::Asset->newByDynamicClass( $session, $fileId );
# Find which File this was in the original Folder
( my $index ) = $newFile->get('title') =~ /title(\d+)/;
my $oldFile = $files[ $index ];
for my $oldField ( sort keys %fileField ) {
is ( $newFile->get( $fileField{ $oldField } ), $oldFile->get( $oldField ),
"addAlbumFromFolder migrates File $oldField to GalleryFile $fileField{$oldField}",
);
}
like(
$newFile->get('url'), qr/^$albumUrl/,
"addAlbumFromFolder add files with urls that begin with GalleryAlbum url",
);
isa_ok( $newFile->getStorageLocation, 'WebGUI::Storage', 'Storage location exists' );
ok( $newFile->get('filename'), '"filename" property was set' );
cmp_deeply(
$newFile->getStorageLocation->getFiles, superbagof($newFile->get('filename')),
"Storage location contains the filename"
);
}
#----------------------------------------------------------------------------
# Cleanup
END {
for my $tag ( @versionTags ) {
$tag->rollback;
}
}