From 352c175a395944ae86947a7ab1ada3845dc22731 Mon Sep 17 00:00:00 2001 From: Robert Rothenberg Date: Fri, 17 May 2019 14:42:38 +0100 Subject: [PATCH 1/8] Rename user.user_name to user.un but keep the accessor Note that tests still pass with this change. --- t/db/bookdb.sql | 2 +- t/lib/BookDB/Schema/Result/User.pm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/t/db/bookdb.sql b/t/db/bookdb.sql index 5677903..0be26c5 100644 --- a/t/db/bookdb.sql +++ b/t/db/bookdb.sql @@ -1,7 +1,7 @@ BEGIN TRANSACTION; CREATE TABLE user ( user_id INTEGER PRIMARY KEY, - user_name VARCHAR(32), + un VARCHAR(32), fav_cat VARCHAR(32), fav_book VARCHAR(32), occupation VARCHAR(32), diff --git a/t/lib/BookDB/Schema/Result/User.pm b/t/lib/BookDB/Schema/Result/User.pm index fbd2edd..e07698e 100644 --- a/t/lib/BookDB/Schema/Result/User.pm +++ b/t/lib/BookDB/Schema/Result/User.pm @@ -10,8 +10,8 @@ __PACKAGE__->table("user"); __PACKAGE__->add_columns( "user_id", { data_type => "INTEGER", is_nullable => 0, size => 8 }, - "user_name", - { data_type => "VARCHAR", is_nullable => 0, size => 32 }, + "un", + { accessor => "user_name", data_type => "VARCHAR", is_nullable => 0, size => 32 }, "fav_cat", { data_type => "VARCHAR", is_nullable => 0, size => 32 }, "fav_book", From bff291bbcca2c0471774572e88d02116e762c571 Mon Sep 17 00:00:00 2001 From: Robert Rothenberg Date: Fri, 17 May 2019 14:44:11 +0100 Subject: [PATCH 2/8] Make user_name unique This causes tests to fail (which is what we want, before we fix this bug). --- t/lib/BookDB/Form/User.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/t/lib/BookDB/Form/User.pm b/t/lib/BookDB/Form/User.pm index 2271bfd..17781f2 100644 --- a/t/lib/BookDB/Form/User.pm +++ b/t/lib/BookDB/Form/User.pm @@ -6,7 +6,7 @@ use DateTime; has '+item_class' => ( default => 'User'); -has_field 'user_name'; +has_field 'user_name' => ( unique => 1 ); has_field 'fav_cat' => ( label => 'Category' ); has_field 'fav_book' => ( label => 'Favorite Book' ); has_field 'occupation'; From 664199cd723fa04217dc0ebee56f96f35163b574 Mon Sep 17 00:00:00 2001 From: Robert Rothenberg Date: Fri, 17 May 2019 14:45:01 +0100 Subject: [PATCH 3/8] Revert "Rename user.user_name to user.un but keep the accessor" This reverts commit e4d66f53b21ce19466769cc067cc9eeaaf34a639. Note that the tests pass again. --- t/db/bookdb.sql | 2 +- t/lib/BookDB/Schema/Result/User.pm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/t/db/bookdb.sql b/t/db/bookdb.sql index 0be26c5..5677903 100644 --- a/t/db/bookdb.sql +++ b/t/db/bookdb.sql @@ -1,7 +1,7 @@ BEGIN TRANSACTION; CREATE TABLE user ( user_id INTEGER PRIMARY KEY, - un VARCHAR(32), + user_name VARCHAR(32), fav_cat VARCHAR(32), fav_book VARCHAR(32), occupation VARCHAR(32), diff --git a/t/lib/BookDB/Schema/Result/User.pm b/t/lib/BookDB/Schema/Result/User.pm index e07698e..fbd2edd 100644 --- a/t/lib/BookDB/Schema/Result/User.pm +++ b/t/lib/BookDB/Schema/Result/User.pm @@ -10,8 +10,8 @@ __PACKAGE__->table("user"); __PACKAGE__->add_columns( "user_id", { data_type => "INTEGER", is_nullable => 0, size => 8 }, - "un", - { accessor => "user_name", data_type => "VARCHAR", is_nullable => 0, size => 32 }, + "user_name", + { data_type => "VARCHAR", is_nullable => 0, size => 32 }, "fav_cat", { data_type => "VARCHAR", is_nullable => 0, size => 32 }, "fav_book", From a3e393d2d2a632926afee9bb2866f7c9af91344c Mon Sep 17 00:00:00 2001 From: Robert Rothenberg Date: Fri, 17 May 2019 14:42:38 +0100 Subject: [PATCH 4/8] Rename user.user_name to user.un but keep the accessor (redo) This undoes the previous revert. --- t/db/bookdb.sql | 2 +- t/lib/BookDB/Schema/Result/User.pm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/t/db/bookdb.sql b/t/db/bookdb.sql index 5677903..0be26c5 100644 --- a/t/db/bookdb.sql +++ b/t/db/bookdb.sql @@ -1,7 +1,7 @@ BEGIN TRANSACTION; CREATE TABLE user ( user_id INTEGER PRIMARY KEY, - user_name VARCHAR(32), + un VARCHAR(32), fav_cat VARCHAR(32), fav_book VARCHAR(32), occupation VARCHAR(32), diff --git a/t/lib/BookDB/Schema/Result/User.pm b/t/lib/BookDB/Schema/Result/User.pm index fbd2edd..e07698e 100644 --- a/t/lib/BookDB/Schema/Result/User.pm +++ b/t/lib/BookDB/Schema/Result/User.pm @@ -10,8 +10,8 @@ __PACKAGE__->table("user"); __PACKAGE__->add_columns( "user_id", { data_type => "INTEGER", is_nullable => 0, size => 8 }, - "user_name", - { data_type => "VARCHAR", is_nullable => 0, size => 32 }, + "un", + { accessor => "user_name", data_type => "VARCHAR", is_nullable => 0, size => 32 }, "fav_cat", { data_type => "VARCHAR", is_nullable => 0, size => 32 }, "fav_book", From 85518bbe6d9858ae6127d8e313d57114acd2385a Mon Sep 17 00:00:00 2001 From: Robert Rothenberg Date: Fri, 17 May 2019 14:59:37 +0100 Subject: [PATCH 5/8] Add _accessor_aliases attribute We need the ability to look up original column names from the accessor names. This allows the information to be cached for a form. --- lib/HTML/FormHandler/TraitFor/Model/DBIC.pm | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/lib/HTML/FormHandler/TraitFor/Model/DBIC.pm b/lib/HTML/FormHandler/TraitFor/Model/DBIC.pm index 7720978..5cbd433 100644 --- a/lib/HTML/FormHandler/TraitFor/Model/DBIC.pm +++ b/lib/HTML/FormHandler/TraitFor/Model/DBIC.pm @@ -7,6 +7,7 @@ use Moose::Role; use Carp; use DBIx::Class::ResultClass::HashRefInflator; use DBIx::Class::ResultSet::RecursiveUpdate; +use List::Util 'pairmap'; use Scalar::Util ('blessed'); our $VERSION = '0.26'; @@ -259,6 +260,20 @@ sub _build_ru_flags { { unknown_params_ok => 1 }; } +has _accessor_aliases => ( + is => 'ro', + isa => 'HashRef', + lazy_build => 1, +); + +sub _build__accessor_aliases { + my $self = shift; + return { + pairmap { $b->{accessor} || $a => $a, $a => $a } + %{ $self->resultset->result_source->columns_info } + }; +} + sub validate_model { my ($self) = @_; return unless $self->validate_unique; From 03794ab96c60e4c15f8d31ca219fafe71735b20d Mon Sep 17 00:00:00 2001 From: Robert Rothenberg Date: Fri, 17 May 2019 15:00:20 +0100 Subject: [PATCH 6/8] Add List::Util 1.29 as a prerequisite for pairmap function --- dist.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/dist.ini b/dist.ini index 16f8569..ba1cad8 100644 --- a/dist.ini +++ b/dist.ini @@ -39,6 +39,7 @@ HTML::FormHandler = 0.40016 Moose = 2.0007 DBIx::Class = 0.08250 DBIx::Class::ResultSet::RecursiveUpdate = 0.25 +List::Util = 1.29 namespace::autoclean = 0.09 [Prereqs / TestRequires] From 7b223caffae0e17e3e626bdcd2b16d9c75557318 Mon Sep 17 00:00:00 2001 From: Robert Rothenberg Date: Fri, 17 May 2019 15:01:52 +0100 Subject: [PATCH 7/8] Look up column name from accessor This fixes #18 by using the column name instead of the accessor in the search condition. --- lib/HTML/FormHandler/TraitFor/Model/DBIC.pm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/HTML/FormHandler/TraitFor/Model/DBIC.pm b/lib/HTML/FormHandler/TraitFor/Model/DBIC.pm index 5cbd433..429efb8 100644 --- a/lib/HTML/FormHandler/TraitFor/Model/DBIC.pm +++ b/lib/HTML/FormHandler/TraitFor/Model/DBIC.pm @@ -483,8 +483,9 @@ sub validate_unique { my $value = $field->value; next unless defined $value; my $accessor = $field->accessor; + my $column = $self->_accessor_aliases->{$accessor} || $accessor; - my $count = $rs->search( { $accessor => $value, @id_clause } )->count; + my $count = $rs->search( { $column => $value, @id_clause } )->count; next if $count < 1; my $field_error = $field->get_message('unique') || $field->unique_message || 'Duplicate value for [_1]'; $field->add_error( $field_error, $field->loc_label ); From 4cb26017bcb9804f8a792e8ba8e61ec1bdee566a Mon Sep 17 00:00:00 2001 From: Robert Rothenberg Date: Fri, 17 May 2019 15:06:25 +0100 Subject: [PATCH 8/8] Add line to Changes --- Changes | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index 1ededcf..9ecbda6 100644 --- a/Changes +++ b/Changes @@ -1,3 +1,5 @@ + Bug: unable to make fields unique when the accessor differs from column name. + 0.29 Fix tests broken because item is now cleared @@ -78,4 +80,3 @@ Fix dependency errors 0.04 Sun July 26, 2009 Split from HTML::FormHandler distribution -