[rt-users] Oddity within the RT database

Tim Cutts tjrc at sanger.ac.uk
Tue Mar 20 11:21:35 EDT 2012


On 20 Mar 2012, at 10:52, Ruslan Zakirov wrote:

> 
> 
> Ruslan from phone.
> 20.03.2012 14:31 пользователь "Tim Cutts" <tjrc at sanger.ac.uk> написал:
> >
> >
> > On 20 Mar 2012, at 08:26, Ruslan Zakirov wrote:
> >
> > > Have you tried to delete them in ui?
> >
> > Is that possible?  These don't show up in the query builder is loadable saved searches - they're the RT::System standard ones, not user or group saved searches.
> >
> > > Use rt-attributes viewer that is shipped with rt and installed into sbin directory.
> >
> > I've been using that to investigate them, yes.
> >
> > > Decide which one you need and just delete an attribute.
> >
> > From what I can see, both are in use by the various dashboards and things that users have set.  I think I may have to write a script to go through all the Attributes blob, and for these duplicated things set them to one particular one, and only once I've done that can I safely delete the redundant saved search.
> 
> This is better way to go.

Yep.  After all that care, it turned out only one dashboard needed updating before I deleted the duplicate rows, but for the record here's what I did.  Up front information:

Two system saved searches were duplicated, so I wanted to replace references to search 495 with 492, and search 496 with 493.

Step 1, update Dashboard references to the redundant searches, for which I used the script attached at the end of this mail.

Step 2, with straightforwards SQL, rename preferences associated with the redundant searches:

UPDATE Attributes SET Name = 'Pref-RT::Attribute-492' WHERE Name = 'Pref-RT::Attribute-495';
UPDATE Attributes SET Name = 'Pref-RT::Attribute-493' WHERE Name = 'Pref-RT::Attribute-496';

Step 3, delete the redundant searches:

DELETE FROM Attributes WHERE id = 495;
DELETE FROM Attributes WHERE id = 496;

I think that's about all that's required.  Certainly no-one's screaming...

I don't think anything's needed for homepage portlet preferences, since those appear to be store by search name rather than by id.  It's possible some users might have saved graphs, but I think I'll cross that bridge if someone complains, because the numbers will be single digits.

I'd always assumed that the home page was simply a special case of a dashboard, and was rather surprised to see that the implementation is completely different.  Is that for historical reasons?  I'm trying to remember - I suspect the customisable homepage was written first (3.6?) and dashboards came later (3.8?).

Regards,

Tim

PS.  Here's my little script:

#!/usr/bin/perl
use strict;
use warnings;

use lib qw(/opt/rt4/lib /opt/rt4/local/lib);

use Data::Dumper;
use RT;
use RT::Attributes;
use RT::Dashboard;
use RT::User;

RT::LoadConfig();
RT::Init();

# These are the system search id's I want to map across
my %attr_map = ( 495 => 492,
		 496 => 493 );

my $attributes = RT::Attributes->new(RT->SystemUser);
my $dashboard = RT::Dashboard->new(RT->SystemUser);
my $user = RT::User->new(RT->SystemUser);

$attributes->Limit( FIELD => 'Name', VALUE => 'Dashboard');

my ($res, $err);

while (my $attr = $attributes->Next) {
    # RT::SystemUser has no rights to load user's
    # dashboards, so we load the creating user's object to
    # use when loading the dashboard.
    ($res, $err) = $user->LoadById($attr->Creator);
    unless ($res) {
	warn "Could not load user: ", $attr->Creator, $err;
	next;
    }

    my $dashboard = RT::Dashboard->new($user);
    ($res, $err) = $dashboard->LoadById($attr->Id);
    unless ($res) {
	warn "Could not load dashboard ", $attr->Id,
             " as user ", $user->Name, ":", $err;
        next;
    }

    my ($pane, $portlets);
    my $panes = $dashboard->Panes;
    my $before = Dumper($panes);
    while (($pane, $portlets) = each %$panes) {
	foreach my $portlet (@$portlets) {
	    next unless ($portlet->{portlet_type} eq 'search');
	    if (exists($attr_map{$portlet->{id}})) {
		$portlet->{id} = $attr_map{$portlet->{id}};
	    }
	}
    }

    my $after = Dumper($panes);
    if ($before ne $after) {
	($res, $err) = $dashboard->Update(Panes => $panes);
	if ($res) {
	    printf q(
User: %s
Dashboard: %s (%d)
Before: %s
After: %s
), $user->Name, $dashboard->Name, $dashboard->Id, $before, $after;
	} else {
	    warn "Failed to update dashboard ",  $dashboard->Id,
	    ': ', $err;
	}
    }
}





-- 
 The Wellcome Trust Sanger Institute is operated by Genome Research 
 Limited, a charity registered in England with number 1021457 and a 
 company registered in England with number 2742969, whose registered 
 office is 215 Euston Road, London, NW1 2BE. 



More information about the rt-users mailing list