diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index 668f25fbc..5b6f1144d 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -1,4 +1,7 @@ 7.3.18 + - fix: Old registrants appear in new EMS asset + http://www.plainblack.com/bugs/tracker/old-registrants-appear-in-new-ems-asset + - fix: a bunch of EMS related bugs - fix: If no sysnopsis exists, the asset inherits the parents' (perlDreamer Consulting, LLC) http://www.plainblack.com/bugs/tracker/if-no-sysnopsis-exists-the-asset-inherits-the-parents#VVesdkBSTm3neKRaKCJxKw - fix: diskUsage.pl (perlDreamer Consulting, LLC) diff --git a/docs/upgrades/upgrade_7.3.17-7.3.18.pl b/docs/upgrades/upgrade_7.3.17-7.3.18.pl index 19dd66c42..5a4cad105 100644 --- a/docs/upgrades/upgrade_7.3.17-7.3.18.pl +++ b/docs/upgrades/upgrade_7.3.17-7.3.18.pl @@ -20,17 +20,55 @@ my $quiet; # this line required my $session = start(); # this line required -# upgrade functions go here +fixEmsBadges($session); finish($session); # this line required -##------------------------------------------------- -#sub exampleFunction { -# my $session = shift; -# print "\tWe're doing some stuff here that you should know about.\n" unless ($quiet); -# # and here's our code -#} +#------------------------------------------------- +sub fixEmsBadges { + my $session = shift; + print "\tAttaching EMS Badges to their EMS.\n" unless ($quiet); + my $db = $session->db; + # give tables an asset id that should have it + $db->write("alter table EventManagementSystem_badges add column assetId varchar(22) binary"); + $db->write("alter table EventManagementSystem_prerequisites add column assetId varchar(22) binary"); + $db->write("alter table EventManagementSystem_registrations add column assetId varchar(22) binary"); + my $sth = $db->read("select badgeId,asset.assetId from EventManagementSystem_badges + left join EventManagementSystem_registrations using (badgeId) left join EventManagementSystem_products using + (productId) left join asset on (asset.assetId=EventManagementSystem_products.assetId);"); + while (my ($badgeId, $assetId) = $sth->array) { + $db->write("update EventManagementSystem_badges set assetId=? where badgeId=?", [$assetId, $badgeId]); + $db->write("update EventManagementSystem_registrations set assetId=? where badgeId=?", [$assetId, $badgeId]); + } + my $sth = $db->read("select EventManagementSystem_prerequisites.prerequisiteId, + EventManagementSystem_products.assetId from EventManagementSystem_prerequisites left join + EventManagementSystem_prerequisiteEvents using (prerequisiteId) left join EventManagementSystem_products on + (EventManagementSystem_products.productId=EventManagementSystem_prerequisiteEvents.requiredProductId)"); + while (my ($prereqId, $assetId) = $sth->array) { + $db->write("update EventManagementSystem_prerequisites set assetId=? where prerequisiteId=?", [$prereqId, + $assetId]); + } + + # delete badge data for which there is no asset + $db->write("delete from EventManagementSystem_badges where assetId is null"); + $db->write("delete from EventManagementSystem_registrations where assetId is null"); + # delete field data for which there is no asset + my $sth = $db->read("select EventManagementSystem_metaField.fieldId + from EventManagementSystem_metaField left join asset on + (EventManagementSystem_metaField.assetId=asset.assetId) where asset.assetId is null"); + while (my ($fieldId) = $sth->array) { + $db->write("delete from EventManagementSystem_metaData where fieldId=?",[$fieldId]); + $db->write("delete from EventManagementSystem_metaField where fieldId=?",[$fieldId]); + } + # delete prereqs for which there is no asset + my $sth = $db->read("select EventManagementSystem_prerequisites.prerequisiteId from + EventManagementSystem_prerequisites left join asset using (assetId) where asset.assetId is null"); + while (my ($id) = $sth->array) { + $db->write("delete from EventManagementSystem_prerequisites where prerequisiteId=?",[$id]); + $db->write("delete from EventManagementSystem_prerequisiteEvents where prerequisiteId=?",[$id]); + } +} diff --git a/lib/WebGUI/Asset/Wobject/EventManagementSystem.pm b/lib/WebGUI/Asset/Wobject/EventManagementSystem.pm index b2c3736ea..723592bcc 100644 --- a/lib/WebGUI/Asset/Wobject/EventManagementSystem.pm +++ b/lib/WebGUI/Asset/Wobject/EventManagementSystem.pm @@ -530,28 +530,87 @@ sub definition { #------------------------------------------------------------------ -=head2 deleteOrphans ( ) +=head2 deleteBadge ( id ) -Utility method that checks for prerequisite groupings that no longer have any events assigned to them and deletes it +Delete a badge. =cut -sub deleteOrphans { - my $self = shift; +sub deleteBadge { + my $self = shift; + my $id = shift; + $self->deleteCollateral('EventManagementSystem_badges', 'badgeId', $id); +} - # MSW Note - as this is on 4/27/2006, I don't think query will ever return any results. +#------------------------------------------------------------------ - #Check for orphaned prerequisite definitions - my @orphans = $self->session->db->quickArray("select p.prerequisiteId from EventManagementSystem_prerequisites as p - left join EventManagementSystem_prerequisiteEvents as pe - on p.prerequisiteId = pe.prerequisiteId - where pe.prerequisiteId is null"); - foreach my $orphan (@orphans) { - $self->session->db->write("delete from EventManagementSystem_prerequisites where prerequisiteId=". - $self->session->db->quote($orphan)); +=head2 deleteEvent ( id ) + +Delete an event. + +=cut + +sub deleteEvent { + my $self = shift; + my $id = shift; + my $db = $self->session->db; + $self->deletePrereq($id); + $self->deleteCollateral('EventManagementSystem_registrations', 'productId', $id); + $self->deleteCollateral('EventManagementSystem_products', 'productId', $id); + $self->deleteCollateral('products','productId',$id); + $self->reorderCollateral('EventManagementSystem_products', 'productId'); +} + +#------------------------------------------------------------------ + +=head2 deleteMetaField ( id ) + +Delete a meta field, and thusly metadata associated with that field. + +=cut + +sub deleteMetaField { + my $self = shift; + my $id = shift; + $self->deleteCollateral('EventManagementSystem_metaData', 'fieldId', $id); # deleteCollateral doesn't care about assetId. + $self->deleteCollateral('EventManagementSystem_metaField', 'fieldId', $id); + $self->reorderCollateral('EventManagementSystem_metaField', 'fieldId'); +} - } +#------------------------------------------------------------------ + +=head2 deletePrereq ( id ) + +Delete a prerequisite. + +=head3 id + +a valid event/product id + +=cut + +sub deletePrereq { + my $self = shift; + my $id = shift; + $self->deleteCollateral('EventManagementSystem_prerequisiteEvents', 'requiredProductId', $id); +} + +#------------------------------------------------------------------ + +=head2 deletePrereqSet ( id ) + +Delete a prerequisite set. + +=cut + +sub deletePrereqSet { + my $self = shift; + my $id = shift; + $self->deleteCollateral('EventManagementSystem_prerequisiteEvents', 'prerequisiteId', $id); + $self->deleteCollateral('EventManagementSystem_prerequisites', 'prerequisiteId', $id); + $self->session->db->write("update EventManagementSystem_product set prerequisiteId=null where + prerequisiteId=?", [$id]); } #------------------------------------------------------------------- @@ -965,6 +1024,35 @@ sub prerequisiteIsMet { } +#------------------------------------------------------------------ + +sub purge { + my $self = shift; + my $db = $self->session->db; + # delete meta fields + my $sth = $db->read("select fieldId from EventManagementSystem_metaField where assetId=?",[$self->getId]); + while (my ($id) = $sth->array) { + $self->deleteMetaField($id); + } + # delete events + my $sth = $db->read("select productId from EventManagementSystem_products where assetId=?",[$self->getId]); + while (my ($id) = $sth->array) { + $self->deleteEvent($id); + } + # delete prereqs + my $sth = $db->read("select prerequisiteId from EventManagementSystem_prerequisites where assetId=?",[$self->getId]); + while (my ($id) = $sth->array) { + $self->deletePrereqSet($id); + } + # delete badges + my $sth = $db->read("select fieldId from EventManagementSystem_badges where assetId=?",[$self->getId]); + while (my ($id) = $sth->array) { + $self->deleteBadge($id); + } + $self->SUPER::purge(@_); +} + + #------------------------------------------------------------------ sub removeFromScratchCart { my $self = shift; @@ -1556,42 +1644,23 @@ Method to delete an event, and to remove the deleted event from all prerequisite sub www_deleteEvent { my $self = shift; - my $eventId = $self->session->form->get("pid"); - return $self->session->privilege->insufficient unless ($self->canAddEvents); - - #Remove this event as a prerequisite to any other event - $self->session->db->write("delete from EventManagementSystem_prerequisiteEvents where requiredProductId=?", - [$eventId]); - $self->deleteOrphans; - - #Remove the event - $self->deleteCollateral('EventManagementSystem_products', 'productId', $eventId); - $self->deleteCollateral('products','productId',$eventId); - $self->reorderCollateral('EventManagementSystem_products', 'productId'); - + $self->deleteEvent($self->session->form->get("pid")); return $self->www_search; } #------------------------------------------------------------------- -=head2 www_deletePrerequisite ( ) +=head2 www_deletePrereqSet ( ) Method to delete a prerequisite assignment of one event to another =cut -sub www_deletePrerequisite { +sub www_deletePrereqSet { my $self = shift; - my $eventId = $self->session->form->get("id"); - return $self->session->privilege->insufficient unless ($self->canAddEvents); - - $self->session->db->write("delete from EventManagementSystem_prerequisiteEvents where prerequisiteId=?", - [$eventId]); - $self->session->db->write("delete from EventManagementSystem_prerequisites where prerequisiteId=?", - [$eventId]); - + $self->deletePrereqSet($self->session->form->get("psid")); return $self->www_editEvent; } @@ -2531,12 +2600,8 @@ Method to move an event down one position in display order sub www_moveEventMetaDataFieldDown { my $self = shift; - my $eventId = $self->session->form->get("fieldId"); - return $self->session->privilege->insufficient unless ($self->canAddEvents); - - $self->moveCollateralDown('EventManagementSystem_metaField', 'fieldId', $eventId); - + $self->moveCollateralDown('EventManagementSystem_metaField', 'fieldId', $self->session->form->get("fieldId")); return $self->www_manageEventMetadata; } @@ -2550,12 +2615,8 @@ Method to move an event metdata field up one position in display order sub www_moveEventMetaDataFieldUp { my $self = shift; - my $eventId = $self->session->form->get("fieldId"); - return $self->session->privilege->insufficient unless ($self->canAddEvents); - - $self->moveCollateralUp('EventManagementSystem_metaField', 'fieldId', $eventId); - + $self->moveCollateralUp('EventManagementSystem_metaField', 'fieldId', $self->session->form->get("fieldId")); return $self->www_manageEventMetadata; } @@ -2570,14 +2631,8 @@ Method to move an event metdata field up one position in display order sub www_deleteEventMetaDataField { my $self = shift; - my $eventId = $self->session->form->get("fieldId"); - return $self->session->privilege->insufficient unless ($self->canAddEvents); - - $self->deleteCollateral('EventManagementSystem_metaField', 'fieldId', $eventId); - $self->reorderCollateral('EventManagementSystem_metaField', 'fieldId'); - $self->deleteCollateral('EventManagementSystem_metaData', 'fieldId', $eventId); # deleteCollateral doesn't care about assetId. - + $self->deleteMetaField($self->session->form->get("fieldId")); return $self->www_manageEventMetadata; } @@ -2591,12 +2646,8 @@ Method to move an event down one position in display order sub www_moveEventDown { my $self = shift; - my $eventId = $self->session->form->get("pid"); - return $self->session->privilege->insufficient unless ($self->canAddEvents); - - $self->moveCollateralDown('EventManagementSystem_products', 'productId', $eventId); - + $self->moveCollateralDown('EventManagementSystem_products', 'productId', $self->session->form->get("pid")); return $self->www_search; } @@ -2610,12 +2661,8 @@ Method to move an event up one position in display order sub www_moveEventUp { my $self = shift; - my $eventId = $self->session->form->get("pid"); - return $self->session->privilege->insufficient unless ($self->canAddEvents); - - $self->moveCollateralUp('EventManagementSystem_products', 'productId', $eventId); - + $self->moveCollateralUp('EventManagementSystem_products', 'productId', $self->session->form->get("pid")); return $self->www_search; } @@ -2637,11 +2684,12 @@ sub saveRegistration { next if isIn($eventId,@addingToPurchase); next if isIn($eventId,@badgeEvents); my $registrationId = $self->setCollateral("EventManagementSystem_registrations", "registrationId",{ + assetId => $self->getId, registrationId => "new", - purchaseId => $purchaseId, - productId => $eventId, - badgeId => $badgeId - },0,0); + purchaseId => $purchaseId, + productId => $eventId, + badgeId => $badgeId, + },0,0); $shoppingCart->add($eventId, 'Event'); $addedAny = 1; } @@ -2724,6 +2772,7 @@ sub www_saveRegistrantInfo { my $details = { badgeId => $badgeId, # if this is "new", setCollateral will return the new one. + assetId => $self->getId, firstName => $firstName, lastName => $lastName, address => $address, @@ -3373,6 +3422,7 @@ sub www_editPrereqSetSave { my $psid = $self->session->form->process('psid'); $psid = $self->setCollateral("EventManagementSystem_prerequisites", "prerequisiteId",{ prerequisiteId=>$psid, + assetId=>$self->getId, name => $self->session->form->process("name"), operator => $self->session->form->process("operator",'radioList') },0,0); @@ -3408,16 +3458,16 @@ sub www_manageRegistrants { my $i18n = WebGUI::International->new($self->session,'Asset_EventManagementSystem'); my $output; - my $sql = "select * from EventManagementSystem_badges order by lastName, firstName"; + 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)); - my $data = $p->getPageData; + #$p->setDataByArrayRef($self->session->db->buildArrayRefOfHashRefs($sql),[$self->getId]); + $p->setDataByQuery($sql,undef,undef,[$self->getId]); $p->setAlphabeticalKey('lastName'); - foreach (@$data) { + 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='.$_->{badgeId}, $self->get('url')). - "  ".$_->{lastName}.", ".$_->{firstName}."  ( ".$_->{email}." )
"; + $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')); @@ -3582,6 +3632,7 @@ sub www_editRegistrantSave { my $addingNew = ($userId eq 'new') ? 1 : 0; my $details = { badgeId => $badgeId, # if this is "new", setCollateral will return the new one. + assetId => $self->getId, firstName => $firstName, lastName => $lastName, 'address' => $address,