From 539957df52fcefb3d4c61bb111e422123afb15f6 Mon Sep 17 00:00:00 2001 From: Yung Han Khoe Date: Tue, 8 Apr 2008 16:12:10 +0000 Subject: [PATCH] fixed: Thingy: field sequence not imported correctly for existing Thingies --- docs/changelog/7.x.x.txt | 1 + lib/WebGUI/Asset/Wobject.pm | 11 +++++++++-- lib/WebGUI/Asset/Wobject/Thingy.pm | 23 ++++++++++++++++++----- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index ba6a40f62..f53e2f0fd 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -8,6 +8,7 @@ - fixed: Thingy: "add" and "edit" permission problem - fixed: EMail field rejects some valid email addresses - fixed: Calendar date localization can be broken + - fixed: Thingy: field sequence not imported correctly for existing Thingies 7.5.9 - fixed: Collaboration System attachments follow site's max size instead of CS's diff --git a/lib/WebGUI/Asset/Wobject.pm b/lib/WebGUI/Asset/Wobject.pm index 79cc80edc..8bfe7bd0f 100644 --- a/lib/WebGUI/Asset/Wobject.pm +++ b/lib/WebGUI/Asset/Wobject.pm @@ -425,6 +425,11 @@ If this collateral data set is not grouped by assetId, but by another column the If you've specified a setName you may also set a value for that set. Defaults to the value for this id from the wobject properties. +=head3 updateSequence + +If set to "1" an update of existing collateral data will also update the sequence number. This option is used when +importing collateral data in a package. Defaults to "0". + =cut sub setCollateral { @@ -436,11 +441,13 @@ sub setCollateral { my $useAssetId = shift; my $setName = shift || "assetId"; my $setValue = shift || $self->get($setName); + my $updateSequence = shift; my $db = $self->session->db; my ($key, $seq, $dbkeys, $dbvalues); my $counter = 0; my $sql; - if ($properties->{$keyName} eq "new" || $properties->{$keyName} eq "") { + + if ($properties->{$keyName} eq "new" || $properties->{$keyName} eq "") { $properties->{$keyName} = $self->session->id->generate(); $sql = "insert into ".$db->dbh->quote_identifier($table)." ("; my $dbkeys = ""; @@ -468,7 +475,7 @@ sub setCollateral { } else { $sql = "update ".$db->dbh->quote_identifier($table)." set "; foreach my $key (keys %{$properties}) { - unless ($key eq "sequenceNumber") { + unless ($key eq "sequenceNumber" && $updateSequence ne "1") { $sql .= ',' if ($counter++ > 0); $sql .= $db->dbh->quote_identifier($key)."=".$db->quote($properties->{$key}); } diff --git a/lib/WebGUI/Asset/Wobject/Thingy.pm b/lib/WebGUI/Asset/Wobject/Thingy.pm index a9681c748..047c991be 100644 --- a/lib/WebGUI/Asset/Wobject/Thingy.pm +++ b/lib/WebGUI/Asset/Wobject/Thingy.pm @@ -253,6 +253,10 @@ The id of the field that should be deleted. The id of the thing to which the field to be deleted belongs. +=head3 keepSequenceNumbers + +Boolean indicating that the sequence numbers should not be changed. This is used by importAssetCollateralData. + =cut sub deleteField { @@ -260,12 +264,20 @@ sub deleteField { my $self = shift; my $fieldId = shift; my $thingId = shift; + my $keepSequenceNumbers = shift; my $db = $self->session->db; my $error = $self->session->errorHandler; + my $deletedSequenceNumber; - my ($deletedSequenceNumber) = $db->quickArray("select sequenceNumber from Thingy_fields where fieldId = ?",[$fieldId]); + if ($keepSequenceNumbers ne "1"){ + ($deletedSequenceNumber) = $db->quickArray("select sequenceNumber from Thingy_fields where fieldId = ?" + ,[$fieldId]); + } $self->deleteCollateral("Thingy_fields","fieldId",$fieldId); - $db->write("update Thingy_fields set sequenceNumber = sequenceNumber -1 where sequenceNumber > ?",[$deletedSequenceNumber]); + if ($keepSequenceNumbers ne "1"){ + $db->write("update Thingy_fields set sequenceNumber = sequenceNumber -1 where sequenceNumber > ?" + ,[$deletedSequenceNumber]); + } my ($columnExists) = $db->quickArray("show columns from ".$db->dbh->quote_identifier("Thingy_".$thingId) ." like ".$db->quote("field_".$fieldId)); @@ -792,9 +804,10 @@ sub importAssetCollateralData { my ($fieldIdExists) = $session->db->quickArray("select fieldId from Thingy_fields where fieldId = ? and thingId = ? ",[$field->{fieldId},$field->{thingId}]); if ($assetExists && $fieldIdExists){ # update existing field - $error->info("Updating Field, label: ".$field->{label}.", id: ".$field->{fieldId}); + $error->info("Updating Field, label: ".$field->{label}.", id: ".$field->{fieldId}.",seq :" + .$field->{sequenceNumber}); $self->_updateFieldType($field->{fieldType},$field->{fieldId},$field->{thingId},$field->{assetId},$dbDataType); - $self->setCollateral("Thingy_fields","fieldId",$field,1,0); + $self->setCollateral("Thingy_fields","fieldId",$field,1,0,"","",1); } else{ # Add field as Collateral, retain fieldId. @@ -807,7 +820,7 @@ sub importAssetCollateralData { while (my $fieldInDataBase = $fieldsInDatabase->hashRef) { if (!WebGUI::Utility::isIn($fieldInDataBase->{fieldId},@importFields)){ # delete field - $self->deleteField($fieldInDataBase->{fieldId},$fieldInDataBase->{thingId}); + $self->deleteField($fieldInDataBase->{fieldId},$fieldInDataBase->{thingId},"1"); } }