0.15_47 commit r0_15_47
authorTony Cook <tony@develop-help.com>
Mon, 16 Oct 2006 14:29:21 +0000 (14:29 +0000)
committertony <tony@45cb6cf1-00bc-42d2-bb5a-07f51df49f94>
Mon, 16 Oct 2006 14:29:21 +0000 (14:29 +0000)
22 files changed:
MANIFEST
Makefile
schema/bse.sql
site/cgi-bin/modules/BSE/DB/Mysql.pm
site/cgi-bin/modules/BSE/Shop/Util.pm
site/cgi-bin/modules/BSE/TB/Seminar.pm
site/cgi-bin/modules/BSE/TB/SeminarBooking.pm [new file with mode: 0644]
site/cgi-bin/modules/BSE/TB/SeminarBookings.pm [new file with mode: 0644]
site/cgi-bin/modules/BSE/TB/SeminarSession.pm
site/cgi-bin/modules/BSE/UI/AdminSeminar.pm
site/cgi-bin/modules/BSE/UI/Shop.pm
site/cgi-bin/modules/DevHelp/Tags.pm
site/data/db/sql_statements.data
site/docs/bse.pod
site/templates/admin/semcancelbooking.tmpl
site/templates/admin/semeditbooking.tmpl
site/templates/admin/semsessionbookings.tmpl
site/templates/admin/users/view_bookings.tmpl
site/templates/user/admin_book_seminar.tmpl
site/templates/user/admin_edit_seminar.tmpl
site/templates/user/admin_unbook_seminar.tmpl
t/t20gen.t

index 94b5045107611b01e2036133482c619f0072b542..c87c5fd3474f772ab0f654666142c25f0a6b2377 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -116,6 +116,8 @@ site/cgi-bin/modules/BSE/TB/Orders.pm
 site/cgi-bin/modules/BSE/TB/OrderItem.pm
 site/cgi-bin/modules/BSE/TB/OrderItems.pm
 site/cgi-bin/modules/BSE/TB/Seminar.pm
+site/cgi-bin/modules/BSE/TB/SeminarBooking.pm
+site/cgi-bin/modules/BSE/TB/SeminarBookings.pm
 site/cgi-bin/modules/BSE/TB/SeminarSession.pm
 site/cgi-bin/modules/BSE/TB/SeminarSessions.pm
 site/cgi-bin/modules/BSE/TB/Seminars.pm
index 4ff6aeefa8c587cc1231c05103df8577afb6ffe4..d57bd5d52c239cfc63a88563aac8ebfb0acbb2fe 100755 (executable)
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-VERSION=0.15_46
+VERSION=0.15_47
 DISTNAME=bse-$(VERSION)
 DISTBUILD=$(DISTNAME)
 DISTTAR=../$(DISTNAME).tar
index 1c494e474885abf02c552d6bc738f12aa118339e..c8e82cc9b977011a4a930217b0eef76230e1ac70 100644 (file)
@@ -748,6 +748,7 @@ create table bse_seminar_sessions (
 
 drop table if exists bse_seminar_bookings;
 create table bse_seminar_bookings (
+  id integer not null auto_increment primary key,
   session_id integer not null,
   siteuser_id integer not null,
   roll_present integer not null default 0,
@@ -756,7 +757,7 @@ create table bse_seminar_bookings (
   customer_instructions text not null default '',
   support_notes text not null default '',
 
-  primary key(session_id, siteuser_id),
+  unique(session_id, siteuser_id),
   index (siteuser_id)
 );
 
index b615b2d258af6f46c58c70c5fb24b869f48eed49..4e0de07b7f0865315817fc1089cf3c72098bae14 100644 (file)
@@ -447,11 +447,12 @@ SQL
    seminarSessionBookedIds => <<SQL,
 select * from bse_seminar_bookings where session_id = ?
 SQL
-   seminarSessionBookUser => <<SQL,
-insert bse_seminar_bookings values(?,?,?,?,?,?)
+   addSeminarBooking => <<SQL,
+insert bse_seminar_bookings values(null,?,?,?,?,?,?)
 SQL
    seminarSessionRollCallEntries => <<SQL,
-select bo.roll_present, su.id, su.userId, su.name1, su.name2, su.email
+select bo.roll_present, su.id, su.userId, su.name1, su.name2, su.email,
+    bo.id as booking_id
   from bse_seminar_bookings bo, site_users su
 where bo.session_id = ? and bo.siteuser_id = su.id
 SQL
index abfe4433bff8a13453616b6d407abd540ed3cf27..634e16b808e0bcc1acfdbba0847b16ff5ca6dbcd 100644 (file)
@@ -8,7 +8,7 @@ use vars qw(@ISA @EXPORT_OK);
 use Constants qw/:shop/;
 use BSE::Util::SQL qw(now_sqldate);
 use BSE::Util::Tags;
-use BSE::CfgInfo qw(custom_class);
+use BSE::CfgInfo qw(custom_class product_options);
 use Carp 'confess';
 use DevHelp::HTML qw(escape_html);
 
index 14afb4f0a6096324e62d62ae201506e748c93916..b3ab494001d4cd65eb7ddfaa58915e23ef70e9f6 100644 (file)
@@ -73,4 +73,12 @@ sub future_location_sessions {
     (futureSeminarLocation => $self->{id}, $location->{id}, now_sqldatetime());
 }
 
+sub get_unbooked_by_user {
+  my ($self, $user) = @_;
+
+  require BSE::TB::SeminarSessions;
+  BSE::TB::SeminarSessions->getSpecial(sessionsUnbookedByUser => 
+                                      $user->{id}, $self->{id});
+}
+
 1;
diff --git a/site/cgi-bin/modules/BSE/TB/SeminarBooking.pm b/site/cgi-bin/modules/BSE/TB/SeminarBooking.pm
new file mode 100644 (file)
index 0000000..95cbc78
--- /dev/null
@@ -0,0 +1,26 @@
+package BSE::TB::SeminarBooking;
+use strict;
+use base qw(Squirrel::Row);
+
+sub columns {
+  qw/id session_id siteuser_id roll_present options customer_instructions 
+     support_notes/;
+}
+
+sub session {
+  my ($self) = @_;
+
+  require BSE::TB::SeminarSessions;
+
+  return BSE::TB::SeminarSessions->getByPkey($self->{session_id});
+}
+
+sub siteuser {
+  my ($self) = @_;
+
+  require SiteUsers;
+
+  return SiteUsers->getByPkey($self->{siteuser_id});
+}
+
+1;
diff --git a/site/cgi-bin/modules/BSE/TB/SeminarBookings.pm b/site/cgi-bin/modules/BSE/TB/SeminarBookings.pm
new file mode 100644 (file)
index 0000000..e13aca8
--- /dev/null
@@ -0,0 +1,8 @@
+package BSE::TB::SeminarBookings;
+use strict;
+use base qw(Squirrel::Table);
+use BSE::TB::SeminarBooking;
+
+sub rowClass { 'BSE::TB::SeminarBooking' }
+
+1;
index 5fdf8ac6c840a4c55ff40b98b9cf34c45509404a..da1096f4ea97ceee7b047ebe189c7a414826515c 100644 (file)
@@ -99,7 +99,8 @@ sub add_attendee {
 
   my $user_id = ref $user ? $user->{id} : $user;
 
-  BSE::DB->run(seminarSessionBookUser => $self->{id}, $user_id, 
+  require BSE::TB::SeminarBookings;
+  BSE::TB::SeminarBookings->add($self->{id}, $user_id, 
               @work_attr{@attendee_attributes});
 }
 
@@ -108,9 +109,9 @@ sub get_booking {
 
   my $siteuser_id = ref $user ? $user->{id} : $user;
 
-  my @result = BSE::DB->query
-    (bse_getSessionBookingForUser => $self->{id}, $siteuser_id)
-    or return;
+  require BSE::TB::SeminarBookings;
+  my @result = BSE::TB::SeminarBookings->
+    getBy(session_id => $self->{id}, siteuser_id => $siteuser_id);
 
   return $result[0];
 }
index 094a4d9f4d29eb1a9e79cdfcddd1e7c4166df857..3cceeb8d3aee2b61543557978b5a832ee11774c6 100644 (file)
@@ -9,6 +9,7 @@ use BSE::TB::Locations;
 use DevHelp::HTML qw(:default popup_menu);
 use constant SECT_LOCATION_VALIDATION => "BSE Location Validation";
 use BSE::CfgInfo 'product_options';
+use DevHelp::Date qw(dh_strftime_sql_datetime);
 
 my %rights =
   (
@@ -471,6 +472,10 @@ sub req_addattendsave {
       return $class->req_addattendsession
        ($req, { session_id => "User already booked for this session" });
     }
+    else {
+      return $class->req_addattendsession
+       ($req, { _error => $@ });
+    }
   }
 
   require BSE::ComposeMail;
@@ -484,7 +489,7 @@ sub req_addattendsave {
   %acts =
     (
      BSE::Util::Tags->static(undef, $cfg),
-     siteuser => [ \&tag_hash_plain, $siteuser ],
+     user     => [ \&tag_hash_plain, $siteuser ],
      seminar  => [ \&tag_hash_plain, $seminar  ],
      session  => [ \&tag_hash_plain, $session  ],
      booking  => [ \&tag_hash_plain, \%more    ],
@@ -514,23 +519,16 @@ sub req_cancelbookingconfirm {
 
   my $cgi = $req->cgi;
 
-  my $session_id = $cgi->param('session_id');
-  defined $session_id && $session_id =~ /^\d+$/
-    or return $class->error($req, 'Invalid session_id parameter');
-  require BSE::TB::SeminarSessions;
-  my $session = BSE::TB::SeminarSessions->getByPkey($session_id)
-    or return $class->error($req, 'Unknown session_id value');
+  my $id = $cgi->param('id');
+  defined $id && $id =~ /^\d+$/
+    or return $class->error($req, "id parameter invalid");
 
-  my $siteuser_id = $cgi->param('siteuser_id');
-  defined $siteuser_id && $siteuser_id =~ /\d+$/
-    or return $class->error($req, 'Invalid siteuser_id parameter');
+  require BSE::TB::SeminarBookings;
+  my $booking = BSE::TB::SeminarBookings->getByPkey($id)
+    or return $class->error($req, "booking $id not found");
 
-  require SiteUsers;
-  my $siteuser = SiteUsers->getByPkey($siteuser_id)
-    or return $class->error($req, 'Unknown siteuser_id value');
-
-  my $booking = $session->get_booking($siteuser)
-    or return $class->error($req, "$siteuser->{userId} is not booked for this session");
+  my $session = $booking->session;
+  my $siteuser = $booking->siteuser;
 
   my $seminar = $session->seminar;
   my @sem_options = _get_sem_options($req->cfg, $seminar, 
@@ -563,23 +561,16 @@ sub req_cancelbooking {
 
   my $cgi = $req->cgi;
 
-  my $session_id = $cgi->param('session_id');
-  defined $session_id && $session_id =~ /^\d+$/
-    or return $class->error($req, 'Invalid session_id parameter');
-  require BSE::TB::SeminarSessions;
-  my $session = BSE::TB::SeminarSessions->getByPkey($session_id)
-    or return $class->error($req, 'Unknown session_id value');
-
-  my $siteuser_id = $cgi->param('siteuser_id');
-  defined $siteuser_id && $siteuser_id =~ /\d+$/
-    or return $class->error($req, 'Invalid siteuser_id parameter');
+  my $id = $cgi->param('id');
+  defined $id && $id =~ /^\d+$/
+    or return $class->error($req, "id parameter invalid");
 
-  require SiteUsers;
-  my $siteuser = SiteUsers->getByPkey($siteuser_id)
-    or return $class->error($req, 'Unknown siteuser_id value');
+  require BSE::TB::SeminarBookings;
+  my $booking = BSE::TB::SeminarBookings->getByPkey($id)
+    or return $class->error($req, "booking $id not found");
 
-  my $booking = $session->get_booking($siteuser)
-    or return $class->error($req, "$siteuser->{userId} is not booked for this session");
+  my $session = $booking->session;
+  my $siteuser = $booking->siteuser;
 
   my @options = split /,/, $booking->{options};
   local $SIG{__DIE__};
@@ -603,7 +594,7 @@ sub req_cancelbooking {
   %acts =
     (
      BSE::Util::Tags->static(undef, $cfg),
-     siteuser => [ \&tag_hash_plain, $siteuser ],
+     user     => [ \&tag_hash_plain, $siteuser ],
      seminar  => [ \&tag_hash_plain, $seminar  ],
      session  => [ \&tag_hash_plain, $session  ],
      booking  => [ \&tag_hash_plain, $booking  ],
@@ -634,29 +625,25 @@ sub req_editbooking {
 
   my $cgi = $req->cgi;
 
-  my $session_id = $cgi->param('session_id');
-  defined $session_id && $session_id =~ /^\d+$/
-    or return $class->error($req, 'Invalid session_id parameter');
-  require BSE::TB::SeminarSessions;
-  my $session = BSE::TB::SeminarSessions->getByPkey($session_id)
-    or return $class->error($req, 'Unknown session_id value');
+  my $id = $cgi->param('id');
+  defined $id && $id =~ /^\d+$/
+    or return $class->error($req, "id parameter invalid");
 
-  my $siteuser_id = $cgi->param('siteuser_id');
-  defined $siteuser_id && $siteuser_id =~ /\d+$/
-    or return $class->error($req, 'Invalid siteuser_id parameter');
+  require BSE::TB::SeminarBookings;
+  my $booking = BSE::TB::SeminarBookings->getByPkey($id)
+    or return $class->error($req, "booking $id not found");
 
-  require SiteUsers;
-  my $siteuser = SiteUsers->getByPkey($siteuser_id)
-    or return $class->error($req, 'Unknown siteuser_id value');
+  my $session = $booking->session;
 
-  my $booking = $session->get_booking($siteuser)
-    or return $class->error($req, "$siteuser->{userId} is not booked for this session");
+  my $siteuser = $booking->siteuser;
 
   my $message = $req->message($errors);
 
   my $seminar = $session->seminar;
   my @sem_options = _get_sem_options($req->cfg, $seminar, 
                                     split /,/,  $booking->{options});
+  my @unbooked = $seminar->get_unbooked_by_user($siteuser);
+  @unbooked = sort { $b->{when_at} cmp $a->{when_at} } ( @unbooked, $session );
     
   my $current_option;
   my $it = BSE::Util::Iterate->new;
@@ -676,6 +663,8 @@ sub req_editbooking {
      $it->make_iterator(undef, 'option', 'options', \@sem_options, 
                        undef, undef, \$current_option),
      option_popup => [ \&tag_option_popup, $req->cgi, \$current_option ],
+     $it->make_iterator(undef, 'isession', 'sessions', \@unbooked),
+     session_popup => [ \&tag_session_popup, $booking, $req->cgi, \@unbooked ],
     );
 
   return $req->dyn_response('admin/semeditbooking', \%acts);
@@ -686,46 +675,37 @@ sub req_savebooking {
 
   my $cgi = $req->cgi;
 
-  my $session_id = $cgi->param('session_id');
-  defined $session_id && $session_id =~ /^\d+$/
-    or return $class->error($req, 'Invalid session_id parameter');
-  require BSE::TB::SeminarSessions;
-  my $session = BSE::TB::SeminarSessions->getByPkey($session_id)
-    or return $class->error($req, 'Unknown session_id value');
+  my $id = $cgi->param('id');
+  defined $id && $id =~ /^\d+$/
+    or return $class->error($req, "id parameter invalid");
 
-  my $siteuser_id = $cgi->param('siteuser_id');
-  defined $siteuser_id && $siteuser_id =~ /\d+$/
-    or return $class->error($req, 'Invalid siteuser_id parameter');
+  require BSE::TB::SeminarBookings;
+  my $booking = BSE::TB::SeminarBookings->getByPkey($id)
+    or return $class->error($req, "booking $id not found");
 
-  require SiteUsers;
-  my $siteuser = SiteUsers->getByPkey($siteuser_id)
-    or return $class->error($req, 'Unknown siteuser_id value');
-
-  my $booking = $session->get_booking($siteuser)
-    or return $class->error($req, "$siteuser->{userId} is not booked for this session");
-
-  my %attr = %$booking;
-  delete @attr{qw/siteuser_id session_id/};
-
-  for my $name (keys %attr) {
+  my @cols = $booking->columns;
+  shift @cols;
+  for my $name (@cols) {
     my $value = $cgi->param($name);
-    defined $value and $attr{$name} = $value;
+    defined $value and $booking->set($name => $value);
   }
-  my $seminar = $session->seminar;
+  my $seminar = $booking->session->seminar;
   my @options;
   for my $name (split /,/, $seminar->{options}) {
     push @options, ($cgi->param($name))[0];
   }
-  $attr{options} = join ',', @options;
+  $booking->{options} = join ',', @options;
 
   eval {
-    $session->update_booking($siteuser, %attr);
+    $booking->save;
   };
   $@
     and return $class->req_editbooking($req, { error => $@ });
 
   my @sem_options = _get_sem_options($req->cfg, $seminar, @options);
 
+  my $session = $booking->session;
+  my $siteuser = $booking->siteuser;
   require BSE::ComposeMail;
   my $cfg = $req->cfg;
   my $mailer = BSE::ComposeMail->new(cfg => $cfg);
@@ -736,7 +716,7 @@ sub req_savebooking {
   %acts =
     (
      BSE::Util::Tags->static(undef, $cfg),
-     siteuser => [ \&tag_hash_plain, $siteuser ],
+     user     => [ \&tag_hash_plain, $siteuser ],
      seminar  => [ \&tag_hash_plain, $seminar  ],
      session  => [ \&tag_hash_plain, $session  ],
      booking  => [ \&tag_hash_plain, $booking  ],
@@ -784,4 +764,35 @@ sub _get_sem_options {
   return @sem_options;
 }
 
+sub tag_session_popup {
+  my ($booking, $cgi, $unbooked) = @_;
+
+  my $default = $cgi->param('session_id');
+  defined $default or $default = $booking->{session_id};
+  my %locations;
+  for my $session (@$unbooked) {
+    unless ($locations{$session->{location_id}}) {
+      $locations{$session->{location_id}} = $session->location;
+    }
+  }
+
+  return popup_menu
+    (-name => 'session_id',
+     -values => [ map $_->{id}, @$unbooked ],
+     -labels => 
+     { map 
+       { $_->{id} => 
+          _session_desc($_, $locations{$_->{location_id}}) 
+        } @$unbooked 
+     },
+     -default => $default);
+}
+
+sub _session_desc {
+  my ($session, $location) = @_;
+
+  $location->{description} . ' ' . 
+    dh_strftime_sql_datetime("%H:%M %d %b %Y", $session->{when_at});
+}
+
 1;
index 7a017863bc269eee49eec1370e9fe1f909876aad..ac730c1585e62102fdf80cf4cb2d0585ef694863 100644 (file)
@@ -1002,7 +1002,8 @@ sub _send_order {
      sub { 
        if (++$item_index < @$items) {
         $option_index = -1;
-        @options = cart_item_opts($items->[$item_index], 
+        @options = cart_item_opts($req,
+                                  $items->[$item_index], 
                                   $products->[$item_index]);
         return 1;
        }
index 14371237b5884d3586e73d8f748252edb679d8ab..bfd06a85720fd59afca222ce9f3287dc0db80065 100644 (file)
@@ -351,7 +351,7 @@ sub get_parms {
                    \s*\]\s*//x) {
       my ($func, $subargs) = ($1, $2);
       $subargs = '' unless defined $subargs;
-      if ($acts->{$func}) {
+      if (exists $acts->{$func}) {
        print STDERR "  Evaluating [$func $subargs]\n" if DEBUG_GET_PARMS;
        my $value = $templater->perform($acts, $func, $subargs);
        print STDERR "    Result '$value'\n" if DEBUG_GET_PARMS;
index b1a3cf341edc5aac50e6faa347ce6cb18f327c0b..037befe0102761ccaac59599b9787e05b5d50d5d 100644 (file)
@@ -14,7 +14,8 @@ select ar.*, pr.*, se.*, ss.*, sb.*,
       lo.bookings_name as loc_bookings_name,
       lo.bookings_phone as loc_bookings_phone,
       lo.bookings_fax as loc_bookings_fax,
-      lo.bookings_url as loc_bookings_url
+      lo.bookings_url as loc_bookings_url,
+      sb.id as booking_id
   from article ar, product pr, bse_seminars se, bse_seminar_sessions ss,
        bse_locations lo, bse_seminar_bookings sb
   where sb.siteuser_id = ?
@@ -37,7 +38,7 @@ select ar.*, pr.*, se.*, ss.*,
   order by ss.when_at desc
 SQL
 
-name: bse_getSessionBookingForUser
+name: getSeminarBookingBySession_idAndSiteuser_id
 sql_statement: <<SQL
 select * from bse_seminar_bookings
   where session_id = ? and siteuser_id = ?
@@ -55,4 +56,21 @@ update bse_seminar_bookings
   set roll_present = ?, options = ?, customer_instructions = ?, 
     support_notes = ?
   where session_id = ? and siteuser_id = ?
-SQL
\ No newline at end of file
+SQL
+
+name: getSeminarBookingByPkey
+sql_statement: <<SQL
+select * from bse_seminar_bookings where id = ?
+SQL
+
+name: replaceSeminarBooking
+sql_statement: <<SQL
+replace bse_seminar_bookings values(?,?,?,?,?,?,?)
+SQL
+
+name: SeminarSessions.sessionsUnbookedByUser
+sql_statement: <<SQL
+select ss.* from bse_seminar_sessions ss left join bse_seminar_bookings sb
+  on ss.id = sb.session_id and sb.siteuser_id = ?
+where ss.seminar_id = ? and sb.siteuser_id is null
+SQL
index de87b8064f1e4e158886e8dceb1bcc80f23338cd..a70982659394a6b2f588f701ad6d9423eeba7c84 100644 (file)
@@ -10,6 +10,47 @@ Maybe I'll add some other bits here.
 
 =head1 CHANGES
 
+=head2 0.15_47
+
+You will need to drop or manually alter the bse_seminar_bookings table
+for this release.
+
+=over
+
+=item *
+
+the bse_seminar_bookings schema has changed in a way incompatible with
+the update tool.  Previously it was just a relation with some extra
+attributes, it's now treated as a first class table.
+
+=item *
+
+a new session can now be selected when the admin edits a user's
+seminar booking.
+
+=item *
+
+the siteuser tag in the emails sent when the admin adds/edits/cancels
+a booking is now the user tag, for consistency with older emails.
+
+=item *
+
+there was a bug in handling some types of tag definitions in [...]
+lists
+
+=item *
+
+the parameters passed to the a_cancelbookingconfirm, a_cancelbooking,
+a_editbooking and a_savebooking targets in admin_seminar.pl have
+changed.  These now take an id parameter to identify the booking.
+
+=item *
+
+the purchase process was broken by the config file product options
+changes, fixed.
+
+=back
+
 =head2 0.15_46
 
 =over
@@ -19,6 +60,14 @@ Maybe I'll add some other bits here.
 send a booking notification email to the user when the admin books
 them for a session.
 
+=item *
+
+an admin user can now cancel bookings.  An email is sent to the member.
+
+=item *
+
+an admin user can now edit bookings.  An email is sent to the member.
+
 =back
 
 =head2 0.15_45
index 39c044c6685daf73c25ad2d9ae23a044683e71b1..149487a05a0ccc8102c7ee61bf5d9d1d715793e6 100644 (file)
@@ -6,8 +6,7 @@
 <:or:><:eif:>
 <form action="<:script:>" method="post">
 <input type="hidden" name="a_cancelbooking" value="1" />
-<input type="hidden" name="session_id" value="<:session id:>" />
-<input type="hidden" name="siteuser_id" value="<:siteuser id:>" />
+<input type="hidden" name="id" value="<:booking id:>" />
 <:ifCgi r:><input type="hidden" name="r" value="<:cgi r:>" /><:or:><:eif:>
 <table>
   <tr>
index 2cdc8627da9cf0579a34481680aafc400f858a41..cb9902e0a590f450c833cc83491450fec5821503 100644 (file)
@@ -6,8 +6,7 @@
 <:or:><:eif:>
 <form action="<:script:>" method="post">
 <input type="hidden" name="a_savebooking" value="1" />
-<input type="hidden" name="session_id" value="<:session id:>" />
-<input type="hidden" name="siteuser_id" value="<:siteuser id:>" />
+<input type="hidden" name="id" value="<:booking id:>" />
 <:ifCgi r:><input type="hidden" name="r" value="<:cgi r:>" /><:or:><:eif:>
 <table>
   <tr>
     <td><a href="<:seminar link:>"><:seminar title:></a></td>
   </tr>
   <tr>
-    <th>User:</th>
-    <td><a href="/cgi-bin/admin/siteusers.pl?id=<:siteuser id:>&amp;a_view=1"><:siteuser userId:></a> ( <:siteuser name1:> <:siteuser name2:> )</td>
-  </tr>
-  <tr>
-    <th>Location:</th>
-    <td><a href="/cgi-bin/admin/admin_seminar.pl?a_locview=1&amp;<:location id:>"><:location description:></a></td>
-  </tr>
-  <tr>
-    <th>Date:</th>
-    <td><:date session when_at:></td>
-  </tr>
-  <tr>
-    <th>Time:</th>
-    <td><:date "%I:%M %P" session when_at:></td>
+    <th>Session:</th>
+    <td><:session_popup:></td>
   </tr>
 <:iterator begin options:>
   <tr>
index 8c9d87eab0dcbd026abec9ecd75988e813652e2e..b48c8da471fd82285ad714e3ab279e73f8ccbe61 100644 (file)
@@ -21,8 +21,8 @@
     <td><:bookeduser name1:> <:bookeduser name2:></td>
     <td><a href="mailto:<:bookeduser email:>"><:bookeduser email:></a></td>
     <td>
-      <a href="/cgi-bin/admin/admin_seminar.pl?a_cancelbookingconfirm=1&amp;session_id=<:session id:>&amp;siteuser_id=<:bookeduser id:>">Cancel Booking</a>
-      <a href="/cgi-bin/admin/admin_seminar.pl?a_editbooking=1&amp;session_id=<:session id:>&amp;siteuser_id=<:bookeduser id:>">Edit</a>
+      <a href="/cgi-bin/admin/admin_seminar.pl?a_cancelbookingconfirm=1&amp;id=<:bookeduser booking_id:>">Cancel Booking</a>
+      <a href="/cgi-bin/admin/admin_seminar.pl?a_editbooking=1&amp;id=<:bookeduser booking_id:>">Edit</a>
     </td>
   </tr>
 <:iterator end bookedusers:>
index 96a8b1da1a755cfaf419945d6eecd8a63263309e..c038e02afb9dab2485aad7ed7eedf7a8dd8bd2d7 100644 (file)
@@ -20,6 +20,7 @@
           <th>Time</th>
           <th>Date</th>
         </tr>
+<:if Bookings:>
         <:iterator begin bookings:> 
         <tr bgcolor="#FFFFFF"> 
           <td align="center" nowrap><a href="/cgi-bin/admin/add.pl?id=<:booking seminar_id:>"><:booking 
           <td nowrap="nowrap"><:date "%I:%M %p" booking when_at:></td>
           <td nowrap="nowrap"><:date booking when_at:></td>
           <td nowrap="nowrap">
-            <a href="/cgi-bin/admin/admin_seminar.pl?a_cancelbookingconfirm=1&amp;session_id=<:booking session_id:>&amp;siteuser_id=<:siteuser id:>">Cancel</a>
-            <a href="/cgi-bin/admin/admin_seminar.pl?a_editbooking=1&amp;session_id=<:booking session_id:>&amp;siteuser_id=<:siteuser id:>">Edit</a>
+            <a href="/cgi-bin/admin/admin_seminar.pl?a_cancelbookingconfirm=1&amp;id=<:booking booking_id:>">Cancel</a>
+            <a href="/cgi-bin/admin/admin_seminar.pl?a_editbooking=1&amp;id=<:booking booking_id:>">Edit</a>
           </td>
         </tr>
         <:iterator end bookings:> 
+<:or Bookings:>
+        <tr>
+          <td colspan="5" align="center">No bookings found</td>
+        </tr>
+<:eif Bookings:>
       </table>
index 6dcc5e5999cf9e0a3898356bf66f675f6a52d5fc..5490b0fe761a9e2293210562b69d3edb92d57336 100644 (file)
@@ -1,4 +1,4 @@
-Dear <:siteuser name1:>,
+Dear <:user name1:>,
 
 This email is sent to confirm your booking of a seminar by our
 customer support process.
index 48002e11bd91082e9c5ac0d1178b12645e2b6136..5b3e7710a05ccbe5df1644b21013f98a12a5c547 100644 (file)
@@ -1,4 +1,4 @@
-Dear <:siteuser name1:>,
+Dear <:user name1:>,
 
 Your seminar booking has been modified:
 
index 4fca7f7e8dcfed45262733b2ac648f9ea826d159..124d1943fbcf2c15245d5a33403de2fe14ad5446 100644 (file)
@@ -1,4 +1,4 @@
-Dear <:siteuser name1:>,
+Dear <:user name1:>,
 
 This email is sent to confirm the cancellation of the booking of a
 seminar by our customer support process.
index 46370ad1bcc0bc3ec6ec7b7cdbef0dd35f6b8cb6..01f29560f3245c79cd6c90f9e3c4c1f3f5f43a87 100644 (file)
@@ -1,7 +1,7 @@
 #!perl -w
 use strict;
 use BSE::Test ();
-use Test::More tests=>82;
+use Test::More tests=>85;
 use File::Spec;
 use FindBin;
 my $cgidir = File::Spec->catdir(BSE::Test::base_dir, 'cgi-bin');
@@ -271,6 +271,12 @@ Good
 Good
 EXPECTED
 
+template_test "ifAnd dynamic cfg ajax", $parent, <<TEMPLATE, <<EXPECTED;
+<:ifAnd [ifDynamic] [cfg basic ajax]:>1<:or:>0<:eif:>
+TEMPLATE
+0
+EXPECTED
+
 ############################################################
 # Cleanup