nextcloud/apps/tasks/lib/app.php

189 lines
5.4 KiB
PHP

<?php
/**
* ownCloud - Calendar
*
* @author Bart Visscher
* @copyright 2011 Bart Visscher bartv@thisnet.nl
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
/**
* This class manages our tasks
*/
OC_Task_App::$l10n = new OC_L10N('tasks');
class OC_Task_App {
public static $l10n;
public static function getPriorityOptions()
{
return array(
'' => self::$l10n->t('Unspecified'),
'1' => self::$l10n->t('1=highest'),
'2' => '2',
'3' => '3',
'4' => '4',
'5' => self::$l10n->t('5=medium'),
'6' => '6',
'7' => '7',
'8' => '8',
'9' => self::$l10n->t('9=lowest'),
);
}
public static function arrayForJSON($id, $vtodo, $user_timezone)
{
$task = array( 'id' => $id );
$task['summary'] = $vtodo->getAsString('SUMMARY');
$task['description'] = $vtodo->getAsString('DESCRIPTION');
$task['location'] = $vtodo->getAsString('LOCATION');
$task['categories'] = $vtodo->getAsArray('CATEGORIES');
$due = $vtodo->DUE;
if ($due) {
$task['due_date_only'] = $due->getDateType() == Sabre_VObject_Element_DateTime::DATE;
$due = $due->getDateTime();
$due->setTimezone(new DateTimeZone($user_timezone));
$task['due'] = $due->format('U');
}
else {
$task['due'] = false;
}
$task['priority'] = $vtodo->getAsString('PRIORITY');
$completed = $vtodo->COMPLETED;
if ($completed) {
$completed = $completed->getDateTime();
$completed->setTimezone(new DateTimeZone($user_timezone));
$task['completed'] = $completed->format('Y-m-d H:i:s');
}
else {
$task['completed'] = false;
}
$task['complete'] = $vtodo->getAsString('PERCENT-COMPLETE');
return $task;
}
public static function validateRequest($request)
{
$errors = array();
if($request['summary'] == '') {
$errors['summary'] = self::$l10n->t('Empty Summary');
}
try {
$timezone = OC_Calendar_App::getTimezone();
$timezone = new DateTimeZone($timezone);
new DateTime($request['due'], $timezone);
} catch (Exception $e) {
$errors['due'] = self::$l10n->t('Invalid date/time');
}
if ($request['percent_complete'] < 0 || $request['percent_complete'] > 100) {
$errors['percent_complete'] = self::$l10n->t('Invalid percent complete');
}
if ($request['percent_complete'] == 100 && !empty($request['completed'])) {
try {
$timezone = OC_Calendar_App::getTimezone();
$timezone = new DateTimeZone($timezone);
new DateTime($request['completed'], $timezone);
} catch (Exception $e) {
$errors['completed'] = self::$l10n->t('Invalid date/time');
}
}
$priority_options = self::getPriorityOptions();
if (!in_array($request['priority'], array_keys($priority_options))) {
$errors['priority'] = self::$l10n->t('Invalid priority');
}
return $errors;
}
public static function createVCalendarFromRequest($request)
{
$vcalendar = new OC_VObject('VCALENDAR');
$vcalendar->add('PRODID', 'ownCloud Calendar');
$vcalendar->add('VERSION', '2.0');
$vtodo = new OC_VObject('VTODO');
$vcalendar->add($vtodo);
$vtodo->setDateTime('CREATED', 'now', Sabre_VObject_Element_DateTime::UTC);
$vtodo->setUID();
return self::updateVCalendarFromRequest($request, $vcalendar);
}
public static function updateVCalendarFromRequest($request, $vcalendar)
{
$summary = $request['summary'];
$categories = $request["categories"];
$priority = $request['priority'];
$percent_complete = $request['percent_complete'];
$completed = $request['completed'];
$location = $request['location'];
$due = $request['due'];
$description = $request['description'];
$vtodo = $vcalendar->VTODO;
$vtodo->setDateTime('LAST-MODIFIED', 'now', Sabre_VObject_Element_DateTime::UTC);
$vtodo->setDateTime('DTSTAMP', 'now', Sabre_VObject_Element_DateTime::UTC);
$vtodo->setString('SUMMARY', $summary);
$vtodo->setString('LOCATION', $location);
$vtodo->setString('DESCRIPTION', $description);
$vtodo->setString('CATEGORIES', $categories);
$vtodo->setString('PRIORITY', $priority);
if ($due) {
$timezone = OC_Calendar_App::getTimezone();
$timezone = new DateTimeZone($timezone);
$due = new DateTime($due, $timezone);
$vtodo->setDateTime('DUE', $due);
} else {
unset($vtodo->DUE);
}
self::setComplete($vtodo, $percent_complete, $completed);
return $vcalendar;
}
public static function setComplete($vtodo, $percent_complete, $completed)
{
if (!empty($percent_complete)) {
$vtodo->setString('PERCENT-COMPLETE', $percent_complete);
}else{
$vtodo->__unset('PERCENT-COMPLETE');
}
if ($percent_complete == 100) {
if (!$completed) {
$completed = 'now';
}
} else {
$completed = null;
}
if ($completed) {
$timezone = OC_Calendar_App::getTimezone();
$timezone = new DateTimeZone($timezone);
$completed = new DateTime($completed, $timezone);
$vtodo->setDateTime('COMPLETED', $completed);
OCP\Util::emitHook('OC_Task', 'taskCompleted', $vtodo);
} else {
unset($vtodo->COMPLETED);
}
}
}