From 5937926c1d1bea87b5e79c5c4cfda4ebfbab9b84 Mon Sep 17 00:00:00 2001 From: "Michael J. Rubinsky" Date: Fri, 18 Sep 2009 00:35:11 -0400 Subject: [PATCH] Refactor a bit. Move Kronolith_Resource::checkResources to Kronolith_Resource_*::getResponse() and remove the responsibilty of adding the event. --- kronolith/attendees.php | 26 +++++++------------- kronolith/lib/Event.php | 17 +++++++++++-- kronolith/lib/Resource.php | 50 --------------------------------------- kronolith/lib/Resource/Single.php | 26 ++++++++++++++++++++ 4 files changed, 49 insertions(+), 70 deletions(-) diff --git a/kronolith/attendees.php b/kronolith/attendees.php index 0e2fd1e21..b03de1afa 100644 --- a/kronolith/attendees.php +++ b/kronolith/attendees.php @@ -101,26 +101,16 @@ case 'add': // Any new resources? if (!empty($newResource)) { + + /* Get the requested resource */ $resource = Kronolith::getDriver('Resource')->getResource($newResource); - /* If we know we always accept/deny mark it that way now. */ - $type = $resource->getResponseType(); - if ($type == Kronolith_Resource::RESPONSETYPE_ALWAYS_ACCEPT) { - $response = Kronolith::RESPONSE_ACCEPTED; - } elseif ($type == Kronolith_Resource::RESPONSETYPE_ALWAYS_DECLINE) { - $response = Kronolith::RESPONSE_DECLINED; - } elseif ($type == Kronolith_Resource::RESPONSETYPE_AUTO) { - // Try to figure out the expected response - $date = new Horde_Date(Horde_Util::getFormData('date')); - $end = new Horde_Date(Horde_Util::getFormData('enddate')); - if ($resource->isFree(array('start' => $date, 'end' => $end))) { - $response = Kronolith::RESPONSE_ACCEPTED; - } else { - $response = Kronolith::RESPONSE_DECLINED; - } - } else { - $response = Kronolith::RESPONSE_NONE; - } + /* Do our best to see what the response will be. Note that this response + * is only guarenteed once the event is saved. + */ + $date = new Horde_Date(Horde_Util::getFormData('date')); + $end = new Horde_Date(Horde_Util::getFormData('enddate')); + $response = $resource->getResponse(array('start' => $date, 'end' => $end)); $resources[$newResource] = array( 'attendance' => Kronolith::PART_REQUIRED, diff --git a/kronolith/lib/Event.php b/kronolith/lib/Event.php index 8a683e24a..70d3faba7 100644 --- a/kronolith/lib/Event.php +++ b/kronolith/lib/Event.php @@ -316,8 +316,21 @@ abstract class Kronolith_Event return PEAR::raiseError('Event not yet initialized'); } - // TODO: Should this go here? - Kronolith_Resource::checkResources($this); + /* Check for acceptance/denial of this event's resources. + * + * @TODO: Need to look at how to lock the resource to avoid two events + * inadvertantly getting accepted. (Two simultaneous requests, both + * return RESPONSE_ACCEPTED from getResponse()) Maybe Horde_Lock? + */ + foreach ($this->getResources() as $id => $resourceData) { + $resource = Kronolith::getDriver('Resource')->getResource($id); + $response = $resource->getResponse($this); + if ($response == Kronolith::RESPONSE_ACCEPTED) { + $resource->addEvent($this); + } + $this->addResource($resource, $response); + } + $this->toDriver(); $result = $this->getDriver()->saveEvent($this); if (!is_a($result, 'PEAR_Error') && diff --git a/kronolith/lib/Resource.php b/kronolith/lib/Resource.php index 586d82804..e2971f3c9 100644 --- a/kronolith/lib/Resource.php +++ b/kronolith/lib/Resource.php @@ -72,54 +72,4 @@ class Kronolith_Resource return false; } - /** - * Function to check availability and set response status for each resource - * attached to the event. - * - * @param Kronolith_Event $event The event object to check the resources of - * - * @return void - */ - static public function checkResources($event) - { - foreach ($event->getResources() as $id => $resource) { - - /* Get the resource */ - $r = Kronolith::getDriver('Resource')->getResource($id); - - /* Determine if we have to calculate, or just auto-reply */ - $type = $r->getResponseType(); - switch($type) { - case Kronolith_Resource::RESPONSETYPE_ALWAYS_ACCEPT: - $r->addEvent($event); - $event->addResource($r, Kronolith::RESPONSE_ACCEPTED); - break; - case Kronolith_Resource::RESPONSETYPE_AUTO: - if ($r->isFree($event)) { - $r->addEvent($event); - $event->addResource($r, Kronolith::RESPONSE_ACCEPTED); - } else { - $event->addResource($r, Kronolith::RESPONSE_DECLINED); - } - break; - - case Kronolith_Resource::RESPONSETYPE_ALWAYS_DECLINE: - $event->addResource($r, Kronolith::RESPONSE_DECLINED); - break; - - case Kronolith_Resource::RESPONSETYPE_NONE: - $event->addResource($r, Kronolith::RESPONSE_NONE); - break; - - case Kronolith_Resource::RESPONSETYPE_MANUAL: - // Would be nice to be able to utilize iTips, but - // no idea how that would work right now...resources are not - // user accounts etc...for now, just set as NONE - $event->addResource($r, Kronolith::RESONSE_NONE); - break; - } - - } - } - } \ No newline at end of file diff --git a/kronolith/lib/Resource/Single.php b/kronolith/lib/Resource/Single.php index ac8562586..4784c3050 100644 --- a/kronolith/lib/Resource/Single.php +++ b/kronolith/lib/Resource/Single.php @@ -117,6 +117,32 @@ class Kronolith_Resource_Single extends Kronolith_Resource_Base } /** + * Check avilability and return an appropriate Kronolith response code. + * + * @param Kronolith_Event $event The event to check on + * + * @return integer Kronolith::RESPONSE* constant + */ + function getResponse($event) + { + switch($this->getResponseType()) { + case Kronolith_Resource::RESPONSETYPE_ALWAYS_ACCEPT: + return Kronolith::RESPONSE_ACCEPTED; + case Kronolith_Resource::RESPONSETYPE_AUTO: + if ($this->isFree($event)) { + return Kronolith::RESPONSE_ACCEPTED; + } else { + return Kronolith::RESPONSE_DECLINED; + } + case Kronolith_Resource::RESPONSETYPE_ALWAYS_DECLINE: + return Kronolith::RESPONSE_DECLINED; + case Kronolith_Resource::RESPONSETYPE_NONE: + case Kronolith_Resource::RESPONSETYPE_MANUAL: + return Kronolith::RESPONSE_NONE; + } + } + + /** * Obtain the freebusy information for this resource. * * @return unknown_type -- 2.11.0