Translations of this page?:

censure plugin

censure plugin by Jean Marc Masou
Edits must first be approved by an administrator before being published. Deals with Quality management systems and ISO_9001.

Last updated on 2007-11-22. Provides Action.
No compatibility info given!

Tagged with approval, censure, moderation, publish.

This tip is to integrate a new feature called 'censure'. Censure deals with Quality management systems and ISO_9001. This tip deals with the question:

“Is it possible to configure DokuWiki in such a way, that all edits must first be approved by an administrator before being published?”

Andi provides an answer to this in the faq :approval. And that's right :! DokuWiki don't have to deal with that sort of “control system”.

But my Quality manager asked me prior to an Audit to add some functionality to our local DokuWiki.

  1. Every new change may be monitored (that's done by DokuWiki base code)
  2. Every new change may block the access to the page changed (not supported by DokuWiki)
  3. And if the page is blocked by quality policies, user may have a link to the last approved revision of the page.
  4. Members of a special group, that we call “qualite” in French or “quality” in English, may have the right to approve change, and so put back the page in classic DokuWiki access.

This policy is for me completely stupid, but i have no choice…

So i do the worst code on a pseudo “plugins” to act like the quality policy say.

Installation

  1. Here the code, create a directory lib/plugins/ that you name “censure”
  2. Create into that directory a page that you name action.php
  3. Copy past the code…
  4. Create two smiley for the pseudo tags “VALIDE” and “NONVALIDE”.
  5. :-x Cry on your new censured DokuWiki :-X

The Code

 
<?php
 
//TODO virer les 3 lignes du pas valide, c'est un peu trop...
 
 
if(!defined('DOKU_INC')) die();
if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
require_once(DOKU_PLUGIN.'action.php');
 
 
class action_plugin_censure extends DokuWiki_Action_Plugin { 
 
  /**
   * return some info
   */
  function getInfo(){
    return array(
		 'author' => 'Jean Marc Masou',
		 'email'  => 'massou@gmail.com',
		 'date'   => '2007-11-22',
		 'name'   => 'censure',
		 'desc'   => 'Checks Events',
		 'url'    => 'http://www.massou.tk'
		 );
  }
 
 
  /*
   * Register its handlers with the dokuwiki's event controller
   */
  function register(&$controller) {
 
   /*    $events = array 
            (
            'ACTION_HEADERS_SEND', 'HTML_PAGE_FROMTEMPLATE', 
            'HTML_PROFILEFORM_INJECTION', 'HTML_REGISTERFORM_INJECTION', 
            'IO_NAMESPACE_CREATED', 'IO_NAMESPACE_DELETED', 
            'IO_WIKIPAGE_READ', 'IO_WIKIPAGE_WRITE', 'PARSER_CACHE_USE',
            'PARSER_HANDLER_DONE','PARSER_WIKITEXT_PREPROCESS',
            'RENDERER_CONTENT_POSTPROCESS', 'TPL_ACT_RENDER',
            'TPL_CONTENT_DISPLAY', 'TPL_METAHEADER_OUTPUT'
           );
*/
 
 
   $events = array 
            (
            'TPL_METAHEADER_OUTPUT', 'TPL_ACT_RENDER', 'IO_WIKIPAGE_WRITE'
           );
 
 
 
 
 
 
    foreach($events as $evt) {
        $controller->register_hook($evt, 'BEFORE', $this, 'write_event_before');    
        $controller->register_hook($evt, 'AFTER', $this, 'write_event_after');    
    }
 }
 
 
 function write_event_before (&$event, $param) {
         $this->write_event ($event, $param,'BEFORE');
 }
 function write_event_after (&$event, $param) {
        $this->write_event ($event, $param, 'AFTER');
 }
 
 
 
 
function write_event (&$event, $param=NULL, $advise) {
global $ID;
global $conf, $INFO;
 
$page_editednotvalid =  'Cette page n\'a pas &eacute;t&eacute; valid&eacute;<br>';
$follow_thislink =  'Vous pouvez suivre ce lien pour voir l\'ancienne version :  <br>';
$wait_valid =  'Il faut attendre que la page soit valid&eacute;e pour pouvoir la voir<br>';
$no_right =  'Vous n\'avez pas assez de droit pour consulter cette page<br>';
$no_valid_butedit =  ' Votre page n\'a pas encore &eacute;t&eacute; valid&eacute; Mais vous pouvez la modifier en tant qu\'auteur ou contributeur <br>';
$validator =  ' Vous pouvez la valider en suivant ce lien : <br> ';
 
 
 
//we test if the user is menber of the censure groupe
//print_r($INFO);
				$grps = $INFO['userinfo']['grps'];
				$qg = 0;
 
				if (count($grps)>0) {
							foreach($grps as $g ){
 
										if($g == 'admin' | $g == 'qualite'){
										$qg=1;
										break; 
										}
										}
				}
 
 
$test = $event->name;
 //echo $test;
$date = time(); //use current time if none supplied
 
 
if($test == 'IO_WIKIPAGE_WRITE' && $advise == 'BEFORE') {
 
$test2 = $event->data;
//We select just when write on the data and not in the Attic...
$rev = $test2[3];
//echo "after...";
// we edit the summary and append "NON VALIDE"
$sum = $event->summary;
$event->summary = $sum . "NON VALIDE";
//echo $_REQUEST['summary'] ;
$_REQUEST['summary'] = "NON VALIDE";
//echo $event->summary ;
$brut = $event->data[0][1];
$brut = str_replace("\\\\ \\\\ [[:valide]]VALIDE        ","", $brut );
$brut = str_replace("\\\\ \\\\ [[:non valide]]NONVALIDE","", $brut );
$event->data[0][1]=$brut."\n \n \n \n \n \n\\\\ \\\\ [[:non valide]]NONVALIDE"; 
 
if ($rev <> '') {
/*$file = $conf[metadir]."\\".str_replace(":","\\", $INFO[id] ).".changes" ;
$file2 = $conf[changelog];
//$pattern ="[".$date ."]";
$pattern ="[".$rev."]";
$test = io_deleteFromFile($file,$pattern,true);
$test = io_deleteFromFile($file2,$pattern,true);
*/
	addLogEntry($date, $ID, DOKU_CHANGE_TYPE_EDIT, "PAGE NON VALIDE");
		//addLogEntry($rev, $ID, DOKU_CHANGE_TYPE_EDIT, $_REQUEST['summary']." PAGE NON VALIDE");
		$meta = array();
		$user   = (!$flagExternalEdit)?$_SERVER['REMOTE_USER']:'';
		if ($user) $meta['QUALITE']['user'] = $INFO['userinfo']['name'];
		$meta['QUALITE']['modified'] = $date;
		$meta['QUALITE']['TYPE'] = "NON VALIDE";
		p_set_metadata($ID, $meta);
 
 
 
}
 
}
 
 
 
 if ($test == 'TPL_ACT_RENDER' & $advise == 'BEFORE'){
 
 // msg($this->getLang('missing_pagelistplugin'), -1);
 $metas=p_get_metadata($ID);
 
 
 
 
		if ($metas['QUALITE']['TYPE']== "NON VALIDE") {
 
	$user   = $INFO['userinfo']['name'];
	$editor = 0 ;
//echo $user;
	if (is_string ($user)){
 
	//print_r($metas);
	//echo $INFO['userinfo']['name'];
	//echo $metas['creator'];
	$contrib = $metas['contributor'];
	//echo $user;
	if ($metas['creator'] == $user){
 
	$editor = 1 ;
	}else{
		if (count($contrib)>0) {
			foreach($contrib as $cont ){
							if($cont == $user){
							//echo "contributeur".$user;
							$editor = 1 ;
							break; 
							}
							}
		}
	}
 
 }
 //echo "editor".$user.$editor.$metas['creator']."/n";	
 
 
	if ($_REQUEST['do'] == 'revisions' | $_REQUEST['rev']<>'') {
						//we hide the bad revisions....
						$info = getRevisionInfo($ID, $_REQUEST['rev']);
						//print_r ($info);
						//echo $info[sum]."<br>";
						if($info[sum]=="PAGE VALIDE"){
						//we show the page
						}elseif($qg==0 & $editor == 0){
					//we hide the page and the revisions
 
					echo $no_right;
					$event->preventDefault();
					$event->stopPropagation();
					} 
 
 
					}elseif ($editor <> 1 & $qg==0 ) {
 
					$revisions = getRevisions($ID, 1,50 );
 
					if (count($revisions)>0) {
 
						foreach($revisions as $rev ){
 
						$info = getRevisionInfo($ID, $rev);
						//print_r ($info);
						//echo $info[sum]."<br>";
						if(@file_exists(wikiFN($ID,$rev))&$info[sum]=="PAGE VALIDE"){
						$goodlastrev = $rev;
						$pagevalide = 1;
						break; 
						}
						}
 
					echo $page_editednotvalid;
				   echo $follow_thislink;
					echo '<a class="wikilink1" href="'.wl($ID,"rev=$rev").'">'.$ID.'</a>';
 
					echo $no_right;
					$event->preventDefault();
					$event->stopPropagation();
 
 
 					} else {
 
					echo $wait_valid;
 					}
					}
 
 
 
					if ($qg==0 & $editor == 1){
 
 
					echo $no_valid_butedit;
					} elseif ($qg==1){
				echo $page_editednotvalid;
						echo $validator;
					print '<a class="wikilink1" href="'.wl($ID,"doit=valide").'">'.$ID.'</a>';
					} else{
 
 
					}
 
 
	}
 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
if ($test == 'TPL_METAHEADER_OUTPUT' & $advise == 'BEFORE') {
 
 		if  ($_REQUEST['doit'] == 'valide' && $qg == 1) {
 
 
		$revisions = getRevisions($ID, 0,50 );
				//print_r($revisions);
					if (count($revisions)>0) {
						foreach($revisions as $rev ){
						if(@file_exists(wikiFN($ID,$rev))){
						$goodlastrev = $rev;
						break; 
						}
						}
					$file = $conf[metadir]."\\".str_replace(":","\\", $INFO[id] ).".changes" ;
					$file2 = $conf[changelog];
					$pattern ="[".$INFO[lastmod]."]";
					//$pattern ="[".$rev."]";
					$test = io_deleteFromFile($file,$pattern,true);
					$test = io_deleteFromFile($file2,$pattern,true);
 
					 addLogEntry($goodlastrev, $ID, DOKU_CHANGE_TYPE_EDIT, "PAGE VALIDE");
					} else {
 
					addLogEntry($date, $ID, DOKU_CHANGE_TYPE_EDIT, "PAGE VALIDE");
					}
 
    	echo "VALIDE".$goodlastrev ;
 
 		//p_set_metadata($ID, $data, $render, $persistent) 
 
 
 
 
										$file_name= $conf[datadir]."/".str_replace(":","/", $INFO[id] ).".txt" ;;
												echo $file_name;
										if(file_exists($file_name))
										{
											/* Open file for both reading and writng. 
											 * Place pointer at the beginning of the file.
											 */
											$handle = fopen($file_name, 'r+');
 
											if(!$handle)
											{
												die("couldn't open file <i>$file_name</i>");
											}
 
											while(1)
											{
												//read line
												$line = fgets($handle);
												//if end of file reached then stop reading anymore
												if($line == null)break;
 
												//replace student gpa with new updated gpa
												if(preg_match("/\[\[\:non valide\]\]NONVALIDE/", $line))
												{
													//$new_line = str_replace ("non valide", "valide", $line);
													//$new_line = str_replace ("NONVALIDE", "VALIDE", $new_line );
													//$new_line = str_replace ("]]NONVALIDE", " ", $new_line );
												$new_line = 	preg_replace("/\[\[\:non valide\]\]NONVALIDE/", "[[:valide]]VALIDE        ", $line);
 
 
 
												}
												else
												{
													//set file content to a string
													$str.= $line;
												}
											}
 
											//append new updated gpa to file content
											$str.= $new_line;
 
											//set pointer back to beginning
											rewind($handle);
 
											//delete everything in the file.
											ftruncate($handle, filesize($file_name));
 
											//write everything back to file with the updated gpa line
											fwrite($handle, $str);
											echo "Page Valid&eacute;e avec succ&eacute;s sauv&eacute;e sur le disque :!";
										}
										else
										{
											echo "file <i>$file_name</i> doesn't exists";
										}
										fclose($handle);
 
 
 $meta = array();
		$user   = (!$flagExternalEdit)?$_SERVER['REMOTE_USER']:'';
		//if ($user) $meta['QUALITE'][$user] = $INFO['userinfo']['name'];
		if ($user) $meta['QUALITE']["user"] = $INFO['userinfo']['name'];
		$meta['QUALITE']['modified'] = $date;
		$meta['QUALITE']['TYPE'] = "VALIDE";
		p_set_metadata($ID, $meta);
 
 
 
 
 
 
 
		}elseif ($_REQUEST['doit'] == 'nonvalide' && $qg == 1) {
 
		echo "NON VALIDE";
 
										$file_name= $conf[datadir]."\\".str_replace(":","\\", $INFO[id] ).".txt" ;;
												echo $file_name;
										if(file_exists($file_name))
										{
											/* Open file for both reading and writng. 
											 * Place pointer at the beginning of the file.
											 */
											$handle = fopen($file_name, 'r+');
 
											if(!$handle)
											{
												die("couldn't open file <i>$file_name</i>");
											}
 
											while(1)
											{
												//read line
												$line = fgets($handle);
												//if end of file reached then stop reading anymore
												if($line == null)break;
 
												//replace student gpa with new updated gpa
												if(preg_match("/\[\[\:valide\]\]VALIDE/", $line))
												{
													//$new_line = str_replace ("non valide", "valide", $line);
													//$new_line = str_replace ("NONVALIDE", "VALIDE", $new_line );
													//$new_line = str_replace ("]]NONVALIDE", " ", $new_line );
												$new_line = 	preg_replace("/\[\[\:valide\]\]VALIDE/", "[[:non valide]]NONVALIDE        ", $line);
 
 
 
												}
												else
												{
													//set file content to a string
													$str.= $line;
												}
											}
 
											//append new updated gpa to file content
											$str.= $new_line;
 
											//set pointer back to beginning
											rewind($handle);
 
											//delete everything in the file.
											ftruncate($handle, filesize($file_name));
 
											//write everything back to file with the updated gpa line
											fwrite($handle, $str);
											echo "Page InValid&eacute;e avec succ&eacute;s sauv&eacute;e sur le disque :!";
										}
										else
										{
											echo "file <i>$file_name</i> doesn't exists";
										}
										fclose($handle);
 
 
 
 
 
 
 
 
 
 
 
 
		$date = time(); //use current time if none supplied
		addLogEntry($date, $ID, DOKU_CHANGE_TYPE_EDIT, "PAGE NON VALIDE");
 		$meta = array();
		$user   = (!$flagExternalEdit)?$_SERVER['REMOTE_USER']:'';
		if ($user) $meta['QUALITE']['user'] = $INFO['userinfo']['name'];
		$meta['QUALITE']['modified'] = $date;
		$meta['QUALITE']['TYPE'] = "NON VALIDE";
		p_set_metadata($ID, $meta);
 
		/*
		  // send notify mails
		  notify($id,'admin',$old,$summary,$minor);
		  notify($id,'subscribers',$old,$summary,$minor);
		*/
 
		}
 
 
 
 
}
 
 if ($test == 'TPL_ACT_RENDER' & $advise == 'AFTER'){
 
 // msg($this->getLang('missing_pagelistplugin'), -1);
 $metas=p_get_metadata($ID);
 
 
echo '<script type="text/javascript">';
echo 'function removeElement()';
echo '{';
echo 'document.getElementById("qualite").style.display="block";';
echo '}';
echo '</script>';
 
echo '<input type="button" onclick="removeElement()" value="Cartouche Qualite" />';
 
 
 
 
echo '<style type="text/css" media="print">';
echo 'div#qualite {display: block;position: fixed; margin-left: auto; margin-right: auto; width: 100%;}';
echo '</style>';
echo ' <div class="qualite" id="qualite" style="display:none"><pre>'; 
 
 
echo '<img src="http://www.topagri.fr/includes/a901/logo.gif"  alt="Top@gri Services">';
echo "<br><h3>STATUT DOCUMENT</h3>Titre du document : ".$metas['title']."<br>"; 
echo "Date de Cr&eacute;ation : ".date("d-m-Y h:m",$metas['date']['created'])."<br>";
echo "Date de derni&egrave;re &eacute;dition : ".date("d-m-Y h:m",$metas['date']['modified'])."<br>";
$contrib = $metas['contributor'];
		if (count($contrib)>0) {
$i=0;
			foreach($contrib as $cont ){
 
 
 
							if ($i == 0){
							}elseif ($i ==1){
							echo "Cr&eacute;ateur  : ".$cont."<br>";
							}else{					
							echo "Contributeur ".($i-1)." : ".$cont."<br>";
							}
							$i= $i+1 ;
			}
		}
 
 
echo "Statut du document : ".$metas['QUALITE']['TYPE']."<br>"; 
echo "Validation par : ".$metas['QUALITE']['user']."<br>"; 
echo "le : ".date("d-m-Y h:m",$metas['QUALITE']['modified'])."<br>"; 
 
 
//print_r ($metas); 
 
echo "<br>"; 
echo "<br>"; 
echo "<br>"; 
echo "<br>"; 
echo "</pre></div>"; 
}
 
 
 
 
 
 
    /*  $filename = DOKU_INC . 'eventcheck.txt';
      if (!$handle = fopen($filename, 'a')) {
          return;    
      }
 
      $somecontent = "\n --- $advise ---\n";
      $somecontent .=  "\$_REQUEST: " . print_r($_REQUEST, true) . "\n";
      $somecontent .= print_r($event, true) . "\n";
 
      fwrite($handle, $somecontent);
      fclose($handle);*/
 
  }
 
 
 
 
 
 
 
 
 
}
 

Todo

  1. clean that dusty code…
  2. Integrate this javascript method :

http://www.dynamicdrive.com/dynamicindex17/animatedcollapse.htm

 
plugin/censure.txt · Last modified: 2008/08/10 14:12 by ach
 

Except where otherwise noted, content on this wiki is licensed under the following license: CC Attribution-Noncommercial-Share Alike 3.0 Unported

Imprint Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki
WikiForumIRCBugsTranslate