more work. completed GalleryAlbum. started Gallery.

This commit is contained in:
Doug Bell 2007-11-06 04:13:43 +00:00
parent 2570980fa5
commit 55135c8147
5 changed files with 825 additions and 32 deletions

View file

@ -138,7 +138,7 @@ CREATE TABLE IF NOT EXISTS Gallery (
imageViewSize INT,
imageThumbnailSize INT,
maxSpacePerUser VARCHAR(20),
richEditIdFileComment VARCHAR(22) BINARY,
richEditIdComment VARCHAR(22) BINARY,
templateIdAddArchive VARCHAR(22) BINARY,
templateIdDeleteAlbum VARCHAR(22) BINARY,
templateIdDeleteFile VARCHAR(22) BINARY,

View file

@ -22,6 +22,19 @@ use Image::ExifTool qw( :Public );
use JSON;
use Tie::IxHash;
our $magick;
BEGIN {
if (eval { require Graphics::Magick; 1 }) {
$magick = 'Graphics::Magick';
}
elsif (eval { require Image::Magick; 1 }) {
$magick = 'Image::Magick';
}
else {
croak "You must have either Graphics::Magick or Image::Magick installed to run WebGUI.\n";
}
}
use WebGUI::Friends;
use WebGUI::Utility;
@ -50,12 +63,6 @@ These methods are available from this class:
Define the properties of the Photo asset.
=head3 session
=head3 definition
A hash reference passed in from a subclass definition.
=cut
sub definition {
@ -91,6 +98,7 @@ sub definition {
i18n => 'Asset_Photo',
properties => \%properties,
};
return $class->SUPER::definition($session, $definition);
}
@ -107,7 +115,12 @@ sub appendTemplateVarsForCommentForm {
my $self = shift;
my $var = shift;
# ...
$var->{commentForm_start}
= WebGUI::Form::formHeader( $session );
. WebGUI::Form::hidden( $session, { name => "func", value => "addCommentSave" } )
;
$var->{commentForm_end}
= WebGUI::Form::formFooter( $session );
return $var;
}
@ -142,6 +155,28 @@ sub applyConstraints {
#----------------------------------------------------------------------------
=head2 canComment ( [userId] )
Returns true if the user can comment on this asset. C<userId> is a WebGUI
user ID. If no userId is passed, check the current user.
Users can comment on this Photo if they are allowed to view and the album
allows comments.
=cut
sub canComment {
my $self = shift;
my $userId = shift || $self->session->user->userId;
my $album = $self->getParent;
return 0 if !$self->canView($userId);
return $album->canComment($userId);
}
#----------------------------------------------------------------------------
=head2 canEdit ( [userId] )
Returns true if the user can edit this asset. C<userId> is a WebGUI user ID.
@ -399,10 +434,16 @@ sub makeResolutions {
# Get default if necessary
$resolutions ||= $self->getGallery->getImageResolutions;
my $storage = $self->getStorageLocation;
my $photo = $magick->new;
$photo->Read( $storage->get( $self->get("filename") ) );
for my $res ( @$resolutions ) {
# carp if resolution is bad
# ...
my $newPhoto = $photo->Clone;
$newPhoto->Resize( geometry => $res );
$newPhoto->Write( $storage->getFilePath( "$res.jpg" ) );
}
}
@ -546,7 +587,14 @@ sub view {
$var->{ controls } = $self->getToolbar;
$var->{ fileUrl } = $self->getFileUrl;
$var->{ fileIcon } = $self->getFileIconUrl;
$self->appendTemplateVarsForCommentForm( $var );
my $p = $self->getCommentPaginator;
$var->{ commentLoop } = $p->getPageData;
$var->{ commentLoop_urlNext } = [$p->getNextPageLink]->[0];
$var->{ commentLoop_urlPrev } = [$p->getPrevPageLink]->[0];
$var->{ commentLoop_pageBar } = $p->getBarAdvanced;
return $self->processTemplate($var, undef, $self->{_viewTemplate});
}
@ -561,9 +609,22 @@ Save a new comment to the Photo.
sub www_addCommentSave {
my $self = shift;
return $self->session->privilege->insufficient unless $self->canComment;
my $form = $self->session;
# ...
my $properties = {
assetId => $self->getId,
creationDate => time,
userId => $session->user->userId,
visitorIp => ( $session->user->userId eq "1" ? $session->env("REMOTE_ADDR") : undef ),
bodyText => $form->get("bodyText"),
};
$self->setComment( "new", $properties );
return $self->www_view;
}
#----------------------------------------------------------------------------
@ -582,7 +643,6 @@ sub www_delete {
my $var = $self->getTemplateVar;
$var->{ url_yes } = $self->getUrl("func=deleteConfirm");
$var->{ url_no } = $self->getUrl();
return $self->processStyle(
$self->processTemplate( $var, $self->getGallery->get("templateIdDeletePhoto") )
@ -705,7 +765,7 @@ sub www_edit {
return $self->processStyle(
$self->processTemplate($var, $self->getGallery->get("templateIdEditFile"))
$self->processTemplate( $var, $self->getGallery->getTemplateIdEditFile )
);
}

View file

@ -18,6 +18,14 @@ use WebGUI::International;
use WebGUI::Utility;
use base 'WebGUI::Asset::Wobject';
=head1 NAME
=head1 DESCRIPTION
=head1 SYNOPSIS
=head1 METHODS
#-------------------------------------------------------------------
=head2 definition ( )
@ -69,7 +77,7 @@ sub definition {
imageResolutions => {
tab => "properties",
fieldType => "checkList",
defaultValue => ['800','1024','1200','1600'],
defaultValue => ['800', '1024', '1200', '1600', '2880'],
options => \%imageResolutionOptions,
label => $i18n->get("imageResolutions label"),
hoverHelp => $i18n->get("imageResolutions description"),
@ -95,7 +103,7 @@ sub definition {
label => $i18n->get("maxSpacePerUser label"),
hoverHelp => $i18n->get("maxSpacePerUser description"),
},
richEditIdFileComment => {
richEditIdComment => {
tab => "properties",
fieldType => "selectRichEditor",
defaultValue => undef, # Rich Editor for Posts
@ -246,10 +254,197 @@ sub definition {
#----------------------------------------------------------------------------
=head2 getTemplateEditFile ( )
=head2 canAddFile ( [userId] )
Returns an instance of a WebGUI::Asset::Template for the template to edit
files in this gallery
Returns true if the user can add files to this Gallery. C<userId> is the
userId to check. If no userId is passed, will check the current user.
Users can add files to this gallery if they are part of the C<groupIdAddFile>
=cut
sub canAddFile {
my $self = shift;
my $userId = shift;
my $user = $userId
? WebGUI::User->new( $self->session, $userId )
: $self->session->user
;
return $user->isInGroup( $self->get("groupIdAddFile") );
}
#----------------------------------------------------------------------------
=head2 canComment ( [userId] )
Returns true if the user can comment on this Gallery. C<userId> is the userId
to check. If no userId is passed, will check the current user.
Users can comment on this gallery if they are part of the
C<groupIdAddComment> group.
=cut
sub canComment {
my $self = shift;
my $userId = shift;
my $user = $userId
? WebGUI::User->new( $self->session, $userId )
: $self->session->user
;
return $user->isInGroup( $self->get("groupIdAddComment") );
}
#----------------------------------------------------------------------------
=head2 canEdit ( [userId] )
Returns true if the user can edit this Gallery. C<userId> is the userId to
check. If no userId is passed, will check the current user.
Users can edit this gallery if they are part of the C<groupIdEdit> group.
=cut
sub canEdit {
my $self = shift;
my $userId = shift;
my $user = $userId
? WebGUI::User->new( $self->session, $userId )
: $self->session->user
;
return $user->isInGroup( $self->get("groupIdEdit") );
}
#----------------------------------------------------------------------------
=head2 canView ( [userId] )
Returns true if the user can view this Gallery. C<userId> is the userId to
check. If no userId is passed, will check the current user.
Users can view this gallery if they are part of the C<groupIdView> group.
=cut
sub canView {
my $self = shift;
my $userId = shift;
my $user = $userId
? WebGUI::User->new( $self->session, $userId )
: $self->session->user
;
return $user->isInGroup( $self->get("groupIdView") );
}
#----------------------------------------------------------------------------
=head2 getAlbumIds ( )
Gets an array reference of all the album IDs under this Gallery.
=cut
sub getAlbumIds {
my $self = shift;
return $self->getLineage(['descendants'], {
includeOnlyClasses => ['WebGUI::Asset::Wobject::GalleryAlbum'],
});
}
#----------------------------------------------------------------------------
=head2 getAlbumPaginator ( )
Gets a WebGUI::Paginator for all the albums in this Gallery.
=cut
sub getAlbumPaginator {
my $self = shift;
my $p = WebGUI::Paginator->new( $self->session, $self->getUrl );
$p->setDataByArrayRef( $self->getAlbumIds );
return $p;
}
#----------------------------------------------------------------------------
=head2 getAssetClassForFile ( filepath )
Gets the WebGUI Asset class for the file at the given C<filepath>. Returns
undef if the file cannot be saved under this Gallery.
=cut
sub getAssetClassForFile {
my $self = shift;
my $filepath = shift;
# Checks for Photo assets
if ( $filepath =~ /\.(jpe?g|gif|png)/i ) {
return "WebGUI::Asset::File::Image::Photo";
}
# No class found
return undef;
}
#----------------------------------------------------------------------------
=head2 getImageResolutions ( )
Gets an array reference of the image resolutions to create for image-type
assets in this gallery.
=cut
sub getImageResolutions {
my $self = shift;
return [ split /\n/, $self->get("imageResolutions") ];
}
#----------------------------------------------------------------------------
=head2 getSearchPaginator ( options )
Gets a WebGUI::Paginator for a search. C<options> is a hash reference of
options with the following keys:
keywords => Keywords to search on
Other keys are valid, see C<WebGUI::Search::search()> for details.
=cut
sub getSearchPaginator {
my $self = shift;
my $rules = shift;
$rules->{ lineage } = $self->get("lineage");
my $search = WebGUI::Search->new( $self->session );
$search->search( $rules );
my $paginator = $search->getPaginatorResultSet( $self->getUrl('func=search') );
return $paginator;
}
#----------------------------------------------------------------------------
=head2 getTemplateIdEditFile ( )
Returns the ID for the template to edit a file.
NOTE: This may need to change in the future to take into account different
classes of files inside of a Gallery.
@ -258,7 +453,72 @@ classes of files inside of a Gallery.
sub getTemplateEditFile {
my $self = shift;
return WebGUI::Asset::Template->new($self->session, $self->get("templateIdEditFile"));
return $self->get("templateIdEditFile");
}
#----------------------------------------------------------------------------
=head2 getTemplateVars ( )
Gets a hash reference of vars common to all templates.
=cut
sub getTemplateVars {
my $self = shift;
my $var = $self->get;
return $var;
}
#----------------------------------------------------------------------------
=head2 getUserFileIds ( [userId] )
Gets an array reference of assetIds for the files in this Gallery owned by
the specified C<userId>. If userId is not defined, will use the current user.
=cut
sub getUserFileIds {
my $self = shift;
my $userId = shift || $self->session->user->userId;
my $db = $self->session->db;
# Note: We use excludeClasses to avoid getting GalleryAlbum assets
my $assetIds
= $self->getLineage( ['descendants'], {
excludeClasses => [ 'WebGUI::Asset::Wobject::GalleryAlbum' ],
whereClause => "ownerUserId = " . $db->quote($userId),
});
return $assetIds;
}
#----------------------------------------------------------------------------
=head2 getUserAlbumIds ( [userId] )
Gets an array reference of assetIds for the GalleryAlbums in this Gallery
owned by the specified C<userId>. If userId is not defined, will use the
current user.
=cut
sub getUserAlbumIds {
my $self = shift;
my $userId = shift || $self->session->user->userId;
my $db = $self->session->db;
my $assetIds
= $self->getLineage( ['descendants'], {
includeOnlyClasses => [ 'WebGUI::Asset::Wobject::GalleryAlbum' ],
whereClause => "ownerUserId = " . $db->quote($userId),
});
return $assetIds;
}
#----------------------------------------------------------------------------
@ -277,7 +537,7 @@ sub prepareView {
$self->{_viewTemplate} = $template;
}
#-------------------------------------------------------------------
#----------------------------------------------------------------------------
=head2 view ( )
@ -294,4 +554,41 @@ sub view {
return $self->processTemplate($var, undef, $self->{_viewTemplate});
}
#----------------------------------------------------------------------------
=head2 www_listAlbums ( )
Show a paginated list of the albums in this gallery.
=cut
sub www_listAlbums {
my $self = shift;
}
#----------------------------------------------------------------------------
=head2 www_listAlbumsRss ( )
=cut
#----------------------------------------------------------------------------
=head2 www_search ( )
=cut
#----------------------------------------------------------------------------
=head2 www_userGallery ( )
=cut
#----------------------------------------------------------------------------
=head2 www_userGalleryRss ( )
=cut
1;

View file

@ -13,18 +13,28 @@ $VERSION = "1.0.0";
#-------------------------------------------------------------------
use strict;
use base 'WebGUI::Asset::Wobject';
use Tie::IxHash;
use WebGUI::International;
use WebGUI::Utility;
use base 'WebGUI::Asset::Wobject';
use Archive::Any;
=head1 NAME
=head1 DESCRIPTION
=head1 SYNOPSIS
=head1 DIAGNOSTICS
=head1 METHODS
#-------------------------------------------------------------------
=head2 definition ( )
defines wobject properties for New Wobject instances. You absolutely need
this method in your new Wobjects. If you choose to "autoGenerateForms", the
getEditForm method is unnecessary/redundant/useless.
Define wobject properties for new GalleryAlbum wobjects.
=cut
@ -32,7 +42,7 @@ sub definition {
my $class = shift;
my $session = shift;
my $definition = shift;
my $i18n = WebGUI::International->new($session, 'Asset_GalleryAlbum');
my $i18n = __PACKAGE__->i18n($session);
tie my %properties, 'Tie::IxHash', (
allowComments => {
@ -63,6 +73,131 @@ sub definition {
#----------------------------------------------------------------------------
=head2 addArchive ( filename, properties )
Add an archive of Files to this Album. C<filename> is the full path of the
archive. C<properties> is a hash reference of properties to assign to the
photos in the archive.
Will croak if cannot read the archive or if the archive will extract itself to
a directory outside of the storage location.
Will only handle file types handled by the parent Gallery.
=cut
sub addArchive {
my $self = shift;
my $filename = shift;
my $properties = shift;
my $archive = Archive::Any->new( $filename );
croak "Archive will extract to directory outside of storage location!"
if $archive->is_naughty;
use File::Temp qw{ tempdir };
my $tempdirName = tempdir( "WebGUI-Gallery-XXXXXXXX", TMPDIR => 1, CLEANUP => 1);
$archive->extract( $tempdir );
opendir my $dh, $tempdirName or die "Could not open temp dir $tempdirName: $!";
for my $file (readdir $dh) {
my $class = $gallery->getAssetClassForFile( $file );
next unless $class; # class is undef for those files the Gallery can't handle
$self->addChild({
className => $class,
title => $properties->{title},
menuTitle => $properties->{menuTitle} || $properties->{title},
synopsis => $properties->{synopsis},
});
}
closedir $dh;
}
#----------------------------------------------------------------------------
=head2 appendTemplateVarsFileLoop ( vars, options )
Append template vars for a file loop with the specified options. C<vars> is
a hash reference to add the file loop to. C<options> is a hash reference of
options with the following keys:
perpage => number | "all"
If "all", no pagination will be done.
url => url
The URL to the current page
Returns the hash reference for convenience.
=cut
sub appendTemplateVarsFileLoop {
my $self = shift;
my $var = shift;
my $options = shift;
my @assetIds;
if ($options->{perpage} eq "all") {
@assetIds = @{ $self->getFileIds };
}
else {
@assetIds = @{ $self->getFilePaginator($options->{url})->getPageData };
}
for my $assetId (@assetIds) {
push @{$var->{file_loop}},
WebGUI::Asset->newByDynamicClass($session, $assetId)->getTemplateVars;
}
return $var;
}
#----------------------------------------------------------------------------
=head2 canAddFile ( [userId] )
Returns true if the user can add a file to this album. C<userId> is a WebGUI
user ID. If no userId is passed, will check the current user.
Users can add files to this album if they are the owner, or if
C<othersCanAdd> is true and the Gallery allows them to add files.
=cut
sub canAddFile {
my $self = shift;
my $userId = shift || $self->session->user->userId;
return 1 if $userId eq $self->get("ownerUserId");
return 1 if $self->get("othersCanAdd") && $gallery->canAddFile( $userId );
}
#----------------------------------------------------------------------------
=head2 canComment ( [userId] )
Returns true if the user is allowed to comment on files in this Album.
C<userId> is a WebGUI user ID. If no userId is passed, will check the current
user.
Users can comment on files if C<allowComments> is true and the parent Gallery
allows comments.
=cut
sub canComment {
my $self = shift;
my $userId = shift || $self->session->user->userId;
my $gallery = $self->getParent;
return 0 if !$self->get("allowComments");
return $gallery->canComment( $userId );
}
#----------------------------------------------------------------------------
=head2 canEdit ( [userId] )
Returns true if the user can edit this asset. C<userId> is a WebGUI user ID.
@ -71,6 +206,8 @@ If no userId is passed, check the current user.
Users can edit this GalleryAlbum if they are the owner, or if they can edit
the Gallery parent.
Also handles adding of child assets by calling C<canAddFile>.
=cut
sub canEdit {
@ -78,11 +215,116 @@ sub canEdit {
my $userId = shift || $self->session->user->userId;
my $gallery = $self->getParent;
return 1 if $userId eq $self->get("ownerUserId");
return $gallery->canEdit($userId);
# Handle adding a photo
if ( $form->get("func") eq "add" ) {
return $self->canAddFile;
}
else {
return 1 if $userId eq $self->get("ownerUserId");
return $gallery->canEdit($userId);
}
}
#-------------------------------------------------------------------
#----------------------------------------------------------------------------
=head2 canView ( [userId] )
Returns true if the user can view this asset. C<userId> is a WebGUI user ID.
If no userId is given, checks the current user.
=cut
# Inherited from superclass
#----------------------------------------------------------------------------
=head2 i18n ( [ session ] )
Get a WebGUI::International object for this class.
Can be called as a class method, in which case a WebGUI::Session object
must be passed in.
NOTE: This method can NOT be inherited, due to a current limitation
in the i18n system. You must ALWAYS call this with C<__PACKAGE__>
=cut
sub i18n {
my $self = shift;
my $session = shift;
return WebGUI::International->new($session, "Asset_GalleryAlbum");
}
#----------------------------------------------------------------------------
=head2 getFileIds ( )
Gets an array reference of asset IDs for all the files in this album.
=cut
sub getFileIds {
my $self = shift;
my $gallery = $self->getParent;
return $self->assetLineage( ['descendants'], {
includeOnlyClasses => $gallery->getAllAssetClassesForFile,
});
}
#----------------------------------------------------------------------------
=head2 getFilePaginator ( paginatorUrl )
Gets a WebGUI::Paginator for the files in this album. C<paginatorUrl> is the
url to the current page that will be given to the paginator.
=cut
sub getFilePaginator {
my $self = shift;
my $url = shift;
my $p = WebGUI::Paginator->new( $self->session, $url );
$p->setDataByArrayRef( $self->getFileIds );
return $p;
}
#----------------------------------------------------------------------------
=head2 getTemplateVars ( )
Gets template vars common to all views.
=cut
sub getTemplateVars {
my $self = shift;
my $var = $self->get;
$var->{ url } = $self->getUrl;
return $var;
}
#----------------------------------------------------------------------------
=head2 othersCanAdd ( )
Returns true if people other than the owner can add files to this album.
=cut
sub othersCanAdd {
my $self = shift;
return $self->get("othersCanAdd");
}
#----------------------------------------------------------------------------
=head2 prepareView ( )
@ -93,12 +335,30 @@ See WebGUI::Asset::prepareView() for details.
sub prepareView {
my $self = shift;
$self->SUPER::prepareView();
my $template = WebGUI::Asset::Template->new($self->session, $self->get("templateId"));
my $templateId = $self->getParent->get("templateIdViewAlbum");
my $template
= WebGUI::Asset::Template->new($self->session, $templateId);
$template->prepare;
$self->{_viewTemplate} = $template;
}
#-------------------------------------------------------------------
#----------------------------------------------------------------------------
=head2 processStyle ( )
Gets the parent Gallery's style template
=cut
sub processStyle {
my $self = shift;
return $self->getParent->processStyle(@_);
}
#----------------------------------------------------------------------------
=head2 view ( )
@ -108,11 +368,186 @@ to be displayed within the page style.
=cut
sub view {
my $self = shift;
my $session = $self->session;
my $var = $self->get;
my $self = shift;
my $session = $self->session;
my $var = $self->getTemplateVars;
$self->appendTemplateVarsFileLoop( $var );
return $self->processTemplate($var, undef, $self->{_viewTemplate});
}
#----------------------------------------------------------------------------
=head2 view_slideshow ( )
method called by the www_slideshow method. Returns a processed template to be
displayed within the page style.
=cut
sub view_slideshow {
my $self = shift;
my $session = $self->session;
my $var = $self->getTemplateVars;
$self->appendTemplateVarsFileLoop( $var, { perpage => "all" } );
return $self->processTemplate($var, $self->getParent->get("templateIdSlideshow"));
}
#----------------------------------------------------------------------------
=head2 view_thumbnails ( )
method called by the www_thumbnails method. Returns a processed template to be
displayed within the page style.
=cut
sub view_thumbnails {
my $self = shift;
my $session = $self->session;
my $var = $self->getTemplateVars;
$self->appendTemplateVarsFileLoop( $var, { perpage => "all" } );
return $self->processTemplate($var, $self->getParent->get("templateIdThumbnails"));
}
#----------------------------------------------------------------------------
=head2 www_addArchive ( )
Show the form to add an archive of files to this gallery.
=cut
sub www_addArchive {
my $self = shift;
return $self->session->privilege->insufficient unless $self->canAddFile;
my $var = $self->getTemplateVars;
return $self->processStyle(
$self->processTemplate($var, $self->getParent->get("templateIdAddArchive"))
);
}
#-----------------------------------------------------------------------------
=head2 www_addArchiveSave ( )
Process the form for adding an archive.
=cut
sub www_addArchiveSave {
my $self = shift;
return $self->session->privilege->insufficient unless $self->canAddfile;
my $form = $self->session->form;
my $properties = {
keywords => $form->get("keywords"),
friendsOnly => $form->get("friendsOnly"),
};
my $storage = $form->get("archive", "File");
my $filename = $storage->getFilePath( $storage->getFiles->[0] );
$self->addArchive( $filename, $properties );
return $self->www_view;
}
#-----------------------------------------------------------------------------
=head2 www_delete ( )
Show the form to confirm deleting this album and all files inside of it.
=cut
sub www_delete {
my $self = shift;
return $self->session->privilege->insufficient unless $self->canEdit;
my $var = $self->getTemplateVars;
$var->{ url_yes } = $self->getUrl("?func=deleteConfirm");
return $self->processStyle(
$self->processTemplate( $var, $self->getParent->get("templateIdDeleteAlbum") )
);
}
#-----------------------------------------------------------------------------
=head2 www_deleteConfirm ( )
Confirm deleting this album and all files inside of it.
=cut
sub www_deleteConfirm {
my $self = shift;
return $self->session->privilege->insufficient unless $self->canEdit;
$self->purge;
return $self->getParent->www_view;
}
#-----------------------------------------------------------------------------
=head2 www_slideshow ( )
Show a slideshow-type view of this album. The slideshow itself is powered by
a javascript application in the template.
=cut
sub www_slideshow {
my $self = shift;
return $self->session->privilege->insufficient unless $self->canView;
return $self->processStyle( $self->view_slideshow );
}
#----------------------------------------------------------------------------
=head2 www_thumbnails ( )
Show the thumbnails for the album.
=cut
sub www_thumbnails {
my $self = shift;
return $self->session->privilege->insufficient unless $self->canView;
return $self->processStyle( $self->view_thumbnails );
}
#----------------------------------------------------------------------------
=head2 www_viewRss ( )
Display an RSS feed for this album.
=cut
sub www_viewRss {
my $self = shift;
return $self->session->privilege->insufficient unless $self->canView;
}
1;

View file

@ -123,6 +123,7 @@ checkModule("Weather::Com::Finder","0.5.1");
checkModule("Class::InsideOut","1.06");
checkModule("HTML::TagCloud","0.34");
checkModule("Image::ExifTool","7.00");
checkModule("Archive::Any","0.093");
###################################