function required()
{
    require_once _base_ . '/lib/lib.form.php';
    require_once _base_ . '/lib/lib.table.php';
    require_once _adm_ . '/lib/lib.publicadminmanager.php';
    require_once _lms_ . '/lib/lib.course.php';
    require_once _lms_ . '/lib/lib.date.php';
    require_once _lms_ . '/lib/lib.competences.php';
    $db = DbConn::getInstance();
    $lang =& DoceboLanguage::CreateInstance('public_coursepanel', 'lms');
    $sel_competence = Get::req('sel_competence_req', DOTY_INT, false);
    $sel_course = Get::req('sel_course_req', DOTY_INT, false);
    $back_url = "index.php?modname=public_coursepanel&op=coursepanel&sel_competence=" . (int) $sel_competence . "&sel_course=" . (int) $sel_course;
    $back_ui = getBackUi($back_url, $lang->def('_BACK'));
    $sel_comp = Get::req('required_selector', DOTY_INT, 0);
    if ($sel_comp) {
        $id_pa = getLogUserId();
        if (!$id_pa) {
            //...
        }
        $acl_man = new DoceboACLManager();
        $admin_manager = new PublicAdminManager();
        $array_users = array();
        $idst_associated = $admin_manager->getAdminTree($id_pa);
        $array_users =& $acl_man->getAllUsersFromIdst($idst_associated);
        $array_users = array_unique($array_users);
        if (empty($array_users)) {
            //error: no users to deal with
            cout($back_ui . $lang->def('_NO_USERS') . $back_ui, 'content');
            return;
        }
        cout(getTitleArea($lang->def('_REQUIRED_USERS'), 'coursepanel') . '<div class="std_block">', 'content');
        $table = new Table();
        $head_labels = array($lang->def('_USERNAME'), $lang->def('_NAME'));
        $head_style = array('', '', 'align_center', 'align_center');
        $table->addHead($head_labels, $head_style);
        //$date = date ("Y-m-d H:i:s", strtotime("+1 months"));
        //$now = date("Y-m-d H:i:s");
        $man_comp = new Competences_Manager();
        $comp_data = $man_comp->GetCompetence($sel_comp);
        $already = array();
        $query = "SELECT id_user, score_init, score_got FROM %lms_competence_user WHERE id_competence='" . (int) $sel_comp . "'";
        $res = $db->query($query);
        while (list($id_user, $score_init, $score_got) = $db->fetch_row($res)) {
            if ($comp_data['type'] == 'score') {
                //if the competence assignment exists in DB, but the total score is 0, then it's considered as non-assigned
                if ((int) $score_init + (int) $score_got > 0) {
                    $already[] = $id_user;
                }
            } else {
                $already[] = $id_user;
            }
        }
        $already = array_unique($already);
        $array_users = array_diff($array_users, $already);
        //get required competences not got from users
        $query = "";
        if ($comp_data['type'] == 'score') {
            $query = "SELECT u.idst, u.userid, u.lastname, u.firstname FROM %lms_competence_required as cr " . " JOIN %adm_user as u ON (cr.idst = u.idst)" . " WHERE cr.idst IN (" . implode(",", $array_users) . ") AND cr.id_competence=" . (int) $sel_comp . " ORDER BY u.userid";
        } else {
            $query = "SELECT u.idst, u.userid, u.lastname, u.firstname FROM %lms_competence_required as cr " . " JOIN %adm_user as u ON (cr.idst = u.idst) " . " WHERE cr.idst IN (" . implode(",", $array_users) . ") AND cr.id_competence=" . (int) $sel_comp . " ORDER BY u.userid";
        }
        $res = $db->query($query);
        if (sql_num_rows($res) > 0) {
            while (list($idst, $userid, $lastname, $firstname) = $db->fetch_row($res)) {
                $line = array();
                $line[] = $acl_man->relativeId($userid);
                $line[] = $lastname . " " . $firstname;
                $table->addBody($line);
            }
            //cout(getTitleArea($lang->def('_EXPIRING_USERS'), 'coursepanel').'<div class="std_block">', 'content');
            cout($lang->def('_COMPETENCE') . ': <b>' . $comp_data['name'] . '</b>', 'content');
            cout($back_ui . $table->getTable() . $back_ui, 'content');
        } else {
            cout($back_ui . $lang->def('_NO_REQUIRED_USER') . $back_ui, 'content');
        }
    } else {
        //error, no competence selected
        cout($back_ui . $lang->def('_NO_COMPETENCE_SELECTED') . $back_ui, 'content');
        return;
    }
}
function publicAdminManager_edit_menu()
{
    checkPerm('view');
    require_once _base_ . '/lib/lib.form.php';
    require_once _base_ . '/lib/lib.table.php';
    require_once $GLOBALS['where_framework'] . '/lib/lib.publicadminmanager.php';
    $lang =& DoceboLanguage::createInstance('public_admin_manager', 'framework');
    $aclManager =& Docebo::user()->getAclManager();
    $adminidst = importVar('adminidst', true, 0);
    $out =& $GLOBALS['page'];
    $admin_manager = new PublicAdminManager();
    $role_list = $admin_manager->getPublicUserAdminRole();
    $out->setWorkingZone('content');
    $out->add(getTitleArea($lang->def('_ADMIN_MANAGMENT'), 'admin_managmer', $lang->def('_ADMIN_MANAGMENT')) . '<div class="std_block">' . Form::openForm('admin_menu_editing', '') . Form::getHidden('adminidst', 'adminidst', $adminidst));
    $table = new Table(0, $lang->def('_ADMIN_MANAGMENT'), $lang->def('_ADMIN_MANAGMENT'));
    $head = array('', $lang->def('_ACTION'));
    $style = array('image', '');
    $table->addHead($head, $style);
    foreach ($role_list as $role) {
        if (isset($_POST['save_permission'])) {
            if (isset($_POST[$role['roleid']]) && $_POST[$role['roleid']] == $role['idst']) {
                if (!$admin_manager->controlPublicUserAdminRole($adminidst, $role['idst'])) {
                    $admin_manager->addPublicAdminRole($adminidst, $role['idst']);
                }
            } else {
                if ($admin_manager->controlPublicUserAdminRole($adminidst, $role['idst'])) {
                    $admin_manager->delPublicAdminRole($adminidst, $role['idst']);
                }
            }
        }
        $lang_string = $role['roleid'];
        $lang_string = str_replace('/lms/course/public/public_user_admin/', '_USER_', $lang_string);
        $lang_string = str_replace('/lms/course/public/public_course_admin/', '_COURSE_', $lang_string);
        $lang_string = str_replace('/lms/course/public/public_subscribe_admin/', '_SUBSCRIBE_', $lang_string);
        $lang_string = str_replace('/lms/course/public/public_report_admin/', '_REPORT_', $lang_string);
        $lang_string = str_replace('/lms/course/public/public_newsletter_admin/', '_NEWSLETTER_', $lang_string);
        $lang_string = str_replace('/lms/course/public/public_certificate_release/', '_CERTIFICATES_', $lang_string);
        $lang_string = str_replace('/lms/course/public/public_coursepanel/', '_COURSEPANEL_COMPETENCES', $lang_string);
        $lang_string = strtoupper($lang_string);
        $content = array();
        $content[] = '<input class="check" type="checkbox" ' . 'id="' . $role['roleid'] . '" ' . 'name="' . $role['roleid'] . '" value="' . $role['idst'] . '"' . ($admin_manager->controlPublicUserAdminRole($adminidst, $role['idst']) ? ' checked="checked"' : '') . ' />';
        $content[] = $lang->def($lang_string);
        $table->addBody($content);
    }
    $out->add($table->getTable() . Form::openButtonSpace() . Form::getButton('save_permission', 'save_permission', $lang->def('_SAVE')) . Form::getButton('undo_pref', 'undo_pref', $lang->def('_UNDO')) . Form::closeButtonSpace() . Form::closeForm() . '</div>');
}
 /**
  * remove an admin from a node of org tree
  * @param int $treeidst the idst of the tree to add
  * @param int $adminidst the security token of the administrator
  */
 function removeAdminTree($treeidst, $adminidst)
 {
     $query = "DELETE FROM " . PublicAdminManager::getAdminTreeTable() . " WHERE idst = '" . $treeidst . "'" . "   AND idstAdmin = '" . $adminidst . "'";
     $this->_executeQuery($query);
 }