summaryrefslogtreecommitdiff
path: root/rt/lib/RT/Record.pm
diff options
context:
space:
mode:
authorivan <ivan>2002-08-12 06:17:09 +0000
committerivan <ivan>2002-08-12 06:17:09 +0000
commit3ef62a0570055da710328937e7f65dbb2c027c62 (patch)
treed549158b172fd499b4f81a2981b62aabbde4f99b /rt/lib/RT/Record.pm
parent030438c9cb1c12ccb79130979ef0922097b4311a (diff)
import rt 2.0.14
Diffstat (limited to 'rt/lib/RT/Record.pm')
-rwxr-xr-xrt/lib/RT/Record.pm345
1 files changed, 345 insertions, 0 deletions
diff --git a/rt/lib/RT/Record.pm b/rt/lib/RT/Record.pm
new file mode 100755
index 0000000..5340f7d
--- /dev/null
+++ b/rt/lib/RT/Record.pm
@@ -0,0 +1,345 @@
+#$Header: /home/cvs/cvsroot/freeside/rt/lib/RT/Record.pm,v 1.1 2002-08-12 06:17:07 ivan Exp $
+
+=head1 NAME
+
+ RT::Record - Base class for RT record objects
+
+=head1 SYNOPSIS
+
+
+=head1 DESCRIPTION
+
+
+=begin testing
+
+ok (require RT::Record);
+
+=end testing
+
+=head1 METHODS
+
+=cut
+
+
+package RT::Record;
+use DBIx::SearchBuilder::Record::Cachable;
+use RT::Date;
+use RT::User;
+
+@ISA= qw(DBIx::SearchBuilder::Record::Cachable);
+
+# {{{ sub _Init
+
+sub _Init {
+ my $self = shift;
+ $self->_MyCurrentUser(@_);
+
+}
+
+# }}}
+
+# {{{ _PrimaryKeys
+
+=head2 _PrimaryKeys
+
+The primary keys for RT classes is 'id'
+
+=cut
+
+sub _PrimaryKeys {
+ my $self = shift;
+ return(['id']);
+}
+
+# }}}
+
+# {{{ sub _MyCurrentUser
+
+sub _MyCurrentUser {
+ my $self = shift;
+
+ $self->CurrentUser(@_);
+ if(!defined($self->CurrentUser)) {
+ use Carp;
+ Carp::cluck();
+ $RT::Logger->err("$self was created without a CurrentUser\n");
+ return(0);
+ }
+}
+
+# }}}
+
+# {{{ sub _Handle
+sub _Handle {
+ my $self = shift;
+ return($RT::Handle);
+}
+# }}}
+
+# {{{ sub Create
+
+sub Create {
+ my $self = shift;
+ my $now = new RT::Date($self->CurrentUser);
+ $now->Set(Format=> 'unix', Value => time);
+ push @_, 'Created', $now->ISO()
+ if ($self->_Accessible('Created', 'auto'));
+
+
+ push @_, 'Creator', $self->{'user'}->id
+ if $self->_Accessible('Creator', 'auto');
+
+ push @_, 'LastUpdated', $now->ISO()
+ if ($self->_Accessible('LastUpdated', 'auto'));
+
+ push @_, 'LastUpdatedBy', $self->{'user'}->id
+ if $self->_Accessible('LastUpdatedBy', 'auto');
+
+
+
+ my $id = $self->SUPER::Create(@_);
+
+ if ($id) {
+ $self->Load($id);
+ }
+
+ return($id);
+
+}
+
+# }}}
+
+
+# {{{ sub LoadByCols
+
+=head2 LoadByCols
+
+Override DBIx::SearchBuilder::LoadByCols to do case-insensitive loads if the
+DB is case sensitive
+
+=cut
+
+sub LoadByCols {
+ my $self = shift;
+ my %hash = (@_);
+
+ # If this database is case sensitive we need to uncase objects for
+ # explicit loading
+ if ($self->_Handle->CaseSensitive) {
+ my %newhash;
+ foreach my $key (keys %hash) {
+ # If we've been passed an empty value, we can't do the lookup.
+ # We don't need to explicitly downcase integers or an id.
+ if ($key =~ '^id$' || $hash{$key} =~/^\d+$/ || !defined ($hash{$key}) ) {
+ $newhash{$key} = $hash{$key};
+ }
+ else {
+ $newhash{"lower(".$key.")"} = lc($hash{$key});
+ }
+ }
+ $self->SUPER::LoadByCols(%newhash);
+ }
+ else {
+ $self->SUPER::LoadByCols(%hash);
+ }
+}
+
+# }}}
+
+
+# {{{ Datehandling
+
+# There is room for optimizations in most of those subs:
+
+# {{{ LastUpdatedObj
+
+sub LastUpdatedObj {
+ my $self=shift;
+ my $obj = new RT::Date($self->CurrentUser);
+
+ $obj->Set(Format => 'sql', Value => $self->LastUpdated);
+ return $obj;
+}
+
+# }}}
+
+# {{{ CreatedObj
+
+sub CreatedObj {
+ my $self=shift;
+ my $obj = new RT::Date($self->CurrentUser);
+
+ $obj->Set(Format => 'sql', Value => $self->Created);
+
+
+ return $obj;
+}
+
+# }}}
+
+# {{{ AgeAsString
+#
+# TODO: This should be deprecated
+#
+sub AgeAsString {
+ my $self=shift;
+ return($self->CreatedObj->AgeAsString());
+}
+# }}}
+
+# {{{ LastUpdatedAsString
+
+# TODO this should be deprecated
+
+sub LastUpdatedAsString {
+ my $self=shift;
+ if ($self->LastUpdated) {
+ return ($self->LastUpdatedObj->AsString());
+
+ } else {
+ return "never";
+ }
+}
+
+# }}}
+
+# {{{ CreatedAsString
+#
+# TODO This should be deprecated
+#
+sub CreatedAsString {
+ my $self = shift;
+ return ($self->CreatedObj->AsString());
+}
+# }}}
+
+# {{{ LongSinceUpdateAsString
+#
+# TODO This should be deprecated
+#
+sub LongSinceUpdateAsString {
+ my $self=shift;
+ if ($self->LastUpdated) {
+
+ return ($self->LastUpdatedObj->AgeAsString());
+
+ } else {
+ return "never";
+ }
+}
+# }}}
+
+# }}} Datehandling
+
+
+# {{{ sub _Set
+sub _Set {
+ my $self = shift;
+
+ my %args = ( Field => undef,
+ Value => undef,
+ IsSQL => undef,
+ @_ );
+
+
+ #if the user is trying to modify the record
+ if ((!defined ($args{'Field'})) || (!defined ($args{'Value'}))) {
+ $args{'Value'} = 0;
+ }
+
+ $self->_SetLastUpdated();
+ $self->SUPER::_Set(Field => $args{'Field'},
+ Value => $args{'Value'},
+ IsSQL => $args{'IsSQL'});
+
+
+}
+# }}}
+
+# {{{ sub _SetLastUpdated
+
+=head2 _SetLastUpdated
+
+This routine updates the LastUpdated and LastUpdatedBy columns of the row in question
+It takes no options. Arguably, this is a bug
+
+=cut
+
+sub _SetLastUpdated {
+ my $self = shift;
+ use RT::Date;
+ my $now = new RT::Date($self->CurrentUser);
+ $now->SetToNow();
+
+ if ($self->_Accessible('LastUpdated','auto')) {
+ my ($msg, $val) = $self->__Set( Field => 'LastUpdated',
+ Value => $now->ISO);
+ }
+ if ($self->_Accessible('LastUpdatedBy','auto')) {
+ my ($msg, $val) = $self->__Set( Field => 'LastUpdatedBy',
+ Value => $self->CurrentUser->id);
+ }
+}
+
+# }}}
+
+# {{{ sub CreatorObj
+
+=head2 CreatorObj
+
+Returns an RT::User object with the RT account of the creator of this row
+
+=cut
+
+sub CreatorObj {
+ my $self = shift;
+ unless (exists $self->{'CreatorObj'}) {
+
+ $self->{'CreatorObj'} = RT::User->new($self->CurrentUser);
+ $self->{'CreatorObj'}->Load($self->Creator);
+ }
+ return($self->{'CreatorObj'});
+}
+# }}}
+
+# {{{ sub LastUpdatedByObj
+
+=head2 LastUpdatedByObj
+
+ Returns an RT::User object of the last user to touch this object
+
+=cut
+
+sub LastUpdatedByObj {
+ my $self=shift;
+ unless (exists $self->{LastUpdatedByObj}) {
+ $self->{'LastUpdatedByObj'}=RT::User->new($self->CurrentUser);
+ $self->{'LastUpdatedByObj'}->Load($self->LastUpdatedBy);
+ }
+ return $self->{'LastUpdatedByObj'};
+}
+
+# }}}
+
+# {{{ sub CurrentUser
+
+=head2 CurrentUser
+
+If called with an argument, sets the current user to that user object.
+This will affect ACL decisions, etc.
+Returns the current user
+
+=cut
+
+sub CurrentUser {
+ my $self = shift;
+
+ if (@_) {
+ $self->{'user'} = shift;
+ }
+ return ($self->{'user'});
+}
+# }}}
+
+
+1;