Bigtop

 view release on metacpan or  search on metacpan

lib/Bigtop/Backend/Control/Gantry.pm  view on Meta::CPAN


#-----------------------------------------------------------------
# $self->namespace() or Apps::Checkbook->namespace()
#-----------------------------------------------------------------
sub namespace {
    return '[% package_name %]';
}
[% END %]

1;

[% gen_pod %]

[% END %]

[% BLOCK use_stub %]
use [% module -%]
[%- IF imports -%] qw(
    [% imports.join("\n    ") %]

);

[%- ELSE -%];
[% END %]
[% END %]

[% BLOCK explicit_use_stub %]
use [% module %][% IF import_list %] [% import_list %][% END %];
[% END %]

[% BLOCK export_array %]
our @EXPORT = qw(
[% FOREACH exported_sub IN exported_subs %]
    [% exported_sub +%]
[% END %]
);
[% END %]

[% BLOCK dbix_uses %]
[% use_my_model %]
use [% base_model %];
sub schema_base_class { return '[% base_model %]'; }
use Gantry::Plugins::DBIxClassConn qw( get_schema );
[% END %]

[% BLOCK get_orm_helper %]
#-----------------------------------------------------------------
# get_orm_helper( )
#-----------------------------------------------------------------
sub get_orm_helper {
    return '[% helper %]';
}

[% END %]

[% BLOCK class_access %]
#-----------------------------------------------------------------
# get_model_name( )
#-----------------------------------------------------------------
sub get_model_name {
    return $[% model_alias %];
}

[% END %]

[% BLOCK text_description %]
#-----------------------------------------------------------------
# text_descr( )
#-----------------------------------------------------------------
sub text_descr     {
    return '[% description %]';
}
[% END %]

[% BLOCK controller_method +%]
#-----------------------------------------------------------------
# $self->[% method_name %]( [% child_output.doc_args.join( ', ' ) %] )
#-----------------------------------------------------------------
# This method inherited from [% gen_package_name %]

[% END %]

[% BLOCK gen_controller_method +%]
#-----------------------------------------------------------------
# $self->[% method_name %]( [% child_output.doc_args.join( ', ' ) %] )
#-----------------------------------------------------------------
sub [% method_name %] {
[% child_output.body %]
} # END [% method_name %]

[% END %]

[% BLOCK init_method_body %]
[% arg_capture %]

    # process SUPER's init code
    $self->SUPER::init( $r );

[% FOREACH config IN configs %]
    $self->set_[% config %]( $self->fish_config( '[% config %]' ) || '' );
[% END %]
[% END %]

[% BLOCK config_accessors %]
[% FOREACH config IN configs %]
#-----------------------------------------------------------------
# $self->set_[% config %]( $new_value )
#-----------------------------------------------------------------
sub set_[% config %] {
    my ( $self, $value ) = @_;

    $self->{ __[% config %]__ } = $value;
}

#-----------------------------------------------------------------
# $self->[% config %](  )
#-----------------------------------------------------------------
sub [% config %] {
    my $self = shift;

    return $self->{ __[% config %]__ };
}

[% END %]
[% END %]

[% BLOCK arg_capture %]
[% FOREACH arg IN args %]
    my [% arg %] = shift;
[% END %]
[% END %]

[% BLOCK arg_capture_st_nick_style %]
    my ( [% args.join( ', ' ) %] ) = @_;
[% END %]

[% BLOCK self_setup %]
    $self->stash->view->template( '[% template %]' );
    $self->stash->view->title( '[% title %]' );
[% IF with_real_loc %]

    my $real_location = $self->location() || '';
    if ( $real_location ) {
        $real_location =~ s{/+$}{};
        $real_location .= '/';
    }
[% END %]
[% END %]

[% BLOCK main_links %]
    $self->stash->view->data( { pages => $self->site_links() } );
[% END %]

[% BLOCK site_links %]
    return [
[% FOREACH page IN pages %]
        { link => [% page.link %], label => '[% page.label %]' },
[% END %]
    ];
[% END %]

[% BLOCK main_heading %]
[% IF limit_by %]
    my $header_option_suffix = ( $[% limit_by %] ) ? "/$[% limit_by %]" : '';

[% END %]
    my @header_options = (
[% FOREACH option IN header_options %]
        {
            text => '[% option.text %]',
            link => [% option.location +%],
            type => '[% option.type %]',
        },
[% END %]
    );

    my $retval = {
        headings       => [
[% FOREACH heading IN headings %]
[% IF heading.simple %]
            [% IF heading.simple.match( "'" ) %]q[[% heading.simple %]][% ELSE %]'[% heading.simple %]'[% END %],
[% ELSIF heading.href %]
            '<a href=' . [% heading.href.link %] . [% IF heading.href.text.match( "'" ) %]q[>[% heading.href.text %]</a>][% ELSE %]'>[% heading.href.text %]</a>'[% END %],
[% END %]
[% END %]
        ],
    };
[% END %]

[% BLOCK main_table %]

    [%- IF livesearch %]
    $retval->{ livesearch } = 1;

    [% END -%]
    my $params = $self->params;

[% IF where_terms.size > 0 %]
    my $search = {
[% FOREACH where_term IN where_terms %]
        [% where_term.col_name %] => [% where_term.value %],
[% END %]
    };
[% ELSE %]
    my $search = {};
[% END %]
    if ( $params->{ search } ) {
        my $form = $self->form();

        my @searches;
        foreach my $field ( @{ $form->{ fields } } ) {
            if ( $field->{ searchable } ) {
                push( @searches,
                    ( $field->{ name } => { 'like', "%$params->{ search }%"  } )
                );
            }
        }

        $search = {
            -or => \@searches
        } if scalar( @searches ) > 0;
    }

    my @row_options = (
[% FOREACH row_option IN row_options %]
        {
            text => '[% row_option.text %]',
[% IF row_option.location %]
            link => [% row_option.location %],
[% END %]
            type => '[% row_option.type %]',
        },
[% END %]
    );

    my $perm_obj = Gantry::Utils::TablePerms->new(
        {
            site           => $self,
            real_location  => $real_location,
            header_options => \@header_options,
            row_options    => \@row_options,
        }
    );

    $retval->{ header_options } = $perm_obj->real_header_options;

    my $limit_to_user_id = $perm_obj->limit_to_user_id;
    $search->{ user_id } = $limit_to_user_id if ( $limit_to_user_id );

[% IF dbix AND rows AND limit_by -%]
    my $page    = $params->{ page } || 1;

    if ( $[% limit_by %] ) {
        $search->{ [% limit_by %] } = $[% limit_by %];
    }

    my $schema  = $self->get_schema();
    my $results = $[% model %]->get_listing(
        {
[% IF pseudo_cols.size > 0 %]
            '+select'   => [[% FOREACH pseudo_col IN pseudo_cols %][% pseudo_col.field %][% UNLESS loop.last %] [% END %][% END %]],
            '+as'       => [[% FOREACH pseudo_col IN pseudo_cols %]'[% pseudo_col.alias %]'[% UNLESS loop.last %] [% END %][% END %]],
[% END %]
            schema      => $schema,
            rows        => [% rows %],
            where       => $search,[% IF order_by %][% "\n" %]            order_by    => '[% order_by %]',[% END +%]
        }
    );

    my $rows          = $results->page( $page );
    $retval->{ page } = $rows->pager();

    ROW:
    while ( my $row = $rows->next ) {
[%- ELSIF dbix AND rows -%]
    my $page    = $params->{ page } || 1;

    my $schema  = $self->get_schema();
    my $results = $[% model %]->get_listing(
        {
[% IF pseudo_cols.size > 0 %]
            '+select'   => [[% FOREACH pseudo_col IN pseudo_cols %][% pseudo_col.field %][% UNLESS loop.last %] [% END %][% END %]],
            '+as'       => [[% FOREACH pseudo_col IN pseudo_cols %]'[% pseudo_col.alias %]'[% UNLESS loop.last %] [% END %][% END %]],
[% END %]
            schema      => $schema,
            rows        => [% rows %],
            where       => $search,[% IF order_by %][% "\n" %]            order_by    => '[% order_by %]',[% END +%]
        }
    );

    my $rows          = $results->page( $page );
    $retval->{ page } = $rows->pager();

    ROW:
    while ( my $row = $rows->next ) {
[%- ELSIF dbix AND limit_by -%]
    if ( $[% limit_by %] ) {
        $search->{ [% limit_by %] } = $[% limit_by %];
    }

    my $schema = $self->get_schema();
    my @rows   = $[% model %]->get_listing(
        {
[% IF pseudo_cols.size > 0 %]
            '+select'   => [[% FOREACH pseudo_col IN pseudo_cols %][% pseudo_col.field %][% UNLESS loop.last %] [% END %][% END %]],
            '+as'       => [[% FOREACH pseudo_col IN pseudo_cols %]'[% pseudo_col.alias %]'[% UNLESS loop.last %] [% END %][% END %]],
[% END %]
            schema      => $schema,
            where       => $search,[% IF order_by %][% "\n" %]            order_by    => '[% order_by %]',[% END +%]
        }
    );

    ROW:
    foreach my $row ( @rows ) {
[%- ELSIF dbix -%]
    my $schema = $self->get_schema();
    my @rows   = $[% model %]->get_listing(
        {
[% IF pseudo_cols.size > 0 %]
            '+select'   => [[% FOREACH pseudo_col IN pseudo_cols %][% pseudo_col.field %][% UNLESS loop.last %] [% END %][% END %]],
            '+as'       => [[% FOREACH pseudo_col IN pseudo_cols %]'[% pseudo_col.alias %]'[% UNLESS loop.last %] [% END %][% END %]],
[% END %]
            schema      => $schema,
            where       => $search,[% IF order_by %][% "\n" %]            order_by    => '[% order_by %]',[% END +%]
        }
    );

    ROW:
    foreach my $row ( @rows ) {
[%- ELSE -%]
    my @rows = $[% model %]->get_listing([% IF order_by %] { order_by => '[% order_by %]', } [% END %]);

    ROW:
    foreach my $row ( @rows ) {
[%- END -%]

        last ROW if $perm_obj->hide_all_data;

        my $id = $row->id;
[% FOREACH foreigner IN foreigners %]
        my $[% foreigner %] = ( $row->[% foreigner %] )
                ? $row->[% foreigner %]->foreign_display()
                : '';
[% END %]

        push(
            @{ $retval->{rows} }, {
                orm_row => $row,
                data => [
[% FOREACH data_col IN data_cols %]
                    [% data_col %],
[% END %]
                ],
                options => $perm_obj->real_row_options( $row ),
            }
        );
    }

    if ( $params->{ json } ) {
        $self->template_disable( 1 );

        my $obj = {
            headings        => $retval->{ headings },
            header_options  => $retval->{ header_options },
            rows            => $retval->{ rows },
        };

        my $json = to_json( $obj, { allow_blessed => 1 } );
        return( $json );
    }

    $self->stash->view->data( $retval );
[% END %]

[% BLOCK form_body %]
[% arg_capture %]
[%- IF dbix -%]
    my $selections = $[% model %]->get_form_selections(
        {
            schema          => $self->get_schema(),
[% IF refers_to.size > 0 %]
            foreign_tables  => {
[% FOREACH rt_table IN refers_to %]
                '[% rt_table %]' => 1,
[% END %]
            }
[% END -%]
        }
    );

[%- ELSE -%]
    my $selections = $[% model %]->get_form_selections();

[%- END -%]

    return {
[% IF form_name %]        name       => '[% form_name %]',
[% END -%]
[% IF raw_row %]        row        => $row,
[% ELSE %]        row        => $data->{row},
[% END -%]
[% FOREACH extra_key_name IN extra_keys.keys() %]
        [% extra_key_name %] => [% extra_keys.$extra_key_name %],
[% END %]
        fields     => [
[% FOREACH field IN fields %]
            {
[% FOREACH key = field.keys %]
[% IF key == 'options_string' %]
                options => [% field.$key %],
[% ELSIF key == 'constraint' OR field.$key.match( '^\d+$' ) %]
                [% key %] => [% field.$key %],
[% ELSIF key == 'options' %]
                options => [
[% arg_list = field.$key %]
[% FOREACH pair IN arg_list %]
[% FOREACH pair_key IN pair.keys() %]
                    { label => '[% pair_key %]', value => '[% pair.$pair_key %]' },
[% END %]
[% END %]
                ],
[% ELSE %]
                [% key %] => [% IF field.$key.match( "'" ) %]q[[% field.$key %]][% ELSE %]'[% field.$key %]'[% END %],
[% END %]
[% END %]
            },
[% END %]
        ],
    };
[% END %]

[% BLOCK crud_helpers %]

my $[% crud_name %] = Gantry::Plugins::CRUD->new(
    add_action      => \&[% crud_name %]_add,
    edit_action     => \&[% crud_name %]_edit,
    delete_action   => \&[% crud_name %]_delete,
    form            => __PACKAGE__->can( '[% form_method_name %]' ),
    redirect        => \&[% crud_name %]_redirect,
    text_descr      => '[% text_descr %]',
);

#-----------------------------------------------------------------
# $self->[% crud_name %]_redirect( $data )
# The generated version mimics the default behavior, feel free
# to delete the redirect key from the constructor call for $crud
# and this sub.
#-----------------------------------------------------------------
sub [% crud_name %]_redirect {
    my ( $self, $data ) = @_;
    return $self->location;
}

#-------------------------------------------------
# $self->do_add( )
#-------------------------------------------------
sub do_add {
    my $self = shift;
[% IF with_perms %]

    Gantry::Plugins::CRUD::verify_permission( { site => $self } );
[% END %]

    $[% crud_name %]->add( $self, { data => \@_ } );
}

#-------------------------------------------------
# $self->[% crud_name %]_add( $params, $data )
#-------------------------------------------------
sub [% crud_name %]_add {
    my ( $self, $params, $data ) = @_;

    # make a new row in the $[% model_alias %] table using data from $params
    # remember to add commit if needed

    $[% model_alias %]->gupdate_or_create( $self, $params );
}

#-------------------------------------------------
# $self->do_delete( $doomed_id, $confirm )
#-------------------------------------------------
sub do_delete {
    my ( $self, $doomed_id, $confirm ) = @_;

    my $row = $[% model_alias %]->gfind( $self, $doomed_id );
[% IF with_perms %]

    Gantry::Plugins::CRUD::verify_permission( { site => $self, row => $row } );
[% END %]

    $[% crud_name %]->delete( $self, $confirm, { row => $row } );
}

#-------------------------------------------------
# $self->[% crud_name %]_delete( $data )
#-------------------------------------------------
sub [% crud_name %]_delete {
    my ( $self, $data ) = @_;

    # fish the id (or the actual row) from the data hash
    # delete it
    # remember to add commit if needed

    $data->{ row }->delete;
}

#-------------------------------------------------
# $self->do_edit( $id )
#-------------------------------------------------
sub do_edit {
    my ( $self, $id ) = @_;

    my $row = $[% model_alias %]->gfind( $self, $id );
[% IF with_perms %]

    Gantry::Plugins::CRUD::verify_permission( { site => $self, row => $row } );
[% END %]

    $[% crud_name %]->edit( $self, { row => $row } );
}

#-------------------------------------------------
# $self->[% crud_name %]_edit( $param, $data )
#-------------------------------------------------
sub [% crud_name %]_edit {
    my( $self, $params, $data ) = @_;

    # retrieve the row from the data hash
    # update the row
    # remember to add commit if needed

    $data->{row}->update( $params );
}
[% END %]

[% BLOCK SOAP_gen_method_body %]
    my $self        = shift;
    my $input       = $self->soap_in;
    my $output_data = $self->[% internal_method %]( $input );

    $self->template_disable( 1 );

    return $self->soap_out( $output_data );
[% END %]

[% BLOCK SOAP_stub_method %]
#-----------------------------------------------------------------
# $self->[% internal_method %](  )
#-----------------------------------------------------------------
sub [% internal_method %] {
    my ( $self, $input ) = @_;
} # END [% internal_method %]
[% END %]

[% BLOCK soap_methods %]

#-----------------------------------------------------------------
# $self->namespace(  )
#-----------------------------------------------------------------
sub namespace {
    return '[% stub_module %]';
} # END namespace

#-----------------------------------------------------------------
# $self->get_soap_ops
#-----------------------------------------------------------------
sub get_soap_ops {
    my $self = shift;

    return {
        soap_name      => '[% soap_name %]',
        location       => $self->location,
        namespace_base => '[% namespace_base %]',
        operations     => [
[% FOREACH op IN operations %]
            {
                name => '[% op.name %]',
                expects => [
[% FOREACH param IN op.expects %]
                    { name => '[% param.name %]', type => '[% param.type %]' },
[% END %]
                ],
                returns => [
[% FOREACH param IN op.returns %]
                    { name => '[% param.name %]', type => '[% param.type %]' },
[% END %]
                ],
            },
[% END %]
        ],
    };
} # END get_soap_ops
[% END %]
[% BLOCK soap_doc_advice %]
#-----------------------------------------------------------------
# $self->[% handler_method %](  )
#-----------------------------------------------------------------
sub [% handler_method %] {
[% arg_capture %]

    my $params = $self->params();  # easy way

[% FOREACH expected_param IN soap_params.expects %]
    my $[% expected_param.name %] = $params->{ [% expected_param.name %] };
[% END %]

# hard way:
#    my $xmlobj   = XML::LibXML->new();
#    my $dom      = $xmlobj->parse_string( $self->get_post_body() )
#            or return return_error( "Mal-formed XML request: $!" );
#
[% FOREACH expected_param IN soap_params.expects %]
#    my ( $[% expected_param.name %]_node ) = $dom->getElementsByLocalName( '[% expected_param.name %]' );
#    my $[% expected_param.name %]          = $[% expected_param.name %]_node->textContent;
[% END %]

[% FOREACH returned_param IN soap_params.returns %]
    my $[% returned_param.name %];
[% END %]

    my $time = $self->soap_current_time();

    my $ret_struct = [
        {
            GantrySoapServiceResponse => [
[% FOREACH returned_param IN soap_params.returns %]
                { [% returned_param.name %] => $[% returned_param.name %] },
[% END %]
            ]
        }
    ];

    $self->soap_namespace_set(
        'http://usegantry.org/soapservice'
    );

    return $self->soap_out( $ret_struct, 'internal', 'pretty' );
} # END [% handler_method %]
[% END %]
EO_TT_blocks

#-----------------------------------------------------------------
#   Methods in the B::C::Gantry package
#-----------------------------------------------------------------

sub what_do_you_make {
    return [
        [ 'lib/AppName.pm'       => 'Base module stub [safe to change]'    ],
        [ 'lib/AppName/*.pm'     => 'Controller stubs [safe to change]'    ],
        [ 'lib/AppName/GEN/*.pm' => 'Generated code [please, do not edit]' ],
    ];
}

sub backend_block_keywords {
    return [
        { keyword => 'no_gen',
          label   => 'No Gen',
          descr   => 'Skip everything for this backend',
          type    => 'boolean' },

        { keyword => 'run_test',
          label   => 'Run Tests',
          descr   => 'Makes tests which hit pages via a simple server',
          type    => 'boolean',
          default => 'true' },

        { keyword => 'full_use',
          label   => 'Full Use Statement',
          descr   => 'use Gantry qw( -Engine=... ); [defaults to false]',
          type    => 'boolean',
          default => 'false' },

        { keyword => 'dbix',
          label   => 'For use with DBIx::Class',
          descr   => 'Makes controllers usable with DBIx::Class',
          type    => 'boolean',
          default => 'false' },

        { keyword => 'template',
          label   => 'Alternate Template',
          descr   => 'A custom TT template.',
          type    => 'text' },
    ];
}

sub setup_template {
    my $class         = shift;



( run in 2.189 seconds using v1.01-cache-2.11-cpan-5735350b133 )