Add a multienum to single resources to allow changing/showing it's
authorMichael J. Rubinsky <mrubinsk@horde.org>
Wed, 21 Oct 2009 23:28:55 +0000 (19:28 -0400)
committerMichael J. Rubinsky <mrubinsk@horde.org>
Thu, 22 Oct 2009 17:54:34 +0000 (13:54 -0400)
groupings.

kronolith/lib/Driver/Resource.php
kronolith/lib/Forms/CreateResource.php
kronolith/lib/Forms/CreateResourceGroup.php
kronolith/lib/Forms/EditResource.php
kronolith/lib/Forms/EditResourceGroup.php
kronolith/lib/Resource.php
kronolith/lib/Resource/Group.php
kronolith/resources/edit.php
kronolith/resources/groups/edit.php

index 82c61c7..18968a8 100644 (file)
@@ -65,18 +65,18 @@ class Kronolith_Driver_Resource extends Kronolith_Driver_Sql
     public function save($resource)
     {
         if ($resource->getId()) {
-            $query = 'UPDATE kronolith_resources SET resource_name = ?, resource_calendar = ?, resource_category = ? , resource_description = ?, resource_response_type = ?, resource_type = ?, resource_members = ? WHERE resource_id = ?';
-            $values = array($this->convertToDriver($resource->get('name')), $resource->get('calendar'), $resource->get('category'), $this->convertToDriver($resource->get('description')), $resource->get('response_type'), $resource->get('type'), $resource->get('members'), $resource->getId());
+            $query = 'UPDATE kronolith_resources SET resource_name = ?, resource_calendar = ? , resource_description = ?, resource_response_type = ?, resource_type = ?, resource_members = ? WHERE resource_id = ?';
+            $values = array($this->convertToDriver($resource->get('name')), $resource->get('calendar'), $this->convertToDriver($resource->get('description')), $resource->get('response_type'), $resource->get('type'), serialize($resource->get('members')), $resource->getId());
             $result = $this->_write_db->query($query, $values);
             if ($result instanceof PEAR_Error) {
                 Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR);
                 throw new Horde_Exception($result);
             }
         } else {
-            $query = 'INSERT INTO kronolith_resources (resource_id, resource_name, resource_calendar, resource_category, resource_description, resource_response_type, resource_type, resource_members)';
-            $cols_values = ' VALUES (?, ?, ?, ?, ?, ?, ?, ?)';
+            $query = 'INSERT INTO kronolith_resources (resource_id, resource_name, resource_calendar, resource_description, resource_response_type, resource_type, resource_members)';
+            $cols_values = ' VALUES (?, ?, ?, ?, ?, ?, ?)';
             $id = $this->_db->nextId('kronolith_resources');
-            $values = array($id, $this->convertToDriver($resource->get('name')), $resource->get('calendar'), $resource->get('category'), $this->convertToDriver($resource->get('description')), $resource->get('response_type'), $resource->get('type'), $resource->get('members'));
+            $values = array($id, $this->convertToDriver($resource->get('name')), $resource->get('calendar'), $this->convertToDriver($resource->get('description')), $resource->get('response_type'), $resource->get('type'), serialize($resource->get('members')));
             $result = $this->_write_db->query($query . $cols_values, $values);
             if ($result instanceof PEAR_Error) {
                 Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR);
@@ -130,7 +130,7 @@ class Kronolith_Driver_Resource extends Kronolith_Driver_Sql
      */
     public function getResource($id)
     {
-        $query = 'SELECT resource_id, resource_name, resource_calendar, resource_category, resource_description, resource_response_type, resource_type, resource_members FROM kronolith_resources WHERE resource_id = ?';
+        $query = 'SELECT resource_id, resource_name, resource_calendar, resource_description, resource_response_type, resource_type, resource_members FROM kronolith_resources WHERE resource_id = ?';
         $results = $this->_db->getRow($query, array($id), DB_FETCHMODE_ASSOC);
         if ($results instanceof PEAR_Error) {
             Horde::logMessage($result, __FILE__, __LINE__, PEAR_LOG_ERR);
@@ -186,7 +186,7 @@ class Kronolith_Driver_Resource extends Kronolith_Driver_Sql
             return array();
         }
 
-        $query = 'SELECT resource_id, resource_name, resource_calendar, resource_category, resource_description, resource_response_type, resource_type, resource_members FROM kronolith_resources';
+        $query = 'SELECT resource_id, resource_name, resource_calendar, resource_description, resource_response_type, resource_type, resource_members FROM kronolith_resources';
         if (count($filter)) {
             $clause = ' WHERE ';
             $i = 0;
@@ -213,6 +213,27 @@ class Kronolith_Driver_Resource extends Kronolith_Driver_Sql
     }
 
     /**
+     * Obtain the group id for each group the speciied resource is a member of.
+     *
+     * @param integer $resource_id  The resource id to check for.
+     *
+     * @return array of group ids.
+     */
+    public function getGroupMemberships($resource_id)
+    {
+        $groups = $this->listResources(PERMS_READ, array('type' => Kronolith_Resource::TYPE_GROUP));
+        $in = array();
+        foreach ($groups as $group) {
+            $members = $group->get('members');
+            if (array_search($resource_id, $members) !== false) {
+                $in[] = $group->getId();
+            }
+        }
+
+        return $in;
+    }
+
+    /**
      *
      * @param $params
      * @return unknown_type
@@ -222,10 +243,12 @@ class Kronolith_Driver_Resource extends Kronolith_Driver_Sql
         $return = array();
         foreach ($params as $field => $value) {
             if ($field == 'resource_name' || $field == 'resource_description') {
-                $return[str_replace('resource_', '', $field)] = $this->convertFromDriver($value);
-            } else {
-                $return[str_replace('resource_', '', $field)] = $value;
+               $value = $this->convertFromDriver($value);
+            } elseif ($field == 'resource_members') {
+                $value = @unserialize($value);
             }
+
+            $return[str_replace('resource_', '', $field)] = $value;
         }
 
         return $return;
index 37c4d48..621d275 100644 (file)
@@ -33,22 +33,38 @@ class Kronolith_CreateResourceForm extends Horde_Form {
                             Kronolith_Resource::RESPONSETYPE_MANUAL => _("Manual"),
                             Kronolith_Resource::RESPONSETYPE_NONE => _("None"));
 
+        /* Get a list of available resource groups */
+        $driver = Kronolith::getDriver('Resource');
+        $groups = $driver->listResources(PERMS_READ, array('type' => Kronolith_Resource::TYPE_GROUP));
+        foreach ($groups as $id => $group) {
+            $enum[$id] = $group->get('name');
+        }
+
         $this->addVariable(_("Name"), 'name', 'text', true);
         $this->addVariable(_("Description"), 'description', 'longtext', false, false, null, array(4, 60));
         $this->addVariable(_("Response type"), 'responsetype', 'enum', true, false, null, array('enum' => $responses));
-        $this->addVariable(_("Category"), 'category', 'text', false);
+        $this->addVariable(_("Groups"), 'category', 'multienum', false, false, null, array('enum' => $enum));
         $this->setButtons(array(_("Create")));
     }
 
     function execute()
     {
         $new = array('name' => $this->_vars->get('name'),
-                     'category' => $this->_vars->get('category'),
                      'description' => $this->_vars->get('description'),
                      'response_type' => $this->_vars->get('responsetype'));
 
         $resource = new Kronolith_Resource_Single($new);
-        return $results = Kronolith_Resource::addResource($resource);
+        $resource = Kronolith_Resource::addResource($resource);
+
+        /* Do we need to add this to any groups? */
+        $groups = $this->_vars->get('category');
+        foreach ($groups as $group_id) {
+            $group = Kronolith::getDriver('Resource')->getResource($group_id);
+            $members = $group->get('members');
+            $members[] = $resource->getId();
+            $group->set('members', $members);
+            $group->save();
+        }
     }
 
 }
index 9cc1a95..bce170f 100644 (file)
@@ -41,12 +41,12 @@ class Kronolith_CreateResourceGroupForm extends Horde_Form {
 
     function execute()
     {
-        $members = serialize($this->_vars->get('members'));
         $new = array('name' => $this->_vars->get('name'),
                      'description' => $this->_vars->get('description'),
-                     'members' => $members);
+                     'members' => $this->_vars->get('members'));
 
         $resource = new Kronolith_Resource_Group($new);
+
         return $results = Kronolith_Resource::addResource($resource);
     }
 
index 840c03f..3381d7b 100644 (file)
@@ -37,11 +37,20 @@ class Kronolith_EditResourceForm extends Horde_Form {
                             Kronolith_Resource::RESPONSETYPE_AUTO => _("Automatically"),
                             Kronolith_Resource::RESPONSETYPE_MANUAL => _("Manual"),
                             Kronolith_Resource::RESPONSETYPE_NONE => _("None"));
+
+        /* Get a list of available resource groups */
+        $driver = Kronolith::getDriver('Resource');
+        $groups = $driver->listResources(PERMS_READ, array('type' => Kronolith_Resource::TYPE_GROUP));
+        $enum = array();
+        foreach ($groups as $id => $group) {
+            $enum[$id] = $group->get('name');
+        }
+
         $this->addHidden('', 'c', 'text', true);
         $this->addVariable(_("Name"), 'name', 'text', true);
         $this->addVariable(_("Description"), 'description', 'longtext', false, false, null, array(4, 60));
         $this->addVariable(_("Response type"), 'responsetype', 'enum', true, false, null, array('enum' => $responses));
-        $this->addVariable(_("Category"), 'category', 'text', false);
+        $this->addVariable(_("Groups"), 'category', 'multienum', false, false, null, array('enum' => $enum));
         $this->setButtons(array(_("Save")));
     }
 
@@ -51,7 +60,6 @@ class Kronolith_EditResourceForm extends Horde_Form {
         $new_name = $this->_vars->get('name');
         $this->_resource->set('name', $new_name);
         $this->_resource->set('description', $this->_vars->get('description'));
-        $this->_resource->set('category', $this->_vars->get('category'));
         $this->_resource->set('response_type', $this->_vars->get('responsetype'));
         if ($original_name != $new_name) {
             $result = Kronolith::getDriver()->rename($original_name, $new_name);
@@ -60,6 +68,41 @@ class Kronolith_EditResourceForm extends Horde_Form {
             }
         }
 
+        /* Update group memberships */
+        $driver = Kronolith::getDriver('Resource');
+        $existing_groups = $driver->getGroupMemberships($this->_resource->getId());
+        $new_groups = $this->_vars->get('category');
+        $new_groups = (is_null($new_groups) ? array() : $new_groups);
+        foreach ($existing_groups as $gid) {
+             $i = array_search($gid, $new_groups);
+             if ($i === false) {
+                 // No longer in this group
+                 $group = $driver->getResource($gid);
+                 $members = $group->get('members');
+                 $idx = array_search($this->_resource->getId(), $members);
+                 if ($idx !== false) {
+                     unset($members[$idx]);
+                     reset($members);
+                     $group->set('members', $members);
+                     $group->save();
+                 }
+             } else {
+                 // We know it's already in the group, remove it so we don't
+                 // have to check/add it again later.
+                 unset($new_groups[$i]);
+             }
+        }
+
+        reset($new_groups);
+        foreach ($new_groups as $gid) {
+            $group = $driver->getResource($gid);
+            $members = $group->get('members');
+            $members[] = $this->_resource->getId();
+            $group->set('members', $members);
+            $group->save();
+        }
+
+
         $result = $this->_resource->save();
         if (is_a($result, 'PEAR_Error')) {
             return PEAR::raiseError(sprintf(_("Unable to save resource \"%s\": %s"), $new_name, $result->getMessage()));
index 92d305d..32c6603 100644 (file)
@@ -52,7 +52,7 @@ class Kronolith_EditResourceGroupForm extends Horde_Form {
         $new_name = $this->_vars->get('name');
         $this->_resource->set('name', $new_name);
         $this->_resource->set('description', $this->_vars->get('description'));
-        $this->_resource->set('members', serialize($this->_vars->get('members')));
+        $this->_resource->set('members', $this->_vars->get('members'));
         if ($original_name != $new_name) {
             $result = Kronolith::getDriver()->rename($original_name, $new_name);
             if (is_a($result, 'PEAR_Error')) {
index 2c28dba..2317b54 100644 (file)
@@ -20,6 +20,10 @@ class Kronolith_Resource
     const RESPONSETYPE_ALWAYS_DECLINE = 3;
     const RESPONSETYPE_MANUAL = 4;
 
+    /* Resource Type constants */
+    const TYPE_SINGLE = 'Single';
+    const TYPE_GROUP = 'Group';
+
    /**
     * Adds a new resource to storage
     *
index 0860976..d6b5ae5 100644 (file)
@@ -90,7 +90,7 @@ class Kronolith_Resource_Group extends Kronolith_Resource_Base
         }
 
         /* Get all resources that are included in this category */
-        $resources = unserialize($this->get('members'));
+        $resources = $this->get('members');
 
         /* Iterate over all resources until one with no conflicts is found */
         foreach ($resources as $resource_id) {
index b2cf642..8cb515a 100644 (file)
@@ -52,7 +52,7 @@ if ($form->validate($vars)) {
 
 $vars->set('name', $resource->get('name'));
 $vars->set('description', $resource->get('description'));
-$vars->set('category', $resource->get('category'));
+$vars->set('category', Kronolith::getDriver('Resource')->getGroupMemberships($resource->getId()));
 $vars->set('responsetype', $resource->get('response_type'));
 
 $title = $form->getTitle();
index f53bfe5..4f77ff2 100644 (file)
@@ -52,7 +52,7 @@ if ($form->validate($vars)) {
 
 $vars->set('name', $group->get('name'));
 $vars->set('description', $group->get('description'));
-$vars->set('members', unserialize($group->get('members')));
+$vars->set('members', $group->get('members'));
 
 $title = $form->getTitle();
 require KRONOLITH_TEMPLATES . '/common-header.inc';