webgui/lib/WebGUI/Asset/FilePile.pm
Graham Knop 99a9da626d rfe #640: Refactored autocommit and autocomment
Autocommit assets like CS posts or Calendar Events can now be added before the
parent is committed.  They will go into the same version tag as their parent.
2008-10-22 16:04:10 +00:00

248 lines
7.9 KiB
Perl

package WebGUI::Asset::FilePile;
=head1 LEGAL
-------------------------------------------------------------------
WebGUI is Copyright 2001-2008 Plain Black Corporation.
-------------------------------------------------------------------
Please read the legal notices (docs/legal.txt) and the license
(docs/license.txt) that came with this distribution before using
this software.
-------------------------------------------------------------------
http://www.plainblack.com info@plainblack.com
-------------------------------------------------------------------
=cut
use strict;
use WebGUI::Asset;
use WebGUI::Asset::File;
use WebGUI::Asset::File::Image;
use WebGUI::SQL;
use WebGUI::Storage::Image;
use WebGUI::TabForm;
use WebGUI::Utility;
our @ISA = qw(WebGUI::Asset);
=head1 NAME
Package WebGUI::Asset::FilePile
=head1 DESCRIPTION
Provides a mechanism to upload files to WebGUI.
=head1 SYNOPSIS
use WebGUI::Asset::FilePile;
=head1 METHODS
These methods are available from this class:
=cut
#-------------------------------------------------------------------
sub edit {
my $self = shift;
my $tabform = WebGUI::TabForm->new($self->session,);
if ($self->session->config->get("enableSaveAndCommit")) {
$tabform->submitAppend(WebGUI::Form::submit($self->session, {
name => "saveAndCommit",
value => WebGUI::International->new($self->session, 'Asset')->get("save and commit"),
}));
}
my $i18n = WebGUI::International->new($self->session, 'Asset_FilePile');
$tabform->hidden({
name=>"func",
value=>"add"
});
$tabform->hidden({
name=>"doit",
value=>"1"
});
$tabform->hidden({
name=>"class",
value=>"WebGUI::Asset::FilePile"
});
if ($self->session->form->process("proceed")) {
$tabform->hidden({
name=>"proceed",
value=>$self->session->form->process("proceed")
});
}
$tabform->addTab("properties",$i18n->get("properties","Asset"));
$tabform->getTab("properties")->yesNo(
-name=>"isHidden",
-value=>1,
-label=>$i18n->get(886, 'Asset'),
-hoverHelp=>$i18n->get('886 description', 'Asset'),
-uiLevel=>6
);
$tabform->getTab("properties")->yesNo(
-name=>"newWindow",
-value=>0,
-label=>$i18n->get(940, 'Asset'),
-hoverHelp=>$i18n->get('940 description', 'Asset'),
-uiLevel=>6
);
$tabform->addTab("security",$i18n->get(107,"Asset"),6);
my $subtext;
if ($self->session->user->isAdmin) {
$subtext = $self->session->icon->manage('op=listUsers');
} else {
$subtext = "";
}
my $clause;
if ($self->session->user->isAdmin) {
my $group = WebGUI::Group->new($self->session,4);
my $contentManagers = $group->getAllUsers();
push (@$contentManagers, $self->session->user->userId);
$clause = "userId in (".$self->session->db->quoteAndJoin($contentManagers).")";
} else {
$clause = "userId=".$self->session->db->quote($self->get("ownerUserId"));
}
my $users = $self->session->db->buildHashRef("select userId,username from users where $clause order by username");
$tabform->getTab("security")->selectBox(
-name=>"ownerUserId",
-options=>$users,
-label=>$i18n->get(108, 'Asset'),
-hoverHelp=>$i18n->get('108 description', 'Asset'),
-value=>[$self->get("ownerUserId")],
-subtext=>$subtext,
-uiLevel=>6
);
$tabform->getTab("security")->group(
-name=>"groupIdView",
-label=>$i18n->get(872, 'Asset'),
-hoverHelp=>$i18n->get('872 description', 'Asset'),
-value=>[$self->get("groupIdView")],
-uiLevel=>6
);
$tabform->getTab("security")->group(
-name=>"groupIdEdit",
-label=>$i18n->get(871, 'Asset'),
-hoverHelp=>$i18n->get('871 description', 'Asset'),
-value=>[$self->get("groupIdEdit")],
-excludeGroups=>[1,7],
-uiLevel=>6
);
$tabform->getTab("properties")->file(
-label=>$i18n->get("upload files"),
-hoverHelp=>$i18n->get("upload files description"),
-maxAttachments=>100
);
return $self->getAdminConsole->render($tabform->print,$i18n->get("add pile"));
}
#-------------------------------------------------------------------
sub editSave {
my $self = shift;
return $self->session->privilege->locked() unless $self->canEditIfLocked;
return $self->session->privilege->insufficient() unless $self->canEdit;
if ($self->session->config("maximumAssets")) {
my ($count) = $self->session->db->quickArray("select count(*) from asset");
my $i18n = WebGUI::International->new($self->session, "Asset");
return $self->session->style->userStyle($i18n->get("over max assets")) if ($self->session->config("maximumAssets") <= $count);
}
##This is a hack. File uploads should go through the WebGUI::Form::File API
my $tempFileStorageId = WebGUI::Form::File->new($self->session,{name => 'file'})->getValue;
my $tempStorage = WebGUI::Storage::Image->get($self->session, $tempFileStorageId);
foreach my $filename (@{$tempStorage->getFiles}) {
#my $storage = WebGUI::Storage::Image->create($self->session);
#$storage->addFileFromFilesystem($tempStorage->getPath($filename));
#$storage->setPrivileges($self->getParent->get("ownerUserId"),$self->getParent->get("groupIdView"),$self->getParent->get("groupIdEdit"));
my %data;
my $selfName = 'WebGUI::Asset::File';
$selfName = "WebGUI::Asset::File::Image" if ($tempStorage->isImage($filename));
foreach my $definition (@{$selfName->definition($self->session)}) {
foreach my $property (keys %{$definition->{properties}}) {
$data{$property} = $self->session->form->process(
$property,
$definition->{properties}{$property}{fieldType},
$definition->{properties}{$property}{defaultValue}
);
}
}
$data{className} = $selfName;
#$data{storageId} = $storage->getId;
$data{filename} = $data{title} = $data{menuTitle} = $filename;
$data{templateId} = 'PBtmpl0000000000000024';
if ($selfName eq "WebGUI::Asset::File::Image") {
$data{templateId} = 'PBtmpl0000000000000088';
}
$data{url} = $self->getParent->get('url').'/'.$filename;
#Create the new asset
my $newAsset = $self->getParent->addChild(\%data);
#Get the current storage location
my $storage = $newAsset->getStorageLocation();
$storage->addFileFromFilesystem($tempStorage->getPath($filename));
$newAsset->applyConstraints;
#Now remove the reference to the storeage location to prevent problems with different revisions.
delete $newAsset->{_storageLocation};
}
$tempStorage->delete;
if (WebGUI::VersionTag->autoCommitWorkingIfEnabled($self->session, {
override => scalar $self->session->form->process("saveAndCommit"),
allowComments => 1,
returnUrl => $self->getUrl,
})) {
return undef;
};
return $self->getParent->www_manageAssets if ($self->session->form->process("proceed") eq "manageAssets");
return $self->getParent->www_view;
}
#-------------------------------------------------------------------
sub getIcon {
my $self = shift;
my $small = shift;
if ($small) {
return $self->session->url->extras('assets/small/filePile.gif');
}
return $self->session->url->extras('assets/filePile.gif');
}
#-------------------------------------------------------------------
=head2 getName
Returns the displayable name of this asset.
=cut
sub getName {
my $self = shift;
my $i18n = WebGUI::International->new($self->session);
return $i18n->get('assetName',"Asset_FilePile");
}
#-------------------------------------------------------------------
sub www_edit {
my $self = shift;
unless ($self->session->form->process("doit")) {
return $self->edit;
} else {
return $self->editSave;
}
}
1;