AutorÃa | Ultima modificación | Ver Log |
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle 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 3 of the License, or
// (at your option) any later version.
//
// Moodle 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 Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace core_question\local\bank;
/**
* Tracks all the contexts related to the one we are currently editing questions and provides helper methods to check permissions.
*
* @package core_question
* @copyright 2007 Jamie Pratt me@jamiep.org
* @author 2021 Safat Shahin <safatshahin@catalyst-au.net>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class question_edit_contexts {
/**
* @var \string[][] array of the capabilities.
*/
public static $caps = [
'editq' => [
'moodle/question:add',
'moodle/question:editmine',
'moodle/question:editall',
'moodle/question:viewmine',
'moodle/question:viewall',
'moodle/question:usemine',
'moodle/question:useall',
'moodle/question:movemine',
'moodle/question:moveall'],
'questions' => [
'moodle/question:add',
'moodle/question:editmine',
'moodle/question:editall',
'moodle/question:viewmine',
'moodle/question:viewall',
'moodle/question:movemine',
'moodle/question:moveall'],
'categories' => [
'moodle/question:managecategory'],
'import' => [
'moodle/question:add'],
'export' => [
'moodle/question:viewall',
'moodle/question:viewmine']];
/**
* @var array of contexts.
*/
protected $allcontexts;
/**
* Constructor
* @param \context $thiscontext the current context.
*/
public function __construct(\context $thiscontext) {
$this->allcontexts = array_values($thiscontext->get_parent_contexts(true));
}
/**
* Get all the contexts.
*
* @return \context[] all parent contexts
*/
public function all() {
return $this->allcontexts;
}
/**
* Get the lowest context.
*
* @return \context lowest context which must be either the module or course context
*/
public function lowest() {
return $this->allcontexts[0];
}
/**
* Get the contexts having cap.
*
* @param string $cap capability
* @return \context[] parent contexts having capability, zero based index
*/
public function having_cap($cap) {
$contextswithcap = [];
foreach ($this->allcontexts as $context) {
if (has_capability($cap, $context)) {
$contextswithcap[] = $context;
}
}
return $contextswithcap;
}
/**
* Get the contexts having at least one cap.
*
* @param array $caps capabilities
* @return \context[] parent contexts having at least one of $caps, zero based index
*/
public function having_one_cap($caps) {
$contextswithacap = [];
foreach ($this->allcontexts as $context) {
foreach ($caps as $cap) {
if (has_capability($cap, $context)) {
$contextswithacap[] = $context;
break; // Done with caps loop.
}
}
}
return $contextswithacap;
}
/**
* Context having at least one cap.
*
* @param string $tabname edit tab name
* @return \context[] parent contexts having at least one of $caps, zero based index
*/
public function having_one_edit_tab_cap($tabname) {
return $this->having_one_cap(self::$caps[$tabname]);
}
/**
* Contexts for adding question and also using it.
*
* @return \context[] those contexts where a user can add a question and then use it.
*/
public function having_add_and_use() {
$contextswithcap = [];
foreach ($this->allcontexts as $context) {
if (!has_capability('moodle/question:add', $context)) {
continue;
}
if (!has_any_capability(['moodle/question:useall', 'moodle/question:usemine'], $context)) {
continue;
}
$contextswithcap[] = $context;
}
return $contextswithcap;
}
/**
* Has at least one parent context got the cap $cap?
*
* @param string $cap capability
* @return boolean
*/
public function have_cap($cap) {
return (count($this->having_cap($cap)));
}
/**
* Has at least one parent context got one of the caps $caps?
*
* @param array $caps capability
* @return boolean
*/
public function have_one_cap($caps) {
foreach ($caps as $cap) {
if ($this->have_cap($cap)) {
return true;
}
}
return false;
}
/**
* Has at least one parent context got one of the caps for actions on $tabname
*
* @param string $tabname edit tab name
* @return boolean
*/
public function have_one_edit_tab_cap($tabname) {
return $this->have_one_cap(self::$caps[$tabname]);
}
/**
* Throw error if at least one parent context hasn't got the cap $cap
*
* @param string $cap capability
*/
public function require_cap($cap) {
if (!$this->have_cap($cap)) {
throw new \moodle_exception('nopermissions', '', '', $cap);
}
}
/**
* Throw error if at least one parent context hasn't got one of the caps $caps
*
* @param array $caps capabilities
*/
public function require_one_cap($caps) {
if (!$this->have_one_cap($caps)) {
$capsstring = join(', ', $caps);
throw new \moodle_exception('nopermissions', '', '', $capsstring);
}
}
/**
* Throw error if at least one parent context hasn't got one of the caps $caps
*
* @param string $tabname edit tab name
*/
public function require_one_edit_tab_cap($tabname) {
if (!$this->have_one_edit_tab_cap($tabname)) {
throw new \moodle_exception('nopermissions', '', '', 'access question edit tab '.$tabname);
}
}
}