+=head2 Subscription
+
+Returns the L<RT::Attribute> representing the current user's subscription
+to this dashboard if there is one; otherwise, returns C<undef>.
+
+=cut
+
+sub Subscription {
+ my $self = shift;
+
+ # no subscription to unloaded dashboards
+ return unless $self->id;
+
+ for my $sub ($self->CurrentUser->UserObj->Attributes->Named('Subscription')) {
+ return $sub if $sub->SubValue('DashboardId') == $self->id;
+ }
+
+ return;
+}
+
+sub ObjectsForLoading {
+ my $self = shift;
+ my %args = (
+ IncludeSuperuserGroups => 1,
+ @_
+ );
+ my @objects;
+
+ # If you've been granted the SeeOwnDashboard global right (which you
+ # could have by way of global user right or global group right), you
+ # get to see your own dashboards
+ my $CurrentUser = $self->CurrentUser;
+ push @objects, $CurrentUser->UserObj
+ if $CurrentUser->HasRight(Object => $RT::System, Right => 'SeeOwnDashboard');
+
+ # Find groups for which: (a) you are a member of the group, and (b)
+ # you have been granted SeeGroupDashboard on (by any means), and (c)
+ # have at least one dashboard
+ my $groups = RT::Groups->new($CurrentUser);
+ $groups->LimitToUserDefinedGroups;
+ $groups->ForWhichCurrentUserHasRight(
+ Right => 'SeeGroupDashboard',
+ IncludeSuperusers => $args{IncludeSuperuserGroups},
+ );
+ $groups->WithMember(
+ Recursively => 1,
+ PrincipalId => $CurrentUser->UserObj->PrincipalId
+ );
+ my $attrs = $groups->Join(
+ ALIAS1 => 'main',
+ FIELD1 => 'id',
+ TABLE2 => 'Attributes',
+ FIELD2 => 'ObjectId',
+ );
+ $groups->Limit(
+ ALIAS => $attrs,
+ FIELD => 'ObjectType',
+ VALUE => 'RT::Group',
+ );
+ $groups->Limit(
+ ALIAS => $attrs,
+ FIELD => 'Name',
+ VALUE => 'Dashboard',
+ );
+ push @objects, @{ $groups->ItemsArrayRef };
+
+ # Finally, if you have been granted the SeeDashboard right (which
+ # you could have by way of global user right or global group right),
+ # you can see system dashboards.
+ push @objects, RT::System->new($CurrentUser)
+ if $CurrentUser->HasRight(Object => $RT::System, Right => 'SeeDashboard');
+
+ return @objects;
+}
+
+sub CurrentUserCanCreateAny {
+ my $self = shift;
+ my @objects;
+
+ my $CurrentUser = $self->CurrentUser;
+ return 1
+ if $CurrentUser->HasRight(Object => $RT::System, Right => 'CreateOwnDashboard');
+
+ my $groups = RT::Groups->new($CurrentUser);
+ $groups->LimitToUserDefinedGroups;
+ $groups->ForWhichCurrentUserHasRight(
+ Right => 'CreateGroupDashboard',
+ IncludeSuperusers => 1,
+ );
+ return 1 if $groups->Count;
+
+ return 1
+ if $CurrentUser->HasRight(Object => $RT::System, Right => 'CreateDashboard');
+
+ return 0;
+}
+
+=head2 Delete
+
+Deletes the dashboard and related subscriptions.
+Returns a tuple of status and message, where status is true upon success.
+
+=cut
+
+sub Delete {
+ my $self = shift;
+ my $id = $self->id;
+ my ( $status, $msg ) = $self->SUPER::Delete(@_);
+ if ( $status ) {
+ # delete all the subscriptions
+ my $subscriptions = RT::Attributes->new( RT->SystemUser );
+ $subscriptions->Limit(
+ FIELD => 'Name',
+ VALUE => 'Subscription',
+ );
+ $subscriptions->Limit(
+ FIELD => 'Description',
+ VALUE => "Subscription to dashboard $id",
+ );
+ while ( my $subscription = $subscriptions->Next ) {
+ $subscription->Delete();
+ }
+ }
+
+ return ( $status, $msg );
+}
+