From 3ea94204798f8afdc722b8c74bc6105dbd5d903b Mon Sep 17 00:00:00 2001 From: Doug Bell Date: Thu, 27 Mar 2008 00:24:00 +0000 Subject: [PATCH] fix: Fixed permission issues with Gallery comments Gallery now checks to see if it's committed before allowing Albums to be added Slideshow and thumbnails work better Much, much more --- docs/changelog/7.x.x.txt | 3 + .../root_import_gallery-templates.wgpkg | Bin 31730 -> 26135 bytes lib/WebGUI/Asset/File/GalleryFile.pm | 93 ++++++------ lib/WebGUI/Asset/File/GalleryFile/Photo.pm | 49 +++++- lib/WebGUI/Asset/Wobject/Calendar.pm | 7 +- lib/WebGUI/Asset/Wobject/Gallery.pm | 29 ++++ lib/WebGUI/Asset/Wobject/GalleryAlbum.pm | 141 ++++++++++++++++-- lib/WebGUI/Help/Asset_Photo.pm | 16 ++ lib/WebGUI/Utility/Gallery.pm | 9 +- lib/WebGUI/i18n/English/Asset_Gallery.pm | 6 + lib/WebGUI/i18n/English/Asset_Photo.pm | 24 +++ t/Asset/File/GalleryFile/Photo/comment.t | 2 +- t/Asset/File/GalleryFile/Photo/view.t | 5 + t/Utility/Gallery/addAlbum.t | 24 ++- 14 files changed, 332 insertions(+), 76 deletions(-) diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index 8bd971c21..98b87a300 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -23,6 +23,9 @@ - fixed: Syndicated Content picks wrong entries for interleaving - fixed: Syndicated Content URLs using macros not updated by caching workflow - fixed: Syndicated Content asset tries too hard to get URLs returning errors + - fix: Users now have permission to add comments + - fix: Username for comment poster is now shown correctly + - fix: Slideshow now works 7.5.7 - fixed: HttpProxy mixes original site's content encoding with WebGUI's diff --git a/docs/upgrades/packages-7.5.8/root_import_gallery-templates.wgpkg b/docs/upgrades/packages-7.5.8/root_import_gallery-templates.wgpkg index 183b4117a03565cecd7abf20692002a99c139966..a8f996d0c8b7b46679070f4a6a52756772c88a86 100644 GIT binary patch literal 26135 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

exi;+kZ~<+nwx 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 H*N*=I-m9dk literal 31730 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 Z0soHW?+pB%f&ZTw_#c%Gx>Nuv0stJ}47&gT diff --git a/lib/WebGUI/Asset/File/GalleryFile.pm b/lib/WebGUI/Asset/File/GalleryFile.pm index 05ed57cce..9beb67796 100644 --- a/lib/WebGUI/Asset/File/GalleryFile.pm +++ b/lib/WebGUI/Asset/File/GalleryFile.pm @@ -18,6 +18,8 @@ use strict; use base 'WebGUI::Asset::File'; use Carp qw( croak confess ); +use URI::Escape; +use WebGUI::HTML; @@ -390,6 +392,9 @@ sub getTemplateVars { # Add the search form $self->getGallery->appendTemplateVarsSearchForm( $var ); + # Add a text-only synopsis + $var->{ synopsis_textonly } = WebGUI::HTML::filter( $self->get('synopsis'), "all" ); + $var->{ canComment } = $self->canComment; $var->{ canEdit } = $self->canEdit; $var->{ numberOfComments } = scalar @{ $self->getCommentIds }; @@ -400,6 +405,9 @@ sub getTemplateVars { $var->{ url_demote } = $self->getUrl('func=demote'); $var->{ url_edit } = $self->getUrl('func=edit'); $var->{ url_gallery } = $self->getGallery->getUrl; + $var->{ url_album } = $self->getParent->getUrl; + $var->{ url_thumbnails } = $self->getParent->getUrl('func=thumbnails'); + $var->{ url_slideshow } = $self->getParent->getUrl('func=slideshow'); $var->{ url_makeShortcut } = $self->getUrl('func=makeShortcut'); $var->{ url_listFilesForOwner } = $self->getGallery->getUrl('func=listFilesForUser;userId=' . $self->get("ownerUserId")); @@ -559,6 +567,8 @@ sub processPropertiesFromFormPost { ### Passes all checks $self->requestAutoCommit; + + return; } #---------------------------------------------------------------------------- @@ -756,25 +766,6 @@ sub www_deleteConfirm { #---------------------------------------------------------------------------- -=head2 www_demote - -Override the default demote page to send the user back to the GalleryAlbum -edit screen. - -=cut - -sub www_demote { - my $self = shift; - - return $self->session->privilege->insufficient unless $self->canEdit; - - $self->demote; - - return $self->session->asset( $self->getParent )->www_edit; -} - -#---------------------------------------------------------------------------- - =head2 www_editComment ( params ) Form to edit a comment. C is a hash reference of parameters @@ -788,8 +779,27 @@ sub www_editComment { my $self = shift; my $params = shift; my $session = $self->session; + + # Get the comment, if needed + my $commentId = $session->form->get( "commentId" ); + my $comment = $commentId ne "new" + ? $self->getComment( $commentId ) + : {} + ; - return $session->privilege->insufficient unless $self->canEdit; + # Check permissions + # Adding a new comment + if ( $commentId eq "new" ) { + return $session->privilege->insufficient unless $self->canComment; + } + # Editing your own comment + elsif ( $comment->{ userId } ne "1" && $comment->{ userId } eq $self->session->user->userId ) { + return $session->privilege->insufficient unless $self->canComment; + } + # Editing someone else's comment + else { + return $session->privilege->insufficient unless $self->canEdit; + } my $var = $self->getTemplateVars; @@ -797,11 +807,6 @@ sub www_editComment { $var->{ errors } = [ map { { "error" => $_ } } @{ $params->{errors} } ]; } - my $commentId = $session->form->get( "commentId" ); - my $comment = $commentId ne "new" - ? $self->getComment( $commentId ) - : {} - ; $self->appendTemplateVarsCommentForm( $var, $comment ); $var->{ isNew } = $commentId eq "new"; @@ -822,19 +827,30 @@ Save a comment being edited sub www_editCommentSave { my $self = shift; my $session = $self->session; - - return $session->privilege->insufficient unless $self->canEdit; - my $i18n = __PACKAGE__->i18n( $session ); + # Process the form first, so we can know how to check permissions my $comment = eval { $self->processCommentEditForm }; if ( $@ ) { return $self->www_editComment( { errors => [ $@ ] } ); } + # Check permissions + # Adding a new comment + if ( $comment->{ commentId } eq "new" ) { + return $session->privilege->insufficient unless $self->canComment; + } + # Editing your own comment + elsif ( $comment->{ userId } ne "1" && $comment->{ userId } eq $self->session->user->userId ) { + return $session->privilege->insufficient unless $self->canComment; + } + # Editing someone else's comment + else { + return $session->privilege->insufficient unless $self->canEdit; + } + # setComment changes commentId, so keep track if we're adding a new comment my $isNew = $comment->{commentId} eq "new"; - $self->setComment( $comment ); # Return different message for adding and editing @@ -920,25 +936,6 @@ sub www_makeShortcutSave { #---------------------------------------------------------------------------- -=head2 www_promote - -Override the default promote page to send the user back to the GalleryAlbum -edit screen. - -=cut - -sub www_promote { - my $self = shift; - - return $self->session->privilege->insufficient unless $self->canEdit; - - $self->promote; - - return $self->session->asset( $self->getParent )->www_edit; -} - -#---------------------------------------------------------------------------- - =head2 www_view ( ) Shows the output of L inside of the style provided by the gallery this diff --git a/lib/WebGUI/Asset/File/GalleryFile/Photo.pm b/lib/WebGUI/Asset/File/GalleryFile/Photo.pm index f3af924b6..ac4325380 100644 --- a/lib/WebGUI/Asset/File/GalleryFile/Photo.pm +++ b/lib/WebGUI/Asset/File/GalleryFile/Photo.pm @@ -316,6 +316,46 @@ sub makeResolutions { #---------------------------------------------------------------------------- +=head2 processPropertiesFromFormPost ( ) + +Process the asset edit form. + +Make the default title into the file name minus the extention. + +=cut + +sub processPropertiesFromFormPost { + my $self = shift; + my $form = $self->session->form; + my $errors = $self->SUPER::processPropertiesFromFormPost || []; + + # Return if errors + return $errors if @$errors; + + ### Passes all checks + # If no title was given, make it the file name + if ( !$form->get('title') ) { + my $title = $self->get('filename'); + $title =~ s/\.[^.]*$//; + $title =~ tr/-/ /; # De-mangle the spaces at the expense of the dashes + $self->update( { + title => $title, + menuTitle => $title, + } ); + + # If this is a new Photo, change some other things too + if ( $form->get('assetId') eq "new" ) { + $self->update( { + url => $self->session->url->urlize( join "/", $self->getParent->get('url'), $title ), + } ); + } + } + + return undef; +} + +#---------------------------------------------------------------------------- + =head2 setFile ( filename ) Extend the superclass setFile to automatically generate thumbnails. @@ -351,6 +391,11 @@ sub updateExifDataFromFile { } } + # Remove other, pointless keys + for my $key ( qw( directory ) ) { + delete $info->{ $key }; + } + $self->update({ exifData => to_json( $info ), }); @@ -410,7 +455,7 @@ sub www_edit { url_addArchive => $self->getParent->getUrl('func=addArchive'), }; - if ( $form->get('assetId') eq "new" ) { + if ( $form->get('func') eq "add" ) { $var->{ isNewPhoto } = 1; } @@ -461,7 +506,7 @@ sub www_edit { = WebGUI::Form::HTMLArea( $session, { name => "synopsis", value => ( $form->get("synopsis") || $self->get("synopsis") ), - richEditId => $self->getGallery->get("assetIdRichEditFile"), + richEditId => $self->getGallery->get("richEditIdFile"), }); $var->{ form_photo } = $self->getEditFormUploadControl; diff --git a/lib/WebGUI/Asset/Wobject/Calendar.pm b/lib/WebGUI/Asset/Wobject/Calendar.pm index 957e33da9..cfa999cff 100644 --- a/lib/WebGUI/Asset/Wobject/Calendar.pm +++ b/lib/WebGUI/Asset/Wobject/Calendar.pm @@ -1088,12 +1088,7 @@ sub view { $var->{"urlMonth"} = $self->getUrl("type=month;start=".$params->{start}); $var->{"urlSearch"} = $self->getSearchUrl; $var->{"urlPrint"} = $self->getUrl("type=".$params->{type}.";start=".$params->{start}.";print=1"); - $var->{"urlIcal"} = $self->getUrl( - sprintf "func=ical;type=%s;start=%s", - $params->{type}, - $params->{start}, - ); - + $var->{"urlIcal"} = $self->getUrl("func=ical"); $var->{"extrasUrl"} = $self->session->url->extras(); $var->{ paramStart } = $params->{ start }; diff --git a/lib/WebGUI/Asset/Wobject/Gallery.pm b/lib/WebGUI/Asset/Wobject/Gallery.pm index 7207fbb66..339576e3c 100644 --- a/lib/WebGUI/Asset/Wobject/Gallery.pm +++ b/lib/WebGUI/Asset/Wobject/Gallery.pm @@ -867,6 +867,35 @@ sub view_listAlbums { #---------------------------------------------------------------------------- +=head2 www_add ( ) + +Add a GalleryAlbum to this Gallery. Overridden here to show an error message +if the Gallery is not committed. + +If a GalleryAlbum is added to an uncommitted Gallery, and the GalleryAlbum +is committed before the Gallery, problems start happening. + +TODO: This could be handled better by the requestAutoCommit subroutine +instead of having to block things from being added. + +=cut + +sub www_add { + my $self = shift; + + if ( $self->getRevisionCount <= 1 && $self->get('status') eq "pending" ) { + my $i18n = WebGUI::International->new($self->session, 'Asset_Gallery'); + return $self->processStyle( + $i18n->get("error add uncommitted") + ); + } + else { + return $self->SUPER::www_add( @_ ); + } +} + +#---------------------------------------------------------------------------- + =head2 www_listAlbums ( ) Show a paginated list of the albums in this gallery. diff --git a/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm b/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm index 591e40067..c87187b8e 100644 --- a/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm +++ b/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm @@ -497,6 +497,49 @@ sub prepareView { #---------------------------------------------------------------------------- +=head2 processFileSynopsis ( ) + +Process the synopsis for the files on the GalleryAlbum C page. + +=cut + +sub processFileSynopsis { + my $self = shift; + my $session = $self->session; + my $form = $self->session->form; + + # Do the version tag shuffle + my $oldVersionTag = WebGUI::VersionTag->getWorking( $session, "nocreate" ); + my $newVersionTag + = WebGUI::VersionTag->create( $session, { + workflowId => $self->getParent->get("workflowIdCommit"), + } ); + $newVersionTag->setWorking; + + for my $key ( grep { /^fileSynopsis_/ } $form->param ) { + ( my $assetId ) = $key =~ /^fileSynopsis_(.+)$/; + my $synopsis = $form->get( $key ); + + my $asset = WebGUI::Asset->newByDynamicClass( $session, $assetId ); + if ( $asset->get("synopsis") ne $synopsis ) { + my $properties = $asset->get; + $properties->{ synopsis } = $synopsis; + + $asset->addRevision( $properties, undef, { skipAutoCommitWorkflows => 1 } ); + } + } + + # That's what it's all about + $newVersionTag->commit; + if ( $oldVersionTag ) { + WebGUI::VersionTag->setWorking( $oldVersionTag ); + } + + return; +} + +#---------------------------------------------------------------------------- + =head2 processStyle ( ) Gets the parent Gallery's style template @@ -568,7 +611,7 @@ sub view_slideshow { my $var = $self->getTemplateVars; $self->appendTemplateVarsFileLoop( $var, $self->getFileIds ); - + return $self->processTemplate($var, $self->getParent->get("templateIdViewSlideshow")); } @@ -765,6 +808,10 @@ sub www_deleteConfirm { Show the form to add / edit a GalleryAlbum asset. +Due to the advanced requirements of this form, we will ALWAYS post back to +this page. This page will decide whether or not to make C +handle things. + =cut sub www_edit { @@ -774,8 +821,44 @@ sub www_edit { my $var = $self->getTemplateVars; my $i18n = __PACKAGE__->i18n($session); + return $session->privilege->insufficient unless $self->canEdit; + + # Handle the button that was pressed + # Save button + if ( $form->get("save") ) { + $self->processFileSynopsis; + return $self->www_editSave; + } + # Cancel button + elsif ( $form->get("cancel") ) { + return $self->www_view; + } + # Promote the file + elsif ( $form->get("promote") ) { + my $assetId = $form->get("promote"); + my $asset = WebGUI::Asset->newByDynamicClass( $session, $assetId ); + if ( $asset ) { + $asset->promote; + } + else { + $session->errorHandler->error("Couldn't promote asset '$assetId' because we couldn't instantiate it."); + } + } + # Demote the file + elsif ( $form->get("demote") ) { + my $assetId = $form->get("demote"); + my $asset = WebGUI::Asset->newByDynamicClass( $session, $assetId ); + if ( $asset ) { + $asset->demote; + } + else { + $session->errorHandler->error("Couldn't demote asset '$assetId' because we couldn't instantiate it."); + } + } + # Generate the form if ($form->get("func") eq "add") { + # Add page is exempt from our button handling code since it calls the Gallery www_editSave $var->{ isNewAlbum } = 1; $var->{ form_start } = WebGUI::Form::formHeader( $session, { @@ -785,16 +868,31 @@ sub www_edit { name => "ownerUserId", value => $session->user->userId, }); + + # Put in the buttons that may ignore button handling code + $var->{ form_cancel } + = WebGUI::Form::button( $session, { + name => "cancel", + value => $i18n->get("cancel"), + extras => 'onclick="history.go(-1)"', + }); } else { $var->{ form_start } = WebGUI::Form::formHeader( $session, { - action => $self->getUrl('func=editSave'), + action => $self->getUrl('func=edit'), }) . WebGUI::Form::hidden( $session, { name => "ownerUserId", value => $self->get("ownerUserId"), }); + + # Put in the buttons that may ignore button handling code + $var->{ form_cancel } + = WebGUI::Form::submit( $session, { + name => "cancel", + value => $i18n->get("cancel"), + }); } $var->{ form_start } .= WebGUI::Form::hidden( $session, { @@ -805,13 +903,6 @@ sub www_edit { $var->{ form_end } = WebGUI::Form::formFooter( $session ); - $var->{ form_cancel } - = WebGUI::Form::button( $session, { - name => "cancel", - value => $i18n->get("cancel"), - extras => 'onclick="history.go(-1)"', - }); - $var->{ form_submit } = WebGUI::Form::submit( $session, { name => "save", @@ -828,15 +919,39 @@ sub www_edit { = WebGUI::Form::HTMLArea( $session, { name => "description", value => $form->get("description") || $self->get("description"), + richEditId => $self->getParent->get("richEditIdAlbum"), }); # Generate the file loop - my $thumbnailUrl = $self->getThumbnailUrl; + my $assetIdThumbnail = $form->get("assetIdThumbnail") || $self->get("assetIdThumbnail"); $self->appendTemplateVarsFileLoop( $var, $self->getFileIds ); for my $file ( @{ $var->{file_loop} } ) { - if ( $thumbnailUrl eq $file->{thumbnailUrl} ) { - $file->{ isAlbumThumbnail } = 1; - } + $file->{ form_assetIdThumbnail } + = WebGUI::Form::radio( $session, { + name => "assetIdThumbnail", + value => $file->{ assetId }, + checked => ( $assetIdThumbnail eq $file->{ assetId } ), + id => "assetIdThumbnail_$file->{ assetId }", + } ); + + # Raw HTML here to provide proper value for the image + $file->{ form_promote } + = qq{} + ; + + $file->{ form_demote } + = qq{} + ; + + $file->{ form_synopsis } + = WebGUI::Form::text( $session, { + name => "fileSynopsis_$file->{assetId}", + value => $form->get( "fileSynopsis_$file->{assetId}" ) || $file->{ synopsis }, + }); } return $self->processStyle( diff --git a/lib/WebGUI/Help/Asset_Photo.pm b/lib/WebGUI/Help/Asset_Photo.pm index 391891e72..abd798a9f 100644 --- a/lib/WebGUI/Help/Asset_Photo.pm +++ b/lib/WebGUI/Help/Asset_Photo.pm @@ -118,6 +118,22 @@ our $HELP = { }, ], }, + { + name => 'synopsis_text', + description => 'helpvar synopsis_text', + }, + { + name => 'url_album', + description => 'helpvar url_album', + }, + { + name => 'url_thumbnails', + description => 'helpvar url_thumbnails', + }, + { + name => 'url_slideshow', + description => 'helpvar url_slideshow', + }, ], }, diff --git a/lib/WebGUI/Utility/Gallery.pm b/lib/WebGUI/Utility/Gallery.pm index e9514d7f2..365553fea 100644 --- a/lib/WebGUI/Utility/Gallery.pm +++ b/lib/WebGUI/Utility/Gallery.pm @@ -184,6 +184,13 @@ sub addAlbumFromThread { # 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, @@ -191,7 +198,7 @@ sub addAlbumFromThread { creationDate => $post->get('creationDate'), menuTitle => $title, ownerUserId => $post->get('ownerUserId'), - synopsis => $post->get('content'), + synopsis => $synopsis, title => $title, url => $session->url->urlize( $album->get('url') . "/" . $title ), userDefined1 => $post->get('userDefined1'), diff --git a/lib/WebGUI/i18n/English/Asset_Gallery.pm b/lib/WebGUI/i18n/English/Asset_Gallery.pm index c9701d7b4..058f21fba 100644 --- a/lib/WebGUI/i18n/English/Asset_Gallery.pm +++ b/lib/WebGUI/i18n/English/Asset_Gallery.pm @@ -687,6 +687,12 @@ our $I18N = { lastUpdated => 0, context => q{Label for the link to add an Album}, }, + + 'error add uncommitted' => { + message => q{

Error!

You must commit this Gallery before adding albums

}, + lastUpdated => 0, + context => q{Error message when trying to add albums to uncommitted Gallery assets}, + }, }; 1; diff --git a/lib/WebGUI/i18n/English/Asset_Photo.pm b/lib/WebGUI/i18n/English/Asset_Photo.pm index 7d2e92f6e..db2440a1f 100644 --- a/lib/WebGUI/i18n/English/Asset_Photo.pm +++ b/lib/WebGUI/i18n/English/Asset_Photo.pm @@ -565,6 +565,30 @@ our $I18N = { context => q{Label for the albums the photo will be removed from.}, }, + 'helpvar synopsis_text' => { + message => q{The "synopsis" field with all HTML removed}, + lastUpdated => 0, + context => q{Description of template variable}, + }, + + 'helpvar url_album' => { + message => q{The URL of the Album containing this file}, + lastUpdated => 0, + context => q{Description of template variable}, + }, + + 'helpvar url_thumbnails' => { + message => q{The URL to the Thumbnails view of the Album containing this file}, + lastUpdated => 0, + context => q{Description of template variable}, + }, + + 'helpvar url_slideshow' => { + message => q{The URL to the Slideshow view of the Album containing this file}, + lastUpdated => 0, + context => q{Description of template variable}, + }, + }; 1; diff --git a/t/Asset/File/GalleryFile/Photo/comment.t b/t/Asset/File/GalleryFile/Photo/comment.t index 9c66976d3..fad9f265f 100644 --- a/t/Asset/File/GalleryFile/Photo/comment.t +++ b/t/Asset/File/GalleryFile/Photo/comment.t @@ -179,7 +179,7 @@ ok( my $assetId = $photo->getId; $photo->purge; ok( - !$session->db->quickScalar("SELECT commentId FROM Photo_comment WHERE assetId=?",[$assetId]), + !$session->db->quickScalar("SELECT commentId FROM GalleryFile_comment WHERE assetId=?",[$assetId]), "Comments are purged along with asset", ); diff --git a/t/Asset/File/GalleryFile/Photo/view.t b/t/Asset/File/GalleryFile/Photo/view.t index ee646289e..0a7d93380 100644 --- a/t/Asset/File/GalleryFile/Photo/view.t +++ b/t/Asset/File/GalleryFile/Photo/view.t @@ -16,6 +16,7 @@ use lib "$FindBin::Bin/../../../../lib"; use Scalar::Util qw( blessed ); use WebGUI::Test; +use WebGUI::HTML; use WebGUI::Session; use Test::More; use Test::Deep; @@ -68,6 +69,7 @@ my $testTemplateVars = { canComment => bool( 1 ), canEdit => bool( 0 ), ownerUsername => WebGUI::User->new( $session, 3 )->username, + synopsis_textonly => WebGUI::HTML::filter( $photo->get('synopsis'), "all" ), url => $photo->getUrl, url_addArchive => $album->getUrl('func=addArchive'), url_delete => $photo->getUrl('func=delete'), @@ -78,6 +80,9 @@ my $testTemplateVars = { url_listFilesForOwner => $gallery->getUrl('func=listFilesForUser;userId=3'), url_promote => $photo->getUrl('func=promote'), + url_album => $album->getUrl, + url_thumbnails => $album->getUrl('func=thumbnails'), + url_slideshow => $album->getUrl('func=slideshow'), fileUrl => $photo->getFileUrl, thumbnailUrl => $photo->getThumbnailUrl, numberOfComments => scalar @{ $photo->getCommentIds }, diff --git a/t/Utility/Gallery/addAlbum.t b/t/Utility/Gallery/addAlbum.t index 194d520f7..cc199fd79 100644 --- a/t/Utility/Gallery/addAlbum.t +++ b/t/Utility/Gallery/addAlbum.t @@ -99,7 +99,6 @@ my %threadFields = ( # Post fields mapped to photo fields that should be migrated my %postFields = ( - content => "synopsis", createdBy => 'createdBy', creationDate => 'creationDate', ownerUserId => "ownerUserId", @@ -113,8 +112,8 @@ my %postFields = ( #---------------------------------------------------------------------------- # Tests -# addAlbumFromThread adds 6 tests for $thread[0] and @{$posts[0]} -my $threadPostTests = 6 * ( 1 + scalar @{ $posts[0] } ); +# 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; @@ -180,20 +179,22 @@ is( "addAlbumFromThread adds one file for each attachment to the thread or posts of the thread", ); -# 6 tests for each post/file + postFields tests +# 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; + 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 ) { @@ -201,6 +202,19 @@ for my $fileId ( @{$album->getFileIds} ) { "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/,