1eb2e6be9SSzymon Olewniczak<?php 2eb2e6be9SSzymon Olewniczak/** @var action_plugin_bez $this */ 3eb2e6be9SSzymon Olewniczak 4eb2e6be9SSzymon Olewniczakuse \dokuwiki\plugin\bez; 5eb2e6be9SSzymon Olewniczak 6eb2e6be9SSzymon Olewniczakif ($this->model->get_level() < BEZ_AUTH_USER) { 7eb2e6be9SSzymon Olewniczak throw new bez\meta\PermissionDeniedException(); 8eb2e6be9SSzymon Olewniczak} 9*5b88664dSSzymon Olewniczak 10*5b88664dSSzymon Olewniczak//activity 11*5b88664dSSzymon Olewniczak 12*5b88664dSSzymon Olewniczakclass Timeline { 13*5b88664dSSzymon Olewniczak protected $timeline = array(); 14*5b88664dSSzymon Olewniczak 15*5b88664dSSzymon Olewniczak protected function datetime($iso8601) { 16*5b88664dSSzymon Olewniczak $timestamp = strtotime($iso8601); 17*5b88664dSSzymon Olewniczak $date = date('Y-m-d', $timestamp); 18*5b88664dSSzymon Olewniczak $time = date('H:m', $timestamp); 19*5b88664dSSzymon Olewniczak 20*5b88664dSSzymon Olewniczak return array($date, $time); 21*5b88664dSSzymon Olewniczak } 22*5b88664dSSzymon Olewniczak 23*5b88664dSSzymon Olewniczak public function push($datetime, $type, $author, $entity) { 24*5b88664dSSzymon Olewniczak list($date, $time) = $this->datetime($datetime); 25*5b88664dSSzymon Olewniczak 26*5b88664dSSzymon Olewniczak if (!isset($this->timeline[$date])) $timeline[$date] = array(); 27*5b88664dSSzymon Olewniczak $this->timeline[$date][] = array('time' => $time, 28*5b88664dSSzymon Olewniczak 'type' => $type, 29*5b88664dSSzymon Olewniczak 'author' => $author, 30*5b88664dSSzymon Olewniczak 'entity' => $entity); 31*5b88664dSSzymon Olewniczak } 32*5b88664dSSzymon Olewniczak 33*5b88664dSSzymon Olewniczak public function get_assoc() { 34*5b88664dSSzymon Olewniczak //sort dates, iso8601 can be compared as strings 35*5b88664dSSzymon Olewniczak krsort($this->timeline); 36*5b88664dSSzymon Olewniczak 37*5b88664dSSzymon Olewniczak //sort times 38*5b88664dSSzymon Olewniczak foreach ($this->timeline as &$elm) { 39*5b88664dSSzymon Olewniczak usort($elm, function ($a, $b) { 40*5b88664dSSzymon Olewniczak return -1 * strcmp($a['time'], $b['time']); 41*5b88664dSSzymon Olewniczak }); 42*5b88664dSSzymon Olewniczak } 43*5b88664dSSzymon Olewniczak return $this->timeline; 44*5b88664dSSzymon Olewniczak } 45*5b88664dSSzymon Olewniczak} 46*5b88664dSSzymon Olewniczak 47*5b88664dSSzymon Olewniczak$month_earlier = date('c', strtotime('-1 month')); 48*5b88664dSSzymon Olewniczak$filter = array(); 49*5b88664dSSzymon Olewniczak$filter['create_date'] = array('>=', $month_earlier, array('date')); 50*5b88664dSSzymon Olewniczak$threads = $this->model->threadFactory->get_all($filter, 'create_date DESC'); 51*5b88664dSSzymon Olewniczak$thread_comments = $this->model->thread_commentFactory->get_all($filter, 'create_date DESC'); 52*5b88664dSSzymon Olewniczak$tasks = $this->model->taskFactory->get_all($filter, 'create_date DESC'); 53*5b88664dSSzymon Olewniczak$task_comments = $this->model->task_commentFactory->get_all($filter, 'create_date DESC'); 54*5b88664dSSzymon Olewniczak 55*5b88664dSSzymon Olewniczak$timeline = new Timeline(); 56*5b88664dSSzymon Olewniczakforeach ($threads as $thread) { 57*5b88664dSSzymon Olewniczak if ($thread->acl_of('id') < BEZ_PERMISSION_VIEW) continue; 58*5b88664dSSzymon Olewniczak 59*5b88664dSSzymon Olewniczak $project = ''; 60*5b88664dSSzymon Olewniczak if ($thread->type == 'project') { 61*5b88664dSSzymon Olewniczak $project = '_project'; 62*5b88664dSSzymon Olewniczak } 63*5b88664dSSzymon Olewniczak 64*5b88664dSSzymon Olewniczak if ($thread->state == 'proposal') { 65*5b88664dSSzymon Olewniczak $timeline->push($thread->create_date, 'thread_proposal' . $project, $thread->original_poster, $thread); 66*5b88664dSSzymon Olewniczak } else { 67*5b88664dSSzymon Olewniczak $timeline->push($thread->create_date, 'thread_opened' . $project, $thread->coordinator, $thread); 68*5b88664dSSzymon Olewniczak } 69*5b88664dSSzymon Olewniczak 70*5b88664dSSzymon Olewniczak if ($thread->state == 'done') { 71*5b88664dSSzymon Olewniczak $timeline->push($thread->last_activity_date, 'thread_done' . $project, $thread->coordinator, $thread); 72*5b88664dSSzymon Olewniczak } elseif ($thread->state == 'closed') { 73*5b88664dSSzymon Olewniczak $timeline->push($thread->last_activity_date, 'thread_closed' . $project, $thread->coordinator, $thread); 74*5b88664dSSzymon Olewniczak } elseif ($thread->state == 'rejected') { 75*5b88664dSSzymon Olewniczak $timeline->push($thread->last_activity_date, 'thread_rejected' . $project, $thread->coordinator, $thread); 76*5b88664dSSzymon Olewniczak } 77*5b88664dSSzymon Olewniczak} 78*5b88664dSSzymon Olewniczak 79*5b88664dSSzymon Olewniczakforeach ($thread_comments as $thread_comment) { 80*5b88664dSSzymon Olewniczak if ($thread_comment->thread->acl_of('id') < BEZ_PERMISSION_VIEW) continue; 81*5b88664dSSzymon Olewniczak 82*5b88664dSSzymon Olewniczak if ($thread_comment->type == 'comment') { 83*5b88664dSSzymon Olewniczak $timeline->push($thread_comment->create_date, 'thread_comment_added', $thread_comment->author, $thread_comment); 84*5b88664dSSzymon Olewniczak } else { 85*5b88664dSSzymon Olewniczak $timeline->push($thread_comment->create_date, 'thread_comment_cause_added', $thread_comment->author, $thread_comment); 86*5b88664dSSzymon Olewniczak } 87*5b88664dSSzymon Olewniczak} 88*5b88664dSSzymon Olewniczak 89*5b88664dSSzymon Olewniczakforeach ($tasks as $task) { 90*5b88664dSSzymon Olewniczak if ($task->acl_of('id') < BEZ_PERMISSION_VIEW) continue; 91*5b88664dSSzymon Olewniczak 92*5b88664dSSzymon Olewniczak $timeline->push($task->create_date, 'task_opened', $task->assignee, $task); 93*5b88664dSSzymon Olewniczak 94*5b88664dSSzymon Olewniczak if ($task->state == 'done') { 95*5b88664dSSzymon Olewniczak $timeline->push($task->last_activity_date, 'task_done', $task->assignee, $task); 96*5b88664dSSzymon Olewniczak } 97*5b88664dSSzymon Olewniczak} 98*5b88664dSSzymon Olewniczak 99*5b88664dSSzymon Olewniczakforeach ($task_comments as $task_comment) { 100*5b88664dSSzymon Olewniczak if ($task_comment->task->acl_of('id') < BEZ_PERMISSION_VIEW) continue; 101*5b88664dSSzymon Olewniczak 102*5b88664dSSzymon Olewniczak $timeline->push($task_comment->create_date, 'task_comment_added', $task_comment->author, $task_comment); 103*5b88664dSSzymon Olewniczak} 104*5b88664dSSzymon Olewniczak 105*5b88664dSSzymon Olewniczak$this->tpl->set('timeline', $timeline->get_assoc()); 106*5b88664dSSzymon Olewniczak 107a5de966aSSzymon Olewniczak$orderby = array('sort', 'priority DESC', 'create_date DESC'); 108eb2e6be9SSzymon Olewniczak$filter = array('state' => 'proposal'); 109a5de966aSSzymon Olewniczak$proposals = $this->model->threadFactory->get_all($filter, $orderby); 110eb2e6be9SSzymon Olewniczak$this->tpl->set('proposals', $proposals); 111eb2e6be9SSzymon Olewniczak$this->tpl->set('proposals_count', $this->model->threadFactory->count($filter)); 112eb2e6be9SSzymon Olewniczak 113a5de966aSSzymon Olewniczak$orderby = array('sort', 'priority DESC', 'create_date DESC'); 114eb2e6be9SSzymon Olewniczak$filter = array('state' => 'opened', 'coordinator' => $this->model->user_nick); 115a5de966aSSzymon Olewniczak$my_threads = $this->model->threadFactory->get_all($filter, $orderby); 116eb2e6be9SSzymon Olewniczak$this->tpl->set('my_threads', $my_threads); 117eb2e6be9SSzymon Olewniczak$this->tpl->set('my_threads_count', $this->model->threadFactory->count($filter)); 118eb2e6be9SSzymon Olewniczak 119a5de966aSSzymon Olewniczak$orderby = array('priority DESC', 'plan_date'); 120eb2e6be9SSzymon Olewniczak$filter = array('state' => 'opened', 'assignee' => $this->model->user_nick); 121a5de966aSSzymon Olewniczak$my_tasks = $this->model->taskFactory->get_all($filter, $orderby); 122eb2e6be9SSzymon Olewniczak$this->tpl->set('my_tasks', $my_tasks); 123eb2e6be9SSzymon Olewniczak$this->tpl->set('my_tasks_count', $this->model->taskFactory->count($filter)); 124eb2e6be9SSzymon Olewniczak 125a5de966aSSzymon Olewniczak$orderby = array('sort', 'priority DESC', 'create_date DESC'); 126eb2e6be9SSzymon Olewniczak$filter = array('state' => 'opened', 'original_poster' => $this->model->user_nick); 127a5de966aSSzymon Olewniczak$reported_threads = $this->model->threadFactory->get_all($filter, $orderby); 128eb2e6be9SSzymon Olewniczak$this->tpl->set('reported_threads', $reported_threads); 129eb2e6be9SSzymon Olewniczak$this->tpl->set('reported_threads_count', $this->model->threadFactory->count($filter)); 130eb2e6be9SSzymon Olewniczak 131a5de966aSSzymon Olewniczak$orderby = array('priority DESC', 'plan_date'); 132eb2e6be9SSzymon Olewniczak$filter = array('state' => 'opened', 'original_poster' => $this->model->user_nick); 133a5de966aSSzymon Olewniczak$reported_tasks = $this->model->taskFactory->get_all($filter, $orderby); 134eb2e6be9SSzymon Olewniczak$this->tpl->set('reported_tasks', $reported_tasks); 135eb2e6be9SSzymon Olewniczak$this->tpl->set('reported_tasks_count', $this->model->taskFactory->count($filter)); 136eb2e6be9SSzymon Olewniczak 137