plugins/tasklist
Thomas Brüderli
bruederli at kolabsys.com
Mon Apr 28 13:23:51 CEST 2014
plugins/tasklist/drivers/database/tasklist_database_driver.php | 61 +++++++++-
plugins/tasklist/drivers/tasklist_driver.php | 19 ++-
2 files changed, 75 insertions(+), 5 deletions(-)
New commits:
commit b8a8cc09271aa5aa6bcfc511d9467238b879807a
Author: Thomas Bruederli <bruederli at kolabsys.com>
Date: Mon Apr 28 13:23:11 2014 +0200
Support recurring tasks in database driver (#2713)
diff --git a/plugins/tasklist/drivers/database/tasklist_database_driver.php b/plugins/tasklist/drivers/database/tasklist_database_driver.php
index dfb2c1b..d9bf414 100644
--- a/plugins/tasklist/drivers/database/tasklist_database_driver.php
+++ b/plugins/tasklist/drivers/database/tasklist_database_driver.php
@@ -499,6 +499,11 @@ class tasklist_database_driver extends tasklist_driver
unset($rec['alarms']);
}
+ // decode serialze recurrence rules
+ if ($rec['recurrence']) {
+ $rec['recurrence'] = $this->unserialize_recurrence($rec['recurrence']);
+ }
+
unset($rec['task_id'], $rec['tasklist_id'], $rec['created']);
return $rec;
}
@@ -520,8 +525,11 @@ class tasklist_database_driver extends tasklist_driver
if (is_array($prop['valarms'])) {
$prop['alarms'] = $this->serialize_alarms($prop['valarms']);
}
+ if (is_array($prop['recurrence'])) {
+ $prop['recurrence'] = $this->serialize_recurrence($prop['recurrence']);
+ }
- foreach (array('parent_id', 'date', 'time', 'startdate', 'starttime', 'alarms') as $col) {
+ foreach (array('parent_id', 'date', 'time', 'startdate', 'starttime', 'alarms', 'recurrence') as $col) {
if (empty($prop[$col]))
$prop[$col] = null;
}
@@ -529,8 +537,8 @@ class tasklist_database_driver extends tasklist_driver
$notify_at = $this->_get_notification($prop);
$result = $this->rc->db->query(sprintf(
"INSERT INTO " . $this->db_tasks . "
- (tasklist_id, uid, parent_id, created, changed, title, date, time, startdate, starttime, description, tags, alarms, notify)
- VALUES (?, ?, ?, %s, %s, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
+ (tasklist_id, uid, parent_id, created, changed, title, date, time, startdate, starttime, description, tags, flagged, complete, alarms, recurrence, notify)
+ VALUES (?, ?, ?, %s, %s, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
$this->rc->db->now(),
$this->rc->db->now()
),
@@ -544,7 +552,10 @@ class tasklist_database_driver extends tasklist_driver
$prop['starttime'],
strval($prop['description']),
join(',', (array)$prop['tags']),
+ $prop['flagged'] ? 1 : 0,
+ intval($prop['complete']),
$prop['alarms'],
+ $prop['recurrence'],
$notify_at
);
@@ -566,13 +577,16 @@ class tasklist_database_driver extends tasklist_driver
if (is_array($prop['valarms'])) {
$prop['alarms'] = $this->serialize_alarms($prop['valarms']);
}
+ if (is_array($prop['recurrence'])) {
+ $prop['recurrence'] = $this->serialize_recurrence($prop['recurrence']);
+ }
$sql_set = array();
foreach (array('title', 'description', 'flagged', 'complete') as $col) {
if (isset($prop[$col]))
$sql_set[] = $this->rc->db->quote_identifier($col) . '=' . $this->rc->db->quote($prop[$col]);
}
- foreach (array('parent_id', 'date', 'time', 'startdate', 'starttime', 'alarms') as $col) {
+ foreach (array('parent_id', 'date', 'time', 'startdate', 'starttime', 'alarms', 'recurrence') as $col) {
if (isset($prop[$col]))
$sql_set[] = $this->rc->db->quote_identifier($col) . '=' . (empty($prop[$col]) ? 'NULL' : $this->rc->db->quote($prop[$col]));
}
@@ -735,6 +749,45 @@ class tasklist_database_driver extends tasklist_driver
}
/**
+ * Helper method to serialize task recurrence properties
+ */
+ private function serialize_recurrence($recurrence)
+ {
+ foreach ((array)$recurrence as $k => $val) {
+ if ($val instanceof DateTime) {
+ $recurrence[$k] = '@' . $val->format('c');
+ }
+ }
+
+ return $recurrence ? json_encode($recurrence) : null;
+ }
+
+ /**
+ * Helper method to decode a serialized task recurrence struct
+ */
+ private function unserialize_recurrence($ser)
+ {
+ if (strlen($ser)) {
+ $recurrence = json_decode($ser, true);
+ foreach ((array)$recurrence as $k => $val) {
+ if ($val[0] == '@') {
+ try {
+ $recurrence[$k] = new DateTime(substr($val, 1));
+ }
+ catch (Exception $e) {
+ unset($recurrence[$k]);
+ }
+ }
+ }
+ }
+ else {
+ $recurrence = '';
+ }
+
+ return $recurrence;
+ }
+
+ /**
* Handler for user_delete plugin hook
*/
public function user_delete($args)
diff --git a/plugins/tasklist/drivers/tasklist_driver.php b/plugins/tasklist/drivers/tasklist_driver.php
index c3b1423..6c31fa7 100644
--- a/plugins/tasklist/drivers/tasklist_driver.php
+++ b/plugins/tasklist/drivers/tasklist_driver.php
@@ -42,7 +42,24 @@
* 'flagged' => 'Boolean value whether this record is flagged',
* 'complete' => 'Float value representing the completeness state (range 0..1)',
* 'sensitivity' => 0|1|2, // Event sensitivity (0=public, 1=private, 2=confidential)
- * 'alarms' => '-15M:DISPLAY', // Reminder settings inspired by valarm definition (e.g. display alert 15 minutes before due time)
+ * 'valarms' => array( // List of reminders (new format), each represented as a hash array:
+ * array(
+ * 'trigger' => '-PT90M', // ISO 8601 period string prefixed with '+' or '-', or DateTime object
+ * 'action' => 'DISPLAY|EMAIL|AUDIO',
+ * 'duration' => 'PT15M', // ISO 8601 period string
+ * 'repeat' => 0, // number of repetitions
+ * 'description' => '', // text to display for DISPLAY actions
+ * 'summary' => '', // message text for EMAIL actions
+ * 'attendees' => array(), // list of email addresses to receive alarm messages
+ * ),
+ * ),
+ * 'recurrence' => array( // Recurrence definition according to iCalendar (RFC 2445) specification as list of key-value pairs
+ * 'FREQ' => 'DAILY|WEEKLY|MONTHLY|YEARLY',
+ * 'INTERVAL' => 1...n,
+ * 'UNTIL' => DateTime,
+ * 'COUNT' => 1..n, // number of times
+ * 'RDATE' => array(), // complete list of DateTime objects denoting individual repeat dates
+ * ),
* '_fromlist' => 'List identifier where the task was stored before',
* );
*/
More information about the commits
mailing list