Merge branch 'MDL-36051_24' of git://github.com/rlorenzo/moodle
authorDan Poltawski <dan@moodle.com>
Thu, 8 Nov 2012 07:09:59 +0000 (15:09 +0800)
committerDan Poltawski <dan@moodle.com>
Thu, 8 Nov 2012 07:09:59 +0000 (15:09 +0800)
1  2 
mod/assign/locallib.php

@@@ -4548,250 -4547,3 +4550,250 @@@ class assign 
  
  }
  
- }
 +/**
 + * portfolio caller class for mod_assign.
 + *
 + * @package   mod_assign
 + * @copyright 2012 NetSpot {@link http://www.netspot.com.au}
 + * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 + */
 +class assign_portfolio_caller extends portfolio_module_caller_base {
 +
 +    /** @var int callback arg - the id of submission we export */
 +    protected $sid;
 +
 +    /** @var string component of the submission files we export*/
 +    protected $component;
 +
 +    /** @var string callback arg - the area of submission files we export */
 +    protected $area;
 +
 +    /** @var int callback arg - the id of file we export */
 +    protected $fileid;
 +
 +    /** @var int callback arg - the cmid of the assignment we export */
 +    protected $cmid;
 +
 +    /** @var string callback arg - the plugintype of the editor we export */
 +    protected $plugin;
 +
 +    /** @var string callback arg - the name of the editor field we export */
 +    protected $editor;
 +
 +   /**
 +    * callback arg for a single file export
 +    */
 +    public static function expected_callbackargs() {
 +        return array(
 +            'cmid' => true,
 +            'sid' => false,
 +            'area' => false,
 +            'component' => false,
 +            'fileid' => false,
 +            'plugin' => false,
 +            'editor' => false,
 +       );
 +    }
 +
 +    /**
 +     * the constructor
 +     * @param array $callbackargs
 +     */
 +    function __construct($callbackargs) {
 +        parent::__construct($callbackargs);
 +        $this->cm = get_coursemodule_from_id('assign', $this->cmid, 0, false, MUST_EXIST);
 +    }
 +
 +    /**
 +     *
 +     * Load data needed for the portfolio export
 +     *
 +     * If the assignment type implements portfolio_load_data(), the processing is delegated
 +     * to it. Otherwise, the caller must provide either fileid (to export single file) or
 +     * submissionid and filearea (to export all data attached to the given submission file area) via callback arguments.
 +     *
 +     * @throws     portfolio_caller_exception
 +     */
 +    public function load_data() {
 +
 +        $context = context_module::instance($this->cmid);
 +
 +        if (empty($this->fileid)) {
 +            if (empty($this->sid) || empty($this->area)) {
 +                throw new portfolio_caller_exception('invalidfileandsubmissionid', 'mod_assign');
 +            }
 +
 +        }
 +
 +        // export either an area of files or a single file (see function for more detail)
 +        // the first arg is an id or null. If it is an id, the rest of the args are ignored
 +        // if it is null, the rest of the args are used to load a list of files from get_areafiles
 +        $this->set_file_and_format_data($this->fileid, $context->id, $this->component, $this->area, $this->sid, 'timemodified', false);
 +
 +    }
 +
 +    /**
 +     * prepares the package up before control is passed to the portfolio plugin.
 +     *
 +     * @throws portfolio_caller_exception
 +     * @return mixed
 +     */
 +    public function prepare_package() {
 +
 +        if ($this->plugin && $this->editor) {
 +            $options = portfolio_format_text_options();
 +            $context = context_module::instance($this->cmid);
 +            $options->context = $context;
 +
 +            $plugin = $this->get_submission_plugin();
 +
 +            $text = $plugin->get_editor_text($this->editor, $this->sid);
 +            $format = $plugin->get_editor_format($this->editor, $this->sid);
 +
 +            $html = format_text($text, $format, $options);
 +            $html = portfolio_rewrite_pluginfile_urls($html, $context->id, 'mod_assign', $this->area, $this->sid, $this->exporter->get('format'));
 +
 +            if (in_array($this->exporter->get('formatclass'), array(PORTFOLIO_FORMAT_PLAINHTML, PORTFOLIO_FORMAT_RICHHTML))) {
 +                if ($files = $this->exporter->get('caller')->get('multifiles')) {
 +                    foreach ($files as $file) {
 +                        $this->exporter->copy_existing_file($file);
 +                    }
 +                }
 +                return $this->exporter->write_new_file($html, 'assignment.html', !empty($files));
 +            } else if ($this->exporter->get('formatclass') == PORTFOLIO_FORMAT_LEAP2A) {
 +                $leapwriter = $this->exporter->get('format')->leap2a_writer();
 +                $entry = new portfolio_format_leap2a_entry($this->area . $this->cmid, print_context_name($context), 'resource', $html);
 +
 +                $entry->add_category('web', 'resource_type');
 +                $entry->author = $this->user;
 +                $leapwriter->add_entry($entry);
 +                if ($files = $this->exporter->get('caller')->get('multifiles')) {
 +                    $leapwriter->link_files($entry, $files, $this->area . $this->cmid . 'file');
 +                    foreach ($files as $file) {
 +                        $this->exporter->copy_existing_file($file);
 +                    }
 +                }
 +                return $this->exporter->write_new_file($leapwriter->to_xml(), $this->exporter->get('format')->manifest_name(), true);
 +            } else {
 +                debugging('invalid format class: ' . $this->exporter->get('formatclass'));
 +            }
 +
 +        }
 +
 +
 +        if ($this->exporter->get('formatclass') == PORTFOLIO_FORMAT_LEAP2A) {
 +            $leapwriter = $this->exporter->get('format')->leap2a_writer();
 +            $files = array();
 +            if ($this->singlefile) {
 +                $files[] = $this->singlefile;
 +            } elseif ($this->multifiles) {
 +                $files = $this->multifiles;
 +            } else {
 +                throw new portfolio_caller_exception('invalidpreparepackagefile', 'portfolio', $this->get_return_url());
 +            }
 +
 +            $entryids = array();
 +            foreach ($files as $file) {
 +                $entry = new portfolio_format_leap2a_file($file->get_filename(), $file);
 +                $entry->author = $this->user;
 +                $leapwriter->add_entry($entry);
 +                $this->exporter->copy_existing_file($file);
 +                $entryids[] = $entry->id;
 +            }
 +            if (count($files) > 1) {
 +                $baseid = 'assign' . $this->cmid . $this->area;
 +                $context = context_module::instance($this->cmid);
 +
 +                // if we have multiple files, they should be grouped together into a folder
 +                $entry = new portfolio_format_leap2a_entry($baseid . 'group', print_context_name($context), 'selection');
 +                $leapwriter->add_entry($entry);
 +                $leapwriter->make_selection($entry, $entryids, 'Folder');
 +            }
 +            return $this->exporter->write_new_file($leapwriter->to_xml(), $this->exporter->get('format')->manifest_name(), true);
 +        }
 +        return $this->prepare_package_file();
 +    }
 +
 +    /**
 +     * fetch the plugin by its type
 +     *
 +     * @return assign_submission_plugin
 +     */
 +    private function get_submission_plugin() {
 +        global $CFG;
 +        if (!$this->plugin || !$this->cmid) {
 +            return null;
 +        }
 +
 +        require_once($CFG->dirroot . '/mod/assign/locallib.php');
 +
 +        $context = context_module::instance($this->cmid);
 +
 +        $assignment = new assign($context, null, null);
 +        return $assignment->get_submission_plugin_by_type($this->plugin);
 +    }
 +
 +    /**
 +     * get sha1 file
 +     * calculate a sha1 has of either a single file or a list
 +     * of files based on the data set by load_data
 +     *
 +     * @return string
 +     */
 +    public function get_sha1() {
 +
 +        if ($this->plugin && $this->editor) {
 +            $plugin = $this->get_submission_plugin();
 +            $options = portfolio_format_text_options();
 +            $options->context = context_module::instance($this->cmid);
 +
 +            $textsha1 = sha1(format_text($plugin->get_editor_text($this->editor, $this->sid),
 +                                         $plugin->get_editor_format($this->editor, $this->sid), $options));
 +            $filesha1 = '';
 +            try {
 +                $filesha1 = $this->get_sha1_file();
 +            } catch (portfolio_caller_exception $e) {} // no files
 +            return sha1($textsha1 . $filesha1);
 +        }
 +        return $this->get_sha1_file();
 +    }
 +
 +    /**
 +     * calculate the time to transfer either a single file or a list
 +     * of files based on the data set by load_data
 +     *
 +     * @return int
 +     */
 +    public function expected_time() {
 +        return $this->expected_time_file();
 +    }
 +
 +    /**
 +     * checking the permissions
 +     *
 +     * @return bool
 +     */
 +    public function check_permissions() {
 +        $context = context_module::instance($this->cmid);
 +        return has_capability('mod/assign:exportownsubmission', $context);
 +    }
 +
 +    /**
 +     * display a module name
 +     *
 +     * @return string
 +     */
 +    public static function display_name() {
 +        return get_string('modulename', 'assign');
 +    }
 +
 +    /**
 +     * return array of formats supported by this portfolio call back
 +     * @return array
 +     */
 +    public static function base_supported_formats() {
 +
 +        return array(PORTFOLIO_FORMAT_FILE, PORTFOLIO_FORMAT_LEAP2A);
 +
 +    }
++}