diff --git a/admin/environment.xml b/admin/environment.xml
index 1fc8ce1f4e3..f281b45e528 100644
--- a/admin/environment.xml
+++ b/admin/environment.xml
@@ -1696,6 +1696,11 @@
+
+
+
+
+
diff --git a/lang/en/admin.php b/lang/en/admin.php
index 8607a812def..4ffb7054d8c 100644
--- a/lang/en/admin.php
+++ b/lang/en/admin.php
@@ -1073,6 +1073,7 @@ $string['unbookmarkthispage'] = 'Unbookmark this page';
$string['unicoderequired'] = 'It is required that you store all your data in Unicode format (UTF-8). New installations must be performed into databases that have their default character set as Unicode. If you are upgrading, you should perform the UTF-8 migration process (see the Admin page).';
$string['uninstallplugin'] = 'Uninstall';
$string['unlockaccount'] = 'Unlock account';
+$string['unoconvwarning'] = 'The installed version of your unoconv is not supported, the required version to support assignment grading features is 0.7.';
$string['unsettheme'] = 'Unset theme';
$string['unsupported'] = 'Unsupported';
$string['unsupporteddbstorageengine'] = 'The database storage engine being used is no longer supported.';
diff --git a/lib/filestorage/file_storage.php b/lib/filestorage/file_storage.php
index e4b1dde181f..9a528d2f16a 100644
--- a/lib/filestorage/file_storage.php
+++ b/lib/filestorage/file_storage.php
@@ -56,6 +56,24 @@ class file_storage {
/** @var array List of formats supported by unoconv */
private $unoconvformats;
+ // Unoconv constants.
+ /** No errors */
+ const UNOCONVPATH_OK = 'ok';
+ /** Not set */
+ const UNOCONVPATH_EMPTY = 'empty';
+ /** Does not exist */
+ const UNOCONVPATH_DOESNOTEXIST = 'doesnotexist';
+ /** Is a dir */
+ const UNOCONVPATH_ISDIR = 'isdir';
+ /** Not executable */
+ const UNOCONVPATH_NOTEXECUTABLE = 'notexecutable';
+ /** Test file missing */
+ const UNOCONVPATH_NOTESTFILE = 'notestfile';
+ /** Version not supported */
+ const UNOCONVPATH_VERSIONNOTSUPPORTED = 'versionnotsupported';
+ /** Any other error */
+ const UNOCONVPATH_ERROR = 'error';
+
/**
* Constructor - do not use directly use {@link get_file_storage()} call instead.
@@ -213,6 +231,94 @@ class file_storage {
return in_array($sanitized, $this->unoconvformats);
}
+ /**
+ * Check if the installed version of unoconv is supported.
+ *
+ * @return bool true if the present version is supported, false otherwise.
+ */
+ public static function can_convert_documents() {
+ global $CFG;
+ $unoconvbin = \escapeshellarg($CFG->pathtounoconv);
+ $command = "$unoconvbin --version";
+ exec($command, $output);
+ preg_match('/([0-9]+\.[0-9]+)/', $output[0], $matches);
+ $currentversion = (float)$matches[0];
+ $supportedversion = 0.7;
+ if ($currentversion < $supportedversion) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * If the test pdf has been generated correctly and send it direct to the browser.
+ */
+ public static function send_test_pdf() {
+ global $CFG;
+ require_once($CFG->libdir . '/filelib.php');
+
+ $filerecord = array(
+ 'contextid' => \context_system::instance()->id,
+ 'component' => 'test',
+ 'filearea' => 'assignfeedback_editpdf',
+ 'itemid' => 0,
+ 'filepath' => '/',
+ 'filename' => 'unoconv_test.docx'
+ );
+
+ // Get the fixture doc file content and generate and stored_file object.
+ $fs = get_file_storage();
+ $fixturefile = $CFG->libdir . '/tests/fixtures/unoconv-source.docx';
+ $fixturedata = file_get_contents($fixturefile);
+ $testdocx = $fs->get_file($filerecord['contextid'], $filerecord['component'], $filerecord['filearea'],
+ $filerecord['itemid'], $filerecord['filepath'], $filerecord['filename']);
+ if (!$testdocx) {
+ $testdocx = $fs->create_file_from_string($filerecord, $fixturedata);
+
+ }
+
+ // Convert the doc file to pdf and send it direct to the browser.
+ $result = $fs->get_converted_document($testdocx, 'pdf');
+ readfile_accel($result, 'application/pdf', true);
+ }
+
+ /**
+ * Check if unoconv configured path is correct and working.
+ *
+ * @return \stdClass an object with the test status and the UNOCONVPATH_ constant message.
+ */
+ public static function test_unoconv_path() {
+ global $CFG;
+ $unoconvpath = $CFG->pathtounoconv;
+
+ $ret = new \stdClass();
+ $ret->status = self::UNOCONVPATH_OK;
+ $ret->message = null;
+
+ if (empty($unoconvpath)) {
+ $ret->status = self::UNOCONVPATH_EMPTY;
+ return $ret;
+ }
+ if (!file_exists($unoconvpath)) {
+ $ret->status = self::UNOCONVPATH_DOESNOTEXIST;
+ return $ret;
+ }
+ if (is_dir($unoconvpath)) {
+ $ret->status = self::UNOCONVPATH_ISDIR;
+ return $ret;
+ }
+ if (!file_is_executable($unoconvpath)) {
+ $ret->status = self::UNOCONVPATH_NOTEXECUTABLE;
+ return $ret;
+ }
+ if (!\file_storage::can_convert_documents()) {
+ $ret->status = self::UNOCONVPATH_VERSIONNOTSUPPORTED;
+ return $ret;
+ }
+
+ return $ret;
+ }
/**
* Perform a file format conversion on the specified document.
diff --git a/lib/upgradelib.php b/lib/upgradelib.php
index 57ab054376b..969eeb7ed9d 100644
--- a/lib/upgradelib.php
+++ b/lib/upgradelib.php
@@ -2282,3 +2282,27 @@ function upgrade_install_plugins(array $installable, $confirmed, $heading='', $c
die();
}
}
+/**
+ * Method used to check the installed unoconv version.
+ *
+ * @param environment_results $result object to update, if relevant.
+ * @return environment_results|null updated results or null if unoconv path is not executable.
+ */
+function check_unoconv_version(environment_results $result) {
+ global $CFG;
+
+ if (!during_initial_install() && !empty($CFG->pathtounoconv) && file_is_executable(trim($CFG->pathtounoconv))) {
+ $unoconvbin = \escapeshellarg($CFG->pathtounoconv);
+ $command = "$unoconvbin --version";
+ exec($command, $output);
+ preg_match('/([0-9]+\.[0-9]+)/', $output[0], $matches);
+ $currentversion = (float)$matches[0];
+ $supportedversion = 0.7;
+ if ($currentversion < $supportedversion) {
+ $result->setInfo('unoconv version not supported');
+ $result->setStatus(false);
+ return $result;
+ }
+ }
+ return null;
+}
diff --git a/mod/assign/feedback/editpdf/lang/en/assignfeedback_editpdf.php b/mod/assign/feedback/editpdf/lang/en/assignfeedback_editpdf.php
index 1b8fc754ef1..5f0db7e2b7e 100644
--- a/mod/assign/feedback/editpdf/lang/en/assignfeedback_editpdf.php
+++ b/mod/assign/feedback/editpdf/lang/en/assignfeedback_editpdf.php
@@ -53,6 +53,7 @@ $string['gotopage'] = 'Go to page';
$string['green'] = 'Green';
$string['gsimage'] = 'Ghostscript test image';
$string['pathtogspathdesc'] = 'Please note that annotate PDF requires the path to ghostscript to be set in {$a}.';
+$string['pathtounoconvpathdesc'] = 'Please note that annotate PDF requires the path to unoconv to be set in {$a}.';
$string['highlight'] = 'Highlight';
$string['jsrequired'] = 'JavaScript is required to annotate a PDF. Please enable JavaScript in your browser to use this feature.';
$string['launcheditor'] = 'Launch PDF editor...';
@@ -83,6 +84,16 @@ $string['test_isdir'] = 'The ghostscript path points to a folder, please include
$string['test_notestfile'] = 'The test PDF is missing';
$string['test_notexecutable'] = 'The ghostscript points to a file that is not executable';
$string['test_ok'] = 'The ghostscript path appears to be OK - please check you can see the message in the image below';
+$string['test_doesnotexist'] = 'The ghostscript path points to a non-existent file';
+$string['test_empty'] = 'The ghostscript path is empty - please enter the correct path';
+$string['test_unoconv'] = 'Test unoconv path';
+$string['test_unoconvdoesnotexist'] = 'The unoconv path does not point to the unoconv program. Please review your path settings.';
+$string['test_unoconvdownload'] = 'Download converted pdf test file.';
+$string['test_unoconvisdir'] = 'The unoconv path points to a folder, please include the unoconv program in the path you specify';
+$string['test_unoconvnotestfile'] = 'The test DOC is missing';
+$string['test_unoconvnotexecutable'] = 'The unoconv points to a file that is not executable';
+$string['test_unoconvok'] = 'The unoconv path appears to properly configured.';
+$string['test_unoconvversionnotsupported'] = 'The minimum supported version for unoconv is 0.7';
$string['toolbarbutton'] = '{$a->tool} {$a->shortcut}';
$string['tool'] = 'Tool';
$string['viewfeedbackonline'] = 'View annotated PDF...';
diff --git a/mod/assign/feedback/editpdf/settings.php b/mod/assign/feedback/editpdf/settings.php
index 674a21f7dc5..54545438a18 100644
--- a/mod/assign/feedback/editpdf/settings.php
+++ b/mod/assign/feedback/editpdf/settings.php
@@ -42,3 +42,13 @@ $settings->add(new admin_setting_heading('pathtogs', get_string('pathtogs', 'adm
$url = new moodle_url('/mod/assign/feedback/editpdf/testgs.php');
$link = html_writer::link($url, get_string('testgs', 'assignfeedback_editpdf'));
$settings->add(new admin_setting_heading('testgs', '', $link));
+
+// Unoconv setting.
+$systempathslink = new moodle_url('/admin/settings.php', array('section' => 'systempaths'));
+$systempathlink = html_writer::link($systempathslink, get_string('systempaths', 'admin'));
+$settings->add(new admin_setting_heading('pathtounoconv', get_string('pathtounoconv', 'admin'),
+ get_string('pathtounoconvpathdesc', 'assignfeedback_editpdf', $systempathlink)));
+
+$url = new moodle_url('/mod/assign/feedback/editpdf/testunoconv.php');
+$link = html_writer::link($url, get_string('test_unoconv', 'assignfeedback_editpdf'));
+$settings->add(new admin_setting_heading('test_unoconv', '', $link));
\ No newline at end of file
diff --git a/mod/assign/feedback/editpdf/testunoconv.php b/mod/assign/feedback/editpdf/testunoconv.php
new file mode 100644
index 00000000000..c3d4d4c0793
--- /dev/null
+++ b/mod/assign/feedback/editpdf/testunoconv.php
@@ -0,0 +1,74 @@
+.
+/**
+ * Test that unoconv is configured correctly
+ *
+ * @package assignfeedback_editpdf
+ * @copyright 2016 Simey Lameze
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+require(dirname(__FILE__) . '/../../../../config.php');
+require_once($CFG->libdir . '/filelib.php');
+
+$sendpdf = optional_param('sendpdf', 0, PARAM_BOOL);
+
+$PAGE->set_url(new moodle_url('/mod/assign/feedback/editpdf/testunoconv.php'));
+$PAGE->set_context(context_system::instance());
+
+require_login();
+require_capability('moodle/site:config', context_system::instance());
+
+$strheading = get_string('test_unoconv', 'assignfeedback_editpdf');
+$PAGE->navbar->add(get_string('administrationsite'));
+$PAGE->navbar->add(get_string('plugins', 'admin'));
+$PAGE->navbar->add(get_string('assignmentplugins', 'mod_assign'));
+$PAGE->navbar->add(get_string('feedbackplugins', 'mod_assign'));
+$PAGE->navbar->add(get_string('pluginname', 'assignfeedback_editpdf'),
+ new moodle_url('/admin/settings.php', array('section' => 'assignfeedback_editpdf')));
+$PAGE->navbar->add($strheading);
+$PAGE->set_heading($strheading);
+$PAGE->set_title($strheading);
+if ($sendpdf) {
+ require_sesskey();
+ // Serve the generated test pdf.
+ file_storage::send_test_pdf();
+ die();
+}
+
+$result = file_storage::test_unoconv_path();
+switch ($result->status) {
+ case file_storage::UNOCONVPATH_OK:
+ $msg = get_string('test_unoconvok', 'assignfeedback_editpdf');
+ $msg .= html_writer::empty_tag('br');
+ $pdflink = new moodle_url($PAGE->url, array('sendpdf' => 1, 'sesskey' => sesskey()));
+ $msg .= html_writer::link($pdflink, get_string('test_unoconvdownload', 'assignfeedback_editpdf'));
+ $msg .= html_writer::empty_tag('br');
+ break;
+
+ case file_storage::UNOCONVPATH_ERROR:
+ $msg = $result->message;
+ break;
+
+ default:
+ $msg = get_string("test_unoconv{$result->status}", 'assignfeedback_editpdf');
+ break;
+}
+$returl = new moodle_url('/admin/settings.php', array('section' => 'assignfeedback_editpdf'));
+$msg .= $OUTPUT->continue_button($returl);
+
+echo $OUTPUT->header();
+echo $OUTPUT->box($msg, 'generalbox');
+echo $OUTPUT->footer();
diff --git a/version.php b/version.php
index 334e6251474..d70307e70b3 100644
--- a/version.php
+++ b/version.php
@@ -29,7 +29,7 @@
defined('MOODLE_INTERNAL') || die();
-$version = 2016051300.01; // YYYYMMDD = weekly release date of this DEV branch.
+$version = 2016051300.02; // YYYYMMDD = weekly release date of this DEV branch.
// RR = release increments - 00 in DEV branches.
// .XX = incremental changes.