Commit f98b13a6 authored by mjollnir_'s avatar mjollnir_
Browse files

MDL-15758 and MDL-15768

- updated forum portfolio code to use files api and added forum export caps.
parent 3ee3b8c5
...@@ -111,6 +111,9 @@ $string['forum:createattachment'] = 'Create attachments'; ...@@ -111,6 +111,9 @@ $string['forum:createattachment'] = 'Create attachments';
$string['forum:deleteanypost'] = 'Delete any posts (anytime)'; $string['forum:deleteanypost'] = 'Delete any posts (anytime)';
$string['forum:deleteownpost'] = 'Delete own posts (within deadline)'; $string['forum:deleteownpost'] = 'Delete own posts (within deadline)';
$string['forum:editanypost'] = 'Edit any post'; $string['forum:editanypost'] = 'Edit any post';
$string['forum:exportpost'] = 'Export post';
$string['forum:exportownpost'] = 'Export own post';
$string['forum:exportdiscussion'] = 'Export whole discussion';
$string['forum:initialsubscriptions'] = 'Initial subscription'; $string['forum:initialsubscriptions'] = 'Initial subscription';
$string['forumintro'] = 'Forum introduction'; $string['forumintro'] = 'Forum introduction';
$string['forum:managesubscriptions'] = 'Manage subscriptions'; $string['forum:managesubscriptions'] = 'Manage subscriptions';
......
...@@ -271,7 +271,44 @@ $mod_forum_capabilities = array( ...@@ -271,7 +271,44 @@ $mod_forum_capabilities = array(
'contextlevel' => CONTEXT_MODULE, 'contextlevel' => CONTEXT_MODULE,
'legacy' => array( 'legacy' => array(
) )
) ),
);
'mod/forum:exportdiscussion' => array(
'riskbitmask' => RISK_PERSONAL,
'captype' => 'read',
'contextlevel' => CONTEXT_MODULE,
'legacy' => array(
'teacher' => CAP_ALLOW,
'editingteacher' => CAP_ALLOW,
'admin' => CAP_ALLOW
)
),
'mod/forum:exportpost' => array(
'riskbitmask' => RISK_PERSONAL,
'captype' => 'read',
'contextlevel' => CONTEXT_MODULE,
'legacy' => array(
'teacher' => CAP_ALLOW,
'editingteacher' => CAP_ALLOW,
'admin' => CAP_ALLOW
)
),
'mod/forum:exportownpost' => array(
'riskbitmask' => RISK_PERSONAL,
'captype' => 'read',
'contextlevel' => CONTEXT_MODULE,
'legacy' => array(
'teacher' => CAP_ALLOW,
'editingteacher' => CAP_ALLOW,
'admin' => CAP_ALLOW,
'student' => CAP_ALLOW,
)
),
);
?> ?>
...@@ -2901,6 +2901,8 @@ function forum_print_post($post, $discussion, $forum, &$cm, $course, $ownpost=fa ...@@ -2901,6 +2901,8 @@ function forum_print_post($post, $discussion, $forum, &$cm, $course, $ownpost=fa
$cm->cache->caps['mod/forum:deleteownpost'] = has_capability('mod/forum:deleteownpost', $modcontext); $cm->cache->caps['mod/forum:deleteownpost'] = has_capability('mod/forum:deleteownpost', $modcontext);
$cm->cache->caps['mod/forum:deleteanypost'] = has_capability('mod/forum:deleteanypost', $modcontext); $cm->cache->caps['mod/forum:deleteanypost'] = has_capability('mod/forum:deleteanypost', $modcontext);
$cm->cache->caps['mod/forum:viewanyrating'] = has_capability('mod/forum:viewanyrating', $modcontext); $cm->cache->caps['mod/forum:viewanyrating'] = has_capability('mod/forum:viewanyrating', $modcontext);
$cm->cache->caps['mod/forum:exportpost'] = has_capability('mod/forum:exportpost', $modcontext);
$cm->cache->caps['mod/forum:exportownpost'] = has_capability('mod/forum:exportownpost', $modcontext);
} }
if (!isset($cm->uservisible)) { if (!isset($cm->uservisible)) {
...@@ -3118,12 +3120,11 @@ function forum_print_post($post, $discussion, $forum, &$cm, $course, $ownpost=fa ...@@ -3118,12 +3120,11 @@ function forum_print_post($post, $discussion, $forum, &$cm, $course, $ownpost=fa
$commands[] = '<a href="'.$CFG->wwwroot.'/mod/forum/post.php?reply='.$post->id.'">'.$strreply.'</a>'; $commands[] = '<a href="'.$CFG->wwwroot.'/mod/forum/post.php?reply='.$post->id.'">'.$strreply.'</a>';
} }
if (true) { // @todo penny replace this later with a capability check if ($cm->cache->caps['mod/forum:exportpost'] || ($ownpost && $cm->cache->caps['mod/forum:exportownpost'])) {
$p = array( $p = array(
'postid' => $post->id, 'postid' => $post->id,
); );
// @todo penny check these arguments when uncommenting $commands[] = portfolio_add_button('forum_portfolio_caller', $p, '/mod/forum/lib.php', PORTFOLIO_ADD_TEXT_LINK, null, true);
//$commands[] = portfolio_add_button('forum_portfolio_caller', $p, '/mod/forum/lib.php', PORTFOLIO_ADD_TEXT_LINK, null, true);
} }
echo '<div class="commands">'; echo '<div class="commands">';
...@@ -3843,6 +3844,7 @@ function forum_print_attachments($post, $cm, $type) { ...@@ -3843,6 +3844,7 @@ function forum_print_attachments($post, $cm, $type) {
$imagereturn = ''; $imagereturn = '';
$output = ''; $output = '';
$canexport = (has_capability('mod/forum:exportpost', $context) || ($post->userid == $USER->id && has_capability('mod/forum:exportownpost')));
if ($files = $fs->get_area_files($context->id, 'forum_attachment', $post->id, "timemodified", false)) { if ($files = $fs->get_area_files($context->id, 'forum_attachment', $post->id, "timemodified", false)) {
foreach ($files as $file) { foreach ($files as $file) {
...@@ -3855,14 +3857,13 @@ function forum_print_attachments($post, $cm, $type) { ...@@ -3855,14 +3857,13 @@ function forum_print_attachments($post, $cm, $type) {
if ($type == 'html') { if ($type == 'html') {
$output .= "<a href=\"$path\">$iconimage</a> "; $output .= "<a href=\"$path\">$iconimage</a> ";
$output .= "<a href=\"$path\">".s($filename)."</a>"; $output .= "<a href=\"$path\">".s($filename)."</a>";
if (true) { // 'todo penny replace this with a capability check if ($canexport) {
require_once($CFG->libdir . '/portfoliolib.php'); require_once($CFG->libdir . '/portfoliolib.php');
$p = array( $p = array(
'postid' => $post->id, 'postid' => $post->id,
'attachment' => 1, 'attachment' => $file->get_id(),
); );
// @todo penny check these arguments when uncommenting $output .= portfolio_add_button('forum_portfolio_caller', $p, '/mod/forum/lib.php', PORTFOLIO_ADD_ICON_LINK, null, true);
//$output .= portfolio_add_button('forum_portfolio_caller', $p, '/mod/forum/lib.php', PORTFOLIO_ADD_ICON_FORM, null, true);
} }
$output .= "<br />"; $output .= "<br />";
...@@ -3873,17 +3874,24 @@ function forum_print_attachments($post, $cm, $type) { ...@@ -3873,17 +3874,24 @@ function forum_print_attachments($post, $cm, $type) {
if (in_array($mimetype, array('image/gif', 'image/jpeg', 'image/png'))) { if (in_array($mimetype, array('image/gif', 'image/jpeg', 'image/png'))) {
// Image attachments don't get printed as links // Image attachments don't get printed as links
$imagereturn .= "<br /><img src=\"$path\" alt=\"\" />"; $imagereturn .= "<br /><img src=\"$path\" alt=\"\" />";
if ($canexport) {
require_once($CFG->libdir . '/portfoliolib.php');
$p = array(
'postid' => $post->id,
'attachment' => $file->get_id(),
);
$imagereturn .= portfolio_add_button('forum_portfolio_caller', $p, '/mod/forum/lib.php', PORTFOLIO_ADD_ICON_LINK, null, true);
}
} else { } else {
$output .= "<a href=\"$path\">$iconimage</a> "; $output .= "<a href=\"$path\">$iconimage</a> ";
$output .= filter_text("<a href=\"$path\">".s($filename)."</a>"); $output .= filter_text("<a href=\"$path\">".s($filename)."</a>");
if (true) { // 'todo penny replace this with a capability check if ($canexport) {
require_once($CFG->libdir . '/portfoliolib.php'); require_once($CFG->libdir . '/portfoliolib.php');
$p = array( $p = array(
'postid' => $post->id, 'postid' => $post->id,
'attachment' => 1, 'attachment' => $file->get_id(),
); );
// @todo penny check these arguments when uncommenting $output .= portfolio_add_button('forum_portfolio_caller', $p, '/mod/forum/lib.php', PORTFOLIO_ADD_ICON_LINK, null, true);
//$output .= portfolio_add_button('forum_portfolio_caller', $p, '/mod/forum/lib.php', PORTFOLIO_ADD_ICON_FORM, null, true);
} }
$output .= '<br />'; $output .= '<br />';
} }
...@@ -7068,6 +7076,7 @@ class forum_portfolio_caller extends portfolio_module_caller_base { ...@@ -7068,6 +7076,7 @@ class forum_portfolio_caller extends portfolio_module_caller_base {
private $forum; private $forum;
private $discussion; private $discussion;
private $attachment; private $attachment;
private $files;
function __construct($callbackargs) { function __construct($callbackargs) {
global $DB; global $DB;
...@@ -7094,14 +7103,17 @@ class forum_portfolio_caller extends portfolio_module_caller_base { ...@@ -7094,14 +7103,17 @@ class forum_portfolio_caller extends portfolio_module_caller_base {
if (!$this->cm = get_coursemodule_from_instance('forum', $this->forum->id)) { if (!$this->cm = get_coursemodule_from_instance('forum', $this->forum->id)) {
print_error('invalidcoursemodule'); print_error('invalidcoursemodule');
} }
$fs = get_file_storage();
if ($this->attachment = (array_key_exists('attachment', $callbackargs) ? $callbackargs['attachment'] : false)) { if ($this->attachment = (array_key_exists('attachment', $callbackargs) ? $callbackargs['attachment'] : false)) {
if (!$this->post) { if (!$this->post) {
print_error('attachmentsnopost', 'forum'); print_error('attachmentsnopost', 'forum');
} }
if (!get_directory_list(forum_file_area($this->post))) { // TODO: rewrite if (!$f = $fs->get_file_by_id($this->attachment)) {
print_error('noattachments', 'forum'); print_error('noattachments', 'forum');
} }
$this->files = array($f);
} }
$this->files = $fs->get_area_files(get_context_instance(CONTEXT_MODULE, $this->cm->id)->id, 'forum_attachment', $this->post->id, "timemodified", false);
} }
function get_return_url() { function get_return_url() {
...@@ -7124,20 +7136,20 @@ class forum_portfolio_caller extends portfolio_module_caller_base { ...@@ -7124,20 +7136,20 @@ class forum_portfolio_caller extends portfolio_module_caller_base {
portfolio_exporter::raise_error('exoprting whole discussion not implemented - see MDL-15758'); portfolio_exporter::raise_error('exoprting whole discussion not implemented - see MDL-15758');
// @todo see MDL-15758 // @todo see MDL-15758
} else { } else {
$status = true;
if ($basedir = forum_file_area($this->post)) {// TODO: rewrite if ($this->files) {
//@todo penny fix all this with files api foreach ($this->files as $f) {
require_once($CFG->dirroot . '/backup/lib.php'); if ($this->attachment && $f->get_id() != $this->attachment) {
$status = backup_copy_file($basedir, $tempdir); continue; // support multipe files later
if ($this->attachment) { }
return $status; // all we need to do $status = $status && $this->get('exporter')->copy_existing_file($f);
if ($this->attachment && $f->get_id() == $this->attachment) {
return $status; // all we need to do
}
} }
} }
$post = $this->prepare_post($this->post); $post = $this->prepare_post($this->post);
// @todo penny convert to files api $status = $status && $this->get('exporter')->write_new_file($post, 'post.html');
$status = $status && ($handle = fopen($tempdir . '/post.html', 'w'));
$status = $status && fwrite($handle, $post);
$status = $status && fclose($handle);
return $status; return $status;
} }
} }
...@@ -7186,16 +7198,12 @@ class forum_portfolio_caller extends portfolio_module_caller_base { ...@@ -7186,16 +7198,12 @@ class forum_portfolio_caller extends portfolio_module_caller_base {
$output .= $formattedtext; $output .= $formattedtext;
if ($post->attachment) { if ($this->files) {
$post->course = $this->get('course')->id; $post->course = $this->get('course')->id;
$output .= '<div class="attachments">'; $output .= '<div class="attachments">';
if ($basedir = forum_file_area($this->post)) { //TODO: rewrite $output .= '<br /><b>' . get_string('attachments', 'forum') . '</b>:<br /><br />';
if ($files = get_directory_list($basedir)) { foreach ($this->files as $file) {
$output .= '<br /><b>' . get_string('attachments', 'forum') . '</b>:<br /><br />'; $output .= $file->get_filename() . '<br />';
foreach ($files as $file) {
$output .= clean_filename($file) . '<br />';
}
}
} }
$output .= "</div>"; $output .= "</div>";
} }
...@@ -7208,16 +7216,16 @@ class forum_portfolio_caller extends portfolio_module_caller_base { ...@@ -7208,16 +7216,16 @@ class forum_portfolio_caller extends portfolio_module_caller_base {
function get_sha1() { function get_sha1() {
if ($this->post) { if ($this->post) {
$attachsha1 = ''; $attachsha1 = '';
if ($basedir = forum_file_area($this->post)) { //TODO: rewrite if ($this->files) {
$sha1s = array(); $sha1s = array();
foreach (get_directory_list($basedir) as $file) { foreach ($this->files as $file) {
$sha1s[] = sha1_file($basedir . '/' . $file); if ($this->attachment && $file->get_id() == $this->attachment) {
return $file->get_contenthash(); // all we have to do
}
$sha1s[] = $file->get_contenthash();
} }
asort($sha1s); asort($sha1s);
$attachsha1 = sha1(implode('', $sha1s)); $attachsha1 = sha1(implode('', $sha1s));
if ($this->attachment) {
return $attachsha1; // all we have to do
}
} }
return sha1($attachsha1 . ',' . $this->post->subject . ',' . $this->post->message); return sha1($attachsha1 . ',' . $this->post->subject . ',' . $this->post->message);
} }
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
// This fragment is called by /admin/index.php // This fragment is called by /admin/index.php
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
$module->version = 2008081605; $module->version = 2008081800;
$module->requires = 2008081600; // Requires this Moodle version $module->requires = 2008081600; // Requires this Moodle version
$module->cron = 60; $module->cron = 60;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment