<?php␊ |
/* -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */␊ |
/*␊ |
# ***** BEGIN LICENSE BLOCK *****␊ |
# This file is part of InDefero, an open source project management application.␊ |
# Copyright (C) 2008-2011 Céondo Ltd and contributors.␊ |
#␊ |
# InDefero is free software; you can redistribute it and/or modify␊ |
# it under the terms of the GNU General Public License as published by␊ |
# the Free Software Foundation; either version 2 of the License, or␊ |
# (at your option) any later version.␊ |
#␊ |
# InDefero is distributed in the hope that it will be useful,␊ |
# but WITHOUT ANY WARRANTY; without even the implied warranty of␊ |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the␊ |
# GNU General Public License for more details.␊ |
#␊ |
# You should have received a copy of the GNU General Public License␊ |
# along with this program; if not, write to the Free Software␊ |
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA␊ |
#␊ |
# ***** END LICENSE BLOCK ***** */␊ |
␊ |
/**␊ |
* A revision of a wiki page.␊ |
*␊ |
*/␊ |
class IDF_Wiki_PageRevision extends Pluf_Model␊ |
{␊ |
public $_model = __CLASS__;␊ |
␊ |
function init()␊ |
{␊ |
$this->_a['table'] = 'idf_wikipagerevs';␊ |
$this->_a['model'] = __CLASS__;␊ |
$this->_a['cols'] = array(␊ |
// It is mandatory to have an "id" column.␊ |
'id' =>␊ |
array(␊ |
'type' => 'Pluf_DB_Field_Sequence',␊ |
'blank' => true,␊ |
),␊ |
'wikipage' =>␊ |
array(␊ |
'type' => 'Pluf_DB_Field_Foreignkey',␊ |
'model' => 'IDF_Wiki_Page',␊ |
'blank' => false,␊ |
'verbose' => __('page'),␊ |
'relate_name' => 'revisions',␊ |
),␊ |
'is_head' =>␊ |
array(␊ |
'type' => 'Pluf_DB_Field_Boolean',␊ |
'blank' => false,␊ |
'default' => false,␊ |
'help_text' => 'If this revision is the latest, we mark it as being the head revision.',␊ |
'index' => true,␊ |
␊ |
),␊ |
'summary' =>␊ |
array(␊ |
'type' => 'Pluf_DB_Field_Varchar',␊ |
'blank' => false,␊ |
'size' => 250,␊ |
'verbose' => __('summary'),␊ |
'help_text' => __('A one line description of the changes.'),␊ |
),␊ |
'content' =>␊ |
array(␊ |
'type' => 'Pluf_DB_Field_Compressed',␊ |
'blank' => false,␊ |
'verbose' => __('content'),␊ |
),␊ |
'submitter' =>␊ |
array(␊ |
'type' => 'Pluf_DB_Field_Foreignkey',␊ |
'model' => 'Pluf_User',␊ |
'blank' => false,␊ |
'verbose' => __('submitter'),␊ |
),␊ |
'changes' =>␊ |
array(␊ |
'type' => 'Pluf_DB_Field_Serialized',␊ |
'blank' => true,␊ |
'verbose' => __('changes'),␊ |
'help_text' => 'Serialized array of the changes in the page.',␊ |
),␊ |
'creation_dtime' =>␊ |
array(␊ |
'type' => 'Pluf_DB_Field_Datetime',␊ |
'blank' => true,␊ |
'verbose' => __('creation date'),␊ |
),␊ |
);␊ |
$this->_a['idx'] = array(␊ |
'creation_dtime_idx' =>␊ |
array(␊ |
'col' => 'creation_dtime',␊ |
'type' => 'normal',␊ |
),␊ |
);␊ |
}␊ |
␊ |
function changedRevision()␊ |
{␊ |
return (is_array($this->changes) and count($this->changes) > 0);␊ |
}␊ |
␊ |
function _toIndex()␊ |
{␊ |
return $this->content;␊ |
}␊ |
␊ |
/**␊ |
* We drop the information from the timeline.␊ |
*/␊ |
function preDelete()␊ |
{␊ |
IDF_Timeline::remove($this);␊ |
}␊ |
␊ |
function preSave($create=false)␊ |
{␊ |
if ($this->id == '') {␊ |
$this->creation_dtime = gmdate('Y-m-d H:i:s');␊ |
$this->is_head = true;␊ |
}␊ |
}␊ |
␊ |
function postSave($create=false)␊ |
{␊ |
if ($create) {␊ |
// Check if more than one revision for this page. We do␊ |
// not want to insert the first revision in the timeline␊ |
// as the page itself is inserted. We do not insert on␊ |
// update as update is performed to change the is_head␊ |
// flag.␊ |
$sql = new Pluf_SQL('wikipage=%s', array($this->wikipage));␊ |
$rev = Pluf::factory('IDF_Wiki_PageRevision')->getList(array('filter'=>$sql->gen()));␊ |
if ($rev->count() > 1) {␊ |
IDF_Timeline::insert($this, $this->get_wikipage()->get_project(),␊ |
$this->get_submitter());␊ |
foreach ($rev as $r) {␊ |
if ($r->id != $this->id and $r->is_head) {␊ |
$r->is_head = false;␊ |
$r->update();␊ |
}␊ |
}␊ |
}␊ |
$page = $this->get_wikipage();␊ |
$page->update(); // Will update the modification timestamp.␊ |
IDF_Search::index($page);␊ |
}␊ |
}␊ |
␊ |
public function timelineFragment($request)␊ |
{␊ |
$page = $this->get_wikipage();␊ |
$url = Pluf_HTTP_URL_urlForView('IDF_Views_Wiki::view',␊ |
array($request->project->shortname,␊ |
$page->title));␊ |
$out = "\n".'<tr class="log"><td><a href="'.$url.'">'.␊ |
Pluf_esc(Pluf_Template_dateAgo($this->creation_dtime, 'without')).␊ |
'</a></td><td>';␊ |
$stag = new IDF_Template_ShowUser();␊ |
$user = $stag->start($this->get_submitter(), $request, '', false);␊ |
$out .= sprintf(__('<a href="%1$s" title="View page">%2$s</a>, %3$s'), $url, Pluf_esc($page->title), Pluf_esc($this->summary));␊ |
if ($this->changedRevision()) {␊ |
$out .= '<div class="issue-changes-timeline">';␊ |
$changes = $this->changes;␊ |
foreach ($changes as $w => $v) {␊ |
$out .= '<strong>';␊ |
switch ($w) {␊ |
case 'lb':␊ |
$out .= __('Labels:'); break;␊ |
}␊ |
$out .= '</strong> ';␊ |
if ($w == 'lb') {␊ |
$out .= Pluf_esc(implode(', ', $v));␊ |
} else {␊ |
$out .= Pluf_esc($v);␊ |
}␊ |
$out .= ' ';␊ |
}␊ |
$out .= '</div>';␊ |
}␊ |
$out .= '</td></tr>';␊ |
$out .= "\n".'<tr class="extra"><td colspan="2">␊ |
<div class="helptext right">'.sprintf(__('Change of <a href="%s">%s</a>, by %s'), $url, Pluf_esc($page->title), $user).'</div></td></tr>';␊ |
return Pluf_Template::markSafe($out);␊ |
}␊ |
␊ |
public function feedFragment($request)␊ |
{␊ |
$page = $this->get_wikipage();␊ |
if (!$this->is_head) {␊ |
$url = Pluf::f('url_base')␊ |
.Pluf_HTTP_URL_urlForView('IDF_Views_Wiki::view',␊ |
array($request->project->shortname,␊ |
$page->title),␊ |
array('rev' => $this->id));␊ |
} else {␊ |
$url = Pluf::f('url_base')␊ |
.Pluf_HTTP_URL_urlForView('IDF_Views_Wiki::view',␊ |
array($request->project->shortname,␊ |
$page->title));␊ |
}␊ |
$title = sprintf(__('%s: Documentation page %s updated - %s'),␊ |
$request->project->name,␊ |
$page->title, $page->summary);␊ |
$date = Pluf_Date::gmDateToGmString($this->creation_dtime);␊ |
$context = new Pluf_Template_Context_Request(␊ |
$request,␊ |
array('url' => $url,␊ |
'title' => $title,␊ |
'page' => $page,␊ |
'rev' => $this,␊ |
'create' => false,␊ |
'date' => $date)␊ |
);␊ |
$tmpl = new Pluf_Template('idf/wiki/feedfragment.xml');␊ |
return $tmpl->render($context);␊ |
}␊ |
␊ |
␊ |
␊ |
/**␊ |
* Notification of change of a Wiki Page.␊ |
*␊ |
* The content of a WikiPage is in the IDF_WikiRevision object,␊ |
* this is why we send the notificatin from there. This means that␊ |
* when the create flag is set, this is for the creation of a␊ |
* wikipage and not, for the addition of a new revision.␊ |
*␊ |
* Usage:␊ |
* <pre>␊ |
* $this->notify($conf); // Notify the creation of a wiki page␊ |
* $this->notify($conf, false); // Notify the update of the page␊ |
* </pre>␊ |
*␊ |
* @param IDF_Conf Current configuration␊ |
* @param bool Creation (true)␊ |
*/␊ |
public function notify($conf, $create=true)␊ |
{␊ |
$wikipage = $this->get_wikipage();␊ |
$project = $wikipage->get_project();␊ |
$current_locale = Pluf_Translation::getLocale();␊ |
␊ |
$from_email = Pluf::f('from_email');␊ |
$messageId = '<'.md5('wiki'.$wikipage->id.md5(Pluf::f('secret_key'))).'@'.Pluf::f('mail_host', 'localhost').'>';␊ |
$recipients = $project->getNotificationRecipientsForTab('wiki');␊ |
␊ |
foreach ($recipients as $address => $language) {␊ |
␊ |
if ($this->get_submitter()->email === $address) {␊ |
continue;␊ |
}␊ |
␊ |
Pluf_Translation::loadSetLocale($language);␊ |
␊ |
$context = new Pluf_Template_Context(array(␊ |
'page' => $wikipage,␊ |
'rev' => $this,␊ |
'project' => $project,␊ |
'url_base' => Pluf::f('url_base'),␊ |
));␊ |
␊ |
$tplfile = 'idf/wiki/wiki-created-email.txt';␊ |
$subject = __('New Documentation Page %s - %s (%s)');␊ |
$headers = array('Message-ID' => $messageId);␊ |
if (!$create) {␊ |
$tplfile = 'idf/wiki/wiki-updated-email.txt';␊ |
$subject = __('Documentation Page Changed %s - %s (%s)');␊ |
$headers = array('References' => $messageId);␊ |
}␊ |
␊ |
$tmpl = new Pluf_Template($tplfile);␊ |
$text_email = $tmpl->render($context);␊ |
␊ |
$email = new Pluf_Mail($from_email,␊ |
$address,␊ |
sprintf($subject,␊ |
$wikipage->title,␊ |
$wikipage->summary,␊ |
$project->shortname));␊ |
$email->addTextMessage($text_email);␊ |
$email->addHeaders($headers);␊ |
$email->sendMail();␊ |
}␊ |
␊ |
Pluf_Translation::loadSetLocale($current_locale);␊ |
}␊ |
}␊ |