From ec3bc19d776525d1d7d96fab6c15a8a28e98b5bb Mon Sep 17 00:00:00 2001 From: Doug Bell Date: Fri, 25 Jan 2008 22:34:37 +0000 Subject: [PATCH] Added i18n for Gallery (Search) template Fix: Album description showing up in Photos when photo has no synopsis fix: Photo now shows correct confirmation screen fix: Photo now gets auto-committed according to Gallery approval workflow fix: Formatting problems in Album view fix: Photo and Album assets now retain their Owner after other users edit them. fix: Gallery::Utility migration now retains createdBy, creationDate, and ownerUserId. Testing Gallery::Utility a bit more thoroughly. fix: Photo EXIF data now gets cached correctly and sanitized for references (since JSON won't store them and they're of no use to us anyway). --- docs/changelog/7.x.x.txt | 10 +++ .../root_import_gallery-templates.wgpkg | Bin 0 -> 110080 bytes lib/WebGUI/Asset/File.pm | 4 +- lib/WebGUI/Asset/File/Image/Photo.pm | 64 ++++++++++++---- lib/WebGUI/Asset/Wobject/Gallery.pm | 15 ++-- lib/WebGUI/Asset/Wobject/Gallery/Utility.pm | 14 +++- lib/WebGUI/Asset/Wobject/GalleryAlbum.pm | 14 ++-- lib/WebGUI/i18n/English/Asset_Gallery.pm | 55 ++++++++++++++ t/Asset/File/Image/Photo/exif.t | 11 ++- t/Asset/Wobject/Gallery/Utility/addAlbum.t | 71 ++++++++++++++---- 10 files changed, 207 insertions(+), 51 deletions(-) create mode 100644 docs/upgrades/packages-7.5.1/root_import_gallery-templates.wgpkg diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index b5a408908..6de3cc697 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -14,6 +14,16 @@ - Updated to work with the new JSON 2.04 module. See gotcha.txt for details. - removed old CS based photo gallery prototype in favor of the new gallery asset + - Added i18n for Gallery (Search) template + - fix: Album description showing up in Photos when photo has no synopsis + - fix: Photo now shows correct confirmation screen + - fix: Photo now gets auto-committed according to Gallery approval workflow + - fix: Formatting problems in Album view + - fix: Photo and Album assets now retain their Owner after other users edit them. + - fix: Gallery::Utility migration now retains createdBy, creationDate, and ownerUserId. + - Testing Gallery::Utility a bit more thoroughly. + - fix: Photo EXIF data now gets cached correctly and sanitized for + references (since JSON won't store them and they're of no use to us anyway). 7.5.0 - rfe: Search Asset returns URLs diff --git a/docs/upgrades/packages-7.5.1/root_import_gallery-templates.wgpkg b/docs/upgrades/packages-7.5.1/root_import_gallery-templates.wgpkg new file mode 100644 index 0000000000000000000000000000000000000000..983d614b44d2a3e6664be236028ae051576af642 GIT binary patch literal 110080 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 WxZ>=%3K15SjZ{*gk^=uJ3j7}igREWv literal 0 HcmV?d00001 diff --git a/lib/WebGUI/Asset/File.pm b/lib/WebGUI/Asset/File.pm index 2442a31f4..7a561e3d6 100644 --- a/lib/WebGUI/Asset/File.pm +++ b/lib/WebGUI/Asset/File.pm @@ -326,8 +326,8 @@ sub processPropertiesFromFormPost { my $self = shift; my $session = $self->session; - my $errors = $self->SUPER::processPropertiesFromFormPost; - return $errors if $errors; + my $errors = $self->SUPER::processPropertiesFromFormPost || []; + return $errors if @$errors; if (my $storageId = $session->form->get('newFile','File')) { $session->errorHandler->info("Got a new file for asset " . $self->getId); diff --git a/lib/WebGUI/Asset/File/Image/Photo.pm b/lib/WebGUI/Asset/File/Image/Photo.pm index 1803cf858..fcb17a4d3 100644 --- a/lib/WebGUI/Asset/File/Image/Photo.pm +++ b/lib/WebGUI/Asset/File/Image/Photo.pm @@ -370,6 +370,21 @@ sub getDownloadFileUrl { #---------------------------------------------------------------------------- +=head2 getExifData ( ) + +Gets a hash reference of Exif data about this Photo. + +=cut + +sub getExifData { + my $self = shift; + + return unless $self->get('exifData'); + return from_json( $self->get('exifData') ); +} + +#---------------------------------------------------------------------------- + =head2 getGallery ( ) Gets the Gallery asset this Photo is a member of. @@ -413,12 +428,20 @@ sub getTemplateVars { my $session = $self->session; my $var = $self->get; my $owner = WebGUI::User->new( $session, $self->get("ownerUserId") ); + + # Fix 'undef' vars since HTML::Template does inheritence on them + for my $key ( qw( synopsis ) ) { + unless ( defined $var->{$key} ) { + $var->{ $key } = ''; + } + } $var->{ canComment } = $self->canComment; $var->{ canEdit } = $self->canEdit; $var->{ numberOfComments } = scalar @{ $self->getCommentIds }; $var->{ ownerUsername } = $owner->username; $var->{ url } = $self->getUrl; + $var->{ url_addArchive } = $self->getParent->getUrl('func=addArchive'), $var->{ url_delete } = $self->getUrl('func=delete'); $var->{ url_demote } = $self->getUrl('func=demote'); $var->{ url_edit } = $self->getUrl('func=edit'); @@ -439,8 +462,7 @@ sub getTemplateVars { } ### Format exif vars - my $exif = from_json( delete $var->{exifData} ); - $exif = ImageInfo( $self->getStorageLocation->getPath( $self->get("filename") ) ); + my $exif = $self->getExifData; for my $tag ( keys %$exif ) { # Hash of exif_tag => value $var->{ "exif_" . $tag } = $exif->{$tag}; @@ -593,13 +615,6 @@ sub processPropertiesFromFormPost { return $errors if @$errors; ### Passes all checks - # Fix if adding a new photo - if ( $form->get("assetId") eq "new" ) { - $self->update({ - ownerUserId => $self->session->user->userId, - }); - } - $self->requestAutoCommit; } @@ -677,8 +692,17 @@ sub updateExifDataFromFile { my $self = shift; my $storage = $self->getStorageLocation; - return undef; - my $info = ImageInfo( $storage->getPath( $self->get('filename') ) ); + my $exifTool = Image::ExifTool->new; + $exifTool->Options( PrintConv => 1 ); + my $info = $exifTool->ImageInfo( $storage->getPath( $self->get('filename') ) ); + + # Sanitize Exif data by removing keys with references as values + for my $key ( keys %$info ) { + if ( ref $info->{$key} ) { + delete $info->{$key}; + } + } + $self->update({ exifData => to_json( $info ), }); @@ -860,22 +884,30 @@ sub www_edit { return $self->session->privilege->locked unless $self->canEditIfLocked; # Prepare the template variables - my $var = { - url_addArchive => $self->getParent->getUrl('func=addArchive'), - }; + my $var = $self->getTemplateVars; # Generate the form if ($form->get("func") eq "add") { $var->{ form_start } = WebGUI::Form::formHeader( $session, { action => $self->getParent->getUrl('func=editSave;assetId=new;class='.__PACKAGE__), - }); + }) + . WebGUI::Form::hidden( $session, { + name => 'ownerUserId', + value => $session->user->userId, + }) + ; } else { $var->{ form_start } = WebGUI::Form::formHeader( $session, { action => $self->getUrl('func=editSave'), - }); + }) + . WebGUI::Form::hidden( $session, { + name => 'ownerUserId', + value => $self->get('ownerUserId'), + }) + ; } $var->{ form_start } .= WebGUI::Form::hidden( $session, { diff --git a/lib/WebGUI/Asset/Wobject/Gallery.pm b/lib/WebGUI/Asset/Wobject/Gallery.pm index ea85fd088..2503964e8 100644 --- a/lib/WebGUI/Asset/Wobject/Gallery.pm +++ b/lib/WebGUI/Asset/Wobject/Gallery.pm @@ -364,7 +364,7 @@ sub appendTemplateVarsSearchForm { $var->{ searchForm_className } = WebGUI::Form::radioList( $session, { name => "className", - value => $form->get("className"), + value => ( $form->get("className") || '' ), options => \%searchClassOptions, }); @@ -513,7 +513,6 @@ sub getAlbumIds { my $options = shift; my $orderBy = $options->{ orderBy } || "lineage ASC"; - $self->session->errorHandler->warn("ORDER BY: $orderBy"); my $assets = $self->getLineage(['descendants'], { @@ -914,11 +913,13 @@ sub www_search { . $db->quote( '%' . $form->get("description") . '%' ) ; } + + my $joinClass = [ + 'WebGUI::Asset::Wobject::GalleryAlbum', + 'WebGUI::Asset::File::Image::Photo', + ]; if ( $form->get("className") ) { - $where .= q{ AND asset.className IN ('} - . $db->quoteAndJoin( [$form->get('className','checkList')] ) - . q{)} - ; + $joinClass = [ $form->get('className') ]; } # Build a URL for the pagination @@ -939,7 +940,7 @@ sub www_search { url => $url, keywords => $keywords, where => $where, - joinClass => ['WebGUI::Asset::Wobject::GalleryAlbum', 'WebGUI::Asset::File::Image::Photo'], + joinClass => $joinClass, } ); $var->{ keywords } = $keywords; diff --git a/lib/WebGUI/Asset/Wobject/Gallery/Utility.pm b/lib/WebGUI/Asset/Wobject/Gallery/Utility.pm index 979ed9699..845871495 100644 --- a/lib/WebGUI/Asset/Wobject/Gallery/Utility.pm +++ b/lib/WebGUI/Asset/Wobject/Gallery/Utility.pm @@ -157,6 +157,8 @@ sub addAlbumFromThread { 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'), @@ -180,12 +182,18 @@ sub addAlbumFromThread { next; } + # Get rid of that file extention + my ($title) = $filename =~ m{(.*)\.[^.]*$}; + my $file = $album->addChild({ className => $className, - menuTitle => $filename, + createdBy => $post->get('createdBy'), + creationDate => $post->get('creationDate'), + menuTitle => $title, ownerUserId => $post->get('ownerUserId'), - title => $filename, - url => $session->url->urlize( $album->get('url') . "/" . $filename ), + synopsis => $post->get('content'), + title => $title, + url => $session->url->urlize( $album->get('url') . "/" . $title ), userDefined1 => $post->get('userDefined1'), userDefined2 => $post->get('userDefined2'), userDefined3 => $post->get('userDefined3'), diff --git a/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm b/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm index 789cc4b75..ec664e7ac 100644 --- a/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm +++ b/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm @@ -494,12 +494,6 @@ sub processPropertiesFromFormPost { return $errors if @$errors; ### Passes all checks - # Fix if adding a new GalleryAlbum - if ( $form->get('assetId') eq "new" ) { - $self->update({ - ownerUserId => $self->session->user->userId, - }); - } $self->requestAutoCommit; } @@ -753,12 +747,20 @@ sub www_edit { $var->{ form_start } = WebGUI::Form::formHeader( $session, { action => $self->getParent->getUrl('func=editSave;assetId=new;class='.__PACKAGE__), + }) + . WebGUI::Form::hidden( $session, { + name => "ownerUserId", + value => $session->user->userId, }); } else { $var->{ form_start } = WebGUI::Form::formHeader( $session, { action => $self->getUrl('func=editSave'), + }) + . WebGUI::Form::hidden( $session, { + name => "ownerUserId", + value => $self->get("ownerUserId"), }); } $var->{ form_start } diff --git a/lib/WebGUI/i18n/English/Asset_Gallery.pm b/lib/WebGUI/i18n/English/Asset_Gallery.pm index 7ad690e72..9fe2e6a4d 100644 --- a/lib/WebGUI/i18n/English/Asset_Gallery.pm +++ b/lib/WebGUI/i18n/English/Asset_Gallery.pm @@ -562,6 +562,61 @@ our $I18N = { lastUpdated => 0, }, + 'template search title' => { + message => "Advanced Search", + lastUpdated => 0, + context => "Title for the www_search page. Used to show the Advanced search form", + }, + + 'template search field title' => { + message => "Title", + lastUpdated => 0, + context => "Label for the 'Title' input for the search form", + }, + + 'template search field description' => { + message => "Description", + lastUpdated => 0, + context => "Label for the 'Description' input for the search form", + }, + + 'template search field keywords' => { + message => "Tags", + lastUpdated => 0, + context => "Label for the 'Keywords' input for the search form. 'Tags' is used because Keywords may be confused with the generic, all-inclusive search box.", + }, + + 'template search field className' => { + message => "Search Type", + lastUpdated => 0, + context => "Label for the 'className' input for the search form. 'Type' is used because 'Class' has no meaning to a normal user.", + }, + + 'template search field creationDate' => { + message => "Date", + lastUpdated => 0, + context => "Label for the 'creation date' input for the search form", + }, + + 'template search to' => { + message => "to", + lastUpdated => 0, + context => "Joins the 'before' and 'after' parts of the Creation Date inputs.", + }, + + 'template search results for' => { + message => "Results for", + lastUpdated => 0, + context => "Title for the results section. 'for' leads into the string that was searched for.", + }, + + 'template by' => { + message => "By", + lastUpdated => 0, + context => "Lead-in for the user the album or photo was uploaded by", + }, + + }; 1; diff --git a/t/Asset/File/Image/Photo/exif.t b/t/Asset/File/Image/Photo/exif.t index f63c49cbd..0d680dd1e 100644 --- a/t/Asset/File/Image/Photo/exif.t +++ b/t/Asset/File/Image/Photo/exif.t @@ -48,6 +48,13 @@ my $photo ); $versionTag->commit; my $exif = ImageInfo( WebGUI::Test->getTestCollateralPath("lamp.jpg") ); +# Sanitize Exif data by removing keys with references as values +for my $key ( keys %$exif ) { + if ( ref $exif->{$key} ) { + delete $exif->{$key}; + } +} + $photo->setFile( WebGUI::Test->getTestCollateralPath("lamp.jpg") ); #---------------------------------------------------------------------------- @@ -65,8 +72,8 @@ plan tests => 2; my $var = $photo->getTemplateVars; cmp_deeply( - [ keys %$var ], superbagof( map { 'exif_' . $_ } keys %$exif ), - 'getTemplateVars gets a hash of all exif tags', + [ keys %$var ], superbagof( map { unless (ref $exif->{ $_ }) { 'exif_' . $_ } } keys %$exif ), + 'getTemplateVars gets a hash of all valid exif tags', ); is_deeply( diff --git a/t/Asset/Wobject/Gallery/Utility/addAlbum.t b/t/Asset/Wobject/Gallery/Utility/addAlbum.t index a6fe57cce..70a1c751f 100644 --- a/t/Asset/Wobject/Gallery/Utility/addAlbum.t +++ b/t/Asset/Wobject/Gallery/Utility/addAlbum.t @@ -49,11 +49,11 @@ for (0..2) { push @threads, $collab->addChild({ className => 'WebGUI::Asset::Post::Thread', content => "content$_", - menuTitle => "menuTitle$_", + menuTitle => "menuTitle$_", ownerUserId => "3$_", synopsis => "synopsis$_", title => "title$_", - userDefined1 => "userDefined1$_", + userDefined1 => "$_", # This is important. Used to detect which File is from which Thread userDefined2 => "userDefined2$_", userDefined3 => "userDefined3$_", userDefined4 => "userDefined4$_", @@ -69,10 +69,10 @@ my @posts; push @{$posts[0]}, $threads[0]->addChild({ className => 'WebGUI::Asset::Post', content => "content00", - menuTitle => "menuTitle00", + menuTitle => "menuTitle00", synopsis => "synopsis00", title => "title00", - userDefined1 => "userDefined100", + userDefined1 => "00", # This is important. Used to detect which File is from which Post userDefined2 => "userDefined200", userDefined3 => "userDefined300", userDefined4 => "userDefined400", @@ -85,6 +85,8 @@ $posts[0][0]->getStorageLocation->addFileFromFilesystem( # Thread fields mapped to album fields that should be migrated my %threadFields = ( content => "description", + createdBy => 'createdBy', + creationDate => 'creationDate', menuTitle => "menuTitle", ownerUserId => "ownerUserId", synopsis => "synopsis", @@ -96,6 +98,19 @@ my %threadFields = ( userDefined5 => "userDefined5", ); +# Post fields mapped to photo fields that should be migrated +my %postFields = ( + content => "synopsis", + createdBy => 'createdBy', + creationDate => 'creationDate', + ownerUserId => "ownerUserId", + userDefined1 => "userDefined1", + userDefined2 => "userDefined2", + userDefined3 => "userDefined3", + userDefined4 => "userDefined4", + userDefined5 => "userDefined5", +); + #---------------------------------------------------------------------------- # Tests @@ -105,7 +120,15 @@ my $threadPostTests = 6 * ( 1 + scalar @{ $posts[0] } ); # addAlbumFromThread adds 1 test for each field in %threadFields my $threadFieldTests = 1 * scalar keys %threadFields; -plan tests => 9 + $threadPostTests + $threadFieldTests; +# 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 @@ -158,19 +181,28 @@ is( "addAlbumFromThread adds one file for each attachment to the thread or posts of the thread", ); -# 6 tests for each post/file -# TODO: Test that post-to-file fields are migrated properly, but how? +# 6 tests for each post/file + postFields tests my $albumUrl = $album->get('url'); for my $fileId ( @{$album->getFileIds} ) { my $file = WebGUI::Asset->newByDynamicClass( $session, $fileId ); - is( - $file->get('revisionDate'), $threads[0]->get('revisionDate'), - "addAlbumFromThread adds files with same revisionDate as thread", - ); - is( - $file->get('ownerUserId'), $threads[0]->get('ownerUserId'), - "addAlbumFromThread adds files with same ownerUserId as thread", - ); + + # Find which Thread or Post this file corresponds to + my $post; + if ( length $file->get('userDefined1') == 1 ) { + # Is a thread, get it + $post = $threads[ $file->get('userDefined1') ]; + } + else { + my @index = split //, $file->get('userDefined1'); + $post = $posts[ $index[0] ][ $index[1] ]; + } + + for my $oldField ( sort keys %postFields ) { + is ( $file->get( $postFields{ $oldField } ), $post->get( $oldField ), + "addAlbumFromThread migrates Post $oldField to File $postFields{$oldField}", + ); + } + like( $file->get('url'), qr/^$albumUrl/, "addAlbumFromThread add files with urls that begin with GalleryAlbum url", @@ -181,8 +213,17 @@ for my $fileId ( @{$album->getFileIds} ) { $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' });