Currently the dashboard allows users to get a quick overview of the status of jobs they're interested in, but more will be added, e.g. viewing all your jobsets or all jobs of which you're a maintainer.
KSBB33RE2PK5SFN7ZMOTZJQHZB4JYIIUUKWDSD3LSZ5GD465AJHQC N4ODPYP7XKBCZRAA6R3U23VHUUXEIB7KFQG2QAPDHFKYCUKF673AC FTPCV25MOLQUNR5CAR453W7T7QTUZRLPLEOSDZ5HSDFAXQZVHOYQC SS4TZXNUWXSEJC3XYHGVS3IBZ2D7GPIPELODVQOHRRGYADI2L72AC JATC3WQYHNS3QQ6XFDRJHC3JHNHKAJM5RAXC32EX7PDQSEYE6WLAC C3AG65SWAGDSML5MBD4ZPRCHI2LNNDN6IQZOI3HLYRJRPAW3QPAAC CQQSJLONTAKIWT4AEEDZFLFAFCSIPEGWLBJDJIS7VJK6FJ3LZ2RAC DEMSSSB22UI2ZN26C56UYO4NZWMDCRYKLAQARGOTSORSDXX3ZNNQC UWVMQIAC2HQNSG2JQOPZGUOCQ5V2JFP2F7RCTF3WJLK7NHSD5PAAC XJRJ4J7M6BC433TBLWHHKX7UYYCFX6M7ZQLUEYYTREPCSM6M3RDQC Y6AHH4THYQA43V77L43YM42DYRPCMDSWLUV4NKWAQYMPL4NTUIPQC S5PV6IIMKJ7PGWIFLLXERHYF3BCP2UEGFRZEZLD6UUBLVEZXJLUAC LZVO64YG43JD7YMZSCTZNOBS5ROZA4FMPKJW2YOMHX2V5PTGBVWQC SB2V735VJ2CDHGCXRUA5FOYHDRXQFVOZ3KXC3YKXWRNW6DIX7RXQC X27GNHDV5KPZ5GSH6DCAJMNCEMZLCP7M43JWF2X3O5QWXMOX273AC RBNQKATLSAKTGW2IRNB5CRV3SEH5F6E4BPVWX4BII7MH5TCIPINQC JM3DPYOMVNMCL5GMEYC3Y4NDRGTNIFBBFTPGPVT66GPENVPU7EVQC ZWCTAZGLJZQNTYWTC2XQUKMILJF6JGDL5IND6QNYWK4FIGMLRFXAC D5QIOJGPKQJIYBUCSC3MFJ3TXLPNZ2XMI37GXMFRVRFWWR2VMTFAC S66BOMVUACAUDSGSDWP7ZIXVMZSQHWXOZYVTB7ILUCWZ7DDFAKVAC JIJDYWPYMZZNFBCWYSYR72RNEW5MSI26MJ5UXXIU7DDX25IBR3CQC OIBSCXGIVF2MKTICVICURPOH63D5I5KHNCUD76KA33A6JYGDPJUAC IK53RV4VGOHLCZGQCCIKPB45M3C7M7YMNBOJFBGZJ4LWIZNU4QNQC QCGCX2BRDJ3MECT45M6KUQDSTVXWRHGLD4KKNG5UOCOTNAW7L3TQC ODNCGFQ5FPKFI624BVMLW7PJ2EFJOR3TY66OCZM42UNNTWBCF2TQC PZL3SZM3U3BYJX2RGYXC6NMBG7WQHFWHSYDYXZ7Q5VZA3EDYVPIQC J5UVLXOK6EDIL5I7VKWH4V2QDS4DPD7FHRK6XBWSXFRQS4JKXFZQC S5GCSCNSR43NZ23DR22G7E7ZWNCSQ44WUPXLESYHJCM7XBKED3SQC 2P7VNAACFSXMH42JCXQZ7GDAAEIFDGDWJOK6XD6G36AGEYQSRO2AC 2G63HKCHG7S6DGWDOHSDF7PXFPD6H4TRKDKIIFCXXAKET6FCWN2AC JZVRK5QJGPDT7HNQLC2UOJRG6V6QO4NJJ5V5QEMQ6VUTUIQWHG5AC QL55ECJ6KMMBUOWQ6LKSOVN7L43CH4S6SPE2AQ3VX3KSGC32RP4AC FANTYCR7X2TYLJKGO3E5CU4PVXPSOMQZELEFQCZ6E7GEJOPYXQUAC N22GPKYTOLZLBGTGDATQDVZ4R5APZEAOIA7L32X4UXBH4XNI7MWAC }sub star : Chained('job') PathPart('star') Args(0) {my ($self, $c) = @_;requirePost($c);requireUser($c);my $args ={ project => $c->stash->{project}->name, jobset => $c->stash->{jobset}->name, job => $c->stash->{job}->name};if ($c->request->params->{star} eq "1") {$c->user->starredjobs->update_or_create($args);} else {$c->user->starredjobs->find($args)->delete;}$c->stash->{resource}->{success} = 1;
# Get the N most recent builds for each starred job.$c->stash->{starredJobs} = [];foreach my $j ($c->stash->{user}->starredjobs->search({}, { order_by => ['project', 'jobset', 'job'] })) {my @builds = $j->job->builds->search({ },{ rows => 20, order_by => "id desc" });push $c->stash->{starredJobs}, { job => $j->job, builds => [@builds] };}}
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:t2CCfUjFEz/lO4szROz1AQ
__PACKAGE__->has_many("starredjobs","Hydra::Schema::StarredJobs",{"foreign.job" => "self.name","foreign.jobset" => "self.jobset","foreign.project" => "self.project",},undef,);# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-10-14 15:46:29# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:uYKWjewvKBEAuK53u7vKuw
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-09-25 14:10:28# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:cAZ4+c7OhqGW8ATru8Foiw
=cut__PACKAGE__->has_many("starredjobs","Hydra::Schema::StarredJobs",{"foreign.jobset" => "self.name","foreign.project" => "self.project",},undef,);
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:RffghAo9jAaqYk41y1Sdqw
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-10-14 15:46:29# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:PdNQ2mf5azBB6nI+iAm8fQ
use utf8;package Hydra::Schema::StarredJobs;# Created by DBIx::Class::Schema::Loader# DO NOT MODIFY THE FIRST PART OF THIS FILE=head1 NAMEHydra::Schema::StarredJobs=cutuse strict;use warnings;use base 'DBIx::Class::Core';=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON");=head1 TABLE: C<StarredJobs>=cut__PACKAGE__->table("StarredJobs");=head1 ACCESSORS=head2 usernamedata_type: 'text'is_foreign_key: 1is_nullable: 0=head2 projectdata_type: 'text'is_foreign_key: 1is_nullable: 0=head2 jobsetdata_type: 'text'is_foreign_key: 1is_nullable: 0=head2 jobdata_type: 'text'is_foreign_key: 1is_nullable: 0=cut__PACKAGE__->add_columns("username",{ data_type => "text", is_foreign_key => 1, is_nullable => 0 },"project",{ data_type => "text", is_foreign_key => 1, is_nullable => 0 },"jobset",{ data_type => "text", is_foreign_key => 1, is_nullable => 0 },"job",{ data_type => "text", is_foreign_key => 1, is_nullable => 0 },);=head1 PRIMARY KEY=over 4=item * L</username>=item * L</project>=item * L</jobset>=item * L</job>=back=cut__PACKAGE__->set_primary_key("username", "project", "jobset", "job");=head1 RELATIONS=head2 jobType: belongs_toRelated object: L<Hydra::Schema::Jobs>=cut__PACKAGE__->belongs_to("job","Hydra::Schema::Jobs",{ jobset => "jobset", name => "job", project => "project" },{ is_deferrable => 0, on_delete => "CASCADE", on_update => "CASCADE" },);=head2 jobsetType: belongs_toRelated object: L<Hydra::Schema::Jobsets>=cut__PACKAGE__->belongs_to("jobset","Hydra::Schema::Jobsets",{ name => "jobset", project => "project" },{ is_deferrable => 0, on_delete => "CASCADE", on_update => "CASCADE" },);=head2 projectType: belongs_toRelated object: L<Hydra::Schema::Projects>=cut__PACKAGE__->belongs_to("project","Hydra::Schema::Projects",{ name => "project" },{ is_deferrable => 0, on_delete => "CASCADE", on_update => "CASCADE" },);=head2 usernameType: belongs_toRelated object: L<Hydra::Schema::Users>=cut__PACKAGE__->belongs_to("username","Hydra::Schema::Users",{ username => "username" },{ is_deferrable => 0, on_delete => "CASCADE", on_update => "CASCADE" },);# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-10-14 15:46:29# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:naj5aKWuw8hLE6klmvW9Eg# You can replace this text with custom code or comments, and it will be preserved on regeneration1;
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:hy3MKvFxfL+1bTc7Hcb1zA
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-10-14 15:46:29# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:Hv9Ukqud0d3uIUot0ErKeg
[% WRAPPER layout.tt title="Dashboard" %][% PROCESS common.tt %]<ul class="nav nav-tabs"><li class="active"><a href="#tabs-starred-jobs" data-toggle="tab">Starred jobs</a></li></ul><div id="generic-tabs" class="tab-content"><div id="tabs-starred-jobs" class="tab-pane active">[% IF starredJobs.size > 0 %]<p>Below are the 20 most recent builds of your starred jobs.</p><table class="table table-striped table-condensed"><thead><tr><th>Job</th></tr></thead><tdata>[% FOREACH j IN starredJobs %]<tr><td>[% INCLUDE renderFullJobName project=j.job.get_column('project') jobset=j.job.get_column('jobset') job=j.job.name %]</td>[% FOREACH b IN j.builds %]<td><a href="[% c.uri_for('/build' b.id) %]">[% INCLUDE renderBuildStatusIcon size=16 build=b %]</a></td>[% END %]</tr>[% END %]</tdata></table>[% ELSE %]<div class="alert alert-warning">You have no starred jobs. You can add them by visiting a job page and clicking on the ☆ icon.</div>[% END %]</div></div>[% END %]
.star:hover {cursor: pointer;}
create table StarredJobs (userName text not null,project text not null,jobset text not null,job text not null,primary key (userName, project, jobset, job),foreign key (userName) references Users(userName) on update cascade on delete cascade,foreign key (project) references Projects(name) on update cascade on delete cascade,foreign key (project, jobset) references Jobsets(project, name) on update cascade on delete cascade,foreign key (project, jobset, job) references Jobs(project, jobset, name) on update cascade on delete cascade);
create table StarredJobs (userName text not null,project text not null,jobset text not null,job text not null,primary key (userName, project, jobset, job),foreign key (userName) references Users(userName) on update cascade on delete cascade,foreign key (project) references Projects(name) on update cascade on delete cascade,foreign key (project, jobset) references Jobsets(project, name) on update cascade on delete cascade,foreign key (project, jobset, job) references Jobs(project, jobset, name) on update cascade on delete cascade);