xref: /plugin/bez/mdl/ThreadFactory.php (revision eb2e6be9c74b2df263bd0a7ed247ee70c3d7cbd1)
1de02284cSSzymon Olewniczak<?php
2de02284cSSzymon Olewniczak
3de02284cSSzymon Olewniczaknamespace dokuwiki\plugin\bez\mdl;
4de02284cSSzymon Olewniczak
57fbf4c39SSzymon Olewniczakuse Assetic\Exception\Exception;
67fbf4c39SSzymon Olewniczak
7de02284cSSzymon Olewniczakclass ThreadFactory extends Factory {
8de02284cSSzymon Olewniczak
953df74e7SSzymon Olewniczak    public function get_table_view() {
1053df74e7SSzymon Olewniczak        return 'thread_view';
11de02284cSSzymon Olewniczak    }
12de02284cSSzymon Olewniczak
13de02284cSSzymon Olewniczak    public function get_years_scope() {
14de02284cSSzymon Olewniczak        $r = $this->model->sqlite->query('SELECT create_date FROM thread ORDER BY id LIMIT 1');
15de02284cSSzymon Olewniczak        $date = $this->model->sqlite->res2single($r);
16de02284cSSzymon Olewniczak
17de02284cSSzymon Olewniczak        //get only year
18de02284cSSzymon Olewniczak		$first =  (int) substr($date, 0, strpos($date, '-'));
19de02284cSSzymon Olewniczak        $last = (int) date('Y');
20de02284cSSzymon Olewniczak
21de02284cSSzymon Olewniczak		$years = array();
22de02284cSSzymon Olewniczak		for ($year = $first; $year <= $last; $year++) {
23de02284cSSzymon Olewniczak			$years[] = (string) $year;
24de02284cSSzymon Olewniczak        }
25de02284cSSzymon Olewniczak		return $years;
26de02284cSSzymon Olewniczak    }
277fbf4c39SSzymon Olewniczak
28b331b892SSzymon Olewniczak    public function users_involvement($range=array()) {
29*eb2e6be9SSzymon Olewniczak        if (count($range) > 0) {
30*eb2e6be9SSzymon Olewniczak            $from = date('c	', strtotime($range[0]));
31*eb2e6be9SSzymon Olewniczak            if (count($range) == 1) {
32*eb2e6be9SSzymon Olewniczak                $to = date('c');
33*eb2e6be9SSzymon Olewniczak            } else {
34*eb2e6be9SSzymon Olewniczak                $to = date('c', strtotime($range[1]));
35*eb2e6be9SSzymon Olewniczak            }
36*eb2e6be9SSzymon Olewniczak            $sql = "SELECT thread_participant.user_id,
37*eb2e6be9SSzymon Olewniczak                       SUM(thread_participant.original_poster) AS original_poster_sum,
38*eb2e6be9SSzymon Olewniczak                       SUM(thread_participant.coordinator) AS coordinator_sum,
39*eb2e6be9SSzymon Olewniczak                       SUM(thread_participant.commentator) AS commentator_sum,
40*eb2e6be9SSzymon Olewniczak                       SUM(thread_participant.task_assignee) AS task_assignee_sum
41*eb2e6be9SSzymon Olewniczak                       FROM thread_participant JOIN thread ON thread_participant.thread_id = thread.id
42*eb2e6be9SSzymon Olewniczak                       WHERE thread.create_date BETWEEN ? AND ?
43*eb2e6be9SSzymon Olewniczak                       GROUP BY user_id
44*eb2e6be9SSzymon Olewniczak                       ORDER BY user_id";
45*eb2e6be9SSzymon Olewniczak            $r = $this->model->sqlite->query($sql, $from, $to);
46*eb2e6be9SSzymon Olewniczak        } else {
47*eb2e6be9SSzymon Olewniczak            $sql = "SELECT user_id,
48*eb2e6be9SSzymon Olewniczak                           SUM(original_poster) AS original_poster_sum,
49*eb2e6be9SSzymon Olewniczak                           SUM(coordinator) AS coordinator_sum,
50*eb2e6be9SSzymon Olewniczak                           SUM(commentator) AS commentator_sum,
51*eb2e6be9SSzymon Olewniczak                           SUM(task_assignee) AS task_assignee_sum
52ff14b107SSzymon Olewniczak                           FROM thread_participant
53ff14b107SSzymon Olewniczak                           GROUP BY user_id
54*eb2e6be9SSzymon Olewniczak                           ORDER BY user_id";
55ff14b107SSzymon Olewniczak
56ff14b107SSzymon Olewniczak            $r = $this->model->sqlite->query($sql);
57*eb2e6be9SSzymon Olewniczak        }
58ff14b107SSzymon Olewniczak        return $r;
59ff14b107SSzymon Olewniczak    }
60ff14b107SSzymon Olewniczak
618a638198SSzymon Olewniczak    public function initial_save(Entity $thread, $data) {
627fbf4c39SSzymon Olewniczak        $label_ids = array();
637fbf4c39SSzymon Olewniczak        if (isset($data['label_id']) && $data['label_id'] != '') {
647fbf4c39SSzymon Olewniczak            $label_ids[] = $data['label_id'];
657fbf4c39SSzymon Olewniczak        }
667fbf4c39SSzymon Olewniczak        try {
677fbf4c39SSzymon Olewniczak            $this->beginTransaction();
68a0cd8c78SSzymon Olewniczak
6953df74e7SSzymon Olewniczak            parent::initial_save($thread, $data);
707fbf4c39SSzymon Olewniczak
717fbf4c39SSzymon Olewniczak            foreach($label_ids as $label_id) {
727fbf4c39SSzymon Olewniczak                $thread->add_label($label_id);
737fbf4c39SSzymon Olewniczak            }
747fbf4c39SSzymon Olewniczak
757fbf4c39SSzymon Olewniczak            $thread->set_participant_flags($thread->original_poster, array('original_poster', 'subscribent'));
767fbf4c39SSzymon Olewniczak            if($thread->coordinator != null) {
777fbf4c39SSzymon Olewniczak                $thread->set_participant_flags($thread->coordinator, array('coordinator', 'subscribent'));
787fbf4c39SSzymon Olewniczak            }
797fbf4c39SSzymon Olewniczak
80a0cd8c78SSzymon Olewniczak            if ($this->model->get_level() >= BEZ_AUTH_LEADER) {
8153df74e7SSzymon Olewniczak                $private = false;
8253df74e7SSzymon Olewniczak                if (isset($data['private'])) {
8353df74e7SSzymon Olewniczak                    $private = true;
8453df74e7SSzymon Olewniczak                }
8553df74e7SSzymon Olewniczak                $thread->set_private_flag($private);
8653df74e7SSzymon Olewniczak            }
8753df74e7SSzymon Olewniczak
888a638198SSzymon Olewniczak            $this->commitTransaction();
898a638198SSzymon Olewniczak
908a638198SSzymon Olewniczak            if ($thread->state != 'proposal' && $this->model->user_nick != $thread->coordinator) {
918a638198SSzymon Olewniczak                $thread->mail_inform_coordinator();
92e09b232fSSzymon Olewniczak            } elseif ($thread->state == 'proposal') {
93e09b232fSSzymon Olewniczak                $thread->mail_inform_admins();
947fbf4c39SSzymon Olewniczak            }
9514a1f0a4SSzymon Olewniczak
9614a1f0a4SSzymon Olewniczak        } catch(Exception $exception) {
9714a1f0a4SSzymon Olewniczak            $this->rollbackTransaction();
9814a1f0a4SSzymon Olewniczak        }
997fbf4c39SSzymon Olewniczak    }
1007fbf4c39SSzymon Olewniczak
1018a638198SSzymon Olewniczak    public function update_save(Entity $thread, $data) {
1027fbf4c39SSzymon Olewniczak        $prev_coordinator = $thread->coordinator;
10353df74e7SSzymon Olewniczak
1047fbf4c39SSzymon Olewniczak        $label_ids = array();
1057fbf4c39SSzymon Olewniczak        if (isset($data['label_id']) && $data['label_id'] != '') {
1067fbf4c39SSzymon Olewniczak            $label_ids[] = $data['label_id'];
1077fbf4c39SSzymon Olewniczak        }
1087fbf4c39SSzymon Olewniczak        try {
1097fbf4c39SSzymon Olewniczak            $this->beginTransaction();
11053df74e7SSzymon Olewniczak            parent::update_save($thread, $data);
1117fbf4c39SSzymon Olewniczak
1127fbf4c39SSzymon Olewniczak            $cur_label_ids = array_keys($thread->get_labels());
1137fbf4c39SSzymon Olewniczak            $labels_to_add = array_diff($label_ids, $cur_label_ids);
1147fbf4c39SSzymon Olewniczak            $labels_to_rem = array_diff($cur_label_ids, $label_ids);
1157fbf4c39SSzymon Olewniczak
1167fbf4c39SSzymon Olewniczak            foreach($labels_to_add as $label_id) {
1177fbf4c39SSzymon Olewniczak                $thread->add_label($label_id);
1187fbf4c39SSzymon Olewniczak            }
1197fbf4c39SSzymon Olewniczak
1207fbf4c39SSzymon Olewniczak            foreach($labels_to_rem as $label_id) {
1217fbf4c39SSzymon Olewniczak                $thread->remove_label($label_id);
1227fbf4c39SSzymon Olewniczak            }
1237fbf4c39SSzymon Olewniczak
1247fbf4c39SSzymon Olewniczak            if ($thread->coordinator != null && $thread->coordinator != $prev_coordinator) {
125*eb2e6be9SSzymon Olewniczak                if ($prev_coordinator != null) {
1267fbf4c39SSzymon Olewniczak                    $thread->remove_participant_flags($prev_coordinator, array('coordinator'));
127*eb2e6be9SSzymon Olewniczak                }
1287fbf4c39SSzymon Olewniczak                $thread->set_participant_flags($thread->coordinator, array('subscribent', 'coordinator'));
1297fbf4c39SSzymon Olewniczak            }
1307fbf4c39SSzymon Olewniczak
13153df74e7SSzymon Olewniczak            if ($thread->acl_of('private') >= BEZ_PERMISSION_CHANGE) {
13253df74e7SSzymon Olewniczak                $private = false;
13353df74e7SSzymon Olewniczak                if (isset($data['private'])) {
13453df74e7SSzymon Olewniczak                    $private = true;
13553df74e7SSzymon Olewniczak                }
13653df74e7SSzymon Olewniczak                $thread->set_private_flag($private);
13753df74e7SSzymon Olewniczak            }
13853df74e7SSzymon Olewniczak
1398a638198SSzymon Olewniczak            $this->commitTransaction();
1407fbf4c39SSzymon Olewniczak        } catch(Exception $exception) {
1418a638198SSzymon Olewniczak            $this->rollbackTransaction();
1428a638198SSzymon Olewniczak        }
1438a638198SSzymon Olewniczak
1448a638198SSzymon Olewniczak        if ($thread->state != 'proposal' && $this->model->user_nick != $thread->coordinator) {
1458a638198SSzymon Olewniczak            $thread->mail_inform_coordinator();
1467fbf4c39SSzymon Olewniczak        }
1477fbf4c39SSzymon Olewniczak    }
148de02284cSSzymon Olewniczak}
149