From 0d06c152756eccdca084d7a799020fa545dd1742 Mon Sep 17 00:00:00 2001 From: Colin Kuskie Date: Wed, 22 Jul 2009 17:59:58 +0000 Subject: [PATCH] Add a method to update userProfileData column types. Fix a bug with making a profileField called userId. Update POD Added several profileField tests. --- docs/changelog/7.x.x.txt | 1 + docs/upgrades/upgrade_7.7.15-7.7.16.pl | 11 +++++ lib/WebGUI/ProfileField.pm | 66 +++++++++++++++++++++++--- t/ProfileField.t | 25 +++++++++- 4 files changed, 95 insertions(+), 8 deletions(-) diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index 0f3739517..459584f4b 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -26,6 +26,7 @@ - fixed #10650: Unflatten WebGUI storage locations - fixed #10664: ThiingyRecord disappeared... sort of - fixed #10687: i18n Asset_Product::buy_form_options + - fixed #10651: Dashboard Content positions 7.7.15 - fixed #10629: WebGUI::ProfileField create new field bug diff --git a/docs/upgrades/upgrade_7.7.15-7.7.16.pl b/docs/upgrades/upgrade_7.7.15-7.7.16.pl index c2794442e..bace7aca2 100644 --- a/docs/upgrades/upgrade_7.7.15-7.7.16.pl +++ b/docs/upgrades/upgrade_7.7.15-7.7.16.pl @@ -22,6 +22,7 @@ use Getopt::Long; use WebGUI::Session; use WebGUI::Storage; use WebGUI::Asset; +use WebGUI::ProfileField; use List::MoreUtils qw/uniq/; my $toVersion = '7.7.16'; @@ -32,6 +33,7 @@ my $session = start(); # this line required replaceUsageOfOldTemplatesAgain($session); updatePayPalDriversAgain($session); addThingyRecordFieldPriceDefaults($session); +correctProfileFieldColumnTypes($session); # upgrade functions go here @@ -47,6 +49,15 @@ finish($session); # this line required # print "DONE!\n" unless $quiet; #} +#---------------------------------------------------------------------------- +sub correctProfileFieldColumnTypes { + my $session = shift; + my $config = $session->config; + print "\tCheck database profile field types against form settings..." unless $quiet; + WebGUI::ProfileField->fixDataColumnTypes($session); + print "DONE!\n" unless $quiet; +} + #---------------------------------------------------------------------------- sub updatePayPalDriversAgain { my $session = shift; diff --git a/lib/WebGUI/ProfileField.pm b/lib/WebGUI/ProfileField.pm index e836b2d83..f431add4e 100644 --- a/lib/WebGUI/ProfileField.pm +++ b/lib/WebGUI/ProfileField.pm @@ -67,7 +67,50 @@ Return true iff fieldName is reserved and therefore not usable as a profile fiel sub isReservedFieldName { my $class = shift; my $fieldName = shift; - return isIn($fieldName, ('func', 'op', 'wg_privacySettings')); + return isIn($fieldName, qw/userId func op wg_privacySettings/); +} + +#------------------------------------------------------------------- + +=head2 fixDataColumnTypes ( session ) + +Checks the column types of userProfileData against the form fields that they use. If they +differ then they are updated to match for the form field. This is to account for bugs in +this module, and changes in Form types. + +This is a class method. + +=head3 session + +A reference to the current session. + +=cut + +sub fixDataColumnTypes { + my $class = shift; + my $session = shift; + + my $dbh = $session->db->dbh; + + my $fields = WebGUI::ProfileField->getFields($session); + foreach my $field ( @{ $fields } ) { + my $columnInfo = $dbh->column_info(undef, undef, 'userProfileData', $field->getId)->fetchrow_hashref(); + my $formField = $field->formField(undef, undef, undef, undef, undef, 'returnObject'); + my $columnType = $formField->getDatabaseFieldType(); + $columnType =~ s/\s+\w+$//; + if ($columnType eq 'BOOLEAN') { + $columnType = 'TINYINT'; ##Alias for INT(1) + } + my $actualType = $columnInfo->{TYPE_NAME}; + if ($columnType =~ m/\(\d+\)/) { + $actualType = sprintf('%s(%s)', $actualType, $columnInfo->{COLUMN_SIZE}); + } + if ($actualType ne $columnType) { + $session->log->warn("Updating ".$field->getId." from $actualType to $columnType"); + $session->db->write('ALTER TABLE userProfileData MODIFY COLUMN '.$dbh->quote_identifier($field->getId).' '.$columnType); + } + } + } #------------------------------------------------------------------- @@ -220,7 +263,7 @@ sub _formProperties { my $self = shift; return $self->formProperties(@_); } #------------------------------------------------------------------- -=head2 formField ( [ formProperties, withWrapper, userObject ] ) +=head2 formField ( [ formProperties, withWrapper, userObject, skipDefault, assignedValue ] ) Returns an HTMLified form field element. @@ -245,6 +288,10 @@ If true, this causes the default value set up for the form field to be ignored. If assignedValue is defined, it will be used to override the default value set up for the form. +=head3 returnObject + +If true, it returns a WebGUI::Form object, instead of returning HTML. + =cut # FIXME This would be better if it returned an OBJECT not the HTML @@ -259,6 +306,7 @@ sub formField { my $u = shift || $session->user; my $skipDefault = shift; my $assignedValue = shift; + my $returnObject = shift; if ($skipDefault) { $properties->{value} = undef; @@ -278,12 +326,14 @@ sub formField { $properties->{value} = WebGUI::Operation::Shared::secureEval($session,$properties->{dataDefault}); } } + my $form = WebGUI::Form::DynamicField->new($session,%{$properties}); + return $form if $returnObject; if ($withWrapper == 1) { - return WebGUI::Form::DynamicField->new($session,%{$properties})->toHtmlWithWrapper; + return $form->toHtmlWithWrapper; } elsif ($withWrapper == 2) { - return WebGUI::Form::DynamicField->new($session,%{$properties})->getValueAsHtml; + return $form->getValueAsHtml; } else { - return WebGUI::Form::DynamicField->new($session,%{$properties})->toHtml; + return $form->toHtml; } } @@ -437,7 +487,7 @@ sub getEditableFields { =head2 getFields ( session ) -Returns an array reference of WebGUI::ProfileField objects. This is a class method. +Returns an array reference of all WebGUI::ProfileField objects. This is a class method. =cut @@ -509,6 +559,8 @@ sub getRegistrationFields { return $class->_listFieldsWhere($session, "f.showAtRegistration = 1"); } +#------------------------------------------------------------------- + =head2 getPasswordRecoveryFields ( session ) Returns an array reference of profile field objects that are required @@ -892,7 +944,7 @@ sub setCategory { return undef if ($categoryId eq $currentCategoryId); - my ($sequenceNumber) = $self->session->db->quickArray("select max(sequenceNumber) from userProfileField where profileCategoryId=".$self->session->db->quote($categoryId)); + my ($sequenceNumber) = $self->session->db->quickArray("select max(sequenceNumber) from userProfileField where profileCategoryId=?", [$categoryId]); $self->session->db->setRow("userProfileField","fieldName",{fieldName=>$self->getId, profileCategoryId=>$categoryId, sequenceNumber=>$sequenceNumber+1}); $self->{_property}{profileCategoryId} = $categoryId; $self->{_property}{sequenceNumber} = $sequenceNumber+1; diff --git a/t/ProfileField.t b/t/ProfileField.t index 5836c4313..0a2ccbcf3 100644 --- a/t/ProfileField.t +++ b/t/ProfileField.t @@ -33,7 +33,7 @@ WebGUI::Test->usersToDelete($newUser); #---------------------------------------------------------------------------- # Tests -plan tests => 28; # Increment this number for each test you create +plan tests => 37; # Increment this number for each test you create #---------------------------------------------------------------------------- # Test the creation of ProfileField @@ -124,6 +124,29 @@ is($newProfileField2->getLabel, 'WebGUI', 'getLabel will process safeEval calls ok( WebGUI::ProfileField->exists($session,"firstName"), "firstName field exists" ); ok( !WebGUI::ProfileField->exists($session, time), "random field does not exist" ); +########################################################### +# +# isReservedFieldName +# +########################################################### + +ok( WebGUI::ProfileField->isReservedFieldName('func'), 'isReservedFieldName: func'); +ok( WebGUI::ProfileField->isReservedFieldName('op'), '... op'); +ok( WebGUI::ProfileField->isReservedFieldName('userId'), '... userId'); +ok( WebGUI::ProfileField->isReservedFieldName('wg_privacySettings'), '... wg_privacySettings'); +ok( !WebGUI::ProfileField->isReservedFieldName('function'), '... function is not'); +ok( !WebGUI::ProfileField->isReservedFieldName('operation'), '... operation is no'); +ok( !WebGUI::ProfileField->isReservedFieldName('shop'), '... shop is not'); + +########################################################### +# +# exists +# +########################################################### + +ok( WebGUI::ProfileField->exists($session, 'email'), 'exists: email'); +ok( !WebGUI::ProfileField->exists($session, 'userId'), '... userId (not)'); + #---------------------------------------------------------------------------- # Cleanup END {