From 66e4b82f8af0d8f41e0f5781d163f539f9e86faf Mon Sep 17 00:00:00 2001 From: JT Smith Date: Sun, 29 Jul 2007 16:08:19 +0000 Subject: [PATCH] - Added new registration search and management interface to the EMS. - Added badge printing support to the EMS. --- docs/changelog/7.x.x.txt | 12 +- .../templates-7.4.0/emsbadgeprint.tmpl | 15 ++ .../templates-7.4.0/emsticketprint.tmpl | 16 ++ docs/upgrades/upgrade_7.3.22-7.4.0.pl | 9 + etc/WebGUI.conf.original | 4 + lib/WebGUI/Asset.pm | 26 ++- .../Asset/Wobject/EventManagementSystem.pm | 204 ++++++++++++++---- lib/WebGUI/Operation/Settings.pm | 12 +- 8 files changed, 233 insertions(+), 65 deletions(-) create mode 100644 docs/upgrades/templates-7.4.0/emsbadgeprint.tmpl create mode 100644 docs/upgrades/templates-7.4.0/emsticketprint.tmpl diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index 0daf9b117..4b0b54405 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -16,6 +16,10 @@ - rfe: Admin bar doesn't resize with the browser - fix: Left Admin Bar overlap problem - Color coded most buttons, green for proceed and red for go back. + - Encrypt page now forces SSL and can check for the SSLPROXY pass through + variable in addition to the HTTPS variable. + - Encrypt page no longer shows up unless SSL mode is enabled in the config + file. - fix: A bug where it was possible to delete a system page if it were made the child of a non-system page that you had edit rights to. - api: Added a unified contraints system for the file and image assets. @@ -29,7 +33,6 @@ - Added keyword tagging to Wiki. - Upgraded TinyMCE to 2.1.1.1. - Safari 3 and above now fully supported in admin interface. - - improved performance of EMS - upgraded YUI to 2.2.2 and YUI-ext to 1.0.1a - Improved error handling in Spectre when WebGUI hands it bad data. - Fixed a problem where Spectre dropped cron jobs that were erroring @@ -57,11 +60,14 @@ description from the RSS feed. - Added an index on the userId column of the groupings table to speed up queries for groupIds by userId (instead of the usual userIds by groupId) - - fix: bad javascript string escaping in EMS - fix: Unable to upload images or edit listings for Matrix + - fix: bad javascript string escaping in EMS + - improved performance of EMS - Added import/export mechanism for EMS events. - - Removed the long depricated Memcached cache module. - fix: Show edit links on EMS search view without being in Admin group + - Added new registration search and management interface to the EMS. + - Added badge printing support to the EMS. + - Removed the long depricated Memcached cache module. - fix: Fixed a typo in the Article with attachments template (perlDreamer Consulting, LLC) - fix: Order of content position loops in Page Layout (Yung Han Khoe, United Knowledge) diff --git a/docs/upgrades/templates-7.4.0/emsbadgeprint.tmpl b/docs/upgrades/templates-7.4.0/emsbadgeprint.tmpl new file mode 100644 index 000000000..be638b350 --- /dev/null +++ b/docs/upgrades/templates-7.4.0/emsbadgeprint.tmpl @@ -0,0 +1,15 @@ +#emsbadgeprintout000000 +#url: ems-badge-print-out-template +#title: Badge Print +#namespace:emsbadgeprint +#create + + +
+
+
+
+
+
+
+ diff --git a/docs/upgrades/templates-7.4.0/emsticketprint.tmpl b/docs/upgrades/templates-7.4.0/emsticketprint.tmpl new file mode 100644 index 000000000..bee4a2553 --- /dev/null +++ b/docs/upgrades/templates-7.4.0/emsticketprint.tmpl @@ -0,0 +1,16 @@ +#emsticketprintout00000 +#url: ems-ticket-print-out-template +#title: Ticket Print +#namespace:emsticketprint +#create + +
+
:
+
+
^D(,); - ^D(,);
+
,
+
+
+
+
+ diff --git a/docs/upgrades/upgrade_7.3.22-7.4.0.pl b/docs/upgrades/upgrade_7.3.22-7.4.0.pl index 67afc026b..14d4e7685 100644 --- a/docs/upgrades/upgrade_7.3.22-7.4.0.pl +++ b/docs/upgrades/upgrade_7.3.22-7.4.0.pl @@ -40,9 +40,18 @@ addWikiAttachments($session); addAdminConsoleGroupSettings($session); updateCommerce($session); updateProfileDateFormats($session); +addEmsBadgePrinting($session); finish($session); # this line required +#------------------------------------------------- +sub addEmsBadgePrinting { + my $session = shift; + print "\tAdding badge printing support to EMS.\n" unless $quiet; + $session->db->write("alter table EventManagementSystem add column badgePrinterTemplateId varchar(22) binary not null default 'emsbadgeprintout000000'"); + $session->db->write("alter table EventManagementSystem add column ticketPrinterTemplateId varchar(22) binary not null default 'emsticketprintout00000'"); +} + #------------------------------------------------- # Add the default admin console group settings sub addAdminConsoleGroupSettings { diff --git a/etc/WebGUI.conf.original b/etc/WebGUI.conf.original index 105355f78..f7f68b874 100644 --- a/etc/WebGUI.conf.original +++ b/etc/WebGUI.conf.original @@ -8,6 +8,10 @@ "sitename" : [ "www.example.com", "example.com"], +# Set to 1 if you want to use WebGUI's SSL functions. + +"sslEnabled" : 0, + # Rename the WebGUI Session cookie if you like. "cookieName" : "wgSession", diff --git a/lib/WebGUI/Asset.pm b/lib/WebGUI/Asset.pm index 38450c3c9..befabfaaa 100644 --- a/lib/WebGUI/Asset.pm +++ b/lib/WebGUI/Asset.pm @@ -274,14 +274,20 @@ Returns error messages if a user can't view due to publishing problems, otherwis sub checkView { my $self = shift; return $self->session->privilege->noAccess() unless $self->canView; - my ($var, $http) = $self->session->quick(qw(var http)); - if ($var->isAdminOn && $self->get("state") =~ /^trash/) { # show em trash + my ($conf, $env, $var, $http) = $self->session->quick(qw(config env var http)); + if ($conf->get("sslEnabled") && $self->get("encryptPage") && $env->("HTTPS") ne "on" && !$env->get("SSLPROXY")) { + $http->setRedirect("https://".$conf->get("sitename")->[0].$self->getUrl); + return "redirect"; + } + elsif ($var->isAdminOn && $self->get("state") =~ /^trash/) { # show em trash $http->setRedirect($self->getUrl("func=manageTrash")); return "redirect"; - } elsif ($var->isAdminOn && $self->get("state") =~ /^clipboard/) { # show em clipboard + } + elsif ($var->isAdminOn && $self->get("state") =~ /^clipboard/) { # show em clipboard $http->setRedirect($self->getUrl("func=manageClipboard")); return "redirect"; - } elsif ($self->get("state") ne "published" && $self->get("state") ne "archived") { # tell em it doesn't exist anymore + } + elsif ($self->get("state") ne "published" && $self->get("state") ne "archived") { # tell em it doesn't exist anymore $http->setStatus("410"); my $notFound = WebGUI::Asset->getNotFound($self->session); $self->session->asset($notFound); @@ -354,12 +360,12 @@ sub definition { defaultValue=>0 }, encryptPage=>{ - fieldType=>'yesNo', - tab=>"security", - label=>$i18n->get('encrypt page'), - hoverHelp=>$i18n->get('encrypt page description'), - uiLevel=>6, - defaultValue=>0 + fieldType => ($session->config->get("sslEnabled") ? 'yesNo' : 'hidden'), + tab => "security", + label => $i18n->get('encrypt page'), + hoverHelp => $i18n->get('encrypt page description'), + uiLevel => 6, + defaultValue => 0, }, ownerUserId=>{ tab=>"security", diff --git a/lib/WebGUI/Asset/Wobject/EventManagementSystem.pm b/lib/WebGUI/Asset/Wobject/EventManagementSystem.pm index 6570a0d78..8b30699b6 100644 --- a/lib/WebGUI/Asset/Wobject/EventManagementSystem.pm +++ b/lib/WebGUI/Asset/Wobject/EventManagementSystem.pm @@ -166,7 +166,7 @@ sub _acWrapper { $ac->addSubmenuItem($self->getUrl('func=search'),$i18n->get("manage events")); $ac->addSubmenuItem($self->getUrl('func=manageEventMetadata'), $i18n->get('manage event metadata')); $ac->addSubmenuItem($self->getUrl('func=managePrereqSets'), $i18n->get('manage prerequisite sets')); - $ac->addSubmenuItem($self->getUrl('func=manageRegistrants'), $i18n->get('manage registrants')); + $ac->addSubmenuItem($self->getUrl('func=searchBadges'), "Search Badges"); $ac->addSubmenuItem($self->getUrl('func=manageDiscountPasses'), $i18n->get('manage discount passes')); $ac->addSubmenuItem($self->getUrl('func=importEvents'), $i18n->get('import events')); $ac->addSubmenuItem($self->getUrl('func=exportEvents'), $i18n->get('export events')); @@ -494,6 +494,20 @@ sub definition { hoverHelp=>$i18n->get('search template description'), label=>$i18n->get('search template') }, + badgePrinterTemplateId => { + fieldType => "template", + defaultValue => "emsbadgeprintout000000", + tab => "display", + namespace => "emsbadgeprint", + lable => "Badge Printer Template", + }, + ticketPrinterTemplateId => { + fieldType => "template", + defaultValue => "emsticketprintout00000", + tab => "display", + namespace => "emsticketprint", + lable => "Ticket Printer Template", + }, paginateAfter =>{ fieldType=>"integer", defaultValue=>10, @@ -3324,7 +3338,7 @@ sub www_returnItem { foreach (@regs) { $self->session->db->write("update EventManagementSystem_registrations set returned=1 where registrationId=?",[$_]); } - return $self->www_managePurchases; + return $self->www_editBadge; } #------------------------------------------------------------------- @@ -3830,7 +3844,6 @@ sub www_search { } my $searchPhrases; if (scalar(@keys)) { - #$searchPhrases = " and ( "; my $count = 0; foreach my $word (@keys) { if ($count) { @@ -3841,12 +3854,10 @@ sub www_search { $searchPhrases .= ' and '; } } - $searchPhrases .= ' and ' if $count; my $val = $self->session->db->quote('%'.$word.'%'); $searchPhrases .= "(p.title like $val or p.description like $val or p.sku like $val)"; $count++; } - #$searchPhrases .= " )"; } my $basicSearch = $searchPhrases; my %reqHash; @@ -4099,7 +4110,7 @@ $self->getUrl('func=addToScratchCart;pid='.$event->{'productId'}.";mid=".$master $var{'price.label'} = $i18n->get("price"); $var{'seats.label'} = $i18n->get("seats available"); $var{'addToBadgeMessage'} = $addToBadgeMessage; - $var{'manageRegistrants'} = $self->getUrl("func=manageRegistrants"); + $var{'manageRegistrants'} = $self->getUrl("func=searchBadges"); $var{'emptyCart.url'} = $self->getUrl("func=emptyCart"); $var{'checkout.url'} = $self->getUrl("func=checkout"); @@ -4181,7 +4192,7 @@ sub view { $var{'managePurchases.url'} = $self->getUrl('func=managePurchases'); $var{'managePurchases.label'} = $i18n->get('manage purchases'); $var{'canManageEvents'} = $self->canApproveEvents; - $var{'manageRegistrants.url'} = $self->getUrl("func=manageRegistrants"); + $var{'manageRegistrants.url'} = $self->getUrl("func=searchBadges"); $var{'emptyCart.url'} = $self->getUrl("func=emptyCart"); @@ -4194,6 +4205,57 @@ sub view { #------------------------------------------------------------------- +sub www_searchBadges { + my $self = shift; + my $session = $self->session; + my $db = $session->db; + my $query = $session->form->param("query"); + my $searchForm = WebGUI::Form::formHeader($session, {action=>$self->getUrl}) + .WebGUI::Form::hidden($session, {name=>"func", value=>"searchBadges"}) + .WebGUI::Form::text($session, {name=>"query", value=>$query, extras=>q|title="First Name, Last Name, Badge ID, or Email Address"|}) + .WebGUI::Form::submit($session, {value=>"Search"}) + .WebGUI::Form::formFooter($session); + my $results = ""; + if ($query ne "") { + $session->style->setRawHeadTags(q| + + |); + $results = "

You searched for: $query

"; + my $wildQuery = '%'.$query.'%'; + my $badges = $db->read("select badgeId, lastName, firstName, city, state, email from EventManagementSystem_badges + where assetId=? and (lastName like ? or firstName like ? or email like ? or badgeId like ?) + order by lastName, firstName", [$self->getId, $wildQuery, $wildQuery, $wildQuery, $wildQuery]); + $results .= q||; + while (my ($badgeId, $last, $first, $city, $state, $email) = $badges->array) { + $results .= q||; + $results .= qq| + |; + $results .= q||; + my $events = $db->read(q|select b.productId, c.sku, c.title, c.price, g.gateway, + from_unixtime(d.startDate,"%a %M:%i"), from_unixtime(d.endDate,"%a %H:%i") + from EventManagementSystem_registrations b left join products c on c.productId=b.productId + left join EventManagementSystem_products d ON d.productId=b.productId + left join EventManagementSystem_purchases f ON b.purchaseId=f.purchaseId + left join transaction g ON f.transactionId=g.transactionId where b.returned='0' and b.badgeId=? + order by d.startDate,d.endDate,c.title|,[$badgeId]); + while (my ($productId, $sku, $title, $price, $gateway, $start, $end) = $events->array) { + $results .= qq| + |; + } + $results .= q||; + $results .= q||; + } + $results .= q|
NameLocationEmailBadge ID
$last, $first$city, $state$email$badgeId

$sku : $title$start - $end($gateway) $price

|.$searchForm; + } + return $self->processStyle("

Search Badges

".$searchForm.$results); +} + +#------------------------------------------------------------------- + =head2 www_managePrereqSets ( ) Method to display the prereq set management console. @@ -4325,49 +4387,48 @@ sub www_editPrereqSetSave { return $self->www_managePrereqSets(); } - -#------------------------------------------------------------------- - -=head2 www_manageRegistrants ( ) - -Method to display the registrant management console. - -=cut - -sub www_manageRegistrants { - my $self = shift; - - return $self->session->privilege->insufficient unless ($self->canAddEvents); - my $i18n = WebGUI::International->new($self->session,'Asset_EventManagementSystem'); - - my $output; - my $sql = "select * from EventManagementSystem_badges where assetId=? order by lastName, firstName"; - my $p = WebGUI::Paginator->new($self->session,$self->getUrl('func=manageRegistrants'),50); - #$p->setDataByArrayRef($self->session->db->buildArrayRefOfHashRefs($sql),[$self->getId]); - $p->setDataByQuery($sql,undef,undef,[$self->getId]); - $p->setAlphabeticalKey('lastName'); - foreach my $badge (@{$p->getPageData}) { - $output .= "
"; - # $output .= $self->session->icon->delete('func=deleteRegistrant;psid='.$_->{badgeId}, $self->get('url')); - $output .= $self->session->icon->edit('func=editRegistrant;badgeId='.$badge->{badgeId}, $self->get('url')). - "  ".$badge->{lastName}.", ".$badge->{firstName}."  ( ".$badge->{email}." )
"; - } - $output .= '
'.$p->getBarAdvanced.'
'; - $self->getAdminConsole->addSubmenuItem($self->getUrl('func=editRegistrant;badgeId=new'), $i18n->get('add registrant')); - return $self->_acWrapper($output, $i18n->get("manage registrants")); +sub getPrintingVariables { + my $self = shift; + my $registrationId = shift; + my %event = $self->session->db->quickHash( + "select * from products a + join EventManagementSystem_products b on a.productId=b.productId + join EventManagementSystem_registrations c on b.productId=c.productId + join EventManagementSystem_badges d on c.badgeId=d.badgeId + join EventManagementSystem_purchases f on c.purchaseId=f.purchaseId + join transaction g on f.transactionId=g.transactionId + where c.registrationId=?", + [$registrationId]); + $event{emsTitle} = $self->getTitle; + my %meta = $self->session->db->buildHash( + "select name,fieldData from EventManagementSystem_metaData a + join EventManagementSystem_metaField b on a.fieldId=b.fieldId + where productId=?", + [$event{productId}]); + my %var = (%meta, %event); + return \%var; } +sub www_printBadge { + my $self = shift; + my $var = $self->getPrintingVariables($self->session->form->param("registrationId")); + return $self->processTemplate($var,$self->get("badgePrinterTemplateId")); +} + +sub www_printTicket { + my $self = shift; + my $var = $self->getPrintingVariables($self->session->form->param("registrationId")); + return $self->processTemplate($var,$self->get("ticketPrinterTemplateId")); +} #------------------------------------------------------------------- -sub www_editRegistrant { +sub www_editBadge { my $self = shift; my $badgeId = shift || $self->session->form->process("badgeId") || 'new'; my $error = shift; return $self->session->privilege->insufficient unless ($self->canAddEvents); my $i18n = WebGUI::International->new($self->session,'Asset_EventManagementSystem'); - my $f = WebGUI::HTMLForm->new($self->session, ( - action => $self->getUrl("func=editRegistrantSave;badgeId=".$badgeId) - )); + my $f = WebGUI::HTMLForm->new($self->session, action => $self->getUrl("func=editBadgeSave;badgeId=".$badgeId)); my $data = {}; if ($error) { # load submitted data. @@ -4483,12 +4544,63 @@ function resetToInitial() { value=>$data->{email} ); $f->submit; - $f->raw($self->www_viewPurchase('noStyle',$badgeId)); - return $self->_acWrapper($f->print, $i18n->get("edit registrant")); + my $tickets = q||; + my $events = $self->session->db->read(q|select b.productId, c.sku, c.title, c.price, g.gateway, + from_unixtime(d.startDate), from_unixtime(d.endDate), d.prerequisiteId, b.registrationId, + f.transactionId + from EventManagementSystem_registrations b left join products c on c.productId=b.productId + left join EventManagementSystem_products d ON d.productId=b.productId + left join EventManagementSystem_purchases f ON b.purchaseId=f.purchaseId + left join transaction g ON f.transactionId=g.transactionId where b.returned='0' and b.badgeId=? + order by d.startDate,d.endDate,c.title|,[$badgeId]); + my $ticker = 1; + while (my ($productId, $sku, $title, $price, $gateway, $start, $end, $prereq, $registrationId, $transactionId) = $events->array) { + my $isMaster = ($prereq eq ""); + my $class = ($ticker) ? q|oddEvent| : q|evenEvent|; + $class = "masterEvent" if $isMaster; + $tickets .= qq| + + |; + if ($isMaster) { + $tickets .= qq| + + + |; + } + else { + $tickets .= qq| + + |; + } + $tickets .= qq| + + |; + $ticker = ($ticker == 1) ? 0 : 1; + } + $tickets .= q|
$sku : $title$start - $end($gateway) $price
+ + +
+ +
+ +
+ + +
|; + $self->session->style->setRawHeadTags(q| + + |); + return $self->processStyle("

Edit Badge

".$f->print.$tickets); } #------------------------------------------------------------------- -sub www_editRegistrantSave { +sub www_editBadgeSave { my $self = shift; return $self->session->privilege->insufficient unless ($self->canAddEvents); my $error = ''; @@ -4498,7 +4610,7 @@ sub www_editRegistrantSave { $error .= sprintf($i18n->get('null field error'),$_)."
"; } } - return $self->www_editRegistrant(undef,$error) if $error; + return $self->www_editBadge(undef,$error) if $error; my $badgeId = $self->session->form->process('badgeId'); my $userId = $self->session->form->get("userId", "user"); my $firstName = $self->session->form->get("firstName", "text"); @@ -4573,7 +4685,7 @@ sub www_editRegistrantSave { $u->profileField('email',$email) if ($email ne ""); } } - return $self->www_manageRegistrants(); + return $self->www_searchBadges(); } diff --git a/lib/WebGUI/Operation/Settings.pm b/lib/WebGUI/Operation/Settings.pm index f184adeb0..399c2d0dc 100644 --- a/lib/WebGUI/Operation/Settings.pm +++ b/lib/WebGUI/Operation/Settings.pm @@ -379,12 +379,12 @@ sub definition { defaultValue=>$session->setting->get("selfDeactivation") }); push(@fields, { - tab=>"user", - fieldType=>"yesNo", - name=>"encryptLogin", - label=>$i18n->get(1006), - hoverHelp=>$i18n->get('1006 description'), - defaultValue=>$session->setting->get("encryptLogin") + tab => "user", + fieldType => ($session->config->get("sslEnabled") ? 'yesNo' : 'hidden'), + name => "encryptLogin", + label => $i18n->get(1006), + hoverHelp => $i18n->get('1006 description'), + defaultValue=> $session->setting->get("encryptLogin"), }); push(@fields, { tab=>"user",