#9688: allow to configure default period filter in json frontend
authorPhilipp Schüle <p.schuele@metaways.de>
Thu, 20 Feb 2014 11:02:32 +0000 (12:02 +0100)
committerPhilipp Schüle <p.schuele@metaways.de>
Fri, 21 Feb 2014 12:43:01 +0000 (13:43 +0100)
- adds two new config options to define default json period filter
(from+until)

https://forge.tine20.org/mantisbt/view.php?id=9688

Change-Id: I095e593fb9c139e79ef6f6844d13790d1ded91b6
Reviewed-on: http://gerrit.tine20.com/customers/357
Tested-by: Jenkins CI (http://ci.tine20.com/)
Reviewed-by: Philipp Schüle <p.schuele@metaways.de>
tests/tine20/Calendar/JsonTests.php
tine20/Calendar/Config.php
tine20/Calendar/Frontend/Json.php

index 3ae3581..34e7932 100644 (file)
@@ -4,7 +4,7 @@
  * 
  * @package     Calendar
  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
- * @copyright   Copyright (c) 2009-2013 Metaways Infosystems GmbH (http://www.metaways.de)
+ * @copyright   Copyright (c) 2009-2014 Metaways Infosystems GmbH (http://www.metaways.de)
  * @author      Cornelius Weiss <c.weiss@metaways.de>
  */
 
@@ -285,7 +285,28 @@ class Calendar_JsonTests extends Calendar_TestCase
         $this->assertEquals(2, count($returnedFilter), 'Two filters shoud have been returned!');
         $this->assertTrue($returnedFilter[1]['field'] == 'period' || $returnedFilter[0]['field'] == 'period', 'One returned filter shoud be a period filter');
     }
-
+    
+    /**
+     * add period filter if none is given / configure from+until
+     * 
+     * @see 0009688: allow to configure default period filter in json frontend
+     */
+    public function testSearchEventsWithOutPeriodFilterConfiguredFromAndUntil()
+    {
+        Calendar_Config::getInstance()->set(Calendar_Config::MAX_JSON_DEFAULT_FILTER_PERIOD_FROM, 12);
+        
+        $filter = array(array('field' => 'container_id', 'operator' => 'equals', 'value' => $this->_testCalendar->getId()));
+        $searchResultData = $this->_uit->searchEvents($filter, array());
+        
+        $now = Tinebase_DateTime::now()->setTime(0,0,0);
+        foreach ($searchResultData['filter'] as $filter) {
+            if ($filter['field'] === 'period') {
+                $this->assertEquals($now->getClone()->subYear(1)->toString(), $filter['value']['from']);
+                $this->assertEquals($now->getClone()->addMonth(1)->toString(), $filter['value']['until']);
+            }
+        }
+    }
+    
     /**
      * testSearchEvents with organizer = me filter
      * 
index b4a58c3..ae04640 100644 (file)
@@ -37,6 +37,20 @@ class Calendar_Config extends Tinebase_Config_Abstract
     const ATTENDEE_ROLES = 'attendeeRoles';
     
     /**
+     * MAX_JSON_DEFAULT_FILTER_PERIOD_FROM
+     * 
+     * @var string
+     */
+    const MAX_JSON_DEFAULT_FILTER_PERIOD_FROM = 'maxjsondefaultfilterperiodfrom';
+    
+    /**
+     * MAX_JSON_DEFAULT_FILTER_PERIOD_UNTIL
+     * 
+     * @var string
+     */
+    const MAX_JSON_DEFAULT_FILTER_PERIOD_UNTIL = 'maxjsondefaultfilterperioduntil';
+    
+    /**
      * (non-PHPdoc)
      * @see tine20/Tinebase/Config/Definition::$_properties
      */
@@ -71,6 +85,28 @@ class Calendar_Config extends Tinebase_Config_Abstract
             'clientRegistryInclude' => TRUE,
             'default'               => 'REQ'
         ),
+        self::MAX_JSON_DEFAULT_FILTER_PERIOD_FROM => array(
+        //_('Default filter period (from) for events fetched via JSON API')
+            'label'                 => 'Default filter period (from) for events fetched via JSON API',
+        //_('For how long in the past (in months) the events should be fetched.')
+            'description'           => 'For how long in the past (in months) the events should be fetched.',
+            'type'                  => Tinebase_Config_Abstract::TYPE_INT,
+            'clientRegistryInclude' => FALSE,
+            'setByAdminModule'      => FALSE,
+            'setBySetupModule'      => TRUE,
+            'default'               => 0,
+        ),
+        self::MAX_JSON_DEFAULT_FILTER_PERIOD_UNTIL => array(
+        //_('Default filter period (until) for events fetched via JSON API')
+            'label'                 => 'Default filter period (until) for events fetched via JSON API',
+        //_('For how long in the future (in months) the events should be fetched.')
+            'description'           => 'For how long in the future (in months) the events should be fetched.',
+            'type'                  => Tinebase_Config_Abstract::TYPE_INT,
+            'clientRegistryInclude' => FALSE,
+            'setByAdminModule'      => FALSE,
+            'setBySetupModule'      => TRUE,
+            'default'               => 1,
+        ),
     );
     
     /**
index ea53691..7104b38 100644 (file)
@@ -157,10 +157,7 @@ class Calendar_Frontend_Json extends Tinebase_Frontend_Json_Abstract
         
         // add period filter per default to prevent endless search
         if (! $periodFilter) {
-            $now = Tinebase_DateTime::now()->setTime(0,0,0);
-            $inAmonth = clone $now;
-            $inAmonth->addMonth(1);
-            $periodFilter = new Calendar_Model_PeriodFilter(array('field' => 'period', 'operator' => 'within', 'value' => array("from" => $now, "until" => $inAmonth)));
+            $periodFilter = $this->_getDefaultPeriodFilter();
             // periodFilter will be added to fixed filter when using fixed calendars
             if (! $useFixedCalendars) {
                 $filter->addFilter($periodFilter);
@@ -194,6 +191,26 @@ class Calendar_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     }
     
     /**
+     * get default period filter
+     * 
+     * @return Calendar_Model_PeriodFilter
+     */
+    protected function _getDefaultPeriodFilter()
+    {
+        $now = Tinebase_DateTime::now()->setTime(0,0,0);
+        
+        $from = $now->getClone()->subMonth(Calendar_Config::getInstance()->get(Calendar_Config::MAX_JSON_DEFAULT_FILTER_PERIOD_FROM, 0));
+        $until = $now->getClone()->addMonth(Calendar_Config::getInstance()->get(Calendar_Config::MAX_JSON_DEFAULT_FILTER_PERIOD_UNTIL, 1));
+        $periodFilter = new Calendar_Model_PeriodFilter(array(
+            'field' => 'period',
+            'operator' => 'within',
+            'value' => array("from" => $from, "until" => $until)
+        ));
+        
+        return $periodFilter;
+    }
+    
+    /**
      * Search for resources matching given arguments
      *
      * @param  array $_filter