diff options
Diffstat (limited to 'rt/lib/RT/Watcher.pm')
| -rwxr-xr-x | rt/lib/RT/Watcher.pm | 313 | 
1 files changed, 313 insertions, 0 deletions
| diff --git a/rt/lib/RT/Watcher.pm b/rt/lib/RT/Watcher.pm new file mode 100755 index 000000000..c7c6100cf --- /dev/null +++ b/rt/lib/RT/Watcher.pm @@ -0,0 +1,313 @@ +# $Header: /home/cvs/cvsroot/freeside/rt/lib/RT/Attic/Watcher.pm,v 1.1 2002-08-12 06:17:07 ivan Exp $ +# (c) 1996-2001 Jesse Vincent <jesse@fsck.com> +# This software is redistributable under the terms of the GNU GPL + +=head1 NAME + +  RT::Watcher - RT Watcher object + +=head1 SYNOPSIS + +  use RT::Watcher; + + +=head1 DESCRIPTION + +This module should never be called directly by client code. it\'s an internal module which +should only be accessed through exported APIs in Ticket, Queue and other similar objects. + +=head1 METHODS + +=begin testing + +ok(require RT::TestHarness); +ok(require RT::Watcher); + +=end testing + +=cut + +package RT::Watcher; +use RT::Record; +@ISA= qw(RT::Record); + + +# {{{ sub _Init  + +sub _Init { +  my $self = shift; +   +  $self->{'table'} = "Watchers"; +  return ($self->SUPER::_Init(@_)); + +} +# }}} + +# {{{ sub Create  + +=head2 Create PARAMHASH + +Create a new watcher object with the following Attributes: + +Scope:  Ticket or Queue +Value: Ticket or queue id +Type: Requestor, Cc or AdminCc.  Requestor is not supported for a scope of \'Queue\' +Email: The email address of the watcher.  If the email address maps to an RT User, this is resolved +to an Owner object instead. +Owner: The RT user id of the \'owner\' of this watcher object.  + +=cut + +sub Create  { +    my $self = shift; +    my %args = ( +		Owner => undef, +		Email => undef, +		Value => undef, +		Scope => undef, +		Type => undef, +		Quiet => 0, +		@_ # get the real argumentlist +	       ); +     +    #Do we have someone this applies to? +    unless (($args{'Owner'} =~ /^(\d+)$/) || ($args{'Email'} =~ /\@/)) { +	return (0, "No user or email address specified"); +    } +     +    #if we only have an email address, try to resolve it to an owner +    if ($args{'Owner'} == 0) { +        my $User = new RT::User($RT::SystemUser); +        $User->LoadByEmail($args{'Email'}); +        if ($User->id) { +            $args{'Owner'} = $User->id; +   	    delete $args{'Email'}; +	} +    } +     +     +    if ($args{'Type'} eq "Requestor" and $args{'Owner'} == 0) { +	# Requestors *MUST* have an account +	 +	my $Address = RT::CanonicalizeAddress($args{'Email'}); +	 +	my $NewUser = RT::User->new($RT::SystemUser); +	my ($Val, $Message) = +	  $NewUser->Create(Name => $Address, +			   EmailAddress => $Address, +			   RealName => $Address, +			   Password => undef, +			   Privileged => 0, +			   Comments => 'Autocreated on ticket submission' +			  ); +	return (0, "Could not create watcher for requestor") +	  unless $Val; +	if ($NewUser->id) { +	    $args{'Owner'} = $NewUser->id; +	    delete $args{'Email'}; +	} +    } +     +     +     +     +    #Make sure we\'ve got a valid type +    #TODO --- move this to ValidateType  +    return (0, "Invalid Type") +      unless ($args{'Type'} =~ /^(Requestor|Cc|AdminCc)$/i); + +    my $id = $self->SUPER::Create(%args); +    if ($id) { +	return (1,"Interest noted"); +    } +    else { +	return (0, "Error adding watcher"); +    } +} +# }}} + +# {{{ sub Load  + +=head2 Load ID +   +  Loads a watcher by the primary key of the watchers table ($Watcher->id) +   +=cut + +sub Load  { +    my $self = shift; +    my $identifier = shift; +     +    if ($identifier !~ /\D/) { +	$self->SUPER::LoadById($identifier); +    } +    else { +	return (0, "That's not a numerical id"); +    } +} + +# }}} + +# {{{ sub LoadByValue + +=head2 LoadByValue PARAMHASH +   +LoadByValue takes a parameter hash with the following attributes: + +  Email, Owner, Scope, Type, Value + +The same rules enforced at create are enforced by Load. + +Returns a tuple of (retval, msg). Retval is 1 on success and 0 on failure. +msg describes what happened in a human readable form. + +=cut + +sub LoadByValue { +    my $self = shift; +    my %args = ( Email => undef,  +		 Owner => undef, +		 Scope => undef, +		 Type => undef, +		 Value => undef, +		 @_); +     +    #TODO: all this code is being copied from Create. that\'s silly +     +    #Do we have someone this applies to? +    unless (($args{'Owner'} =~ /^(\d*)$/) || ($args{'Email'} =~ /\@/)) { +	return (0, "No user or email address specified"); +    } +     +    #if we only have an email address, try to resolve it to an owner +    unless ($args{'Owner'}) { +        my $User = new RT::User($RT::SystemUser); +        $User->LoadByEmail($args{'Email'}); +        if ($User->id > 0) { +            $args{'Owner'} = $User->id; +   	    delete $args{'Email'}; +	} +    } +     +    if ((defined ($args{'Type'})) and  +	($args{'Type'} !~ /^(Requestor|Cc|AdminCc)$/i)) { +	return (0, "Invalid Type"); +    } +    if ($args{'Owner'}) { +	$self->LoadByCols( Type => $args{'Type'}, +			   Value => $args{'Value'}, +			   Owner => $args{'Owner'}, +			   Scope => $args{'Scope'}, +			 ); +    } +    else { +	$self->LoadByCols( Type => $args{'Type'}, +			   Email => $args{'Email'}, +			   Value => $args{'Value'}, +			   Scope => $args{'Scope'}, +			 ); +    }	 +    unless ($self->Id) { +	return(0, "Couldn\'t find that watcher"); +    } +    return (1, "Watcher loaded"); +} + +# }}} + +# {{{ sub OwnerObj  + +=head2 OwnerObj + +Return an RT Owner Object for this Watcher, if we have one + +=cut + +sub OwnerObj  { +    my $self = shift; +    if (!defined $self->{'OwnerObj'}) { +	require RT::User; +	$self->{'OwnerObj'} = RT::User->new($self->CurrentUser); +	if ($self->Owner) { +	    $self->{'OwnerObj'}->Load($self->Owner); +	} else { +	    return $RT::Nobody->UserObj; +	} +    } +    return ($self->{'OwnerObj'}); +} +# }}} + +# {{{ sub Email + +=head2 Email + +This custom data accessor does the right thing and returns +the 'Email' attribute of this Watcher object. If that's undefined, +it returns the 'EmailAddress' attribute of its 'Owner' object, which is +an RT::User object. + +=cut + +sub Email { +    my $self = shift; +     +    # IF Email is defined, return that. Otherwise, return the Owner's email address +    if (defined($self->__Value('Email'))) { +	return ($self->__Value('Email')); +    } +    elsif ($self->Owner) { +	return ($self->OwnerObj->EmailAddress); +    } +    else { +	return ("Data error"); +    } +} +# }}} +   +# {{{ sub IsUser + +=head2 IsUser + +Returns true if this watcher object is tied to a user object. (IE it +isn't sending to some other email address). +Otherwise, returns undef + +=cut + +sub IsUser { +    my $self = shift; +    # if this watcher has an email address glued onto it, +    # return undef + +    if (defined($self->__Value('Email'))) { +        return undef; +    } +    else { +        return 1; +    } +} + +# }}} + +# {{{ sub _Accessible  +sub _Accessible  { +  my $self = shift; +  my %Cols = ( +	      Email => 'read/write', +	      Scope => 'read/write', +	      Value => 'read/write', +	      Type => 'read/write', +	      Quiet => 'read/write', +	      Owner => 'read/write',	       +	      Creator => 'read/auto', +	      Created => 'read/auto', +	      LastUpdatedBy => 'read/auto', +	      LastUpdated => 'read/auto' +	     ); +  return($self->SUPER::_Accessible(@_, %Cols)); +} +# }}} + +1; +  | 
