]> git.decadent.org.uk Git - maypole.git/commitdiff
AJT synch
authorAaron Trevena <aaron.trevena@gmail.com>
Sat, 24 Dec 2005 10:30:10 +0000 (10:30 +0000)
committerAaron Trevena <aaron.trevena@gmail.com>
Sat, 24 Dec 2005 10:30:10 +0000 (10:30 +0000)
git-svn-id: http://svn.maypole.perl.org/Maypole/trunk@442 48953598-375a-da11-a14b-00016c27c3ee

AUTHORS [new file with mode: 0644]
Changes
MANIFEST
META.yml
ex/beerdb.sql [new file with mode: 0644]
lib/Maypole.pm
lib/Maypole/Model/CDBI.pm
lib/Maypole/View/TT.pm
lib/Maypole/templates/factory/addnew
lib/Maypole/templates/factory/login
lib/Maypole/templates/factory/macros

diff --git a/AUTHORS b/AUTHORS
new file mode 100644 (file)
index 0000000..34ec949
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,22 @@
+AUTHORS
+-------
+
+The following people have written and documented Maypole:
+
+Simon Cozens - Author Emeritus
+Sebastian Riedel - Maintainer (1.x to 2.x)
+Simon Flack - Maintainer ( 2.x to 2.9 )
+Aaron Trevena - Maintainer (2.10 to present)
+Dave Howorth - Developer
+David Baird - Developer
+
+Thanks also to for fixes and other contributions:
+
+Randal Schwartz
+Jester
+Marcus Ramberg
+Steven Simms
+Kevin Connor
+Dagfinn Ilmari MannsÃ¥ker
+Danijel Milicevic
+Dave Slack
diff --git a/Changes b/Changes
index 545522e882eaa62adca782bf6d5c226512e35169..bbee8111cc5240174980940230bafd1e3a9c5c22 100644 (file)
--- a/Changes
+++ b/Changes
@@ -7,13 +7,16 @@ For information about current developments and future releases, see:
 Deprecated:
     Directly accessing the attributes of the request object, or the parameters 
     in $r->params, or anything else, is DEPRECATED and likely to break in future 
-    releases. Be good, and use proper method calls. 
+    releases. Be good, and use proper method calls.
 
 Incompatible API changes:
     Maypole:
         - is_applicable() renamed to is_model_applicable(), and returns boolean 
             instead of a status code. Old-style is_applicable() will still work, 
             but issues a warning.
+    Maypole::Model
+       - delete and search actions are now deprecated - use do_search and do_delete
+         instead
 
 API additions and enhancements:
     Maypole::Application:
@@ -37,6 +40,8 @@ API additions and enhancements:
         - added make_path() 
         - added make_uri()
        - improved exception handling
+     Maypole::Model
+       - do_delete, do_search in place of delete/search actions
      Maypole::View::TT:
        - new report_error method
        - new embedded error report page in __DATA__
index d7669704ff2b10efe52728a009b76697632d56f3..be5dea420fc33e521747218794e2213f583e0431 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -62,4 +62,4 @@ lib/Maypole/templates/factory/pager
 lib/Maypole/templates/factory/search_form
 lib/Maypole/templates/factory/title
 lib/Maypole/templates/factory/view
-lib/Maypole/templates/maypole.css
+lib/Maypole/templates/factory/maypole.css
index 02da7a517a229586fcc2c68adcace8cd6c27ce8b..846173725b5ac283499f4ceecfb2126ed4e3ba98 100644 (file)
--- a/META.yml
+++ b/META.yml
@@ -1,7 +1,7 @@
 # http://module-build.sourceforge.net/META-spec.html
 #XXXXXXX This is a prototype!!!  It will change in the future!!! XXXXX#
 name:         Maypole
-version:      2.10
+version:      2.11
 version_from: lib/Maypole.pm
 installdirs:  site
 requires:
@@ -18,11 +18,14 @@ requires:
     Class::DBI::SQLite:            0
     Digest::MD5:                   0
     HTTP::Headers:                 1.59
+    HTTP::Server::Simple:          0.02
+    HTTP::Server::Simple::Static:  0.01
     Template:                      0
     Template::Plugin::Class:       0
     Test::MockModule:              0
     UNIVERSAL::moniker:            0
     UNIVERSAL::require:            0
+    URI:                           0
     URI::QueryParam:               0
 
 distribution_type: module
diff --git a/ex/beerdb.sql b/ex/beerdb.sql
new file mode 100644 (file)
index 0000000..b5d7d7c
--- /dev/null
@@ -0,0 +1,37 @@
+CREATE TABLE style (
+    id integer primary key auto_increment,
+    name varchar(60),
+    notes text
+);
+
+CREATE TABLE pub (
+    id integer primary key auto_increment,
+    name varchar(60),
+    url varchar(120),
+    notes text
+);
+
+CREATE TABLE handpump (
+    id integer primary key auto_increment,
+    beer integer,
+    pub integer
+);
+
+CREATE TABLE beer (
+    id integer primary key auto_increment,
+    brewery integer,
+    style integer,
+    name varchar(30),
+    url varchar(120),
+    score integer(2),
+    price varchar(12),
+    abv varchar(10),
+    notes text
+);
+
+CREATE TABLE brewery (
+    id integer  primary key auto_increment,
+    name varchar(30),
+    url varchar(50),
+    notes text
+);
index 85d471f33f43369b3d94370cc672aad065d47d10..119a85a29127c9908581bfa6afb34b667d0bd5c9 100644 (file)
@@ -443,16 +443,11 @@ sub handler : method
     $self->get_user;
     
     my $status = $self->handler_guts;
-    
-    # moving this here causes unit test failures - need to check why
-    # before committing the move
-    #$status = $self->__call_process_view unless $self->output;
-    
     return $status unless $status == OK;
     
     # TODO: require send_output to return a status code
     $self->send_output;
-    
+
     return $status;
 }
 
index 6ae19f53fa12db0ee355dcebb6425e26b30fe256..1442d0eccfa7a216d6e213c560ae1a8f2eec36c1 100644 (file)
@@ -113,8 +113,9 @@ sub do_edit : Exported
     my $table    = $r->table;
     
     my $required_cols = $config->{$table}->{required_cols} || [];
+    my $ignored_cols = $r->{config}{ $r->{table} }{ignore_cols};
     
-    ($obj, my $fatal, my $creating) = $self->_do_update_or_create($r, $obj, $required_cols);
+    ($obj, my $fatal, my $creating) = $self->_do_update_or_create($r, $obj, $required_cols, $ignored_cols);
     
     # handle errors, if none, proceed to view the newly created/updated object
     my %errors = $fatal ? (FATAL => $fatal) : $obj->cgi_update_errors;
@@ -140,7 +141,7 @@ sub do_edit : Exported
 # reported by Mp::P::Trace
 sub _do_update_or_create
 {
-    my ($self, $r, $obj, $required_cols) = @_;
+    my ($self, $r, $obj, $required_cols, $ignored_cols) = @_;
     
     my $fatal;
     my $creating = 0;
@@ -150,13 +151,19 @@ sub _do_update_or_create
     if ($obj) 
     {
         # We have something to edit
-        eval { $obj->update_from_cgi( $h => {required => $required_cols} ) };
+        eval { $obj->update_from_cgi( $h => {
+                                            required => $required_cols,
+                                            ignore => $ignored_cols,
+                                           } ) };
         $fatal = $@;
     }
-    else 
+    else
     {
-        eval { 
-            $obj = $self->create_from_cgi( $h => {required => $required_cols} ) 
+        eval {
+            $obj = $self->create_from_cgi( $h => {
+                                                 required => $required_cols,
+                                                 ignore => $ignored_cols,
+                                                } )
         };
         
         if ($fatal = $@) 
@@ -168,14 +175,22 @@ sub _do_update_or_create
     
     return $obj, $fatal, $creating;
 }
-    
+
 sub delete : Exported {
-    return shift->SUPER::delete(@_) if caller ne "Maypole::Model::Base";
-    my ( $self, $r ) = @_;
-    $_->SUPER::delete for @{ $r->objects || [] };
-    $r->objects( [ $self->retrieve_all ] );
-    $r->{template} = "list";
-    $self->list($r);
+  my $self = shift;
+  my ($sub) = (caller(1))[3];
+  $sub =~ /^(.+)::([^:]+)$/;
+  # So subclasses can still send search down ...
+  return ($1 ne "Maypole::Model::Base" && $2 ne "delete") ?
+    $self->SUPER::search(@_) : $self->do_delete(@_);
+}
+
+sub do_delete {
+  my ( $self, $r ) = @_;
+  $_->SUPER::delete for @{ $r->objects || [] };
+  $r->objects( [ $self->retrieve_all ] );
+  $r->{template} = "list";
+  $self->list($r);
 }
 
 sub stringify_column {
@@ -197,9 +212,15 @@ sub adopt {
 }
 
 sub search : Exported {
-    return shift->SUPER::search(@_) if caller ne "Maypole::Model::Base";
+  my $self = shift;
+  my ($sub) = (caller(1))[3];
+  $sub =~ /^(.+)::([^:]+)$/;
+  # So subclasses can still send search down ...
+  return ($1 ne "Maypole::Model::Base" && $2 ne "search") ?
+    $self->SUPER::search(@_) : $self->do_search(@_);
+}
 
-    # A real CDBI search.
+sub do_search : Exported {
     my ( $self, $r ) = @_;
     my %fields = map { $_ => 1 } $self->columns;
     my $oper   = "like";                                # For now
index 0280e1ef3ab52fdd460d8b5978a0aff598200d31..fd71b4834bb879ba326a9468820579bcb95511bd 100644 (file)
@@ -276,6 +276,34 @@ and useful macros in the templates/ directory of the package and these are used
 in the beerdb and default templates. See the MACRO section of the
 L<Template::Manual::Directives> documentation.
 
+=head1 ACCESSING MAYPOLE VALUES
+
+=head2 request
+
+You can access the request in your templates in order to see the action, table, etc as well
+as parameters passed through forms :
+
+for example
+
+Hello [% request.params.forename %] [% request.params.surname %] !
+
+or 
+
+Are you want to [% request.action %] in the [% request.table %] ?
+
+=head2 config
+
+You can access your maypole application configuration through the config variable :
+
+<link base="[% config.uri_base %]"/>
+
+=head2 object and objects
+
+Objects are passed to the request using r->objects($arrayref) and are accessed in the templates
+as an array called objects.
+
+[% FOR objects %] <a href="[% config.uri_base %]/[% request.table %]/view/[% object.id %]"> [% object %] </a> [% END %]
+
 =head1 MAYPOLE MACROS AND FILTERS
 
 Maypole provides a collection of useful and powerful macros in the templates/factory/macros
index bf2b9ce5688f8c9fff180d6e097ba64646861e68..23344969dbedfa2ac40c56da876e611823baae9c 100644 (file)
@@ -30,7 +30,7 @@ table.
             elem.as_XML; %]
            </label>
         [% IF errors.$col %]
-           <span class="error">[% errors.$col %]</span>
+           <span class="error">[% errors.$col | html  %]</span>
         [% END %]
 
     [% END; %]
index 266921a5379a40e1e1a40a5f7b41fea3bac3ca34..af08e5b416e62b229eeb9b1d7ede96117d31a497 100644 (file)
@@ -1,22 +1,24 @@
 [% PROCESS macros %]
 [% INCLUDE header %]
 [% INCLUDE title %]
+[% user_field = config.auth.user_field || "user" %]
+
     <div id="title">You need to log in</div>
 
     <div id="login">
     [% IF login_error %]
-        <div class="error"> [% login_error %] </div>
+        <div class="error"> [% login_error | html %] </div>
     [% END %]
     <form method="post" action="[% base %]/[% request.path %]">
     <fieldset>
     <legend>Login</legend>
         <label>
             <span class="field">Username:</span>
-           <input name="[% config.auth.user_field || "user" %]" type="text" />
+           <input name="[% user_field %]" type="text" value="[% cgi_params.$user_field | html %]" />
         </label>
        <label>
            <span class="field">Password:</span>
-                   <input name="password" type="password" />
+                   <input name="password" type="password" value="[% cgi_params.passwrd | html %]"/>
        </label>        
         <input type="submit" name="login" value="Submit"/>
     </fieldset>
index a102c736a523dd78677661140fec7d0400892ca3..cbf58bb21902fd0b1f80a907190363aa184ecf1b 100644 (file)
@@ -16,7 +16,7 @@ MACRO link(table, command, additional, label) BLOCK;
     SET lnk = base _ "/" _ table _ "/" _ command _ "/" _ additional;
     lnk = lnk | uri | html;
     '<a href="' _ lnk _ '">';
-    label;
+    label | html;
     "</a>";
 END;
 %]
@@ -37,7 +37,7 @@ MACRO maybe_link_view(object) BLOCK;
     IF object.isa('Maypole::Model::Base');
         link(object.table, "view", object.id.join('/'), object);
     ELSE;
-        object;
+        object | html ;
     END;
 END;
 %]
@@ -58,7 +58,7 @@ for some.
        NEXT IF col == "id" OR col == classmetadata.table _ "_id";
         "<td>";
         IF col == "url" AND item.url;
-            '<a href="'; item.url; '"> '; item.url; '</a>';
+            '<a href="'; item.url | html ; '"> '; item.url; '</a>';
         ELSIF col == classmetadata.stringify_column;
             maybe_link_view(item);
         ELSE;
@@ -129,12 +129,12 @@ This takes an object and and displays its properties in a table.
 #%]
 [% MACRO view_item(item) BLOCK; %]
     [% SET string = classmetadata.stringify_column %]
-    <div id="title"> [% item.$string %]</div>
+    <div id="title"> [% item.$string | html %]</div>
     [% INCLUDE navbar %]
     <table class="view">
         <tr>
             <td class="field">[% classmetadata.colnames.$string %]</td>
-            <td>[% item.$string %]</td>
+            <td>[% item.$string | html %]</td>
         </tr>
         [% FOR col = classmetadata.columns.list;
             NEXT IF col == "id" OR col == string OR col == classmetadata.table _ "_id";;
@@ -152,7 +152,7 @@ from the C<column_names> method:
                 <td class="field">[% classmetadata.colnames.$col; %]</td>
                 <td>
                     [% IF col == "url" && item.url;  # Possibly too much magic.
-                        '<a href="'; item.url; '"> '; item.url; '</a>';
+                        '<a href="'; item.url | html ; '"> '; item.url; '</a>';
                     ELSE;
                         maybe_link_view(item.$col); 
                     END; %]