Beispiel #1
0
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     $user = $input->getArgument('user');
     if (!$this->userManager->userExists($user)) {
         throw new \InvalidArgumentException("User <{$user}> in unknown.");
     }
     $name = $input->getArgument('name');
     $caldav = new CalDavBackend($this->dbConnection);
     $caldav->createCalendar("principals/{$user}", $name, []);
 }
Beispiel #2
0
 /**
  * @param int $calendarId
  * @param int $newCalendarId
  */
 private function migrateShares($calendarId, $newCalendarId)
 {
     $shares = $this->adapter->getShares($calendarId);
     if (empty($shares)) {
         return;
     }
     $add = array_map(function ($s) {
         $prefix = 'principal:principals/users/';
         if ($s['share_type'] === 1) {
             $prefix = 'principal:principals/groups/';
         }
         return ['href' => $prefix . $s['share_with']];
     }, $shares);
     $newCalendar = $this->backend->getCalendarById($newCalendarId);
     $calendar = new Calendar($this->backend, $newCalendar);
     $this->backend->updateShares($calendar, $add, []);
 }
Beispiel #3
0
 public function testScheduling()
 {
     $this->backend->createSchedulingObject(self::UNIT_TEST_USER, 'Sample Schedule', '');
     $sos = $this->backend->getSchedulingObjects(self::UNIT_TEST_USER);
     $this->assertEquals(1, count($sos));
     $so = $this->backend->getSchedulingObject(self::UNIT_TEST_USER, 'Sample Schedule');
     $this->assertNotNull($so);
     $this->backend->deleteSchedulingObject(self::UNIT_TEST_USER, 'Sample Schedule');
     $sos = $this->backend->getSchedulingObjects(self::UNIT_TEST_USER);
     $this->assertEquals(0, count($sos));
 }
Beispiel #4
0
 public function postLogin($params)
 {
     $user = $this->userManager->get($params['uid']);
     $principal = 'principals/users/' . $user->getUID();
     $calendars = $this->calDav->getCalendarsForUser($principal);
     if (empty($calendars)) {
         try {
             $this->calDav->createCalendar($principal, 'default', []);
         } catch (\Exception $ex) {
             \OC::$server->getLogger()->logException($ex);
         }
     }
     $books = $this->cardDav->getAddressBooksForUser($principal);
     if (empty($books)) {
         try {
             $this->cardDav->createAddressBook($principal, 'default', []);
         } catch (\Exception $ex) {
             \OC::$server->getLogger()->logException($ex);
         }
     }
 }
Beispiel #5
0
 public function postLogin($params)
 {
     $user = $this->userManager->get($params['uid']);
     if (!is_null($user)) {
         $principal = 'principals/users/' . $user->getUID();
         $calendars = $this->calDav->getCalendarsForUser($principal);
         if (empty($calendars) || count($calendars) === 1 && $calendars[0]['uri'] === BirthdayService::BIRTHDAY_CALENDAR_URI) {
             try {
                 $this->calDav->createCalendar($principal, 'personal', ['{DAV:}displayname' => 'Personal']);
             } catch (\Exception $ex) {
                 \OC::$server->getLogger()->logException($ex);
             }
         }
         $books = $this->cardDav->getAddressBooksForUser($principal);
         if (empty($books)) {
             try {
                 $this->cardDav->createAddressBook($principal, 'contacts', ['{DAV:}displayname' => 'Contacts']);
             } catch (\Exception $ex) {
                 \OC::$server->getLogger()->logException($ex);
             }
         }
     }
 }
    protected function createEvent($calendarId, $start = '20130912T130000Z', $end = '20130912T140000Z')
    {
        $calData = <<<EOD
BEGIN:VCALENDAR
VERSION:2.0
PRODID:ownCloud Calendar
BEGIN:VEVENT
CREATED;VALUE=DATE-TIME:20130910T125139Z
UID:47d15e3ec8
LAST-MODIFIED;VALUE=DATE-TIME:20130910T125139Z
DTSTAMP;VALUE=DATE-TIME:20130910T125139Z
SUMMARY:Test Event
DTSTART;VALUE=DATE-TIME:{$start}
DTEND;VALUE=DATE-TIME:{$end}
CLASS:PUBLIC
END:VEVENT
END:VCALENDAR
EOD;
        $uri0 = $this->getUniqueID('event');
        $this->backend->createCalendarObject($calendarId, $uri0, $calData);
        return $uri0;
    }
 /**
  * @PublicPage
  * @NoAdminRequired
  * @NoCSRFRequired
  */
 public function index()
 {
     $pKey = Helper::post('key');
     $pApp = Helper::post('app');
     if ($pKey != 'jasj765Uyt87ouIIfars' || $pApp != 'owncollab_chart') {
         return false;
     }
     //название календаря тасков в которых пользователь берет участие как отдельный пользователь
     $userTaskName = 'project';
     //все id пользователей
     $allUsers = $this->connect->users->get();
     //таблица тасков
     $allTasks = $this->connect->task()->get();
     //массив тасков, ключами которого является id таска
     $arrIdTasks = [];
     for ($i = 0; $i < count($allTasks); $i++) {
         $arrIdTasks[$allTasks[$i]['id']] = $allTasks[$i];
     }
     $userTaskName = $arrIdTasks[1]['text'];
     //массив id тасков, ключами которого являются id пользователей
     $userTasks = [];
     for ($i = 0; $i < count($allUsers); $i++) {
         $temp_arr = [];
         for ($j = 0; $j < count($allTasks); $j++) {
             $taskUser = json_decode($allTasks[$j]['users'])->users;
             if (in_array($allUsers[$i]['uid'], $taskUser)) {
                 $temp_arr[$allTasks[$j]['id']] = '';
             }
         }
         $userTasks[$allUsers[$i]['uid']] = $temp_arr;
         unset($temp_arr);
     }
     //id текущих пользователей
     $usersId = array_keys($userTasks);
     //id пользователей с таблицы синхронизации
     $usersIdCal = $this->connect->calendar()->getUsersId();
     //добавление в таблицу синхронизации новых пользователей
     $newUserId = array_diff($usersId, $usersIdCal);
     $this->connect->calendar()->insertAllById($newUserId);
     //удаление удаленных пользователей с таблицы синхронизации
     $deleteUserId = array_diff($usersIdCal, $usersId);
     $this->connect->calendar()->deleteAllById($deleteUserId);
     //синхронизация тасков
     //uid  id_tasks (json)
     $tasksIdCalTable = $this->connect->calendar()->get();
     for ($i = 0; $i < count($tasksIdCalTable); $i++) {
         //создание рабочего календаря для каждого пользователя
         $user = $tasksIdCalTable[$i]['uid'];
         if (!$this->userManager->userExists($user)) {
             throw new \InvalidArgumentException("User <{$user}> in unknown.");
         }
         $principalBackend = new Principal($this->userManager, $this->groupManager);
         $caldav = new CalDAV\CalDavBackend($this->connect->db, $principalBackend);
         //проверка существования календаря
         if (!$caldav->getCalendarByUri("principals/users/{$user}", $userTaskName)) {
             //создание календаря если его нет
             $caldav->createCalendar("principals/users/{$user}", $userTaskName, []);
         }
         //находим id календаря пользователя $calendarId
         $userCalendar = $caldav->getCalendarByUri("principals/users/{$user}", $userTaskName);
         if (array_key_exists($tasksIdCalTable[$i]['uid'], $userTasks)) {
             //массив тасков одного пользователя с таблицы синхронизации
             $taskArr = (array) json_decode($tasksIdCalTable[$i]['id_tasks']);
             if ($taskArr == '') {
                 $taskArr = [];
             }
             //массив тасков одного пользователя с чартов
             $mainTasksArr = $userTasks[$tasksIdCalTable[$i]['uid']];
             if ($mainTasksArr == '') {
                 $mainTasksArr = [];
             }
             //новые таски------------------------------------------------------------------
             $idNewTasks = array_values(array_diff(array_keys($mainTasksArr), array_keys($taskArr)));
             if (count($idNewTasks)) {
                 //создаем новые события календаря
                 //проходим в цыкле по новых тасках пользователя
                 for ($j = 0; $j < count($idNewTasks); $j++) {
                     $uid = $this->connect->calendarObjects()->randhesh(25);
                     $etag = $this->connect->calendarObjects()->randhesh(32);
                     $uri = 'ownCloud-';
                     $uri .= $this->connect->calendarObjects()->randhesh(50);
                     $uri .= '.ics';
                     $description = '';
                     //                        $key = array_keys($idNewTasks);
                     $this->connect->calendarChanges()->insert($uri, $userCalendar['id']);
                     //id созданого события
                     $insertId = $this->connect->calendarObjects()->insert($userCalendar['id'], $uri, $etag, $uid, $arrIdTasks[$idNewTasks[$j]]['text'], $description, $arrIdTasks[$idNewTasks[$j]]['start_date'], $arrIdTasks[$idNewTasks[$j]]['end_date']);
                     //записываем id события в таблицу синхронизации
                     $res = $this->connect->calendar()->getById($tasksIdCalTable[$i]['uid']);
                     $res[$idNewTasks[$j]] = (int) $insertId;
                     $this->connect->calendar()->update($tasksIdCalTable[$i]['uid'], json_encode($res));
                 }
             }
             //удаленные таски----------------------------------------------------------------
             $idDeleteTask = array_values(array_diff(array_keys($taskArr), array_keys($mainTasksArr)));
             if (count($idDeleteTask)) {
                 //удаляем старые события
                 $deleteId = [];
                 foreach ($taskArr as $k => $v) {
                     if (in_array($k, $idDeleteTask)) {
                         $deleteId[] = $v;
                     }
                 }
                 $this->connect->calendarObjects()->delete($deleteId);
                 //удаляем таск с таблицы синхронизации
                 $res = $this->connect->calendar()->getById($tasksIdCalTable[$i]['uid']);
                 foreach ($res as $k => $v) {
                     if (!in_array($k, $idDeleteTask)) {
                         $newRes[$k] = $v;
                     }
                 }
                 $this->connect->calendar()->update($tasksIdCalTable[$i]['uid'], json_encode($newRes));
             }
             //обновляем события текущих тасков-----------------------------------------------
             if (count($taskArr)) {
                 //обновляем события текущих тасков
                 for ($k = 0; $k < count($taskArr); $k++) {
                     $uid = $this->connect->calendarObjects()->randhesh(25);
                     $description = '';
                     $etag = $this->connect->calendarObjects()->randhesh(32);
                     $uri = 'ownCloud-';
                     $uri .= $this->connect->calendarObjects()->randhesh(50);
                     $uri .= '.ics';
                     $result = $this->connect->calendarObjects()->updateFromTasks(array_values($taskArr)[$k], $uid, $arrIdTasks[array_keys($taskArr)[$k]]['text'], $description, $arrIdTasks[array_keys($taskArr)[$k]]['start_date'], $arrIdTasks[array_keys($taskArr)[$k]]['end_date'], $uri, $etag, $userCalendar['id']);
                 }
             }
         }
     }
     //все id групп
     $allGroups = $this->connect->groups->get();
     //массив id тасков, ключами которого являются id груп
     $groupTasks = [];
     //перебираем группы
     for ($i = 0; $i < count($allGroups); $i++) {
         //юзеры i-той группы
         $usersGroup = $this->connect->groupUser()->getByGid($allGroups[$i]['gid']);
         $temp = [];
         $temp_arr = [];
         for ($k = 0; $k < count($allTasks); $k++) {
             $taskGroup = json_decode($allTasks[$k]['users'])->groups;
             if (in_array($allGroups[$i]['gid'], $taskGroup)) {
                 $temp_arr[$allTasks[$k]['id']] = '';
             }
         }
         for ($j = 0; $j < count($usersGroup); $j++) {
             $temp[$usersGroup[$j]] = $temp_arr;
         }
         $groupTasks[$allGroups[$i]['gid']] = $temp;
         unset($temp_arr);
     }
     //id текущих груп
     $groupId = array_keys($groupTasks);
     //id груп с таблицы синхронизации
     $groupIdCal = $this->connect->calendarGroup()->getGroupsId();
     //добавление в таблицу синхронизации новых груп
     $newGroupId = array_diff($groupId, $groupIdCal);
     $this->connect->calendarGroup()->insertAllById($newGroupId);
     //удаление удаленных груп с таблицы синхронизации
     $deleteGroupId = array_diff($groupIdCal, $groupId);
     $this->connect->calendarGroup()->deleteAllById($deleteGroupId);
     //синхронизация тасков
     //gid[$i]=>admin
     //users (json)["bogdan","oleg","alex","ivan"]
     //id_tasks (json){"2":81,"3":82,"4":83,"5":84}
     $tasksIdCalTable = $this->connect->calendarGroup()->get();
     //$tasksIdCalTable[0]['gid']=admin;
     //$tasksIdCalTable[0]['id_tasks']=json(id_tasks);
     //проходим по всех группах
     for ($i = 0; $i < count($tasksIdCalTable); $i++) {
         $group = $tasksIdCalTable[$i]['gid'];
         //admin
         //вытаскиваем всех юзеров i-той группы (admin)
         //$userGroup[0]['uid'] = 'bogdan';
         $usersGroup = array_keys($groupTasks[$group]);
         //находим учасников с группы таблицы синхронизации
         $usersGroupTable = json_decode($tasksIdCalTable[$i]['id_tasks'], true);
         if (!$usersGroupTable) {
             $usersGroupTable = [];
         }
         //добавляем новых юзеров в группу--------------------------------------------------
         $newUsers = array_values(array_diff($usersGroup, array_keys($usersGroupTable)));
         if (count($newUsers)) {
             //---------------------------------------------------------------------------------
             //создание рабочего календаря для каждого пользователя
             for ($j = 0; $j < count($newUsers); $j++) {
                 $user = $newUsers[$j];
                 if (!$this->userManager->userExists($user)) {
                     throw new \InvalidArgumentException("User <{$user}> in unknown.");
                 }
                 $principalBackend = new Principal($this->userManager, $this->groupManager);
                 $caldav = new CalDAV\CalDavBackend($this->connect->db, $principalBackend);
                 //проверка существования календаря
                 if (!$caldav->getCalendarByUri("principals/users/{$user}", $group)) {
                     //создание календаря если его нет
                     $caldav->createCalendar("principals/users/{$user}", $group, []);
                 }
             }
             //---------------------------------------------------------------------------------
             for ($j = 0; $j < count($newUsers); $j++) {
                 $arr = [];
                 $usersGroupTable[$newUsers[$j]] = $arr;
             }
         }
         //удаляем старых юзеров с группы---------------------------------------------------
         $deletedUsers = array_values(array_diff(array_keys($usersGroupTable), $usersGroup));
         if (count($deletedUsers)) {
             for ($j = 0; $j < count($deletedUsers); $j++) {
                 //удаляем календарь и таски этого юзера
                 $userCalendar = $caldav->getCalendarByUri("principals/users/{$deletedUsers[$j]}", $group);
                 $caldav->deleteCalendar($userCalendar['id']);
                 //удаляем ячейку юзера с таблицы синхронизации
                 unset($usersGroupTable[$deletedUsers[$j]]);
             }
         }
         //проверяем таски каждого юзера
         foreach ($usersGroupTable as $k => $v) {
             $newTasks = array_values(array_diff(array_keys($groupTasks[$group][$k]), array_keys($v)));
             //находим id календаря пользователя $calendarId, если его пользователь удалил - создаем обратно
             $userCalendar = $caldav->getCalendarByUri("principals/users/{$k}", $group);
             if (!$userCalendar) {
                 $result = $caldav->createCalendar("principals/users/{$k}", $group, []);
                 $userCalendar = [];
                 $userCalendar['id'] = $result;
             }
             if (count($newTasks)) {
                 for ($n = 0; $n < count($newTasks); $n++) {
                     //-------------------------------------
                     //создание нового события
                     $uid = $this->connect->calendarObjects()->randhesh(25);
                     $etag = $this->connect->calendarObjects()->randhesh(32);
                     $uri = 'ownCloud-';
                     $uri .= $this->connect->calendarObjects()->randhesh(50);
                     $uri .= '.ics';
                     $description = '';
                     $this->connect->calendarChanges()->insert($uri, $userCalendar['id']);
                     //id созданого события
                     $insertId = $this->connect->calendarObjects()->insert($userCalendar['id'], $uri, $etag, $uid, $arrIdTasks[$newTasks[$n]]['text'], $description, $arrIdTasks[$newTasks[$n]]['start_date'], $arrIdTasks[$newTasks[$n]]['end_date']);
                     //-------------------------------------
                     $v[$newTasks[$n]] = (int) $insertId;
                 }
             }
             //удаленные таски
             $deleteTasks = array_values(array_diff(array_keys($v), array_keys($groupTasks[$group][$k])));
             if (count($deleteTasks)) {
                 $arr_del = [];
                 for ($n = 0; $n < count($deleteTasks); $n++) {
                     $arr_del[] = $v[$deleteTasks[$n]];
                     unset($v[$deleteTasks[$n]]);
                 }
                 $this->connect->calendarObjects()->delete($arr_del);
             }
             $usersGroupTable[$k] = $v;
             if (!$usersGroupTable) {
                 $usersGroupTable = '';
             }
             foreach ($v as $taskId => $eventId) {
                 $uid = $this->connect->calendarObjects()->randhesh(25);
                 $description = '';
                 $etag = $this->connect->calendarObjects()->randhesh(32);
                 $uri = 'ownCloud-';
                 $uri .= $this->connect->calendarObjects()->randhesh(50);
                 $uri .= '.ics';
                 $result = $this->connect->calendarObjects()->updateFromTasks($eventId, $uid, $arrIdTasks[$taskId]['text'], $description, $arrIdTasks[$taskId]['start_date'], $arrIdTasks[$taskId]['end_date'], $uri, $etag, $userCalendar['id']);
             }
         }
         $this->connect->calendarGroup()->updateUsersTasks($group, $usersGroupTable);
     }
 }
Beispiel #8
0
 /**
  * @param $calendarData
  * @return integer
  * @throws \Sabre\DAV\Exception\BadRequest
  */
 protected function extractClassification($calendarData)
 {
     return $this->calDavBackend->getDenormalizedData($calendarData)['classification'];
 }