Proyectos de Subversion Moodle

Rev

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 tool_courserating;

use required_capability_exception;
use tool_courserating\local\models\rating;

/**
 * Permission checks
 *
 * @package     tool_courserating
 * @copyright   2022 Marina Glancy <marina.glancy@gmail.com>
 * @license     https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
class permission {

    /**
     * User can view rating for the course (ratings are enabled for this course)
     *
     * @param int $courseid
     * @return bool
     */
    public static function can_view_ratings(int $courseid): bool {
        global $USER;
        if (helper::get_course_rating_mode($courseid) == constants::RATEBY_NOONE) {
            return false;
        }
        $course = get_course($courseid);
        $context = \context_course::instance($courseid);
        return \core_course_category::can_view_course_info($course) ||
            is_enrolled($context, $USER, '', true);
    }

    /**
     * Can the current user add a rating for the specified course
     *
     * Example of checking last access:
     *     $lastaccess = $DB->get_field('user_lastaccess', 'timeaccess', ['userid' => $USER->id, 'courseid' => $courseid]);
     *
     * @param int $courseid
     * @return bool
     * @throws \coding_exception
     */
    public static function can_add_rating(int $courseid): bool {
        global $CFG, $USER;
        if (!has_capability('tool/courserating:rate', \context_course::instance($courseid))) {
            return false;
        }
        $courseratingmode = helper::get_course_rating_mode($courseid);
        if ($courseratingmode == constants::RATEBY_NOONE) {
            return false;
        }
        if ($courseratingmode == constants::RATEBY_COMPLETED) {
            require_once($CFG->dirroot.'/completion/completion_completion.php');
            // The course is supposed to be marked as completed at $timeend.
            $ccompletion = new \completion_completion(['userid' => $USER->id, 'course' => $courseid]);
            return $ccompletion->is_complete();
        }
        return true;
    }

    /**
     * Does current user have capability to delete ratings
     *
     * @param int $ratingid
     * @param int|null $courseid
     * @return bool
     */
    public static function can_delete_rating(int $ratingid, ?int $courseid = null): bool {
        if (!$courseid) {
            $courseid = (new rating($ratingid))->get('courseid');
        }
        return has_capability('tool/courserating:delete', \context_course::instance($courseid));
    }

    /**
     * Can current user flag the rating
     *
     * @param int $ratingid
     * @param int|null $courseid course id if known (saves a DB query)
     * @return bool
     */
    public static function can_flag_rating(int $ratingid, ?int $courseid = null): bool {
        if (!isloggedin() || isguestuser()) {
            return false;
        }
        if (!$courseid) {
            $courseid = (new rating($ratingid))->get('courseid');
        }
        return self::can_view_ratings($courseid);
    }

    /**
     * User can view the 'Course ratings' item in the course administration
     *
     * @param int $courseid
     * @return bool
     */
    public static function can_view_report(int $courseid): bool {
        if (!helper::course_ratings_enabled_anywhere()) {
            return false;
        }
        $context = \context_course::instance($courseid);
        return has_capability('tool/courserating:reports', $context);
    }

    /**
     * Check that user can view rating or throw exception
     *
     * @param int $courseid
     * @throws \moodle_exception
     */
    public static function require_can_view_ratings(int $courseid): void {
        if (!self::can_view_ratings($courseid)) {
            throw new \moodle_exception('cannotview', 'tool_courserating');
        }
    }

    /**
     * Check that user can add/change rating or throw exception
     *
     * @param int $courseid
     * @throws \moodle_exception
     */
    public static function require_can_add_rating(int $courseid): void {
        if (!self::can_add_rating($courseid)) {
            throw new \moodle_exception('cannotrate', 'tool_courserating');
        }
    }

    /**
     * Check that user can delete rating or throw exception
     *
     * @param int $ratingid
     * @param int|null $courseid
     * @throws required_capability_exception
     */
    public static function require_can_delete_rating(int $ratingid, ?int $courseid = null): void {
        if (!$courseid) {
            $courseid = (new rating($ratingid))->get('courseid');
        }
        if (!self::can_delete_rating($ratingid, $courseid)) {
            throw new required_capability_exception(\context_course::instance($courseid),
                'tool/courserating:delete', 'nopermissions', '');
        }
    }

    /**
     * Check that user can flag rating or throw exception
     *
     * @param int $ratingid
     * @param int|null $courseid
     * @throws \moodle_exception
     */
    public static function require_can_flag_rating(int $ratingid, ?int $courseid = null): void {
        if (!self::can_flag_rating($ratingid, $courseid)) {
            throw new \moodle_exception('cannotview', 'tool_courserating');
        }
    }

    /**
     * Check that user can view rating or throw exception
     *
     * @param int $courseid
     * @throws \moodle_exception
     */
    public static function require_can_view_reports(int $courseid): void {
        if (!\tool_courserating\helper::course_ratings_enabled_anywhere()) {
            // TODO create a new string, maybe link to settings for admins?
            throw new \moodle_exception('ratebynoone', 'tool_courserating');
        }
        if (!self::can_view_report($courseid)) {
            throw new required_capability_exception(\context_course::instance($courseid),
                'tool/courserating:reports', 'nopermissions', '');
        }
    }
}