Grades with decimals - CT#653

skala
Guillaume Viguier 16 years ago
parent fb6e016deb
commit 7749dddec4
  1. 35
      main/admin/settings.lib.php
  2. 157
      main/admin/settings.php
  3. 116
      main/gradebook/gradebook_scoring_system.php
  4. 8
      main/gradebook/gradebook_view_result.php
  5. 2
      main/gradebook/lib/fe/scoredisplayform.class.php
  6. 7
      main/install/db_main.sql
  7. 2
      main/install/migrate-db-1.8.6.2-1.8.7-pre.sql

@ -874,3 +874,38 @@ function delete_template($id)
function select_timezone_value() {
return api_get_timezones();
}
/**
* Returns an array containing the list of options used to populate the gradebook_number_decimals variable
*
* @return array List of gradebook_number_decimals options
*
* @author Guillaume Viguier <guillaume.viguier@beeznest.com>
*/
function select_gradebook_number_decimals() {
return array('0', '1', '2');
}
/**
* Updates the gradebook score custom values using the scoredisplay class of the
* gradebook module
*
* @param array List of gradebook score custom values
*
* @author Guillaume Viguier <guillaume.viguier@beeznest.com>
*/
function update_gradebook_score_display_custom_values($values) {
require_once api_get_path(SYS_CODE_PATH).'gradebook/lib/scoredisplay.class.php';
$scoredisplay = ScoreDisplay::instance();
$scores = $values['gradebook_score_display_custom_values_endscore'];
$displays = $values['gradebook_score_display_custom_values_displaytext'];
$nr_displays = count($displays);
$final = array();
for($i = 1; $i < $nr_displays; $i++) {
if(!empty($scores[$i]) && !empty($displays[$i])) {
$final[$i]['score'] = $scores[$i];
$final[$i]['display'] = $displays[$i];
}
}
$scoredisplay->update_custom_score_display_settings($final);
}

@ -13,6 +13,8 @@
// name of the language file that needs to be included
if ($_GET['category']=='Templates') {
$language_file = array('admin','document');
} else if($_GET['category']=='Gradebook') {
$language_file = array('admin','gradebook');
} else {
$language_file = array('admin');
}
@ -34,6 +36,41 @@ $_SESSION['this_section'] = $this_section;
// Access restrictions
api_protect_admin_script();
if($_GET['category'] == 'Gradebook') {
// Used for the gradebook system
$htmlHeadXtra[]= '
<script language="JavaScript">
function plusItem(item)
{
document.getElementById(item).style.display = "inline";
document.getElementById("plus-"+item).style.display = "none";
document.getElementById("min-"+(item-1)).style.display = "none";
document.getElementById("min-"+(item)).style.display = "inline";
document.getElementById("plus-"+(item+1)).style.display = "inline";
document.getElementById("txta-"+(item)).value = "100";
document.getElementById("txta-"+(item-1)).value = "";
}
function minItem(item)
{
if (item != 1)
{
document.getElementById(item).style.display = "none";
document.getElementById("txta-"+item).value = "";
document.getElementById("txtb-"+item).value = "";
document.getElementById("plus-"+item).style.display = "inline";
document.getElementById("min-"+(item-1)).style.display = "inline";
document.getElementById("txta-"+(item-1)).value = "100";
}
if (item = 1)
{
document.getElementById("min-"+(item)).style.display = "none";
}
}
</script>';
}
// Submit Stylesheets
if (isset($_POST['submit_stylesheets'])) {
$message = store_stylesheets();
@ -254,12 +291,74 @@ if (!empty($_GET['category']) && !in_array($_GET['category'], array('Plugins', '
$form->addElement('select', $row['variable'], get_lang($row['comment']), call_user_func('select_'.$row['variable']), $hideme);
$default_values[$row['variable']] = $row['selected_value'];
break;
/*
* Used to display custom values for the gradebook score display
*/
case "gradebook_score_display_custom":
if(api_get_setting('gradebook_score_display_custom', 'my_display_custom') == 'false') {
$form->addElement('static', null, null, get_lang('GradebookActivateScoreDisplayCustom'));
} else {
// Get score displays
require_once api_get_path(SYS_CODE_PATH).'gradebook/lib/scoredisplay.class.php';
$scoredisplay = ScoreDisplay::instance();
$customdisplays = $scoredisplay->get_custom_score_display_settings();
$nr_items =(count($customdisplays)!='0')?count($customdisplays):'1';
$form->addElement('hidden', 'gradebook_score_display_custom_values_maxvalue', '100');
$form->addElement('hidden', 'gradebook_score_display_custom_values_minvalue', '0');
$form->addElement('static', null, null, get_lang('ScoreInfo'));
$scorenull[]= $form->CreateElement('static', null, null, get_lang('Between'));
$form->setDefaults(array (
'beginscore' => '0'
));
$scorenull[]= $form->CreateElement('text', 'beginscore', null, array (
'size' => 5,
'maxlength' => 5,
'disabled' => 'disabled'
));
$scorenull[]= $form->CreateElement('static', null, null, ' %');
$form->addGroup($scorenull, '', '', ' ');
for ($counter= 1; $counter <= 20; $counter++) {
$renderer = $form->defaultRenderer();
$elementTemplateTwoLabel =
'<div id=' . $counter . ' style="display: '.(($counter<=$nr_items)?'inline':'none').';">
<p><!-- BEGIN required --><span class="form_required">*</span> <!-- END required -->{label}
<div class="formw"><!-- BEGIN error --><span class="form_error">{error}</span><br /><!-- END error --> <b>'.get_lang('And').'</b>&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp{element} % =';
$elementTemplateTwoLabel2 =
'<!-- BEGIN error --><span class="form_error">{error}</span><br /><!-- END error -->&nbsp{element}
<a href="javascript:minItem(' . ($counter) . ')"><img style="display: '.(($counter>=$nr_items && $counter!=1)?'inline':'none').';" id="min-' . $counter . '" src="../img/gradebook_remove.gif" alt="'.get_lang('Delete').'" title="'.get_lang('Delete').'"></img></a>
<a href="javascript:plusItem(' . ($counter+1) . ')"><img style="display: '.(($counter>=$nr_items)?'inline':'none').';" id="plus-' . ($counter+1) . '" src="../img/gradebook_add.gif" alt="'.get_lang('Add').'" title="'.get_lang('Add').'"></img></a>
</div></p></div>';
$scorebetw= array ();
$form->addElement('text', 'gradebook_score_display_custom_values_endscore[' . $counter . ']', null, array (
'size' => 5,
'maxlength' => 5,
'id' => 'txta-'.$counter
));
$form->addElement('text', 'gradebook_score_display_custom_values_displaytext[' . $counter . ']', null,array (
'size' => 40,
'maxlength' => 40,
'id' => 'txtb-'.$counter
));
$renderer->setElementTemplate($elementTemplateTwoLabel,'gradebook_score_display_custom_values_endscore[' . $counter . ']');
$renderer->setElementTemplate($elementTemplateTwoLabel2,'gradebook_score_display_custom_values_displaytext[' . $counter . ']');
$form->addRule('gradebook_score_display_custom_values_endscore[' . $counter . ']', get_lang('OnlyNumbers'), 'numeric');
$form->addRule(array ('gradebook_score_display_custom_values_endscore[' . $counter . ']', 'gradebook_score_display_custom_values_maxvalue'), get_lang('Over100'), 'compare', '<=');
$form->addRule(array ('gradebook_score_display_custom_values_endscore[' . $counter . ']', 'gradebook_score_display_custom_values_minvalue'), get_lang('UnderMin'), 'compare', '>');
if($customdisplays[$counter-1]) {
$default_values['gradebook_score_display_custom_values_endscore['.$counter.']'] = $customdisplays[$counter-1]['score'];
$default_values['gradebook_score_display_custom_values_displaytext['.$counter.']'] = $customdisplays[$counter-1]['display'];
}
}
}
break;
}
}
$form->addElement('html','<div align="right">');
$form->addElement('style_submit_button', null,get_lang('SaveSettings'), 'class="save"');
$form->addElement('html','</div>');
$form->addElement('html','<div style="text-align: right; clear: both;">');
$form->addElement('style_submit_button', null,get_lang('SaveSettings'), 'class="save"');
$form->addElement('html','</div>');
$form->setDefaults($default_values);
if ($form->validate()) {
@ -280,40 +379,50 @@ if (!empty($_GET['category']) && !in_array($_GET['category'], array('Plugins', '
//$result = Database::query($sql);
// Save the settings
$keys = array();
$gradebook_score_display_custom_values = array();
foreach ($values as $key => $value) {
if (!is_array($value)) {
//$sql = "UPDATE $table_settings_current SET selected_value='".Database::escape_string($value)."' WHERE variable='$key'";
//$result = Database::query($sql);
// Treat gradebook values in separate function
if(strpos($key, 'gradebook_score_display_custom_values') === false) {
if (!is_array($value)) {
//$sql = "UPDATE $table_settings_current SET selected_value='".Database::escape_string($value)."' WHERE variable='$key'";
//$result = Database::query($sql);
if (api_get_setting($key) != $value) $keys[] = $key;
if (api_get_setting($key) != $value) $keys[] = $key;
$result = api_set_setting($key,$value,null,null,$_configuration['access_url']);
$result = api_set_setting($key,$value,null,null,$_configuration['access_url']);
} else {
} else {
$sql = "SELECT subkey FROM $table_settings_current WHERE variable = '$key'";
$res = Database::query($sql);
$subkeys = array();
while ($row_subkeys = Database::fetch_array($res)) {
// if subkey is changed
if ( (isset($value[$row_subkeys['subkey']]) && api_get_setting($key,$row_subkeys['subkey']) == 'false') ||
(!isset($value[$row_subkeys['subkey']]) && api_get_setting($key,$row_subkeys['subkey']) == 'true')) {
$keys[] = $key;
break;
$sql = "SELECT subkey FROM $table_settings_current WHERE variable = '$key'";
$res = Database::query($sql);
$subkeys = array();
while ($row_subkeys = Database::fetch_array($res)) {
// if subkey is changed
if ( (isset($value[$row_subkeys['subkey']]) && api_get_setting($key,$row_subkeys['subkey']) == 'false') ||
(!isset($value[$row_subkeys['subkey']]) && api_get_setting($key,$row_subkeys['subkey']) == 'true')) {
$keys[] = $key;
break;
}
}
}
foreach ($value as $subkey => $subvalue)
{
foreach ($value as $subkey => $subvalue)
{
//$sql = "UPDATE $table_settings_current SET selected_value='true' WHERE variable='$key' AND subkey = '$subkey'";
//$result = Database::query($sql);
//$sql = "UPDATE $table_settings_current SET selected_value='true' WHERE variable='$key' AND subkey = '$subkey'";
//$result = Database::query($sql);
$result = api_set_setting($key,'true',$subkey,null,$_configuration['access_url']);
$result = api_set_setting($key,'true',$subkey,null,$_configuration['access_url']);
}
}
} else {
$gradebook_score_display_custom_values[$key] = $value;
}
}
if(count($gradebook_score_display_custom_values) > 0) {
update_gradebook_score_display_custom_values($gradebook_score_display_custom_values);
}
// add event configuration settings category to system log
$time = time();

@ -1,122 +1,16 @@
<?php // $Id: $
/* For licensing terms, see /license.txt */
$language_file= 'gradebook';
//$cidReset= true;
require_once '../inc/global.inc.php';
require_once 'lib/be.inc.php';
require_once 'lib/gradebook_functions.inc.php';
require_once 'lib/fe/scoredisplayform.class.php';
require_once 'lib/scoredisplay.class.php';
api_block_anonymous_users();
//api_protect_admin_script();
$htmlHeadXtra[]= '
<script language="JavaScript">
function plusItem(item)
{
document.getElementById(item).style.display = "inline";
document.getElementById("plus-"+item).style.display = "none";
document.getElementById("min-"+(item-1)).style.display = "none";
document.getElementById("min-"+(item)).style.display = "inline";
document.getElementById("plus-"+(item+1)).style.display = "inline";
document.getElementById("txta-"+(item)).value = "100";
document.getElementById("txta-"+(item-1)).value = "";
}
function minItem(item)
{
if (item != 1)
{
document.getElementById(item).style.display = "none";
document.getElementById("txta-"+item).value = "";
document.getElementById("txtb-"+item).value = "";
document.getElementById("plus-"+item).style.display = "inline";
document.getElementById("min-"+(item-1)).style.display = "inline";
document.getElementById("txta-"+(item-1)).value = "100";
}
if (item = 1)
{
document.getElementById("min-"+(item)).style.display = "none";
}
}
</script>';
$interbreadcrumb[] = array ('url' => $_SESSION['gradebook_dest'].'?selectcat=1', 'name' => get_lang('ToolGradebook'));
$displayscore= ScoreDisplay :: instance();
$customdisplays = $displayscore->get_custom_score_display_settings();
$nr_items =(count($customdisplays)!='0')?count($customdisplays):'1';
$scoreform= new ScoreDisplayForm('scoring_system_form',
api_get_self() . '?selectcat=' . $_GET['selectcat']
);
if ($scoreform->validate()) {
$value_export='';
$value_export=$scoreform->exportValues();
$value_export=isset($value_export) ? $scoreform->exportValues(): '';
$values= $value_export;
// create new array of custom display settings
// this loop also checks if all score ranges are unique
$scoringdisplay= array ();
$ranges_ok = true;
$endscore= isset($values['endscore']) ? $values['endscore'] : null;
$displaytext=isset($values['displaytext']) ? $values['displaytext'] : null;
for ($counter= 1; $ranges_ok && $counter <= 20; $counter++) {
$setting= array ();
$setting['score']= $endscore[$counter];
$setting['display']= $displaytext[$counter];
if (!empty($setting['score'])) {
foreach ($scoringdisplay as $passed_entry) {
if ($passed_entry['score'] == $setting['score']) {
$ranges_ok = false;
}
}
$scoringdisplay[]= $setting;
}
}
if (!$ranges_ok) {
header('Location: ' . api_get_self() . '?nouniqueranges=&selectcat=' . Security::remove_XSS($_GET['selectcat']));
exit;
}
// update color settings
$val_enablescorecolor=isset($values['enablescorecolor']) ? $values['enablescorecolor'] : null;
$displayscore->set_coloring_enabled(($val_enablescorecolor == '1') ? true : false);
if ($displayscore->is_coloring_enabled()) {
$displayscore->set_color_split_value($values['scorecolpercent']);
}
// update custom display settings
$val_enablescore=isset($values['enablescore']) ? $values['enablescore'] : null;
$val_includeupperlimit=isset($values['includeupperlimit']) ? $values['includeupperlimit'] : null;
$displayscore->set_custom(($val_enablescore == '1') ? true : false);
$displayscore->set_upperlimit_included(($val_includeupperlimit == '1') ? true : false);
if ($displayscore->is_custom() && !empty($scoringdisplay)) {
$displayscore->update_custom_score_display_settings($scoringdisplay);
}
header('Location: ' . api_get_self() . '?scoringupdated=&selectcat=' . Security::remove_XSS($_GET['selectcat']));
exit;
}
$this_section = SECTION_COURSES;
Display :: display_header(get_lang('ScoreEdit'));
if (((isset($_GET['isStudentView']) && $_GET['isStudentView']=='false') || (isset($_GET['selectcat']) && ($_SESSION['studentview']=='teacherview')))) {
if (isset ($_GET['scoringupdated'])) {
Display :: display_confirmation_message(get_lang('ScoringUpdated'),false);
}
if (isset ($_GET['nouniqueranges'])) {
Display :: display_error_message(get_lang('NoUniqueScoreRanges'),false);
}
echo '<div class="maincontent">';
$scoreform->display();
echo '<div class="normal-message">';
echo sprintf(get_lang('GradebookScoringSystemRedirect'), api_get_path(WEB_CODE_PATH).'admin/settings.php?category=Gradebook');
echo '</div>';
echo '</div>';
}
Display :: display_footer();
Display :: display_footer();

@ -62,10 +62,10 @@ if (isset ($_GET['editres'])) {
$result->set_id($edit_res_xml);
$result->set_user_id($values['hid_user_id']);
$result->set_evaluation_id($select_eval_edit);
$row_value=isset($values['score']) ? (double)$values['score'] : 0 ;
if ((!empty ($row_value)) || ($row_value == 0)) {
$result->set_score($row_value);
}
$row_value=isset($values['score']) ? (float)$values['score'] : 0 ;
if ((!empty ($row_value)) || ($row_value == 0)) {
$result->set_score(floatval(number_format($row_value, api_get_setting('gradebook_number_decimals'))));
}
$result->save();
unset ($result);
header('Location: gradebook_view_result.php?selecteval=' . $select_eval_edit . '&editresmessage=');

@ -121,4 +121,4 @@ class ScoreDisplayForm extends FormValidator
function validate() {
return parent :: validate();
}
}
}

@ -687,6 +687,8 @@ VALUES
('gradebook_score_display_custom','my_display_custom','checkbox','Gradebook','false','GradebookScoreDisplayCustom','GradebookScoreDisplayCustomComment',NULL,'TabsGradebookEnableCustom', 0),
('gradebook_score_display_colorsplit',NULL,'textfield','Gradebook','50','GradebookScoreDisplayColorSplit','GradebookScoreDisplayColorSplitComment',NULL,NULL, 0),
('gradebook_score_display_upperlimit','my_display_upperlimit','checkbox','Gradebook','false','GradebookScoreDisplayUpperLimit','GradebookScoreDisplayUpperLimitComment',NULL,'TabsGradebookEnableUpperLimit', 0),
('gradebook_number_decimals', NULL, 'select', 'Gradebook', '0', 'GradebookNumberDecimals', 'GradebookNumberDecimalsComment', NULL, NULL, 0),
('gradebook_score_display_custom_values', NULL, 'gradebook_score_display_custom', 'Gradebook', '0', 'GradebookScoreDisplayCustomValues', 'GradebookScoreDisplayCustomValuesComment', NULL, NULL, 0),
('user_selected_theme',NULL,'radio','Platform','false','UserThemeSelection','UserThemeSelectionComment',NULL,NULL, 0),
('profile','theme','checkbox','User','false','ProfileChangesTitle','ProfileChangesComment',NULL,'UserTheme', 0),
('allow_course_theme',NULL,'radio','Course','true','AllowCourseThemeTitle','AllowCourseThemeComment',NULL,NULL, 0),
@ -1123,6 +1125,8 @@ CREATE TABLE gradebook_category (
weight smallint NOT NULL,
visible tinyint NOT NULL,
certif_min_score int DEFAULT NULL,
session_id int DEFAULT NULL,
document_id int unsigned DEFAULT NULL,
PRIMARY KEY (id)
);
DROP TABLE IF EXISTS gradebook_evaluation;
@ -1205,8 +1209,6 @@ CREATE TABLE user_field_values(
ALTER TABLE user_field_values ADD INDEX (user_id, field_id);
ALTER TABLE gradebook_category ADD session_id int DEFAULT NULL;
DROP TABLE IF EXISTS gradebook_result_log;
CREATE TABLE gradebook_result_log (
id int NOT NULL auto_increment,
@ -2273,7 +2275,6 @@ CREATE TABLE gradebook_certificate (
ALTER TABLE gradebook_certificate ADD INDEX idx_gradebook_certificate_category_id(cat_id);
ALTER TABLE gradebook_certificate ADD INDEX idx_gradebook_certificate_user_id(user_id);
ALTER TABLE gradebook_certificate ADD INDEX idx_gradebook_certificate_category_id_user_id(cat_id,user_id);
ALTER TABLE gradebook_category ADD COLUMN document_id int unsigned default NULL;

@ -59,6 +59,8 @@ UPDATE gradebook_result SET created_at = FROM_UNIXTIME(date);
ALTER TABLE gradebook_result DROP date;
ALTER TABLE gradebook_result_log CHANGE date_log created_at DATETIME NOT NULL default '0000-00-00 00:00:00';
INSERT INTO settings_current (variable, subkey, type, category, selected_value, title, comment, scope, subkeytext, access_url_changeable) VALUES ('gradebook_number_decimals', NULL, 'select', 'Gradebook', '0', 'GradebookNumberDecimals', 'GradebookNumberDecimalsComment', NULL, NULL, 0);
INSERT INTO settings_current (variable, subkey, type, category, selected_value, title, comment, scope, subkeytext, access_url_changeable) VALUES ('gradebook_score_display_custom_values', NULL, 'gradebook_score_display_custom', 'Gradebook', '0', 'GradebookScoreDisplayCustomValues', 'GradebookScoreDisplayCustomValuesComment', NULL, NULL, 0);
INSERT INTO user_field(field_type, field_variable, field_display_text, field_visible, field_changeable) VALUES(11, 'timezone', 'Timezone', 0, 0);

Loading…
Cancel
Save