diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt
index 471f6e353..f09d6eb00 100644
--- a/docs/changelog/7.x.x.txt
+++ b/docs/changelog/7.x.x.txt
@@ -29,6 +29,8 @@
- fixed: testEnvironment.pl can't find WebGUI modules after installing a prerequisite
- fixed: Combo box does not show possible values in Thingy (SDH Consulting
Group)
+ - Added some web services to the Gallery asset to support the use of remote
+ apps to post photos and create albums.
- fixed: Cross site scripting issue on operation pages
- fixed: Search asset shows blank page after searching
- rfe: Updated Thingy's edit instructions and search description fields to
diff --git a/lib/WebGUI/Asset/File.pm b/lib/WebGUI/Asset/File.pm
index 889b4f7d0..a2b3e8d65 100644
--- a/lib/WebGUI/Asset/File.pm
+++ b/lib/WebGUI/Asset/File.pm
@@ -378,24 +378,31 @@ sub purgeRevision {
#----------------------------------------------------------------------------
-=head2 setFile ( filename )
+=head2 setFile ( [pathtofile] )
+
+Tells the asset to do all the postprocessing on the file (setting privs, thubnails, or whatever).
+
+=head3 pathtofile
+
+If specified will copy a new file into the storage location from this path and delete any existing file.
-Set the file being handled by this storage location with a file from the
-system.
=cut
sub setFile {
my $self = shift;
my $filename = shift;
- my $storage = $self->getStorageLocation;
- # Clear the old file if any
- $storage->clear;
-
- $storage->addFileFromFilesystem($filename)
- || croak "Couldn't setFile: " . join(", ",@{ $storage->getErrors });
- # NOTE: We should not croak here, the WebGUI::Storage should croak for us.
+ if ($filename) {
+ my $storage = $self->getStorageLocation;
+ # Clear the old file if any
+ $storage->clear;
+
+ $storage->addFileFromFilesystem($filename)
+ || croak "Couldn't setFile: " . join(", ",@{ $storage->getErrors });
+ # NOTE: We should not croak here, the WebGUI::Storage should croak for us.
+
+ }
$self->updatePropertiesFromStorage;
$self->applyConstraints;
diff --git a/lib/WebGUI/Asset/Wobject/Gallery.pm b/lib/WebGUI/Asset/Wobject/Gallery.pm
index d3c97db05..aaaa16360 100644
--- a/lib/WebGUI/Asset/Wobject/Gallery.pm
+++ b/lib/WebGUI/Asset/Wobject/Gallery.pm
@@ -11,10 +11,12 @@ package WebGUI::Asset::Wobject::Gallery;
#-------------------------------------------------------------------
use strict;
+use base 'WebGUI::Asset::Wobject';
+use JSON;
use Tie::IxHash;
use WebGUI::International;
use WebGUI::Utility;
-use base 'WebGUI::Asset::Wobject';
+use XML::Simple;
=head1 NAME
@@ -1043,6 +1045,89 @@ sub www_add {
#----------------------------------------------------------------------------
+=head2 www_addAlbumService ( )
+
+A web service to create albums. Returns a json string that looks like this:
+
+ {
+ "lastUpdated" : "2008-10-13 17:31:32",
+ "canAddFiles" : 1,
+ "url" : "http://dev.localhost.localdomain/cool-gallery/the-cool-album2",
+ "title" : "The Cool Album",
+ "dateCreated" : "2008-10-13 17:31:32"
+ }
+
+You can make the request as a post to the gallery url with the following variables:
+
+=head3 func
+
+Required. Must have a value of "addAlbumService"
+
+=head3 as
+
+Defaults to 'json', but if specified as 'xml' then the return result will be:
+
+
+ 1
+ 2008-10-13 17:39:22
+ 2008-10-13 17:39:22
+ The Cool Album
+ http://dev.localhost.localdomain/cool-gallery/the-cool-album3
+
+
+=head3 title
+
+The title of the album you wish to create.
+
+=head3 synopsis
+
+A brief description of the album you wish to create.
+
+=head3 othersCanAdd
+
+A 1 or a 0 depending on whether you want other people to be able to add images to this album.
+
+=cut
+
+sub www_addAlbumService {
+ my $self = shift;
+ my $session = $self->session;
+
+ return $session->privilege->insufficient unless ($self->canAddFile);
+ my $form = $session->form;
+
+ my $album = $self->addChild({
+ className => "WebGUI::Asset::Wobject::GalleryAlbum",
+ title => $form->get('title','text'),
+ description => $form->get('synopsis','textarea'),
+ synopsis => $form->get('synopsis','textarea'),
+ othersCanAdd => $form->get('othersCanAdd','yesNo'),
+ });
+
+ $album->requestAutoCommit;
+
+ my $siteUrl = $session->url->getSiteURL;
+ my $date = $session->datetime;
+ my $as = $form->get('as') || 'json';
+
+ my $document = {
+ canAddFiles => $album->canAddFile,
+ title => $album->getTitle,
+ url => $siteUrl.$album->getUrl,
+ dateCreated => $date->epochToHuman($album->get('creationDate'), '%y-%m-%d %j:%n:%s'),
+ lastUpdated => $date->epochToHuman($album->get('revisionDate'), '%y-%m-%d %j:%n:%s'),
+ };
+ if ($as eq "xml") {
+ $session->http->setMimeType('text/xml');
+ return XML::Simple::XMLout($document, NoAttr => 1);
+ }
+
+ $session->http->setMimeType('text/json');
+ return JSON->new->pretty->encode($document);
+}
+
+#----------------------------------------------------------------------------
+
=head2 www_listAlbums ( )
Show a paginated list of the albums in this gallery.
@@ -1074,7 +1159,7 @@ sub www_listAlbumsRss {
my $var = $self->getTemplateVars;
for my $assetId ( @{ $self->getAlbumIds } ) {
- my $asset = WebGUI::Asset->newByDynamicClass( $session, $assetId );
+ my $asset = WebGUI::Asset->new( $session, $assetId, 'WebGUI::Asset::Wobject::GalleryAlbum');
my $assetVar = $asset->getTemplateVars;
# Fix URLs
@@ -1095,6 +1180,147 @@ sub www_listAlbumsRss {
#----------------------------------------------------------------------------
+=head2 www_listAlbumsService ( )
+
+A web service to retrieve album information. You may request information from this gallery with a straight GET request:
+
+http://admin:123qwe@www.example.com/gallery-url?func=listAlbumsService
+
+The following parameters are optional, but may be passed along the query to change the output of this method.
+
+=head3 as
+
+Defaults to 'json', but can be overridden as 'xml'. If specified as 'json' the document returned will look like this:
+
+ {
+ "pageNumber" : 1,
+ "gallery" : {
+ "lastUpdated" : "2008-10-13 14:56:49",
+ "synopsis" : "This is the summary.",
+ "menuTitle" : "My Cool Gallery",
+ "url" : "http://dev.localhost.localdomain/cool-gallery",
+ "title" : "My Cool Gallery",
+ "canAddAlbums" : 1,
+ "dateCreated" : "2008-10-13 14:48:44"
+ },
+ "albums" : [
+ {
+ "thumbnailUrl" : "http://dev.localhost.localdomain",
+ "lastUpdated" : "2008-10-13 14:51:38",
+ "canAddFiles" : 1,
+ "url" : "http://dev.localhost.localdomain/cool-gallery/the-gallery-you-can-post-to",
+ "title" : "The Gallery You Can Post To",
+ "dateCreated" : "2008-10-13 14:50:22"
+ },
+ {
+ "thumbnailUrl" : "http://dev.localhost.localdomain",
+ "lastUpdated" : "2008-10-13 14:51:20",
+ "canAddFiles" : 0,
+ "url" : "http://dev.localhost.localdomain/cool-gallery/another-album",
+ "title" : "Another Album",
+ "dateCreated" : "2008-10-13 14:51:20"
+ }
+ ]
+ }
+
+If specified as 'xml' the document returned will look like this:
+
+
+
+ 1
+ 2008-10-13 14:50:22
+ 2008-10-13 14:51:38
+ http://dev.localhost.localdomain
+ The Gallery You Can Post To
+ http://dev.localhost.localdomain/cool-gallery/the-gallery-you-can-post-to
+
+
+ 0
+ 2008-10-13 14:51:20
+ 2008-10-13 14:51:20
+ http://dev.localhost.localdomain
+ Another Album
+ http://dev.localhost.localdomain/cool-gallery/another-album
+
+
+ 1
+ 2008-10-13 14:48:44
+ 2008-10-13 14:56:49
+ My Cool Gallery
+ This is the summary.
+ My Cool Gallery
+ http://dev.localhost.localdomain/cool-gallery
+
+ 1
+
+
+=head3 pn
+
+Defaults to 1. This represents the page number. It will return up to 100 albums at a time.
+
+=cut
+
+sub www_listAlbumsService {
+ my $self = shift;
+ my $session = $self->session;
+
+ return $session->privilege->insufficient unless ($self->canView);
+
+ my $siteUrl = $session->url->getSiteURL;
+ my @assets;
+ my $date = $session->datetime;
+ my $form = $session->form;
+ my $as = $form->get('as') || 'json';
+ my $pageNumber = $form->get('pn') || 1;
+ my $user = $session->user;
+ my $count = 1;
+
+ for my $assetId ( @{ $self->getAlbumIds } ) {
+ if ($count < $pageNumber * 100 - 99) { # skip low page numbers
+ next;
+ }
+ if ($count > $pageNumber * 100) { # skip high page numbers
+ last;
+ }
+ my $asset = WebGUI::Asset->new( $session, $assetId, 'WebGUI::Asset::Wobject::GalleryAlbum' );
+ if (defined $asset) {
+ if ($asset->canView) {
+ push @assets, {
+ title => $asset->getTitle,
+ url => $siteUrl.$asset->getUrl,
+ dateCreated => $date->epochToHuman($asset->get('creationDate'), '%y-%m-%d %j:%n:%s'),
+ lastUpdated => $date->epochToHuman($asset->get('revisionDate'), '%y-%m-%d %j:%n:%s'),
+ thumbnailUrl => $siteUrl.$asset->getThumbnailUrl,
+ canAddFiles => $asset->canAddFile,
+ };
+ }
+ }
+ $count++;
+ }
+
+ my $document = {
+ pageNumber => $pageNumber,
+ gallery => {
+ canAddAlbums => $self->canAddFile,
+ title => $self->getTitle,
+ menuTitle => $self->get('menuTitle'),
+ synopsis => $self->get('synopsis'),
+ url => $siteUrl.$self->getUrl,
+ dateCreated => $date->epochToHuman($self->get('creationDate'), '%y-%m-%d %j:%n:%s'),
+ lastUpdated => $date->epochToHuman($self->get('revisionDate'), '%y-%m-%d %j:%n:%s'),
+ },
+ albums => \@assets
+ };
+ if ($as eq "xml") {
+ $session->http->setMimeType('text/xml');
+ return XML::Simple::XMLout($document, NoAttr => 1);
+ }
+ $session->http->setMimeType('text/json');
+ return JSON->new->pretty->encode($document);
+}
+
+#----------------------------------------------------------------------------
+
=head2 www_search ( )
Search through the GalleryAlbums and files in this gallery. Show the form to
diff --git a/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm b/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm
index ea85f3ab6..a58e793f3 100644
--- a/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm
+++ b/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm
@@ -902,6 +902,93 @@ sub www_addArchiveSave {
);
}
+#----------------------------------------------------------------------------
+
+=head2 www_addFileService ( )
+
+A web service to create files in albums. Returns a json string that looks like this:
+
+ {
+ "lastUpdated" : "2008-10-13 20:06:13",
+ "thumbnailUrl" : "http://dev.localhost.localdomain/uploads/W1/X9/W1X9A95iagNbq4n1utdXug/thumb-jt_25.jpg",
+ "url" : "http://dev.localhost.localdomain/cool-gallery/the-cool-album3/jt13",
+ "title" : "JT",
+ "dateCreated" : "2008-10-13 20:06:13"
+ }
+
+You can make the request as a post to the gallery url with the following variables:
+
+=head3 func
+
+Required. Must have a value of "addFileService"
+
+=head3 as
+
+Defaults to 'json', but if specified as 'xml' then the return result will be:
+
+
+ 2008-10-13 20:08:18
+ 2008-10-13 20:08:18
+ http://dev.localhost.localdomain/uploads/1k/-B/1k-BTF8m4e6wmXJKRxraIA/thumb-jt_25.jpg
+ JT
+ http://dev.localhost.localdomain/cool-gallery/the-cool-album3/jt14
+
+
+=head3 title
+
+The title of the album you wish to create.
+
+=head3 synopsis
+
+A brief description of the album you wish to create.
+
+=cut
+
+sub www_addFileService {
+ my $self = shift;
+ my $session = $self->session;
+
+ return $session->privilege->insufficient unless ($self->canAddFile);
+ my $form = $session->form;
+
+
+ my $file = $self->addChild({
+ className => "WebGUI::Asset::File::GalleryFile::Photo",
+ title => $form->get('title','text'),
+ synopsis => $form->get('description','textarea'),
+ });
+
+ my $storage = $file->getStorageLocation;
+ my $filename = $storage->addFileFromFormPost('file');
+ $file->setFile;
+# my $storageId = $form->get('file','File');
+# my $filePath = $storage->getPath( $storage->getFiles->[0] );
+ # $self->setFile( $filePath );
+ # $storage->delete;
+ $session->log->warn('XX:'. $filename);
+
+ $file->requestAutoCommit;
+
+ my $siteUrl = $session->url->getSiteURL;
+ my $date = $session->datetime;
+ my $as = $form->get('as') || 'json';
+
+ my $document = {
+ title => $file->getTitle,
+ url => $siteUrl.$file->getUrl,
+ thumbnailUrl => $siteUrl.$file->getThumbnailUrl,
+ dateCreated => $date->epochToHuman($file->get('creationDate'), '%y-%m-%d %j:%n:%s'),
+ lastUpdated => $date->epochToHuman($file->get('revisionDate'), '%y-%m-%d %j:%n:%s'),
+ };
+ if ($as eq "xml") {
+ $session->http->setMimeType('text/xml');
+ return XML::Simple::XMLout($document, NoAttr => 1);
+ }
+
+ $session->http->setMimeType('text/json');
+ return JSON->new->pretty->encode($document);
+}
+
#-----------------------------------------------------------------------------
=head2 www_delete ( )