added: WebGUI::AssetCollateral::DataForm::Entry object for managing DataForm entries
This commit is contained in:
parent
203563a918
commit
d5dfa451df
5 changed files with 784 additions and 272 deletions
|
|
@ -84,6 +84,7 @@
|
|||
- added: "EditArea" code highlighter and editing tool for WebGUI::Form::Codearea, used
|
||||
in Template, Snippet, SQLReport, and more
|
||||
- fixed: email password recovery allows sending recovery mail to arbitrary address
|
||||
- added: WebGUI::AssetCollateral::DataForm::Entry object for managing DataForm entries
|
||||
|
||||
7.6.0
|
||||
- added: users may now customize the post received page for the CS
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@ use WebGUI::Pluggable;
|
|||
use WebGUI::DateTime;
|
||||
use WebGUI::User;
|
||||
use WebGUI::Group;
|
||||
use WebGUI::AssetCollateral::DataForm::Entry;
|
||||
use JSON;
|
||||
|
||||
our @ISA = qw(WebGUI::Asset::Wobject);
|
||||
|
|
@ -64,16 +65,17 @@ sub _createForm {
|
|||
WebGUI::Macro::process($self->session, \( $param{defaultValue} ));
|
||||
|
||||
my $type = "\u$data->{type}";
|
||||
if ($data->{type} eq "checkbox") {
|
||||
my $class = "WebGUI::Form::$type";
|
||||
eval {
|
||||
WebGUI::Pluggable::load("WebGUI::Form::$type");
|
||||
} || return undef;
|
||||
if ($type eq "Checkbox") {
|
||||
$param{defaultValue} = ($param{defaultValue} =~ /checked/i);
|
||||
}
|
||||
elsif ( isIn($type, qw(SelectList SelectBox CheckList RadioList)) ) {
|
||||
elsif ( $class->isa('WebGUI::Form::List') ) {
|
||||
delete $param{size};
|
||||
}
|
||||
my $control = eval {
|
||||
WebGUI::Pluggable::instanciate("WebGUI::Form::$type", "new", [ $self->session, \%param ]);
|
||||
};
|
||||
return $control;
|
||||
return $class->new($self->session, \%param);
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
|
|
@ -117,6 +119,17 @@ sub defaultViewForm {
|
|||
return ($self->get("defaultView") == 0);
|
||||
}
|
||||
|
||||
sub defaultView {
|
||||
my $self = shift;
|
||||
return ($self->get("defaultView") == 0 ? 'form' : 'list');
|
||||
}
|
||||
|
||||
sub currentView {
|
||||
my $self = shift;
|
||||
my $view = $self->{_mode} || $self->session->form->param('mode') || $self->defaultView;
|
||||
return $view;
|
||||
}
|
||||
|
||||
sub deleteField {
|
||||
my $self = shift;
|
||||
my $fieldName = shift;
|
||||
|
|
@ -150,6 +163,14 @@ sub deleteTab {
|
|||
return 1;
|
||||
}
|
||||
|
||||
sub getContentLastModified {
|
||||
my $self = shift;
|
||||
if ($self->currentView eq 'list' || $self->session->form->process('entryId')) {
|
||||
return time;
|
||||
}
|
||||
return $self->SUPER::getContentLastModified;
|
||||
}
|
||||
|
||||
sub renameField {
|
||||
my $self = shift;
|
||||
my $oldName = shift;
|
||||
|
|
@ -163,7 +184,7 @@ sub renameField {
|
|||
}
|
||||
$self->getFieldConfig->{$newName} = $self->getFieldConfig->{$oldName};
|
||||
delete $self->getFieldConfig->{$oldName};
|
||||
$self->getFieldConfig->{$newName}{name} = $newName;
|
||||
return $self->getFieldConfig->{$newName}{name} = $newName;
|
||||
}
|
||||
|
||||
sub _saveFieldConfig {
|
||||
|
|
@ -449,8 +470,8 @@ sub deleteAttachedFiles {
|
|||
my $fieldConfig = $self->getFieldConfig;
|
||||
|
||||
if ($entryId) {
|
||||
my ($entry) = $self->session->db->buildArray("select entryData from DataForm_entry where assetId=? and DataForm_entryId=?", [$self->getId, $entryId]);
|
||||
$entryData = JSON::from_json($entry);
|
||||
my $entry = $self->entryClass->new($self, $entryId);
|
||||
$entryData = $entry->fields;
|
||||
}
|
||||
if ($entryData) {
|
||||
for my $field ( @$fields ) {
|
||||
|
|
@ -462,9 +483,9 @@ sub deleteAttachedFiles {
|
|||
}
|
||||
}
|
||||
else {
|
||||
my $entries = $self->session->db->buildArrayRef("select entryData from DataForm_entry where assetId=?", [$self->getId]);
|
||||
foreach my $entry (@{ $entries}) {
|
||||
my $entryData = JSON::from_json($entry);
|
||||
my $entryIter = $self->entryClass->iterateAll($self);
|
||||
while (my $entry = $entryIter->()) {
|
||||
my $entryData = $entry->fields;
|
||||
for my $field (@{ $fields }) {
|
||||
my $form = $self->_createForm($fieldConfig->{$field}, $entryData->{$field});
|
||||
if ($form->can('getStorageLocation')) {
|
||||
|
|
@ -512,19 +533,13 @@ sub getListTemplateVars {
|
|||
} @{ $self->getFieldOrder };
|
||||
$var->{field_loop} = \@fieldLoop;
|
||||
my @recordLoop;
|
||||
my $entries = $self->session->db->read(
|
||||
"SELECT `ipAddress`, `username`, `userId`, `submissionDate`, `DataForm_entryId`, `entryData`
|
||||
FROM `DataForm_entry` WHERE `assetId` = ? ORDER BY `submissionDate` DESC", [$self->getId]);
|
||||
while (my $record = $entries->hashRef) {
|
||||
my $recordData;
|
||||
if (!eval { $recordData = JSON::from_json($record->{entryData}) ; 1 }) {
|
||||
$self->session->errorHandler->warn('DataForm ' . $self->getId . ' entry ' . $record->{DataForm_entryId} . ' contains invalid data');
|
||||
next;
|
||||
}
|
||||
my $entryIter = $self->entryClass->iterateAll($self);
|
||||
while ( my $entry = $entryIter->() ) {
|
||||
my $entryData = $entry->fields;
|
||||
my @dataLoop;
|
||||
for my $fieldName ( @{ $self->getFieldOrder } ) {
|
||||
my $field = $fieldConfig->{$fieldName};
|
||||
my $form = $self->_createForm($field, $recordData->{$fieldName});
|
||||
my $form = $self->_createForm($field, $entryData->{$fieldName});
|
||||
push @dataLoop, {
|
||||
"record.data.name" => $field->{name},
|
||||
"record.data.label" => $field->{label},
|
||||
|
|
@ -533,22 +548,20 @@ sub getListTemplateVars {
|
|||
"record_data_type" => $field->{type},
|
||||
};
|
||||
}
|
||||
my $date = WebGUI::DateTime->new($self->session, $record->{submissionDate});
|
||||
push @recordLoop, {
|
||||
"record.ipAddress" => $recordData->{ipAddress},
|
||||
"record.edit.url" => $self->getFormUrl("func=view;entryId=".$record->{DataForm_entryId}),
|
||||
"record.edit.icon" => $self->session->icon->edit("func=view;entryId=".$record->{DataForm_entryId}, $self->get('url')),
|
||||
"record.delete.url" => $self->getUrl("func=deleteEntry;entryId=".$record->{DataForm_entryId}),
|
||||
"record.delete.icon" => $self->session->icon->delete("func=deleteEntry;entryId=".$record->{Asset_DataForm_entryId}, $self->get('url'), $i18n->get('Delete entry confirmation')),
|
||||
"record.username" => $record->{username},
|
||||
"record.userId" => $record->{userId},
|
||||
"record.submissionDate.epoch" => $date->epoch,
|
||||
"record.submissionDate.human" => $date->cloneToUserTimeZone->webguiDate,
|
||||
"record.entryId" => $record->{DataForm_entryId},
|
||||
"record.ipAddress" => $entry->ipAddress,
|
||||
"record.edit.url" => $self->getFormUrl("func=view;entryId=".$entry->getId),
|
||||
"record.edit.icon" => $self->session->icon->edit("func=view;entryId=".$entry->getId, $self->get('url')),
|
||||
"record.delete.url" => $self->getUrl("func=deleteEntry;entryId=".$entry->getId),
|
||||
"record.delete.icon" => $self->session->icon->delete("func=deleteEntry;entryId=".$entry->getId, $self->get('url'), $i18n->get('Delete entry confirmation')),
|
||||
"record.username" => $entry->username,
|
||||
"record.userId" => $entry->userId,
|
||||
"record.submissionDate.epoch" => $entry->submissionDate->epoch,
|
||||
"record.submissionDate.human" => $entry->submissionDate->cloneToUserTimeZone->webguiDate,
|
||||
"record.entryId" => $entry->getId,
|
||||
"record.data_loop" => \@dataLoop
|
||||
};
|
||||
}
|
||||
$entries->finish;
|
||||
$var->{record_loop} = \@recordLoop;
|
||||
return $var;
|
||||
}
|
||||
|
|
@ -599,33 +612,38 @@ sub getListUrl {
|
|||
# Template variables for normal form view and email message
|
||||
|
||||
sub getRecordTemplateVars {
|
||||
my $self = shift;
|
||||
my $var = shift;
|
||||
my $entryData = shift;
|
||||
my $i18n = WebGUI::International->new($self->session,"Asset_DataForm");
|
||||
$var->{"back.url"} = $self->getUrl;
|
||||
$var->{"back.label"} = $i18n->get(18);
|
||||
$var->{error_loop} = [] unless (exists $var->{error_loop});
|
||||
$var->{"form.start"} = WebGUI::Form::formHeader($self->session,{action=>$self->getUrl})
|
||||
.WebGUI::Form::hidden($self->session,{name=>"func",value=>"process"});
|
||||
my $self = shift;
|
||||
my $var = shift;
|
||||
my $entry = shift;
|
||||
my $session = $self->session;
|
||||
my $i18n = WebGUI::International->new($session, 'Asset_DataForm');
|
||||
$var->{'back.url'} = $self->getUrl;
|
||||
$var->{'back.label'} = $i18n->get(18);
|
||||
$var->{'error_loop'} ||= [];
|
||||
$var->{'form.start'}
|
||||
= WebGUI::Form::formHeader($session, {action => $self->getUrl})
|
||||
. WebGUI::Form::hidden($session, {name => 'func', value => 'process'})
|
||||
;
|
||||
my $fields = $self->getFieldConfig;
|
||||
# If we have an entry id, we're doing this based on existing data
|
||||
my $entry;
|
||||
if ($var->{entryId}) {
|
||||
$var->{"form.start"} .= WebGUI::Form::hidden($self->session,{name=>"entryId",value=>$var->{entryId}});
|
||||
$entry = $self->getCollateral("DataForm_entry","DataForm_entryId",$var->{entryId});
|
||||
$entryData = JSON::from_json( $entry->{entryData} );
|
||||
my $date = WebGUI::DateTime->new($self->session, $entry->{submissionDate})->cloneToUserTimeZone;
|
||||
$var->{ipAddress} = $entry->{ipAddress};
|
||||
$var->{username} = $entry->{username};
|
||||
$var->{userId} = $entry->{userId};
|
||||
$var->{date} = $date->webguiDate;
|
||||
$var->{epoch} = $date->epoch;
|
||||
$var->{"edit.URL"} = $self->getFormUrl('entryId='.$var->{entryId});
|
||||
$var->{"delete.url"} = $self->getUrl('func=deleteEntry;entryId='.$var->{entryId});
|
||||
$var->{"delete.label"} = $i18n->get(90);
|
||||
}
|
||||
my $ignoreForm = $self->session->form->process('func') eq 'editSave' || $self->session->form->process('func') eq 'editFieldSave';
|
||||
# If we have an entry, we're doing this based on existing data
|
||||
my $entryData;
|
||||
if ($entry) {
|
||||
my $entryId = $entry->getId;
|
||||
$var->{'form.start'} .= WebGUI::Form::hidden($session,{name => "entryId", value => $entryId});
|
||||
$entryData = $entry->fields;
|
||||
my $date = $entry->submissionDate->cloneToUserTimeZone;
|
||||
$var->{'ipAddress' } = $entry->ipAddress;
|
||||
$var->{'username' } = $entry->username;
|
||||
$var->{'userId' } = $entry->userId;
|
||||
$var->{'date' } = $date->webguiDate;
|
||||
$var->{'epoch' } = $date->epoch;
|
||||
$var->{'edit.URL' } = $self->getFormUrl('entryId=' . $entryId);
|
||||
$var->{'delete.url' } = $self->getUrl('func=deleteEntry;entryId=' . $entryId);
|
||||
$var->{'delete.label' } = $i18n->get(90);
|
||||
}
|
||||
my $func = $session->form->process('func');
|
||||
my $ignoreForm = $func eq 'editSave' || $func eq 'editFieldSave';
|
||||
|
||||
my %tabById;
|
||||
my @tabLoop;
|
||||
my $tabIdx = 0;
|
||||
|
|
@ -651,13 +669,15 @@ sub getRecordTemplateVars {
|
|||
for my $field (@fields) {
|
||||
# need a copy
|
||||
my $value;
|
||||
if ($entryData) {
|
||||
$value = $entryData->{ $field->{name} };
|
||||
if ($entry) {
|
||||
$value = $entry->field( $field->{name} );
|
||||
}
|
||||
elsif (!$ignoreForm && defined (my $formValue = $self->session->form->process($field->{name}))) {
|
||||
$value = $formValue;
|
||||
}
|
||||
my $hidden = ($field->{status} eq 'hidden' && !$self->session->var->isAdminOn) || ($field->{isMailField} && !$self->get('mailData'));
|
||||
my $hidden
|
||||
= ($field->{status} eq 'hidden' && !$session->var->isAdminOn)
|
||||
|| ($field->{isMailField} && !$self->get('mailData'));
|
||||
my $form = $self->_createForm($field, $value);
|
||||
$value = $form->getValueAsHtml;
|
||||
my %fieldProperties = (
|
||||
|
|
@ -683,23 +703,23 @@ sub getRecordTemplateVars {
|
|||
$tabLoopEntry{"tab.field.$propKey"} = $propValue;
|
||||
}
|
||||
push @fieldLoop, \%fieldLoopEntry;
|
||||
my $tab = $tabById{$field->{tabId}};
|
||||
my $tab = $tabById{ $field->{tabId} };
|
||||
if ($tab) {
|
||||
push @{ $tab->{'tab.field_loop'} }, \%tabLoopEntry;
|
||||
}
|
||||
}
|
||||
$var->{field_loop} = \@fieldLoop;
|
||||
$var->{tab_loop} = \@tabLoop;
|
||||
$var->{'form.send'} = WebGUI::Form::submit($self->session,{value=>$i18n->get(73)});
|
||||
$var->{'form.save'} = WebGUI::Form::submit($self->session);
|
||||
$var->{'form.send'} = WebGUI::Form::submit($session, { value => $i18n->get(73) });
|
||||
$var->{'form.save'} = WebGUI::Form::submit($session);
|
||||
# Create CAPTCHA if configured and user is not a Registered User
|
||||
if ( $self->useCaptcha ) {
|
||||
# Create one captcha we can use multiple times
|
||||
$var->{ 'form_captcha' } = WebGUI::Form::Captcha( $self->session, {
|
||||
$var->{ 'form_captcha' } = WebGUI::Form::Captcha( $session, {
|
||||
name => 'captcha',
|
||||
} );
|
||||
}
|
||||
$var->{"form.end"} = WebGUI::Form::formFooter($self->session);
|
||||
$var->{'form.end'} = WebGUI::Form::formFooter($session);
|
||||
return $var;
|
||||
}
|
||||
|
||||
|
|
@ -717,23 +737,25 @@ sub getTemplateVars {
|
|||
my $var = $self->get;
|
||||
my $i18n = WebGUI::International->new($self->session,"Asset_DataForm");
|
||||
|
||||
$var->{ useCaptcha } = ( $self->useCaptcha ? 1 : 0 );
|
||||
$var->{canEdit} = ($self->canEdit);
|
||||
$var->{canViewEntries} = ($self->session->user->isInGroup($self->get("groupToViewEntries")));
|
||||
$var->{"hasEntries"} = $self->hasEntries;
|
||||
$var->{"entryList.url"} = $self->getListUrl;
|
||||
$var->{"entryList.label"} = $i18n->get(86);
|
||||
$var->{"export.tab.url"} = $self->getUrl('func=exportTab');
|
||||
$var->{"export.tab.label"} = $i18n->get(84);
|
||||
$var->{"addField.url"} = $self->getUrl('func=editField');
|
||||
$var->{"addField.label"} = $i18n->get(76);
|
||||
$var->{"deleteAllEntries.url"} = $self->getUrl("func=deleteAllEntriesConfirm");
|
||||
$var->{"deleteAllEntries.label"} = $i18n->get(91);
|
||||
$var->{"javascript.confirmation.deleteAll"} = sprintf("return confirm('%s');",$i18n->get('confirm delete all'));
|
||||
$var->{"javascript.confirmation.deleteOne"} = sprintf("return confirm('%s');",$i18n->get('confirm delete one'));
|
||||
$var->{"addTab.label"}= $i18n->get(105);;
|
||||
$var->{"addTab.url"}= $self->getUrl('func=editTab');
|
||||
$var->{"tab.init"}= $self->_createTabInit($self->getId);
|
||||
$var->{'useCaptcha' } = ( $self->useCaptcha ? 1 : 0 );
|
||||
$var->{'canEdit' } = ($self->canEdit);
|
||||
$var->{'canViewEntries' } = ($self->session->user->isInGroup($self->get("groupToViewEntries")));
|
||||
$var->{'hasEntries' } = $self->hasEntries;
|
||||
$var->{'entryList.url' } = $self->getListUrl;
|
||||
$var->{'entryList.label' } = $i18n->get(86);
|
||||
$var->{'export.tab.url' } = $self->getUrl('func=exportTab');
|
||||
$var->{'export.tab.label' } = $i18n->get(84);
|
||||
$var->{'addField.url' } = $self->getUrl('func=editField');
|
||||
$var->{'addField.label' } = $i18n->get(76);
|
||||
$var->{'deleteAllEntries.url' } = $self->getUrl("func=deleteAllEntriesConfirm");
|
||||
$var->{'deleteAllEntries.label' } = $i18n->get(91);
|
||||
$var->{'javascript.confirmation.deleteAll'}
|
||||
= sprintf("return confirm('%s');",$i18n->get('confirm delete all'));
|
||||
$var->{'javascript.confirmation.deleteOne'}
|
||||
= sprintf("return confirm('%s');",$i18n->get('confirm delete one'));
|
||||
$var->{'addTab.label' } = $i18n->get(105);;
|
||||
$var->{'addTab.url' }= $self->getUrl('func=editTab');
|
||||
$var->{'tab.init' }= $self->_createTabInit($self->getId);
|
||||
|
||||
return $var;
|
||||
}
|
||||
|
|
@ -747,10 +769,8 @@ Returns number of entries that exist for this dataform.
|
|||
=cut
|
||||
|
||||
sub hasEntries {
|
||||
my $self = shift;
|
||||
my ($entryCount) = $self->session->db->quickArray("select count(*) from DataForm_entry where assetId=?",[$self->getId]);
|
||||
|
||||
return $entryCount;
|
||||
my $self = shift;
|
||||
return $self->entryClass->getCount($self);
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
|
|
@ -762,60 +782,54 @@ See WebGUI::Asset::prepareView() for details.
|
|||
=cut
|
||||
|
||||
sub prepareView {
|
||||
my $self = shift;
|
||||
$self->SUPER::prepareView();
|
||||
# this one is so nutz that we don't even bother preparing, we just execute the whole thing
|
||||
my $passedVars = shift;
|
||||
##Priority encoding
|
||||
my $mode = $self->session->stow->get("mode") || $self->session->form->param("mode");
|
||||
if ( $mode eq "form") {
|
||||
$self->{_view} = $self->viewForm($passedVars);
|
||||
} elsif ( $mode eq "list") {
|
||||
$self->{_view} = $self->viewList;
|
||||
} elsif( $self->defaultViewForm ) {
|
||||
$self->{_view} = $self->viewForm($passedVars);
|
||||
} else {
|
||||
$self->{_view} = $self->viewList();
|
||||
}
|
||||
my $self = shift;
|
||||
$self->SUPER::prepareView(@_);
|
||||
my $view = $self->currentView;
|
||||
if ( $view eq 'form' ) {
|
||||
$self->prepareViewForm(@_);
|
||||
}
|
||||
else {
|
||||
$self->prepareViewList(@_);
|
||||
}
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub purge {
|
||||
my $self = shift;
|
||||
$self->deleteAttachedFiles;
|
||||
$self->session->db->write("delete from DataForm_entry where assetId=?", [$self->getId]);
|
||||
$self->entryClass->purgeAssetEntries($self);
|
||||
return $self->SUPER::purge(@_);
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub sendEmail {
|
||||
my $self = shift;
|
||||
my $var = shift;
|
||||
my $entryData = shift;
|
||||
my $to = $entryData->{to};
|
||||
my $subject = $entryData->{subject};
|
||||
my $from = $entryData->{from};
|
||||
my $bcc = $entryData->{bcc};
|
||||
my $cc = $entryData->{cc};
|
||||
my $message = $self->processTemplate($var,$self->get("emailTemplateId"));
|
||||
my $self = shift;
|
||||
my $var = shift;
|
||||
my $entry = shift;
|
||||
my $to = $entry->field('to');
|
||||
my $subject = $entry->field('subject');
|
||||
my $from = $entry->field('from');
|
||||
my $bcc = $entry->field('bcc');
|
||||
my $cc = $entry->field('cc');
|
||||
my $message = $self->processTemplate($var, $self->get("emailTemplateId"));
|
||||
WebGUI::Macro::process($self->session,\$message);
|
||||
my @attachments = $self->get('mailAttachments')
|
||||
? @{ $self->getAttachedFiles($entryData) }
|
||||
: ();
|
||||
if ($to =~ /\@/) {
|
||||
my $mail = WebGUI::Mail::Send->create($self->session,{
|
||||
to => $to,
|
||||
replyTo => $from,
|
||||
subject => $subject,
|
||||
cc => $cc,
|
||||
from => $from,
|
||||
bcc => $bcc,
|
||||
});
|
||||
$mail->addHtml($message);
|
||||
$mail->addFooter;
|
||||
$mail->addAttachment($_) for (@attachments);
|
||||
$mail->queue;
|
||||
}
|
||||
? @{ $self->getAttachedFiles($entry) }
|
||||
: ();
|
||||
if ($to =~ /\@/) {
|
||||
my $mail = WebGUI::Mail::Send->create($self->session,{
|
||||
to => $to,
|
||||
replyTo => $from,
|
||||
subject => $subject,
|
||||
cc => $cc,
|
||||
from => $from,
|
||||
bcc => $bcc,
|
||||
});
|
||||
$mail->addHtml($message);
|
||||
$mail->addFooter;
|
||||
$mail->addAttachment($_) for (@attachments);
|
||||
$mail->queue;
|
||||
}
|
||||
else {
|
||||
my $userId;
|
||||
my $groupId;
|
||||
|
|
@ -826,7 +840,7 @@ sub sendEmail {
|
|||
$groupId = $group->getId;
|
||||
}
|
||||
else {
|
||||
$self->session->errorHandler->warn($self->getId.": Unable to send message, no user or group found.");
|
||||
$self->session->errorHandler->warn($self->getId . ": Unable to send message, no user or group found.");
|
||||
return;
|
||||
}
|
||||
WebGUI::Inbox->new($self->session)->addMessage({
|
||||
|
|
@ -868,10 +882,8 @@ user is not a Registered User.
|
|||
sub useCaptcha {
|
||||
my $self = shift;
|
||||
|
||||
if ( $self->get('useCaptcha') ) {
|
||||
if ( !$self->session->user->isInGroup( '2' ) ) {
|
||||
return 1;
|
||||
}
|
||||
if ( $self->get('useCaptcha') && $self->session->user->isVisitor ) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
@ -879,40 +891,83 @@ sub useCaptcha {
|
|||
|
||||
#-------------------------------------------------------------------
|
||||
sub view {
|
||||
my $self = shift;
|
||||
return $self->{_view}; # see prepareView()
|
||||
my $self = shift;
|
||||
my $view = $self->currentView;
|
||||
if ( $view eq 'form' ) {
|
||||
return $self->viewForm(@_);
|
||||
}
|
||||
else {
|
||||
return $self->viewList(@_);
|
||||
}
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub canView {
|
||||
my $self = shift;
|
||||
return 0
|
||||
if !$self->SUPER::canView;
|
||||
if ($self->currentView eq 'list') {
|
||||
return 1
|
||||
if $self->canEdit;
|
||||
return 1
|
||||
if $self->session->user->isInGroup($self->get('groupToViewEntries'));
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub prepareViewList {
|
||||
my $self = shift;
|
||||
my $templateId = $self->get('listTemplateId');
|
||||
my $template = WebGUI::Asset::Template->new($self->session, $templateId);
|
||||
$template->prepare($self->getMetaDataAsTemplateVariables);
|
||||
$self->{_viewListTemplate} = $template;
|
||||
}
|
||||
|
||||
sub viewList {
|
||||
my $self = shift;
|
||||
my $self = shift;
|
||||
my $var = $self->getTemplateVars;
|
||||
return $self->session->privilege->insufficient() unless ($self->session->user->isInGroup($self->get("groupToViewEntries")));
|
||||
return $self->processTemplate($self->getListTemplateVars($var),$self->get("listTemplateId"));
|
||||
return $self->processTemplate($self->getListTemplateVars($var), undef, $self->{_viewListTemplate});
|
||||
}
|
||||
|
||||
sub prepareViewForm {
|
||||
my $self = shift;
|
||||
$self->session->style->setLink($self->session->url->extras('tabs/tabs.css'), {"type"=>"text/css"});
|
||||
$self->session->style->setScript($self->session->url->extras('tabs/tabs.js'), {"type"=>"text/javascript"});
|
||||
my $templateId = $self->get('templateId');
|
||||
my $template = WebGUI::Asset::Template->new($self->session, $templateId);
|
||||
$template->prepare($self->getMetaDataAsTemplateVariables);
|
||||
$self->{_viewFormTemplate} = $template;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
|
||||
sub viewForm {
|
||||
my $self = shift;
|
||||
my $passedVars = shift;
|
||||
my $var = $self->getTemplateVars;
|
||||
$self->session->style->setLink($self->session->url->extras('tabs/tabs.css'), {"type"=>"text/css"});
|
||||
$self->session->style->setScript($self->session->url->extras('tabs/tabs.js'), {"type"=>"text/javascript"});
|
||||
$var->{entryId} = $self->session->form->process("entryId") if ($self->canEdit);
|
||||
$var = $passedVars || $self->getRecordTemplateVars($var);
|
||||
#warn Data::Dumper::Dumper($var);
|
||||
return $self->processTemplate($var,$self->get("templateId"));
|
||||
my $self = shift;
|
||||
my $passedVars = shift;
|
||||
my $entry = shift;
|
||||
my $var = $self->getTemplateVars;
|
||||
if (!$entry) {
|
||||
my $entryId = $self->session->form->process("entryId");
|
||||
$entry = $self->entryClass->new($self, ($entryId && $self->canEdit) ? $entryId : ());
|
||||
}
|
||||
$var = $passedVars || $self->getRecordTemplateVars($var, $entry);
|
||||
return $self->processTemplate($var, undef, $self->{_viewFormTemplate});
|
||||
}
|
||||
|
||||
sub entryClass {
|
||||
return 'WebGUI::AssetCollateral::DataForm::Entry';
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub www_deleteAllEntriesConfirm {
|
||||
my $self = shift;
|
||||
return $self->session->privilege->insufficient() unless $self->canEdit;
|
||||
my $self = shift;
|
||||
return $self->session->privilege->insufficient
|
||||
unless $self->canEdit;
|
||||
$self->deleteAttachedFiles;
|
||||
$self->session->db->write("DELETE FROM `DataForm_entry` WHERE `assetId`=?", [$self->getId]);
|
||||
return $self->www_view;
|
||||
$self->entryClass->purgeAssetEntries($self);
|
||||
$self->{_mode} = 'list';
|
||||
return $self->www_view;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
|
|
@ -926,35 +981,45 @@ sub www_deleteAllEntriesConfirm {
|
|||
|
||||
#-------------------------------------------------------------------
|
||||
sub www_deleteEntry {
|
||||
my $self = shift;
|
||||
return $self->session->privilege->insufficient() unless $self->canEdit;
|
||||
my $self = shift;
|
||||
return $self->session->privilege->insufficient
|
||||
unless $self->canEdit;
|
||||
my $entryId = $self->session->form->process("entryId");
|
||||
$self->deleteAttachedFiles(entryId => $entryId);
|
||||
$self->deleteCollateral("DataForm_entry","DataForm_entryId",$entryId);
|
||||
$self->session->stow->set("mode","list");
|
||||
return $self->www_view;
|
||||
$self->deleteAttachedFiles(entryId => $entryId);
|
||||
$self->entryClass->new($self, $entryId)->delete;
|
||||
$self->{_mode} = 'list';
|
||||
return $self->www_view;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub www_deleteFieldConfirm {
|
||||
my $self = shift;
|
||||
return $self->session->privilege->insufficient() unless $self->canEdit;
|
||||
$self->deleteField($self->session->form->process("fieldName"));
|
||||
return "";
|
||||
return $self->session->privilege->insufficient
|
||||
unless $self->canEdit;
|
||||
my $newSelf = $self->addRevision;
|
||||
$newSelf->deleteField($self->session->form->process("fieldName"));
|
||||
$newSelf->{_mode} = 'form';
|
||||
WebGUI::VersionTag->autoCommitWorkingIfEnabled($self->session);
|
||||
return $newSelf->www_view;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub www_deleteTabConfirm {
|
||||
my $self = shift;
|
||||
return $self->session->privilege->insufficient() unless $self->canEdit;
|
||||
$self->deleteTab($self->session->form->process("tabId"));
|
||||
return "";
|
||||
my $self = shift;
|
||||
return $self->session->privilege->insufficient
|
||||
unless $self->canEdit;
|
||||
my $newSelf = $self->addRevision;
|
||||
$newSelf->deleteTab($self->session->form->process("tabId"));
|
||||
$newSelf->{_mode} = 'form';
|
||||
WebGUI::VersionTag->autoCommitWorkingIfEnabled($self->session);
|
||||
return $newSelf->www_view;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub www_editField {
|
||||
my $self = shift;
|
||||
return $self->session->privilege->insufficient() unless $self->canEdit;
|
||||
return $self->session->privilege->insufficient
|
||||
unless $self->canEdit;
|
||||
my $i18n = WebGUI::International->new($self->session,"Asset_DataForm");
|
||||
my $fieldName = shift || $self->session->form->process("fieldName");
|
||||
my $field;
|
||||
|
|
@ -966,7 +1031,7 @@ sub www_editField {
|
|||
else {
|
||||
$field = {};
|
||||
}
|
||||
my $f = WebGUI::HTMLForm->new($self->session,-action=>$self->getUrl);
|
||||
my $f = WebGUI::HTMLForm->new($self->session, action => $self->getUrl);
|
||||
$f->hidden(
|
||||
name => "fieldName",
|
||||
value => $field->{name},
|
||||
|
|
@ -1093,7 +1158,8 @@ sub www_editField {
|
|||
#-------------------------------------------------------------------
|
||||
sub www_editFieldSave {
|
||||
my $self = shift;
|
||||
return $self->session->privilege->insufficient() unless $self->canEdit;
|
||||
return $self->session->privilege->insufficient
|
||||
unless $self->canEdit;
|
||||
my $form = $self->session->form;
|
||||
my $fieldName = $form->process('fieldName');
|
||||
my $newName = $self->session->url->urlize($form->process('newName') || $form->process('label'));
|
||||
|
|
@ -1112,44 +1178,74 @@ sub www_editFieldSave {
|
|||
}
|
||||
$newName .= $i;
|
||||
}
|
||||
my $field;
|
||||
my %field = (
|
||||
width => $form->process("width", 'integer'),
|
||||
label => $form->process("label"),
|
||||
tabId => $form->process("tabId") || undef,
|
||||
status => $form->process("status", 'selectBox'),
|
||||
type => $form->process("type", 'fieldType'),
|
||||
options => $form->process("options", 'textarea'),
|
||||
defaultValue => $form->process("defaultValue", 'textarea'),
|
||||
subtext => $form->process("subtext"),
|
||||
rows => $form->process("rows", 'integer'),
|
||||
vertical => $form->process("vertical", 'yesNo'),
|
||||
extras => $form->process("extras"),
|
||||
);
|
||||
my $newSelf = $self->addRevision;
|
||||
if ($fieldName) {
|
||||
if ($fieldName ne $newName) {
|
||||
$self->renameField($fieldName, $newName);
|
||||
$newSelf->renameField($fieldName, $newName);
|
||||
}
|
||||
$field = $self->getFieldConfig($newName);
|
||||
$newSelf->setField($newName, \%field);
|
||||
}
|
||||
else {
|
||||
$field = {
|
||||
name => $newName,
|
||||
};
|
||||
$self->getFieldConfig->{$newName} = $field;
|
||||
push @{ $self->getFieldOrder }, $newName;
|
||||
$newSelf->createField($newName, \%field);
|
||||
}
|
||||
|
||||
|
||||
$field->{width} = $form->process("width", 'integer');
|
||||
$field->{label} = $form->process("label");
|
||||
$field->{tabId} = $form->process("tabId") || undef;
|
||||
$field->{status} = $form->process("status", 'selectBox');
|
||||
$field->{type} = $form->process("type", 'fieldType');
|
||||
$field->{options} = $form->process("options", 'textarea');
|
||||
$field->{defaultValue} = $form->process("defaultValue", 'textarea');
|
||||
$field->{subtext} = $form->process("subtext");
|
||||
$field->{rows} = $form->process("rows", 'integer');
|
||||
$field->{vertical} = $form->process("vertical", 'yesNo');
|
||||
$field->{extras} = $form->process("extras"),
|
||||
if ($form->process("proceed") eq "editField") {
|
||||
return $newSelf->www_editField('new');
|
||||
}
|
||||
$newSelf->{_mode} = 'form';
|
||||
WebGUI::VersionTag->autoCommitWorkingIfEnabled($self->session);
|
||||
return $newSelf->www_view;
|
||||
}
|
||||
|
||||
sub createField {
|
||||
my $self = shift;
|
||||
my $fieldName = shift;
|
||||
my $field = shift;
|
||||
my $copy = { %{ $field }, name => $fieldName };
|
||||
|
||||
if ($self->getFieldConfig->{$fieldName}) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
$self->getFieldConfig->{$fieldName} = $copy;
|
||||
push @{ $self->getFieldOrder }, $fieldName;
|
||||
$self->_saveFieldConfig;
|
||||
if ($self->session->stow->get('whatNext') eq "editField" || $form->process("proceed") eq "editField") {
|
||||
return $self->www_editField('new');
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub setField {
|
||||
my $self = shift;
|
||||
my $fieldName = shift;
|
||||
my $field = shift;
|
||||
|
||||
my $fieldConfig = $self->getFieldConfig;
|
||||
if (!$fieldConfig->{$fieldName}) {
|
||||
return 0;
|
||||
}
|
||||
return "";
|
||||
$fieldConfig->{$fieldName} = $field;
|
||||
$self->_saveFieldConfig;
|
||||
return 1;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub www_editTab {
|
||||
my $self = shift;
|
||||
return $self->session->privilege->insufficient() unless $self->canEdit;
|
||||
return $self->session->privilege->insufficient
|
||||
unless $self->canEdit;
|
||||
my $i18n = WebGUI::International->new($self->session,"Asset_DataForm");
|
||||
my $tabId = shift || $self->session->form->process("tabId") || "new";
|
||||
my $tab;
|
||||
|
|
@ -1195,7 +1291,8 @@ sub www_editTab {
|
|||
#-------------------------------------------------------------------
|
||||
sub www_editTabSave {
|
||||
my $self = shift;
|
||||
return $self->session->privilege->insufficient() unless $self->canEdit;
|
||||
return $self->session->privilege->insufficient
|
||||
unless $self->canEdit;
|
||||
my $name = $self->session->form->process("name") || $self->session->form->process("label");
|
||||
$name = $self->session->url->urlize($name);
|
||||
my $tabId = $self->session->form->process('tabId');
|
||||
|
|
@ -1218,54 +1315,65 @@ sub www_editTabSave {
|
|||
if ($self->session->form->process("proceed") eq "editTab") {
|
||||
return $self->www_editTab("new");
|
||||
}
|
||||
$self->{_mode} = 'form';
|
||||
return "";
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub www_exportTab {
|
||||
my $self = shift;
|
||||
return $self->session->privilege->insufficient() unless $self->canEdit;
|
||||
my @exportRows;
|
||||
my $entries = $self->session->db->read("select * from DataForm_entry where assetId=?", [$self->getId]);
|
||||
my @exportFields;
|
||||
for my $field ( map { $self->getFieldConfig($_) } @{$self->getFieldOrder} ) {
|
||||
next
|
||||
if $field->{isMailField} && !$self->get('mailData');
|
||||
push @exportFields, $field->{name};
|
||||
}
|
||||
my $tsv = Text::CSV_XS->new({sep_char => "\t", eol => "\n", binary => 1});
|
||||
$tsv->combine(
|
||||
'entryId',
|
||||
'ipAddress',
|
||||
'username',
|
||||
'userId',
|
||||
'submissionDate',
|
||||
@exportFields,
|
||||
);
|
||||
my $outText = $tsv->string;
|
||||
my $self = shift;
|
||||
return $self->session->privilege->insufficient
|
||||
unless $self->canEdit;
|
||||
my @exportFields;
|
||||
for my $field ( map { $self->getFieldConfig($_) } @{$self->getFieldOrder} ) {
|
||||
next
|
||||
if $field->{isMailField} && !$self->get('mailData');
|
||||
push @exportFields, $field->{name};
|
||||
}
|
||||
my $tsv = Text::CSV_XS->new({sep_char => "\t", eol => "\n", binary => 1});
|
||||
$tsv->combine(
|
||||
'entryId',
|
||||
'ipAddress',
|
||||
'username',
|
||||
'userId',
|
||||
'submissionDate',
|
||||
@exportFields,
|
||||
);
|
||||
my $outText = $tsv->string;
|
||||
|
||||
while (my $entryData = $entries->hashRef) {
|
||||
my $entryFields = JSON::from_json($entryData->{entryData});
|
||||
$tsv->combine(
|
||||
$entryData->{DataForm_entryId},
|
||||
$entryData->{ipAddress},
|
||||
$entryData->{username},
|
||||
$entryData->{userId},
|
||||
WebGUI::DateTime->new($self->session, $entryData->{submissionDate})->webguiDate,
|
||||
@{ $entryFields }{@exportFields},
|
||||
);
|
||||
$outText .= $tsv->string;
|
||||
}
|
||||
$entries->finish;
|
||||
$self->session->http->setFilename($self->get("url").".tab","text/plain");
|
||||
return $outText;
|
||||
my $entryIter = $self->entryClass->iterateAll($self);
|
||||
|
||||
while (my $entry = $entryIter->()) {
|
||||
my $entryFields = $entry->fields;
|
||||
$tsv->combine(
|
||||
$entry->getId,
|
||||
$entry->ipAddress,
|
||||
$entry->username,
|
||||
$entry->userId,
|
||||
$entry->submissionDate->webguiDate,
|
||||
@{ $entryFields }{@exportFields},
|
||||
);
|
||||
$outText .= $tsv->string;
|
||||
}
|
||||
$self->session->http->setFilename($self->get("url").".tab","text/plain");
|
||||
return $outText;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub www_moveFieldDown {
|
||||
my $self = shift;
|
||||
return $self->session->privilege->insufficient() unless $self->canEdit;
|
||||
return $self->session->privilege->insufficient
|
||||
unless $self->canEdit;
|
||||
my $newSelf = $self->addRevision;
|
||||
my $fieldName = $self->session->form->process('fieldName');
|
||||
$self->moveFieldDown($fieldName);
|
||||
WebGUI::VersionTag->autoCommitWorkingIfEnabled($self->session);
|
||||
return $newSelf->www_view;
|
||||
}
|
||||
|
||||
sub moveFieldDown {
|
||||
my $self = shift;
|
||||
my $fieldName = shift;
|
||||
my $fieldOrder = $self->getFieldOrder;
|
||||
my $currentPos;
|
||||
for ($currentPos = 0; $currentPos < @$fieldOrder; $currentPos++) {
|
||||
|
|
@ -1282,14 +1390,24 @@ sub www_moveFieldDown {
|
|||
splice @$fieldOrder, $newPos, 0, splice(@$fieldOrder, $currentPos, 1);
|
||||
$self->_saveFieldConfig;
|
||||
}
|
||||
return "";
|
||||
return 1;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub www_moveFieldUp {
|
||||
my $self = shift;
|
||||
return $self->session->privilege->insufficient() unless $self->canEdit;
|
||||
return $self->session->privilege->insufficient
|
||||
unless $self->canEdit;
|
||||
my $newSelf = $self->addRevision;
|
||||
my $fieldName = $self->session->form->process('fieldName');
|
||||
$self->moveFieldUp($fieldName);
|
||||
WebGUI::VersionTag->autoCommitWorkingIfEnabled($self->session);
|
||||
return $newSelf->www_view;
|
||||
}
|
||||
|
||||
sub moveFieldUp {
|
||||
my $self = shift;
|
||||
my $fieldName = shift;
|
||||
my $fieldOrder = $self->getFieldOrder;
|
||||
my $currentPos;
|
||||
for ($currentPos = 0; $currentPos < @$fieldOrder; $currentPos++) {
|
||||
|
|
@ -1307,14 +1425,25 @@ sub www_moveFieldUp {
|
|||
splice @$fieldOrder, $newPos, 0, splice(@$fieldOrder, $currentPos, 1);
|
||||
$self->_saveFieldConfig;
|
||||
}
|
||||
return "";
|
||||
return 1;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub www_moveTabRight {
|
||||
my $self = shift;
|
||||
return $self->session->privilege->insufficient() unless $self->canEdit;
|
||||
return $self->session->privilege->insufficient
|
||||
unless $self->canEdit;
|
||||
my $newSelf = $self->addRevision;
|
||||
my $tabId = $self->session->form->process('tabId');
|
||||
$self->moveTabRight($tabId);
|
||||
WebGUI::VersionTag->autoCommitWorkingIfEnabled($self->session);
|
||||
return $newSelf->www_view;
|
||||
}
|
||||
|
||||
|
||||
sub moveTabRight {
|
||||
my $self = shift;
|
||||
my $tabId = shift;
|
||||
my $tabOrder = $self->getTabOrder;
|
||||
my $currentPos;
|
||||
for ($currentPos = 0; $currentPos < @$tabOrder; $currentPos++) {
|
||||
|
|
@ -1326,14 +1455,25 @@ sub www_moveTabRight {
|
|||
splice @$tabOrder, $newPos, 0, splice(@$tabOrder, $currentPos, 1);
|
||||
$self->_saveFieldConfig;
|
||||
}
|
||||
return "";
|
||||
return 1;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub www_moveTabLeft {
|
||||
my $self = shift;
|
||||
return $self->session->privilege->insufficient() unless $self->canEdit;
|
||||
return $self->session->privilege->insufficient
|
||||
unless $self->canEdit;
|
||||
my $newSelf = $self->addRevision;
|
||||
my $tabId = $self->session->form->process('tabId');
|
||||
$self->moveTabLeft($tabId);
|
||||
WebGUI::VersionTag->autoCommitWorkingIfEnabled($self->session);
|
||||
return $newSelf->www_view;
|
||||
}
|
||||
|
||||
|
||||
sub moveTabLeft {
|
||||
my $self = shift;
|
||||
my $tabId = shift;
|
||||
my $tabOrder = $self->getTabOrder;
|
||||
my $currentPos;
|
||||
for ($currentPos = 0; $currentPos < @$tabOrder; $currentPos++) {
|
||||
|
|
@ -1345,25 +1485,18 @@ sub www_moveTabLeft {
|
|||
splice @$tabOrder, $newPos, 0, splice(@$tabOrder, $currentPos, 1);
|
||||
$self->_saveFieldConfig;
|
||||
}
|
||||
return "";
|
||||
return 1;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub www_process {
|
||||
my $self = shift;
|
||||
return $self->session->privilege->insufficient() unless $self->canView;
|
||||
return $self->session->privilege->insufficient
|
||||
unless $self->canView;
|
||||
my $session = $self->session;
|
||||
my $db = $self->session->db;
|
||||
my $i18n = WebGUI::International->new($session,"Asset_DataForm");
|
||||
my $entryId = $self->session->form->process('entryId');
|
||||
my $entry;
|
||||
my $entryData;
|
||||
if ($entryId) {
|
||||
my $entry = $self->getCollateral("DataForm_entry","DataForm_entryId", $entryId);
|
||||
eval {
|
||||
$entryData = JSON::from_json($entry->{entryData});
|
||||
};
|
||||
}
|
||||
my $entry = $self->entryClass->new($self, ( $entryId ? $entryId : () ) );
|
||||
|
||||
my $var = $self->getTemplateVars;
|
||||
|
||||
|
|
@ -1372,9 +1505,9 @@ sub www_process {
|
|||
for my $field (values %{ $self->getFieldConfig }) {
|
||||
my $default = $field->{defaultValue};
|
||||
WebGUI::Macro::process($self->session, \$default);
|
||||
my $value = $entryData->{ $field->{name} } || $default;
|
||||
my $value = $entry->field( $field->{name} ) || $default;
|
||||
if ($field->{status} eq "required" || $field->{status} eq "editable") {
|
||||
$value = $self->session->form->process($field->{name}, $field->{type}, undef, {
|
||||
$value = $session->form->process($field->{name}, $field->{type}, undef, {
|
||||
defaultValue => $default,
|
||||
value => $value,
|
||||
});
|
||||
|
|
@ -1385,41 +1518,31 @@ sub www_process {
|
|||
"error.message" => $field->{label} . " " . $i18n->get(29) . ".",
|
||||
};
|
||||
}
|
||||
$entryData->{ $field->{name} } = $value;
|
||||
$entry->field($field->{name}, $value);
|
||||
}
|
||||
|
||||
# Process CAPTCHA
|
||||
if ( $self->useCaptcha ) {
|
||||
if ( !$self->session->form->process( 'captcha', 'captcha' ) ) {
|
||||
push @errors, {
|
||||
"error.message" => $i18n->get( 'error captcha' ),
|
||||
};
|
||||
}
|
||||
if ( $self->useCaptcha && !$session->form->process( 'captcha', 'captcha' ) ) {
|
||||
push @errors, {
|
||||
"error.message" => $i18n->get( 'error captcha' ),
|
||||
};
|
||||
}
|
||||
|
||||
$var->{error_loop} = \@errors;
|
||||
$var = $self->getRecordTemplateVars($var, $entryData);
|
||||
$var = $self->getRecordTemplateVars($var, $entry);
|
||||
if (@errors) {
|
||||
$self->prepareView($var);
|
||||
return $self->processStyle($self->view);
|
||||
$self->prepareFormView;
|
||||
return $self->processStyle($self->viewForm($var, $entry));
|
||||
}
|
||||
if ($self->get("mailData") && !$entryId) {
|
||||
$self->sendEmail($var, $entryData);
|
||||
$self->sendEmail($var, $entry);
|
||||
}
|
||||
if ($self->get('storeData')) {
|
||||
my $entryJSON = JSON::to_json($entryData);
|
||||
my $collData = {
|
||||
DataForm_entryId => $entryId,
|
||||
userId => $self->session->user->userId,
|
||||
username => $self->session->user->username,
|
||||
ipAddress => $self->session->env->getIp,
|
||||
submissionDate => WebGUI::DateTime->new($self->session, time())->toDatabase,
|
||||
entryData => $entryJSON,
|
||||
};
|
||||
$self->setCollateral("DataForm_entry","DataForm_entryId", $collData, 0, 1);
|
||||
$entry->save;
|
||||
}
|
||||
return $self->session->style->process($self->processTemplate($var,$self->get("acknowlegementTemplateId")),$self->get("styleTemplateId"))
|
||||
return $self->processStyle($self->processTemplate($var,$self->get("acknowlegementTemplateId")))
|
||||
if $self->defaultViewForm;
|
||||
return '';
|
||||
}
|
||||
|
||||
1;
|
||||
|
|
|
|||
247
lib/WebGUI/AssetCollateral/DataForm/Entry.pm
Normal file
247
lib/WebGUI/AssetCollateral/DataForm/Entry.pm
Normal file
|
|
@ -0,0 +1,247 @@
|
|||
package WebGUI::AssetCollateral::DataForm::Entry;
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
our $VERSION = '0.0.1';
|
||||
|
||||
use Class::InsideOut qw(readonly private public id register);
|
||||
use WebGUI::Exception;
|
||||
use WebGUI::Asset::Wobject::DataForm;
|
||||
|
||||
readonly session => my %session;
|
||||
private entryData => my %entryData;
|
||||
private entryId => my %entryId;
|
||||
readonly assetId => my %assetId;
|
||||
readonly asset => my %asset;
|
||||
private userId => my %userId;
|
||||
readonly username => my %username;
|
||||
public ipAddress => my %ipAddress;
|
||||
public submissionDate => my %submissionDate;
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub delete {
|
||||
my $self = shift;
|
||||
$self->session->db->deleteRow('DataForm_entry', 'DataForm_entryId', $self->getId);
|
||||
delete $entryId{ id $self };
|
||||
return 1;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub deleteField {
|
||||
my $self = shift;
|
||||
my ($field) = @_;
|
||||
my $entryData = $entryData{ id $self };
|
||||
if ( !exists $entryData{ $field } ) {
|
||||
WebGUI::Error::InvalidParam->throw(error=>"cannot delete field that doesn't exist");
|
||||
}
|
||||
return delete $entryData{$field};
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub field {
|
||||
my $self = shift;
|
||||
my $fieldName = shift;
|
||||
my $entryData = $entryData{ id $self };
|
||||
if (@_) {
|
||||
my $fieldValue = shift;
|
||||
return $entryData->{ $fieldName } = $fieldValue;
|
||||
}
|
||||
return $entryData->{ $fieldName };
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub fields {
|
||||
my $self = shift;
|
||||
my $entryData = $entryData{ id $self };
|
||||
if (@_) {
|
||||
my $newData = shift;
|
||||
@{ $entryData }{ keys %$newData } = values %$newData;
|
||||
}
|
||||
return { %{ $entryData } };
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub getCount {
|
||||
my $class = shift;
|
||||
my $asset = shift;
|
||||
my $entryCount = $asset->session->dbSlave->quickScalar(
|
||||
"SELECT COUNT(*) FROM `DataForm_entry` WHERE `assetId` = ?",
|
||||
[$asset->getId]
|
||||
);
|
||||
return $entryCount;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub getId {
|
||||
my $self = shift;
|
||||
return $entryId{ id $self };
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub iterateAll {
|
||||
my $class = shift;
|
||||
my $asset = shift;
|
||||
my $sth = $asset->session->dbSlave->read("SELECT `DataForm_entryId`, `userId`, `username`, `ipAddress`, `submissionDate`, `entryData` FROM `DataForm_entry` WHERE `assetId` = ? ORDER BY `submissionDate` DESC", [$asset->getId]);
|
||||
my $sub = sub {
|
||||
if (defined wantarray) {
|
||||
my $properties = $sth->hashRef;
|
||||
if ($properties) {
|
||||
my $entry = $class->new($asset);
|
||||
$entry->setFromHash($properties);
|
||||
return $entry;
|
||||
}
|
||||
else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
else {
|
||||
$sth->arrayRef;
|
||||
}
|
||||
};
|
||||
return $sub;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub new {
|
||||
my ($class, $asset, $entryId) = @_;
|
||||
my $self = register($class);
|
||||
my $id = id $self;
|
||||
my $session;
|
||||
if (defined $asset && ref $asset && $asset->isa('WebGUI::Asset::Wobject::DataForm')) {
|
||||
$session = $session{$id} = $asset->session;
|
||||
$assetId{$id} = $asset->getId;
|
||||
$asset{$id} = $asset;
|
||||
}
|
||||
elsif (defined $asset && ref $asset && $asset->isa('WebGUI::Session') && $entryId) {
|
||||
$session = $session{$id} = $asset;
|
||||
undef $asset;
|
||||
}
|
||||
else {
|
||||
WebGUI::Error::InvalidObject->throw(error=>'need a DataForm object or a session and entryId', got => ref $asset, expected => 'WebGUI::Asset::Wobject::DataForm');
|
||||
}
|
||||
if ($entryId) {
|
||||
my $properties = $session->db->getRow('DataForm_entry', 'DataForm_entryId', $entryId);
|
||||
if (! defined $properties->{'DataForm_entryId'}) {
|
||||
WebGUI::Error::ObjectNotFound->throw(error => 'no such DataForm_entryId', id => $entryId);
|
||||
}
|
||||
$session = $session{$id} = $asset->session;
|
||||
if (! $assetId{$id}) {
|
||||
$assetId{$id} = $properties->{assetId};
|
||||
$asset{$id} = WebGUI::Asset::Wobject::DataForm->new($session, $properties->{assetId});
|
||||
}
|
||||
$self->setFromHash($properties);
|
||||
}
|
||||
else {
|
||||
$self->user($session->user);
|
||||
$self->ipAddress($session->env->getIp);
|
||||
$self->submissionDate(WebGUI::DateTime->new($session, time));
|
||||
$entryData{id $self} = {};
|
||||
}
|
||||
return $self;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub purgeAssetEntries {
|
||||
my $class = shift;
|
||||
my $asset = shift;
|
||||
$asset->session->db->write("DELETE FROM `DataForm_entry` WHERE `assetId`=?", [$asset->getId]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub renameField {
|
||||
my $self = shift;
|
||||
my ($oldField, $newField) = @_;
|
||||
my $entryData = $entryData{ id $self };
|
||||
if ( !exists $entryData{ $oldField } ) {
|
||||
WebGUI::Error::InvalidParam->throw(error=>"cannot rename field that doesn't exist");
|
||||
}
|
||||
elsif ( exists $entryData{ $newField } ) {
|
||||
WebGUI::Error::InvalidParam->throw(error=>'cannot rename field over existing field');
|
||||
}
|
||||
$entryData->{$newField} = delete $entryData{$newField};
|
||||
return $newField;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub save {
|
||||
my $self = shift;
|
||||
my $id = id $self;
|
||||
my $entryData = $entryData{ $id };
|
||||
if (!$entryData || ref $entryData ne 'HASH') {
|
||||
$entryData = {};
|
||||
}
|
||||
my %dbData = (
|
||||
DataForm_entryId => $entryId{$id} || 'new',
|
||||
userId => $userId{$id},
|
||||
username => $username{$id},
|
||||
ipAddress => $ipAddress{$id},
|
||||
assetId => $assetId{$id},
|
||||
submissionDate => $submissionDate{$id}->toDatabase,
|
||||
entryData => JSON::to_json($entryData),
|
||||
);
|
||||
return $entryId{$id} = $session{$id}->db->setRow('DataForm_entry', 'DataForm_entryId', \%dbData);
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub setFromHash {
|
||||
my $self = shift;
|
||||
my $id = id $self;
|
||||
my $properties = shift;
|
||||
my $session = $self->session;
|
||||
$entryId{$id} = $properties->{DataForm_entryId}
|
||||
if defined $properties->{DataForm_entryId};
|
||||
$userId{$id} = $properties->{userId}
|
||||
if defined $properties->{userId};
|
||||
$username{$id} = $properties->{username}
|
||||
if defined $properties->{username};
|
||||
$ipAddress{$id} = $properties->{ipAddress}
|
||||
if defined $properties->{ipAddress};
|
||||
$submissionDate{$id} = WebGUI::DateTime->new($session, $properties->{submissionDate})
|
||||
if defined $properties->{submissionDate};
|
||||
if (defined $properties->{entryData}) {
|
||||
if (ref $properties->{entryData} && ref $properties->{entryData} eq 'HASH') {
|
||||
$entryData{$id} = $properties->{entryData};
|
||||
}
|
||||
else {
|
||||
if (!eval { $entryData{$id} = JSON::from_json($properties->{entryData}); 1 } ) {
|
||||
$session->log->warn('DataForm entry ' . $entryId{$id} . ' has invalid data, ignoring');
|
||||
}
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub user {
|
||||
my $self = shift;
|
||||
my $id = id $self;
|
||||
if (@_) {
|
||||
my $user = shift;
|
||||
if (!defined $user || !ref $user || !$user->isa('WebGUI::User')) {
|
||||
WebGUI::Error::InvalidObject->throw(expected=>'WebGUI::User', got=>(ref $user), error=>'Need a user.');
|
||||
}
|
||||
$userId{$id} = $user->userId;
|
||||
$username{$id} = $user->username;
|
||||
}
|
||||
return $userId{$id};
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub userId {
|
||||
my $self = shift;
|
||||
my $id = id $self;
|
||||
if (@_) {
|
||||
my $userId = shift;
|
||||
my $user = WebGUI::User->new($self->session, $userId);
|
||||
if (!defined $user) {
|
||||
WebGUI::Error::InvalidParam->throw(error=>$userId . ' is not a valud userId');
|
||||
}
|
||||
$userId{$id} = $userId;
|
||||
$username{$id} = $user->username;
|
||||
}
|
||||
return $userId{$id};
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
142
t/Asset/Wobject/DataForm/DataForm.t
Normal file
142
t/Asset/Wobject/DataForm/DataForm.t
Normal file
|
|
@ -0,0 +1,142 @@
|
|||
#-------------------------------------------------------------------
|
||||
# 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
|
||||
#-------------------------------------------------------------------
|
||||
|
||||
use FindBin;
|
||||
use strict;
|
||||
use File::Spec;
|
||||
use lib "$FindBin::Bin/../../../lib";
|
||||
|
||||
##The goal of this test is to test the creation of Article Wobjects.
|
||||
|
||||
use WebGUI::Test;
|
||||
use WebGUI::Session;
|
||||
use Test::More 'no_plan'; # tests => 23; # increment this value for each test you create
|
||||
use WebGUI::Asset::Wobject::Article;
|
||||
|
||||
my $session = WebGUI::Test->session;
|
||||
|
||||
# Do our work in the import node
|
||||
my $node = WebGUI::Asset->getImportNode($session);
|
||||
|
||||
# Lets create an article wobject using all defaults then test to see if those defaults were set
|
||||
#
|
||||
# This is all commented out right now because it seems the API is not intended to set defaultValues
|
||||
# based on an assets defintion. This may change down the line, so lets just comment this out for now.
|
||||
#
|
||||
#my $articleDefaults = {
|
||||
# cacheTimeout => 3600,
|
||||
# templateId => 'PBtmpl0000000000000002',
|
||||
# linkURL => undef,
|
||||
# linkTitle => undef,
|
||||
# storageId => undef,
|
||||
#};
|
||||
|
||||
my $versionTag = WebGUI::VersionTag->getWorking($session);
|
||||
$versionTag->set({name=>"Article Test"});
|
||||
my $article = $node->addChild({className=>'WebGUI::Asset::Wobject::Article'});
|
||||
|
||||
# Test for a sane object type
|
||||
isa_ok($article, 'WebGUI::Asset::Wobject::Article');
|
||||
|
||||
# Test to see if all of the default properties are correct
|
||||
#foreach my $defaultProperty (keys %{$articleDefaults}) {
|
||||
# is ($article->get($defaultProperty), $articleDefaults->{$defaultProperty}, "default $defaultProperty is ".$articleDefaults->{$defaultProperty});
|
||||
#}
|
||||
|
||||
# Test to see if we can set new values
|
||||
my $newArticleSettings = {
|
||||
cacheTimeout => 124,
|
||||
templateId => "PBtmpl0000000000000084",
|
||||
linkURL => "http://www.snapcount.org",
|
||||
linkTitle => "I'm thinking of getting metal legs",
|
||||
storageId => "ImadeThisUp",
|
||||
};
|
||||
$article->update($newArticleSettings);
|
||||
|
||||
foreach my $newSetting (keys %{$newArticleSettings}) {
|
||||
is ($article->get($newSetting), $newArticleSettings->{$newSetting}, "updated $newSetting is ".$newArticleSettings->{$newSetting});
|
||||
}
|
||||
|
||||
# Test the duplicate method... not for assets, just the extended duplicate functionality of the article wobject
|
||||
my $filename = "page_title.jpg";
|
||||
my $pathedFile = WebGUI::Test->getTestCollateralPath($filename);
|
||||
|
||||
# Use some test collateral to create a storage location and assign it to our article
|
||||
my $storage = WebGUI::Storage::Image->create($session);
|
||||
my $storedFilename = $storage->addFileFromFilesystem($pathedFile);
|
||||
my $filenameOK = is ($storedFilename, $filename, 'storage created correctly');
|
||||
|
||||
diag(join("\n", @{ $storage->getErrors })) unless $filenameOK;
|
||||
|
||||
$article->update({storageId=>$storage->getId});
|
||||
my $storageOK = is($article->get('storageId'), $storage->getId, 'correct storage id stored');
|
||||
|
||||
SKIP: {
|
||||
|
||||
skip 'storage test setup problem', 3 unless $filenameOK and $storageOK;
|
||||
|
||||
my $duplicateArticle = $article->duplicate();
|
||||
isa_ok($duplicateArticle, 'WebGUI::Asset::Wobject::Article');
|
||||
|
||||
my $duplicateStorageId = $duplicateArticle->get("storageId");
|
||||
my $duplicateStorage = WebGUI::Storage::Image->get($session,$duplicateStorageId);
|
||||
my $duplicateFilename = $duplicateStorage->getFiles->[0];
|
||||
|
||||
is ($duplicateFilename, $filename, "duplicate method copies collateral");
|
||||
|
||||
# Test the purge method to see if it gets rid of the collateral
|
||||
|
||||
$duplicateArticle->purge();
|
||||
|
||||
# The get method will create the directory if it doesnt exist... very strange.
|
||||
$duplicateStorage = WebGUI::Storage::Image->get($session,$duplicateStorageId);
|
||||
|
||||
# so lets check for the file instead
|
||||
$duplicateFilename = $duplicateStorage->getFiles->[0];
|
||||
|
||||
is ($duplicateFilename, undef, 'purge method deletes collateral');
|
||||
|
||||
}
|
||||
|
||||
# Lets make sure the view method returns something.
|
||||
# This is not a very good test but I need to do it to test the purgeCache method anyways =)
|
||||
|
||||
is ($article->{_viewTemplate}, undef, 'internal template cache unset until prepareView is called');
|
||||
$article->prepareView;
|
||||
isnt ($article->{_viewTemplate}, undef, 'internal template cache set by prepare view');
|
||||
isa_ok ($article->{_viewTemplate}, 'WebGUI::Asset::Template', 'internal template cache');
|
||||
my $output = $article->view;
|
||||
isnt ($output, "", 'view method returns something');
|
||||
|
||||
# Lets see if caching works
|
||||
my $cachedOutput = WebGUI::Cache->new($session, 'view_'.$article->getId)->get;
|
||||
is ($output, $cachedOutput, 'view method caches output');
|
||||
|
||||
# Lets see if the purgeCache method works
|
||||
$article->purgeCache;
|
||||
$cachedOutput = WebGUI::Cache->new($session, 'view_'.$article->getId)->get; # Check cache post purge
|
||||
isnt ($output, $cachedOutput, 'purgeCache method deletes cache');
|
||||
|
||||
|
||||
TODO: {
|
||||
local $TODO = "Tests to make later";
|
||||
ok(0, 'Test exportAssetData method');
|
||||
ok(0, 'Test getStorageLocation method');
|
||||
ok(0, 'Test indexContent method');
|
||||
ok(0, 'Test purgeRevision method');
|
||||
ok(0, 'Test www_deleteFile method');
|
||||
ok(0, 'Test www_view method... maybe?');
|
||||
}
|
||||
|
||||
END {
|
||||
# Clean up after thy self
|
||||
$versionTag->rollback();
|
||||
}
|
||||
|
||||
|
|
@ -13,8 +13,7 @@ use strict;
|
|||
use lib "$FindBin::Bin/../../lib";
|
||||
|
||||
##The goal of this test is to diagnose problems in DataForms.
|
||||
## Orphaned DataForms with no Asset table entries
|
||||
##
|
||||
## Orphaned DataForms with no Asset table entries
|
||||
|
||||
use WebGUI::Test;
|
||||
use WebGUI::Session;
|
||||
Loading…
Add table
Add a link
Reference in a new issue