This commit is contained in:
Patrick Donelan 2008-09-24 07:10:46 +00:00
parent 4fd276f0e5
commit dd5d0639b2
2 changed files with 580 additions and 137 deletions

View file

@ -14,6 +14,7 @@ use strict;
use warnings;
use version;
use Tie::IxHash;
use JSON;
use WebGUI::International;
use WebGUI::Utility;
use WebGUI::Text;
@ -328,6 +329,43 @@ sub deleteField {
#-------------------------------------------------------------------
=head2 deleteThingData ( )
Deletes data in a Thing.
=head3 thingId
The id of the Thing that should be deleted.
=head3 thingDataId
The id of row of data that should be deleted.
=cut
sub deleteThingData {
my $self = shift;
my $thingId = shift;
my $thingDataId = shift;
my $db = $self->session->db;
my ($groupIdEdit) = $db->quickArray("select groupIdEdit from Thingy_things where thingId=?",[$thingId]);
return undef unless $self->hasPrivileges($groupIdEdit);
$self->deleteCollateral("Thingy_".$thingId,"thingDataId",$thingDataId);
my ($onDeleteWorkflowId) = $db->quickArray("select onDeleteWorkflowId from Thingy_things where thingId=?"
,[$thingId]);
if ($onDeleteWorkflowId){
$self->triggerWorkflow($onDeleteWorkflowId);
}
return undef;
}
#-------------------------------------------------------------------
=head2 deleteThing ( thingId )
Deletes a Thing and its fields from Collateral and drops the things table.
@ -353,6 +391,105 @@ sub deleteThing {
return undef;
}
#-------------------------------------------------------------------
=head2 editThingDataSave ( )
Saves a row of thing data and triggers the appropriate workflow triggers.
=head3 thingId
The id of the Thing which this row of data is an instance of.
=head3 thingDataId
The id of the row of data. This can be an existing id or 'new'.
=head3 thingData
An optional hashref containing the new data. This will override values passed in by a form post.
Use this hashref for testing purposes.
=cut
sub editThingDataSave {
my $self = shift;
my $thingId = shift;
my $thingDataId = shift;
my $thingData = shift;
my $session = $self->session;
my (%thingData,$fields,@errors,$hadErrors,$newThingDataId);
my $i18n = WebGUI::International->new($session, 'Asset_Thingy');
if ($thingDataId eq "new"){
$thingData{dateCreated} = time();
$thingData{createdById} = $session->user->userId;
$thingData{ipAddress} = $session->env->getIp;
}
else {
%thingData = $session->db->quickHash("select * from ".$session->db->dbh->quote_identifier("Thingy_".$thingId)
." where thingDataId = ?",[$thingDataId]);
}
%thingData = ( %thingData,
thingDataId=>$thingDataId,
updatedById=>$session->user->userId,
updatedByName=>$session->user->username,
lastUpDated=>time(),
);
$fields = $session->db->read('select * from Thingy_fields where assetId = ? and thingId = ? order by sequenceNumber',
[$self->get("assetId"),$thingId]);
while (my $field = $fields->hashRef) {
my $fieldName = 'field_'.$field->{fieldId};
my $fieldValue;
if ($field->{status} eq "required" || $field->{status} eq "editable"){
my $fieldType = $field->{fieldType};
$fieldType = "" if ($fieldType =~ m/^otherThing/x);
# Modify the defaultValue for certain field types. For most types we want to use
# the default in the database, for these we want the last known value for this thingData
if ( $fieldType eq "File" || $fieldType eq "Image" ) {
$field->{ defaultValue } = $thingData{ "field_" . $field->{ fieldId } };
}
$fieldValue = $thingData->{$fieldName} || $session->form->process($fieldName,$fieldType,$field->{defaultValue},$field);
}
if ($field->{status} eq "required" && ($fieldValue =~ /^\s$/x || $fieldValue eq "" || !(defined $fieldValue))) {
push (@errors,{
"error_message"=>$field->{label}." ".$i18n->get('is required error').".",
});
#$hadErrors = 1;
}
if ($field->{status} eq "hidden") {
$fieldValue = $field->{defaultValue};
WebGUI::Macro::process($self->session,\$fieldValue);
}
if ($field->{status} eq "visible") {
$fieldValue = $field->{defaultValue};
#WebGUI::Macro::process($self->session,\$fieldValue);
}
$thingData{$fieldName} = $fieldValue;
}
$newThingDataId = $self->setCollateral("Thingy_".$thingId,"thingDataId",\%thingData,0,0);
# trigger workflow
if($thingDataId eq "new"){
my ($onAddWorkflowId) = $session->db->quickArray("select onAddWorkflowId from Thingy_things where thingId=?"
,[$thingId]);
if ($onAddWorkflowId){
$self->triggerWorkflow($onAddWorkflowId);
}
}else{
my ($onEditWorkflowId) = $session->db->quickArray("select onEditWorkflowId from Thingy_things where thingId=?"
,[$thingId]);
if ($onEditWorkflowId){
$self->triggerWorkflow($onEditWorkflowId);
}
}
return($newThingDataId,\@errors);
}
#-------------------------------------------------------------------
@ -822,6 +959,65 @@ sub getThing {
return $self->session->db->quickHashRef("select * from Thingy_things where thingId=?",[$thingId]);
}
#-------------------------------------------------------------------
=head2 getViewThingVars ( )
Returns the field values of a thing instance and the title for its view screen in a tmpl var hashref.
If a tmpl var hashref is supplied values will be appended to that.
=cut
sub getViewThingVars {
my ($self, $thingId, $thingDataId,$var) = @_;
my $db = $self->session->db;
my (@field_loop, @viewScreenTitleFields, $viewScreenTitle);
my %thingData = $db->quickHash("select * from ".$db->dbh->quote_identifier("Thingy_".$thingId)
." where thingDataId = ?",[$thingDataId]);
if (%thingData) {
my $fields = $db->read('select * from Thingy_fields where assetId = ? and thingId = ? order by sequenceNumber',
[$self->get('assetId'),$thingId]);
while (my %field = $fields->hash) {
next unless ($field{display} eq '1');
my $hidden = ($field{status} eq "hidden" && !$self->session->var->get("adminOn"));
my $originalValue = $thingData{"field_".$field{fieldId}};
my $value = $self->getFieldValue($originalValue,\%field);
my $otherThingUrl;
if ($field{fieldType} =~ m/^otherThing/x) {
my $otherThingId = $field{fieldType};
$otherThingId =~ s/^otherThing_//x;
if($self->canViewThing($otherThingId)){
$otherThingUrl = $self->session->url->append(
$self->getUrl,
"func=viewThingData;thingId=$otherThingId;thingDataId=$originalValue"
);
}
}
my %fieldProperties = (
"id" => $field{fieldId},
"name" => "field_".$field{fieldId},
"value" => $value,
"label" => $field{label},
"isHidden" => $hidden,
"url" => $otherThingUrl,
);
push(@viewScreenTitleFields,$value) if ($field{viewScreenTitle});
push(@field_loop, { map {("field_".$_ => $fieldProperties{$_})} keys(%fieldProperties) });
}
$var->{viewScreenTitle} = join(" ",@viewScreenTitleFields);
$var->{field_loop} = \@field_loop;
return $var;
}
else{
return undef;
}
}
#-------------------------------------------------------------------
@ -1143,6 +1339,7 @@ sub www_deleteThingConfirm {
return $self->www_manage;
}
#-------------------------------------------------------------------
=head2 www_deleteThingDataConfirm ( )
@ -1162,19 +1359,55 @@ sub www_deleteThingDataConfirm {
my ($groupIdEdit) = $db->quickArray("select groupIdEdit from Thingy_things where thingId=?",[$thingId]);
return $self->session->privilege->insufficient() unless $self->hasPrivileges($groupIdEdit);
$self->deleteCollateral("Thingy_".$thingId,"thingDataId",$thingDataId);
my ($onDeleteWorkflowId) = $db->quickArray("select onDeleteWorkflowId from Thingy_things where thingId=?"
,[$thingId]);
if ($onDeleteWorkflowId){
$self->triggerWorkflow($onDeleteWorkflowId);
}
$self->deleteThingData($thingId,$thingDataId);
return $self->www_search;
}
#-------------------------------------------------------------------
=head2 www_deleteThingDataConfirmViaAjax ( )
Deletes data in a Thing.
=cut
sub www_deleteThingDataViaAjax {
my $self = shift;
my $session = $self->session;
my $db = $session->db;
my $thingId = $self->session->form->process("thingId");
my $thingDataId = $self->session->form->process('thingDataId');
$session->http->setMimeType("application/json");
unless ($thingId && $thingDataId) {
$session->http->setStatus("400", "Bad Request");
return JSON->new->utf8->encode([
{message => "Can't get thing data without a thingId and a thingDataId."}
]);
}
my $thingProperties = $self->getThing($thingId);
if ($thingProperties->{thingId}){
my ($groupIdEdit) = $db->quickArray("select groupIdEdit from Thingy_things where thingId=?",[$thingId]);
return $session->privilege->insufficient() unless $self->hasPrivileges($groupIdEdit);
$self->deleteThingData($thingId,$thingDataId);
$session->http->setMimeType("application/json");
return JSON->new->utf8->encode([{message => "Data with thingDataId $thingDataId was deleted."}]);
}
else {
$session->http->setStatus("404", "Not Found");
return JSON->new->utf8->encode([{message => "The thingId you specified can not be found."}]);
}
}
#-------------------------------------------------------------------
=head2 www_editThing ( )
Shows a form to edit or add a Thing. General properties of a Thing are stored when the form is submitted.
@ -1890,7 +2123,7 @@ sub www_editThingDataSave {
my $self = shift;
my $session = $self->session;
my ($var,$newThingDataId, $fields,%thingData,@errors,$hadErrors,$otherThingId);
my ($var,$newThingDataId, $fields,%thingData,@errors,$errors,$otherThingId);
my ($privilegedGroup,$workflowId);
my $thingId = $session->form->process('thingId');
my $thingDataId = $session->form->process('thingDataId');
@ -1905,73 +2138,11 @@ sub www_editThingDataSave {
}
return $session->privilege->insufficient() unless $self->hasPrivileges($privilegedGroup);
if ($thingDataId eq "new"){
$thingData{dateCreated} = time();
$thingData{createdById} = $session->user->userId;
$thingData{ipAddress} = $session->env->getIp;
}
else {
%thingData = $session->db->quickHash("select * from ".$session->db->dbh->quote_identifier("Thingy_".$thingId)
." where thingDataId = ?",[$thingDataId]);
}
($newThingDataId,$errors) = $self->editThingDataSave($thingId,$thingDataId);
%thingData = ( %thingData,
thingDataId=>$thingDataId,
updatedById=>$session->user->userId,
updatedByName=>$session->user->username,
lastUpDated=>time(),
);
$fields = $session->db->read('select * from Thingy_fields where assetId = '.$session->db->quote($self->get("assetId")).' and thingId = '.$session->db->quote($thingId).' order by sequenceNumber');
while (my $field = $fields->hashRef) {
my $fieldName = 'field_'.$field->{fieldId};
my $fieldValue;
if ($field->{status} eq "required" || $field->{status} eq "editable"){
my $fieldType = $field->{fieldType};
$fieldType = "" if ($fieldType =~ m/^otherThing/x);
# Modify the defaultValue for certain field types. For most types we want to use
# the default in the database, for these we want the last known value for this thingData
if ( $fieldType eq "File" || $fieldType eq "Image" ) {
$field->{ defaultValue } = $thingData{ "field_" . $field->{ fieldId } };
}
$fieldValue = $session->form->process($fieldName,$fieldType,$field->{defaultValue},$field);
}
if ($field->{status} eq "required" && ($fieldValue =~ /^\s$/x || $fieldValue eq "" || !(defined $fieldValue))) {
push (@errors,{
"error_message"=>$field->{label}." ".$i18n->get('is required error').".",
});
$hadErrors = 1;
}
if ($field->{status} eq "hidden") {
$fieldValue = $field->{defaultValue};
WebGUI::Macro::process($self->session,\$fieldValue);
}
if ($field->{status} eq "visible") {
$fieldValue = $field->{defaultValue};
#WebGUI::Macro::process($self->session,\$fieldValue);
}
$thingData{$fieldName} = $fieldValue;
}
if ($hadErrors){
return $self->www_editThingData($thingId,$thingDataId,\@errors);
}
$newThingDataId = $self->setCollateral("Thingy_".$thingId,"thingDataId",\%thingData,0,0);
# trigger workflow
if($thingDataId eq "new"){
my ($onAddWorkflowId) = $session->db->quickArray("select onAddWorkflowId from Thingy_things where thingId=?"
,[$thingId]);
if ($onAddWorkflowId){
$self->triggerWorkflow($onAddWorkflowId);
}
}
else {
my ($onEditWorkflowId) = $session->db->quickArray("select onEditWorkflowId from Thingy_things where thingId=?"
,[$thingId]);
if ($onEditWorkflowId){
$self->triggerWorkflow($onEditWorkflowId);
}
}
if (scalar @$errors > 0){
return $self->www_editThingData($thingId,$thingDataId,'',$errors);
}
if ($thingProperties->{afterSave} eq "searchThisThing") {
return $self->www_search($thingId);
@ -1994,7 +2165,62 @@ sub www_editThingDataSave {
}
# if afterSave is thingy default or in any other case return view()
else {
return $self->www_view;
return $self->view();
}
}
#-------------------------------------------------------------------
=head2 www_editThingDataSaveViaAjax ( )
Returns a thing instance as JSON data.
=head3 thingId
The unique id of a thing.
=head3 thingDataId
The unique id of a row of thing data. When this is 'new' a new row of data will be added.
=cut
sub www_editThingDataSaveViaAjax {
my $self = shift;
my $session = $self->session;
my $thingId = shift || $session->form->process('thingId');
my $thingDataId = shift || $session->form->process('thingDataId');
unless ($thingId && $thingDataId) {
$session->http->setStatus("400", "Bad Request");
return JSON->new->utf8->encode([
{message => "Can't get thing data without a thingId and a thingDataId."}
]);
}
my $thingProperties = $self->getThing($thingId);
if ($thingProperties->{thingId}){
my ($privilegedGroup,$workflowId);
if ($thingDataId eq "new"){
$privilegedGroup = $thingProperties->{groupIdAdd};
}
else{
$privilegedGroup = $thingProperties->{groupIdEdit};
}
return $session->privilege->insufficient() unless $self->hasPrivileges($privilegedGroup);
my ($newThingDataId,$errors) = $self->editThingDataSave($thingId,$thingDataId);
if ($errors){
$session->http->setStatus("400", "Bad Request");
return JSON->new->utf8->encode($errors);
}
}
else {
$session->http->setStatus("404", "Not Found");
return JSON->new->utf8->encode([{message => "The thingId you requested can not be found."}]);
}
}
@ -2055,6 +2281,79 @@ sub www_export {
}
#-------------------------------------------------------------------
=head2 www_getThingViaAjax ( )
Returns a things properties as JSON.
=head3 thingId
The unique id of a thing.
=cut
sub www_getThingViaAjax {
my $self = shift;
my $session = $self->session;
my $thingId = shift || $session->form->process('thingId');
$session->http->setMimeType("application/json");
unless ($thingId) {
$session->http->setStatus("400", "Bad Request");
return JSON->new->utf8->encode([{message => "Can't return thing properties without a thingId."}]);
}
my $thingProperties = $self->getThing($thingId);
if ($thingProperties->{thingId}){
return $session->privilege->insufficient() unless $self->canViewThing($thingId,
$thingProperties->{groupIdView});
$session->http->setMimeType("application/json");
return JSON->new->utf8->encode($thingProperties);
}
else {
$session->http->setStatus("404", "Not Found");
return JSON->new->utf8->encode([{message => "The thingId you requested can not be found."}]);
}
}
#-------------------------------------------------------------------
=head2 www_getThingsViaAjax ( )
Returns the Things in a Thingy as JSON.
=cut
sub www_getThingsViaAjax {
my $self = shift;
my $session = $self->session;
$session->http->setMimeType("application/json");
my @visibleThings;
my $things = $self->getThings;
while (my $thing = $things->hashRef) {
if ($self->canViewThing($thing->{thingId},$thing->{groupIdView})){
$thing->{canSearch} = $self->canSearch($thing->{thingId},$thing);
$thing->{canEdit} = $self->hasPrivileges($thing->{groupIdEdit});
$thing->{canAdd} = $self->hasPrivileges($thing->{groupIdAdd});
push(@visibleThings,$thing);
}
}
if (scalar @visibleThings > 0){
return JSON->new->utf8->encode(\@visibleThings);
}
else {
$session->http->setStatus("404", "Not Found");
return JSON->new->utf8->encode([{message => "No visible Things were found in this Thingy."}]);
}
}
#-------------------------------------------------------------------
=head2 www_import ( )
@ -2369,7 +2668,7 @@ sub www_moveFieldConfirm {
=head2 www_search ( )
Shows the search screen and performs the search.
Shows the search screen wrapped in a style.
=cut
@ -2380,6 +2679,52 @@ sub www_search {
#-------------------------------------------------------------------
=head2 www_searchViaAjax ( )
Shows the search screen wrapped in a style.
=head3 thingId
The unique id of a thing.
=head3 thingProperties
A hashref containing the properties of a thing.
=cut
sub www_searchViaAjax {
my $self = shift;
my $session = $self->session;
my $thingId = shift || $session->form->process('thingId');
my $thingProperties = shift || $self->getThing($thingId);
my $i18n = WebGUI::International->new($self->session,"Asset_Thingy");
unless ($thingId) {
$session->http->setStatus("400", "Bad Request");
return "Can't perform search without a thingId.";
}
if ($thingProperties->{thingId}){
return $session->privilege->insufficient() unless $self->canViewThing($thingId,
$thingProperties->{groupIdView});
my $var = $self->getSearchTemplateVars($thingId,$thingProperties);
$session->http->setMimeType("application/json");
return JSON->new->utf8->encode($var);
}
else {
$session->http->setStatus("404", "Not Found");
return "The thingId you requested can not be found.";
}
}
#-------------------------------------------------------------------
=head2 canSearch ( )
Checks if the user can perform a search.
@ -2397,12 +2742,34 @@ sub canSearch {
=head2 search ( )
Shows the search screen and performs the search.
Returns the search screen without style.
=cut
sub search {
my $self = shift;
my $thingId = shift || $self->session->form->process('thingId');
my $thingProperties = shift || $self->getThing($thingId);
my $i18n = WebGUI::International->new($self->session,"Asset_Thingy");
return $i18n->get("no permission to search") if( ! $self->canSearch($thingId, $thingProperties));
my $var = $self->getSearchTemplateVars($thingId,$thingProperties);
return $self->processTemplate($var,$thingProperties->{searchTemplateId});
}
#-------------------------------------------------------------------
=head2 getSearchTemplateVars ( )
Performs the search and returns the tmpl var hashref.
=cut
sub getSearchTemplateVars {
my $self = shift;
my $thingId = shift || $self->session->form->process('thingId');
my $thingProperties = shift || $self->getThing($thingId);
@ -2545,7 +2912,8 @@ sequenceNumber');
$var->{searchFields_loop} = \@searchFields_loop;
$var->{displayInSearchFields_loop} = \@displayInSearchFields_loop;
$self->appendThingsVars($var, $thingId);
return $self->processTemplate($var,$thingProperties->{searchTemplateId});
return $var;
#return $self->processTemplate($var,$thingProperties->{searchTemplateId});
}
#-------------------------------------------------------------------
@ -2653,26 +3021,34 @@ sub www_selectFieldInThing {
Shows the view screen of a Thing
=head3 thingId
The unique id of a thing.
=head3 thingDataId
The unique id of a row of thing data.
=cut
sub www_viewThingData {
my $self = shift;
my $session = $self->session;
my $thingId = shift || $session->form->process('thingId');
my $self = shift;
my $session = $self->session;
my $thingId = shift || $session->form->process('thingId');
my $thingDataId = shift || $session->form->process('thingDataId');
my (%thingData, $fields,@field_loop,@viewScreenTitleFields);
my $var = $self->get;
my $url = $self->getUrl;
my $i18n = WebGUI::International->new($self->session, "Asset_Thingy");
my $var = $self->get;
my $url = $self->getUrl;
my $i18n = WebGUI::International->new($self->session, "Asset_Thingy");
my $thingProperties = $self->getThing($thingId);
return $self->session->privilege->insufficient() unless $self->canViewThing($thingId, $thingProperties->{groupIdView});
$var->{canEditThings} = $self->canEdit;
$var->{"addThing_url"} = $session->url->append($url, 'func=editThing;thingId=new');
$var->{"manage_url"} = $session->url->append($url, 'func=manage');
$var->{"thing_label"} = $thingProperties->{label};
$var->{canEditThings} = $self->canEdit;
$var->{"addThing_url"} = $session->url->append($url, 'func=editThing;thingId=new');
$var->{"manage_url"} = $session->url->append($url, 'func=manage');
$var->{"thing_label"} = $thingProperties->{label};
if($self->hasPrivileges($thingProperties->{groupIdEdit})){
$var->{"edit_url"} = $session->url->append($url,'func=editThingData;thingId='
@ -2688,49 +3064,60 @@ sub www_viewThingData {
$var->{"search_url"} = $session->url->append($url, 'func=search;thingId='.$thingId);
}
# Get Field Values
%thingData = $session->db->quickHash("select * from ".$session->db->dbh->quote_identifier("Thingy_".$thingId)
." where thingDataId = ?",[$thingDataId]);
$fields = $session->db->read('select * from Thingy_fields where assetId = '
.$session->db->quote($self->get("assetId")).' and thingId = '.$session->db->quote($thingId).' order by
sequenceNumber');
while (my %field = $fields->hash) {
next unless ($field{display} eq '1');
my $hidden = ($field{status} eq "hidden" && !$self->session->var->isAdminOn);
my $originalValue = $thingData{"field_".$field{fieldId}};
my $dateCreated = $thingData{"dateCreated"};
my $lastUpdated = $thingData{"lastUpdated"};
my $value = $self->getFieldValue($originalValue,\%field);
my $otherThingUrl;
if ($field{fieldType} =~ m/^otherThing/x) {
my $otherThingId = $field{fieldType};
$otherThingId =~ s/^otherThing_//x;
if($self->canViewThing($otherThingId)){
$otherThingUrl = $session->url->append($url,"func=viewThingData;thingId=$otherThingId;thingDataId=$originalValue");
}
}
my %fieldProperties = (
"id" => $field{fieldId},
"name" => "field_".$field{fieldId},
"value" => $value,
"label" => $field{label},
"isHidden" => $hidden,
"url" => $otherThingUrl,
"dateCreated" => WebGUI::DateTime->new($self->session,$dateCreated)->toUserTimeZone(),
"lastUpdated" => WebGUI::DateTime->new($self->session,$lastUpdated)->toUserTimeZone(),
);
push(@viewScreenTitleFields,$value) if ($field{viewScreenTitle});
push(@field_loop, { map {("field_".$_ => $fieldProperties{$_})} keys(%fieldProperties) });
}
$var->{viewScreenTitle} = join(" ",@viewScreenTitleFields);
$var->{field_loop} = \@field_loop;
$self->getViewThingVars($thingId,$thingDataId,$var);
$self->appendThingsVars($var, $thingId);
return $self->processStyle($self->processTemplate($var,$thingProperties->{viewTemplateId}));
return $self->session->style->process($self->processTemplate($var,$thingProperties->{viewTemplateId}),$self->get("styleTemplateId"));
}
#-------------------------------------------------------------------
=head2 www_viewThingDataViaAjax ( )
Returns a thing instance as JSON data.
=head3 thingId
The unique id of a thing.
=head3 thingDataId
The unique id of a row of thing data.
=cut
sub www_viewThingDataViaAjax {
my $self = shift;
my $session = $self->session;
my $thingId = shift || $session->form->process('thingId');
my $thingDataId = shift || $session->form->process('thingDataId');
$session->http->setMimeType("application/json");
unless ($thingId && $thingDataId) {
$session->http->setStatus("400", "Bad Request");
return JSON->new->utf8->encode([{message => "Can't get thing data without a thingId and a thingDataId."}]);
}
my $thingProperties = $self->getThing($thingId);
if ($thingProperties->{thingId}){
return $session->privilege->insufficient() unless $self->canViewThing($thingId, $thingProperties->{groupIdView});
my $output = $self->getViewThingVars($thingId,$thingDataId);
if ($output){
return JSON->new->utf8->encode($output);
}
else{
$session->http->setStatus("404", "Not Found");
return JSON->new->utf8->encode([{message => "The thingDataId you requested can not be found."}]);
}
}
else {
$session->http->setStatus("404", "Not Found");
return JSON->new->utf8->encode([{message => "The thingId you requested can not be found."}]);
}
}
1;