summaryrefslogtreecommitdiff
path: root/rt/lib/RT/Base.pm
diff options
context:
space:
mode:
Diffstat (limited to 'rt/lib/RT/Base.pm')
-rw-r--r--rt/lib/RT/Base.pm172
1 files changed, 172 insertions, 0 deletions
diff --git a/rt/lib/RT/Base.pm b/rt/lib/RT/Base.pm
new file mode 100644
index 0000000..f276aa2
--- /dev/null
+++ b/rt/lib/RT/Base.pm
@@ -0,0 +1,172 @@
+# BEGIN BPS TAGGED BLOCK {{{
+#
+# COPYRIGHT:
+#
+# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC
+# <jesse@bestpractical.com>
+#
+# (Except where explicitly superseded by other copyright notices)
+#
+#
+# LICENSE:
+#
+# This work is made available to you under the terms of Version 2 of
+# the GNU General Public License. A copy of that license should have
+# been provided with this software, but in any event can be snarfed
+# from www.gnu.org.
+#
+# This work is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301 or visit their web page on the internet at
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
+#
+#
+# CONTRIBUTION SUBMISSION POLICY:
+#
+# (The following paragraph is not intended to limit the rights granted
+# to you to modify and distribute this software under the terms of
+# the GNU General Public License and is only of importance to you if
+# you choose to contribute your changes and enhancements to the
+# community by submitting them to Best Practical Solutions, LLC.)
+#
+# By intentionally submitting any modifications, corrections or
+# derivatives to this work, or any other work intended for use with
+# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+# you are the copyright holder for those contributions and you grant
+# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable,
+# royalty-free, perpetual, license to use, copy, create derivative
+# works based on those contributions, and sublicense and distribute
+# those contributions and any derivatives thereof.
+#
+# END BPS TAGGED BLOCK }}}
+
+package RT::Base;
+use Carp ();
+use Scalar::Util ();
+
+use strict;
+use vars qw(@EXPORT);
+
+@EXPORT=qw(loc CurrentUser);
+
+=head1 NAME
+
+RT::Base
+
+
+=head1 SYNOPSIS
+
+=head1 DESCRIPTION
+
+=head1 FUNCTIONS
+
+=cut
+
+# {{{ sub CurrentUser
+
+=head2 CurrentUser
+
+If called with an argument, sets the current user to that user object.
+This will affect ACL decisions, etc. The argument can be either
+L<RT::CurrentUser> or L<RT::User> object.
+
+Returns the current user object of L<RT::CurrentUser> class.
+
+=cut
+
+sub CurrentUser {
+ my $self = shift;
+
+ if (@_) {
+ $self->{'original_user'} = $self->{'user'};
+ my $current_user = $_[0];
+ if ( ref $current_user eq 'RT::User' ) {
+ $self->{'user'} = new RT::CurrentUser;
+ $self->{'user'}->Load( $current_user->id );
+ } else {
+ $self->{'user'} = $current_user;
+ }
+ # We need to weaken the CurrentUser ($self->{'user'}) reference
+ # if the object in question is the currentuser object.
+ # This avoids memory leaks.
+ Scalar::Util::weaken($self->{'user'})
+ if ref $self->{'user'} && $self->{'user'} == $self;
+ }
+
+ unless ( ref $self->{'user'} && $self->{'user'}->isa('RT::CurrentUser') ) {
+ my $msg = "$self was created without a CurrentUser."
+ ." Any RT object which is subclass of RT::Base must be created"
+ ." with a RT::CurrentUser or a RT::User object as the first argument.";
+ $msg .= "\n". Carp::longmess() if @_;
+
+ $RT::Logger->error( $msg );
+ return $self->{'user'} = undef;
+ }
+
+ return ( $self->{'user'} );
+}
+
+# }}}
+
+sub OriginalUser {
+ my $self = shift;
+
+ if (@_) {
+ $self->{'original_user'} = shift;
+ Scalar::Util::weaken($self->{'original_user'})
+ if (ref($self->{'original_user'}) && $self->{'original_user'} == $self );
+ }
+ return ( $self->{'original_user'} || $self->{'user'} );
+}
+
+
+=head2 loc LOC_STRING
+
+l is a method which takes a loc string
+to this object's CurrentUser->LanguageHandle for localization.
+
+you call it like this:
+
+ $self->loc("I have [quant,_1,concrete mixer].", 6);
+
+In english, this would return:
+ I have 6 concrete mixers.
+
+
+=cut
+
+sub loc {
+ my $self = shift;
+ if (my $user = $self->OriginalUser) {
+ return $user->loc(@_);
+ }
+ else {
+ Carp::confess("No currentuser");
+ return ("Critical error:$self has no CurrentUser", $self);
+ }
+}
+
+sub loc_fuzzy {
+ my $self = shift;
+ if (my $user = $self->OriginalUser) {
+ return $user->loc_fuzzy(@_);
+ }
+ else {
+ Carp::confess("No currentuser");
+ return ("Critical error:$self has no CurrentUser", $self);
+ }
+}
+
+eval "require RT::Base_Vendor";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Base_Vendor.pm});
+eval "require RT::Base_Local";
+die $@ if ($@ && $@ !~ qr{^Can't locate RT/Base_Local.pm});
+
+
+1;