--- lib/A3C/View/Strix.pm 2008/06/14 12:31:35 153 +++ lib/A3C/View/Strix.pm 2008/06/16 23:24:25 187 @@ -6,7 +6,9 @@ =head1 DESCRIPTION -Display information about Strix sites +Display information about Strix instances + +=head1 TEMPLATES =cut @@ -16,51 +18,391 @@ use Jifty::View::Declare -base; use Data::Dump qw/dump/; -template 'index.html' => page { +=head2 / + +Display instaces search and some stats + +=cut - title is _('Strix sites'); +template 'index.html' => page { - h1 { _('Statistics') } + title is _('Strix instances'); - my $orgs = A3C::Model::StrixSiteCollection->new; + my $orgs = A3C::Model::StrixInstanceCollection->new; $orgs->unlimit; - dt { _('Number of Strix sites') } - dd { $orgs->count } + div { _('Number of instances in Strix: %1', $orgs->count ) }; + + render_region( + name => 'selected-instances', + path => '/strix/selected-instances' + ); + + render_region( + name => 'search-instances', + path => '/strix/search-instances', + ); }; +=head2 name_diff + +=cut + template 'name_diff' => page { - title is _('Strix sites'); + title is _('Strix name differences'); + + render_region( + name => 'selected-instances', + path => '/strix/selected-instances' + ); my $name_diff = A3C::SQL->new({ query => qq{ select - site,hreduorgurl, + instance,hreduorgurl, _site_name,o - from strix_sites - join hr_edu_orgs on cn = site + from strix_instances + join hr_edu_orgs on cn = instance where o != _site_name }}); - h1 { _('Name differences') } - dd { + if ( $name_diff->count > 0 ) { + table { row { - th { _('Site') } - th { _('Strix site name') } + th {} + th { _('Instance') } + th { _('Strix instance name') } th { _('hrEduOrg.o') } }; while ( my $row = $name_diff->next ) { row { - cell { hyperlink( url => 'http://' . $row->hreduorgurl, label => $row->site ) } + cell { show( 'instance-op', 'Create', '+', $row->instance ) } + cell { $row->instance } cell { $row->_site_name } cell { $row->o } } } } + + } else { + div { _("Can't find any instance of strix which has different name than data from LDAP") } + } + +}; + +=head2 sql + +Execute SQL query on instance + +=cut + +template 'sql' => page { + + title is _('Execute SQL'); + + render_region( + name => 'selected-instances', + path => '/strix/selected-instances' + ); + + render_region( + name => 'execute-sql', + path => '/strix/execute-sql', + ); + +}; + +sub strix { + my $instance = get('instance'); + return Strix->new({ instance => $instance }); +} + +=head2 sitemap + +=cut + +sub strix_link { + my ( $url, $label ) = @_; + hyperlink( + url => 'http://' . get('instance') . '.cms-qa.skole.hr' . $url, + label => $label || $url, + target => 'strix', + ); +} + +template 'sitemap' => page { + + title is _('Sitemap %1', get('instance')); + + render_region( + name => 'selected-instances', + path => '/strix/selected-instances' + ); + + my $site_id = get('site_id') || 1; + + my $sitemap = strix->site_navigation( $site_id ); + + sub full_url { + my $p = shift; + strix_link( $p->{url}, $p->{naziv} ); + if ( $p->{type} eq 'category' ) { + outs_raw(' '); + hyperlink( + url => '/strix/layout?url=' . $p->{url} . ';instance=' . get('instance'), + label => _('layout'), + class => 'layout', + ); + } + } + + sub children { + my $c = shift; + return unless defined $c->{children}; + ul { + foreach my $p ( @{ $c->{children} } ) { + li { + { class is $p->{class} }; + full_url( $p ); + children( $p ); + } + } + } + } + + ul { + foreach my $p ( @$sitemap ) { + li { + full_url( $p ); + children( $p ); + } + } + } + +}; + +=head2 layout + +=cut + +template 'layout' => page { + + my $url = get('url') || '/'; + + my $category = strix->category( $url ); + + warn dump( $category ); + + title is _('Layout %1 : %2', + $category->{sitename}, + $category->{naziv}, + ); + + render_region( + name => 'selected-instances', + path => '/strix/selected-instances' + ); + + strix_link( $category->{url}, $category->{naziv} ); + + my $layout = strix->layout( $url ); + + pre { + dump( $layout ); + } + +}; + +=head1 REGIONS + +=head2 execute-sql + +Execute SQL query on instance + +=cut + +template 'execute-sql' => sub { + + my $action = new_action( + class => 'StrixSQL', + moniker => 'strix-sql', + sticky_on_success => 1, + sticky_on_failure => 1, + arguments => { + instance => get('instance') + } + ); + + form { + render_action( $action => [ 'instance', 'sql' ] ); + form_submit( label => _('Execute SQL') ); + }; + + if ( my $sql = $action->result->content('sql') ) { + div { _('Found %1 results', $sql->count ) } + table { + row { map { th { $_ } } $sql->_column_names }; + while (my $row = $sql->next) { + row { + foreach my $col ( $sql->_column_names ) { + cell { $row->$col } + } + } + } + } + } +}; + +=head2 search-instances + +=cut + +template 'search-instances' => sub { + + h1 { _('Find instance') } + + my $action = new_action( + class => 'SearchStrixInstance', + moniker => 'search-strix-instance', + sticky_on_success => 1, + sticky_on_failure => 1, + ); + + + form { + render_action( $action => [ 'instance_contains', '_site_name_contains' ] ); + form_submit( label => _('Search') ); + }; + +# warn dump( $action->result->content ); + + if ( my $search = $action->result->content('search') ) { + div { _('Found %1 results', $search->count ) } + table { + while (my $strix = $search->next) { + row { + cell { tt { $strix->instance } } + cell { $strix->_site_name } + cell { show( 'instance-op', 'Create', '+', $strix->instance ) } + } + } + } + } + +}; + +=head2 selected-instances + +Show Selected instances for current user + +=cut + +template 'selected-instances' => sub { + my $self = shift; + +# warn "## IN selected-instances ",dump( @_ ); + + if ( my $op = get 'op' ) { + my $op_instance = get 'op_instance' or die "no op_instance?"; + warn "# selected-instances $op on $op_instance"; + + my $a; + + if ( $op eq 'Create' ) { + + $a = new_action( + class => $op . 'StrixInstanceSelection', + moniker => $op, + arguments => { + instance => $op_instance, + by_user => $self->current_user->id, + }, + ); + + } elsif ( $op eq 'Delete' ) { + + my $strix = A3C::Model::StrixInstanceSelection->new; + $strix->load_by_cols( instance => $op_instance, by_user => $self->current_user->id ); + warn "can't find instance $op_instance" unless $strix->id; + $a = $strix->as_delete_action; + + } +# warn "# argument_values = ",dump( $a->argument_values ); + $a->run; + + if ( $a->result->error ) { + div { + { class is 'note error' } + $a->result->error; + } + } + + set( op => '' ); + } + + my $selected = A3C::Model::StrixInstanceSelectionCollection->new; + $selected->limit( column => 'by_user', value => Jifty->web->current_user->id ); + + if ( $selected->count > 0 ) { + + my $instance = get('instance'); + + div { _('%1 instances selected', $selected->count ) }; + table { + while (my $s = $selected->next) { + row { + cell { tt { + if ( $s->instance->instance eq $instance ) { + b { $instance } + } else { + hyperlink( + url => '?instance=' . $s->instance->instance, + label => $s->instance->instance + ) + } + } } + cell { $s->instance->_site_name } + cell { show( 'instance-op', 'Delete', '-', $s->instance->instance ) } + } + } + } + } else { + div { _('No instances selected') } + } +}; + +=head2 instance-op + +Display button to add/remove instance from selection + + show( 'instance-op', 'Delete', '-', $strix->instace ); + +=cut + +template 'instance-op' => sub { + my $self = shift; + +# warn "# instance-op = ",dump( @_ ); + + my ( $op, $label, $instance ) = @_; + + form { + hyperlink( + label => $label, + onclick => { + refresh => 'selected-instances', + path => '/strix/selected-instances', + args => { + op_instance => $instance, + op => $op, + } + }, + ); } }; + 1;