HTML-FormHandler-Model-DBIC
view release on metacpan or search on metacpan
lib/HTML/FormHandler/TraitFor/Model/DBIC.pm view on Meta::CPAN
use Moose::Role;
use Carp;
use DBIx::Class::ResultClass::HashRefInflator;
use DBIx::Class::ResultSet::RecursiveUpdate;
use Scalar::Util ('blessed');
our $VERSION = '0.26';
has 'schema' => ( is => 'rw', );
has 'source_name' => (
isa => 'Str',
is => 'rw',
lazy => 1,
builder => 'build_source_name'
);
has unique_constraints => (
is => 'ro',
isa => 'ArrayRef',
lazy_build => 1,
);
sub _build_unique_constraints {
my $self = shift;
return [ grep { $_ ne 'primary' }
$self->resultset->result_source->unique_constraint_names ];
}
has unique_messages => (
is => 'ro',
isa => 'HashRef',
default => sub { +{} },
);
has 'ru_flags' => (
is => 'rw',
isa => 'HashRef',
traits => ['Hash'],
builder => '_build_ru_flags',
handles => { set_ru_flag => 'set', }
);
sub _build_ru_flags {
{ unknown_params_ok => 1 };
}
sub validate_model {
my ($self) = @_;
return unless $self->validate_unique;
return 1;
}
sub clear_model {
my $self = shift;
$self->item(undef);
$self->item_id(undef);
}
sub update_model {
my $self = shift;
my $item = $self->item;
my $source = $self->source;
warn "HFH: update_model for ", $self->name, "\n" if $self->verbose;
#warn "fif: " . Dumper ( $self->fif ); use Data::Dumper;
my %update_params = (
resultset => $self->resultset,
updates => $self->values,
%{ $self->ru_flags },
);
$update_params{object} = $self->item if $self->item;
my $new_item;
# perform update in a transaction, since RecursiveUpdate may do multiple
# updates if there are compound or multiple fields
$self->schema->txn_do(
sub {
$new_item = DBIx::Class::ResultSet::RecursiveUpdate::Functions::recursive_update(
%update_params);
$new_item->discard_changes;
}
);
$self->item($new_item) if $new_item;
return $self->item;
}
# undocumented because this is going to be replaced
# by a better method
sub guess_field_type {
my ( $self, $column ) = @_;
my $source = $self->source;
my @return;
# TODO: Should be able to use $source->column_info
# Is it a direct has_a relationship?
if (
$source->has_relationship($column) &&
( $source->relationship_info($column)->{attrs}->{accessor} eq 'single' ||
$source->relationship_info($column)->{attrs}->{accessor} eq 'filter' )
)
{
my $f_class = $source->related_class($column);
@return =
$f_class->isa('DateTime') ? ('DateTime') :
('Select');
}
# Else is it has_many?
elsif ( $source->has_relationship($column) &&
$source->relationship_info($column)->{attrs}->{accessor} eq 'multi' )
{
@return = ('Multiple');
}
elsif ( $column =~ /_time$/ ) # ends in time, must be time value
{
@return = ('DateTime');
}
( run in 1.184 second using v1.01-cache-2.11-cpan-5a3173703d6 )