Skip to content

Commit

Permalink
send notifications also to @group approvers
Browse files Browse the repository at this point in the history
  • Loading branch information
solewniczak committed Nov 17, 2023
1 parent 9b6ad60 commit b664e7d
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 57 deletions.
20 changes: 7 additions & 13 deletions action/notification.php
@@ -1,5 +1,7 @@
<?php
// must be run within DokuWiki
use dokuwiki\plugin\approve\meta\ApproveMetadata;

if (!defined('DOKU_INC')) die();

if (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN', DOKU_INC . 'lib/plugins/');
Expand Down Expand Up @@ -44,28 +46,20 @@ public function add_notifications(Doku_Event $event)
{
if (!in_array('approve', $event->data['plugins'])) return;

$user = $event->data['user'];
try {
/** @var \helper_plugin_approve_db $db_helper */
$db_helper = plugin_load('helper', 'approve_db');
$sqlite = $db_helper->getDB();
$approveMetadata = new ApproveMetadata();
} catch (Exception $e) {
msg($e->getMessage(), -1);
return;
}

$user = $event->data['user'];

$is_ready_for_approval = '';
$states = ['draft', 'ready_for_approval'];
if ($this->getConf('ready_for_approval_notification')) {
$is_ready_for_approval = 'AND revision.ready_for_approval IS NOT NULL';
$states = ['ready_for_approval'];
}
$q = 'SELECT page.page, revision.rev
FROM page INNER JOIN revision ON page.page = revision.page
WHERE page.hidden = 0 AND page.approver=?
AND revision.current=1 AND revision.approved IS NULL ' . $is_ready_for_approval;
$res = $sqlite->query($q, $user);

$notifications = $sqlite->res2arr($res);
$notifications = $approveMetadata->getPages($user, $states);

foreach ($notifications as $notification) {
$page = $notification['page'];
Expand Down
59 changes: 59 additions & 0 deletions meta/ApproveMetadata.php
@@ -0,0 +1,59 @@
<?php

namespace dokuwiki\plugin\approve\meta;

use dokuwiki\plugin\sqlite\SQLiteDB;
use dokuwiki\Extension\AuthPlugin;

class ApproveMetadata
{

protected $db;

public function __construct()
{
$this->db = new SQLiteDB('approve', DOKU_PLUGIN . 'sqlite/db/');
}

public function getPages($user=null, $states=['approved', 'draft', 'ready_for_approval'], $namespace='', $filter=''): array
{
/* @var AuthPlugin $auth */
global $auth;

$sql = 'SELECT page.page, page.approver, revision.rev, revision.approved, revision.approved_by,
revision.ready_for_approval, revision.ready_for_approval_by,
LENGTH(page.page) - LENGTH(REPLACE(page.page, \':\', \'\')) AS colons
FROM page INNER JOIN revision ON page.page = revision.page
WHERE page.hidden = 0 AND revision.current=1 AND page.page GLOB ? AND page.page REGEXP ?
ORDER BY colons, page.page';
$pages = $this->db->queryAll($sql, $namespace.'*', $filter);

if ($user) {
$user_data = $auth->getUserData($user);
$user_groups = $user_data['grps'];
$pages = array_filter($pages, function ($page) use ($user, $user_groups) {
return $page['approver'][0] == '@' && in_array(substr($page['approver'], 1), $user_groups) ||
$page['approver'] == $user;
});
}

// add status to the page
$pages = array_map(function ($page) {
if ($page['approved'] !== null) {
$page['status'] = 'approved';
} elseif ($page['ready_for_approval'] !== null) {
$page['status'] = 'ready_for_approval';
} else {
$page['status'] = 'draft';
}
return $page;
}, $pages);

// filter by status
$pages = array_filter($pages, function ($page) use ($states) {
return in_array($page['status'], $states);
});

return $pages;
}
}
2 changes: 1 addition & 1 deletion plugin.info.txt
@@ -1,7 +1,7 @@
base approve
author Szymon Olewniczak
email it@rid.pl
date 2022-03-29
date 2023-11-17
name approve
desc Page approval mechanism for dokuwiki.
url https://www.dokuwiki.org/plugin:approve
48 changes: 5 additions & 43 deletions syntax/table.php
@@ -1,6 +1,8 @@
<?php

// must be run within DokuWiki
use dokuwiki\plugin\approve\meta\ApproveMetadata;

if(!defined('DOKU_INC')) die();


Expand Down Expand Up @@ -32,7 +34,7 @@ function handle($match, $state, $pos, Doku_Handler $handler){
$params = [
'namespace' => '',
'filter' => false,
'states' => [],
'states' => $this->states,
'summarize' => true,
'approver' => null
];
Expand Down Expand Up @@ -127,9 +129,7 @@ public function renderXhtml(Doku_Renderer $renderer, $params)
global $auth;

try {
/** @var \helper_plugin_approve_db $db_helper */
$db_helper = plugin_load('helper', 'approve_db');
$sqlite = $db_helper->getDB();
$approveMetadata = new ApproveMetadata();
} catch (Exception $e) {
msg($e->getMessage(), -1);
return;
Expand All @@ -139,45 +139,7 @@ public function renderXhtml(Doku_Renderer $renderer, $params)
$params['approver'] = $INFO['client'];
}

$approver_query = '';
$query_args = [$params['namespace'].'*'];
if ($params['approver']) {
$approver_query .= " AND page.approver LIKE ?";
$query_args[] = $params['approver'];
}

if ($params['filter']) {
$approver_query .= " AND page.page REGEXP ?";
$query_args[] = $params['filter'];
}

//if all 3 states are enabled nothing is filtered
if ($params['states'] && count($params['states']) < 3) {
if ($this->array_equal(['draft'], $params['states'])) {
$approver_query .= " AND revision.ready_for_approval IS NULL AND revision.approved IS NULL";
} elseif ($this->array_equal(['ready_for_approval'], $params['states'])) {
$approver_query .= " AND revision.ready_for_approval IS NOT NULL AND revision.approved IS NULL";
} elseif ($this->array_equal(['approved'], $params['states'])) {
$approver_query .= " AND revision.approved IS NOT NULL";
} elseif ($this->array_equal(['draft', 'ready_for_approval'], $params['states'])) {
$approver_query .= " AND revision.approved IS NULL";
} elseif ($this->array_equal(['draft', 'approved'], $params['states'])) {
$approver_query .= " AND (revision.approved IS NOT NULL OR (revision.approved IS NULL AND revision.ready_for_approval IS NULL))";
} elseif ($this->array_equal(['ready_for_approval', 'approved'], $params['states'])) {
$approver_query .= " AND (revision.ready_for_approval IS NOT NULL OR revision.approved IS NOT NULL)";
}
}

$q = "SELECT page.page, page.approver, revision.rev, revision.approved, revision.approved_by,
revision.ready_for_approval, revision.ready_for_approval_by,
LENGTH(page.page) - LENGTH(REPLACE(page.page, ':', '')) AS colons
FROM page INNER JOIN revision ON page.page = revision.page
WHERE page.hidden = 0 AND revision.current=1 AND page.page GLOB ?
$approver_query
ORDER BY colons, page.page";

$res = $sqlite->query($q, $query_args);
$pages = $sqlite->res2arr($res);
$pages = $approveMetadata->getPages($params['approver'], $params['states'], $params['namespace'], $params['filter']);

// Output Table
$renderer->doc .= '<table><tr>';
Expand Down

0 comments on commit b664e7d

Please sign in to comment.