xref: /plugin/approve/action/approve.php (revision 4474ed8a8edd55319eb6dd1e4e69fdb09925ebf0)
11aeb2b4dSghi<?php
21aeb2b4dSghi
3bab76148SSzymon Olewniczakuse dokuwiki\plugin\approve\meta\ApproveConst;
41aeb2b4dSghi
51aeb2b4dSghiif(!defined('DOKU_INC')) die();
61aeb2b4dSghi
71aeb2b4dSghiclass action_plugin_approve_approve extends DokuWiki_Action_Plugin {
81aeb2b4dSghi
9*4474ed8aSSzymon Olewniczak    /** @var helper_plugin_sqlite */
10*4474ed8aSSzymon Olewniczak    protected $sqlite;
11bab76148SSzymon Olewniczak
12*4474ed8aSSzymon Olewniczak    /**
13*4474ed8aSSzymon Olewniczak     * @return helper_plugin_sqlite
14*4474ed8aSSzymon Olewniczak     */
15*4474ed8aSSzymon Olewniczak    public function sqlite() {
16*4474ed8aSSzymon Olewniczak        if (!$this->sqlite) {
17*4474ed8aSSzymon Olewniczak            $db_helper = plugin_load('helper', 'approve_db');
18*4474ed8aSSzymon Olewniczak            $this->sqlite = $db_helper->getDB();
19*4474ed8aSSzymon Olewniczak        }
20*4474ed8aSSzymon Olewniczak        return $this->sqlite;
2150481663SSzymon Olewniczak    }
2250481663SSzymon Olewniczak
23*4474ed8aSSzymon Olewniczak    /**
24*4474ed8aSSzymon Olewniczak     * @param Doku_Event_Handler $controller
25*4474ed8aSSzymon Olewniczak     */
26*4474ed8aSSzymon Olewniczak    public function register(Doku_Event_Handler $controller) {
27*4474ed8aSSzymon Olewniczak        $controller->register_hook('TPL_ACT_RENDER', 'AFTER', $this, 'handle_diff_accept');
28*4474ed8aSSzymon Olewniczak        $controller->register_hook('HTML_SHOWREV_OUTPUT', 'BEFORE', $this, 'handle_showrev');
29*4474ed8aSSzymon Olewniczak        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_approve');
30*4474ed8aSSzymon Olewniczak        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_viewer');
31*4474ed8aSSzymon Olewniczak        $controller->register_hook('TPL_ACT_RENDER', 'BEFORE', $this, 'handle_display_banner');
3255f447f4SSzymon Olewniczak        $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'AFTER', $this, 'handle_pagesave_after');
33*4474ed8aSSzymon Olewniczak        // ensure a page revision is created when summary changes:
34*4474ed8aSSzymon Olewniczak//        $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'BEFORE', $this, 'handle_pagesave_before');
35*4474ed8aSSzymon Olewniczak//        $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'AFTER', $this, 'handle_pagesave_after');
361aeb2b4dSghi    }
371aeb2b4dSghi
38*4474ed8aSSzymon Olewniczak    /**
39*4474ed8aSSzymon Olewniczak     * @param $id
40*4474ed8aSSzymon Olewniczak     * @return bool
41*4474ed8aSSzymon Olewniczak     */
42*4474ed8aSSzymon Olewniczak    protected function use_approve_here($id) {
43*4474ed8aSSzymon Olewniczak        $res = $this->sqlite()->query('SELECT page FROM page WHERE page=? AND hidden=0', $id);
44*4474ed8aSSzymon Olewniczak        if ($this->sqlite()->res2single($res)) {
45*4474ed8aSSzymon Olewniczak            return true;
46*4474ed8aSSzymon Olewniczak        }
47*4474ed8aSSzymon Olewniczak        return false;
48*4474ed8aSSzymon Olewniczak    }
4950481663SSzymon Olewniczak
50*4474ed8aSSzymon Olewniczak    /**
51*4474ed8aSSzymon Olewniczak     * @param $id
52*4474ed8aSSzymon Olewniczak     * @return bool|string
53*4474ed8aSSzymon Olewniczak     */
54*4474ed8aSSzymon Olewniczak    protected function find_last_approved($id) {
55*4474ed8aSSzymon Olewniczak        $res = $this->sqlite()->query('SELECT rev FROM revision
56*4474ed8aSSzymon Olewniczak                                WHERE page=? AND approved IS NOT NULL
57*4474ed8aSSzymon Olewniczak                                ORDER BY rev DESC LIMIT 1', $id);
58*4474ed8aSSzymon Olewniczak        return $this->sqlite()->res2single($res);
59*4474ed8aSSzymon Olewniczak    }
60*4474ed8aSSzymon Olewniczak
61*4474ed8aSSzymon Olewniczak
62*4474ed8aSSzymon Olewniczak    /**
63*4474ed8aSSzymon Olewniczak     * @param Doku_Event $event
64*4474ed8aSSzymon Olewniczak     */
65*4474ed8aSSzymon Olewniczak    public function handle_diff_accept(Doku_Event $event) {
66*4474ed8aSSzymon Olewniczak		global $INFO;
67*4474ed8aSSzymon Olewniczak
68*4474ed8aSSzymon Olewniczak		if (!$this->use_approve_here($INFO['id'])) return;
6950481663SSzymon Olewniczak
701aeb2b4dSghi		if ($event->data == 'diff' && isset($_GET['approve'])) {
71*4474ed8aSSzymon Olewniczak		    $href = wl($INFO['id'], ['approve' => 'approve']);
72*4474ed8aSSzymon Olewniczak			ptln('<a href="' . $href . '">'.$this->getLang('approve').'</a>');
731aeb2b4dSghi		}
7484047bdaSRuud
75*4474ed8aSSzymon Olewniczak        if ($this->getConf('ready_for_approval') && $event->data == 'diff' && isset($_GET['ready_for_approval'])) {
76*4474ed8aSSzymon Olewniczak            $href = wl($INFO['id'], ['ready_for_approval' => 'ready_for_approval']);
77*4474ed8aSSzymon Olewniczak            ptln('<a href="' . $href . '">'.$this->getLang('approve').'</a>');
7884047bdaSRuud		}
791aeb2b4dSghi	}
801aeb2b4dSghi
81*4474ed8aSSzymon Olewniczak    /**
82*4474ed8aSSzymon Olewniczak     * @param Doku_Event $event
83*4474ed8aSSzymon Olewniczak     */
84*4474ed8aSSzymon Olewniczak    public function handle_showrev(Doku_Event $event) {
85*4474ed8aSSzymon Olewniczak        global $INFO;
861aeb2b4dSghi
87*4474ed8aSSzymon Olewniczak        if (!$this->use_approve_here($INFO['id'])) return;
88*4474ed8aSSzymon Olewniczak
89*4474ed8aSSzymon Olewniczak        $last_approved_rev = $this->find_last_approved($INFO['id']);
90*4474ed8aSSzymon Olewniczak		if ($last_approved_rev == $INFO['rev']) {
911aeb2b4dSghi            $event->preventDefault();
921aeb2b4dSghi        }
931aeb2b4dSghi	}
941aeb2b4dSghi
95*4474ed8aSSzymon Olewniczak//	function can_approve() {
96*4474ed8aSSzymon Olewniczak//		global $ID;
97*4474ed8aSSzymon Olewniczak//		return auth_quickaclcheck($ID) >= AUTH_DELETE;
98*4474ed8aSSzymon Olewniczak//	}
99*4474ed8aSSzymon Olewniczak//
100*4474ed8aSSzymon Olewniczak//    function can_edit() {
101*4474ed8aSSzymon Olewniczak//		global $ID;
102*4474ed8aSSzymon Olewniczak//		return auth_quickaclcheck($ID) >= AUTH_EDIT;
103*4474ed8aSSzymon Olewniczak//	}
104*4474ed8aSSzymon Olewniczak
105*4474ed8aSSzymon Olewniczak    /**
106*4474ed8aSSzymon Olewniczak     * @param Doku_Event $event
107*4474ed8aSSzymon Olewniczak     */
108*4474ed8aSSzymon Olewniczak    public function handle_approve(Doku_Event $event) {
109*4474ed8aSSzymon Olewniczak		global $INFO;
110*4474ed8aSSzymon Olewniczak
111*4474ed8aSSzymon Olewniczak        if (!$this->use_approve_here($INFO['id'])) return;
112*4474ed8aSSzymon Olewniczak
113*4474ed8aSSzymon Olewniczak		if ($event->data == 'show' && isset($_GET['approve']) &&
114*4474ed8aSSzymon Olewniczak            auth_quickaclcheck($INFO['id']) >= AUTH_DELETE) {
115*4474ed8aSSzymon Olewniczak
116*4474ed8aSSzymon Olewniczak		    $res = $this->sqlite()->query('SELECT MAX(version)+1 FROM revision
117*4474ed8aSSzymon Olewniczak                                            WHERE page=?', $INFO['id']);
118*4474ed8aSSzymon Olewniczak		    $next_version = $this->sqlite()->res2single($res);
119*4474ed8aSSzymon Olewniczak		    if (!$next_version) {
120*4474ed8aSSzymon Olewniczak                $next_version = 1;
12184047bdaSRuud            }
122*4474ed8aSSzymon Olewniczak		    //approved IS NULL prevents from overriding already approved page
123*4474ed8aSSzymon Olewniczak		    $this->sqlite()->query('UPDATE revision
124*4474ed8aSSzymon Olewniczak		                    SET approved=?, version=?
125*4474ed8aSSzymon Olewniczak                            WHERE page=? AND current=1 AND approved IS NULL',
126*4474ed8aSSzymon Olewniczak                            date('c'), $next_version, $INFO['id']);
12784047bdaSRuud
128*4474ed8aSSzymon Olewniczak			header('Location: ' . wl($INFO['id']));
129*4474ed8aSSzymon Olewniczak		} elseif ($event->data == 'show' && isset($_GET['ready_for_approval']) &&
130*4474ed8aSSzymon Olewniczak            auth_quickaclcheck($INFO['id']) >= AUTH_EDIT) {
13150481663SSzymon Olewniczak
132*4474ed8aSSzymon Olewniczak            $this->sqlite()->query('UPDATE revision SET ready_for_approval=?
133*4474ed8aSSzymon Olewniczak                            WHERE page=? AND current=1 AND ready_for_approval IS NULL',
134*4474ed8aSSzymon Olewniczak                            date('c'), $INFO['id']);
13550481663SSzymon Olewniczak
136*4474ed8aSSzymon Olewniczak            header('Location: ' . wl($INFO['id']));
1371aeb2b4dSghi		}
13838d03fbdSghi	}
13955f447f4SSzymon Olewniczak
140*4474ed8aSSzymon Olewniczak    /**
141*4474ed8aSSzymon Olewniczak     * Redirect to newest approved page for user that don't have EDIT permission.
142*4474ed8aSSzymon Olewniczak     *
143*4474ed8aSSzymon Olewniczak     * @param Doku_Event $event
144*4474ed8aSSzymon Olewniczak     */
145*4474ed8aSSzymon Olewniczak    public function handle_viewer(Doku_Event $event) {
146*4474ed8aSSzymon Olewniczak        global $INFO;
147*4474ed8aSSzymon Olewniczak
14838d03fbdSghi        if ($event->data != 'show') return;
149*4474ed8aSSzymon Olewniczak        //apply only to current page
150*4474ed8aSSzymon Olewniczak        if (!$INFO['rev']) return;
151*4474ed8aSSzymon Olewniczak        if (auth_quickaclcheck($INFO['id']) >= AUTH_EDIT) return;
152*4474ed8aSSzymon Olewniczak        if (!$this->use_approve_here($INFO['id'])) return;
1531aeb2b4dSghi
154*4474ed8aSSzymon Olewniczak        $last_approved_rev = $this->find_last_approved($INFO['id']);
15538d03fbdSghi        //no page is approved
156*4474ed8aSSzymon Olewniczak        if (!$last_approved_rev) return;
15738d03fbdSghi
158*4474ed8aSSzymon Olewniczak        $last_change_date = @filemtime(wikiFN($INFO['id']));
159*4474ed8aSSzymon Olewniczak        //current page is approved
160*4474ed8aSSzymon Olewniczak        if ($last_approved_rev == $last_change_date) return;
161*4474ed8aSSzymon Olewniczak
162*4474ed8aSSzymon Olewniczak	    header("Location: " . wl($INFO['id'], ['rev' => $last_approved_rev]));
1631aeb2b4dSghi	}
16455f447f4SSzymon Olewniczak
165*4474ed8aSSzymon Olewniczak//	function find_lastest_approved() {
166*4474ed8aSSzymon Olewniczak//		global $ID;
167*4474ed8aSSzymon Olewniczak//		$m = p_get_metadata($ID);
168*4474ed8aSSzymon Olewniczak//		$sum = $m['last_change']['sum'];
169*4474ed8aSSzymon Olewniczak//		if ($sum == $this->getConf('sum approved'))
170*4474ed8aSSzymon Olewniczak//			return 0;
171*4474ed8aSSzymon Olewniczak//
172*4474ed8aSSzymon Olewniczak//		$changelog = new PageChangeLog($ID);
173*4474ed8aSSzymon Olewniczak//
174*4474ed8aSSzymon Olewniczak//		$chs = $changelog->getRevisions(0, 10000);
175*4474ed8aSSzymon Olewniczak//		foreach ($chs as $rev) {
176*4474ed8aSSzymon Olewniczak//			$ch = $changelog->getRevisionInfo($rev);
177*4474ed8aSSzymon Olewniczak//			if ($ch['sum'] == $this->getConf('sum approved'))
178*4474ed8aSSzymon Olewniczak//				return $rev;
179*4474ed8aSSzymon Olewniczak//		}
180*4474ed8aSSzymon Olewniczak//		return -1;
181*4474ed8aSSzymon Olewniczak//	}
1821aeb2b4dSghi
183*4474ed8aSSzymon Olewniczak    /**
184*4474ed8aSSzymon Olewniczak     * @param Doku_Event $event
185*4474ed8aSSzymon Olewniczak     */
186*4474ed8aSSzymon Olewniczak    public function handle_display_banner(Doku_Event $event) {
187*4474ed8aSSzymon Olewniczak		global $INFO;
188bab76148SSzymon Olewniczak
1891aeb2b4dSghi        if ($event->data != 'show') return;
1901aeb2b4dSghi        if (!$INFO['exists']) return;
191*4474ed8aSSzymon Olewniczak        if (!$this->use_approve_here($INFO['id'])) return;
1921aeb2b4dSghi
193*4474ed8aSSzymon Olewniczak//        $last_change_date = p_get_metadata($INFO['id'], 'last_change date');
194*4474ed8aSSzymon Olewniczak        $last_change_date = @filemtime(wikiFN($INFO['id']));
195*4474ed8aSSzymon Olewniczak        $rev = !$INFO['rev'] ? $last_change_date : $INFO['rev'];
1961aeb2b4dSghi
19755f447f4SSzymon Olewniczak
198*4474ed8aSSzymon Olewniczak        $res = $this->sqlite()->query('SELECT ready_for_approval, approved, version
199*4474ed8aSSzymon Olewniczak                                FROM revision
200*4474ed8aSSzymon Olewniczak                                WHERE page=? AND rev=?', $INFO['id'], $rev);
201*4474ed8aSSzymon Olewniczak
202*4474ed8aSSzymon Olewniczak        $approve = $this->sqlite()->res_fetch_assoc($res);
203*4474ed8aSSzymon Olewniczak
204*4474ed8aSSzymon Olewniczak		$classes = [];
20555f447f4SSzymon Olewniczak		if ($this->getConf('prettyprint')) {
20655f447f4SSzymon Olewniczak		    $classes[] = 'plugin__approve_noprint';
20755f447f4SSzymon Olewniczak        }
20855f447f4SSzymon Olewniczak
209*4474ed8aSSzymon Olewniczak        if ($approve['approved']) {
21055f447f4SSzymon Olewniczak		    $classes[] = 'plugin__approve_green';
211*4474ed8aSSzymon Olewniczak		} elseif ($this->getConf('ready_for_approval') && $approve['ready_for_approval']) {
212bab76148SSzymon Olewniczak		    $classes[] = 'plugin__approve_ready';
21355f447f4SSzymon Olewniczak        } else {
21455f447f4SSzymon Olewniczak            $classes[] = 'plugin__approve_red';
21555f447f4SSzymon Olewniczak        }
21655f447f4SSzymon Olewniczak
21755f447f4SSzymon Olewniczak		ptln('<div id="plugin__approve" class="' . implode(' ', $classes) . '">');
2181aeb2b4dSghi
2191aeb2b4dSghi		tpl_pageinfo();
2201aeb2b4dSghi		ptln(' | ');
221af3e3cd8SSzymon Olewniczak
222*4474ed8aSSzymon Olewniczak		if ($approve['approved']) {
223*4474ed8aSSzymon Olewniczak			ptln('<strong>'.$this->getLang('approved').'</strong> ('
224*4474ed8aSSzymon Olewniczak                . $this->getLang('version') .  ': ' . $approve['version'] . ')');
225*4474ed8aSSzymon Olewniczak
226*4474ed8aSSzymon Olewniczak			//not the newest page
227*4474ed8aSSzymon Olewniczak			if ($rev != $last_change_date) {
228*4474ed8aSSzymon Olewniczak                $res = $this->sqlite()->query('SELECT rev, current FROM revision
229*4474ed8aSSzymon Olewniczak                                WHERE page=? AND approved IS NOT NULL
230*4474ed8aSSzymon Olewniczak                                ORDER BY rev DESC LIMIT 1', $INFO['id']);
231*4474ed8aSSzymon Olewniczak
232*4474ed8aSSzymon Olewniczak                $lastest_approve = $this->sqlite()->res_fetch_assoc($res);
233*4474ed8aSSzymon Olewniczak
234*4474ed8aSSzymon Olewniczak			    //we can see drafts
235*4474ed8aSSzymon Olewniczak                if (auth_quickaclcheck($INFO['id']) >= AUTH_EDIT) {
236*4474ed8aSSzymon Olewniczak                    ptln('<a href="' . wl($INFO['id']) . '">');
237*4474ed8aSSzymon Olewniczak                    ptln($this->getLang($lastest_approve['current'] ? 'newest_approved' : 'newest_draft'));
2381aeb2b4dSghi                    ptln('</a>');
239*4474ed8aSSzymon Olewniczak                } else {
240*4474ed8aSSzymon Olewniczak                    $urlParameters = [];
241*4474ed8aSSzymon Olewniczak                    if (!$lastest_approve['current']) {
242*4474ed8aSSzymon Olewniczak                        $urlParameters['rev'] = $lastest_approve['rev'];
243*4474ed8aSSzymon Olewniczak                    }
244*4474ed8aSSzymon Olewniczak                    ptln('<a href="' . wl($INFO['id'], $urlParameters) . '">');
2451aeb2b4dSghi                    ptln($this->getLang('newest_approved'));
2461aeb2b4dSghi                    ptln('</a>');
2471aeb2b4dSghi                }
248*4474ed8aSSzymon Olewniczak            }
249*4474ed8aSSzymon Olewniczak
2501aeb2b4dSghi		} else {
2511aeb2b4dSghi			ptln('<span>'.$this->getLang('draft').'</span>');
2521aeb2b4dSghi
253*4474ed8aSSzymon Olewniczak			if ($this->getConf('ready_for_approval') && $approve['ready_for_approval']) {
25484047bdaSRuud				ptln('<span>| '.$this->getLang('marked_approve_ready').'</span>');
25584047bdaSRuud			}
25684047bdaSRuud
25784047bdaSRuud
258*4474ed8aSSzymon Olewniczak            $res = $this->sqlite()->query('SELECT rev, current FROM revision
259*4474ed8aSSzymon Olewniczak                            WHERE page=? AND approved IS NOT NULL
260*4474ed8aSSzymon Olewniczak                            ORDER BY rev DESC LIMIT 1', $INFO['id']);
261*4474ed8aSSzymon Olewniczak
262*4474ed8aSSzymon Olewniczak            $lastest_approve = $this->sqlite()->res_fetch_assoc($res);
263*4474ed8aSSzymon Olewniczak
264*4474ed8aSSzymon Olewniczak
265*4474ed8aSSzymon Olewniczak            //not exists approve for current page
266*4474ed8aSSzymon Olewniczak			if (!$lastest_approve) {
267*4474ed8aSSzymon Olewniczak                //not the newest page
268*4474ed8aSSzymon Olewniczak                if ($rev != $last_change_date) {
269*4474ed8aSSzymon Olewniczak				    ptln('<a href="'.wl($INFO['id']).'">');
270274d699aSghi                    ptln($this->getLang('newest_draft'));
271274d699aSghi				    ptln('</a>');
272274d699aSghi				}
273274d699aSghi			} else {
274*4474ed8aSSzymon Olewniczak                $urlParameters = [];
275*4474ed8aSSzymon Olewniczak                if (!$lastest_approve['current']) {
276*4474ed8aSSzymon Olewniczak                    $urlParameters['rev'] = $lastest_approve['rev'];
277*4474ed8aSSzymon Olewniczak                }
278*4474ed8aSSzymon Olewniczak                ptln('<a href="' . wl($INFO['id'], $urlParameters) . '">');
2791aeb2b4dSghi                ptln($this->getLang('newest_approved'));
2801aeb2b4dSghi				ptln('</a>');
2811aeb2b4dSghi			}
2821aeb2b4dSghi
283*4474ed8aSSzymon Olewniczak			//we are in current page
284*4474ed8aSSzymon Olewniczak			if ($rev == $last_change_date) {
285*4474ed8aSSzymon Olewniczak
286*4474ed8aSSzymon Olewniczak                $last_approved_rev = 0;
287*4474ed8aSSzymon Olewniczak                if (isset($lastest_approve['rev'])) {
288*4474ed8aSSzymon Olewniczak                    $last_approved_rev = $lastest_approve['rev'];
289*4474ed8aSSzymon Olewniczak                }
290*4474ed8aSSzymon Olewniczak
291*4474ed8aSSzymon Olewniczak                if ($this->getConf('ready_for_approval') &&
292*4474ed8aSSzymon Olewniczak                    auth_quickaclcheck($INFO['id']) >= AUTH_EDIT &&
293*4474ed8aSSzymon Olewniczak                    !$approve['ready_for_approval']) {
294*4474ed8aSSzymon Olewniczak
295*4474ed8aSSzymon Olewniczak                    $urlParameters = [
296*4474ed8aSSzymon Olewniczak                        'rev' => $last_approved_rev,
297*4474ed8aSSzymon Olewniczak                        'do' => 'diff',
298*4474ed8aSSzymon Olewniczak                        'ready_for_approval' => 'ready_for_approval'
299*4474ed8aSSzymon Olewniczak                    ];
300*4474ed8aSSzymon Olewniczak                    ptln(' | <a href="'.wl($INFO['id'], $urlParameters).'">');
30184047bdaSRuud                    ptln($this->getLang('approve_ready'));
30284047bdaSRuud                    ptln('</a>');
30384047bdaSRuud                }
30484047bdaSRuud
305*4474ed8aSSzymon Olewniczak                if (auth_quickaclcheck($INFO['id']) >= AUTH_DELETE) {
306*4474ed8aSSzymon Olewniczak
307*4474ed8aSSzymon Olewniczak                    $urlParameters = [
308*4474ed8aSSzymon Olewniczak                        'rev' => $last_approved_rev,
309*4474ed8aSSzymon Olewniczak                        'do' => 'diff',
310*4474ed8aSSzymon Olewniczak                        'approve' => 'approve'
311*4474ed8aSSzymon Olewniczak                    ];
312*4474ed8aSSzymon Olewniczak                    ptln(' | <a href="'.wl($INFO['id'], $urlParameters).'">');
3131aeb2b4dSghi                    ptln($this->getLang('approve'));
3141aeb2b4dSghi                    ptln('</a>');
3151aeb2b4dSghi                }
31684047bdaSRuud
317*4474ed8aSSzymon Olewniczak            }
3181aeb2b4dSghi		}
3191aeb2b4dSghi		ptln('</div>');
3201aeb2b4dSghi	}
3211aeb2b4dSghi
322af3e3cd8SSzymon Olewniczak    /**
323*4474ed8aSSzymon Olewniczak     * @return bool|string
324*4474ed8aSSzymon Olewniczak     */
325*4474ed8aSSzymon Olewniczak    protected function prev_rev($id) {
326*4474ed8aSSzymon Olewniczak        $res = $this->sqlite()->query('SELECT rev FROM revision
327*4474ed8aSSzymon Olewniczak                                        WHERE page=?
328*4474ed8aSSzymon Olewniczak                                          AND current=1
329*4474ed8aSSzymon Olewniczak                                          AND approved IS NULL
330*4474ed8aSSzymon Olewniczak                                          AND ready_for_approval IS NULL', $id);
331*4474ed8aSSzymon Olewniczak
332*4474ed8aSSzymon Olewniczak        return $this->sqlite()->res2single($res);
333*4474ed8aSSzymon Olewniczak    }
334*4474ed8aSSzymon Olewniczak
335*4474ed8aSSzymon Olewniczak    /**
336*4474ed8aSSzymon Olewniczak     *
337*4474ed8aSSzymon Olewniczak     * @param Doku_Event $event  event object by reference
338*4474ed8aSSzymon Olewniczak     * @return void
339*4474ed8aSSzymon Olewniczak     */
340*4474ed8aSSzymon Olewniczak    public function handle_pagesave_after(Doku_Event $event) {
341*4474ed8aSSzymon Olewniczak        //no content was mde
342*4474ed8aSSzymon Olewniczak        if (!$event->data['contentChanged']) return;
343*4474ed8aSSzymon Olewniczak
344*4474ed8aSSzymon Olewniczak        $changeType = $event->data['changeType'];
345*4474ed8aSSzymon Olewniczak        if ($changeType == DOKU_CHANGE_TYPE_REVERT) {
346*4474ed8aSSzymon Olewniczak            if ($event->data['oldContent'] == '') {
347*4474ed8aSSzymon Olewniczak                $changeType = DOKU_CHANGE_TYPE_CREATE;
348*4474ed8aSSzymon Olewniczak            } else {
349*4474ed8aSSzymon Olewniczak                $changeType = DOKU_CHANGE_TYPE_EDIT;
350*4474ed8aSSzymon Olewniczak            }
351*4474ed8aSSzymon Olewniczak        }
352*4474ed8aSSzymon Olewniczak
353*4474ed8aSSzymon Olewniczak        $id = $event->data['id'];
354*4474ed8aSSzymon Olewniczak        //TODO: if created, if deleted
355*4474ed8aSSzymon Olewniczak        switch ($changeType) {
356*4474ed8aSSzymon Olewniczak            case DOKU_CHANGE_TYPE_EDIT:
357*4474ed8aSSzymon Olewniczak            case DOKU_CHANGE_TYPE_REVERT:
358*4474ed8aSSzymon Olewniczak            case DOKU_CHANGE_TYPE_MINOR_EDIT:
359*4474ed8aSSzymon Olewniczak                $last_change_date = $event->data['newRevision'];
360*4474ed8aSSzymon Olewniczak
361*4474ed8aSSzymon Olewniczak                //if the current page has approved or ready_for_approval -- keep it
362*4474ed8aSSzymon Olewniczak                $prev_rev = $this->prev_rev($id);
363*4474ed8aSSzymon Olewniczak                if ($prev_rev) {
364*4474ed8aSSzymon Olewniczak                    $this->sqlite()->query('UPDATE revision SET rev=? WHERE page=? AND rev=?',
365*4474ed8aSSzymon Olewniczak                        $last_change_date, $id, $prev_rev);
366*4474ed8aSSzymon Olewniczak
367*4474ed8aSSzymon Olewniczak                } else {
368*4474ed8aSSzymon Olewniczak                    //keep previous record
369*4474ed8aSSzymon Olewniczak                    $this->sqlite()->query('UPDATE revision SET current=0
370*4474ed8aSSzymon Olewniczak                                            WHERE page=?
371*4474ed8aSSzymon Olewniczak                                            AND current=1', $id);
372*4474ed8aSSzymon Olewniczak
373*4474ed8aSSzymon Olewniczak                    $this->sqlite()->storeEntry('revision', [
374*4474ed8aSSzymon Olewniczak                        'page' => $id,
375*4474ed8aSSzymon Olewniczak                        'rev' => $last_change_date,
376*4474ed8aSSzymon Olewniczak                        'current' => 1
377*4474ed8aSSzymon Olewniczak                    ]);
378*4474ed8aSSzymon Olewniczak                }
379*4474ed8aSSzymon Olewniczak                break;
380*4474ed8aSSzymon Olewniczak            case DOKU_CHANGE_TYPE_DELETE:
381*4474ed8aSSzymon Olewniczak                //delete information about availability of a page but keep the history
382*4474ed8aSSzymon Olewniczak                $this->sqlite()->query('DELETE FROM page WHERE page=?', $id);
383*4474ed8aSSzymon Olewniczak
384*4474ed8aSSzymon Olewniczak                //delete revision if no information about approvals
385*4474ed8aSSzymon Olewniczak                $prev_rev = $this->prev_rev($id);
386*4474ed8aSSzymon Olewniczak                if ($prev_rev) {
387*4474ed8aSSzymon Olewniczak                    $this->sqlite()->query('DELETE FROM revision WHERE page=? AND rev=?',
388*4474ed8aSSzymon Olewniczak                        $id, $prev_rev);
389*4474ed8aSSzymon Olewniczak                } else {
390*4474ed8aSSzymon Olewniczak                    $this->sqlite()->query('UPDATE revision SET current=0 WHERE page=? AND rev=?',
391*4474ed8aSSzymon Olewniczak                        $id, $prev_rev);
392*4474ed8aSSzymon Olewniczak                }
393*4474ed8aSSzymon Olewniczak
394*4474ed8aSSzymon Olewniczak                break;
395*4474ed8aSSzymon Olewniczak            case DOKU_CHANGE_TYPE_CREATE:
396*4474ed8aSSzymon Olewniczak                $last_change_date = $event->data['newRevision'];
397*4474ed8aSSzymon Olewniczak                //TODO should be checked against no_approve_rev
398*4474ed8aSSzymon Olewniczak                $this->sqlite()->storeEntry('page', [
399*4474ed8aSSzymon Olewniczak                    'page' => $id
400*4474ed8aSSzymon Olewniczak                ]);
401*4474ed8aSSzymon Olewniczak
402*4474ed8aSSzymon Olewniczak                $this->sqlite()->storeEntry('revision', [
403*4474ed8aSSzymon Olewniczak                    'page' => $id,
404*4474ed8aSSzymon Olewniczak                    'rev' => $last_change_date,
405*4474ed8aSSzymon Olewniczak                    'current' => 1
406*4474ed8aSSzymon Olewniczak                ]);
407*4474ed8aSSzymon Olewniczak                break;
408*4474ed8aSSzymon Olewniczak        }
409*4474ed8aSSzymon Olewniczak    }
410*4474ed8aSSzymon Olewniczak
411*4474ed8aSSzymon Olewniczak    /**
412af3e3cd8SSzymon Olewniczak     * Check if the page has to be changed
413af3e3cd8SSzymon Olewniczak     *
414af3e3cd8SSzymon Olewniczak     * @param Doku_Event $event  event object by reference
415af3e3cd8SSzymon Olewniczak     * @param mixed      $param  [the parameters passed as fifth argument to register_hook() when this
416af3e3cd8SSzymon Olewniczak     *                           handler was registered]
417af3e3cd8SSzymon Olewniczak     * @return void
418af3e3cd8SSzymon Olewniczak     */
419*4474ed8aSSzymon Olewniczak//    public function handle_pagesave_before(Doku_Event $event, $param) {
420*4474ed8aSSzymon Olewniczak//        global $REV;
421*4474ed8aSSzymon Olewniczak//        $id = $event->data['id'];
422*4474ed8aSSzymon Olewniczak//        if (!$this->hlp->use_approve_here($id)) return;
423*4474ed8aSSzymon Olewniczak//
424*4474ed8aSSzymon Olewniczak//        //save page if summary is provided
425*4474ed8aSSzymon Olewniczak//        if($event->data['summary'] == $this->getConf('sum approved') ||
426*4474ed8aSSzymon Olewniczak//            $event->data['summary'] == $this->getConf('sum ready for approval')) {
427*4474ed8aSSzymon Olewniczak//            $event->data['contentChanged'] = true;
428*4474ed8aSSzymon Olewniczak//        }
429*4474ed8aSSzymon Olewniczak//    }
430af3e3cd8SSzymon Olewniczak
43155f447f4SSzymon Olewniczak    /**
43255f447f4SSzymon Olewniczak     * @param Doku_Event $event
43355f447f4SSzymon Olewniczak     * @param            $param
43455f447f4SSzymon Olewniczak     */
435*4474ed8aSSzymon Olewniczak//    public function handle_pagesave_after(Doku_Event $event, $param) {
436*4474ed8aSSzymon Olewniczak//        global $REV;
437*4474ed8aSSzymon Olewniczak//        $id = $event->data['id'];
438*4474ed8aSSzymon Olewniczak//        if (!$this->hlp->use_approve_here($id)) return;
439*4474ed8aSSzymon Olewniczak//
440*4474ed8aSSzymon Olewniczak//        //save page if summary is provided
441*4474ed8aSSzymon Olewniczak//        if($event->data['summary'] == $this->getConf('sum approved')) {
442*4474ed8aSSzymon Olewniczak//
443*4474ed8aSSzymon Olewniczak//            $versions = p_get_metadata($id, ApproveConst::METADATA_VERSIONS_KEY);
444*4474ed8aSSzymon Olewniczak//            //calculate versions
445*4474ed8aSSzymon Olewniczak//            if (!$versions) {
446*4474ed8aSSzymon Olewniczak//                $this->render_metadata_for_approved_page($id, $event->data['newRevision']);
447*4474ed8aSSzymon Olewniczak//            } else {
448*4474ed8aSSzymon Olewniczak//                $curver = $versions[0] + 1;
449*4474ed8aSSzymon Olewniczak//                $versions[0] = $curver;
450*4474ed8aSSzymon Olewniczak//                $versions[$event->data['newRevision']] = $curver;
451*4474ed8aSSzymon Olewniczak//                p_set_metadata($id, array(ApproveConst::METADATA_VERSIONS_KEY => $versions));
452*4474ed8aSSzymon Olewniczak//            }
453*4474ed8aSSzymon Olewniczak//        }
454*4474ed8aSSzymon Olewniczak//    }
455af3e3cd8SSzymon Olewniczak
456af3e3cd8SSzymon Olewniczak
457af3e3cd8SSzymon Olewniczak    /**
458af3e3cd8SSzymon Olewniczak     * Calculate current version
459af3e3cd8SSzymon Olewniczak     *
460af3e3cd8SSzymon Olewniczak     * @param $id
461bab76148SSzymon Olewniczak     * @return array
462af3e3cd8SSzymon Olewniczak     */
463*4474ed8aSSzymon Olewniczak//    protected function render_metadata_for_approved_page($id, $currev=false) {
464*4474ed8aSSzymon Olewniczak//        if (!$currev) $currev = @filemtime(wikiFN($id));
465*4474ed8aSSzymon Olewniczak//
466*4474ed8aSSzymon Olewniczak//        $version = $this->approved($id);
467*4474ed8aSSzymon Olewniczak//        //version for current page
468*4474ed8aSSzymon Olewniczak//        $curver = $version + 1;
469*4474ed8aSSzymon Olewniczak//        $versions = array(0 => $curver, $currev => $curver);
470*4474ed8aSSzymon Olewniczak//
471*4474ed8aSSzymon Olewniczak//        $changelog = new PageChangeLog($id);
472*4474ed8aSSzymon Olewniczak//        $first = 0;
473*4474ed8aSSzymon Olewniczak//        $num = 100;
474*4474ed8aSSzymon Olewniczak//        while (count($revs = $changelog->getRevisions($first, $num)) > 0) {
475*4474ed8aSSzymon Olewniczak//            foreach ($revs as $rev) {
476*4474ed8aSSzymon Olewniczak//                $revInfo = $changelog->getRevisionInfo($rev);
477*4474ed8aSSzymon Olewniczak//                if ($revInfo['sum'] == $this->getConf('sum approved')) {
478*4474ed8aSSzymon Olewniczak//                    $versions[$rev] = $version;
479*4474ed8aSSzymon Olewniczak//                    $version -= 1;
480*4474ed8aSSzymon Olewniczak//                }
481*4474ed8aSSzymon Olewniczak//            }
482*4474ed8aSSzymon Olewniczak//            $first += $num;
483*4474ed8aSSzymon Olewniczak//        }
484*4474ed8aSSzymon Olewniczak//
485*4474ed8aSSzymon Olewniczak//        p_set_metadata($id, array(ApproveConst::METADATA_VERSIONS_KEY => $versions));
486*4474ed8aSSzymon Olewniczak//
487*4474ed8aSSzymon Olewniczak//        return $versions;
488*4474ed8aSSzymon Olewniczak//    }
489af3e3cd8SSzymon Olewniczak
49055f447f4SSzymon Olewniczak    /**
49155f447f4SSzymon Olewniczak     * Get the number of approved pages
49255f447f4SSzymon Olewniczak     * @param $id
49355f447f4SSzymon Olewniczak     * @return int
49455f447f4SSzymon Olewniczak     */
495*4474ed8aSSzymon Olewniczak//    protected function approved($id) {
496*4474ed8aSSzymon Olewniczak//        $count = 0;
497*4474ed8aSSzymon Olewniczak//
498*4474ed8aSSzymon Olewniczak//        $changelog = new PageChangeLog($id);
499*4474ed8aSSzymon Olewniczak//        $first = 0;
500*4474ed8aSSzymon Olewniczak//        $num = 100;
501*4474ed8aSSzymon Olewniczak//        while (count($revs = $changelog->getRevisions($first, $num)) > 0) {
502*4474ed8aSSzymon Olewniczak//            foreach ($revs as $rev) {
503*4474ed8aSSzymon Olewniczak//                $revInfo = $changelog->getRevisionInfo($rev);
504*4474ed8aSSzymon Olewniczak//                if ($revInfo['sum'] == $this->getConf('sum approved')) {
505*4474ed8aSSzymon Olewniczak//                    $count += 1;
506*4474ed8aSSzymon Olewniczak//                }
507*4474ed8aSSzymon Olewniczak//            }
508*4474ed8aSSzymon Olewniczak//            $first += $num;
509*4474ed8aSSzymon Olewniczak//        }
510*4474ed8aSSzymon Olewniczak//
511*4474ed8aSSzymon Olewniczak//        return $count;
512*4474ed8aSSzymon Olewniczak//    }
5131aeb2b4dSghi}
514