[Rt-commit] rt branch, 3.9-attributes_as_columns, updated. rt-3.9.4-497-g256e3c8

Ruslan Zakirov ruz at bestpractical.com
Fri Nov 19 06:03:30 EST 2010


The branch, 3.9-attributes_as_columns has been updated
       via  256e3c83b637af44c52939497096efa28ff7495e (commit)
       via  c24b050cc5bab9b111baca6c6863cc0556923b17 (commit)
       via  c5a5b32566a5d794ffc9b75e689dfbc77adfcb4d (commit)
       via  5868f2faa6e848fa7c733d739739b5f8d77ca7a9 (commit)
       via  0a80a9690d9446dbcdccdc9d384b1201bdd55cd1 (commit)
      from  4c6e634f7357aa462c77688281a5a88d6e42cf15 (commit)

Summary of changes:
 etc/schema.Oracle               |    1 +
 etc/schema.Pg                   |    1 +
 etc/schema.SQLite               |    1 +
 etc/schema.mysql                |    1 +
 etc/upgrade/3.9.7/content       |   12 ++++++++
 etc/upgrade/3.9.7/schema.Oracle |    1 +
 etc/upgrade/3.9.7/schema.Pg     |    1 +
 etc/upgrade/3.9.7/schema.SQLite |    1 +
 etc/upgrade/3.9.7/schema.mysql  |    1 +
 lib/RT/CustomField_Overlay.pm   |   56 +++++++++++++++++++++++++--------------
 t/customfields/external.t       |    5 ++-
 11 files changed, 59 insertions(+), 22 deletions(-)

- Log -----------------------------------------------------------------
commit 0a80a9690d9446dbcdccdc9d384b1201bdd55cd1
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Fri Nov 19 13:57:57 2010 +0300

    CustomFields.ValuesClass column

diff --git a/etc/schema.Oracle b/etc/schema.Oracle
index ad3bb3d..2384d13 100755
--- a/etc/schema.Oracle
+++ b/etc/schema.Oracle
@@ -357,6 +357,7 @@ CREATE TABLE CustomFields (
 	MaxValues	NUMBER(11,0) DEFAULT 0 NOT NULL,
 	Pattern		CLOB,
         Repeated        NUMBER(11,0) DEFAULT 0 NOT NULL,
+	ValuesClass	VARCHAR2(64),
         BasedOn         NUMBER(11,0) NULL,
 	Description	VARCHAR2(255),
 	SortOrder	NUMBER(11,0) DEFAULT 0 NOT NULL,
diff --git a/etc/schema.Pg b/etc/schema.Pg
index 6351a84..b3c0534 100755
--- a/etc/schema.Pg
+++ b/etc/schema.Pg
@@ -542,6 +542,7 @@ CREATE TABLE CustomFields (
   RenderType varchar(64) NULL  ,
   MaxValues integer NOT NULL DEFAULT 0  ,
   Repeated integer NOT NULL DEFAULT 0 , 
+  ValuesClass varchar(64) NULL  ,
   BasedOn integer NULL, 
   Pattern varchar(65536) NULL  ,
   LookupType varchar(255) NOT NULL  ,
diff --git a/etc/schema.SQLite b/etc/schema.SQLite
index 88725cd..e31594e 100755
--- a/etc/schema.SQLite
+++ b/etc/schema.SQLite
@@ -380,6 +380,7 @@ CREATE TABLE CustomFields (
   Pattern varchar(65536) NULL  ,	# New -- Must validate against this
   Repeated int2 NOT NULL DEFAULT 0 , # New -- repeated table entry
   BasedOn INTEGER NULL,
+  ValuesClass varchar(64) NULL  ,
   Description varchar(255) NULL  ,
   SortOrder integer NOT NULL DEFAULT 0  ,
   LookupType varchar(255) NOT NULL,
diff --git a/etc/schema.mysql b/etc/schema.mysql
index c5aac29..4814ecb 100755
--- a/etc/schema.mysql
+++ b/etc/schema.mysql
@@ -358,6 +358,7 @@ CREATE TABLE CustomFields (
   Pattern TEXT NULL  ,	# New -- Must validate against this
   Repeated int2 NOT NULL DEFAULT 0 , # New -- repeated table entry
   BasedOn INTEGER NULL,
+  ValuesClass varchar(64) CHARACTER SET ascii NULL  ,
   Description varchar(255) NULL  ,
   SortOrder integer NOT NULL DEFAULT 0  ,
   LookupType varchar(255) CHARACTER SET ascii NOT NULL,

commit 5868f2faa6e848fa7c733d739739b5f8d77ca7a9
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Fri Nov 19 13:58:24 2010 +0300

    add CustomFields.ValuesClass on upgrade

diff --git a/etc/upgrade/3.9.7/schema.Oracle b/etc/upgrade/3.9.7/schema.Oracle
index 5bed834..6b8adbd 100644
--- a/etc/upgrade/3.9.7/schema.Oracle
+++ b/etc/upgrade/3.9.7/schema.Oracle
@@ -1,4 +1,5 @@
 ALTER TABLE Users ADD COLUMN AuthToken VARCHAR2(16) NULL;
 ALTER TABLE CustomFields ADD COLUMN BasedOn NUMBER(11,0) NULL;
 ALTER TABLE CustomFields ADD COLUMN RenderType VARCHAR2(64) NULL;
+ALTER TABLE CustomFields ADD COLUMN ValuesClass VARCHAR2(64) NULL;
 ALTER TABLE Queues ADD COLUMN SubjectTag VARCHAR2(120) NULL;
diff --git a/etc/upgrade/3.9.7/schema.Pg b/etc/upgrade/3.9.7/schema.Pg
index d6f7172..2967aa2 100644
--- a/etc/upgrade/3.9.7/schema.Pg
+++ b/etc/upgrade/3.9.7/schema.Pg
@@ -1,4 +1,5 @@
 ALTER TABLE Users ADD COLUMN AuthToken VARCHAR(16) NULL;
 ALTER TABLE CustomFields ADD COLUMN BasedOn INTEGER NULL;
 ALTER TABLE CustomFields ADD COLUMN RenderType VARCHAR(64) NULL;
+ALTER TABLE CustomFields ADD COLUMN ValuesClass VARCHAR(64) NULL;
 ALTER TABLE Queues ADD COLUMN SubjectTag VARCHAR(120) NULL;
diff --git a/etc/upgrade/3.9.7/schema.SQLite b/etc/upgrade/3.9.7/schema.SQLite
index d6f7172..2967aa2 100644
--- a/etc/upgrade/3.9.7/schema.SQLite
+++ b/etc/upgrade/3.9.7/schema.SQLite
@@ -1,4 +1,5 @@
 ALTER TABLE Users ADD COLUMN AuthToken VARCHAR(16) NULL;
 ALTER TABLE CustomFields ADD COLUMN BasedOn INTEGER NULL;
 ALTER TABLE CustomFields ADD COLUMN RenderType VARCHAR(64) NULL;
+ALTER TABLE CustomFields ADD COLUMN ValuesClass VARCHAR(64) NULL;
 ALTER TABLE Queues ADD COLUMN SubjectTag VARCHAR(120) NULL;
diff --git a/etc/upgrade/3.9.7/schema.mysql b/etc/upgrade/3.9.7/schema.mysql
index 48acd99..ccb5ff2 100644
--- a/etc/upgrade/3.9.7/schema.mysql
+++ b/etc/upgrade/3.9.7/schema.mysql
@@ -1,4 +1,5 @@
 ALTER TABLE Users ADD COLUMN AuthToken VARCHAR(16) CHARACTER SET ascii NULL;
 ALTER TABLE CustomFields ADD COLUMN BasedOn INTEGER NULL;
 ALTER TABLE CustomFields ADD COLUMN RenderType VARCHAR(64) NULL;
+ALTER TABLE CustomFields ADD COLUMN ValuesClass VARCHAR(64) CHARACTER SET ascii NULL;
 ALTER TABLE Queues ADD COLUMN SubjectTag VARCHAR(120) NULL;

commit c5a5b32566a5d794ffc9b75e689dfbc77adfcb4d
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Fri Nov 19 13:58:56 2010 +0300

    set CustomFields.ValuesClass from Attributes table

diff --git a/etc/upgrade/3.9.7/content b/etc/upgrade/3.9.7/content
index 6d2d5db..daf9c22 100644
--- a/etc/upgrade/3.9.7/content
+++ b/etc/upgrade/3.9.7/content
@@ -29,6 +29,18 @@ my $move_attributes = sub {
         return $move_attributes->( 'CustomFields', 'RT::CustomField', 'RenderType');
     },
     sub {
+        $move_attributes->( 'CustomFields', 'RT::CustomField', 'ValuesClass')
+            or return;
+
+        my $query = "UPDATE CustomFields SET ValuesClass = NULL WHERE ValuesClass = ?";
+        my $res = $RT::Handle->SimpleQuery( $query, 'RT::CustomFieldValues' );
+        unless ( $res ) {
+            $RT::Logger->error("Failed to replace default with NULLs");
+            return;
+        }
+        return 1;
+    },
+    sub {
         my $attr = RT->System->FirstAttribute('BrandedSubjectTag');
         return 1 unless $attr;
 

commit c24b050cc5bab9b111baca6c6863cc0556923b17
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Fri Nov 19 14:00:10 2010 +0300

    use CustomFields.Values class instead of attributes

diff --git a/lib/RT/CustomField_Overlay.pm b/lib/RT/CustomField_Overlay.pm
index 44a9d86..5832182 100755
--- a/lib/RT/CustomField_Overlay.pm
+++ b/lib/RT/CustomField_Overlay.pm
@@ -339,7 +339,16 @@ sub Create {
             return (0, $self->loc("Invalid Render Type") )
                 unless grep $_ eq  $args{'RenderType'}, $self->RenderTypes( $composite );
         }
+    }
+
+    $args{'ValuesClass'} = undef if ($args{'ValuesClass'} || '') eq 'RT::CustomFieldValues';
+    if ( $args{'ValuesClass'} ||= undef ) {
+        return (0, $self->loc("This Custom Field can not have list of values"))
+            unless $self->IsSelectionType( $args{'Type'} );
 
+        unless ( $self->ValidateValuesClass( $args{'ValuesClass'} ) ) {
+            return (0, $self->loc("Invalid Custom Field values source"));
+        }
     }
 
     (my $rv, $msg) = $self->SUPER::Create(
@@ -349,6 +358,7 @@ sub Create {
         MaxValues   => $args{'MaxValues'},
         Pattern     => $args{'Pattern'},
         BasedOn     => $args{'BasedOn'},
+        ValuesClass => $args{'ValuesClass'},
         Description => $args{'Description'},
         Disabled    => $args{'Disabled'},
         LookupType  => $args{'LookupType'},
@@ -363,10 +373,6 @@ sub Create {
 	$self->SetIncludeContentForValue($args{'IncludeContentForValue'});
     }
 
-    if ( exists $args{'ValuesClass'} ) {
-        $self->SetValuesClass( $args{'ValuesClass'} );
-    }
-
     return ($rv, $msg) unless exists $args{'Queue'};
 
     # Compat code -- create a new ObjectCustomField mapping
@@ -487,8 +493,10 @@ of the C<ValuesClass> method.
 sub Values {
     my $self = shift;
 
-    my $class = $self->ValuesClass || 'RT::CustomFieldValues';
-    eval "require $class" or die "$@";
+    my $class = $self->ValuesClass;
+    if ( $class ne 'RT::CustomFieldValues') {
+        eval "require $class" or die "$@";
+    }
     my $cf_values = $class->new( $self->CurrentUser );
     # if the user has no rights, return an empty object
     if ( $self->id && $self->CurrentUserHasRight( 'SeeCustomField') ) {
@@ -612,31 +620,39 @@ sub IsSelectionType {
 
 sub IsExternalValues {
     my $self = shift;
-    my $selectable = $self->IsSelectionType( @_ );
-    return $selectable unless $selectable;
-
-    my $class = $self->ValuesClass;
-    return 0 if $class eq 'RT::CustomFieldValues';
-    return 1;
+    return 0 unless $self->IsSelectionType( @_ );
+    return $self->ValuesClass eq 'RT::CustomFieldValues'? 0 : 1;
 }
 
 sub ValuesClass {
     my $self = shift;
-    return '' unless $self->IsSelectionType;
-
-    my $class = $self->FirstAttribute( 'ValuesClass' );
-    $class = $class->Content if $class;
-    return $class || 'RT::CustomFieldValues';
+    return $self->_Value( ValuesClass => @_ ) || 'RT::CustomFieldValues';
 }
 
 sub SetValuesClass {
     my $self = shift;
     my $class = shift || 'RT::CustomFieldValues';
+    
+    if ( $class eq 'RT::CustomFieldValues' ) {
+        return $self->_Set( Field => 'ValuesClass', Value => undef, @_ );
+    }
+
+    return (0, $self->loc("This Custom Field can not have list of values"))
+        unless $self->IsSelectionType;
 
-    if( $class eq 'RT::CustomFieldValues' ) {
-        return $self->DeleteAttribute( 'ValuesClass' );
+    unless ( $self->ValidateValuesClass( $class ) ) {
+        return (0, $self->loc("Invalid Custom Field values source"));
     }
-    return $self->SetAttribute( Name => 'ValuesClass', Content => $class );
+    return $self->_Set( Field => 'ValuesClass', Value => $class, @_ );
+}
+
+sub ValidateValuesClass {
+    my $self = shift;
+    my $class = shift;
+
+    return 1 if $class eq 'RT::CustomFieldValues';
+    return 1 if grep $class eq $_, RT->Config->Get('CustomFieldValuesSources');
+    return undef;
 }
 
 

commit 256e3c83b637af44c52939497096efa28ff7495e
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Fri Nov 19 14:00:32 2010 +0300

    ValuesClass is validated against config, fix test

diff --git a/t/customfields/external.t b/t/customfields/external.t
index af5f884..0abf6ec 100644
--- a/t/customfields/external.t
+++ b/t/customfields/external.t
@@ -12,6 +12,7 @@ sub new (*) {
 }
 
 use constant VALUES_CLASS => 'RT::CustomFieldValues::Groups';
+RT->Config->Set(CustomFieldValuesSources => VALUES_CLASS);
 
 my $q = new( RT::Queue );
 isa_ok( $q, 'RT::Queue' );
@@ -27,8 +28,8 @@ my $cf = new( RT::CustomField );
 isa_ok( $cf, 'RT::CustomField' );
 
 {
-    my ($cfid) = $cf->Create( %arg );
-    ok( $cfid, "created cf" );
+    my ($cfid, $msg) = $cf->Create( %arg );
+    ok( $cfid, "created cf" ) or diag "error: $msg";
     is( $cf->ValuesClass, VALUES_CLASS, "right values class" );
     ok( $cf->IsExternalValues, "custom field has external values" );
 }

-----------------------------------------------------------------------


More information about the Rt-commit mailing list