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 ( )