Allow to return dates formatted as Horde_Date.
authorGunnar Wrobel <p@rdus.de>
Wed, 17 Jun 2009 10:06:24 +0000 (12:06 +0200)
committerGunnar Wrobel <p@rdus.de>
Wed, 17 Jun 2009 10:06:24 +0000 (12:06 +0200)
framework/Kolab_Server/lib/Horde/Kolab/Server/Object.php
framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolabinetorgperson.php
framework/Kolab_Server/package.xml
framework/Kolab_Server/test/Horde/Kolab/Server/PersonTest.php

index 063b8e0..2e541bf 100644 (file)
@@ -45,6 +45,15 @@ class Horde_Kolab_Server_Object
     /** The time the object was created */
     const ATTRIBUTE_CREATIONDATE = 'createTimestamp';
 
+    /** The time the object was last modified */
+    const ATTRIBUTE_MODIFICATIONDATE = 'modifyTimestamp';
+
+    /** The time the object was created */
+    const ATTRDATE_CREATIONDATE = 'createTimestampDate';
+
+    /** The time the object was last modified */
+    const ATTRDATE_MODIFICATIONDATE = 'modifyTimestampDate';
+
     /** Access rules for this object */
     const ATTRIBUTE_ACI = 'OpenLDAPaci';
 
@@ -127,6 +136,7 @@ class Horde_Kolab_Server_Object
         'defined' => array(
             self::ATTRIBUTE_OC,
             self::ATTRIBUTE_CREATIONDATE,
+            self::ATTRIBUTE_MODIFICATIONDATE,
             self::ATTRIBUTE_ACI,
         ),
         /**
@@ -139,6 +149,18 @@ class Horde_Kolab_Server_Object
             self::ATTRIBUTE_ID => array(
                 'method' => 'getId',
             ),
+            self::ATTRDATE_CREATIONDATE => array(
+                'method' => 'getDate',
+                'args' => array(
+                    self::ATTRIBUTE_CREATIONDATE,
+                ),
+            ),
+            self::ATTRDATE_MODIFICATIONDATE => array(
+                'method' => 'getDate',
+                'args' => array(
+                    self::ATTRIBUTE_MODIFICATIONDATE,
+                ),
+            ),
         ),
         /**
          * Attributes that are written using the information from several other
@@ -564,6 +586,26 @@ class Horde_Kolab_Server_Object
     }
 
     /**
+     * Get a derived attribute date by converting it into a Horde_Date object.
+     *
+     * @param string $key   Name of the attribute that holds the
+     *                      date.
+     *
+     * @return mixed A Horde_Date object or false if the date was not
+     *               converted successfully.
+     */
+    protected function getDate($key)
+    {
+        $date = $this->_get($key);
+        if (empty($date) || !class_exists('Horde_Date')) {
+            return false;
+        }
+
+        $result = new Horde_Date($date);
+        return $result;
+    }
+
+    /**
      * Set a collapsed attribute value.
      *
      * @param string  $key        The attribute to collapse into.
@@ -923,7 +965,9 @@ class Horde_Kolab_Server_Object
             }
         }
 
-        $changes['attributes'] = array_unique($changes['attributes']);
+        if (!empty($changes['attributes'])) {
+            $changes['attributes'] = array_unique($changes['attributes']);
+        }
 
         return $changes;
     }
index 9b25c36..c5caf90 100644 (file)
@@ -86,6 +86,9 @@ class Horde_Kolab_Server_Object_Kolabinetorgperson extends Horde_Kolab_Server_Ob
     /** The date of birth */
     const ATTRIBUTE_DATEOFBIRTH = 'apple-birthday';
 
+    /** The date of birth as Horde_Date */
+    const ATTRDATE_DATEOFBIRTH = 'apple-birthdayDate';
+
     /** The place of birth */
     const ATTRIBUTE_PLACEOFBIRTH = 'birthPlace';
 
@@ -202,6 +205,17 @@ class Horde_Kolab_Server_Object_Kolabinetorgperson extends Horde_Kolab_Server_Ob
         'locked' => array(
             self::ATTRIBUTE_MAIL,
         ),
+        /**
+         * Derived attributes are calculated based on other attribute values.
+         */
+        'derived' => array(
+            self::ATTRDATE_DATEOFBIRTH => array(
+                'method' => 'getDate',
+                'args' => array(
+                    self::ATTRIBUTE_DATEOFBIRTH,
+                ),
+            ),
+        ),
         'object_classes' => array(
             self::OBJECTCLASS_KOLABINETORGPERSON,
         ),
index 7c38235..bd754e0 100644 (file)
@@ -159,6 +159,10 @@ http://pear.php.net/dtd/package-2.0.xsd">
     <channel>pear.horde.org</channel>
    </package>
    <package>
+    <name>Date</name>
+    <channel>pear.horde.org</channel>
+   </package>
+   <package>
     <name>PHPUnit</name>
     <channel>pear.phpunit.de</channel>
    </package>
index 5331df5..70ddc59 100644 (file)
@@ -97,6 +97,14 @@ class Horde_Kolab_Server_PersonTest extends Horde_Kolab_Test_Server
             Horde_Kolab_Server_Object_Person::ATTRIBUTE_SN           => 'Kolab_Server_PersonTest_123456',
             Horde_Kolab_Server_Object_Person::ATTRIBUTE_USERPASSWORD => 'Kolab_Server_PersonTest_123456',
         ),
+        /* Person with a creation date*/
+        array(
+            'type' => 'Horde_Kolab_Server_Object_Person',
+            Horde_Kolab_Server_Object_Person::ATTRIBUTE_CN           => 'Kolab_Server_PersonTest_123456',
+            Horde_Kolab_Server_Object_Person::ATTRIBUTE_SN           => 'Kolab_Server_PersonTest_123456',
+            Horde_Kolab_Server_Object_Person::ATTRIBUTE_USERPASSWORD => 'Kolab_Server_PersonTest_123456',
+            Horde_Kolab_Server_Object_Person::ATTRIBUTE_CREATIONDATE => '191008030000Z',
+        ),
     );
 
     /**
@@ -261,4 +269,20 @@ class Horde_Kolab_Server_PersonTest extends Horde_Kolab_Test_Server
                                     Horde_Kolab_Server_Object_Person::ATTRIBUTE_TELNO,
                                     array('123456789', '+1234567890', array('1', '2'), null, '0'), true);
     }
+
+    /**
+     * Test retrrieving a date.
+     *
+     * @dataProvider provideServers
+     *
+     * @return NULL
+     */
+    public function testGetDate($server)
+    {
+        $person = $this->assertAdd($server, $this->objects[8],
+                                   array(Horde_Kolab_Server_Object_Person::ATTRIBUTE_TELNO => ''));
+       $cdate = $person->get(Horde_Kolab_Server_Object_Person::ATTRDATE_CREATIONDATE);
+       $this->assertEquals('Horde_Date', get_class($cdate));
+       $this->assertEquals('1910-08-03 01:00:00', (string) $cdate);
+    }
 }