From 804bad9a483dace92c2a50b55727c4d96fe163f2 Mon Sep 17 00:00:00 2001 From: Colin Kuskie Date: Tue, 5 Jun 2007 23:33:50 +0000 Subject: [PATCH] very beginnings of an Asset MetaData test, along with an API extension to make adding metaData possible --- lib/WebGUI/AssetMetaData.pm | 124 ++++++++++++++++++++++++------------ t/Asset/AssetMetaData.t | 88 +++++++++++++++++++++++++ 2 files changed, 172 insertions(+), 40 deletions(-) create mode 100644 t/Asset/AssetMetaData.t diff --git a/lib/WebGUI/AssetMetaData.pm b/lib/WebGUI/AssetMetaData.pm index 1a0cbafb8..dba0547c7 100644 --- a/lib/WebGUI/AssetMetaData.pm +++ b/lib/WebGUI/AssetMetaData.pm @@ -35,6 +35,64 @@ These methods are available from this class: =cut +#------------------------------------------------------------------- + +=head2 addMetaDataField ( ) + +Adds a field to the metadata system. + +=head3 fieldId + +The fieldId to be added. + +=head3 fieldName + +The name of the field + +=head3 defaultValue + +The default value of the metadata field, if none is chosen by the user. + +=head3 description + +A description for the field, in case you forget later why you ever bothered +wasting space in the db for this field. + +=head3 fieldType + +The form field type for metaData, select list, text, integer. + +=head3 possibleValues + +For fields that provide options, the list of options. This is a string with +newline separated values. + +=cut + +sub addMetaDataField { + my $self = shift; + + my $fieldId = shift || 'new'; + my $fieldName = shift || $self->session->id->generate(); + my $defaultValue = shift; + my $description = shift || ''; + my $fieldType = shift; + my $possibleValues = shift; + + if($fieldId eq 'new') { + $fieldId = $self->session->id->generate(); + $self->session->db->write("insert into metaData_properties (fieldId, fieldName, defaultValue, description, fieldType, possibleValues) values (?,?,?,?,?,?)", + [ $fieldId, $fieldName, $defaultValue, $description, $fieldType, $possibleValues, ] + ); + } + else { + $self->session->db->write("update metaData_properties set fieldName = ?, defaultValue = ?, description = ?, fieldType = ?, possibleValues = ? where fieldId = ?", + [ $fieldName, $defaultValue, $description, $fieldType, $possibleValues, $fieldId, ] + ); + } +} + + #------------------------------------------------------------------- =head2 deleteMetaDataField ( ) @@ -61,7 +119,8 @@ sub deleteMetaDataField { =head2 getMetaDataFields ( [fieldId] ) -Returns a hash reference containing all metadata field properties. You can limit the output to a certain field by specifying a fieldId. +Returns a hash reference containing all metadata field properties for this Asset. +You can limit the output to a certain field by specifying a fieldId. =head3 fieldId @@ -86,16 +145,17 @@ sub getMetaDataFields { $sql .= " order by f.fieldName"; if ($fieldId) { return $self->session->db->quickHashRef($sql); - } else { - tie my %hash, 'Tie::IxHash'; - my $sth = $self->session->db->read($sql); - while( my $h = $sth->hashRef) { + } + else { + tie my %hash, 'Tie::IxHash'; + my $sth = $self->session->db->read($sql); + while( my $h = $sth->hashRef) { foreach(keys %$h) { $hash{$h->{fieldId}}{$_} = $h->{$_}; } } - $sth->finish; - return \%hash; + $sth->finish; + return \%hash; } } @@ -122,14 +182,15 @@ sub updateMetaData { my $value = shift; my $db = $self->session->db; my ($exists) = $db->quickArray("select count(*) from metaData_values where assetId = ? and fieldId = ?",[$self->getId, $fieldId]); - if (!$exists && $value ne "") { - $db->write("insert into metaData_values (fieldId, assetId) values (?,?)",[$fieldId, $self->getId]); - } - if ($value eq "") { # Keep it clean - $db->write("delete from metaData_values where assetId = ? and fieldId = ?",[$self->getId, $fieldId]); - } else { - $db->write("update metaData_values set value = ? where assetId = ? and fieldId=?", [$value, $self->getId, $fieldId]); - } + if (!$exists && $value ne "") { + $db->write("insert into metaData_values (fieldId, assetId) values (?,?)",[$fieldId, $self->getId]); + } + if ($value eq "") { # Keep it clean + $db->write("delete from metaData_values where assetId = ? and fieldId = ?",[$self->getId, $fieldId]); + } + else { + $db->write("update metaData_values set value = ? where assetId = ? and fieldId=?", [$value, $self->getId, $fieldId]); + } } @@ -240,31 +301,14 @@ sub www_editMetaDataFieldSave { if($fieldName eq "") { return $ac->render($i18n->get("errorEmptyField"),$i18n->get('Edit Metadata')); } - if($fid eq 'new') { - $fid = $self->session->id->generate(); - $self->session->db->write("insert into metaData_properties (fieldId, fieldName, defaultValue, description, fieldType, possibleValues) values (?,?,?,?,?,?)", - [ - $fid, - $fieldName, - $self->session->form->process("defaultValue") || '', - $self->session->form->process("description") || '', - $self->session->form->process("fieldType"), - $self->session->form->process("possibleValues") || '', - ] - ); - } - else { - $self->session->db->write("update metaData_properties set fieldName = ?, defaultValue = ?, description = ?, fieldType = ?, possibleValues = ? where fieldId = ?", - [ - $fieldName, - $self->session->form->process("defaultValue") || '', - $self->session->form->process("description") || '', - $self->session->form->process("fieldType"), - $self->session->form->process("possibleValues") || '', - $fid, - ] - ); - } + $self->addMetaDataField( + $fid, + $fieldName, + $self->session->form->process("defaultValue"), + $self->session->form->process("description") || '', + $self->session->form->process("fieldType"), + $self->session->form->process("possibleValues"), + ); return $self->www_manageMetaData; } diff --git a/t/Asset/AssetMetaData.t b/t/Asset/AssetMetaData.t new file mode 100644 index 000000000..e6d710d11 --- /dev/null +++ b/t/Asset/AssetMetaData.t @@ -0,0 +1,88 @@ +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2006 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 lib "$FindBin::Bin/../lib"; + +##The goal of this test is to check the creation and purging of +##versions. + +use WebGUI::Test; +use WebGUI::Session; +use WebGUI::Utility; +use WebGUI::Asset; +use WebGUI::VersionTag; + +use Test::More; # increment this value for each test you create +use Test::Deep; +plan tests => 6; + +my $session = WebGUI::Test->session; +$session->user({userId => 3}); +my $root = WebGUI::Asset->getRoot($session); +my $versionTag = WebGUI::VersionTag->getWorking($session); +$versionTag->set({name=>"Asset Package test"}); + +my $folder = $root->addChild({ + url => 'testFolder', + title => 'folder', + menuTitle => 'folderMenuTitle', + className => 'WebGUI::Asset::Wobject::Folder', + isPackage => 1, +}); + +my $snippet = $folder->addChild({ + url => 'testSnippet', + title => 'snippet', + menuTitle => 'snippetMenuTitle', + className => 'WebGUI::Asset::Snippet', + snippet => 'A snippet of text', +}); + +$versionTag->commit; + +##Note that there is no MetaData field master class. New fields can be added +##from _ANY_ asset, and be available to all assets. + +cmp_deeply({}, $snippet->getMetaDataFields, 'snippet has no metadata fields'); +cmp_deeply({}, $folder->getMetaDataFields, 'folder has no metadata fields'); + +$snippet->addMetaDataField('new', 'searchEngine', '', 'Search Engine preference', 'text'); + +my @snipKeys; +my @foldKeys; + +@snipKeys = keys %{ $snippet->getMetaDataFields }; +@foldKeys = keys %{ $folder->getMetaDataFields }; +is(scalar @snipKeys, 1, 'Only 1 meta data field available'); +cmp_deeply( \@snipKeys, \@foldKeys, 'Snippet and Folder have access to the same meta data'); + +my $seMetaData = $snippet->getMetaDataFields()->{$snipKeys[0]}; + +$folder->addMetaDataField('new', 'color', '', 'Favorite Color', 'radioList', "Blue\nRed\nWhite\nYellow\nGreen"); + +@snipKeys = keys %{ $snippet->getMetaDataFields }; +@foldKeys = keys %{ $folder->getMetaDataFields }; +is(scalar @foldKeys, 2, 'Two meta data field available'); +cmp_deeply( \@snipKeys, \@foldKeys, 'Snippet and Folder have access to the same meta data fields'); + +END { + foreach my $metaDataFieldId (keys %{ $snippet->getMetaDataFields }) { + $snippet->deleteMetaDataField($metaDataFieldId); + } + + foreach my $tag($versionTag) { + if (defined $tag and ref $tag eq 'WebGUI::VersionTag') { + $tag->rollback; + } + } + +}