0.15_26 commit r0_15_26
authorTony Cook <tony@develop-help.com>
Tue, 9 Aug 2005 05:27:54 +0000 (05:27 +0000)
committertony <tony@45cb6cf1-00bc-42d2-bb5a-07f51df49f94>
Tue, 9 Aug 2005 05:27:54 +0000 (05:27 +0000)
13 files changed:
MANIFEST
Makefile
site/cgi-bin/modules/BSE/Edit/Article.pm
site/cgi-bin/modules/BSE/Edit/Seminar.pm
site/cgi-bin/modules/BSE/Formatter.pm
site/cgi-bin/modules/BSE/UI/Formmail.pm
site/cgi-bin/modules/BSE/UI/Shop.pm
site/docs/bse.pod
site/docs/formmail.pod
site/templates/admin/edit_semsessions.tmpl
site/templates/admin/semsessionbookings.tmpl [new file with mode: 0644]
site/templates/shopitem.tmpl
test.cfg

index 905a1fc..cf6247b 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -309,6 +309,7 @@ site/templates/admin/regenerror.tmpl
 site/templates/admin/reports/list.tmpl
 site/templates/admin/reports/prompt.tmpl
 site/templates/admin/reports/show1.tmpl
+site/templates/admin/semsessionbookings.tmpl
 site/templates/admin/semsessiondel.tmpl
 site/templates/admin/semsessionedit.tmpl
 site/templates/admin/semsessionrollcall.tmpl
index ced1cdd..4450a4e 100755 (executable)
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-VERSION=0.15_25
+VERSION=0.15_26
 DISTNAME=bse-$(VERSION)
 DISTBUILD=$(DISTNAME)
 DISTTAR=../$(DISTNAME).tar
index 468d272..62645cf 100644 (file)
@@ -1450,6 +1450,7 @@ sub save_new {
 
   # we now have an id - generate the links
 
+  $article->update_dynamic($self->{cfg});
   my $cgi_uri = $self->{cfg}->entry('uri', 'cgi', '/cgi-bin');
   $article->setAdmin("$cgi_uri/admin/admin.pl?id=$article->{id}");
   $article->setLink($self->make_link($article));
index 92974ff..9476a0f 100644 (file)
@@ -22,6 +22,7 @@ sub article_actions {
      a_delsemsession => 'req_delsemsession',
      a_takesessionrole => 'req_takesessionrole',
      a_takesessionrolesave => 'req_takesessionrolesave',
+     a_semsessionbookings => 'req_semsessionbookings',
     );
 }
 
@@ -590,6 +591,27 @@ sub req_takesessionrolesave {
   return $self->refresh($article, $cgi, undef, "Roll saved");
 }
 
+sub req_semsessionbookings {
+  my ($self, $req, $article, $articles, $errors) = @_;
+
+  my $cgi = $req->cgi;
+  my $msg;
+  my $session = _get_session($req, $article, \$msg)
+    or return $self->edit_form($req, $article, $articles, $msg);
+
+  my @roll_call = $session->roll_call_entries;
+  my %acts;
+  my $it = BSE::Util::Iterate->new;
+  %acts =
+    (
+     $self->low_edit_tags(\%acts, $req, $article, $articles, undef, $errors),
+     $it->make_iterator(undef, 'bookeduser', 'bookedusers', \@roll_call),
+     session=>[ \&tag_hash, $session ],
+    );
+
+  return $req->dyn_response('admin/semsessionbookings', \%acts);
+}
+
 sub base_template_dirs {
   return ( "seminars" );
 }
index b3a8e90..2924ae8 100644 (file)
@@ -156,6 +156,7 @@ sub doclink {
     $url = $cfg->entryErr('site', 'url') . $url
       unless $url =~ /^\w+:/;
   }
+  $url = escape_html($url);
 
   unless ($title) {
     $title = escape_html($art->{title});
index b5f91a9..746820c 100644 (file)
@@ -82,7 +82,7 @@ sub _get_form {
     $cfg->entry("formmail", "field_config", '');
   my %std_cfg_names = map { $_ => 1 } 
     qw(required rules description required_error range_error mindatemsg 
-       maxdatemsg);
+       maxdatemsg default);
   my @extra_cfg_names = grep /\S/ && !exists $std_cfg_names{$_}, 
     split /,/, $extra_cfg_names;
   my $user = $req->siteuser;
@@ -90,7 +90,7 @@ sub _get_form {
     my $field = $fields->{$name};
     $field->{name} = $name;
 
-    for my $cfg_name (qw/htmltype type width height size maxlength/, 
+    for my $cfg_name (qw/htmltype type width height size maxlength default/, 
                      @extra_cfg_names) {
       my $value = $cfg->entry($valid_section, "${name}_${cfg_name}");
       defined $value and $field->{$cfg_name} = $value;
@@ -160,6 +160,7 @@ sub tag_values_select {
   my %labels = map @$_, @{$field->{values}};
 
   my ($value) = $cgi->param($field->{name});
+  defined $value or $value = $field->{default};
   my @extras;
   if (defined $value) {
     push @extras, -default => $value;
@@ -173,10 +174,13 @@ sub tag_values_select {
 }
 
 sub tag_ifValueSet {
-  my ($cgi, $rcurrent_field, $rcurrent_value) = @_;
+  my ($cgi, $rcurrent_field, $rcurrent_value, $errors) = @_;
 
   return 0 unless $$rcurrent_field && $$rcurrent_value;
   my @values = $cgi->param($$rcurrent_field->{name});
+  if (!$errors and !@values) {
+    @values = split /;/, $$rcurrent_field->{default};
+  }
   return scalar(grep $_ eq $$rcurrent_value->{id}, @values);
 }
 
@@ -221,7 +225,7 @@ sub req_show {
      values_select => 
      [ \&tag_values_select, $form, $req->cgi, \$current_field ],
      ifValueSet => 
-     [ \&tag_ifValueSet, $req->cgi, \$current_field, \$current_value ],
+     [ \&tag_ifValueSet, $req->cgi, \$current_field, \$current_value, $errors ],
      formcfg => [ \&tag_formcfg, $req->cfg, $form ],
     );
 
index c401ee6..70afe4a 100644 (file)
@@ -415,7 +415,13 @@ sub req_order {
   $req->session->{order_info} = \%values;
   $req->session->{order_info_confirmed} = 1;
 
-  return BSE::Template->get_refresh("$ENV{SCRIPT_NAME}?a_show_payment=1", $req->cfg);
+  # skip payment page if nothing to pay
+  if ($values{total} == 0) {
+    return $class->req_payment($req);
+  }
+  else {
+    return BSE::Template->get_refresh("$ENV{SCRIPT_NAME}?a_show_payment=1", $req->cfg);
+  }
 }
 
 sub req_show_payment {
@@ -489,56 +495,64 @@ sub req_payment {
   my $order_values = $req->session->{order_info}
     or return $class->req_checkout($req, "You need to enter order information first");
 
-
   my $cgi = $req->cgi;
   my $cfg = $req->cfg;
   my $session = $req->session;
 
-  my @pay_types = payment_types($cfg);
-  my @payment_types = map $_->{id}, grep $_->{enabled}, @pay_types;
-  my %pay_types = map { $_->{id} => $_ } @pay_types;
-  my %types_by_name = map { $_->{name} => $_->{id} } @pay_types;
-  @payment_types or @payment_types = ( PAYMENT_CALLME );
-  @payment_types = sort { $a <=> $b } @payment_types;
-  my %payment_types = map { $_=> 1 } @payment_types;
-
-  my $paymentType = $cgi->param('paymentType');
-  defined $paymentType or $paymentType = $payment_types[0];
-  $payment_types{$paymentType}
-    or return $class->req_show_payment($req, { paymentType => "Invalid payment type" } , 1);
-
-  my @required;
-  push @required, @{$pay_types{$paymentType}{require}};
-
-  my %fields = BSE::TB::Order->valid_payment_fields($cfg);
-  my %rules = BSE::TB::Order->valid_payment_rules($cfg);
-  for my $field (@required) {
-    if (exists $fields{$field}) {
-      $fields{$field}{required} = 1;
+  my $paymentType;
+  if ($order_values->{total} != 0) {
+    my @pay_types = payment_types($cfg);
+    my @payment_types = map $_->{id}, grep $_->{enabled}, @pay_types;
+    my %pay_types = map { $_->{id} => $_ } @pay_types;
+    my %types_by_name = map { $_->{name} => $_->{id} } @pay_types;
+    @payment_types or @payment_types = ( PAYMENT_CALLME );
+    @payment_types = sort { $a <=> $b } @payment_types;
+    my %payment_types = map { $_=> 1 } @payment_types;
+    
+    $paymentType = $cgi->param('paymentType');
+    defined $paymentType or $paymentType = $payment_types[0];
+    $payment_types{$paymentType}
+      or return $class->req_show_payment($req, { paymentType => "Invalid payment type" } , 1);
+    
+    my @required;
+    push @required, @{$pay_types{$paymentType}{require}};
+    
+    my %fields = BSE::TB::Order->valid_payment_fields($cfg);
+    my %rules = BSE::TB::Order->valid_payment_rules($cfg);
+    for my $field (@required) {
+      if (exists $fields{$field}) {
+       $fields{$field}{required} = 1;
+      }
+      else {
+       $fields{$field} = { description => $field, required=> 1 };
+      }
     }
-    else {
-      $fields{$field} = { description => $field, required=> 1 };
+    
+    my %errors;
+    dh_validate($cgi, \%errors, { rules => \%rules, fields=>\%fields },
+               $cfg, 'Shop Order Validation');
+    keys %errors
+      and return $class->req_show_payment($req, \%errors);
+
+    for my $field (@required) {
+      unless ($nostore{$field}) {
+       ($order_values->{$field}) = $cgi->param($field);
+      }
     }
-  }
-
-  my %errors;
-  dh_validate($cgi, \%errors, { rules => \%rules, fields=>\%fields },
-             $cfg, 'Shop Order Validation');
-  keys %errors
-    and return $class->req_show_payment($req, \%errors);
 
-  my @products;
-  my @items = $class->_build_items($req, \@products);
-  
-  for my $field (@required) {
-    unless ($nostore{$field}) {
-      ($order_values->{$field}) = $cgi->param($field);
-    }
+  }
+  else {
+    $paymentType = -1;
   }
 
+  $order_values->{paymentType} = $paymentType;
+
   $order_values->{filled} = 0;
   $order_values->{paidFor} = 0;
 
+  my @products;
+  my @items = $class->_build_items($req, \@products);
+  
   my $cust_class = custom_class($req->cfg);
   eval {
     my %custom = %{$session->{custom}};
@@ -558,8 +572,6 @@ sub req_payment {
     defined $order_values->{$col} or $order_values->{$col} = '';
   }
 
-  $order_values->{paymentType} = $paymentType;
-
   my @data = @{$order_values}{@columns};
   shift @data;
 
@@ -593,6 +605,7 @@ sub req_payment {
       my $sub = $product->subscription;
       $item->{max_lapsed} = $sub->{max_lapsed} if $sub;
     }
+    defined $item->{session_id} or $item->{session_id} = 0;
     my @data = @{$item}{@item_cols};
     
     shift @data;
@@ -645,6 +658,7 @@ sub req_payment {
       $order->{ccStatusText}  = $result->{error};
       $order->{ccTranId}      = '';
       $order->save;
+      my %errors;
       $errors{cardNumber} = $result->{error};
       $session->{order_work} = $order->{id};
       return $class->req_show_payment($req, \%errors);
@@ -725,6 +739,7 @@ sub req_orderdone {
   my %acts;
   %acts =
     (
+     $req->dyn_user_tags(),
      $cust_class->purchase_actions(\%acts, \@items, \@products, 
                                   $session->{custom}, $cfg),
      BSE::Util::Tags->static(\%acts, $cfg),
index 8b47a80..28f3288 100644 (file)
@@ -10,6 +10,48 @@ Maybe I'll add some other bits here.
 
 =head1 CHANGES
 
+=head2 0.15_26
+
+=over
+
+=item *
+
+added a session bookings page
+
+=item *
+
+the url generated by the doclink[] and popdoclink[] body text tags are
+now properly HTML escaped
+
+=item *
+
+the cached dynamic status of a newly created article is now set
+correctly.
+
+=item *
+
+fmail.pl forms now collect field defaults by, urr, default.
+
+=item *
+
+the ifValueSet fmail.pl tag now checks the field default for the
+initial display of a form.
+
+=item *
+
+the shop now skips the payment page if the order total is 0.
+
+=item *
+
+ordering a non-seminar product no longer causes a 500 error on final
+processing of the order.
+
+=item *
+
+the final order page wasn't processing dynamic page tags
+
+=back
+
 =head2 0.15_25
 
 =over
@@ -23,7 +65,27 @@ not replaced.  They are now.
 =item *
 
 page.pl now accepts the article id via the page parameter instead of
-id.
+id.  You will need to edit and save any existing articles to update
+their link fields with the new URL.
+
+=item *
+
+added bseaddimages.pl, a tool for adding image to an article on a
+remote BSE.  The -u and -p options are currently untested. YMMV.
+
+=item *
+
+the ofchild, ofallkid, and inline tags now perform HTML escaping.
+
+=item *
+
+many BSE::UserReg error handlers were calling the display functions
+with the old argument list, cause 500 errors when attempting to
+display errors.
+
+=item *
+
+added ifAccessControlled static article tag
 
 =back
 
index fb03d14..ef260d4 100644 (file)
@@ -229,6 +229,14 @@ I<fieldname>_description - a display name for the field.
 
 =item *
 
+I<fieldname>_default - the default value for the field.  For field
+with keys and display values, such as selects, this should be the key.
+For multiple select fields like checkboxes or multi-selects this
+should be the keys of the items to be selected separated by
+semi-colons (;).
+
+=item *
+
 I<fieldname>_rules - a semi-colon separated list of validation rules
 for the field.  See L<DevHelp::Validate> for a list of built-in rules,
 some common ones are C<email>, I<phone>, I<weburl>, I<date>.  You can
index 781ed4b..c4ec23f 100644 (file)
@@ -20,7 +20,7 @@ Show: <:ifEq [cgi s] "all":><a href="<:script:>?id=<:seminar id:>&amp;_t=semsess
    <td><:session description:></td>
    <td><:date "%H:%M %a %d %b %Y" session when_at:></td>
    <td><:ifSession past:><a href="<:script:>?a_takesessionrole=1&amp;id=<:seminar id:>&amp;session_id=<:session id:>">Roll call</a><:
-or:><a href="<:script:>?a_editsemsession=1&amp;id=<:seminar id:>&amp;session_id=<:session id:>">Edit</a><:eif:>
+or:><a href="<:script:>?a_editsemsession=1&amp;id=<:seminar id:>&amp;session_id=<:session id:>">Edit</a> <a href="<:script:>?a_semsessionbookings=1&amp;id=<:seminar id:>&amp;session_id=<:session id:>">Bookings</a><:eif:>
 <:ifSessionRemovable:><a href="<:script:>?a_askdelsemsession=1&amp;id=<:seminar id:>&amp;session_id=<:session id:>">Delete</a><:or:><:eif:>
 </td>
  </tr>
diff --git a/site/templates/admin/semsessionbookings.tmpl b/site/templates/admin/semsessionbookings.tmpl
new file mode 100644 (file)
index 0000000..d0ae4f8
--- /dev/null
@@ -0,0 +1,30 @@
+<:wrap admin/xbase.tmpl title=>"Seminar [seminar title] - Bookings":>
+<h1>Seminar <:seminar title:> - Bookings</h1>
+<:ifMessage:>
+<p><b><:message:></b></p>
+<:or:><:eif:> 
+<p>| <a href="/cgi-bin/admin/menu.pl">Admin menu</a> 
+| <a href="<:script:>?id=<:seminar id:>">Edit seminar</a> |
+  <a href="<:script:>?id=<:seminar id:>&amp;_t=semsessions">Session list</a> |
+</p>
+
+<table>
+  <tr>
+    <th>Logon</th>
+    <th>Name</th>
+    <th>Email</th>
+  </tr>
+<:if Bookedusers:>
+<:iterator begin bookedusers:>
+  <tr>
+    <td><a href="/cgi-bin/admin/siteusers.pl?a_edit=1&amp;id=<:bookeduser id:>"><:bookeduser userId:></a></td>
+    <td><:bookeduser name1:> <:bookeduser name2:></td>
+    <td><a href="mailto:<:bookeduser email:>"><:bookeduser email:></a></td>
+  </tr>
+<:iterator end bookedusers:>
+<:or Bookedusers:>
+  <tr>
+    <td colspan="3">There is no-one booked for this session</td>
+  </tr>
+<:eif Bookedusers:>
+</table>
index 6e9e4a3..21c2e5b 100644 (file)
@@ -31,7 +31,7 @@
 <:iterator end stepcats:>
 </ul></font>
 <:or StepCats:><:eif StepCats:>
-<:if Product retailPrice:>
+<:if Or [product retailPrice] [cfg shop free_products]:>
 <form name="ff" method="POST" action="/cgi-bin/shop.pl">
               
 <:if Options:>
@@ -68,7 +68,7 @@
     </tr>
   </table>
 </form>
-<:or Product:><br>
+<:or Or:><br>
 <br>
 <table border="0" cellspacing="0" cellpadding="1" bgcolor="#CCCCCC">
   <tr>
     </td>
   </tr>
 </table>
-<font face="Arial, Helvetica, sans-serif"><b><font size="4"> </font></b></font><:eif 
-Product:> 
+<font face="Arial, Helvetica, sans-serif"><b><font size="4"> </font></b></font><:eif Or:> 
 <p><br>
   <a href="/shop/index.html"><img src="/images/store/browse_more.gif" width="133" height="21" border="0"></a>
 </p><br>
index 494709a..91b7fc6 100644 (file)
--- a/test.cfg
+++ b/test.cfg
@@ -104,7 +104,7 @@ default formmail validation.subject_width=40
 
 test form.fields=email,name,company,select,radio,check,multiselect
 test form.subject=Foo
-test form.encrypt=1
+#test form.encrypt=1
 test form.crypt_signing_id=
 test form.crypt_content_type=1
 test form.crypt_passphrase=
@@ -112,8 +112,9 @@ test form.email=tony@develop-help.com
 test form.field_config=notes,required_if
 test form.submit=Send the message
 test form.autofill=0
-test form.require_logon=1
+test form.require_logon=0
 test form.logon_message=Yo Dude! Logon to submit this form!
+#test form.field_config=default
 test formmail validation.name_description=Your Name
 test formmail validation.name_required_if=company
 test formmail validation.name_width=60
@@ -125,12 +126,16 @@ test formmail validation.company_required_if=name
 test formmail validation.select_values=test select values:prefix_
 test formmail validation.select_htmltype=select
 test formmail validation.select_required=1
+test formmail validation.select_default=php
 test formmail validation.radio_htmltype=radio
 test formmail validation.radio_values=Test Radio Values
+test formmail validation.radio_default=second
 test formmail validation.check_htmltype=check
 test formmail validation.check_values=Test Check Values
+test formmail validation.check_default=php;cobol
 test formmail validation.multiselect_htmltype=multiselect
 test formmail validation.multiselect_values=test check values
+test formmail validation.multiselect_default=perl;php
 
 test radio values.first=One
 test radio values.second=Two
@@ -168,3 +173,5 @@ seminar.locations=1
 
 query groups.1=name starts with t
 query group name starts with t.sql=select id from site_users where id = ? and name1 like "t%"
+
+shop.free_products=1