summaryrefslogtreecommitdiff
path: root/rt/lib/RT/Dashboard.pm
diff options
context:
space:
mode:
Diffstat (limited to 'rt/lib/RT/Dashboard.pm')
-rw-r--r--rt/lib/RT/Dashboard.pm358
1 files changed, 0 insertions, 358 deletions
diff --git a/rt/lib/RT/Dashboard.pm b/rt/lib/RT/Dashboard.pm
deleted file mode 100644
index c0531c464..000000000
--- a/rt/lib/RT/Dashboard.pm
+++ /dev/null
@@ -1,358 +0,0 @@
-# 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 }}}
-
-=head1 NAME
-
- RT::Dashboard - an API for saving and retrieving dashboards
-
-=head1 SYNOPSIS
-
- use RT::Dashboard
-
-=head1 DESCRIPTION
-
- Dashboard is an object that can belong to either an RT::User or an
- RT::Group. It consists of an ID, a name, and a number of
- saved searches and portlets.
-
-=head1 METHODS
-
-
-=cut
-
-package RT::Dashboard;
-
-use RT::SavedSearch;
-
-use strict;
-use warnings;
-use base qw/RT::SharedSetting/;
-
-use RT::System;
-RT::System::AddRights(
- SubscribeDashboard => 'Subscribe to dashboards', #loc_pair
-
- SeeDashboard => 'View system dashboards', #loc_pair
- CreateDashboard => 'Create system dashboards', #loc_pair
- ModifyDashboard => 'Modify system dashboards', #loc_pair
- DeleteDashboard => 'Delete system dashboards', #loc_pair
-
- SeeOwnDashboard => 'View personal dashboards', #loc_pair
- CreateOwnDashboard => 'Create personal dashboards', #loc_pair
- ModifyOwnDashboard => 'Modify personal dashboards', #loc_pair
- DeleteOwnDashboard => 'Delete personal dashboards', #loc_pair
-);
-
-
-=head2 ObjectName
-
-An object of this class is called "dashboard"
-
-=cut
-
-sub ObjectName { "dashboard" }
-
-sub SaveAttribute {
- my $self = shift;
- my $object = shift;
- my $args = shift;
-
- return $object->AddAttribute(
- 'Name' => 'Dashboard',
- 'Description' => $args->{'Name'},
- 'Content' => {Panes => $args->{'Panes'}},
- );
-}
-
-sub UpdateAttribute {
- my $self = shift;
- my $args = shift;
-
- my ($status, $msg) = (1, undef);
- if (defined $args->{'Panes'}) {
- ($status, $msg) = $self->{'Attribute'}->SetSubValues(
- Panes => $args->{'Panes'},
- );
- }
-
- if ($status && $args->{'Name'}) {
- ($status, $msg) = $self->{'Attribute'}->SetDescription($args->{'Name'})
- unless $self->Name eq $args->{'Name'};
- }
-
- if ($status && $args->{'Privacy'}) {
- my ($new_obj_type, $new_obj_id) = split /-/, $args->{'Privacy'};
- my ($obj_type, $obj_id) = split /-/, $self->Privacy;
-
- my $attr = $self->{'Attribute'};
- if ($new_obj_type ne $obj_type) {
- ($status, $msg) = $attr->SetObjectType($new_obj_type);
- }
- if ($status && $new_obj_id != $obj_id ) {
- ($status, $msg) = $attr->SetObjectId($new_obj_id);
- }
- $self->{'Privacy'} = $args->{'Privacy'} if $status;
- }
-
- return ($status, $msg);
-}
-
-=head2 Panes
-
-Returns a hashref of pane name to portlets
-
-=cut
-
-sub Panes {
- my $self = shift;
- return unless ref($self->{'Attribute'}) eq 'RT::Attribute';
- return $self->{'Attribute'}->SubValue('Panes') || {};
-}
-
-=head2 Portlets
-
-Returns the list of this dashboard's portlets, each a hashref with key
-C<portlet_type> being C<search> or C<component>.
-
-=cut
-
-sub Portlets {
- my $self = shift;
- return map { @$_ } values %{ $self->Panes };
-}
-
-=head2 Dashboards
-
-Returns a list of loaded sub-dashboards
-
-=cut
-
-sub Dashboards {
- my $self = shift;
- return map {
- my $search = RT::Dashboard->new($self->CurrentUser);
- $search->LoadById($_->{id});
- $search
- } grep { $_->{portlet_type} eq 'dashboard' } $self->Portlets;
-}
-
-=head2 Searches
-
-Returns a list of loaded saved searches
-
-=cut
-
-sub Searches {
- my $self = shift;
- return map {
- my $search = RT::SavedSearch->new($self->CurrentUser);
- $search->Load($_->{privacy}, $_->{id});
- $search
- } grep { $_->{portlet_type} eq 'search' } $self->Portlets;
-}
-
-=head2 ShowSearchName Portlet
-
-Returns an array for one saved search, suitable for passing to
-/Elements/ShowSearch.
-
-=cut
-
-sub ShowSearchName {
- my $self = shift;
- my $portlet = shift;
-
- if ($portlet->{privacy} eq 'RT::System') {
- return Name => $portlet->{description};
- }
-
- return SavedSearch => join('-', $portlet->{privacy}, 'SavedSearch', $portlet->{id});
-}
-
-=head2 PossibleHiddenSearches
-
-This will return a list of saved searches that are potentially not visible by
-all users for whom the dashboard is visible. You may pass in a privacy to
-use instead of the dashboard's privacy.
-
-=cut
-
-sub PossibleHiddenSearches {
- my $self = shift;
- my $privacy = shift || $self->Privacy;
-
- return grep { !$_->IsVisibleTo($privacy) } $self->Searches, $self->Dashboards;
-}
-
-# _PrivacyObjects: returns a list of objects that can be used to load
-# dashboards from. If the Modify parameter is true, then check modify rights.
-# If the Create parameter is true, then check create rights. Otherwise, check
-# read rights.
-
-sub _PrivacyObjects {
- my $self = shift;
- my %args = @_;
-
- my $CurrentUser = $self->CurrentUser;
- my @objects;
-
- my $prefix = $args{Modify} ? "Modify"
- : $args{Create} ? "Create"
- : "See";
-
- push @objects, $CurrentUser->UserObj
- if $self->CurrentUser->HasRight(
- Right => "${prefix}OwnDashboard",
- Object => $RT::System,
- );
-
- my $groups = RT::Groups->new($CurrentUser);
- $groups->LimitToUserDefinedGroups;
- $groups->WithMember( PrincipalId => $CurrentUser->Id,
- Recursively => 1 );
-
- push @objects, grep {
- $self->CurrentUser->HasRight(
- Right => "${prefix}GroupDashboard",
- Object => $_,
- )
- } @{ $groups->ItemsArrayRef };
-
- push @objects, RT::System->new($CurrentUser)
- if $CurrentUser->HasRight(
- Right => "${prefix}Dashboard",
- Object => $RT::System,
- );
-
- return @objects;
-}
-
-# ACLs
-
-sub _CurrentUserCan {
- my $self = shift;
- my $privacy = shift || $self->Privacy;
- my %args = @_;
-
- if (!defined($privacy)) {
- $RT::Logger->debug("No privacy provided to $self->_CurrentUserCan");
- return 0;
- }
-
- my $object = $self->_GetObject($privacy);
- return 0 unless $object;
-
- my $level;
-
- if ($object->isa('RT::User')) { $level = 'Own' }
- elsif ($object->isa('RT::Group')) { $level = 'Group' }
- elsif ($object->isa('RT::System')) { $level = '' }
- else {
- $RT::Logger->error("Unknown object $object from privacy $privacy");
- return 0;
- }
-
- # users are mildly special-cased, since we actually have to check that
- # the user is operating on himself
- if ($object->isa('RT::User')) {
- return 0 unless $object->Id == $self->CurrentUser->Id;
- }
-
- my $right = $args{FullRight}
- || join('', $args{Right}, $level, 'Dashboard');
-
- # all rights, except group rights, are global
- $object = $RT::System unless $object->isa('RT::Group');
-
- return $self->CurrentUser->HasRight(
- Right => $right,
- Object => $object,
- );
-}
-
-sub CurrentUserCanSee {
- my $self = shift;
- my $privacy = shift;
-
- $self->_CurrentUserCan($privacy, Right => 'See');
-}
-
-sub CurrentUserCanCreate {
- my $self = shift;
- my $privacy = shift;
-
- $self->_CurrentUserCan($privacy, Right => 'Create');
-}
-
-sub CurrentUserCanModify {
- my $self = shift;
- my $privacy = shift;
-
- $self->_CurrentUserCan($privacy, Right => 'Modify');
-}
-
-sub CurrentUserCanDelete {
- my $self = shift;
- my $privacy = shift;
-
- $self->_CurrentUserCan($privacy, Right => 'Delete');
-}
-
-sub CurrentUserCanSubscribe {
- my $self = shift;
- my $privacy = shift;
-
- $self->_CurrentUserCan($privacy, FullRight => 'SubscribeDashboard');
-}
-
-eval "require RT::Dashboard_Vendor";
-die $@ if ($@ && $@ !~ qr{^Can't locate RT/Dashboard_Vendor.pm});
-eval "require RT::Dashboard_Local";
-die $@ if ($@ && $@ !~ qr{^Can't locate RT/Dashboard_Local.pm});
-
-1;