. /** * Plugin version and other meta-data are defined here. * * @package tool_policy * @copyright 2018 David Mudrák * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die(); use core_user\output\myprofile\tree; use tool_policy\api; use tool_policy\policy_version; /** * Add nodes to myprofile page. * * @param tree $tree Tree object * @param stdClass $user User object * @param bool $iscurrentuser * @param stdClass $course Course object * @return bool * @throws coding_exception * @throws dml_exception * @throws moodle_exception */ function tool_policy_myprofile_navigation(tree $tree, $user, $iscurrentuser, $course) { global $CFG; // Do nothing if we are not set as the site policies handler. if (empty($CFG->sitepolicyhandler) || $CFG->sitepolicyhandler !== 'tool_policy') { return; } // Get the Privacy and policies category. if (!array_key_exists('privacyandpolicies', $tree->__get('categories'))) { // Create the category. $categoryname = get_string('privacyandpolicies', 'admin'); $category = new core_user\output\myprofile\category('privacyandpolicies', $categoryname, 'contact'); $tree->add_category($category); } else { // Get the existing category. $category = $tree->__get('categories')['privacyandpolicies']; } // Add "Policies and agreements" node only for current user or users who can accept on behalf of current user. $usercontext = \context_user::instance($user->id); if ($iscurrentuser || has_capability('tool/policy:acceptbehalf', $usercontext)) { $url = new moodle_url('/admin/tool/policy/user.php', ['userid' => $user->id]); $node = new core_user\output\myprofile\node('privacyandpolicies', 'tool_policy', get_string('policiesagreements', 'tool_policy'), null, $url); $category->add_node($node); } return true; } /** * Load policy message for guests. * * @return string The HTML code to insert before the head. */ function tool_policy_before_standard_html_head() { global $CFG, $PAGE, $USER; $message = null; if (!empty($CFG->sitepolicyhandler) && $CFG->sitepolicyhandler == 'tool_policy' && empty($USER->policyagreed) && (isguestuser() || !isloggedin())) { $output = $PAGE->get_renderer('tool_policy'); try { $page = new \tool_policy\output\guestconsent(); $message = $output->render($page); } catch (dml_read_exception $e) { // During upgrades, the new plugin code with new SQL could be in place but the DB not upgraded yet. $message = null; } } return $message; } /** * Callback to add footer elements. * * @return string HTML footer content */ function tool_policy_standard_footer_html() { global $CFG, $PAGE; $output = ''; if (!empty($CFG->sitepolicyhandler) && $CFG->sitepolicyhandler == 'tool_policy') { $policies = api::get_current_versions_ids(); if (!empty($policies)) { $url = new moodle_url('/admin/tool/policy/viewall.php', ['returnurl' => $PAGE->url]); $output .= html_writer::link($url, get_string('userpolicysettings', 'tool_policy')); $output = html_writer::div($output, 'policiesfooter'); } } return $output; } /** * Hooks redirection to policy acceptance pages before sign up. */ function tool_policy_pre_signup_requests() { global $CFG; // Do nothing if we are not set as the site policies handler. if (empty($CFG->sitepolicyhandler) || $CFG->sitepolicyhandler !== 'tool_policy') { return; } $policies = api::get_current_versions_ids(policy_version::AUDIENCE_LOGGEDIN); $userpolicyagreed = cache::make('core', 'presignup')->get('tool_policy_userpolicyagreed'); if (!empty($policies) && !$userpolicyagreed) { // Redirect to "Policy" pages for consenting before creating the user. cache::make('core', 'presignup')->set('tool_policy_issignup', 1); redirect(new \moodle_url('/admin/tool/policy/index.php')); } } /** * Serve the embedded files. * * @param stdClass $course the course object * @param stdClass $cm the course module object * @param stdClass $context the context * @param string $filearea the name of the file area * @param array $args extra arguments (itemid, path) * @param bool $forcedownload whether or not force download * @param array $options additional options affecting the file serving * @return bool false if the file not found, just send the file otherwise and do not return anything */ function tool_policy_pluginfile($course, $cm, $context, $filearea, $args, $forcedownload, array $options=array()) { global $CFG, $PAGE; // Do not allow access to files if we are not set as the site policy handler. if (empty($CFG->sitepolicyhandler) || $CFG->sitepolicyhandler !== 'tool_policy') { return false; } if ($context->contextlevel != CONTEXT_SYSTEM) { return false; } $PAGE->set_context($context); if ($filearea !== 'policydocumentsummary' && $filearea !== 'policydocumentcontent') { return false; } $itemid = array_shift($args); $policy = api::get_policy_version($itemid); if ($policy->status != policy_version::STATUS_ACTIVE) { require_login(); } if (!api::can_user_view_policy_version($policy)) { return false; } $filename = array_pop($args); if (!$args) { $filepath = '/'; } else { $filepath = '/'.implode('/', $args).'/'; } $fs = get_file_storage(); $file = $fs->get_file($context->id, 'tool_policy', $filearea, $itemid, $filepath, $filename); if (!$file) { return false; } send_stored_file($file, null, 0, $forcedownload, $options); } /** * Map icons for font-awesome themes. */ function tool_policy_get_fontawesome_icon_map() { return [ 'tool_policy:agreed' => 'fa-check text-success', 'tool_policy:declined' => 'fa-times text-danger', 'tool_policy:pending' => 'fa-clock-o text-warning', 'tool_policy:partial' => 'fa-exclamation-triangle text-warning', 'tool_policy:level' => 'fa-level-up fa-rotate-90 text-muted', ]; } /** * Serve the new group form as a fragment. * * @param array $args List of named arguments for the fragment loader. * @return string */ function tool_policy_output_fragment_accept_on_behalf($args) { $args = (object) $args; $data = []; if (!empty($args->jsonformdata)) { $serialiseddata = json_decode($args->jsonformdata); parse_str($serialiseddata, $data); } $mform = new \tool_policy\form\accept_policy(null, $data); if (!empty($args->jsonformdata)) { // If we were passed non-empty form data we want the mform to call validation functions and show errors. $mform->is_validated(); } return $mform->render(); }