/**
  * Core function for creation of form defined in block_panopto_edit_form class
  */
 protected function specific_definition($mform)
 {
     global $COURSE, $CFG;
     // Construct the Panopto data proxy object.
     $panoptodata = new panopto_data($COURSE->id);
     if (!empty($panoptodata->servername) && !empty($panoptodata->instancename) && !empty($panoptodata->applicationkey)) {
         $mform->addElement('header', 'configheader', get_string('block_edit_header', 'block_panopto'));
         $params = new stdClass();
         $params->course_id = $COURSE->id;
         $params->return_url = $_SERVER['REQUEST_URI'];
         $querystring = http_build_query($params, '', '&');
         $provisionurl = "{$CFG->wwwroot}/blocks/panopto/provision_course.php?" . $querystring;
         $addtopanopto = get_string('add_to_panopto', 'block_panopto');
         $or = get_string('or', 'block_panopto');
         $mform->addElement('html', "<a href='{$provisionurl}'>{$addtopanopto}</a><br><br>-- {$or} --<br><br>");
         $courselist = $panoptodata->get_course_options();
         $mform->addElement('selectgroups', 'config_course', get_string('existing_course', 'block_panopto'), $courselist['courses']);
         $mform->setDefault('config_course', $courselist['selected']);
         // Set course context to get roles.
         $context = context_course::instance($COURSE->id);
         // Get current role mappings.
         $currentmappings = $panoptodata->get_course_role_mappings($COURSE->id);
         // Get roles that current user may assign in this course.
         $currentcourseroles = get_assignable_roles($context, $rolenamedisplay = ROLENAME_ALIAS, $withusercounts = false, $user = null);
         while ($role = current($currentcourseroles)) {
             $rolearray[key($currentcourseroles)] = $currentcourseroles[key($currentcourseroles)];
             next($currentcourseroles);
         }
         $mform->addElement('header', 'rolemapheader', get_string('role_map_header', 'block_panopto'));
         $mform->addElement('html', get_string('role_map_info_text', 'block_panopto'));
         $createselect = $mform->addElement('select', 'config_creator', get_string('creator', 'block_panopto'), $rolearray, null);
         $createselect->setMultiple(true);
         // Set default selected to previous setting.
         if (!empty($currentmappings['creator'])) {
             $createselect->setSelected($currentmappings['creator']);
         }
         $pubselect = $mform->addElement('select', 'config_publisher', get_string('publisher', 'block_panopto'), $rolearray, null);
         $pubselect->setMultiple(true);
         // Set default selected to previous setting.
         if (!empty($currentmappings['publisher'])) {
             $pubselect->setSelected($currentmappings['publisher']);
         }
     } else {
         $mform->addElement('static', 'error', '', get_string('block_edit_error', 'block_panopto'));
     }
 }
 /**
  * Called when an role has been removed.
  */
 public static function roledeleted(\core\event\role_unassigned $event)
 {
     global $CFG;
     if (\panopto_data::get_panopto_course_id($event->courseid) === false || $CFG->version < $requiredVersion) {
         return;
     }
     $task = new \block_panopto\task\update_user();
     $task->set_custom_data(array('courseid' => $event->courseid, 'relateduserid' => $event->relateduserid, 'contextid' => $event->contextid, 'eventtype' => "role"));
     if ($CFG->block_panopto_async_tasks) {
         \core\task\manager::queue_adhoc_task($task);
     } else {
         $task->execute();
     }
 }
         $courses = $data->courses;
         $selectedserver = $aserverarray[$data->servers];
         $selectedkey = $appkeyarray[$data->servers];
         $CFG->servername = $selectedserver;
         $CFG->appkey = $selectedkey;
     }
     $manageblocks = new moodle_url('/admin/blocks.php');
     $panoptosettings = new moodle_url('/admin/settings.php?section=blocksettingpanopto');
     $PAGE->navbar->add(get_string('blocks'), $manageblocks);
     $PAGE->navbar->add(get_string('pluginname', 'block_panopto'), $panoptosettings);
 }
 $PAGE->navbar->add($provisiontitle, new moodle_url($PAGE->url));
 echo $OUTPUT->header();
 if ($courses) {
     $provisioned = array();
     $panoptodata = new panopto_data(null);
     foreach ($courses as $courseid) {
         if (empty($courseid)) {
             continue;
         }
         // Set the current Moodle course to retrieve info for / provision.
         $panoptodata->moodlecourseid = $courseid;
         // If an application key and server name are pre-set (happens when provisioning from multi-select page) use those, otherwise retrieve
         // values from the db.
         if (isset($selectedserver)) {
             $panoptodata->servername = $selectedserver;
         } else {
             $panoptodata->servername = $panoptodata->get_panopto_servername($panoptodata->moodlecourseid);
         }
         if (isset($selectedkey)) {
             $panoptodata->applicationkey = $selectedkey;
try {
    require_login();
    require_sesskey();
    header('Content-Type: text/html; charset=utf-8');
    global $CFG;
    $courseid = $_POST["courseid"];
    // Sync role mapping. In case this is the first time block is running we need to load old settings from db.
    // They will be the default values if this is the first time running.
    $mapping = panopto_data::get_course_role_mappings($courseid);
    panopto_data::set_course_role_permissions($courseid, $mapping['publisher'], $mapping['creator']);
    $content = new stdClass();
    //Initialize $content->text to an empty string here to avoid trying to append to it before
    //it has been initialized and throwing a warning. Bug 33163
    $content->text = "";
    // Construct the Panopto data proxy object.
    $panoptodata = new panopto_data($courseid);
    if (empty($panoptodata->servername) || empty($panoptodata->instancename) || empty($panoptodata->applicationkey)) {
        $content->text = get_string('unprovisioned', 'block_panopto') . "\n            <br/><br/>\n            <a href='{$CFG->wwwroot}/blocks/panopto/provision_course_internal.php?id={$courseid}'>" . get_string('provision_course_link_text', 'block_panopto') . "</a>";
        $content->footer = "";
        return $content;
    }
    try {
        if (!$panoptodata->sessiongroupid) {
            $content->text = get_string('no_course_selected', 'block_panopto');
        } else {
            // Get course info from SOAP service.
            $courseinfo = $panoptodata->get_course();
            // Panopto course was deleted, or an exception was thrown while retrieving course data.
            if ($courseinfo->Access == "Error") {
                $content->text .= "<span class='error'>" . get_string('error_retrieving', 'block_panopto') . "</span>";
            } else {
 /**
  * Gives selected capabilities to specified roles.
  */
 public static function set_course_role_permissions($courseid, $publisherroles, $creatorroles)
 {
     $coursecontext = context_course::instance($courseid);
     // Clear capabilities from all of course's roles to be reassigned.
     self::clear_capabilities_for_course($courseid);
     foreach ($publisherroles as $role) {
         if (isset($role) && trim($role) !== '') {
             assign_capability('block/panopto:provision_aspublisher', CAP_ALLOW, $role, $coursecontext, $overwrite = false);
         }
     }
     foreach ($creatorroles as $role) {
         if (isset($role) && trim($role) !== '') {
             assign_capability('block/panopto:provision_asteacher', CAP_ALLOW, $role, $coursecontext, $overwrite = false);
         }
     }
     // Mark dirty (moodle standard for capability changes at context level).
     $coursecontext->mark_dirty();
     panopto_data::set_course_role_mappings($courseid, $publisherroles, $creatorroles);
 }